xref: /OK3568_Linux_fs/kernel/drivers/clk/pistachio/clk.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Copyright (C) 2014 Google, Inc.
4*4882a593Smuzhiyun  */
5*4882a593Smuzhiyun 
6*4882a593Smuzhiyun #ifndef __PISTACHIO_CLK_H
7*4882a593Smuzhiyun #define __PISTACHIO_CLK_H
8*4882a593Smuzhiyun 
9*4882a593Smuzhiyun #include <linux/clk-provider.h>
10*4882a593Smuzhiyun 
11*4882a593Smuzhiyun struct pistachio_gate {
12*4882a593Smuzhiyun 	unsigned int id;
13*4882a593Smuzhiyun 	unsigned long reg;
14*4882a593Smuzhiyun 	unsigned int shift;
15*4882a593Smuzhiyun 	const char *name;
16*4882a593Smuzhiyun 	const char *parent;
17*4882a593Smuzhiyun };
18*4882a593Smuzhiyun 
19*4882a593Smuzhiyun #define GATE(_id, _name, _pname, _reg, _shift)	\
20*4882a593Smuzhiyun 	{					\
21*4882a593Smuzhiyun 		.id	= _id,			\
22*4882a593Smuzhiyun 		.reg	= _reg,			\
23*4882a593Smuzhiyun 		.shift	= _shift,		\
24*4882a593Smuzhiyun 		.name	= _name,		\
25*4882a593Smuzhiyun 		.parent = _pname,		\
26*4882a593Smuzhiyun 	}
27*4882a593Smuzhiyun 
28*4882a593Smuzhiyun struct pistachio_mux {
29*4882a593Smuzhiyun 	unsigned int id;
30*4882a593Smuzhiyun 	unsigned long reg;
31*4882a593Smuzhiyun 	unsigned int shift;
32*4882a593Smuzhiyun 	unsigned int num_parents;
33*4882a593Smuzhiyun 	const char *name;
34*4882a593Smuzhiyun 	const char **parents;
35*4882a593Smuzhiyun };
36*4882a593Smuzhiyun 
37*4882a593Smuzhiyun #define PNAME(x) static const char *x[] __initconst
38*4882a593Smuzhiyun 
39*4882a593Smuzhiyun #define MUX(_id, _name, _pnames, _reg, _shift)			\
40*4882a593Smuzhiyun 	{							\
41*4882a593Smuzhiyun 		.id		= _id,				\
42*4882a593Smuzhiyun 		.reg		= _reg,				\
43*4882a593Smuzhiyun 		.shift		= _shift,			\
44*4882a593Smuzhiyun 		.name		= _name,			\
45*4882a593Smuzhiyun 		.parents	= _pnames,			\
46*4882a593Smuzhiyun 		.num_parents	= ARRAY_SIZE(_pnames)		\
47*4882a593Smuzhiyun 	}
48*4882a593Smuzhiyun 
49*4882a593Smuzhiyun 
50*4882a593Smuzhiyun struct pistachio_div {
51*4882a593Smuzhiyun 	unsigned int id;
52*4882a593Smuzhiyun 	unsigned long reg;
53*4882a593Smuzhiyun 	unsigned int width;
54*4882a593Smuzhiyun 	unsigned int div_flags;
55*4882a593Smuzhiyun 	const char *name;
56*4882a593Smuzhiyun 	const char *parent;
57*4882a593Smuzhiyun };
58*4882a593Smuzhiyun 
59*4882a593Smuzhiyun #define DIV(_id, _name, _pname, _reg, _width)			\
60*4882a593Smuzhiyun 	{							\
61*4882a593Smuzhiyun 		.id		= _id,				\
62*4882a593Smuzhiyun 		.reg		= _reg,				\
63*4882a593Smuzhiyun 		.width		= _width,			\
64*4882a593Smuzhiyun 		.div_flags	= 0,				\
65*4882a593Smuzhiyun 		.name		= _name,			\
66*4882a593Smuzhiyun 		.parent		= _pname,			\
67*4882a593Smuzhiyun 	}
68*4882a593Smuzhiyun 
69*4882a593Smuzhiyun #define DIV_F(_id, _name, _pname, _reg, _width, _div_flags)	\
70*4882a593Smuzhiyun 	{							\
71*4882a593Smuzhiyun 		.id		= _id,				\
72*4882a593Smuzhiyun 		.reg		= _reg,				\
73*4882a593Smuzhiyun 		.width		= _width,			\
74*4882a593Smuzhiyun 		.div_flags	= _div_flags,			\
75*4882a593Smuzhiyun 		.name		= _name,			\
76*4882a593Smuzhiyun 		.parent		= _pname,			\
77*4882a593Smuzhiyun 	}
78*4882a593Smuzhiyun 
79*4882a593Smuzhiyun struct pistachio_fixed_factor {
80*4882a593Smuzhiyun 	unsigned int id;
81*4882a593Smuzhiyun 	unsigned int div;
82*4882a593Smuzhiyun 	const char *name;
83*4882a593Smuzhiyun 	const char *parent;
84*4882a593Smuzhiyun };
85*4882a593Smuzhiyun 
86*4882a593Smuzhiyun #define FIXED_FACTOR(_id, _name, _pname, _div)			\
87*4882a593Smuzhiyun 	{							\
88*4882a593Smuzhiyun 		.id		= _id,				\
89*4882a593Smuzhiyun 		.div		= _div,				\
90*4882a593Smuzhiyun 		.name		= _name,			\
91*4882a593Smuzhiyun 		.parent		= _pname,			\
92*4882a593Smuzhiyun 	}
93*4882a593Smuzhiyun 
94*4882a593Smuzhiyun struct pistachio_pll_rate_table {
95*4882a593Smuzhiyun 	unsigned long long fref;
96*4882a593Smuzhiyun 	unsigned long long fout;
97*4882a593Smuzhiyun 	unsigned long long refdiv;
98*4882a593Smuzhiyun 	unsigned long long fbdiv;
99*4882a593Smuzhiyun 	unsigned long long postdiv1;
100*4882a593Smuzhiyun 	unsigned long long postdiv2;
101*4882a593Smuzhiyun 	unsigned long long frac;
102*4882a593Smuzhiyun };
103*4882a593Smuzhiyun 
104*4882a593Smuzhiyun enum pistachio_pll_type {
105*4882a593Smuzhiyun 	PLL_GF40LP_LAINT,
106*4882a593Smuzhiyun 	PLL_GF40LP_FRAC,
107*4882a593Smuzhiyun };
108*4882a593Smuzhiyun 
109*4882a593Smuzhiyun struct pistachio_pll {
110*4882a593Smuzhiyun 	unsigned int id;
111*4882a593Smuzhiyun 	unsigned long reg_base;
112*4882a593Smuzhiyun 	enum pistachio_pll_type type;
113*4882a593Smuzhiyun 	struct pistachio_pll_rate_table *rates;
114*4882a593Smuzhiyun 	unsigned int nr_rates;
115*4882a593Smuzhiyun 	const char *name;
116*4882a593Smuzhiyun 	const char *parent;
117*4882a593Smuzhiyun };
118*4882a593Smuzhiyun 
119*4882a593Smuzhiyun #define PLL(_id, _name, _pname, _type, _reg, _rates)		\
120*4882a593Smuzhiyun 	{							\
121*4882a593Smuzhiyun 		.id		= _id,				\
122*4882a593Smuzhiyun 		.reg_base	= _reg,				\
123*4882a593Smuzhiyun 		.type		= _type,			\
124*4882a593Smuzhiyun 		.rates		= _rates,			\
125*4882a593Smuzhiyun 		.nr_rates	= ARRAY_SIZE(_rates),		\
126*4882a593Smuzhiyun 		.name		= _name,			\
127*4882a593Smuzhiyun 		.parent		= _pname,			\
128*4882a593Smuzhiyun 	}
129*4882a593Smuzhiyun 
130*4882a593Smuzhiyun #define PLL_FIXED(_id, _name, _pname, _type, _reg)		\
131*4882a593Smuzhiyun 	{							\
132*4882a593Smuzhiyun 		.id		= _id,				\
133*4882a593Smuzhiyun 		.reg_base	= _reg,				\
134*4882a593Smuzhiyun 		.type		= _type,			\
135*4882a593Smuzhiyun 		.rates		= NULL,				\
136*4882a593Smuzhiyun 		.nr_rates	= 0,				\
137*4882a593Smuzhiyun 		.name		= _name,			\
138*4882a593Smuzhiyun 		.parent		= _pname,			\
139*4882a593Smuzhiyun 	}
140*4882a593Smuzhiyun 
141*4882a593Smuzhiyun struct pistachio_clk_provider {
142*4882a593Smuzhiyun 	struct device_node *node;
143*4882a593Smuzhiyun 	void __iomem *base;
144*4882a593Smuzhiyun 	struct clk_onecell_data clk_data;
145*4882a593Smuzhiyun };
146*4882a593Smuzhiyun 
147*4882a593Smuzhiyun extern struct pistachio_clk_provider *
148*4882a593Smuzhiyun pistachio_clk_alloc_provider(struct device_node *node, unsigned int num_clks);
149*4882a593Smuzhiyun extern void pistachio_clk_register_provider(struct pistachio_clk_provider *p);
150*4882a593Smuzhiyun 
151*4882a593Smuzhiyun extern void pistachio_clk_register_gate(struct pistachio_clk_provider *p,
152*4882a593Smuzhiyun 					struct pistachio_gate *gate,
153*4882a593Smuzhiyun 					unsigned int num);
154*4882a593Smuzhiyun extern void pistachio_clk_register_mux(struct pistachio_clk_provider *p,
155*4882a593Smuzhiyun 				       struct pistachio_mux *mux,
156*4882a593Smuzhiyun 				       unsigned int num);
157*4882a593Smuzhiyun extern void pistachio_clk_register_div(struct pistachio_clk_provider *p,
158*4882a593Smuzhiyun 				       struct pistachio_div *div,
159*4882a593Smuzhiyun 				       unsigned int num);
160*4882a593Smuzhiyun extern void
161*4882a593Smuzhiyun pistachio_clk_register_fixed_factor(struct pistachio_clk_provider *p,
162*4882a593Smuzhiyun 				    struct pistachio_fixed_factor *ff,
163*4882a593Smuzhiyun 				    unsigned int num);
164*4882a593Smuzhiyun extern void pistachio_clk_register_pll(struct pistachio_clk_provider *p,
165*4882a593Smuzhiyun 				       struct pistachio_pll *pll,
166*4882a593Smuzhiyun 				       unsigned int num);
167*4882a593Smuzhiyun 
168*4882a593Smuzhiyun extern void pistachio_clk_force_enable(struct pistachio_clk_provider *p,
169*4882a593Smuzhiyun 				       unsigned int *clk_ids, unsigned int num);
170*4882a593Smuzhiyun 
171*4882a593Smuzhiyun #endif
172