xref: /OK3568_Linux_fs/kernel/drivers/clk/davinci/pll.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Clock driver for TI Davinci PSC controllers
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Copyright (C) 2018 David Lechner <david@lechnology.com>
6*4882a593Smuzhiyun  */
7*4882a593Smuzhiyun 
8*4882a593Smuzhiyun #ifndef __CLK_DAVINCI_PLL_H___
9*4882a593Smuzhiyun #define __CLK_DAVINCI_PLL_H___
10*4882a593Smuzhiyun 
11*4882a593Smuzhiyun #include <linux/bitops.h>
12*4882a593Smuzhiyun #include <linux/clk-provider.h>
13*4882a593Smuzhiyun #include <linux/of.h>
14*4882a593Smuzhiyun #include <linux/regmap.h>
15*4882a593Smuzhiyun #include <linux/types.h>
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun #define PLL_HAS_CLKMODE			BIT(0) /* PLL has PLLCTL[CLKMODE] */
18*4882a593Smuzhiyun #define PLL_HAS_PREDIV			BIT(1) /* has prediv before PLL */
19*4882a593Smuzhiyun #define PLL_PREDIV_ALWAYS_ENABLED	BIT(2) /* don't clear DEN bit */
20*4882a593Smuzhiyun #define PLL_PREDIV_FIXED_DIV		BIT(3) /* fixed divider value */
21*4882a593Smuzhiyun #define PLL_HAS_POSTDIV			BIT(4) /* has postdiv after PLL */
22*4882a593Smuzhiyun #define PLL_POSTDIV_ALWAYS_ENABLED	BIT(5) /* don't clear DEN bit */
23*4882a593Smuzhiyun #define PLL_POSTDIV_FIXED_DIV		BIT(6) /* fixed divider value */
24*4882a593Smuzhiyun #define PLL_HAS_EXTCLKSRC		BIT(7) /* has selectable bypass */
25*4882a593Smuzhiyun #define PLL_PLLM_2X			BIT(8) /* PLLM value is 2x (DM365) */
26*4882a593Smuzhiyun #define PLL_PREDIV_FIXED8		BIT(9) /* DM355 quirk */
27*4882a593Smuzhiyun 
28*4882a593Smuzhiyun /** davinci_pll_clk_info - controller-specific PLL info
29*4882a593Smuzhiyun  * @name: The name of the PLL
30*4882a593Smuzhiyun  * @unlock_reg: Option CFGCHIP register for unlocking PLL
31*4882a593Smuzhiyun  * @unlock_mask: Bitmask used with @unlock_reg
32*4882a593Smuzhiyun  * @pllm_mask: Bitmask for PLLM[PLLM] value
33*4882a593Smuzhiyun  * @pllm_min: Minimum allowable value for PLLM[PLLM]
34*4882a593Smuzhiyun  * @pllm_max: Maximum allowable value for PLLM[PLLM]
35*4882a593Smuzhiyun  * @pllout_min_rate: Minimum allowable rate for PLLOUT
36*4882a593Smuzhiyun  * @pllout_max_rate: Maximum allowable rate for PLLOUT
37*4882a593Smuzhiyun  * @flags: Bitmap of PLL_* flags.
38*4882a593Smuzhiyun  */
39*4882a593Smuzhiyun struct davinci_pll_clk_info {
40*4882a593Smuzhiyun 	const char *name;
41*4882a593Smuzhiyun 	u32 unlock_reg;
42*4882a593Smuzhiyun 	u32 unlock_mask;
43*4882a593Smuzhiyun 	u32 pllm_mask;
44*4882a593Smuzhiyun 	u32 pllm_min;
45*4882a593Smuzhiyun 	u32 pllm_max;
46*4882a593Smuzhiyun 	unsigned long pllout_min_rate;
47*4882a593Smuzhiyun 	unsigned long pllout_max_rate;
48*4882a593Smuzhiyun 	u32 flags;
49*4882a593Smuzhiyun };
50*4882a593Smuzhiyun 
51*4882a593Smuzhiyun #define SYSCLK_ARM_RATE		BIT(0) /* Controls ARM rate */
52*4882a593Smuzhiyun #define SYSCLK_ALWAYS_ENABLED	BIT(1) /* Or bad things happen */
53*4882a593Smuzhiyun #define SYSCLK_FIXED_DIV	BIT(2) /* Fixed divider */
54*4882a593Smuzhiyun 
55*4882a593Smuzhiyun /** davinci_pll_sysclk_info - SYSCLKn-specific info
56*4882a593Smuzhiyun  * @name: The name of the clock
57*4882a593Smuzhiyun  * @parent_name: The name of the parent clock
58*4882a593Smuzhiyun  * @id: "n" in "SYSCLKn"
59*4882a593Smuzhiyun  * @ratio_width: Width (in bits) of RATIO in PLLDIVn register
60*4882a593Smuzhiyun  * @flags: Bitmap of SYSCLK_* flags.
61*4882a593Smuzhiyun  */
62*4882a593Smuzhiyun struct davinci_pll_sysclk_info {
63*4882a593Smuzhiyun 	const char *name;
64*4882a593Smuzhiyun 	const char *parent_name;
65*4882a593Smuzhiyun 	u32 id;
66*4882a593Smuzhiyun 	u32 ratio_width;
67*4882a593Smuzhiyun 	u32 flags;
68*4882a593Smuzhiyun };
69*4882a593Smuzhiyun 
70*4882a593Smuzhiyun #define SYSCLK(i, n, p, w, f)				\
71*4882a593Smuzhiyun static const struct davinci_pll_sysclk_info n = {	\
72*4882a593Smuzhiyun 	.name		= #n,				\
73*4882a593Smuzhiyun 	.parent_name	= #p,				\
74*4882a593Smuzhiyun 	.id		= (i),				\
75*4882a593Smuzhiyun 	.ratio_width	= (w),				\
76*4882a593Smuzhiyun 	.flags		= (f),				\
77*4882a593Smuzhiyun }
78*4882a593Smuzhiyun 
79*4882a593Smuzhiyun /** davinci_pll_obsclk_info - OBSCLK-specific info
80*4882a593Smuzhiyun  * @name: The name of the clock
81*4882a593Smuzhiyun  * @parent_names: Array of names of the parent clocks
82*4882a593Smuzhiyun  * @num_parents: Length of @parent_names
83*4882a593Smuzhiyun  * @table: Array of values to write to OCSEL[OCSRC] cooresponding to
84*4882a593Smuzhiyun  *         @parent_names
85*4882a593Smuzhiyun  * @ocsrc_mask: Bitmask for OCSEL[OCSRC]
86*4882a593Smuzhiyun  */
87*4882a593Smuzhiyun struct davinci_pll_obsclk_info {
88*4882a593Smuzhiyun 	const char *name;
89*4882a593Smuzhiyun 	const char * const *parent_names;
90*4882a593Smuzhiyun 	u8 num_parents;
91*4882a593Smuzhiyun 	u32 *table;
92*4882a593Smuzhiyun 	u32 ocsrc_mask;
93*4882a593Smuzhiyun };
94*4882a593Smuzhiyun 
95*4882a593Smuzhiyun struct clk *davinci_pll_clk_register(struct device *dev,
96*4882a593Smuzhiyun 				     const struct davinci_pll_clk_info *info,
97*4882a593Smuzhiyun 				     const char *parent_name,
98*4882a593Smuzhiyun 				     void __iomem *base,
99*4882a593Smuzhiyun 				     struct regmap *cfgchip);
100*4882a593Smuzhiyun struct clk *davinci_pll_auxclk_register(struct device *dev,
101*4882a593Smuzhiyun 					const char *name,
102*4882a593Smuzhiyun 					void __iomem *base);
103*4882a593Smuzhiyun struct clk *davinci_pll_sysclkbp_clk_register(struct device *dev,
104*4882a593Smuzhiyun 					      const char *name,
105*4882a593Smuzhiyun 					      void __iomem *base);
106*4882a593Smuzhiyun struct clk *
107*4882a593Smuzhiyun davinci_pll_obsclk_register(struct device *dev,
108*4882a593Smuzhiyun 			    const struct davinci_pll_obsclk_info *info,
109*4882a593Smuzhiyun 			    void __iomem *base);
110*4882a593Smuzhiyun struct clk *
111*4882a593Smuzhiyun davinci_pll_sysclk_register(struct device *dev,
112*4882a593Smuzhiyun 			    const struct davinci_pll_sysclk_info *info,
113*4882a593Smuzhiyun 			    void __iomem *base);
114*4882a593Smuzhiyun 
115*4882a593Smuzhiyun int of_davinci_pll_init(struct device *dev, struct device_node *node,
116*4882a593Smuzhiyun 			const struct davinci_pll_clk_info *info,
117*4882a593Smuzhiyun 			const struct davinci_pll_obsclk_info *obsclk_info,
118*4882a593Smuzhiyun 			const struct davinci_pll_sysclk_info **div_info,
119*4882a593Smuzhiyun 			u8 max_sysclk_id,
120*4882a593Smuzhiyun 			void __iomem *base,
121*4882a593Smuzhiyun 			struct regmap *cfgchip);
122*4882a593Smuzhiyun 
123*4882a593Smuzhiyun /* Platform-specific callbacks */
124*4882a593Smuzhiyun 
125*4882a593Smuzhiyun #ifdef CONFIG_ARCH_DAVINCI_DA850
126*4882a593Smuzhiyun int da850_pll1_init(struct device *dev, void __iomem *base, struct regmap *cfgchip);
127*4882a593Smuzhiyun void of_da850_pll0_init(struct device_node *node);
128*4882a593Smuzhiyun int of_da850_pll1_init(struct device *dev, void __iomem *base, struct regmap *cfgchip);
129*4882a593Smuzhiyun #endif
130*4882a593Smuzhiyun #ifdef CONFIG_ARCH_DAVINCI_DM355
131*4882a593Smuzhiyun int dm355_pll2_init(struct device *dev, void __iomem *base, struct regmap *cfgchip);
132*4882a593Smuzhiyun #endif
133*4882a593Smuzhiyun #ifdef CONFIG_ARCH_DAVINCI_DM644x
134*4882a593Smuzhiyun int dm644x_pll2_init(struct device *dev, void __iomem *base, struct regmap *cfgchip);
135*4882a593Smuzhiyun #endif
136*4882a593Smuzhiyun #ifdef CONFIG_ARCH_DAVINCI_DM646x
137*4882a593Smuzhiyun int dm646x_pll2_init(struct device *dev, void __iomem *base, struct regmap *cfgchip);
138*4882a593Smuzhiyun #endif
139*4882a593Smuzhiyun 
140*4882a593Smuzhiyun #endif /* __CLK_DAVINCI_PLL_H___ */
141