Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branches 'clk-davinci-psc-da830', 'clk-renesas', 'clk-at91-recalc', 'clk-davinci' and 'clk-meson' into clk-next

* clk-davinci-psc-da830:
clk: davinci: psc-da830: fix USB0 48MHz PHY clock registration

* clk-renesas:
clk: renesas: cpg-mssr: Add support for R-Car E3
clk: renesas: Add r8a77990 CPG Core Clock Definitions
clk: renesas: rcar-gen2: Centralize quirks handling
clk: renesas: r8a77980: Correct parent clock of PCIEC0
clk: renesas: r8a7794: Fix LB clock divider
clk: renesas: r8a7792: Fix LB clock divider
clk: renesas: r8a7791/r8a7793: Fix LB clock divider
clk: renesas: r8a7745: Fix LB clock divider
clk: renesas: r8a7743: Fix LB clock divider
clk: renesas: cpg-mssr: Add r8a77470 support
clk: renesas: Add r8a77470 CPG Core Clock Definitions
clk: renesas: r8a77965: Add MSIOF controller clocks

* clk-at91-recalc:
clk: at91: PLL recalc_rate() now using cached MUL and DIV values

* clk-davinci:
clk: davinci: Fix link errors when not all SoCs are enabled
clk: davinci: psc: allow for dev == NULL
clk: davinci: da850-pll: change PLL0 to CLK_OF_DECLARE
clk: davinci: pll: allow dev == NULL
clk: davinci: psc-dm365: fix few clocks
clk: davinci: pll-dm646x: keep PLL2 SYSCLK1 always enabled
clk: davinci: psc-dm355: fix ASP0/1 clkdev lookups
clk: davinci: pll-dm355: fix SYSCLKn parent names
clk: davinci: pll-dm355: drop pll2_sysclk2

* clk-meson:
clk: meson: axg: let mpll clocks round closest
clk: meson: mpll: add round closest support
clk: meson: meson8b: mark fclk_div2 gate clocks as CLK_IS_CRITICAL
clk: meson: use SPDX license identifiers consistently
clk: meson: drop CLK_SET_RATE_PARENT flag
clk: meson-axg: Add AO Clock and Reset controller driver
clk: meson: aoclk: refactor common code into dedicated file
clk: meson: migrate to devm_of_clk_add_hw_provider API
clk: meson: gxbb: add the video decoder clocks
clk: meson: meson8b: add support for the NAND clocks
dt-bindings: clock: reset: Add AXG AO Clock and Reset Bindings
dt-bindings: clock: axg-aoclkc: New binding for Meson-AXG SoC
clk: meson: gxbb: expose VDEC_1 and VDEC_HEVC clocks
dt-bindings: clock: meson8b: export the NAND clock

+1740 -505
+1
Documentation/devicetree/bindings/clock/amlogic,gxbb-aoclkc.txt
··· 9 9 - GXBB (S905) : "amlogic,meson-gxbb-aoclkc" 10 10 - GXL (S905X, S905D) : "amlogic,meson-gxl-aoclkc" 11 11 - GXM (S912) : "amlogic,meson-gxm-aoclkc" 12 + - AXG (A113D, A113X) : "amlogic,meson-axg-aoclkc" 12 13 followed by the common "amlogic,meson-gx-aoclkc" 13 14 14 15 - #clock-cells: should be 1.
+7 -3
Documentation/devicetree/bindings/clock/renesas,cpg-mssr.txt
··· 15 15 - compatible: Must be one of: 16 16 - "renesas,r8a7743-cpg-mssr" for the r8a7743 SoC (RZ/G1M) 17 17 - "renesas,r8a7745-cpg-mssr" for the r8a7745 SoC (RZ/G1E) 18 + - "renesas,r8a77470-cpg-mssr" for the r8a77470 SoC (RZ/G1C) 18 19 - "renesas,r8a7790-cpg-mssr" for the r8a7790 SoC (R-Car H2) 19 20 - "renesas,r8a7791-cpg-mssr" for the r8a7791 SoC (R-Car M2-W) 20 21 - "renesas,r8a7792-cpg-mssr" for the r8a7792 SoC (R-Car V2H) ··· 26 25 - "renesas,r8a77965-cpg-mssr" for the r8a77965 SoC (R-Car M3-N) 27 26 - "renesas,r8a77970-cpg-mssr" for the r8a77970 SoC (R-Car V3M) 28 27 - "renesas,r8a77980-cpg-mssr" for the r8a77980 SoC (R-Car V3H) 28 + - "renesas,r8a77990-cpg-mssr" for the r8a77990 SoC (R-Car E3) 29 29 - "renesas,r8a77995-cpg-mssr" for the r8a77995 SoC (R-Car D3) 30 30 31 31 - reg: Base address and length of the memory resource used by the CPG/MSSR ··· 35 33 - clocks: References to external parent clocks, one entry for each entry in 36 34 clock-names 37 35 - clock-names: List of external parent clock names. Valid names are: 38 - - "extal" (r8a7743, r8a7745, r8a7790, r8a7791, r8a7792, r8a7793, r8a7794, 39 - r8a7795, r8a7796, r8a77965, r8a77970, r8a77980, r8a77995) 36 + - "extal" (r8a7743, r8a7745, r8a77470, r8a7790, r8a7791, r8a7792, 37 + r8a7793, r8a7794, r8a7795, r8a7796, r8a77965, r8a77970, 38 + r8a77980, r8a77990, r8a77995) 40 39 - "extalr" (r8a7795, r8a7796, r8a77965, r8a77970, r8a77980) 41 - - "usb_extal" (r8a7743, r8a7745, r8a7790, r8a7791, r8a7793, r8a7794) 40 + - "usb_extal" (r8a7743, r8a7745, r8a77470, r8a7790, r8a7791, r8a7793, 41 + r8a7794) 42 42 43 43 - #clock-cells: Must be 2 44 44 - For CPG core clocks, the two clock specifier cells must be "CPG_CORE"
+1 -12
drivers/clk/at91/clk-pll.c
··· 132 132 unsigned long parent_rate) 133 133 { 134 134 struct clk_pll *pll = to_clk_pll(hw); 135 - unsigned int pllr; 136 - u16 mul; 137 - u8 div; 138 135 139 - regmap_read(pll->regmap, PLL_REG(pll->id), &pllr); 140 - 141 - div = PLL_DIV(pllr); 142 - mul = PLL_MUL(pllr, pll->layout); 143 - 144 - if (!div || !mul) 145 - return 0; 146 - 147 - return (parent_rate / div) * (mul + 1); 136 + return (parent_rate / pll->div) * (pll->mul + 1); 148 137 } 149 138 150 139 static long clk_pll_get_best_div_mul(struct clk_pll *pll, unsigned long rate,
+3 -2
drivers/clk/davinci/pll-da830.c
··· 6 6 */ 7 7 8 8 #include <linux/clkdev.h> 9 + #include <linux/clk/davinci.h> 9 10 #include <linux/bitops.h> 10 11 #include <linux/init.h> 11 12 #include <linux/types.h> ··· 37 36 SYSCLK(6, pll0_sysclk6, pll0_pllen, 5, SYSCLK_FIXED_DIV); 38 37 SYSCLK(7, pll0_sysclk7, pll0_pllen, 5, 0); 39 38 40 - int da830_pll_init(struct device *dev, void __iomem *base) 39 + int da830_pll_init(struct device *dev, void __iomem *base, struct regmap *cfgchip) 41 40 { 42 41 struct clk *clk; 43 42 44 - davinci_pll_clk_register(dev, &da830_pll_info, "ref_clk", base); 43 + davinci_pll_clk_register(dev, &da830_pll_info, "ref_clk", base, cfgchip); 45 44 46 45 clk = davinci_pll_sysclk_register(dev, &pll0_sysclk2, base); 47 46 clk_register_clkdev(clk, "pll0_sysclk2", "da830-psc0");
+26 -11
drivers/clk/davinci/pll-da850.c
··· 7 7 8 8 #include <linux/bitops.h> 9 9 #include <linux/clk-provider.h> 10 + #include <linux/clk/davinci.h> 10 11 #include <linux/clkdev.h> 12 + #include <linux/device.h> 11 13 #include <linux/init.h> 12 14 #include <linux/kernel.h> 13 15 #include <linux/mfd/da8xx-cfgchip.h> 16 + #include <linux/mfd/syscon.h> 17 + #include <linux/of_address.h> 14 18 #include <linux/of.h> 15 19 #include <linux/types.h> 16 20 ··· 85 81 .ocsrc_mask = GENMASK(4, 0), 86 82 }; 87 83 88 - int da850_pll0_init(struct device *dev, void __iomem *base) 84 + int da850_pll0_init(struct device *dev, void __iomem *base, struct regmap *cfgchip) 89 85 { 90 86 struct clk *clk; 91 87 92 - davinci_pll_clk_register(dev, &da850_pll0_info, "ref_clk", base); 88 + davinci_pll_clk_register(dev, &da850_pll0_info, "ref_clk", base, cfgchip); 93 89 94 90 clk = davinci_pll_sysclk_register(dev, &pll0_sysclk1, base); 95 91 clk_register_clkdev(clk, "pll0_sysclk1", "da850-psc0"); ··· 138 134 NULL 139 135 }; 140 136 141 - int of_da850_pll0_init(struct device *dev, void __iomem *base) 137 + void of_da850_pll0_init(struct device_node *node) 142 138 { 143 - return of_davinci_pll_init(dev, &da850_pll0_info, 144 - &da850_pll0_obsclk_info, 145 - da850_pll0_sysclk_info, 7, base); 139 + void __iomem *base; 140 + struct regmap *cfgchip; 141 + 142 + base = of_iomap(node, 0); 143 + if (!base) { 144 + pr_err("%s: ioremap failed\n", __func__); 145 + return; 146 + } 147 + 148 + cfgchip = syscon_regmap_lookup_by_compatible("ti,da830-cfgchip"); 149 + 150 + of_davinci_pll_init(NULL, node, &da850_pll0_info, 151 + &da850_pll0_obsclk_info, 152 + da850_pll0_sysclk_info, 7, base, cfgchip); 146 153 } 147 154 148 155 static const struct davinci_pll_clk_info da850_pll1_info = { ··· 194 179 .ocsrc_mask = GENMASK(4, 0), 195 180 }; 196 181 197 - int da850_pll1_init(struct device *dev, void __iomem *base) 182 + int da850_pll1_init(struct device *dev, void __iomem *base, struct regmap *cfgchip) 198 183 { 199 184 struct clk *clk; 200 185 201 - davinci_pll_clk_register(dev, &da850_pll1_info, "oscin", base); 186 + davinci_pll_clk_register(dev, &da850_pll1_info, "oscin", base, cfgchip); 202 187 203 188 davinci_pll_sysclk_register(dev, &pll1_sysclk1, base); 204 189 ··· 219 204 NULL 220 205 }; 221 206 222 - int of_da850_pll1_init(struct device *dev, void __iomem *base) 207 + int of_da850_pll1_init(struct device *dev, void __iomem *base, struct regmap *cfgchip) 223 208 { 224 - return of_davinci_pll_init(dev, &da850_pll1_info, 209 + return of_davinci_pll_init(dev, dev->of_node, &da850_pll1_info, 225 210 &da850_pll1_obsclk_info, 226 - da850_pll1_sysclk_info, 3, base); 211 + da850_pll1_sysclk_info, 3, base, cfgchip); 227 212 }
+10 -12
drivers/clk/davinci/pll-dm355.c
··· 6 6 */ 7 7 8 8 #include <linux/bitops.h> 9 + #include <linux/clk/davinci.h> 9 10 #include <linux/clkdev.h> 10 11 #include <linux/init.h> 11 12 #include <linux/types.h> ··· 23 22 PLL_POSTDIV_ALWAYS_ENABLED | PLL_POSTDIV_FIXED_DIV, 24 23 }; 25 24 26 - SYSCLK(1, pll1_sysclk1, pll1, 5, SYSCLK_FIXED_DIV | SYSCLK_ALWAYS_ENABLED); 27 - SYSCLK(2, pll1_sysclk2, pll1, 5, SYSCLK_FIXED_DIV | SYSCLK_ALWAYS_ENABLED); 28 - SYSCLK(3, pll1_sysclk3, pll1, 5, SYSCLK_ALWAYS_ENABLED); 29 - SYSCLK(4, pll1_sysclk4, pll1, 5, SYSCLK_ALWAYS_ENABLED); 25 + SYSCLK(1, pll1_sysclk1, pll1_pllen, 5, SYSCLK_FIXED_DIV | SYSCLK_ALWAYS_ENABLED); 26 + SYSCLK(2, pll1_sysclk2, pll1_pllen, 5, SYSCLK_FIXED_DIV | SYSCLK_ALWAYS_ENABLED); 27 + SYSCLK(3, pll1_sysclk3, pll1_pllen, 5, SYSCLK_ALWAYS_ENABLED); 28 + SYSCLK(4, pll1_sysclk4, pll1_pllen, 5, SYSCLK_ALWAYS_ENABLED); 30 29 31 - int dm355_pll1_init(struct device *dev, void __iomem *base) 30 + int dm355_pll1_init(struct device *dev, void __iomem *base, struct regmap *cfgchip) 32 31 { 33 32 struct clk *clk; 34 33 35 - davinci_pll_clk_register(dev, &dm355_pll1_info, "ref_clk", base); 34 + davinci_pll_clk_register(dev, &dm355_pll1_info, "ref_clk", base, cfgchip); 36 35 37 36 clk = davinci_pll_sysclk_register(dev, &pll1_sysclk1, base); 38 37 clk_register_clkdev(clk, "pll1_sysclk1", "dm355-psc"); ··· 63 62 PLL_POSTDIV_ALWAYS_ENABLED | PLL_POSTDIV_FIXED_DIV, 64 63 }; 65 64 66 - SYSCLK(1, pll2_sysclk1, pll2, 5, SYSCLK_FIXED_DIV); 67 - SYSCLK(2, pll2_sysclk2, pll2, 5, SYSCLK_FIXED_DIV | SYSCLK_ALWAYS_ENABLED); 65 + SYSCLK(1, pll2_sysclk1, pll2_pllen, 5, SYSCLK_FIXED_DIV | SYSCLK_ALWAYS_ENABLED); 68 66 69 - int dm355_pll2_init(struct device *dev, void __iomem *base) 67 + int dm355_pll2_init(struct device *dev, void __iomem *base, struct regmap *cfgchip) 70 68 { 71 - davinci_pll_clk_register(dev, &dm355_pll2_info, "oscin", base); 69 + davinci_pll_clk_register(dev, &dm355_pll2_info, "oscin", base, cfgchip); 72 70 73 71 davinci_pll_sysclk_register(dev, &pll2_sysclk1, base); 74 - 75 - davinci_pll_sysclk_register(dev, &pll2_sysclk2, base); 76 72 77 73 davinci_pll_sysclkbp_clk_register(dev, "pll2_sysclkbp", base); 78 74
+5 -4
drivers/clk/davinci/pll-dm365.c
··· 7 7 8 8 #include <linux/bitops.h> 9 9 #include <linux/clkdev.h> 10 + #include <linux/clk/davinci.h> 10 11 #include <linux/init.h> 11 12 #include <linux/kernel.h> 12 13 #include <linux/types.h> ··· 57 56 .ocsrc_mask = BIT(4), 58 57 }; 59 58 60 - int dm365_pll1_init(struct device *dev, void __iomem *base) 59 + int dm365_pll1_init(struct device *dev, void __iomem *base, struct regmap *cfgchip) 61 60 { 62 61 struct clk *clk; 63 62 64 - davinci_pll_clk_register(dev, &dm365_pll1_info, "ref_clk", base); 63 + davinci_pll_clk_register(dev, &dm365_pll1_info, "ref_clk", base, cfgchip); 65 64 66 65 clk = davinci_pll_sysclk_register(dev, &pll1_sysclk1, base); 67 66 clk_register_clkdev(clk, "pll1_sysclk1", "dm365-psc"); ··· 120 119 .ocsrc_mask = BIT(4), 121 120 }; 122 121 123 - int dm365_pll2_init(struct device *dev, void __iomem *base) 122 + int dm365_pll2_init(struct device *dev, void __iomem *base, struct regmap *cfgchip) 124 123 { 125 124 struct clk *clk; 126 125 127 - davinci_pll_clk_register(dev, &dm365_pll2_info, "oscin", base); 126 + davinci_pll_clk_register(dev, &dm365_pll2_info, "oscin", base, cfgchip); 128 127 129 128 davinci_pll_sysclk_register(dev, &pll2_sysclk1, base); 130 129
+5 -4
drivers/clk/davinci/pll-dm644x.c
··· 6 6 */ 7 7 8 8 #include <linux/bitops.h> 9 + #include <linux/clk/davinci.h> 9 10 #include <linux/clkdev.h> 10 11 #include <linux/init.h> 11 12 #include <linux/types.h> ··· 28 27 SYSCLK(3, pll1_sysclk3, pll1_pllen, 4, SYSCLK_FIXED_DIV); 29 28 SYSCLK(5, pll1_sysclk5, pll1_pllen, 4, SYSCLK_FIXED_DIV); 30 29 31 - int dm644x_pll1_init(struct device *dev, void __iomem *base) 30 + int dm644x_pll1_init(struct device *dev, void __iomem *base, struct regmap *cfgchip) 32 31 { 33 32 struct clk *clk; 34 33 35 - davinci_pll_clk_register(dev, &dm644x_pll1_info, "ref_clk", base); 34 + davinci_pll_clk_register(dev, &dm644x_pll1_info, "ref_clk", base, cfgchip); 36 35 37 36 clk = davinci_pll_sysclk_register(dev, &pll1_sysclk1, base); 38 37 clk_register_clkdev(clk, "pll1_sysclk1", "dm644x-psc"); ··· 67 66 SYSCLK(1, pll2_sysclk1, pll2_pllen, 4, 0); 68 67 SYSCLK(2, pll2_sysclk2, pll2_pllen, 4, 0); 69 68 70 - int dm644x_pll2_init(struct device *dev, void __iomem *base) 69 + int dm644x_pll2_init(struct device *dev, void __iomem *base, struct regmap *cfgchip) 71 70 { 72 - davinci_pll_clk_register(dev, &dm644x_pll2_info, "oscin", base); 71 + davinci_pll_clk_register(dev, &dm644x_pll2_info, "oscin", base, cfgchip); 73 72 74 73 davinci_pll_sysclk_register(dev, &pll2_sysclk1, base); 75 74
+6 -5
drivers/clk/davinci/pll-dm646x.c
··· 6 6 */ 7 7 8 8 #include <linux/clk-provider.h> 9 + #include <linux/clk/davinci.h> 9 10 #include <linux/clkdev.h> 10 11 #include <linux/init.h> 11 12 #include <linux/types.h> ··· 30 29 SYSCLK(8, pll1_sysclk8, pll1_pllen, 4, 0); 31 30 SYSCLK(9, pll1_sysclk9, pll1_pllen, 4, 0); 32 31 33 - int dm646x_pll1_init(struct device *dev, void __iomem *base) 32 + int dm646x_pll1_init(struct device *dev, void __iomem *base, struct regmap *cfgchip) 34 33 { 35 34 struct clk *clk; 36 35 37 - davinci_pll_clk_register(dev, &dm646x_pll1_info, "ref_clk", base); 36 + davinci_pll_clk_register(dev, &dm646x_pll1_info, "ref_clk", base, cfgchip); 38 37 39 38 clk = davinci_pll_sysclk_register(dev, &pll1_sysclk1, base); 40 39 clk_register_clkdev(clk, "pll1_sysclk1", "dm646x-psc"); ··· 73 72 .flags = 0, 74 73 }; 75 74 76 - SYSCLK(1, pll2_sysclk1, pll2_pllen, 4, 0); 75 + SYSCLK(1, pll2_sysclk1, pll2_pllen, 4, SYSCLK_ALWAYS_ENABLED); 77 76 78 - int dm646x_pll2_init(struct device *dev, void __iomem *base) 77 + int dm646x_pll2_init(struct device *dev, void __iomem *base, struct regmap *cfgchip) 79 78 { 80 - davinci_pll_clk_register(dev, &dm646x_pll2_info, "oscin", base); 79 + davinci_pll_clk_register(dev, &dm646x_pll2_info, "oscin", base, cfgchip); 81 80 82 81 davinci_pll_sysclk_register(dev, &pll2_sysclk1, base); 83 82
+207 -92
drivers/clk/davinci/pll.c
··· 11 11 12 12 #include <linux/clk-provider.h> 13 13 #include <linux/clk.h> 14 + #include <linux/clk/davinci.h> 14 15 #include <linux/delay.h> 15 16 #include <linux/err.h> 16 17 #include <linux/io.h> ··· 224 223 225 224 /** 226 225 * davinci_pll_div_register - common *DIV clock implementation 226 + * @dev: The PLL platform device or NULL 227 227 * @name: the clock name 228 228 * @parent_name: the parent clock name 229 229 * @reg: the *DIV register ··· 242 240 const struct clk_ops *divider_ops = &clk_divider_ops; 243 241 struct clk_gate *gate; 244 242 struct clk_divider *divider; 243 + struct clk *clk; 244 + int ret; 245 245 246 - gate = devm_kzalloc(dev, sizeof(*gate), GFP_KERNEL); 246 + gate = kzalloc(sizeof(*gate), GFP_KERNEL); 247 247 if (!gate) 248 248 return ERR_PTR(-ENOMEM); 249 249 250 250 gate->reg = reg; 251 251 gate->bit_idx = DIV_ENABLE_SHIFT; 252 252 253 - divider = devm_kzalloc(dev, sizeof(*divider), GFP_KERNEL); 254 - if (!divider) 255 - return ERR_PTR(-ENOMEM); 253 + divider = kzalloc(sizeof(*divider), GFP_KERNEL); 254 + if (!divider) { 255 + ret = -ENOMEM; 256 + goto err_free_gate; 257 + } 256 258 257 259 divider->reg = reg; 258 260 divider->shift = DIV_RATIO_SHIFT; ··· 267 261 divider_ops = &clk_divider_ro_ops; 268 262 } 269 263 270 - return clk_register_composite(dev, name, parent_names, num_parents, 271 - NULL, NULL, &divider->hw, divider_ops, 272 - &gate->hw, &clk_gate_ops, flags); 264 + clk = clk_register_composite(dev, name, parent_names, num_parents, 265 + NULL, NULL, &divider->hw, divider_ops, 266 + &gate->hw, &clk_gate_ops, flags); 267 + if (IS_ERR(clk)) { 268 + ret = PTR_ERR(clk); 269 + goto err_free_divider; 270 + } 271 + 272 + return clk; 273 + 274 + err_free_divider: 275 + kfree(divider); 276 + err_free_gate: 277 + kfree(gate); 278 + 279 + return ERR_PTR(ret); 273 280 } 274 281 275 282 struct davinci_pllen_clk { ··· 340 321 return NOTIFY_OK; 341 322 } 342 323 343 - static struct davinci_pll_platform_data *davinci_pll_get_pdata(struct device *dev) 344 - { 345 - struct davinci_pll_platform_data *pdata = dev_get_platdata(dev); 346 - 347 - /* 348 - * Platform data is optional, so allocate a new struct if one was not 349 - * provided. For device tree, this will always be the case. 350 - */ 351 - if (!pdata) 352 - pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL); 353 - if (!pdata) 354 - return NULL; 355 - 356 - /* for device tree, we need to fill in the struct */ 357 - if (dev->of_node) 358 - pdata->cfgchip = 359 - syscon_regmap_lookup_by_compatible("ti,da830-cfgchip"); 360 - 361 - return pdata; 362 - } 363 - 364 324 static struct notifier_block davinci_pllen_notifier = { 365 325 .notifier_call = davinci_pllen_rate_change, 366 326 }; 367 327 368 328 /** 369 329 * davinci_pll_clk_register - Register a PLL clock 330 + * @dev: The PLL platform device or NULL 370 331 * @info: The device-specific clock info 371 332 * @parent_name: The parent clock name 372 333 * @base: The PLL's memory region 334 + * @cfgchip: CFGCHIP syscon regmap for info->unlock_reg or NULL 373 335 * 374 336 * This creates a series of clocks that represent the PLL. 375 337 * ··· 366 366 struct clk *davinci_pll_clk_register(struct device *dev, 367 367 const struct davinci_pll_clk_info *info, 368 368 const char *parent_name, 369 - void __iomem *base) 369 + void __iomem *base, 370 + struct regmap *cfgchip) 370 371 { 371 - struct davinci_pll_platform_data *pdata; 372 372 char prediv_name[MAX_NAME_SIZE]; 373 373 char pllout_name[MAX_NAME_SIZE]; 374 374 char postdiv_name[MAX_NAME_SIZE]; ··· 376 376 struct clk_init_data init; 377 377 struct davinci_pll_clk *pllout; 378 378 struct davinci_pllen_clk *pllen; 379 - struct clk *pllout_clk, *clk; 380 - 381 - pdata = davinci_pll_get_pdata(dev); 382 - if (!pdata) 383 - return ERR_PTR(-ENOMEM); 379 + struct clk *oscin_clk = NULL; 380 + struct clk *prediv_clk = NULL; 381 + struct clk *pllout_clk; 382 + struct clk *postdiv_clk = NULL; 383 + struct clk *pllen_clk; 384 + int ret; 384 385 385 386 if (info->flags & PLL_HAS_CLKMODE) { 386 387 /* ··· 393 392 * a number of different things. In this driver we use it to 394 393 * mean the signal after the PLLCTL[CLKMODE] switch. 395 394 */ 396 - clk = clk_register_fixed_factor(dev, OSCIN_CLK_NAME, 397 - parent_name, 0, 1, 1); 398 - if (IS_ERR(clk)) 399 - return clk; 395 + oscin_clk = clk_register_fixed_factor(dev, OSCIN_CLK_NAME, 396 + parent_name, 0, 1, 1); 397 + if (IS_ERR(oscin_clk)) 398 + return oscin_clk; 400 399 401 400 parent_name = OSCIN_CLK_NAME; 402 401 } ··· 412 411 413 412 /* Some? DM355 chips don't correctly report the PREDIV value */ 414 413 if (info->flags & PLL_PREDIV_FIXED8) 415 - clk = clk_register_fixed_factor(dev, prediv_name, 416 - parent_name, flags, 1, 8); 414 + prediv_clk = clk_register_fixed_factor(dev, prediv_name, 415 + parent_name, flags, 1, 8); 417 416 else 418 - clk = davinci_pll_div_register(dev, prediv_name, 417 + prediv_clk = davinci_pll_div_register(dev, prediv_name, 419 418 parent_name, base + PREDIV, fixed, flags); 420 - if (IS_ERR(clk)) 421 - return clk; 419 + if (IS_ERR(prediv_clk)) { 420 + ret = PTR_ERR(prediv_clk); 421 + goto err_unregister_oscin; 422 + } 422 423 423 424 parent_name = prediv_name; 424 425 } 425 426 426 427 /* Unlock writing to PLL registers */ 427 428 if (info->unlock_reg) { 428 - if (IS_ERR_OR_NULL(pdata->cfgchip)) 429 + if (IS_ERR_OR_NULL(cfgchip)) 429 430 dev_warn(dev, "Failed to get CFGCHIP (%ld)\n", 430 - PTR_ERR(pdata->cfgchip)); 431 + PTR_ERR(cfgchip)); 431 432 else 432 - regmap_write_bits(pdata->cfgchip, info->unlock_reg, 433 + regmap_write_bits(cfgchip, info->unlock_reg, 433 434 info->unlock_mask, 0); 434 435 } 435 436 436 - pllout = devm_kzalloc(dev, sizeof(*pllout), GFP_KERNEL); 437 - if (!pllout) 438 - return ERR_PTR(-ENOMEM); 437 + pllout = kzalloc(sizeof(*pllout), GFP_KERNEL); 438 + if (!pllout) { 439 + ret = -ENOMEM; 440 + goto err_unregister_prediv; 441 + } 439 442 440 443 snprintf(pllout_name, MAX_NAME_SIZE, "%s_pllout", info->name); 441 444 ··· 461 456 pllout->pllm_min = info->pllm_min; 462 457 pllout->pllm_max = info->pllm_max; 463 458 464 - pllout_clk = devm_clk_register(dev, &pllout->hw); 465 - if (IS_ERR(pllout_clk)) 466 - return pllout_clk; 459 + pllout_clk = clk_register(dev, &pllout->hw); 460 + if (IS_ERR(pllout_clk)) { 461 + ret = PTR_ERR(pllout_clk); 462 + goto err_free_pllout; 463 + } 467 464 468 465 clk_hw_set_rate_range(&pllout->hw, info->pllout_min_rate, 469 466 info->pllout_max_rate); ··· 481 474 if (info->flags & PLL_POSTDIV_ALWAYS_ENABLED) 482 475 flags |= CLK_IS_CRITICAL; 483 476 484 - clk = davinci_pll_div_register(dev, postdiv_name, parent_name, 485 - base + POSTDIV, fixed, flags); 486 - if (IS_ERR(clk)) 487 - return clk; 477 + postdiv_clk = davinci_pll_div_register(dev, postdiv_name, 478 + parent_name, base + POSTDIV, fixed, flags); 479 + if (IS_ERR(postdiv_clk)) { 480 + ret = PTR_ERR(postdiv_clk); 481 + goto err_unregister_pllout; 482 + } 488 483 489 484 parent_name = postdiv_name; 490 485 } 491 486 492 - pllen = devm_kzalloc(dev, sizeof(*pllout), GFP_KERNEL); 493 - if (!pllen) 494 - return ERR_PTR(-ENOMEM); 487 + pllen = kzalloc(sizeof(*pllout), GFP_KERNEL); 488 + if (!pllen) { 489 + ret = -ENOMEM; 490 + goto err_unregister_postdiv; 491 + } 495 492 496 493 snprintf(pllen_name, MAX_NAME_SIZE, "%s_pllen", info->name); 497 494 ··· 508 497 pllen->hw.init = &init; 509 498 pllen->base = base; 510 499 511 - clk = devm_clk_register(dev, &pllen->hw); 512 - if (IS_ERR(clk)) 513 - return clk; 500 + pllen_clk = clk_register(dev, &pllen->hw); 501 + if (IS_ERR(pllen_clk)) { 502 + ret = PTR_ERR(pllen_clk); 503 + goto err_free_pllen; 504 + } 514 505 515 - clk_notifier_register(clk, &davinci_pllen_notifier); 506 + clk_notifier_register(pllen_clk, &davinci_pllen_notifier); 516 507 517 508 return pllout_clk; 509 + 510 + err_free_pllen: 511 + kfree(pllen); 512 + err_unregister_postdiv: 513 + clk_unregister(postdiv_clk); 514 + err_unregister_pllout: 515 + clk_unregister(pllout_clk); 516 + err_free_pllout: 517 + kfree(pllout); 518 + err_unregister_prediv: 519 + clk_unregister(prediv_clk); 520 + err_unregister_oscin: 521 + clk_unregister(oscin_clk); 522 + 523 + return ERR_PTR(ret); 518 524 } 519 525 520 526 /** 521 527 * davinci_pll_auxclk_register - Register bypass clock (AUXCLK) 528 + * @dev: The PLL platform device or NULL 522 529 * @name: The clock name 523 530 * @base: The PLL memory region 524 531 */ ··· 550 521 551 522 /** 552 523 * davinci_pll_sysclkbp_clk_register - Register bypass divider clock (SYSCLKBP) 524 + * @dev: The PLL platform device or NULL 553 525 * @name: The clock name 554 526 * @base: The PLL memory region 555 527 */ ··· 565 535 566 536 /** 567 537 * davinci_pll_obsclk_register - Register oscillator divider clock (OBSCLK) 538 + * @dev: The PLL platform device or NULL 568 539 * @info: The clock info 569 540 * @base: The PLL memory region 570 541 */ ··· 577 546 struct clk_mux *mux; 578 547 struct clk_gate *gate; 579 548 struct clk_divider *divider; 549 + struct clk *clk; 580 550 u32 oscdiv; 551 + int ret; 581 552 582 - mux = devm_kzalloc(dev, sizeof(*mux), GFP_KERNEL); 553 + mux = kzalloc(sizeof(*mux), GFP_KERNEL); 583 554 if (!mux) 584 555 return ERR_PTR(-ENOMEM); 585 556 ··· 589 556 mux->table = info->table; 590 557 mux->mask = info->ocsrc_mask; 591 558 592 - gate = devm_kzalloc(dev, sizeof(*gate), GFP_KERNEL); 593 - if (!gate) 594 - return ERR_PTR(-ENOMEM); 559 + gate = kzalloc(sizeof(*gate), GFP_KERNEL); 560 + if (!gate) { 561 + ret = -ENOMEM; 562 + goto err_free_mux; 563 + } 595 564 596 565 gate->reg = base + CKEN; 597 566 gate->bit_idx = CKEN_OBSCLK_SHIFT; 598 567 599 - divider = devm_kzalloc(dev, sizeof(*divider), GFP_KERNEL); 600 - if (!divider) 601 - return ERR_PTR(-ENOMEM); 568 + divider = kzalloc(sizeof(*divider), GFP_KERNEL); 569 + if (!divider) { 570 + ret = -ENOMEM; 571 + goto err_free_gate; 572 + } 602 573 603 574 divider->reg = base + OSCDIV; 604 575 divider->shift = DIV_RATIO_SHIFT; ··· 613 576 oscdiv |= BIT(DIV_ENABLE_SHIFT); 614 577 writel(oscdiv, base + OSCDIV); 615 578 616 - return clk_register_composite(dev, info->name, info->parent_names, 617 - info->num_parents, 618 - &mux->hw, &clk_mux_ops, 619 - &divider->hw, &clk_divider_ops, 620 - &gate->hw, &clk_gate_ops, 0); 579 + clk = clk_register_composite(dev, info->name, info->parent_names, 580 + info->num_parents, 581 + &mux->hw, &clk_mux_ops, 582 + &divider->hw, &clk_divider_ops, 583 + &gate->hw, &clk_gate_ops, 0); 584 + 585 + if (IS_ERR(clk)) { 586 + ret = PTR_ERR(clk); 587 + goto err_free_divider; 588 + } 589 + 590 + return clk; 591 + 592 + err_free_divider: 593 + kfree(divider); 594 + err_free_gate: 595 + kfree(gate); 596 + err_free_mux: 597 + kfree(mux); 598 + 599 + return ERR_PTR(ret); 621 600 } 622 601 623 602 /* The PLL SYSCLKn clocks have a mechanism for synchronizing rate changes. */ ··· 669 616 670 617 /** 671 618 * davinci_pll_sysclk_register - Register divider clocks (SYSCLKn) 619 + * @dev: The PLL platform device or NULL 672 620 * @info: The clock info 673 621 * @base: The PLL memory region 674 622 */ ··· 684 630 struct clk *clk; 685 631 u32 reg; 686 632 u32 flags = 0; 633 + int ret; 687 634 688 635 /* PLLDIVn registers are not entirely consecutive */ 689 636 if (info->id < 4) ··· 692 637 else 693 638 reg = PLLDIV4 + 4 * (info->id - 4); 694 639 695 - gate = devm_kzalloc(dev, sizeof(*gate), GFP_KERNEL); 640 + gate = kzalloc(sizeof(*gate), GFP_KERNEL); 696 641 if (!gate) 697 642 return ERR_PTR(-ENOMEM); 698 643 699 644 gate->reg = base + reg; 700 645 gate->bit_idx = DIV_ENABLE_SHIFT; 701 646 702 - divider = devm_kzalloc(dev, sizeof(*divider), GFP_KERNEL); 703 - if (!divider) 704 - return ERR_PTR(-ENOMEM); 647 + divider = kzalloc(sizeof(*divider), GFP_KERNEL); 648 + if (!divider) { 649 + ret = -ENOMEM; 650 + goto err_free_gate; 651 + } 705 652 706 653 divider->reg = base + reg; 707 654 divider->shift = DIV_RATIO_SHIFT; ··· 725 668 clk = clk_register_composite(dev, info->name, &info->parent_name, 1, 726 669 NULL, NULL, &divider->hw, divider_ops, 727 670 &gate->hw, &clk_gate_ops, flags); 728 - if (IS_ERR(clk)) 729 - return clk; 671 + if (IS_ERR(clk)) { 672 + ret = PTR_ERR(clk); 673 + goto err_free_divider; 674 + } 730 675 731 676 clk_notifier_register(clk, &davinci_pll_sysclk_notifier); 732 677 733 678 return clk; 679 + 680 + err_free_divider: 681 + kfree(divider); 682 + err_free_gate: 683 + kfree(gate); 684 + 685 + return ERR_PTR(ret); 734 686 } 735 687 736 - int of_davinci_pll_init(struct device *dev, 688 + int of_davinci_pll_init(struct device *dev, struct device_node *node, 737 689 const struct davinci_pll_clk_info *info, 738 690 const struct davinci_pll_obsclk_info *obsclk_info, 739 691 const struct davinci_pll_sysclk_info **div_info, 740 692 u8 max_sysclk_id, 741 - void __iomem *base) 693 + void __iomem *base, 694 + struct regmap *cfgchip) 742 695 { 743 - struct device_node *node = dev->of_node; 744 696 struct device_node *child; 745 697 const char *parent_name; 746 698 struct clk *clk; ··· 759 693 else 760 694 parent_name = OSCIN_CLK_NAME; 761 695 762 - clk = davinci_pll_clk_register(dev, info, parent_name, base); 696 + clk = davinci_pll_clk_register(dev, info, parent_name, base, cfgchip); 763 697 if (IS_ERR(clk)) { 764 698 dev_err(dev, "failed to register %s\n", info->name); 765 699 return PTR_ERR(clk); ··· 777 711 int n_clks = max_sysclk_id + 1; 778 712 int i; 779 713 780 - clk_data = devm_kzalloc(dev, sizeof(*clk_data), GFP_KERNEL); 714 + clk_data = kzalloc(sizeof(*clk_data), GFP_KERNEL); 781 715 if (!clk_data) 782 716 return -ENOMEM; 783 717 784 - clks = devm_kmalloc_array(dev, n_clks, sizeof(*clks), GFP_KERNEL); 785 - if (!clks) 718 + clks = kmalloc_array(n_clks, sizeof(*clks), GFP_KERNEL); 719 + if (!clks) { 720 + kfree(clk_data); 786 721 return -ENOMEM; 722 + } 787 723 788 724 clk_data->clks = clks; 789 725 clk_data->clk_num = n_clks; ··· 838 770 return 0; 839 771 } 840 772 773 + static struct davinci_pll_platform_data *davinci_pll_get_pdata(struct device *dev) 774 + { 775 + struct davinci_pll_platform_data *pdata = dev_get_platdata(dev); 776 + 777 + /* 778 + * Platform data is optional, so allocate a new struct if one was not 779 + * provided. For device tree, this will always be the case. 780 + */ 781 + if (!pdata) 782 + pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL); 783 + if (!pdata) 784 + return NULL; 785 + 786 + /* for device tree, we need to fill in the struct */ 787 + if (dev->of_node) 788 + pdata->cfgchip = 789 + syscon_regmap_lookup_by_compatible("ti,da830-cfgchip"); 790 + 791 + return pdata; 792 + } 793 + 794 + /* needed in early boot for clocksource/clockevent */ 795 + #ifdef CONFIG_ARCH_DAVINCI_DA850 796 + CLK_OF_DECLARE(da850_pll0, "ti,da850-pll0", of_da850_pll0_init); 797 + #endif 798 + 841 799 static const struct of_device_id davinci_pll_of_match[] = { 842 - { .compatible = "ti,da850-pll0", .data = of_da850_pll0_init }, 800 + #ifdef CONFIG_ARCH_DAVINCI_DA850 843 801 { .compatible = "ti,da850-pll1", .data = of_da850_pll1_init }, 802 + #endif 844 803 { } 845 804 }; 846 805 847 806 static const struct platform_device_id davinci_pll_id_table[] = { 807 + #ifdef CONFIG_ARCH_DAVINCI_DA830 848 808 { .name = "da830-pll", .driver_data = (kernel_ulong_t)da830_pll_init }, 809 + #endif 810 + #ifdef CONFIG_ARCH_DAVINCI_DA850 849 811 { .name = "da850-pll0", .driver_data = (kernel_ulong_t)da850_pll0_init }, 850 812 { .name = "da850-pll1", .driver_data = (kernel_ulong_t)da850_pll1_init }, 813 + #endif 814 + #ifdef CONFIG_ARCH_DAVINCI_DM355 851 815 { .name = "dm355-pll1", .driver_data = (kernel_ulong_t)dm355_pll1_init }, 852 816 { .name = "dm355-pll2", .driver_data = (kernel_ulong_t)dm355_pll2_init }, 817 + #endif 818 + #ifdef CONFIG_ARCH_DAVINCI_DM365 853 819 { .name = "dm365-pll1", .driver_data = (kernel_ulong_t)dm365_pll1_init }, 854 820 { .name = "dm365-pll2", .driver_data = (kernel_ulong_t)dm365_pll2_init }, 821 + #endif 822 + #ifdef CONFIG_ARCH_DAVINCI_DM644x 855 823 { .name = "dm644x-pll1", .driver_data = (kernel_ulong_t)dm644x_pll1_init }, 856 824 { .name = "dm644x-pll2", .driver_data = (kernel_ulong_t)dm644x_pll2_init }, 825 + #endif 826 + #ifdef CONFIG_ARCH_DAVINCI_DM646x 857 827 { .name = "dm646x-pll1", .driver_data = (kernel_ulong_t)dm646x_pll1_init }, 858 828 { .name = "dm646x-pll2", .driver_data = (kernel_ulong_t)dm646x_pll2_init }, 829 + #endif 859 830 { } 860 831 }; 861 832 862 - typedef int (*davinci_pll_init)(struct device *dev, void __iomem *base); 833 + typedef int (*davinci_pll_init)(struct device *dev, void __iomem *base, 834 + struct regmap *cfgchip); 863 835 864 836 static int davinci_pll_probe(struct platform_device *pdev) 865 837 { 866 838 struct device *dev = &pdev->dev; 839 + struct davinci_pll_platform_data *pdata; 867 840 const struct of_device_id *of_id; 868 841 davinci_pll_init pll_init = NULL; 869 842 struct resource *res; ··· 921 812 return -EINVAL; 922 813 } 923 814 815 + pdata = davinci_pll_get_pdata(dev); 816 + if (!pdata) { 817 + dev_err(dev, "missing platform data\n"); 818 + return -EINVAL; 819 + } 820 + 924 821 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 925 822 base = devm_ioremap_resource(dev, res); 926 823 if (IS_ERR(base)) 927 824 return PTR_ERR(base); 928 825 929 - return pll_init(dev, base); 826 + return pll_init(dev, base, pdata->cfgchip); 930 827 } 931 828 932 829 static struct platform_driver davinci_pll_driver = {
+20 -21
drivers/clk/davinci/pll.h
··· 11 11 #include <linux/bitops.h> 12 12 #include <linux/clk-provider.h> 13 13 #include <linux/of.h> 14 + #include <linux/regmap.h> 14 15 #include <linux/types.h> 15 16 16 17 #define PLL_HAS_CLKMODE BIT(0) /* PLL has PLLCTL[CLKMODE] */ ··· 95 94 struct clk *davinci_pll_clk_register(struct device *dev, 96 95 const struct davinci_pll_clk_info *info, 97 96 const char *parent_name, 98 - void __iomem *base); 97 + void __iomem *base, 98 + struct regmap *cfgchip); 99 99 struct clk *davinci_pll_auxclk_register(struct device *dev, 100 100 const char *name, 101 101 void __iomem *base); ··· 112 110 const struct davinci_pll_sysclk_info *info, 113 111 void __iomem *base); 114 112 115 - int of_davinci_pll_init(struct device *dev, 113 + int of_davinci_pll_init(struct device *dev, struct device_node *node, 116 114 const struct davinci_pll_clk_info *info, 117 115 const struct davinci_pll_obsclk_info *obsclk_info, 118 116 const struct davinci_pll_sysclk_info **div_info, 119 117 u8 max_sysclk_id, 120 - void __iomem *base); 118 + void __iomem *base, 119 + struct regmap *cfgchip); 121 120 122 121 /* Platform-specific callbacks */ 123 122 124 - int da830_pll_init(struct device *dev, void __iomem *base); 125 - 126 - int da850_pll0_init(struct device *dev, void __iomem *base); 127 - int da850_pll1_init(struct device *dev, void __iomem *base); 128 - int of_da850_pll0_init(struct device *dev, void __iomem *base); 129 - int of_da850_pll1_init(struct device *dev, void __iomem *base); 130 - 131 - int dm355_pll1_init(struct device *dev, void __iomem *base); 132 - int dm355_pll2_init(struct device *dev, void __iomem *base); 133 - 134 - int dm365_pll1_init(struct device *dev, void __iomem *base); 135 - int dm365_pll2_init(struct device *dev, void __iomem *base); 136 - 137 - int dm644x_pll1_init(struct device *dev, void __iomem *base); 138 - int dm644x_pll2_init(struct device *dev, void __iomem *base); 139 - 140 - int dm646x_pll1_init(struct device *dev, void __iomem *base); 141 - int dm646x_pll2_init(struct device *dev, void __iomem *base); 123 + #ifdef CONFIG_ARCH_DAVINCI_DA850 124 + int da850_pll1_init(struct device *dev, void __iomem *base, struct regmap *cfgchip); 125 + void of_da850_pll0_init(struct device_node *node); 126 + int of_da850_pll1_init(struct device *dev, void __iomem *base, struct regmap *cfgchip); 127 + #endif 128 + #ifdef CONFIG_ARCH_DAVINCI_DM355 129 + int dm355_pll2_init(struct device *dev, void __iomem *base, struct regmap *cfgchip); 130 + #endif 131 + #ifdef CONFIG_ARCH_DAVINCI_DM644x 132 + int dm644x_pll2_init(struct device *dev, void __iomem *base, struct regmap *cfgchip); 133 + #endif 134 + #ifdef CONFIG_ARCH_DAVINCI_DM646x 135 + int dm646x_pll2_init(struct device *dev, void __iomem *base, struct regmap *cfgchip); 136 + #endif 142 137 143 138 #endif /* __CLK_DAVINCI_PLL_H___ */
+2 -1
drivers/clk/davinci/psc-da830.c
··· 55 55 .psc_init = &da830_psc0_init, 56 56 }; 57 57 58 - LPSC_CLKDEV2(usb0_clkdev, NULL, "musb-da8xx", 58 + LPSC_CLKDEV3(usb0_clkdev, "fck", "da830-usb-phy-clks", 59 + NULL, "musb-da8xx", 59 60 NULL, "cppi41-dmaengine"); 60 61 LPSC_CLKDEV1(usb1_clkdev, NULL, "ohci-da8xx"); 61 62 /* REVISIT: gpio-davinci.c should be modified to drop con_id */
+4 -3
drivers/clk/davinci/psc-dm355.c
··· 6 6 */ 7 7 8 8 #include <linux/clk-provider.h> 9 + #include <linux/clk/davinci.h> 9 10 #include <linux/clk.h> 10 11 #include <linux/clkdev.h> 11 12 #include <linux/init.h> ··· 42 41 LPSC(5, 0, timer3, pll1_auxclk, NULL, 0), 43 42 LPSC(6, 0, spi1, pll1_sysclk2, spi1_clkdev, 0), 44 43 LPSC(7, 0, mmcsd1, pll1_sysclk2, mmcsd1_clkdev, 0), 45 - LPSC(8, 0, asp1, pll1_sysclk2, NULL, 0), 44 + LPSC(8, 0, asp1, pll1_sysclk2, mcbsp1_clkdev, 0), 46 45 LPSC(9, 0, usb, pll1_sysclk2, usb_clkdev, 0), 47 46 LPSC(10, 0, pwm3, pll1_auxclk, NULL, 0), 48 47 LPSC(11, 0, spi2, pll1_sysclk2, spi2_clkdev, 0), 49 48 LPSC(12, 0, rto, pll1_auxclk, NULL, 0), 50 49 LPSC(14, 0, aemif, pll1_sysclk2, aemif_clkdev, 0), 51 50 LPSC(15, 0, mmcsd0, pll1_sysclk2, mmcsd0_clkdev, 0), 52 - LPSC(17, 0, asp0, pll1_sysclk2, NULL, 0), 51 + LPSC(17, 0, asp0, pll1_sysclk2, mcbsp0_clkdev, 0), 53 52 LPSC(18, 0, i2c, pll1_auxclk, i2c_clkdev, 0), 54 53 LPSC(19, 0, uart0, pll1_auxclk, uart0_clkdev, 0), 55 54 LPSC(20, 0, uart1, pll1_auxclk, uart1_clkdev, 0), ··· 69 68 { } 70 69 }; 71 70 72 - static int dm355_psc_init(struct device *dev, void __iomem *base) 71 + int dm355_psc_init(struct device *dev, void __iomem *base) 73 72 { 74 73 return davinci_psc_register_clocks(dev, dm355_psc_info, 42, base); 75 74 }
+18 -4
drivers/clk/davinci/psc-dm365.c
··· 6 6 */ 7 7 8 8 #include <linux/clk-provider.h> 9 + #include <linux/clk/davinci.h> 9 10 #include <linux/clk.h> 10 11 #include <linux/clkdev.h> 11 12 #include <linux/init.h> ··· 66 65 LPSC(31, 0, arm, pll2_sysclk2, NULL, LPSC_ALWAYS_ENABLED), 67 66 LPSC(38, 0, spi3, pll1_sysclk4, spi3_clkdev, 0), 68 67 LPSC(39, 0, spi4, pll1_auxclk, spi4_clkdev, 0), 69 - LPSC(40, 0, emac, pll2_sysclk4, emac_clkdev, 0), 70 - LPSC(44, 1, voice_codec, pll1_sysclk3, voice_codec_clkdev, 0), 71 - LPSC(46, 1, vpss_dac, pll1_sysclk3, vpss_dac_clkdev, 0), 68 + LPSC(40, 0, emac, pll1_sysclk4, emac_clkdev, 0), 69 + /* 70 + * The TRM (ARM Subsystem User's Guide) shows two clocks input into 71 + * voice codec module (PLL2 SYSCLK4 with a DIV2 and PLL1 SYSCLK4). Its 72 + * not fully clear from documentation which clock should be considered 73 + * as parent for PSC. The clock chosen here is to maintain 74 + * compatibility with existing code in arch/arm/mach-davinci/dm365.c 75 + */ 76 + LPSC(44, 0, voice_codec, pll2_sysclk4, voice_codec_clkdev, 0), 77 + /* 78 + * Its not fully clear from TRM (ARM Subsystem User's Guide) as to what 79 + * the parent of VPSS DAC LPSC should actually be. PLL1 SYSCLK3 feeds 80 + * into HDVICP and MJCP. The clock chosen here is to remain compatible 81 + * with code existing in arch/arm/mach-davinci/dm365.c 82 + */ 83 + LPSC(46, 0, vpss_dac, pll1_sysclk3, vpss_dac_clkdev, 0), 72 84 LPSC(47, 0, vpss_master, pll1_sysclk5, vpss_master_clkdev, 0), 73 85 LPSC(50, 0, mjcp, pll1_sysclk3, NULL, 0), 74 86 { } 75 87 }; 76 88 77 - static int dm365_psc_init(struct device *dev, void __iomem *base) 89 + int dm365_psc_init(struct device *dev, void __iomem *base) 78 90 { 79 91 return davinci_psc_register_clocks(dev, dm365_psc_info, 52, base); 80 92 }
+2 -1
drivers/clk/davinci/psc-dm644x.c
··· 6 6 */ 7 7 8 8 #include <linux/clk-provider.h> 9 + #include <linux/clk/davinci.h> 9 10 #include <linux/clk.h> 10 11 #include <linux/clkdev.h> 11 12 #include <linux/init.h> ··· 64 63 { } 65 64 }; 66 65 67 - static int dm644x_psc_init(struct device *dev, void __iomem *base) 66 + int dm644x_psc_init(struct device *dev, void __iomem *base) 68 67 { 69 68 return davinci_psc_register_clocks(dev, dm644x_psc_info, 41, base); 70 69 }
+2 -1
drivers/clk/davinci/psc-dm646x.c
··· 6 6 */ 7 7 8 8 #include <linux/clk-provider.h> 9 + #include <linux/clk/davinci.h> 9 10 #include <linux/clk.h> 10 11 #include <linux/clkdev.h> 11 12 #include <linux/init.h> ··· 59 58 { } 60 59 }; 61 60 62 - static int dm646x_psc_init(struct device *dev, void __iomem *base) 61 + int dm646x_psc_init(struct device *dev, void __iomem *base) 63 62 { 64 63 return davinci_psc_register_clocks(dev, dm646x_psc_info, 46, base); 65 64 }
+58 -14
drivers/clk/davinci/psc.c
··· 15 15 16 16 #include <linux/clk-provider.h> 17 17 #include <linux/clk.h> 18 + #include <linux/clk/davinci.h> 18 19 #include <linux/clkdev.h> 19 20 #include <linux/err.h> 20 21 #include <linux/of_address.h> ··· 64 63 65 64 /** 66 65 * struct davinci_lpsc_clk - LPSC clock structure 67 - * @dev: the device that provides this LPSC 66 + * @dev: the device that provides this LPSC or NULL 68 67 * @hw: clk_hw for the LPSC 69 68 * @pm_domain: power domain for the LPSC 70 69 * @genpd_clk: clock reference owned by @pm_domain ··· 222 221 223 222 /** 224 223 * davinci_lpsc_clk_register - register LPSC clock 224 + * @dev: the clocks's device or NULL 225 225 * @name: name of this clock 226 226 * @parent_name: name of clock's parent 227 227 * @regmap: PSC MMIO region ··· 240 238 int ret; 241 239 bool is_on; 242 240 243 - lpsc = devm_kzalloc(dev, sizeof(*lpsc), GFP_KERNEL); 241 + lpsc = kzalloc(sizeof(*lpsc), GFP_KERNEL); 244 242 if (!lpsc) 245 243 return ERR_PTR(-ENOMEM); 246 244 ··· 263 261 lpsc->pd = pd; 264 262 lpsc->flags = flags; 265 263 266 - ret = devm_clk_hw_register(dev, &lpsc->hw); 267 - if (ret < 0) 264 + ret = clk_hw_register(dev, &lpsc->hw); 265 + if (ret < 0) { 266 + kfree(lpsc); 268 267 return ERR_PTR(ret); 268 + } 269 + 270 + /* for now, genpd is only registered when using device-tree */ 271 + if (!dev || !dev->of_node) 272 + return lpsc; 269 273 270 274 /* genpd attach needs a way to look up this clock */ 271 275 ret = clk_hw_register_clkdev(&lpsc->hw, name, best_dev_name(dev)); ··· 386 378 struct regmap *regmap; 387 379 int i, ret; 388 380 389 - psc = devm_kzalloc(dev, sizeof(*psc), GFP_KERNEL); 381 + psc = kzalloc(sizeof(*psc), GFP_KERNEL); 390 382 if (!psc) 391 383 return ERR_PTR(-ENOMEM); 392 384 393 - clks = devm_kmalloc_array(dev, num_clks, sizeof(*clks), GFP_KERNEL); 394 - if (!clks) 395 - return ERR_PTR(-ENOMEM); 385 + clks = kmalloc_array(num_clks, sizeof(*clks), GFP_KERNEL); 386 + if (!clks) { 387 + ret = -ENOMEM; 388 + goto err_free_psc; 389 + } 396 390 397 391 psc->clk_data.clks = clks; 398 392 psc->clk_data.clk_num = num_clks; ··· 406 396 for (i = 0; i < num_clks; i++) 407 397 clks[i] = ERR_PTR(-ENOENT); 408 398 409 - pm_domains = devm_kcalloc(dev, num_clks, sizeof(*pm_domains), GFP_KERNEL); 410 - if (!pm_domains) 411 - return ERR_PTR(-ENOMEM); 399 + pm_domains = kcalloc(num_clks, sizeof(*pm_domains), GFP_KERNEL); 400 + if (!pm_domains) { 401 + ret = -ENOMEM; 402 + goto err_free_clks; 403 + } 412 404 413 405 psc->pm_data.domains = pm_domains; 414 406 psc->pm_data.num_domains = num_clks; 415 407 416 - regmap = devm_regmap_init_mmio(dev, base, &davinci_psc_regmap_config); 417 - if (IS_ERR(regmap)) 418 - return ERR_CAST(regmap); 408 + regmap = regmap_init_mmio(dev, base, &davinci_psc_regmap_config); 409 + if (IS_ERR(regmap)) { 410 + ret = PTR_ERR(regmap); 411 + goto err_free_pm_domains; 412 + } 419 413 420 414 for (; info->name; info++) { 421 415 struct davinci_lpsc_clk *lpsc; ··· 437 423 pm_domains[info->md] = &lpsc->pm_domain; 438 424 } 439 425 426 + /* 427 + * for now, a reset controller is only registered when there is a device 428 + * to associate it with. 429 + */ 430 + if (!dev) 431 + return psc; 432 + 440 433 psc->rcdev.ops = &davinci_psc_reset_ops; 441 434 psc->rcdev.owner = THIS_MODULE; 442 435 psc->rcdev.dev = dev; ··· 457 436 dev_warn(dev, "Failed to register reset controller (%d)\n", ret); 458 437 459 438 return psc; 439 + 440 + err_free_pm_domains: 441 + kfree(pm_domains); 442 + err_free_clks: 443 + kfree(clks); 444 + err_free_psc: 445 + kfree(psc); 446 + 447 + return ERR_PTR(ret); 460 448 } 461 449 462 450 int davinci_psc_register_clocks(struct device *dev, ··· 513 483 } 514 484 515 485 static const struct of_device_id davinci_psc_of_match[] = { 486 + #ifdef CONFIG_ARCH_DAVINCI_DA850 516 487 { .compatible = "ti,da850-psc0", .data = &of_da850_psc0_init_data }, 517 488 { .compatible = "ti,da850-psc1", .data = &of_da850_psc1_init_data }, 489 + #endif 518 490 { } 519 491 }; 520 492 521 493 static const struct platform_device_id davinci_psc_id_table[] = { 494 + #ifdef CONFIG_ARCH_DAVINCI_DA830 522 495 { .name = "da830-psc0", .driver_data = (kernel_ulong_t)&da830_psc0_init_data }, 523 496 { .name = "da830-psc1", .driver_data = (kernel_ulong_t)&da830_psc1_init_data }, 497 + #endif 498 + #ifdef CONFIG_ARCH_DAVINCI_DA850 524 499 { .name = "da850-psc0", .driver_data = (kernel_ulong_t)&da850_psc0_init_data }, 525 500 { .name = "da850-psc1", .driver_data = (kernel_ulong_t)&da850_psc1_init_data }, 501 + #endif 502 + #ifdef CONFIG_ARCH_DAVINCI_DM355 526 503 { .name = "dm355-psc", .driver_data = (kernel_ulong_t)&dm355_psc_init_data }, 504 + #endif 505 + #ifdef CONFIG_ARCH_DAVINCI_DM365 527 506 { .name = "dm365-psc", .driver_data = (kernel_ulong_t)&dm365_psc_init_data }, 507 + #endif 508 + #ifdef CONFIG_ARCH_DAVINCI_DM644x 528 509 { .name = "dm644x-psc", .driver_data = (kernel_ulong_t)&dm644x_psc_init_data }, 510 + #endif 511 + #ifdef CONFIG_ARCH_DAVINCI_DM646x 529 512 { .name = "dm646x-psc", .driver_data = (kernel_ulong_t)&dm646x_psc_init_data }, 513 + #endif 530 514 { } 531 515 }; 532 516
+12
drivers/clk/davinci/psc.h
··· 94 94 int (*psc_init)(struct device *dev, void __iomem *base); 95 95 }; 96 96 97 + #ifdef CONFIG_ARCH_DAVINCI_DA830 97 98 extern const struct davinci_psc_init_data da830_psc0_init_data; 98 99 extern const struct davinci_psc_init_data da830_psc1_init_data; 100 + #endif 101 + #ifdef CONFIG_ARCH_DAVINCI_DA850 99 102 extern const struct davinci_psc_init_data da850_psc0_init_data; 100 103 extern const struct davinci_psc_init_data da850_psc1_init_data; 101 104 extern const struct davinci_psc_init_data of_da850_psc0_init_data; 102 105 extern const struct davinci_psc_init_data of_da850_psc1_init_data; 106 + #endif 107 + #ifdef CONFIG_ARCH_DAVINCI_DM355 103 108 extern const struct davinci_psc_init_data dm355_psc_init_data; 109 + #endif 110 + #ifdef CONFIG_ARCH_DAVINCI_DM356 104 111 extern const struct davinci_psc_init_data dm365_psc_init_data; 112 + #endif 113 + #ifdef CONFIG_ARCH_DAVINCI_DM644x 105 114 extern const struct davinci_psc_init_data dm644x_psc_init_data; 115 + #endif 116 + #ifdef CONFIG_ARCH_DAVINCI_DM646x 106 117 extern const struct davinci_psc_init_data dm646x_psc_init_data; 118 + #endif 107 119 108 120 #endif /* __CLK_DAVINCI_PSC_H__ */
+8
drivers/clk/meson/Kconfig
··· 3 3 depends on OF 4 4 depends on ARCH_MESON || COMPILE_TEST 5 5 6 + config COMMON_CLK_MESON_AO 7 + bool 8 + depends on OF 9 + depends on ARCH_MESON || COMPILE_TEST 10 + select COMMON_CLK_REGMAP_MESON 11 + 6 12 config COMMON_CLK_REGMAP_MESON 7 13 bool 8 14 select REGMAP ··· 27 21 bool 28 22 depends on COMMON_CLK_AMLOGIC 29 23 select RESET_CONTROLLER 24 + select COMMON_CLK_MESON_AO 30 25 select COMMON_CLK_REGMAP_MESON 31 26 select MFD_SYSCON 32 27 help ··· 38 31 bool 39 32 depends on COMMON_CLK_AMLOGIC 40 33 select RESET_CONTROLLER 34 + select COMMON_CLK_MESON_AO 41 35 select COMMON_CLK_REGMAP_MESON 42 36 select MFD_SYSCON 43 37 help
+2 -1
drivers/clk/meson/Makefile
··· 3 3 # 4 4 5 5 obj-$(CONFIG_COMMON_CLK_AMLOGIC) += clk-pll.o clk-mpll.o clk-audio-divider.o 6 + obj-$(CONFIG_COMMON_CLK_MESON_AO) += meson-aoclk.o 6 7 obj-$(CONFIG_COMMON_CLK_MESON8B) += meson8b.o 7 8 obj-$(CONFIG_COMMON_CLK_GXBB) += gxbb.o gxbb-aoclk.o gxbb-aoclk-32k.o 8 - obj-$(CONFIG_COMMON_CLK_AXG) += axg.o 9 + obj-$(CONFIG_COMMON_CLK_AXG) += axg.o axg-aoclk.o 9 10 obj-$(CONFIG_COMMON_CLK_REGMAP_MESON) += clk-regmap.o
+164
drivers/clk/meson/axg-aoclk.c
··· 1 + // SPDX-License-Identifier: GPL-2.0+ 2 + /* 3 + * Amlogic Meson-AXG Clock Controller Driver 4 + * 5 + * Copyright (c) 2016 Baylibre SAS. 6 + * Author: Michael Turquette <mturquette@baylibre.com> 7 + * 8 + * Copyright (c) 2018 Amlogic, inc. 9 + * Author: Qiufang Dai <qiufang.dai@amlogic.com> 10 + */ 11 + #include <linux/clk-provider.h> 12 + #include <linux/platform_device.h> 13 + #include <linux/reset-controller.h> 14 + #include <linux/mfd/syscon.h> 15 + #include "clk-regmap.h" 16 + #include "meson-aoclk.h" 17 + #include "axg-aoclk.h" 18 + 19 + #define AXG_AO_GATE(_name, _bit) \ 20 + static struct clk_regmap axg_aoclk_##_name = { \ 21 + .data = &(struct clk_regmap_gate_data) { \ 22 + .offset = (AO_RTI_GEN_CNTL_REG0), \ 23 + .bit_idx = (_bit), \ 24 + }, \ 25 + .hw.init = &(struct clk_init_data) { \ 26 + .name = "axg_ao_" #_name, \ 27 + .ops = &clk_regmap_gate_ops, \ 28 + .parent_names = (const char *[]){ "clk81" }, \ 29 + .num_parents = 1, \ 30 + .flags = CLK_IGNORE_UNUSED, \ 31 + }, \ 32 + } 33 + 34 + AXG_AO_GATE(remote, 0); 35 + AXG_AO_GATE(i2c_master, 1); 36 + AXG_AO_GATE(i2c_slave, 2); 37 + AXG_AO_GATE(uart1, 3); 38 + AXG_AO_GATE(uart2, 5); 39 + AXG_AO_GATE(ir_blaster, 6); 40 + AXG_AO_GATE(saradc, 7); 41 + 42 + static struct clk_regmap axg_aoclk_clk81 = { 43 + .data = &(struct clk_regmap_mux_data) { 44 + .offset = AO_RTI_PWR_CNTL_REG0, 45 + .mask = 0x1, 46 + .shift = 8, 47 + }, 48 + .hw.init = &(struct clk_init_data){ 49 + .name = "axg_ao_clk81", 50 + .ops = &clk_regmap_mux_ro_ops, 51 + .parent_names = (const char *[]){ "clk81", "ao_alt_xtal"}, 52 + .num_parents = 2, 53 + }, 54 + }; 55 + 56 + static struct clk_regmap axg_aoclk_saradc_mux = { 57 + .data = &(struct clk_regmap_mux_data) { 58 + .offset = AO_SAR_CLK, 59 + .mask = 0x3, 60 + .shift = 9, 61 + }, 62 + .hw.init = &(struct clk_init_data){ 63 + .name = "axg_ao_saradc_mux", 64 + .ops = &clk_regmap_mux_ops, 65 + .parent_names = (const char *[]){ "xtal", "axg_ao_clk81" }, 66 + .num_parents = 2, 67 + }, 68 + }; 69 + 70 + static struct clk_regmap axg_aoclk_saradc_div = { 71 + .data = &(struct clk_regmap_div_data) { 72 + .offset = AO_SAR_CLK, 73 + .shift = 0, 74 + .width = 8, 75 + }, 76 + .hw.init = &(struct clk_init_data){ 77 + .name = "axg_ao_saradc_div", 78 + .ops = &clk_regmap_divider_ops, 79 + .parent_names = (const char *[]){ "axg_ao_saradc_mux" }, 80 + .num_parents = 1, 81 + .flags = CLK_SET_RATE_PARENT, 82 + }, 83 + }; 84 + 85 + static struct clk_regmap axg_aoclk_saradc_gate = { 86 + .data = &(struct clk_regmap_gate_data) { 87 + .offset = AO_SAR_CLK, 88 + .bit_idx = 8, 89 + }, 90 + .hw.init = &(struct clk_init_data){ 91 + .name = "axg_ao_saradc_gate", 92 + .ops = &clk_regmap_gate_ops, 93 + .parent_names = (const char *[]){ "axg_ao_saradc_div" }, 94 + .num_parents = 1, 95 + .flags = CLK_SET_RATE_PARENT, 96 + }, 97 + }; 98 + 99 + static const unsigned int axg_aoclk_reset[] = { 100 + [RESET_AO_REMOTE] = 16, 101 + [RESET_AO_I2C_MASTER] = 18, 102 + [RESET_AO_I2C_SLAVE] = 19, 103 + [RESET_AO_UART1] = 17, 104 + [RESET_AO_UART2] = 22, 105 + [RESET_AO_IR_BLASTER] = 23, 106 + }; 107 + 108 + static struct clk_regmap *axg_aoclk_regmap[] = { 109 + [CLKID_AO_REMOTE] = &axg_aoclk_remote, 110 + [CLKID_AO_I2C_MASTER] = &axg_aoclk_i2c_master, 111 + [CLKID_AO_I2C_SLAVE] = &axg_aoclk_i2c_slave, 112 + [CLKID_AO_UART1] = &axg_aoclk_uart1, 113 + [CLKID_AO_UART2] = &axg_aoclk_uart2, 114 + [CLKID_AO_IR_BLASTER] = &axg_aoclk_ir_blaster, 115 + [CLKID_AO_SAR_ADC] = &axg_aoclk_saradc, 116 + [CLKID_AO_CLK81] = &axg_aoclk_clk81, 117 + [CLKID_AO_SAR_ADC_SEL] = &axg_aoclk_saradc_mux, 118 + [CLKID_AO_SAR_ADC_DIV] = &axg_aoclk_saradc_div, 119 + [CLKID_AO_SAR_ADC_CLK] = &axg_aoclk_saradc_gate, 120 + }; 121 + 122 + static const struct clk_hw_onecell_data axg_aoclk_onecell_data = { 123 + .hws = { 124 + [CLKID_AO_REMOTE] = &axg_aoclk_remote.hw, 125 + [CLKID_AO_I2C_MASTER] = &axg_aoclk_i2c_master.hw, 126 + [CLKID_AO_I2C_SLAVE] = &axg_aoclk_i2c_slave.hw, 127 + [CLKID_AO_UART1] = &axg_aoclk_uart1.hw, 128 + [CLKID_AO_UART2] = &axg_aoclk_uart2.hw, 129 + [CLKID_AO_IR_BLASTER] = &axg_aoclk_ir_blaster.hw, 130 + [CLKID_AO_SAR_ADC] = &axg_aoclk_saradc.hw, 131 + [CLKID_AO_CLK81] = &axg_aoclk_clk81.hw, 132 + [CLKID_AO_SAR_ADC_SEL] = &axg_aoclk_saradc_mux.hw, 133 + [CLKID_AO_SAR_ADC_DIV] = &axg_aoclk_saradc_div.hw, 134 + [CLKID_AO_SAR_ADC_CLK] = &axg_aoclk_saradc_gate.hw, 135 + }, 136 + .num = NR_CLKS, 137 + }; 138 + 139 + static const struct meson_aoclk_data axg_aoclkc_data = { 140 + .reset_reg = AO_RTI_GEN_CNTL_REG0, 141 + .num_reset = ARRAY_SIZE(axg_aoclk_reset), 142 + .reset = axg_aoclk_reset, 143 + .num_clks = ARRAY_SIZE(axg_aoclk_regmap), 144 + .clks = axg_aoclk_regmap, 145 + .hw_data = &axg_aoclk_onecell_data, 146 + }; 147 + 148 + static const struct of_device_id axg_aoclkc_match_table[] = { 149 + { 150 + .compatible = "amlogic,meson-axg-aoclkc", 151 + .data = &axg_aoclkc_data, 152 + }, 153 + { } 154 + }; 155 + 156 + static struct platform_driver axg_aoclkc_driver = { 157 + .probe = meson_aoclkc_probe, 158 + .driver = { 159 + .name = "axg-aoclkc", 160 + .of_match_table = axg_aoclkc_match_table, 161 + }, 162 + }; 163 + 164 + builtin_platform_driver(axg_aoclkc_driver);
+29
drivers/clk/meson/axg-aoclk.h
··· 1 + /* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */ 2 + /* 3 + * Copyright (c) 2017 BayLibre, SAS 4 + * Author: Neil Armstrong <narmstrong@baylibre.com> 5 + * 6 + * Copyright (c) 2018 Amlogic, inc. 7 + * Author: Qiufang Dai <qiufang.dai@amlogic.com> 8 + */ 9 + 10 + #ifndef __AXG_AOCLKC_H 11 + #define __AXG_AOCLKC_H 12 + 13 + #define NR_CLKS 11 14 + /* AO Configuration Clock registers offsets 15 + * Register offsets from the data sheet must be multiplied by 4. 16 + */ 17 + #define AO_RTI_PWR_CNTL_REG1 0x0C 18 + #define AO_RTI_PWR_CNTL_REG0 0x10 19 + #define AO_RTI_GEN_CNTL_REG0 0x40 20 + #define AO_OSCIN_CNTL 0x58 21 + #define AO_CRT_CLK_CNTL1 0x68 22 + #define AO_SAR_CLK 0x90 23 + #define AO_RTC_ALT_CLK_CNTL0 0x94 24 + #define AO_RTC_ALT_CLK_CNTL1 0x98 25 + 26 + #include <dt-bindings/clock/axg-aoclkc.h> 27 + #include <dt-bindings/reset/axg-aoclkc.h> 28 + 29 + #endif /* __AXG_AOCLKC_H */
+4
drivers/clk/meson/axg.c
··· 461 461 .width = 1, 462 462 }, 463 463 .lock = &meson_clk_lock, 464 + .flags = CLK_MESON_MPLL_ROUND_CLOSEST, 464 465 }, 465 466 .hw.init = &(struct clk_init_data){ 466 467 .name = "mpll0_div", ··· 508 507 .width = 1, 509 508 }, 510 509 .lock = &meson_clk_lock, 510 + .flags = CLK_MESON_MPLL_ROUND_CLOSEST, 511 511 }, 512 512 .hw.init = &(struct clk_init_data){ 513 513 .name = "mpll1_div", ··· 555 553 .width = 1, 556 554 }, 557 555 .lock = &meson_clk_lock, 556 + .flags = CLK_MESON_MPLL_ROUND_CLOSEST, 558 557 }, 559 558 .hw.init = &(struct clk_init_data){ 560 559 .name = "mpll2_div", ··· 602 599 .width = 1, 603 600 }, 604 601 .lock = &meson_clk_lock, 602 + .flags = CLK_MESON_MPLL_ROUND_CLOSEST, 605 603 }, 606 604 .hw.init = &(struct clk_init_data){ 607 605 .name = "mpll3_div",
+1 -12
drivers/clk/meson/clk-audio-divider.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 1 2 /* 2 3 * Copyright (c) 2017 AmLogic, Inc. 3 4 * Author: Jerome Brunet <jbrunet@baylibre.com> 4 - * 5 - * This program is free software; you can redistribute it and/or modify it 6 - * under the terms and conditions of the GNU General Public License, 7 - * version 2, as published by the Free Software Foundation. 8 - * 9 - * This program is distributed in the hope it will be useful, but WITHOUT 10 - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 12 - * more details. 13 - * 14 - * You should have received a copy of the GNU General Public License along with 15 - * this program. If not, see <http://www.gnu.org/licenses/>. 16 5 */ 17 6 18 7 /*
+20 -56
drivers/clk/meson/clk-mpll.c
··· 1 + // SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause) 1 2 /* 2 - * This file is provided under a dual BSD/GPLv2 license. When using or 3 - * redistributing this file, you may do so under either license. 4 - * 5 - * GPL LICENSE SUMMARY 6 - * 7 3 * Copyright (c) 2016 AmLogic, Inc. 8 4 * Author: Michael Turquette <mturquette@baylibre.com> 9 - * 10 - * This program is free software; you can redistribute it and/or modify 11 - * it under the terms of version 2 of the GNU General Public License as 12 - * published by the Free Software Foundation. 13 - * 14 - * This program is distributed in the hope that it will be useful, but 15 - * WITHOUT ANY WARRANTY; without even the implied warranty of 16 - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 17 - * General Public License for more details. 18 - * 19 - * You should have received a copy of the GNU General Public License 20 - * along with this program; if not, write to the Free Software 21 - * Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. 22 - * The full GNU General Public License is included in this distribution 23 - * in the file called COPYING 24 - * 25 - * BSD LICENSE 26 - * 27 - * Copyright (c) 2016 AmLogic, Inc. 28 - * Author: Michael Turquette <mturquette@baylibre.com> 29 - * 30 - * Redistribution and use in source and binary forms, with or without 31 - * modification, are permitted provided that the following conditions 32 - * are met: 33 - * 34 - * * Redistributions of source code must retain the above copyright 35 - * notice, this list of conditions and the following disclaimer. 36 - * * Redistributions in binary form must reproduce the above copyright 37 - * notice, this list of conditions and the following disclaimer in 38 - * the documentation and/or other materials provided with the 39 - * distribution. 40 - * * Neither the name of Intel Corporation nor the names of its 41 - * contributors may be used to endorse or promote products derived 42 - * from this software without specific prior written permission. 43 - * 44 - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 45 - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 46 - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 47 - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 48 - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 49 - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 50 - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 51 - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 52 - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 53 - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 54 - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 55 5 */ 56 6 57 7 /* ··· 39 89 static void params_from_rate(unsigned long requested_rate, 40 90 unsigned long parent_rate, 41 91 unsigned int *sdm, 42 - unsigned int *n2) 92 + unsigned int *n2, 93 + u8 flags) 43 94 { 44 95 uint64_t div = parent_rate; 45 - unsigned long rem = do_div(div, requested_rate); 96 + uint64_t frac = do_div(div, requested_rate); 97 + 98 + frac *= SDM_DEN; 99 + 100 + if (flags & CLK_MESON_MPLL_ROUND_CLOSEST) 101 + *sdm = DIV_ROUND_CLOSEST_ULL(frac, requested_rate); 102 + else 103 + *sdm = DIV_ROUND_UP_ULL(frac, requested_rate); 104 + 105 + if (*sdm == SDM_DEN) { 106 + *sdm = 0; 107 + div += 1; 108 + } 46 109 47 110 if (div < N2_MIN) { 48 111 *n2 = N2_MIN; ··· 65 102 *sdm = SDM_DEN - 1; 66 103 } else { 67 104 *n2 = div; 68 - *sdm = DIV_ROUND_UP_ULL((u64)rem * SDM_DEN, requested_rate); 69 105 } 70 106 } 71 107 ··· 87 125 unsigned long rate, 88 126 unsigned long *parent_rate) 89 127 { 128 + struct clk_regmap *clk = to_clk_regmap(hw); 129 + struct meson_clk_mpll_data *mpll = meson_clk_mpll_data(clk); 90 130 unsigned int sdm, n2; 91 131 92 - params_from_rate(rate, *parent_rate, &sdm, &n2); 132 + params_from_rate(rate, *parent_rate, &sdm, &n2, mpll->flags); 93 133 return rate_from_params(*parent_rate, sdm, n2); 94 134 } 95 135 ··· 104 140 unsigned int sdm, n2; 105 141 unsigned long flags = 0; 106 142 107 - params_from_rate(rate, parent_rate, &sdm, &n2); 143 + params_from_rate(rate, parent_rate, &sdm, &n2, mpll->flags); 108 144 109 145 if (mpll->lock) 110 146 spin_lock_irqsave(mpll->lock, flags);
+1 -12
drivers/clk/meson/clk-pll.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 1 2 /* 2 3 * Copyright (c) 2015 Endless Mobile, Inc. 3 4 * Author: Carlo Caione <carlo@endlessm.com> 4 5 * 5 6 * Copyright (c) 2018 Baylibre, SAS. 6 7 * Author: Jerome Brunet <jbrunet@baylibre.com> 7 - * 8 - * This program is free software; you can redistribute it and/or modify it 9 - * under the terms and conditions of the GNU General Public License, 10 - * version 2, as published by the Free Software Foundation. 11 - * 12 - * This program is distributed in the hope it will be useful, but WITHOUT 13 - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 14 - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 15 - * more details. 16 - * 17 - * You should have received a copy of the GNU General Public License along with 18 - * this program. If not, see <http://www.gnu.org/licenses/>. 19 8 */ 20 9 21 10 /*
+4 -2
drivers/clk/meson/clk-regmap.c
··· 1 1 // SPDX-License-Identifier: GPL-2.0 2 - // Copyright (c) 2018 BayLibre, SAS. 3 - // Author: Jerome Brunet <jbrunet@baylibre.com> 2 + /* 3 + * Copyright (c) 2018 BayLibre, SAS. 4 + * Author: Jerome Brunet <jbrunet@baylibre.com> 5 + */ 4 6 5 7 #include "clk-regmap.h" 6 8
+5 -3
drivers/clk/meson/clk-regmap.h
··· 1 - // SPDX-License-Identifier: GPL-2.0 2 - // Copyright (c) 2018 BayLibre, SAS. 3 - // Author: Jerome Brunet <jbrunet@baylibre.com> 1 + /* SPDX-License-Identifier: GPL-2.0 */ 2 + /* 3 + * Copyright (c) 2018 BayLibre, SAS. 4 + * Author: Jerome Brunet <jbrunet@baylibre.com> 5 + */ 4 6 5 7 #ifndef __CLK_REGMAP_H 6 8 #define __CLK_REGMAP_H
+4 -12
drivers/clk/meson/clkc.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0 */ 1 2 /* 2 3 * Copyright (c) 2015 Endless Mobile, Inc. 3 4 * Author: Carlo Caione <carlo@endlessm.com> 4 - * 5 - * This program is free software; you can redistribute it and/or modify it 6 - * under the terms and conditions of the GNU General Public License, 7 - * version 2, as published by the Free Software Foundation. 8 - * 9 - * This program is distributed in the hope it will be useful, but WITHOUT 10 - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 12 - * more details. 13 - * 14 - * You should have received a copy of the GNU General Public License along with 15 - * this program. If not, see <http://www.gnu.org/licenses/>. 16 5 */ 17 6 18 7 #ifndef __CLKC_H ··· 86 97 struct parm ssen; 87 98 struct parm misc; 88 99 spinlock_t *lock; 100 + u8 flags; 89 101 }; 102 + 103 + #define CLK_MESON_MPLL_ROUND_CLOSEST BIT(0) 90 104 91 105 struct meson_clk_audio_div_data { 92 106 struct parm div;
+1 -2
drivers/clk/meson/gxbb-aoclk-32k.c
··· 1 + // SPDX-License-Identifier: GPL-2.0+ 1 2 /* 2 3 * Copyright (c) 2017 BayLibre, SAS. 3 4 * Author: Neil Armstrong <narmstrong@baylibre.com> 4 - * 5 - * SPDX-License-Identifier: GPL-2.0+ 6 5 */ 7 6 8 7 #include <linux/clk-provider.h>
+34 -113
drivers/clk/meson/gxbb-aoclk.c
··· 1 + // SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause) 1 2 /* 2 - * This file is provided under a dual BSD/GPLv2 license. When using or 3 - * redistributing this file, you may do so under either license. 4 - * 5 - * GPL LICENSE SUMMARY 6 - * 7 3 * Copyright (c) 2016 BayLibre, SAS. 8 4 * Author: Neil Armstrong <narmstrong@baylibre.com> 9 - * 10 - * This program is free software; you can redistribute it and/or modify 11 - * it under the terms of version 2 of the GNU General Public License as 12 - * published by the Free Software Foundation. 13 - * 14 - * This program is distributed in the hope that it will be useful, but 15 - * WITHOUT ANY WARRANTY; without even the implied warranty of 16 - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 17 - * General Public License for more details. 18 - * 19 - * You should have received a copy of the GNU General Public License 20 - * along with this program; if not, see <http://www.gnu.org/licenses/>. 21 - * The full GNU General Public License is included in this distribution 22 - * in the file called COPYING. 23 - * 24 - * BSD LICENSE 25 - * 26 - * Copyright (c) 2016 BayLibre, SAS. 27 - * Author: Neil Armstrong <narmstrong@baylibre.com> 28 - * 29 - * Redistribution and use in source and binary forms, with or without 30 - * modification, are permitted provided that the following conditions 31 - * are met: 32 - * 33 - * * Redistributions of source code must retain the above copyright 34 - * notice, this list of conditions and the following disclaimer. 35 - * * Redistributions in binary form must reproduce the above copyright 36 - * notice, this list of conditions and the following disclaimer in 37 - * the documentation and/or other materials provided with the 38 - * distribution. 39 - * * Neither the name of Intel Corporation nor the names of its 40 - * contributors may be used to endorse or promote products derived 41 - * from this software without specific prior written permission. 42 - * 43 - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 44 - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 45 - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 46 - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 47 - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 48 - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 49 - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 50 - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 51 - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 52 - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 53 - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 54 5 */ 55 - #include <linux/clk-provider.h> 56 - #include <linux/of_address.h> 57 6 #include <linux/platform_device.h> 58 - #include <linux/reset-controller.h> 59 7 #include <linux/mfd/syscon.h> 60 - #include <linux/regmap.h> 61 - #include <linux/init.h> 62 - #include <linux/delay.h> 63 - #include <dt-bindings/clock/gxbb-aoclkc.h> 64 - #include <dt-bindings/reset/gxbb-aoclkc.h> 65 8 #include "clk-regmap.h" 9 + #include "meson-aoclk.h" 66 10 #include "gxbb-aoclk.h" 67 - 68 - struct gxbb_aoclk_reset_controller { 69 - struct reset_controller_dev reset; 70 - unsigned int *data; 71 - struct regmap *regmap; 72 - }; 73 - 74 - static int gxbb_aoclk_do_reset(struct reset_controller_dev *rcdev, 75 - unsigned long id) 76 - { 77 - struct gxbb_aoclk_reset_controller *reset = 78 - container_of(rcdev, struct gxbb_aoclk_reset_controller, reset); 79 - 80 - return regmap_write(reset->regmap, AO_RTI_GEN_CNTL_REG0, 81 - BIT(reset->data[id])); 82 - } 83 - 84 - static const struct reset_control_ops gxbb_aoclk_reset_ops = { 85 - .reset = gxbb_aoclk_do_reset, 86 - }; 87 11 88 12 #define GXBB_AO_GATE(_name, _bit) \ 89 13 static struct clk_regmap _name##_ao = { \ ··· 20 96 .ops = &clk_regmap_gate_ops, \ 21 97 .parent_names = (const char *[]){ "clk81" }, \ 22 98 .num_parents = 1, \ 23 - .flags = (CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED), \ 99 + .flags = CLK_IGNORE_UNUSED, \ 24 100 }, \ 25 101 } 26 102 ··· 41 117 }, 42 118 }; 43 119 44 - static unsigned int gxbb_aoclk_reset[] = { 120 + static const unsigned int gxbb_aoclk_reset[] = { 45 121 [RESET_AO_REMOTE] = 16, 46 122 [RESET_AO_I2C_MASTER] = 18, 47 123 [RESET_AO_I2C_SLAVE] = 19, ··· 59 135 [CLKID_AO_IR_BLASTER] = &ir_blaster_ao, 60 136 }; 61 137 62 - static struct clk_hw_onecell_data gxbb_aoclk_onecell_data = { 138 + static const struct clk_hw_onecell_data gxbb_aoclk_onecell_data = { 63 139 .hws = { 64 140 [CLKID_AO_REMOTE] = &remote_ao.hw, 65 141 [CLKID_AO_I2C_MASTER] = &i2c_master_ao.hw, ··· 69 145 [CLKID_AO_IR_BLASTER] = &ir_blaster_ao.hw, 70 146 [CLKID_AO_CEC_32K] = &cec_32k_ao.hw, 71 147 }, 72 - .num = 7, 148 + .num = NR_CLKS, 73 149 }; 74 150 75 - static int gxbb_aoclkc_probe(struct platform_device *pdev) 151 + static int gxbb_register_cec_ao_32k(struct platform_device *pdev) 76 152 { 77 - struct gxbb_aoclk_reset_controller *rstc; 78 153 struct device *dev = &pdev->dev; 79 154 struct regmap *regmap; 80 - int ret, clkid; 81 - 82 - rstc = devm_kzalloc(dev, sizeof(*rstc), GFP_KERNEL); 83 - if (!rstc) 84 - return -ENOMEM; 155 + int ret; 85 156 86 157 regmap = syscon_node_to_regmap(of_get_parent(dev->of_node)); 87 158 if (IS_ERR(regmap)) { 88 159 dev_err(dev, "failed to get regmap\n"); 89 - return -ENODEV; 90 - } 91 - 92 - /* Reset Controller */ 93 - rstc->regmap = regmap; 94 - rstc->data = gxbb_aoclk_reset; 95 - rstc->reset.ops = &gxbb_aoclk_reset_ops; 96 - rstc->reset.nr_resets = ARRAY_SIZE(gxbb_aoclk_reset); 97 - rstc->reset.of_node = dev->of_node; 98 - ret = devm_reset_controller_register(dev, &rstc->reset); 99 - 100 - /* 101 - * Populate regmap and register all clks 102 - */ 103 - for (clkid = 0; clkid < ARRAY_SIZE(gxbb_aoclk_gate); clkid++) { 104 - gxbb_aoclk_gate[clkid]->map = regmap; 105 - 106 - ret = devm_clk_hw_register(dev, 107 - gxbb_aoclk_onecell_data.hws[clkid]); 108 - if (ret) 109 - return ret; 160 + return PTR_ERR(regmap); 110 161 } 111 162 112 163 /* Specific clocks */ 113 164 cec_32k_ao.regmap = regmap; 114 165 ret = devm_clk_hw_register(dev, &cec_32k_ao.hw); 166 + if (ret) { 167 + dev_err(&pdev->dev, "clk cec_32k_ao register failed.\n"); 168 + return ret; 169 + } 170 + 171 + return 0; 172 + } 173 + 174 + static const struct meson_aoclk_data gxbb_aoclkc_data = { 175 + .reset_reg = AO_RTI_GEN_CNTL_REG0, 176 + .num_reset = ARRAY_SIZE(gxbb_aoclk_reset), 177 + .reset = gxbb_aoclk_reset, 178 + .num_clks = ARRAY_SIZE(gxbb_aoclk_gate), 179 + .clks = gxbb_aoclk_gate, 180 + .hw_data = &gxbb_aoclk_onecell_data, 181 + }; 182 + 183 + static int gxbb_aoclkc_probe(struct platform_device *pdev) 184 + { 185 + int ret = gxbb_register_cec_ao_32k(pdev); 115 186 if (ret) 116 187 return ret; 117 188 118 - return of_clk_add_hw_provider(dev->of_node, of_clk_hw_onecell_get, 119 - &gxbb_aoclk_onecell_data); 189 + return meson_aoclkc_probe(pdev); 120 190 } 121 191 122 192 static const struct of_device_id gxbb_aoclkc_match_table[] = { 123 - { .compatible = "amlogic,meson-gx-aoclkc" }, 193 + { 194 + .compatible = "amlogic,meson-gx-aoclkc", 195 + .data = &gxbb_aoclkc_data, 196 + }, 124 197 { } 125 198 }; 126 199
+6 -2
drivers/clk/meson/gxbb-aoclk.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0+ */ 1 2 /* 2 3 * Copyright (c) 2017 BayLibre, SAS 3 4 * Author: Neil Armstrong <narmstrong@baylibre.com> 4 - * 5 - * SPDX-License-Identifier: GPL-2.0+ 6 5 */ 7 6 8 7 #ifndef __GXBB_AOCLKC_H 9 8 #define __GXBB_AOCLKC_H 9 + 10 + #define NR_CLKS 7 10 11 11 12 /* AO Configuration Clock registers offsets */ 12 13 #define AO_RTI_PWR_CNTL_REG1 0x0c ··· 28 27 #define to_aoclk_cec_32k(_hw) container_of(_hw, struct aoclk_cec_32k, hw) 29 28 30 29 extern const struct clk_ops meson_aoclk_cec_32k_ops; 30 + 31 + #include <dt-bindings/clock/gxbb-aoclkc.h> 32 + #include <dt-bindings/reset/gxbb-aoclkc.h> 31 33 32 34 #endif /* __GXBB_AOCLKC_H */
+115 -14
drivers/clk/meson/gxbb.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 1 2 /* 2 - * AmLogic S905 / GXBB Clock Controller Driver 3 - * 4 3 * Copyright (c) 2016 AmLogic, Inc. 5 4 * Michael Turquette <mturquette@baylibre.com> 6 - * 7 - * This program is free software; you can redistribute it and/or modify it 8 - * under the terms and conditions of the GNU General Public License, 9 - * version 2, as published by the Free Software Foundation. 10 - * 11 - * This program is distributed in the hope it will be useful, but WITHOUT 12 - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 14 - * more details. 15 - * 16 - * You should have received a copy of the GNU General Public License along with 17 - * this program. If not, see <http://www.gnu.org/licenses/>. 18 5 */ 19 6 20 7 #include <linux/clk.h> ··· 1530 1543 }, 1531 1544 }; 1532 1545 1546 + /* VDEC clocks */ 1547 + 1548 + static const char * const gxbb_vdec_parent_names[] = { 1549 + "fclk_div4", "fclk_div3", "fclk_div5", "fclk_div7" 1550 + }; 1551 + 1552 + static struct clk_regmap gxbb_vdec_1_sel = { 1553 + .data = &(struct clk_regmap_mux_data){ 1554 + .offset = HHI_VDEC_CLK_CNTL, 1555 + .mask = 0x3, 1556 + .shift = 9, 1557 + .flags = CLK_MUX_ROUND_CLOSEST, 1558 + }, 1559 + .hw.init = &(struct clk_init_data){ 1560 + .name = "vdec_1_sel", 1561 + .ops = &clk_regmap_mux_ops, 1562 + .parent_names = gxbb_vdec_parent_names, 1563 + .num_parents = ARRAY_SIZE(gxbb_vdec_parent_names), 1564 + .flags = CLK_SET_RATE_PARENT, 1565 + }, 1566 + }; 1567 + 1568 + static struct clk_regmap gxbb_vdec_1_div = { 1569 + .data = &(struct clk_regmap_div_data){ 1570 + .offset = HHI_VDEC_CLK_CNTL, 1571 + .shift = 0, 1572 + .width = 7, 1573 + }, 1574 + .hw.init = &(struct clk_init_data){ 1575 + .name = "vdec_1_div", 1576 + .ops = &clk_regmap_divider_ops, 1577 + .parent_names = (const char *[]){ "vdec_1_sel" }, 1578 + .num_parents = 1, 1579 + .flags = CLK_SET_RATE_PARENT, 1580 + }, 1581 + }; 1582 + 1583 + static struct clk_regmap gxbb_vdec_1 = { 1584 + .data = &(struct clk_regmap_gate_data){ 1585 + .offset = HHI_VDEC_CLK_CNTL, 1586 + .bit_idx = 8, 1587 + }, 1588 + .hw.init = &(struct clk_init_data) { 1589 + .name = "vdec_1", 1590 + .ops = &clk_regmap_gate_ops, 1591 + .parent_names = (const char *[]){ "vdec_1_div" }, 1592 + .num_parents = 1, 1593 + .flags = CLK_SET_RATE_PARENT, 1594 + }, 1595 + }; 1596 + 1597 + static struct clk_regmap gxbb_vdec_hevc_sel = { 1598 + .data = &(struct clk_regmap_mux_data){ 1599 + .offset = HHI_VDEC2_CLK_CNTL, 1600 + .mask = 0x3, 1601 + .shift = 25, 1602 + .flags = CLK_MUX_ROUND_CLOSEST, 1603 + }, 1604 + .hw.init = &(struct clk_init_data){ 1605 + .name = "vdec_hevc_sel", 1606 + .ops = &clk_regmap_mux_ops, 1607 + .parent_names = gxbb_vdec_parent_names, 1608 + .num_parents = ARRAY_SIZE(gxbb_vdec_parent_names), 1609 + .flags = CLK_SET_RATE_PARENT, 1610 + }, 1611 + }; 1612 + 1613 + static struct clk_regmap gxbb_vdec_hevc_div = { 1614 + .data = &(struct clk_regmap_div_data){ 1615 + .offset = HHI_VDEC2_CLK_CNTL, 1616 + .shift = 16, 1617 + .width = 7, 1618 + }, 1619 + .hw.init = &(struct clk_init_data){ 1620 + .name = "vdec_hevc_div", 1621 + .ops = &clk_regmap_divider_ops, 1622 + .parent_names = (const char *[]){ "vdec_hevc_sel" }, 1623 + .num_parents = 1, 1624 + .flags = CLK_SET_RATE_PARENT, 1625 + }, 1626 + }; 1627 + 1628 + static struct clk_regmap gxbb_vdec_hevc = { 1629 + .data = &(struct clk_regmap_gate_data){ 1630 + .offset = HHI_VDEC2_CLK_CNTL, 1631 + .bit_idx = 24, 1632 + }, 1633 + .hw.init = &(struct clk_init_data) { 1634 + .name = "vdec_hevc", 1635 + .ops = &clk_regmap_gate_ops, 1636 + .parent_names = (const char *[]){ "vdec_hevc_div" }, 1637 + .num_parents = 1, 1638 + .flags = CLK_SET_RATE_PARENT, 1639 + }, 1640 + }; 1641 + 1533 1642 /* Everything Else (EE) domain gates */ 1534 1643 static MESON_GATE(gxbb_ddr, HHI_GCLK_MPEG0, 0); 1535 1644 static MESON_GATE(gxbb_dos, HHI_GCLK_MPEG0, 1); ··· 1869 1786 [CLKID_FCLK_DIV4_DIV] = &gxbb_fclk_div4_div.hw, 1870 1787 [CLKID_FCLK_DIV5_DIV] = &gxbb_fclk_div5_div.hw, 1871 1788 [CLKID_FCLK_DIV7_DIV] = &gxbb_fclk_div7_div.hw, 1789 + [CLKID_VDEC_1_SEL] = &gxbb_vdec_1_sel.hw, 1790 + [CLKID_VDEC_1_DIV] = &gxbb_vdec_1_div.hw, 1791 + [CLKID_VDEC_1] = &gxbb_vdec_1.hw, 1792 + [CLKID_VDEC_HEVC_SEL] = &gxbb_vdec_hevc_sel.hw, 1793 + [CLKID_VDEC_HEVC_DIV] = &gxbb_vdec_hevc_div.hw, 1794 + [CLKID_VDEC_HEVC] = &gxbb_vdec_hevc.hw, 1872 1795 [NR_CLKS] = NULL, 1873 1796 }, 1874 1797 .num = NR_CLKS, ··· 2031 1942 [CLKID_FCLK_DIV4_DIV] = &gxbb_fclk_div4_div.hw, 2032 1943 [CLKID_FCLK_DIV5_DIV] = &gxbb_fclk_div5_div.hw, 2033 1944 [CLKID_FCLK_DIV7_DIV] = &gxbb_fclk_div7_div.hw, 1945 + [CLKID_VDEC_1_SEL] = &gxbb_vdec_1_sel.hw, 1946 + [CLKID_VDEC_1_DIV] = &gxbb_vdec_1_div.hw, 1947 + [CLKID_VDEC_1] = &gxbb_vdec_1.hw, 1948 + [CLKID_VDEC_HEVC_SEL] = &gxbb_vdec_hevc_sel.hw, 1949 + [CLKID_VDEC_HEVC_DIV] = &gxbb_vdec_hevc_div.hw, 1950 + [CLKID_VDEC_HEVC] = &gxbb_vdec_hevc.hw, 2034 1951 [NR_CLKS] = NULL, 2035 1952 }, 2036 1953 .num = NR_CLKS, ··· 2195 2100 &gxbb_fclk_div4, 2196 2101 &gxbb_fclk_div5, 2197 2102 &gxbb_fclk_div7, 2103 + &gxbb_vdec_1_sel, 2104 + &gxbb_vdec_1_div, 2105 + &gxbb_vdec_1, 2106 + &gxbb_vdec_hevc_sel, 2107 + &gxbb_vdec_hevc_div, 2108 + &gxbb_vdec_hevc, 2198 2109 }; 2199 2110 2200 2111 struct clkc_data {
+6 -52
drivers/clk/meson/gxbb.h
··· 1 + /* SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause) */ 1 2 /* 2 - * This file is provided under a dual BSD/GPLv2 license. When using or 3 - * redistributing this file, you may do so under either license. 4 - * 5 - * GPL LICENSE SUMMARY 6 - * 7 3 * Copyright (c) 2016 AmLogic, Inc. 8 4 * Author: Michael Turquette <mturquette@baylibre.com> 9 - * 10 - * This program is free software; you can redistribute it and/or modify 11 - * it under the terms of version 2 of the GNU General Public License as 12 - * published by the Free Software Foundation. 13 - * 14 - * This program is distributed in the hope that it will be useful, but 15 - * WITHOUT ANY WARRANTY; without even the implied warranty of 16 - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 17 - * General Public License for more details. 18 - * 19 - * You should have received a copy of the GNU General Public License 20 - * along with this program; if not, write to the Free Software 21 - * Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. 22 - * The full GNU General Public License is included in this distribution 23 - * in the file called COPYING 24 - * 25 - * BSD LICENSE 26 - * 27 - * Copyright (c) 2016 BayLibre, Inc. 28 - * Author: Michael Turquette <mturquette@baylibre.com> 29 - * 30 - * Redistribution and use in source and binary forms, with or without 31 - * modification, are permitted provided that the following conditions 32 - * are met: 33 - * 34 - * * Redistributions of source code must retain the above copyright 35 - * notice, this list of conditions and the following disclaimer. 36 - * * Redistributions in binary form must reproduce the above copyright 37 - * notice, this list of conditions and the following disclaimer in 38 - * the documentation and/or other materials provided with the 39 - * distribution. 40 - * * Neither the name of Intel Corporation nor the names of its 41 - * contributors may be used to endorse or promote products derived 42 - * from this software without specific prior written permission. 43 - * 44 - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 45 - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 46 - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 47 - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 48 - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 49 - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 50 - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 51 - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 52 - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 53 - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 54 - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 55 5 */ 56 6 57 7 #ifndef __GXBB_H ··· 154 204 #define CLKID_FCLK_DIV4_DIV 148 155 205 #define CLKID_FCLK_DIV5_DIV 149 156 206 #define CLKID_FCLK_DIV7_DIV 150 207 + #define CLKID_VDEC_1_SEL 151 208 + #define CLKID_VDEC_1_DIV 152 209 + #define CLKID_VDEC_HEVC_SEL 154 210 + #define CLKID_VDEC_HEVC_DIV 155 157 211 158 - #define NR_CLKS 151 212 + #define NR_CLKS 157 159 213 160 214 /* include the CLKIDs that have been made part of the DT binding */ 161 215 #include <dt-bindings/clock/gxbb-clkc.h>
+81
drivers/clk/meson/meson-aoclk.c
··· 1 + // SPDX-License-Identifier: GPL-2.0+ 2 + /* 3 + * Amlogic Meson-AXG Clock Controller Driver 4 + * 5 + * Copyright (c) 2016 BayLibre, SAS. 6 + * Author: Neil Armstrong <narmstrong@baylibre.com> 7 + * 8 + * Copyright (c) 2018 Amlogic, inc. 9 + * Author: Qiufang Dai <qiufang.dai@amlogic.com> 10 + * Author: Yixun Lan <yixun.lan@amlogic.com> 11 + */ 12 + 13 + #include <linux/platform_device.h> 14 + #include <linux/reset-controller.h> 15 + #include <linux/mfd/syscon.h> 16 + #include <linux/of_device.h> 17 + #include "clk-regmap.h" 18 + #include "meson-aoclk.h" 19 + 20 + static int meson_aoclk_do_reset(struct reset_controller_dev *rcdev, 21 + unsigned long id) 22 + { 23 + struct meson_aoclk_reset_controller *rstc = 24 + container_of(rcdev, struct meson_aoclk_reset_controller, reset); 25 + 26 + return regmap_write(rstc->regmap, rstc->data->reset_reg, 27 + BIT(rstc->data->reset[id])); 28 + } 29 + 30 + static const struct reset_control_ops meson_aoclk_reset_ops = { 31 + .reset = meson_aoclk_do_reset, 32 + }; 33 + 34 + int meson_aoclkc_probe(struct platform_device *pdev) 35 + { 36 + struct meson_aoclk_reset_controller *rstc; 37 + struct meson_aoclk_data *data; 38 + struct device *dev = &pdev->dev; 39 + struct regmap *regmap; 40 + int ret, clkid; 41 + 42 + data = (struct meson_aoclk_data *) of_device_get_match_data(dev); 43 + if (!data) 44 + return -ENODEV; 45 + 46 + rstc = devm_kzalloc(dev, sizeof(*rstc), GFP_KERNEL); 47 + if (!rstc) 48 + return -ENOMEM; 49 + 50 + regmap = syscon_node_to_regmap(of_get_parent(dev->of_node)); 51 + if (IS_ERR(regmap)) { 52 + dev_err(dev, "failed to get regmap\n"); 53 + return PTR_ERR(regmap); 54 + } 55 + 56 + /* Reset Controller */ 57 + rstc->data = data; 58 + rstc->regmap = regmap; 59 + rstc->reset.ops = &meson_aoclk_reset_ops; 60 + rstc->reset.nr_resets = data->num_reset, 61 + rstc->reset.of_node = dev->of_node; 62 + ret = devm_reset_controller_register(dev, &rstc->reset); 63 + if (ret) { 64 + dev_err(dev, "failed to register reset controller\n"); 65 + return ret; 66 + } 67 + 68 + /* 69 + * Populate regmap and register all clks 70 + */ 71 + for (clkid = 0; clkid < data->num_clks; clkid++) { 72 + data->clks[clkid]->map = regmap; 73 + 74 + ret = devm_clk_hw_register(dev, data->hw_data->hws[clkid]); 75 + if (ret) 76 + return ret; 77 + } 78 + 79 + return devm_of_clk_add_hw_provider(dev, of_clk_hw_onecell_get, 80 + (void *) data->hw_data); 81 + }
+34
drivers/clk/meson/meson-aoclk.h
··· 1 + /* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */ 2 + /* 3 + * Copyright (c) 2017 BayLibre, SAS 4 + * Author: Neil Armstrong <narmstrong@baylibre.com> 5 + * 6 + * Copyright (c) 2018 Amlogic, inc. 7 + * Author: Qiufang Dai <qiufang.dai@amlogic.com> 8 + * Author: Yixun Lan <yixun.lan@amlogic.com> 9 + */ 10 + 11 + #ifndef __MESON_AOCLK_H__ 12 + #define __MESON_AOCLK_H__ 13 + 14 + #include <linux/platform_device.h> 15 + #include <linux/reset-controller.h> 16 + #include "clk-regmap.h" 17 + 18 + struct meson_aoclk_data { 19 + const unsigned int reset_reg; 20 + const int num_reset; 21 + const unsigned int *reset; 22 + int num_clks; 23 + struct clk_regmap **clks; 24 + const struct clk_hw_onecell_data *hw_data; 25 + }; 26 + 27 + struct meson_aoclk_reset_controller { 28 + struct reset_controller_dev reset; 29 + const struct meson_aoclk_data *data; 30 + struct regmap *regmap; 31 + }; 32 + 33 + int meson_aoclkc_probe(struct platform_device *pdev); 34 + #endif
+62 -15
drivers/clk/meson/meson8b.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 1 2 /* 2 - * AmLogic S802 (Meson8) / S805 (Meson8b) / S812 (Meson8m2) Clock Controller 3 - * Driver 4 - * 5 3 * Copyright (c) 2015 Endless Mobile, Inc. 6 4 * Author: Carlo Caione <carlo@endlessm.com> 7 5 * 8 6 * Copyright (c) 2016 BayLibre, Inc. 9 7 * Michael Turquette <mturquette@baylibre.com> 10 - * 11 - * This program is free software; you can redistribute it and/or modify it 12 - * under the terms and conditions of the GNU General Public License, 13 - * version 2, as published by the Free Software Foundation. 14 - * 15 - * This program is distributed in the hope it will be useful, but WITHOUT 16 - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 17 - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 18 - * more details. 19 - * 20 - * You should have received a copy of the GNU General Public License along with 21 - * this program. If not, see <http://www.gnu.org/licenses/>. 22 8 */ 23 9 24 10 #include <linux/clk.h> ··· 232 246 .ops = &clk_regmap_gate_ops, 233 247 .parent_names = (const char *[]){ "fclk_div2_div" }, 234 248 .num_parents = 1, 249 + /* 250 + * FIXME: Ethernet with a RGMII PHYs is not working if 251 + * fclk_div2 is disabled. it is currently unclear why this 252 + * is. keep it enabled until the Ethernet driver knows how 253 + * to manage this clock. 254 + */ 255 + .flags = CLK_IS_CRITICAL, 235 256 }, 236 257 }; 237 258 ··· 632 639 }, 633 640 }; 634 641 642 + static struct clk_regmap meson8b_nand_clk_sel = { 643 + .data = &(struct clk_regmap_mux_data){ 644 + .offset = HHI_NAND_CLK_CNTL, 645 + .mask = 0x7, 646 + .shift = 9, 647 + .flags = CLK_MUX_ROUND_CLOSEST, 648 + }, 649 + .hw.init = &(struct clk_init_data){ 650 + .name = "nand_clk_sel", 651 + .ops = &clk_regmap_mux_ops, 652 + /* FIXME all other parents are unknown: */ 653 + .parent_names = (const char *[]){ "fclk_div4", "fclk_div3", 654 + "fclk_div5", "fclk_div7", "xtal" }, 655 + .num_parents = 5, 656 + .flags = CLK_SET_RATE_PARENT, 657 + }, 658 + }; 659 + 660 + static struct clk_regmap meson8b_nand_clk_div = { 661 + .data = &(struct clk_regmap_div_data){ 662 + .offset = HHI_NAND_CLK_CNTL, 663 + .shift = 0, 664 + .width = 7, 665 + .flags = CLK_DIVIDER_ROUND_CLOSEST, 666 + }, 667 + .hw.init = &(struct clk_init_data){ 668 + .name = "nand_clk_div", 669 + .ops = &clk_regmap_divider_ops, 670 + .parent_names = (const char *[]){ "nand_clk_sel" }, 671 + .num_parents = 1, 672 + .flags = CLK_SET_RATE_PARENT, 673 + }, 674 + }; 675 + 676 + static struct clk_regmap meson8b_nand_clk_gate = { 677 + .data = &(struct clk_regmap_gate_data){ 678 + .offset = HHI_NAND_CLK_CNTL, 679 + .bit_idx = 8, 680 + }, 681 + .hw.init = &(struct clk_init_data){ 682 + .name = "nand_clk_gate", 683 + .ops = &clk_regmap_gate_ops, 684 + .parent_names = (const char *[]){ "nand_clk_div" }, 685 + .num_parents = 1, 686 + .flags = CLK_SET_RATE_PARENT, 687 + }, 688 + }; 689 + 635 690 /* Everything Else (EE) domain gates */ 636 691 637 692 static MESON_GATE(meson8b_ddr, HHI_GCLK_MPEG0, 0); ··· 875 834 [CLKID_FCLK_DIV4_DIV] = &meson8b_fclk_div4_div.hw, 876 835 [CLKID_FCLK_DIV5_DIV] = &meson8b_fclk_div5_div.hw, 877 836 [CLKID_FCLK_DIV7_DIV] = &meson8b_fclk_div7_div.hw, 837 + [CLKID_NAND_SEL] = &meson8b_nand_clk_sel.hw, 838 + [CLKID_NAND_DIV] = &meson8b_nand_clk_div.hw, 839 + [CLKID_NAND_CLK] = &meson8b_nand_clk_gate.hw, 878 840 [CLK_NR_CLKS] = NULL, 879 841 }, 880 842 .num = CLK_NR_CLKS, ··· 983 939 &meson8b_fclk_div4, 984 940 &meson8b_fclk_div5, 985 941 &meson8b_fclk_div7, 942 + &meson8b_nand_clk_sel, 943 + &meson8b_nand_clk_div, 944 + &meson8b_nand_clk_gate, 986 945 }; 987 946 988 947 static const struct meson8b_clk_reset_line {
+5 -13
drivers/clk/meson/meson8b.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0 */ 1 2 /* 2 3 * Copyright (c) 2015 Endless Mobile, Inc. 3 4 * Author: Carlo Caione <carlo@endlessm.com> 4 5 * 5 6 * Copyright (c) 2016 BayLibre, Inc. 6 7 * Michael Turquette <mturquette@baylibre.com> 7 - * 8 - * This program is free software; you can redistribute it and/or modify it 9 - * under the terms and conditions of the GNU General Public License, 10 - * version 2, as published by the Free Software Foundation. 11 - * 12 - * This program is distributed in the hope it will be useful, but WITHOUT 13 - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 14 - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 15 - * more details. 16 - * 17 - * You should have received a copy of the GNU General Public License along with 18 - * this program. If not, see <http://www.gnu.org/licenses/>. 19 8 */ 20 9 21 10 #ifndef __MESON8B_H ··· 29 40 #define HHI_VID_CLK_CNTL 0x17c /* 0x5f offset in data sheet */ 30 41 #define HHI_VID_DIVIDER_CNTL 0x198 /* 0x66 offset in data sheet */ 31 42 #define HHI_SYS_CPU_CLK_CNTL0 0x19c /* 0x67 offset in data sheet */ 43 + #define HHI_NAND_CLK_CNTL 0x25c /* 0x97 offset in data sheet */ 32 44 #define HHI_MPLL_CNTL 0x280 /* 0xa0 offset in data sheet */ 33 45 #define HHI_SYS_PLL_CNTL 0x300 /* 0xc0 offset in data sheet */ 34 46 #define HHI_VID_PLL_CNTL 0x320 /* 0xc8 offset in data sheet */ ··· 73 83 #define CLKID_FCLK_DIV4_DIV 107 74 84 #define CLKID_FCLK_DIV5_DIV 108 75 85 #define CLKID_FCLK_DIV7_DIV 109 86 + #define CLKID_NAND_SEL 110 87 + #define CLKID_NAND_DIV 111 76 88 77 - #define CLK_NR_CLKS 110 89 + #define CLK_NR_CLKS 113 78 90 79 91 /* 80 92 * include the CLKID and RESETID that have
+10
drivers/clk/renesas/Kconfig
··· 7 7 select CLK_R8A7740 if ARCH_R8A7740 8 8 select CLK_R8A7743 if ARCH_R8A7743 9 9 select CLK_R8A7745 if ARCH_R8A7745 10 + select CLK_R8A77470 if ARCH_R8A77470 10 11 select CLK_R8A7778 if ARCH_R8A7778 11 12 select CLK_R8A7779 if ARCH_R8A7779 12 13 select CLK_R8A7790 if ARCH_R8A7790 ··· 19 18 select CLK_R8A77965 if ARCH_R8A77965 20 19 select CLK_R8A77970 if ARCH_R8A77970 21 20 select CLK_R8A77980 if ARCH_R8A77980 21 + select CLK_R8A77990 if ARCH_R8A77990 22 22 select CLK_R8A77995 if ARCH_R8A77995 23 23 select CLK_SH73A0 if ARCH_SH73A0 24 24 ··· 60 58 61 59 config CLK_R8A7745 62 60 bool "RZ/G1E clock support" if COMPILE_TEST 61 + select CLK_RCAR_GEN2_CPG 62 + 63 + config CLK_R8A77470 64 + bool "RZ/G1C clock support" if COMPILE_TEST 63 65 select CLK_RCAR_GEN2_CPG 64 66 65 67 config CLK_R8A7778 ··· 115 109 116 110 config CLK_R8A77980 117 111 bool "R-Car V3H clock support" if COMPILE_TEST 112 + select CLK_RCAR_GEN3_CPG 113 + 114 + config CLK_R8A77990 115 + bool "R-Car E3 clock support" if COMPILE_TEST 118 116 select CLK_RCAR_GEN3_CPG 119 117 120 118 config CLK_R8A77995
+2
drivers/clk/renesas/Makefile
··· 6 6 obj-$(CONFIG_CLK_R8A7740) += clk-r8a7740.o 7 7 obj-$(CONFIG_CLK_R8A7743) += r8a7743-cpg-mssr.o 8 8 obj-$(CONFIG_CLK_R8A7745) += r8a7745-cpg-mssr.o 9 + obj-$(CONFIG_CLK_R8A77470) += r8a77470-cpg-mssr.o 9 10 obj-$(CONFIG_CLK_R8A7778) += clk-r8a7778.o 10 11 obj-$(CONFIG_CLK_R8A7779) += clk-r8a7779.o 11 12 obj-$(CONFIG_CLK_R8A7790) += r8a7790-cpg-mssr.o ··· 18 17 obj-$(CONFIG_CLK_R8A77965) += r8a77965-cpg-mssr.o 19 18 obj-$(CONFIG_CLK_R8A77970) += r8a77970-cpg-mssr.o 20 19 obj-$(CONFIG_CLK_R8A77980) += r8a77980-cpg-mssr.o 20 + obj-$(CONFIG_CLK_R8A77990) += r8a77990-cpg-mssr.o 21 21 obj-$(CONFIG_CLK_R8A77995) += r8a77995-cpg-mssr.o 22 22 obj-$(CONFIG_CLK_SH73A0) += clk-sh73a0.o 23 23
+1 -1
drivers/clk/renesas/r8a7743-cpg-mssr.c
··· 52 52 53 53 /* Core Clock Outputs */ 54 54 DEF_BASE("z", R8A7743_CLK_Z, CLK_TYPE_GEN2_Z, CLK_PLL0), 55 - DEF_BASE("lb", R8A7743_CLK_LB, CLK_TYPE_GEN2_LB, CLK_PLL1), 56 55 DEF_BASE("sdh", R8A7743_CLK_SDH, CLK_TYPE_GEN2_SDH, CLK_PLL1), 57 56 DEF_BASE("sd0", R8A7743_CLK_SD0, CLK_TYPE_GEN2_SD0, CLK_PLL1), 58 57 DEF_BASE("qspi", R8A7743_CLK_QSPI, CLK_TYPE_GEN2_QSPI, CLK_PLL1_DIV2), ··· 62 63 DEF_FIXED("zs", R8A7743_CLK_ZS, CLK_PLL1, 6, 1), 63 64 DEF_FIXED("hp", R8A7743_CLK_HP, CLK_PLL1, 12, 1), 64 65 DEF_FIXED("b", R8A7743_CLK_B, CLK_PLL1, 12, 1), 66 + DEF_FIXED("lb", R8A7743_CLK_LB, CLK_PLL1, 24, 1), 65 67 DEF_FIXED("p", R8A7743_CLK_P, CLK_PLL1, 24, 1), 66 68 DEF_FIXED("cl", R8A7743_CLK_CL, CLK_PLL1, 48, 1), 67 69 DEF_FIXED("m2", R8A7743_CLK_M2, CLK_PLL1, 8, 1),
+1 -1
drivers/clk/renesas/r8a7745-cpg-mssr.c
··· 51 51 DEF_FIXED(".pll1_div2", CLK_PLL1_DIV2, CLK_PLL1, 2, 1), 52 52 53 53 /* Core Clock Outputs */ 54 - DEF_BASE("lb", R8A7745_CLK_LB, CLK_TYPE_GEN2_LB, CLK_PLL1), 55 54 DEF_BASE("sdh", R8A7745_CLK_SDH, CLK_TYPE_GEN2_SDH, CLK_PLL1), 56 55 DEF_BASE("sd0", R8A7745_CLK_SD0, CLK_TYPE_GEN2_SD0, CLK_PLL1), 57 56 DEF_BASE("qspi", R8A7745_CLK_QSPI, CLK_TYPE_GEN2_QSPI, CLK_PLL1_DIV2), ··· 62 63 DEF_FIXED("zs", R8A7745_CLK_ZS, CLK_PLL1, 6, 1), 63 64 DEF_FIXED("hp", R8A7745_CLK_HP, CLK_PLL1, 12, 1), 64 65 DEF_FIXED("b", R8A7745_CLK_B, CLK_PLL1, 12, 1), 66 + DEF_FIXED("lb", R8A7745_CLK_LB, CLK_PLL1, 24, 1), 65 67 DEF_FIXED("p", R8A7745_CLK_P, CLK_PLL1, 24, 1), 66 68 DEF_FIXED("cl", R8A7745_CLK_CL, CLK_PLL1, 48, 1), 67 69 DEF_FIXED("cp", R8A7745_CLK_CP, CLK_PLL1, 48, 1),
+229
drivers/clk/renesas/r8a77470-cpg-mssr.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + /* 3 + * r8a77470 Clock Pulse Generator / Module Standby and Software Reset 4 + * 5 + * Copyright (C) 2018 Renesas Electronics Corp. 6 + */ 7 + 8 + #include <linux/device.h> 9 + #include <linux/init.h> 10 + #include <linux/kernel.h> 11 + #include <linux/soc/renesas/rcar-rst.h> 12 + 13 + #include <dt-bindings/clock/r8a77470-cpg-mssr.h> 14 + 15 + #include "renesas-cpg-mssr.h" 16 + #include "rcar-gen2-cpg.h" 17 + 18 + enum clk_ids { 19 + /* Core Clock Outputs exported to DT */ 20 + LAST_DT_CORE_CLK = R8A77470_CLK_OSC, 21 + 22 + /* External Input Clocks */ 23 + CLK_EXTAL, 24 + CLK_USB_EXTAL, 25 + 26 + /* Internal Core Clocks */ 27 + CLK_MAIN, 28 + CLK_PLL0, 29 + CLK_PLL1, 30 + CLK_PLL3, 31 + CLK_PLL1_DIV2, 32 + 33 + /* Module Clocks */ 34 + MOD_CLK_BASE 35 + }; 36 + 37 + static const struct cpg_core_clk r8a77470_core_clks[] __initconst = { 38 + /* External Clock Inputs */ 39 + DEF_INPUT("extal", CLK_EXTAL), 40 + DEF_INPUT("usb_extal", CLK_USB_EXTAL), 41 + 42 + /* Internal Core Clocks */ 43 + DEF_BASE(".main", CLK_MAIN, CLK_TYPE_GEN2_MAIN, CLK_EXTAL), 44 + DEF_BASE(".pll0", CLK_PLL0, CLK_TYPE_GEN2_PLL0, CLK_MAIN), 45 + DEF_BASE(".pll1", CLK_PLL1, CLK_TYPE_GEN2_PLL1, CLK_MAIN), 46 + DEF_BASE(".pll3", CLK_PLL3, CLK_TYPE_GEN2_PLL3, CLK_MAIN), 47 + 48 + DEF_FIXED(".pll1_div2", CLK_PLL1_DIV2, CLK_PLL1, 2, 1), 49 + 50 + /* Core Clock Outputs */ 51 + DEF_BASE("sdh", R8A77470_CLK_SDH, CLK_TYPE_GEN2_SDH, CLK_PLL1), 52 + DEF_BASE("sd0", R8A77470_CLK_SD0, CLK_TYPE_GEN2_SD0, CLK_PLL1), 53 + DEF_BASE("sd1", R8A77470_CLK_SD1, CLK_TYPE_GEN2_SD1, CLK_PLL1), 54 + DEF_BASE("qspi", R8A77470_CLK_QSPI, CLK_TYPE_GEN2_QSPI, CLK_PLL1_DIV2), 55 + DEF_BASE("rcan", R8A77470_CLK_RCAN, CLK_TYPE_GEN2_RCAN, CLK_USB_EXTAL), 56 + 57 + DEF_FIXED("z2", R8A77470_CLK_Z2, CLK_PLL0, 1, 1), 58 + DEF_FIXED("zx", R8A77470_CLK_ZX, CLK_PLL1, 3, 1), 59 + DEF_FIXED("zs", R8A77470_CLK_ZS, CLK_PLL1, 6, 1), 60 + DEF_FIXED("hp", R8A77470_CLK_HP, CLK_PLL1, 12, 1), 61 + DEF_FIXED("b", R8A77470_CLK_B, CLK_PLL1, 12, 1), 62 + DEF_FIXED("lb", R8A77470_CLK_LB, CLK_PLL1, 24, 1), 63 + DEF_FIXED("p", R8A77470_CLK_P, CLK_PLL1, 24, 1), 64 + DEF_FIXED("cl", R8A77470_CLK_CL, CLK_PLL1, 48, 1), 65 + DEF_FIXED("cp", R8A77470_CLK_CP, CLK_PLL1, 48, 1), 66 + DEF_FIXED("m2", R8A77470_CLK_M2, CLK_PLL1, 8, 1), 67 + DEF_FIXED("zb3", R8A77470_CLK_ZB3, CLK_PLL3, 4, 1), 68 + DEF_FIXED("mp", R8A77470_CLK_MP, CLK_PLL1_DIV2, 15, 1), 69 + DEF_FIXED("cpex", R8A77470_CLK_CPEX, CLK_EXTAL, 2, 1), 70 + DEF_FIXED("r", R8A77470_CLK_R, CLK_PLL1, 49152, 1), 71 + DEF_FIXED("osc", R8A77470_CLK_OSC, CLK_PLL1, 12288, 1), 72 + 73 + DEF_DIV6P1("sd2", R8A77470_CLK_SD2, CLK_PLL1_DIV2, 0x078), 74 + }; 75 + 76 + static const struct mssr_mod_clk r8a77470_mod_clks[] __initconst = { 77 + DEF_MOD("msiof0", 0, R8A77470_CLK_MP), 78 + DEF_MOD("vcp0", 101, R8A77470_CLK_ZS), 79 + DEF_MOD("vpc0", 103, R8A77470_CLK_ZS), 80 + DEF_MOD("tmu1", 111, R8A77470_CLK_P), 81 + DEF_MOD("3dg", 112, R8A77470_CLK_ZS), 82 + DEF_MOD("2d-dmac", 115, R8A77470_CLK_ZS), 83 + DEF_MOD("fdp1-0", 119, R8A77470_CLK_ZS), 84 + DEF_MOD("tmu3", 121, R8A77470_CLK_P), 85 + DEF_MOD("tmu2", 122, R8A77470_CLK_P), 86 + DEF_MOD("cmt0", 124, R8A77470_CLK_R), 87 + DEF_MOD("vsp1du0", 128, R8A77470_CLK_ZS), 88 + DEF_MOD("vsp1-sy", 131, R8A77470_CLK_ZS), 89 + DEF_MOD("msiof2", 205, R8A77470_CLK_MP), 90 + DEF_MOD("msiof1", 208, R8A77470_CLK_MP), 91 + DEF_MOD("sys-dmac1", 218, R8A77470_CLK_ZS), 92 + DEF_MOD("sys-dmac0", 219, R8A77470_CLK_ZS), 93 + DEF_MOD("sdhi2", 312, R8A77470_CLK_SD2), 94 + DEF_MOD("sdhi1", 313, R8A77470_CLK_SD1), 95 + DEF_MOD("sdhi0", 314, R8A77470_CLK_SD0), 96 + DEF_MOD("usbhs-dmac0-ch1", 326, R8A77470_CLK_HP), 97 + DEF_MOD("usbhs-dmac1-ch1", 327, R8A77470_CLK_HP), 98 + DEF_MOD("cmt1", 329, R8A77470_CLK_R), 99 + DEF_MOD("usbhs-dmac0-ch0", 330, R8A77470_CLK_HP), 100 + DEF_MOD("usbhs-dmac1-ch0", 331, R8A77470_CLK_HP), 101 + DEF_MOD("rwdt", 402, R8A77470_CLK_R), 102 + DEF_MOD("irqc", 407, R8A77470_CLK_CP), 103 + DEF_MOD("intc-sys", 408, R8A77470_CLK_ZS), 104 + DEF_MOD("audio-dmac0", 502, R8A77470_CLK_HP), 105 + DEF_MOD("pwm", 523, R8A77470_CLK_P), 106 + DEF_MOD("usb-ehci-0", 703, R8A77470_CLK_MP), 107 + DEF_MOD("usbhs-0", 704, R8A77470_CLK_HP), 108 + DEF_MOD("usb-ehci-1", 705, R8A77470_CLK_MP), 109 + DEF_MOD("usbhs-1", 706, R8A77470_CLK_HP), 110 + DEF_MOD("hscif2", 713, R8A77470_CLK_ZS), 111 + DEF_MOD("scif5", 714, R8A77470_CLK_P), 112 + DEF_MOD("scif4", 715, R8A77470_CLK_P), 113 + DEF_MOD("hscif1", 716, R8A77470_CLK_ZS), 114 + DEF_MOD("hscif0", 717, R8A77470_CLK_ZS), 115 + DEF_MOD("scif3", 718, R8A77470_CLK_P), 116 + DEF_MOD("scif2", 719, R8A77470_CLK_P), 117 + DEF_MOD("scif1", 720, R8A77470_CLK_P), 118 + DEF_MOD("scif0", 721, R8A77470_CLK_P), 119 + DEF_MOD("du1", 723, R8A77470_CLK_ZX), 120 + DEF_MOD("du0", 724, R8A77470_CLK_ZX), 121 + DEF_MOD("ipmmu-sgx", 800, R8A77470_CLK_ZX), 122 + DEF_MOD("etheravb", 812, R8A77470_CLK_HP), 123 + DEF_MOD("ether", 813, R8A77470_CLK_P), 124 + DEF_MOD("gpio5", 907, R8A77470_CLK_CP), 125 + DEF_MOD("gpio4", 908, R8A77470_CLK_CP), 126 + DEF_MOD("gpio3", 909, R8A77470_CLK_CP), 127 + DEF_MOD("gpio2", 910, R8A77470_CLK_CP), 128 + DEF_MOD("gpio1", 911, R8A77470_CLK_CP), 129 + DEF_MOD("gpio0", 912, R8A77470_CLK_CP), 130 + DEF_MOD("can1", 915, R8A77470_CLK_P), 131 + DEF_MOD("can0", 916, R8A77470_CLK_P), 132 + DEF_MOD("qspi_mod-1", 917, R8A77470_CLK_QSPI), 133 + DEF_MOD("qspi_mod-0", 918, R8A77470_CLK_QSPI), 134 + DEF_MOD("i2c4", 927, R8A77470_CLK_HP), 135 + DEF_MOD("i2c3", 928, R8A77470_CLK_HP), 136 + DEF_MOD("i2c2", 929, R8A77470_CLK_HP), 137 + DEF_MOD("i2c1", 930, R8A77470_CLK_HP), 138 + DEF_MOD("i2c0", 931, R8A77470_CLK_HP), 139 + DEF_MOD("ssi-all", 1005, R8A77470_CLK_P), 140 + DEF_MOD("ssi9", 1006, MOD_CLK_ID(1005)), 141 + DEF_MOD("ssi8", 1007, MOD_CLK_ID(1005)), 142 + DEF_MOD("ssi7", 1008, MOD_CLK_ID(1005)), 143 + DEF_MOD("ssi6", 1009, MOD_CLK_ID(1005)), 144 + DEF_MOD("ssi5", 1010, MOD_CLK_ID(1005)), 145 + DEF_MOD("ssi4", 1011, MOD_CLK_ID(1005)), 146 + DEF_MOD("ssi3", 1012, MOD_CLK_ID(1005)), 147 + DEF_MOD("ssi2", 1013, MOD_CLK_ID(1005)), 148 + DEF_MOD("ssi1", 1014, MOD_CLK_ID(1005)), 149 + DEF_MOD("ssi0", 1015, MOD_CLK_ID(1005)), 150 + DEF_MOD("scu-all", 1017, R8A77470_CLK_P), 151 + DEF_MOD("scu-dvc1", 1018, MOD_CLK_ID(1017)), 152 + DEF_MOD("scu-dvc0", 1019, MOD_CLK_ID(1017)), 153 + DEF_MOD("scu-ctu1-mix1", 1020, MOD_CLK_ID(1017)), 154 + DEF_MOD("scu-ctu0-mix0", 1021, MOD_CLK_ID(1017)), 155 + DEF_MOD("scu-src6", 1025, MOD_CLK_ID(1017)), 156 + DEF_MOD("scu-src5", 1026, MOD_CLK_ID(1017)), 157 + DEF_MOD("scu-src4", 1027, MOD_CLK_ID(1017)), 158 + DEF_MOD("scu-src3", 1028, MOD_CLK_ID(1017)), 159 + DEF_MOD("scu-src2", 1029, MOD_CLK_ID(1017)), 160 + DEF_MOD("scu-src1", 1030, MOD_CLK_ID(1017)), 161 + }; 162 + 163 + static const unsigned int r8a77470_crit_mod_clks[] __initconst = { 164 + MOD_CLK_ID(402), /* RWDT */ 165 + MOD_CLK_ID(408), /* INTC-SYS (GIC) */ 166 + }; 167 + 168 + /* 169 + * CPG Clock Data 170 + */ 171 + 172 + /* 173 + * MD EXTAL PLL0 PLL1 PLL3 174 + * 14 13 (MHz) *1 *2 175 + *--------------------------------------------------- 176 + * 0 0 20 x80 x78 x50 177 + * 0 1 26 x60 x60 x56 178 + * 1 0 Prohibitted setting 179 + * 1 1 30 x52 x52 x50 180 + * 181 + * *1 : Table 7.4 indicates VCO output (PLL0 = VCO) 182 + * *2 : Table 7.4 indicates VCO output (PLL1 = VCO) 183 + */ 184 + #define CPG_PLL_CONFIG_INDEX(md) ((((md) & BIT(14)) >> 13) | \ 185 + (((md) & BIT(13)) >> 13)) 186 + 187 + static const struct rcar_gen2_cpg_pll_config cpg_pll_configs[4] __initconst = { 188 + /* EXTAL div PLL1 mult x2 PLL3 mult */ 189 + { 1, 156, 50, }, 190 + { 1, 120, 56, }, 191 + { /* Invalid*/ }, 192 + { 1, 104, 50, }, 193 + }; 194 + 195 + static int __init r8a77470_cpg_mssr_init(struct device *dev) 196 + { 197 + const struct rcar_gen2_cpg_pll_config *cpg_pll_config; 198 + u32 cpg_mode; 199 + int error; 200 + 201 + error = rcar_rst_read_mode_pins(&cpg_mode); 202 + if (error) 203 + return error; 204 + 205 + cpg_pll_config = &cpg_pll_configs[CPG_PLL_CONFIG_INDEX(cpg_mode)]; 206 + 207 + return rcar_gen2_cpg_init(cpg_pll_config, 2, cpg_mode); 208 + } 209 + 210 + const struct cpg_mssr_info r8a77470_cpg_mssr_info __initconst = { 211 + /* Core Clocks */ 212 + .core_clks = r8a77470_core_clks, 213 + .num_core_clks = ARRAY_SIZE(r8a77470_core_clks), 214 + .last_dt_core_clk = LAST_DT_CORE_CLK, 215 + .num_total_core_clks = MOD_CLK_BASE, 216 + 217 + /* Module Clocks */ 218 + .mod_clks = r8a77470_mod_clks, 219 + .num_mod_clks = ARRAY_SIZE(r8a77470_mod_clks), 220 + .num_hw_mod_clks = 12 * 32, 221 + 222 + /* Critical Module Clocks */ 223 + .crit_mod_clks = r8a77470_crit_mod_clks, 224 + .num_crit_mod_clks = ARRAY_SIZE(r8a77470_crit_mod_clks), 225 + 226 + /* Callbacks */ 227 + .init = r8a77470_cpg_mssr_init, 228 + .cpg_clk_register = rcar_gen2_cpg_clk_register, 229 + };
+1 -1
drivers/clk/renesas/r8a7791-cpg-mssr.c
··· 57 57 58 58 /* Core Clock Outputs */ 59 59 DEF_BASE("z", R8A7791_CLK_Z, CLK_TYPE_GEN2_Z, CLK_PLL0), 60 - DEF_BASE("lb", R8A7791_CLK_LB, CLK_TYPE_GEN2_LB, CLK_PLL1), 61 60 DEF_BASE("adsp", R8A7791_CLK_ADSP, CLK_TYPE_GEN2_ADSP, CLK_PLL1), 62 61 DEF_BASE("sdh", R8A7791_CLK_SDH, CLK_TYPE_GEN2_SDH, CLK_PLL1), 63 62 DEF_BASE("sd0", R8A7791_CLK_SD0, CLK_TYPE_GEN2_SD0, CLK_PLL1), ··· 69 70 DEF_FIXED("hp", R8A7791_CLK_HP, CLK_PLL1, 12, 1), 70 71 DEF_FIXED("i", R8A7791_CLK_I, CLK_PLL1, 2, 1), 71 72 DEF_FIXED("b", R8A7791_CLK_B, CLK_PLL1, 12, 1), 73 + DEF_FIXED("lb", R8A7791_CLK_LB, CLK_PLL1, 24, 1), 72 74 DEF_FIXED("p", R8A7791_CLK_P, CLK_PLL1, 24, 1), 73 75 DEF_FIXED("cl", R8A7791_CLK_CL, CLK_PLL1, 48, 1), 74 76 DEF_FIXED("m2", R8A7791_CLK_M2, CLK_PLL1, 8, 1),
+1 -1
drivers/clk/renesas/r8a7792-cpg-mssr.c
··· 53 53 DEF_FIXED(".pll1_div2", CLK_PLL1_DIV2, CLK_PLL1, 2, 1), 54 54 55 55 /* Core Clock Outputs */ 56 - DEF_BASE("lb", R8A7792_CLK_LB, CLK_TYPE_GEN2_LB, CLK_PLL1), 57 56 DEF_BASE("qspi", R8A7792_CLK_QSPI, CLK_TYPE_GEN2_QSPI, CLK_PLL1_DIV2), 58 57 59 58 DEF_FIXED("z", R8A7792_CLK_Z, CLK_PLL0, 1, 1), ··· 62 63 DEF_FIXED("hp", R8A7792_CLK_HP, CLK_PLL1, 12, 1), 63 64 DEF_FIXED("i", R8A7792_CLK_I, CLK_PLL1, 3, 1), 64 65 DEF_FIXED("b", R8A7792_CLK_B, CLK_PLL1, 12, 1), 66 + DEF_FIXED("lb", R8A7792_CLK_LB, CLK_PLL1, 24, 1), 65 67 DEF_FIXED("p", R8A7792_CLK_P, CLK_PLL1, 24, 1), 66 68 DEF_FIXED("cl", R8A7792_CLK_CL, CLK_PLL1, 48, 1), 67 69 DEF_FIXED("m2", R8A7792_CLK_M2, CLK_PLL1, 8, 1),
+1 -1
drivers/clk/renesas/r8a7794-cpg-mssr.c
··· 55 55 DEF_FIXED(".pll1_div2", CLK_PLL1_DIV2, CLK_PLL1, 2, 1), 56 56 57 57 /* Core Clock Outputs */ 58 - DEF_BASE("lb", R8A7794_CLK_LB, CLK_TYPE_GEN2_LB, CLK_PLL1), 59 58 DEF_BASE("adsp", R8A7794_CLK_ADSP, CLK_TYPE_GEN2_ADSP, CLK_PLL1), 60 59 DEF_BASE("sdh", R8A7794_CLK_SDH, CLK_TYPE_GEN2_SDH, CLK_PLL1), 61 60 DEF_BASE("sd0", R8A7794_CLK_SD0, CLK_TYPE_GEN2_SD0, CLK_PLL1), ··· 68 69 DEF_FIXED("hp", R8A7794_CLK_HP, CLK_PLL1, 12, 1), 69 70 DEF_FIXED("i", R8A7794_CLK_I, CLK_PLL1, 2, 1), 70 71 DEF_FIXED("b", R8A7794_CLK_B, CLK_PLL1, 12, 1), 72 + DEF_FIXED("lb", R8A7794_CLK_LB, CLK_PLL1, 24, 1), 71 73 DEF_FIXED("p", R8A7794_CLK_P, CLK_PLL1, 24, 1), 72 74 DEF_FIXED("cl", R8A7794_CLK_CL, CLK_PLL1, 48, 1), 73 75 DEF_FIXED("cp", R8A7794_CLK_CP, CLK_PLL1, 48, 1),
+4
drivers/clk/renesas/r8a77965-cpg-mssr.c
··· 116 116 DEF_MOD("scif3", 204, R8A77965_CLK_S3D4), 117 117 DEF_MOD("scif1", 206, R8A77965_CLK_S3D4), 118 118 DEF_MOD("scif0", 207, R8A77965_CLK_S3D4), 119 + DEF_MOD("msiof3", 208, R8A77965_CLK_MSO), 120 + DEF_MOD("msiof2", 209, R8A77965_CLK_MSO), 121 + DEF_MOD("msiof1", 210, R8A77965_CLK_MSO), 122 + DEF_MOD("msiof0", 211, R8A77965_CLK_MSO), 119 123 DEF_MOD("sys-dmac2", 217, R8A77965_CLK_S0D3), 120 124 DEF_MOD("sys-dmac1", 218, R8A77965_CLK_S0D3), 121 125 DEF_MOD("sys-dmac0", 219, R8A77965_CLK_S0D3),
+1 -1
drivers/clk/renesas/r8a77980-cpg-mssr.c
··· 116 116 DEF_MOD("sys-dmac1", 218, R8A77980_CLK_S0D3), 117 117 DEF_MOD("tpu0", 304, R8A77980_CLK_S3D4), 118 118 DEF_MOD("sdif", 314, R8A77980_CLK_SD0), 119 - DEF_MOD("pciec0", 319, R8A77980_CLK_S3D1), 119 + DEF_MOD("pciec0", 319, R8A77980_CLK_S2D2), 120 120 DEF_MOD("intc-ex", 407, R8A77980_CLK_CP), 121 121 DEF_MOD("intc-ap", 408, R8A77980_CLK_S0D3), 122 122 DEF_MOD("hscif3", 517, R8A77980_CLK_S3D1),
+289
drivers/clk/renesas/r8a77990-cpg-mssr.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + /* 3 + * r8a77990 Clock Pulse Generator / Module Standby and Software Reset 4 + * 5 + * Copyright (C) 2018 Renesas Electronics Corp. 6 + * 7 + * Based on r8a7795-cpg-mssr.c 8 + * 9 + * Copyright (C) 2015 Glider bvba 10 + * Copyright (C) 2015 Renesas Electronics Corp. 11 + */ 12 + 13 + #include <linux/device.h> 14 + #include <linux/init.h> 15 + #include <linux/kernel.h> 16 + #include <linux/soc/renesas/rcar-rst.h> 17 + 18 + #include <dt-bindings/clock/r8a77990-cpg-mssr.h> 19 + 20 + #include "renesas-cpg-mssr.h" 21 + #include "rcar-gen3-cpg.h" 22 + 23 + enum clk_ids { 24 + /* Core Clock Outputs exported to DT */ 25 + LAST_DT_CORE_CLK = R8A77990_CLK_CPEX, 26 + 27 + /* External Input Clocks */ 28 + CLK_EXTAL, 29 + 30 + /* Internal Core Clocks */ 31 + CLK_MAIN, 32 + CLK_PLL0, 33 + CLK_PLL1, 34 + CLK_PLL3, 35 + CLK_PLL0D4, 36 + CLK_PLL0D6, 37 + CLK_PLL0D8, 38 + CLK_PLL0D20, 39 + CLK_PLL0D24, 40 + CLK_PLL1D2, 41 + CLK_PE, 42 + CLK_S0, 43 + CLK_S1, 44 + CLK_S2, 45 + CLK_S3, 46 + CLK_SDSRC, 47 + 48 + /* Module Clocks */ 49 + MOD_CLK_BASE 50 + }; 51 + 52 + static const struct cpg_core_clk r8a77990_core_clks[] __initconst = { 53 + /* External Clock Inputs */ 54 + DEF_INPUT("extal", CLK_EXTAL), 55 + 56 + /* Internal Core Clocks */ 57 + DEF_BASE(".main", CLK_MAIN, CLK_TYPE_GEN3_MAIN, CLK_EXTAL), 58 + DEF_BASE(".pll1", CLK_PLL1, CLK_TYPE_GEN3_PLL1, CLK_MAIN), 59 + DEF_BASE(".pll3", CLK_PLL3, CLK_TYPE_GEN3_PLL3, CLK_MAIN), 60 + 61 + DEF_FIXED(".pll0", CLK_PLL0, CLK_MAIN, 1, 100), 62 + DEF_FIXED(".pll0d4", CLK_PLL0D4, CLK_PLL0, 4, 1), 63 + DEF_FIXED(".pll0d6", CLK_PLL0D6, CLK_PLL0, 6, 1), 64 + DEF_FIXED(".pll0d8", CLK_PLL0D8, CLK_PLL0, 8, 1), 65 + DEF_FIXED(".pll0d20", CLK_PLL0D20, CLK_PLL0, 20, 1), 66 + DEF_FIXED(".pll0d24", CLK_PLL0D24, CLK_PLL0, 24, 1), 67 + DEF_FIXED(".pll1d2", CLK_PLL1D2, CLK_PLL1, 2, 1), 68 + DEF_FIXED(".pe", CLK_PE, CLK_PLL0D20, 1, 1), 69 + DEF_FIXED(".s0", CLK_S0, CLK_PLL1, 2, 1), 70 + DEF_FIXED(".s1", CLK_S1, CLK_PLL1, 3, 1), 71 + DEF_FIXED(".s2", CLK_S2, CLK_PLL1, 4, 1), 72 + DEF_FIXED(".s3", CLK_S3, CLK_PLL1, 6, 1), 73 + DEF_FIXED(".sdsrc", CLK_SDSRC, CLK_PLL1, 2, 1), 74 + 75 + /* Core Clock Outputs */ 76 + DEF_FIXED("za2", R8A77990_CLK_ZA2, CLK_PLL0D24, 1, 1), 77 + DEF_FIXED("za8", R8A77990_CLK_ZA8, CLK_PLL0D8, 1, 1), 78 + DEF_FIXED("ztr", R8A77990_CLK_ZTR, CLK_PLL1, 6, 1), 79 + DEF_FIXED("zt", R8A77990_CLK_ZT, CLK_PLL1, 4, 1), 80 + DEF_FIXED("zx", R8A77990_CLK_ZX, CLK_PLL1, 3, 1), 81 + DEF_FIXED("s0d1", R8A77990_CLK_S0D1, CLK_S0, 1, 1), 82 + DEF_FIXED("s0d3", R8A77990_CLK_S0D3, CLK_S0, 3, 1), 83 + DEF_FIXED("s0d6", R8A77990_CLK_S0D6, CLK_S0, 6, 1), 84 + DEF_FIXED("s0d12", R8A77990_CLK_S0D12, CLK_S0, 12, 1), 85 + DEF_FIXED("s0d24", R8A77990_CLK_S0D24, CLK_S0, 24, 1), 86 + DEF_FIXED("s1d1", R8A77990_CLK_S1D1, CLK_S1, 1, 1), 87 + DEF_FIXED("s1d2", R8A77990_CLK_S1D2, CLK_S1, 2, 1), 88 + DEF_FIXED("s1d4", R8A77990_CLK_S1D4, CLK_S1, 4, 1), 89 + DEF_FIXED("s2d1", R8A77990_CLK_S2D1, CLK_S2, 1, 1), 90 + DEF_FIXED("s2d2", R8A77990_CLK_S2D2, CLK_S2, 2, 1), 91 + DEF_FIXED("s2d4", R8A77990_CLK_S2D4, CLK_S2, 4, 1), 92 + DEF_FIXED("s3d1", R8A77990_CLK_S3D1, CLK_S3, 1, 1), 93 + DEF_FIXED("s3d2", R8A77990_CLK_S3D2, CLK_S3, 2, 1), 94 + DEF_FIXED("s3d4", R8A77990_CLK_S3D4, CLK_S3, 4, 1), 95 + 96 + DEF_GEN3_SD("sd0", R8A77990_CLK_SD0, CLK_SDSRC, 0x0074), 97 + DEF_GEN3_SD("sd1", R8A77990_CLK_SD1, CLK_SDSRC, 0x0078), 98 + DEF_GEN3_SD("sd3", R8A77990_CLK_SD3, CLK_SDSRC, 0x026c), 99 + 100 + DEF_FIXED("cl", R8A77990_CLK_CL, CLK_PLL1, 48, 1), 101 + DEF_FIXED("cp", R8A77990_CLK_CP, CLK_EXTAL, 2, 1), 102 + DEF_FIXED("cpex", R8A77990_CLK_CPEX, CLK_EXTAL, 4, 1), 103 + DEF_FIXED("osc", R8A77990_CLK_OSC, CLK_EXTAL, 384, 1), 104 + DEF_FIXED("r", R8A77990_CLK_R, CLK_EXTAL, 1536, 1), 105 + 106 + DEF_GEN3_PE("s0d6c", R8A77990_CLK_S0D6C, CLK_S0, 6, CLK_PE, 2), 107 + DEF_GEN3_PE("s3d1c", R8A77990_CLK_S3D1C, CLK_S3, 1, CLK_PE, 1), 108 + DEF_GEN3_PE("s3d2c", R8A77990_CLK_S3D2C, CLK_S3, 2, CLK_PE, 2), 109 + DEF_GEN3_PE("s3d4c", R8A77990_CLK_S3D4C, CLK_S3, 4, CLK_PE, 4), 110 + 111 + DEF_DIV6P1("canfd", R8A77990_CLK_CANFD, CLK_PLL0D6, 0x244), 112 + DEF_DIV6P1("csi0", R8A77990_CLK_CSI0, CLK_PLL1D2, 0x00c), 113 + DEF_DIV6P1("mso", R8A77990_CLK_MSO, CLK_PLL1D2, 0x014), 114 + }; 115 + 116 + static const struct mssr_mod_clk r8a77990_mod_clks[] __initconst = { 117 + DEF_MOD("scif5", 202, R8A77990_CLK_S3D4C), 118 + DEF_MOD("scif4", 203, R8A77990_CLK_S3D4C), 119 + DEF_MOD("scif3", 204, R8A77990_CLK_S3D4C), 120 + DEF_MOD("scif1", 206, R8A77990_CLK_S3D4C), 121 + DEF_MOD("scif0", 207, R8A77990_CLK_S3D4C), 122 + DEF_MOD("msiof3", 208, R8A77990_CLK_MSO), 123 + DEF_MOD("msiof2", 209, R8A77990_CLK_MSO), 124 + DEF_MOD("msiof1", 210, R8A77990_CLK_MSO), 125 + DEF_MOD("msiof0", 211, R8A77990_CLK_MSO), 126 + DEF_MOD("sys-dmac2", 217, R8A77990_CLK_S3D1), 127 + DEF_MOD("sys-dmac1", 218, R8A77990_CLK_S3D1), 128 + DEF_MOD("sys-dmac0", 219, R8A77990_CLK_S3D1), 129 + 130 + DEF_MOD("cmt3", 300, R8A77990_CLK_R), 131 + DEF_MOD("cmt2", 301, R8A77990_CLK_R), 132 + DEF_MOD("cmt1", 302, R8A77990_CLK_R), 133 + DEF_MOD("cmt0", 303, R8A77990_CLK_R), 134 + DEF_MOD("scif2", 310, R8A77990_CLK_S3D4C), 135 + DEF_MOD("sdif3", 311, R8A77990_CLK_SD3), 136 + DEF_MOD("sdif1", 313, R8A77990_CLK_SD1), 137 + DEF_MOD("sdif0", 314, R8A77990_CLK_SD0), 138 + DEF_MOD("pcie0", 319, R8A77990_CLK_S3D1), 139 + DEF_MOD("usb3-if0", 328, R8A77990_CLK_S3D1), 140 + DEF_MOD("usb-dmac0", 330, R8A77990_CLK_S3D1), 141 + DEF_MOD("usb-dmac1", 331, R8A77990_CLK_S3D1), 142 + 143 + DEF_MOD("rwdt", 402, R8A77990_CLK_R), 144 + DEF_MOD("intc-ex", 407, R8A77990_CLK_CP), 145 + DEF_MOD("intc-ap", 408, R8A77990_CLK_S0D3), 146 + 147 + DEF_MOD("audmac0", 502, R8A77990_CLK_S3D4), 148 + DEF_MOD("drif7", 508, R8A77990_CLK_S3D2), 149 + DEF_MOD("drif6", 509, R8A77990_CLK_S3D2), 150 + DEF_MOD("drif5", 510, R8A77990_CLK_S3D2), 151 + DEF_MOD("drif4", 511, R8A77990_CLK_S3D2), 152 + DEF_MOD("drif3", 512, R8A77990_CLK_S3D2), 153 + DEF_MOD("drif2", 513, R8A77990_CLK_S3D2), 154 + DEF_MOD("drif1", 514, R8A77990_CLK_S3D2), 155 + DEF_MOD("drif0", 515, R8A77990_CLK_S3D2), 156 + DEF_MOD("hscif4", 516, R8A77990_CLK_S3D1C), 157 + DEF_MOD("hscif3", 517, R8A77990_CLK_S3D1C), 158 + DEF_MOD("hscif2", 518, R8A77990_CLK_S3D1C), 159 + DEF_MOD("hscif1", 519, R8A77990_CLK_S3D1C), 160 + DEF_MOD("hscif0", 520, R8A77990_CLK_S3D1C), 161 + DEF_MOD("thermal", 522, R8A77990_CLK_CP), 162 + DEF_MOD("pwm", 523, R8A77990_CLK_S3D4C), 163 + 164 + DEF_MOD("fcpvd1", 602, R8A77990_CLK_S1D2), 165 + DEF_MOD("fcpvd0", 603, R8A77990_CLK_S1D2), 166 + DEF_MOD("fcpvb0", 607, R8A77990_CLK_S0D1), 167 + DEF_MOD("fcpvi0", 611, R8A77990_CLK_S0D1), 168 + DEF_MOD("fcpf0", 615, R8A77990_CLK_S0D1), 169 + DEF_MOD("fcpcs", 619, R8A77990_CLK_S0D1), 170 + DEF_MOD("vspd1", 622, R8A77990_CLK_S1D2), 171 + DEF_MOD("vspd0", 623, R8A77990_CLK_S1D2), 172 + DEF_MOD("vspb", 626, R8A77990_CLK_S0D1), 173 + DEF_MOD("vspi0", 631, R8A77990_CLK_S0D1), 174 + 175 + DEF_MOD("ehci0", 703, R8A77990_CLK_S3D4), 176 + DEF_MOD("hsusb", 704, R8A77990_CLK_S3D4), 177 + DEF_MOD("csi40", 716, R8A77990_CLK_CSI0), 178 + DEF_MOD("du1", 723, R8A77990_CLK_S2D1), 179 + DEF_MOD("du0", 724, R8A77990_CLK_S2D1), 180 + DEF_MOD("lvds", 727, R8A77990_CLK_S2D1), 181 + 182 + DEF_MOD("vin5", 806, R8A77990_CLK_S1D2), 183 + DEF_MOD("vin4", 807, R8A77990_CLK_S1D2), 184 + DEF_MOD("etheravb", 812, R8A77990_CLK_S3D2), 185 + 186 + DEF_MOD("gpio6", 906, R8A77990_CLK_S3D4), 187 + DEF_MOD("gpio5", 907, R8A77990_CLK_S3D4), 188 + DEF_MOD("gpio4", 908, R8A77990_CLK_S3D4), 189 + DEF_MOD("gpio3", 909, R8A77990_CLK_S3D4), 190 + DEF_MOD("gpio2", 910, R8A77990_CLK_S3D4), 191 + DEF_MOD("gpio1", 911, R8A77990_CLK_S3D4), 192 + DEF_MOD("gpio0", 912, R8A77990_CLK_S3D4), 193 + DEF_MOD("can-fd", 914, R8A77990_CLK_S3D2), 194 + DEF_MOD("can-if1", 915, R8A77990_CLK_S3D4), 195 + DEF_MOD("can-if0", 916, R8A77990_CLK_S3D4), 196 + DEF_MOD("i2c6", 918, R8A77990_CLK_S3D2), 197 + DEF_MOD("i2c5", 919, R8A77990_CLK_S3D2), 198 + DEF_MOD("i2c-dvfs", 926, R8A77990_CLK_CP), 199 + DEF_MOD("i2c4", 927, R8A77990_CLK_S3D2), 200 + DEF_MOD("i2c3", 928, R8A77990_CLK_S3D2), 201 + DEF_MOD("i2c2", 929, R8A77990_CLK_S3D2), 202 + DEF_MOD("i2c1", 930, R8A77990_CLK_S3D2), 203 + DEF_MOD("i2c0", 931, R8A77990_CLK_S3D2), 204 + 205 + DEF_MOD("ssi-all", 1005, R8A77990_CLK_S3D4), 206 + DEF_MOD("ssi9", 1006, MOD_CLK_ID(1005)), 207 + DEF_MOD("ssi8", 1007, MOD_CLK_ID(1005)), 208 + DEF_MOD("ssi7", 1008, MOD_CLK_ID(1005)), 209 + DEF_MOD("ssi6", 1009, MOD_CLK_ID(1005)), 210 + DEF_MOD("ssi5", 1010, MOD_CLK_ID(1005)), 211 + DEF_MOD("ssi4", 1011, MOD_CLK_ID(1005)), 212 + DEF_MOD("ssi3", 1012, MOD_CLK_ID(1005)), 213 + DEF_MOD("ssi2", 1013, MOD_CLK_ID(1005)), 214 + DEF_MOD("ssi1", 1014, MOD_CLK_ID(1005)), 215 + DEF_MOD("ssi0", 1015, MOD_CLK_ID(1005)), 216 + DEF_MOD("scu-all", 1017, R8A77990_CLK_S3D4), 217 + DEF_MOD("scu-dvc1", 1018, MOD_CLK_ID(1017)), 218 + DEF_MOD("scu-dvc0", 1019, MOD_CLK_ID(1017)), 219 + DEF_MOD("scu-ctu1-mix1", 1020, MOD_CLK_ID(1017)), 220 + DEF_MOD("scu-ctu0-mix0", 1021, MOD_CLK_ID(1017)), 221 + DEF_MOD("scu-src9", 1022, MOD_CLK_ID(1017)), 222 + DEF_MOD("scu-src8", 1023, MOD_CLK_ID(1017)), 223 + DEF_MOD("scu-src7", 1024, MOD_CLK_ID(1017)), 224 + DEF_MOD("scu-src6", 1025, MOD_CLK_ID(1017)), 225 + DEF_MOD("scu-src5", 1026, MOD_CLK_ID(1017)), 226 + DEF_MOD("scu-src4", 1027, MOD_CLK_ID(1017)), 227 + DEF_MOD("scu-src3", 1028, MOD_CLK_ID(1017)), 228 + DEF_MOD("scu-src2", 1029, MOD_CLK_ID(1017)), 229 + DEF_MOD("scu-src1", 1030, MOD_CLK_ID(1017)), 230 + DEF_MOD("scu-src0", 1031, MOD_CLK_ID(1017)), 231 + }; 232 + 233 + static const unsigned int r8a77990_crit_mod_clks[] __initconst = { 234 + MOD_CLK_ID(408), /* INTC-AP (GIC) */ 235 + }; 236 + 237 + /* 238 + * CPG Clock Data 239 + */ 240 + 241 + /* 242 + * MD19 EXTAL (MHz) PLL0 PLL1 PLL3 243 + *-------------------------------------------------------------------- 244 + * 0 48 x 1 x100/4 x100/3 x100/3 245 + * 1 48 x 1 x100/4 x100/3 x58/3 246 + */ 247 + #define CPG_PLL_CONFIG_INDEX(md) (((md) & BIT(19)) >> 19) 248 + 249 + static const struct rcar_gen3_cpg_pll_config cpg_pll_configs[2] __initconst = { 250 + /* EXTAL div PLL1 mult/div PLL3 mult/div */ 251 + { 1, 100, 3, 100, 3, }, 252 + { 1, 100, 3, 58, 3, }, 253 + }; 254 + 255 + static int __init r8a77990_cpg_mssr_init(struct device *dev) 256 + { 257 + const struct rcar_gen3_cpg_pll_config *cpg_pll_config; 258 + u32 cpg_mode; 259 + int error; 260 + 261 + error = rcar_rst_read_mode_pins(&cpg_mode); 262 + if (error) 263 + return error; 264 + 265 + cpg_pll_config = &cpg_pll_configs[CPG_PLL_CONFIG_INDEX(cpg_mode)]; 266 + 267 + return rcar_gen3_cpg_init(cpg_pll_config, 0, cpg_mode); 268 + } 269 + 270 + const struct cpg_mssr_info r8a77990_cpg_mssr_info __initconst = { 271 + /* Core Clocks */ 272 + .core_clks = r8a77990_core_clks, 273 + .num_core_clks = ARRAY_SIZE(r8a77990_core_clks), 274 + .last_dt_core_clk = LAST_DT_CORE_CLK, 275 + .num_total_core_clks = MOD_CLK_BASE, 276 + 277 + /* Module Clocks */ 278 + .mod_clks = r8a77990_mod_clks, 279 + .num_mod_clks = ARRAY_SIZE(r8a77990_mod_clks), 280 + .num_hw_mod_clks = 12 * 32, 281 + 282 + /* Critical Module Clocks */ 283 + .crit_mod_clks = r8a77990_crit_mod_clks, 284 + .num_crit_mod_clks = ARRAY_SIZE(r8a77990_crit_mod_clks), 285 + 286 + /* Callbacks */ 287 + .init = r8a77990_cpg_mssr_init, 288 + .cpg_clk_register = rcar_gen3_cpg_clk_register, 289 + };
+24
drivers/clk/renesas/rcar-gen2-cpg.c
··· 16 16 #include <linux/init.h> 17 17 #include <linux/io.h> 18 18 #include <linux/slab.h> 19 + #include <linux/sys_soc.h> 19 20 20 21 #include "renesas-cpg-mssr.h" 21 22 #include "rcar-gen2-cpg.h" ··· 261 260 static const struct rcar_gen2_cpg_pll_config *cpg_pll_config __initdata; 262 261 static unsigned int cpg_pll0_div __initdata; 263 262 static u32 cpg_mode __initdata; 263 + static u32 cpg_quirks __initdata; 264 + 265 + #define SD_SKIP_FIRST BIT(0) /* Skip first clock in SD table */ 266 + 267 + static const struct soc_device_attribute cpg_quirks_match[] __initconst = { 268 + { 269 + .soc_id = "r8a77470", 270 + .data = (void *)SD_SKIP_FIRST, 271 + }, 272 + { /* sentinel */ } 273 + }; 264 274 265 275 struct clk * __init rcar_gen2_cpg_clk_register(struct device *dev, 266 276 const struct cpg_core_clk *core, const struct cpg_mssr_info *info, ··· 339 327 340 328 case CLK_TYPE_GEN2_SD0: 341 329 table = cpg_sd01_div_table; 330 + if (cpg_quirks & SD_SKIP_FIRST) 331 + table++; 332 + 342 333 shift = 4; 343 334 break; 344 335 345 336 case CLK_TYPE_GEN2_SD1: 346 337 table = cpg_sd01_div_table; 338 + if (cpg_quirks & SD_SKIP_FIRST) 339 + table++; 340 + 347 341 shift = 0; 348 342 break; 349 343 ··· 378 360 int __init rcar_gen2_cpg_init(const struct rcar_gen2_cpg_pll_config *config, 379 361 unsigned int pll0_div, u32 mode) 380 362 { 363 + const struct soc_device_attribute *attr; 364 + 381 365 cpg_pll_config = config; 382 366 cpg_pll0_div = pll0_div; 383 367 cpg_mode = mode; 368 + attr = soc_device_match(cpg_quirks_match); 369 + if (attr) 370 + cpg_quirks = (uintptr_t)attr->data; 371 + pr_debug("%s: mode = 0x%x quirks = 0x%x\n", __func__, mode, cpg_quirks); 384 372 385 373 spin_lock_init(&cpg_lock); 386 374
+12
drivers/clk/renesas/renesas-cpg-mssr.c
··· 652 652 .data = &r8a7745_cpg_mssr_info, 653 653 }, 654 654 #endif 655 + #ifdef CONFIG_CLK_R8A77470 656 + { 657 + .compatible = "renesas,r8a77470-cpg-mssr", 658 + .data = &r8a77470_cpg_mssr_info, 659 + }, 660 + #endif 655 661 #ifdef CONFIG_CLK_R8A7790 656 662 { 657 663 .compatible = "renesas,r8a7790-cpg-mssr", ··· 715 709 { 716 710 .compatible = "renesas,r8a77980-cpg-mssr", 717 711 .data = &r8a77980_cpg_mssr_info, 712 + }, 713 + #endif 714 + #ifdef CONFIG_CLK_R8A77990 715 + { 716 + .compatible = "renesas,r8a77990-cpg-mssr", 717 + .data = &r8a77990_cpg_mssr_info, 718 718 }, 719 719 #endif 720 720 #ifdef CONFIG_CLK_R8A77995
+2
drivers/clk/renesas/renesas-cpg-mssr.h
··· 133 133 134 134 extern const struct cpg_mssr_info r8a7743_cpg_mssr_info; 135 135 extern const struct cpg_mssr_info r8a7745_cpg_mssr_info; 136 + extern const struct cpg_mssr_info r8a77470_cpg_mssr_info; 136 137 extern const struct cpg_mssr_info r8a7790_cpg_mssr_info; 137 138 extern const struct cpg_mssr_info r8a7791_cpg_mssr_info; 138 139 extern const struct cpg_mssr_info r8a7792_cpg_mssr_info; ··· 143 142 extern const struct cpg_mssr_info r8a77965_cpg_mssr_info; 144 143 extern const struct cpg_mssr_info r8a77970_cpg_mssr_info; 145 144 extern const struct cpg_mssr_info r8a77980_cpg_mssr_info; 145 + extern const struct cpg_mssr_info r8a77990_cpg_mssr_info; 146 146 extern const struct cpg_mssr_info r8a77995_cpg_mssr_info; 147 147 148 148
+26
include/dt-bindings/clock/axg-aoclkc.h
··· 1 + /* SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) */ 2 + /* 3 + * Copyright (c) 2016 BayLibre, SAS 4 + * Author: Neil Armstrong <narmstrong@baylibre.com> 5 + * 6 + * Copyright (c) 2018 Amlogic, inc. 7 + * Author: Qiufang Dai <qiufang.dai@amlogic.com> 8 + */ 9 + 10 + #ifndef DT_BINDINGS_CLOCK_AMLOGIC_MESON_AXG_AOCLK 11 + #define DT_BINDINGS_CLOCK_AMLOGIC_MESON_AXG_AOCLK 12 + 13 + #define CLKID_AO_REMOTE 0 14 + #define CLKID_AO_I2C_MASTER 1 15 + #define CLKID_AO_I2C_SLAVE 2 16 + #define CLKID_AO_UART1 3 17 + #define CLKID_AO_UART2 4 18 + #define CLKID_AO_IR_BLASTER 5 19 + #define CLKID_AO_SAR_ADC 6 20 + #define CLKID_AO_CLK81 7 21 + #define CLKID_AO_SAR_ADC_SEL 8 22 + #define CLKID_AO_SAR_ADC_DIV 9 23 + #define CLKID_AO_SAR_ADC_CLK 10 24 + #define CLKID_AO_ALT_XTAL 11 25 + 26 + #endif
+2
include/dt-bindings/clock/gxbb-clkc.h
··· 125 125 #define CLKID_VAPB_1 138 126 126 #define CLKID_VAPB_SEL 139 127 127 #define CLKID_VAPB 140 128 + #define CLKID_VDEC_1 153 129 + #define CLKID_VDEC_HEVC 156 128 130 129 131 #endif /* __GXBB_CLKC_H */
+1
include/dt-bindings/clock/meson8b-clkc.h
··· 102 102 #define CLKID_MPLL0 93 103 103 #define CLKID_MPLL1 94 104 104 #define CLKID_MPLL2 95 105 + #define CLKID_NAND_CLK 112 105 106 106 107 #endif /* __MESON8B_CLKC_H */
+36
include/dt-bindings/clock/r8a77470-cpg-mssr.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0 2 + * 3 + * Copyright (C) 2018 Renesas Electronics Corp. 4 + */ 5 + #ifndef __DT_BINDINGS_CLOCK_R8A77470_CPG_MSSR_H__ 6 + #define __DT_BINDINGS_CLOCK_R8A77470_CPG_MSSR_H__ 7 + 8 + #include <dt-bindings/clock/renesas-cpg-mssr.h> 9 + 10 + /* r8a77470 CPG Core Clocks */ 11 + #define R8A77470_CLK_Z2 0 12 + #define R8A77470_CLK_ZTR 1 13 + #define R8A77470_CLK_ZTRD2 2 14 + #define R8A77470_CLK_ZT 3 15 + #define R8A77470_CLK_ZX 4 16 + #define R8A77470_CLK_ZS 5 17 + #define R8A77470_CLK_HP 6 18 + #define R8A77470_CLK_B 7 19 + #define R8A77470_CLK_LB 8 20 + #define R8A77470_CLK_P 9 21 + #define R8A77470_CLK_CL 10 22 + #define R8A77470_CLK_CP 11 23 + #define R8A77470_CLK_M2 12 24 + #define R8A77470_CLK_ZB3 13 25 + #define R8A77470_CLK_SDH 14 26 + #define R8A77470_CLK_SD0 15 27 + #define R8A77470_CLK_SD1 16 28 + #define R8A77470_CLK_SD2 17 29 + #define R8A77470_CLK_MP 18 30 + #define R8A77470_CLK_QSPI 19 31 + #define R8A77470_CLK_CPEX 20 32 + #define R8A77470_CLK_RCAN 21 33 + #define R8A77470_CLK_R 22 34 + #define R8A77470_CLK_OSC 23 35 + 36 + #endif /* __DT_BINDINGS_CLOCK_R8A77470_CPG_MSSR_H__ */
+62
include/dt-bindings/clock/r8a77990-cpg-mssr.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0 */ 2 + /* 3 + * Copyright (C) 2018 Renesas Electronics Corp. 4 + */ 5 + #ifndef __DT_BINDINGS_CLOCK_R8A77990_CPG_MSSR_H__ 6 + #define __DT_BINDINGS_CLOCK_R8A77990_CPG_MSSR_H__ 7 + 8 + #include <dt-bindings/clock/renesas-cpg-mssr.h> 9 + 10 + /* r8a77990 CPG Core Clocks */ 11 + #define R8A77990_CLK_Z2 0 12 + #define R8A77990_CLK_ZR 1 13 + #define R8A77990_CLK_ZG 2 14 + #define R8A77990_CLK_ZTR 3 15 + #define R8A77990_CLK_ZT 4 16 + #define R8A77990_CLK_ZX 5 17 + #define R8A77990_CLK_S0D1 6 18 + #define R8A77990_CLK_S0D3 7 19 + #define R8A77990_CLK_S0D6 8 20 + #define R8A77990_CLK_S0D12 9 21 + #define R8A77990_CLK_S0D24 10 22 + #define R8A77990_CLK_S1D1 11 23 + #define R8A77990_CLK_S1D2 12 24 + #define R8A77990_CLK_S1D4 13 25 + #define R8A77990_CLK_S2D1 14 26 + #define R8A77990_CLK_S2D2 15 27 + #define R8A77990_CLK_S2D4 16 28 + #define R8A77990_CLK_S3D1 17 29 + #define R8A77990_CLK_S3D2 18 30 + #define R8A77990_CLK_S3D4 19 31 + #define R8A77990_CLK_S0D6C 20 32 + #define R8A77990_CLK_S3D1C 21 33 + #define R8A77990_CLK_S3D2C 22 34 + #define R8A77990_CLK_S3D4C 23 35 + #define R8A77990_CLK_LB 24 36 + #define R8A77990_CLK_CL 25 37 + #define R8A77990_CLK_ZB3 26 38 + #define R8A77990_CLK_ZB3D2 27 39 + #define R8A77990_CLK_CR 28 40 + #define R8A77990_CLK_CRD2 29 41 + #define R8A77990_CLK_SD0H 30 42 + #define R8A77990_CLK_SD0 31 43 + #define R8A77990_CLK_SD1H 32 44 + #define R8A77990_CLK_SD1 33 45 + #define R8A77990_CLK_SD3H 34 46 + #define R8A77990_CLK_SD3 35 47 + #define R8A77990_CLK_RPC 36 48 + #define R8A77990_CLK_RPCD2 37 49 + #define R8A77990_CLK_ZA2 38 50 + #define R8A77990_CLK_ZA8 39 51 + #define R8A77990_CLK_Z2D 40 52 + #define R8A77990_CLK_CANFD 41 53 + #define R8A77990_CLK_MSO 42 54 + #define R8A77990_CLK_R 43 55 + #define R8A77990_CLK_OSC 44 56 + #define R8A77990_CLK_LV0 45 57 + #define R8A77990_CLK_LV1 46 58 + #define R8A77990_CLK_CSI0 47 59 + #define R8A77990_CLK_CP 48 60 + #define R8A77990_CLK_CPEX 49 61 + 62 + #endif /* __DT_BINDINGS_CLOCK_R8A77990_CPG_MSSR_H__ */
+20
include/dt-bindings/reset/axg-aoclkc.h
··· 1 + /* SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) */ 2 + /* 3 + * Copyright (c) 2016 BayLibre, SAS 4 + * Author: Neil Armstrong <narmstrong@baylibre.com> 5 + * 6 + * Copyright (c) 2018 Amlogic, inc. 7 + * Author: Qiufang Dai <qiufang.dai@amlogic.com> 8 + */ 9 + 10 + #ifndef DT_BINDINGS_RESET_AMLOGIC_MESON_AXG_AOCLK 11 + #define DT_BINDINGS_RESET_AMLOGIC_MESON_AXG_AOCLK 12 + 13 + #define RESET_AO_REMOTE 0 14 + #define RESET_AO_I2C_MASTER 1 15 + #define RESET_AO_I2C_SLAVE 2 16 + #define RESET_AO_UART1 3 17 + #define RESET_AO_UART2 4 18 + #define RESET_AO_IR_BLASTER 5 19 + 20 + #endif
+40
include/linux/clk/davinci.h
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + /* 3 + * Clock drivers for TI DaVinci PLL and PSC controllers 4 + * 5 + * Copyright (C) 2018 David Lechner <david@lechnology.com> 6 + */ 7 + 8 + #ifndef __LINUX_CLK_DAVINCI_PLL_H___ 9 + #define __LINUX_CLK_DAVINCI_PLL_H___ 10 + 11 + #include <linux/device.h> 12 + #include <linux/regmap.h> 13 + 14 + /* function for registering clocks in early boot */ 15 + 16 + #ifdef CONFIG_ARCH_DAVINCI_DA830 17 + int da830_pll_init(struct device *dev, void __iomem *base, struct regmap *cfgchip); 18 + #endif 19 + #ifdef CONFIG_ARCH_DAVINCI_DA850 20 + int da850_pll0_init(struct device *dev, void __iomem *base, struct regmap *cfgchip); 21 + #endif 22 + #ifdef CONFIG_ARCH_DAVINCI_DM355 23 + int dm355_pll1_init(struct device *dev, void __iomem *base, struct regmap *cfgchip); 24 + int dm355_psc_init(struct device *dev, void __iomem *base); 25 + #endif 26 + #ifdef CONFIG_ARCH_DAVINCI_DM365 27 + int dm365_pll1_init(struct device *dev, void __iomem *base, struct regmap *cfgchip); 28 + int dm365_pll2_init(struct device *dev, void __iomem *base, struct regmap *cfgchip); 29 + int dm365_psc_init(struct device *dev, void __iomem *base); 30 + #endif 31 + #ifdef CONFIG_ARCH_DAVINCI_DM644x 32 + int dm644x_pll1_init(struct device *dev, void __iomem *base, struct regmap *cfgchip); 33 + int dm644x_psc_init(struct device *dev, void __iomem *base); 34 + #endif 35 + #ifdef CONFIG_ARCH_DAVINCI_DM646x 36 + int dm646x_pll1_init(struct device *dev, void __iomem *base, struct regmap *cfgchip); 37 + int dm646x_psc_init(struct device *dev, void __iomem *base); 38 + #endif 39 + 40 + #endif /* __LINUX_CLK_DAVINCI_PLL_H___ */