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