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

Merge tag 'clk-v4.9-samsung' of git://linuxtv.org/snawrocki/samsung into clk-next

Pull samsung clk driver updates from Sylwester Nawrocki:

In addition to a few clean up and code consolidation patches this
includes:
- addition of sound subsystem related clocks for Exynos5410 SoC
(EPLL, PDMA) and support for "samsung,exynos5410-audss-clock"
compatible in the clk-exynos-audss driver,
- addition of DRAM controller related clocks for exynos5420,
- MAINTAINERS update adding Chanwoo Choi as the Samsung SoC
clock drivers co-maintainer.

* tag 'clk-v4.9-samsung' of git://linuxtv.org/snawrocki/samsung:
clk: samsung: Add support for EPLL on exynos5410
clk: samsung: clk-exynos-audss: Whitespace and debug trace cleanup
clk: samsung: clk-exynos-audss: Add exynos5410 compatible
clk: samsung: clk-exynos-audss: controller variant handling rework
clk: samsung: Use common registration function for pll2550x
clk: samsung: exynos5410: Expose the peripheral DMA gate clocks
clk: samsung: exynos5420: Add clocks for CMU_CDREX domain
clk: samsung: exynos5410: Use samsung_cmu_register_one() to simplify code
clk: samsung: exynos5260: Move struct samsung_cmu_info to init section
MAINTAINERS: Add myself as Samsung SoC clock drivers co-maintainer
clk: samsung: exynos5410: Add clock IDs for PDMA and EPLL clocks
clk: samsung: Add clock IDs for the CMU_CDREX (DRAM Express Controller)

+453 -288
+3 -1
Documentation/devicetree/bindings/clock/clk-exynos-audss.txt
··· 10 10 - "samsung,exynos4210-audss-clock" - controller compatible with all Exynos4 SoCs. 11 11 - "samsung,exynos5250-audss-clock" - controller compatible with Exynos5250 12 12 SoCs. 13 + - "samsung,exynos5410-audss-clock" - controller compatible with Exynos5410 14 + SoCs. 13 15 - "samsung,exynos5420-audss-clock" - controller compatible with Exynos5420 14 16 SoCs. 15 17 - reg: physical base address and length of the controller's register set. ··· 93 91 <&clock_audss EXYNOS_MOUT_AUDSS>, 94 92 <&clock_audss EXYNOS_MOUT_I2S>; 95 93 clock-names = "iis", "i2s_opclk0", "i2s_opclk1", 96 - "mout_audss", "mout_i2s"; 94 + "mout_audss", "mout_i2s"; 97 95 };
+13 -8
Documentation/devicetree/bindings/clock/exynos5410-clock.txt
··· 12 12 13 13 - #clock-cells: should be 1. 14 14 15 + - clocks: should contain an entry specifying the root clock from external 16 + oscillator supplied through XXTI or XusbXTI pin. This clock should be 17 + defined using standard clock bindings with "fin_pll" clock-output-name. 18 + That clock is being passed internally to the 9 PLLs. 19 + 15 20 All available clocks are defined as preprocessor macros in 16 21 dt-bindings/clock/exynos5410.h header and can be used in device 17 22 tree sources. 18 23 19 - External clock: 20 - 21 - There is clock that is generated outside the SoC. It 22 - is expected that it is defined using standard clock bindings 23 - with following clock-output-name: 24 - 25 - - "fin_pll" - PLL input clock from XXTI 26 - 27 24 Example 1: An example of a clock controller node is listed below. 25 + 26 + fin_pll: xxti { 27 + compatible = "fixed-clock"; 28 + clock-frequency = <24000000>; 29 + clock-output-names = "fin_pll"; 30 + #clock-cells = <0>; 31 + }; 28 32 29 33 clock: clock-controller@0x10010000 { 30 34 compatible = "samsung,exynos5410-clock"; 31 35 reg = <0x10010000 0x30000>; 32 36 #clock-cells = <1>; 37 + clocks = <&fin_pll>; 33 38 }; 34 39 35 40 Example 2: UART controller node that consumes the clock generated by the clock
+3
MAINTAINERS
··· 10240 10240 SAMSUNG SOC CLOCK DRIVERS 10241 10241 M: Sylwester Nawrocki <s.nawrocki@samsung.com> 10242 10242 M: Tomasz Figa <tomasz.figa@gmail.com> 10243 + M: Chanwoo Choi <cw00.choi@samsung.com> 10243 10244 S: Supported 10244 10245 L: linux-samsung-soc@vger.kernel.org (moderated for non-subscribers) 10245 10246 F: drivers/clk/samsung/ 10247 + F: include/dt-bindings/clock/exynos*.h 10248 + F: Documentation/devicetree/bindings/clock/exynos*.txt 10246 10249 10247 10250 SAMSUNG SXGBE DRIVERS 10248 10251 M: Byungho An <bh74.an@samsung.com>
+50 -34
drivers/clk/samsung/clk-exynos-audss.c
··· 14 14 #include <linux/clk.h> 15 15 #include <linux/clk-provider.h> 16 16 #include <linux/of_address.h> 17 + #include <linux/of_device.h> 17 18 #include <linux/syscore_ops.h> 18 19 #include <linux/module.h> 19 20 #include <linux/platform_device.h> 20 21 21 22 #include <dt-bindings/clock/exynos-audss-clk.h> 22 - 23 - enum exynos_audss_clk_type { 24 - TYPE_EXYNOS4210, 25 - TYPE_EXYNOS5250, 26 - TYPE_EXYNOS5420, 27 - }; 28 23 29 24 static DEFINE_SPINLOCK(lock); 30 25 static struct clk **clk_table; ··· 39 44 40 45 #ifdef CONFIG_PM_SLEEP 41 46 static unsigned long reg_save[][2] = { 42 - {ASS_CLK_SRC, 0}, 43 - {ASS_CLK_DIV, 0}, 44 - {ASS_CLK_GATE, 0}, 47 + { ASS_CLK_SRC, 0 }, 48 + { ASS_CLK_DIV, 0 }, 49 + { ASS_CLK_GATE, 0 }, 45 50 }; 46 51 47 52 static int exynos_audss_clk_suspend(void) ··· 68 73 }; 69 74 #endif /* CONFIG_PM_SLEEP */ 70 75 76 + struct exynos_audss_clk_drvdata { 77 + unsigned int has_adma_clk:1; 78 + unsigned int has_mst_clk:1; 79 + unsigned int enable_epll:1; 80 + unsigned int num_clks; 81 + }; 82 + 83 + static const struct exynos_audss_clk_drvdata exynos4210_drvdata = { 84 + .num_clks = EXYNOS_AUDSS_MAX_CLKS - 1, 85 + }; 86 + 87 + static const struct exynos_audss_clk_drvdata exynos5410_drvdata = { 88 + .num_clks = EXYNOS_AUDSS_MAX_CLKS - 1, 89 + .has_mst_clk = 1, 90 + }; 91 + 92 + static const struct exynos_audss_clk_drvdata exynos5420_drvdata = { 93 + .num_clks = EXYNOS_AUDSS_MAX_CLKS, 94 + .has_adma_clk = 1, 95 + .enable_epll = 1, 96 + }; 97 + 71 98 static const struct of_device_id exynos_audss_clk_of_match[] = { 72 - { .compatible = "samsung,exynos4210-audss-clock", 73 - .data = (void *)TYPE_EXYNOS4210, }, 74 - { .compatible = "samsung,exynos5250-audss-clock", 75 - .data = (void *)TYPE_EXYNOS5250, }, 76 - { .compatible = "samsung,exynos5420-audss-clock", 77 - .data = (void *)TYPE_EXYNOS5420, }, 78 - {}, 99 + { 100 + .compatible = "samsung,exynos4210-audss-clock", 101 + .data = &exynos4210_drvdata, 102 + }, { 103 + .compatible = "samsung,exynos5250-audss-clock", 104 + .data = &exynos4210_drvdata, 105 + }, { 106 + .compatible = "samsung,exynos5410-audss-clock", 107 + .data = &exynos5410_drvdata, 108 + }, { 109 + .compatible = "samsung,exynos5420-audss-clock", 110 + .data = &exynos5420_drvdata, 111 + }, 112 + { }, 79 113 }; 80 114 81 115 static void exynos_audss_clk_teardown(void) ··· 130 106 /* register exynos_audss clocks */ 131 107 static int exynos_audss_clk_probe(struct platform_device *pdev) 132 108 { 133 - int i, ret = 0; 134 - struct resource *res; 135 109 const char *mout_audss_p[] = {"fin_pll", "fout_epll"}; 136 110 const char *mout_i2s_p[] = {"mout_audss", "cdclk0", "sclk_audio0"}; 137 111 const char *sclk_pcm_p = "sclk_pcm0"; 138 112 struct clk *pll_ref, *pll_in, *cdclk, *sclk_audio, *sclk_pcm_in; 139 - const struct of_device_id *match; 140 - enum exynos_audss_clk_type variant; 113 + const struct exynos_audss_clk_drvdata *variant; 114 + struct resource *res; 115 + int i, ret = 0; 141 116 142 - match = of_match_node(exynos_audss_clk_of_match, pdev->dev.of_node); 143 - if (!match) 117 + variant = of_device_get_match_data(&pdev->dev); 118 + if (!variant) 144 119 return -EINVAL; 145 - variant = (enum exynos_audss_clk_type)match->data; 146 120 147 121 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 148 122 reg_base = devm_ioremap_resource(&pdev->dev, res); ··· 148 126 dev_err(&pdev->dev, "failed to map audss registers\n"); 149 127 return PTR_ERR(reg_base); 150 128 } 151 - /* EPLL don't have to be enabled for boards other than Exynos5420 */ 129 + 152 130 epll = ERR_PTR(-ENODEV); 153 131 154 132 clk_table = devm_kzalloc(&pdev->dev, ··· 158 136 return -ENOMEM; 159 137 160 138 clk_data.clks = clk_table; 161 - if (variant == TYPE_EXYNOS5420) 162 - clk_data.clk_num = EXYNOS_AUDSS_MAX_CLKS; 163 - else 164 - clk_data.clk_num = EXYNOS_AUDSS_MAX_CLKS - 1; 139 + clk_data.clk_num = variant->num_clks; 165 140 166 141 pll_ref = devm_clk_get(&pdev->dev, "pll_ref"); 167 142 pll_in = devm_clk_get(&pdev->dev, "pll_in"); ··· 167 148 if (!IS_ERR(pll_in)) { 168 149 mout_audss_p[1] = __clk_get_name(pll_in); 169 150 170 - if (variant == TYPE_EXYNOS5420) { 151 + if (variant->enable_epll) { 171 152 epll = pll_in; 172 153 173 154 ret = clk_prepare_enable(epll); 174 155 if (ret) { 175 156 dev_err(&pdev->dev, 176 - "failed to prepare the epll clock\n"); 157 + "failed to prepare the epll clock\n"); 177 158 return ret; 178 159 } 179 160 } ··· 229 210 sclk_pcm_p, CLK_SET_RATE_PARENT, 230 211 reg_base + ASS_CLK_GATE, 5, 0, &lock); 231 212 232 - if (variant == TYPE_EXYNOS5420) { 213 + if (variant->has_adma_clk) { 233 214 clk_table[EXYNOS_ADMA] = clk_register_gate(NULL, "adma", 234 215 "dout_srp", CLK_SET_RATE_PARENT, 235 216 reg_base + ASS_CLK_GATE, 9, 0, &lock); ··· 253 234 #ifdef CONFIG_PM_SLEEP 254 235 register_syscore_ops(&exynos_audss_clk_syscore_ops); 255 236 #endif 256 - 257 - dev_info(&pdev->dev, "setup completed\n"); 258 - 259 237 return 0; 260 238 261 239 unregister:
+175 -175
drivers/clk/samsung/clk-exynos5260.c
··· 131 131 EN_IP_AUD, 4, 0, 0), 132 132 }; 133 133 134 + static const struct samsung_cmu_info aud_cmu __initconst = { 135 + .mux_clks = aud_mux_clks, 136 + .nr_mux_clks = ARRAY_SIZE(aud_mux_clks), 137 + .div_clks = aud_div_clks, 138 + .nr_div_clks = ARRAY_SIZE(aud_div_clks), 139 + .gate_clks = aud_gate_clks, 140 + .nr_gate_clks = ARRAY_SIZE(aud_gate_clks), 141 + .nr_clk_ids = AUD_NR_CLK, 142 + .clk_regs = aud_clk_regs, 143 + .nr_clk_regs = ARRAY_SIZE(aud_clk_regs), 144 + }; 145 + 134 146 static void __init exynos5260_clk_aud_init(struct device_node *np) 135 147 { 136 - struct samsung_cmu_info cmu = { NULL }; 137 - 138 - cmu.mux_clks = aud_mux_clks; 139 - cmu.nr_mux_clks = ARRAY_SIZE(aud_mux_clks); 140 - cmu.div_clks = aud_div_clks; 141 - cmu.nr_div_clks = ARRAY_SIZE(aud_div_clks); 142 - cmu.gate_clks = aud_gate_clks; 143 - cmu.nr_gate_clks = ARRAY_SIZE(aud_gate_clks); 144 - cmu.nr_clk_ids = AUD_NR_CLK; 145 - cmu.clk_regs = aud_clk_regs; 146 - cmu.nr_clk_regs = ARRAY_SIZE(aud_clk_regs); 147 - 148 - samsung_cmu_register_one(np, &cmu); 148 + samsung_cmu_register_one(np, &aud_cmu); 149 149 } 150 150 151 151 CLK_OF_DECLARE(exynos5260_clk_aud, "samsung,exynos5260-clock-aud", ··· 321 321 EN_IP_DISP, 25, 0, 0), 322 322 }; 323 323 324 + static const struct samsung_cmu_info disp_cmu __initconst = { 325 + .mux_clks = disp_mux_clks, 326 + .nr_mux_clks = ARRAY_SIZE(disp_mux_clks), 327 + .div_clks = disp_div_clks, 328 + .nr_div_clks = ARRAY_SIZE(disp_div_clks), 329 + .gate_clks = disp_gate_clks, 330 + .nr_gate_clks = ARRAY_SIZE(disp_gate_clks), 331 + .nr_clk_ids = DISP_NR_CLK, 332 + .clk_regs = disp_clk_regs, 333 + .nr_clk_regs = ARRAY_SIZE(disp_clk_regs), 334 + }; 335 + 324 336 static void __init exynos5260_clk_disp_init(struct device_node *np) 325 337 { 326 - struct samsung_cmu_info cmu = { NULL }; 327 - 328 - cmu.mux_clks = disp_mux_clks; 329 - cmu.nr_mux_clks = ARRAY_SIZE(disp_mux_clks); 330 - cmu.div_clks = disp_div_clks; 331 - cmu.nr_div_clks = ARRAY_SIZE(disp_div_clks); 332 - cmu.gate_clks = disp_gate_clks; 333 - cmu.nr_gate_clks = ARRAY_SIZE(disp_gate_clks); 334 - cmu.nr_clk_ids = DISP_NR_CLK; 335 - cmu.clk_regs = disp_clk_regs; 336 - cmu.nr_clk_regs = ARRAY_SIZE(disp_clk_regs); 337 - 338 - samsung_cmu_register_one(np, &cmu); 338 + samsung_cmu_register_one(np, &disp_cmu); 339 339 } 340 340 341 341 CLK_OF_DECLARE(exynos5260_clk_disp, "samsung,exynos5260-clock-disp", ··· 385 385 pll2550_24mhz_tbl), 386 386 }; 387 387 388 + static const struct samsung_cmu_info egl_cmu __initconst = { 389 + .pll_clks = egl_pll_clks, 390 + .nr_pll_clks = ARRAY_SIZE(egl_pll_clks), 391 + .mux_clks = egl_mux_clks, 392 + .nr_mux_clks = ARRAY_SIZE(egl_mux_clks), 393 + .div_clks = egl_div_clks, 394 + .nr_div_clks = ARRAY_SIZE(egl_div_clks), 395 + .nr_clk_ids = EGL_NR_CLK, 396 + .clk_regs = egl_clk_regs, 397 + .nr_clk_regs = ARRAY_SIZE(egl_clk_regs), 398 + }; 399 + 388 400 static void __init exynos5260_clk_egl_init(struct device_node *np) 389 401 { 390 - struct samsung_cmu_info cmu = { NULL }; 391 - 392 - cmu.pll_clks = egl_pll_clks; 393 - cmu.nr_pll_clks = ARRAY_SIZE(egl_pll_clks); 394 - cmu.mux_clks = egl_mux_clks; 395 - cmu.nr_mux_clks = ARRAY_SIZE(egl_mux_clks); 396 - cmu.div_clks = egl_div_clks; 397 - cmu.nr_div_clks = ARRAY_SIZE(egl_div_clks); 398 - cmu.nr_clk_ids = EGL_NR_CLK; 399 - cmu.clk_regs = egl_clk_regs; 400 - cmu.nr_clk_regs = ARRAY_SIZE(egl_clk_regs); 401 - 402 - samsung_cmu_register_one(np, &cmu); 402 + samsung_cmu_register_one(np, &egl_cmu); 403 403 } 404 404 405 405 CLK_OF_DECLARE(exynos5260_clk_egl, "samsung,exynos5260-clock-egl", ··· 487 487 EN_IP_FSYS_SECURE_SMMU_RTIC, 12, 0, 0), 488 488 }; 489 489 490 + static const struct samsung_cmu_info fsys_cmu __initconst = { 491 + .mux_clks = fsys_mux_clks, 492 + .nr_mux_clks = ARRAY_SIZE(fsys_mux_clks), 493 + .gate_clks = fsys_gate_clks, 494 + .nr_gate_clks = ARRAY_SIZE(fsys_gate_clks), 495 + .nr_clk_ids = FSYS_NR_CLK, 496 + .clk_regs = fsys_clk_regs, 497 + .nr_clk_regs = ARRAY_SIZE(fsys_clk_regs), 498 + }; 499 + 490 500 static void __init exynos5260_clk_fsys_init(struct device_node *np) 491 501 { 492 - struct samsung_cmu_info cmu = { NULL }; 493 - 494 - cmu.mux_clks = fsys_mux_clks; 495 - cmu.nr_mux_clks = ARRAY_SIZE(fsys_mux_clks); 496 - cmu.gate_clks = fsys_gate_clks; 497 - cmu.nr_gate_clks = ARRAY_SIZE(fsys_gate_clks); 498 - cmu.nr_clk_ids = FSYS_NR_CLK; 499 - cmu.clk_regs = fsys_clk_regs; 500 - cmu.nr_clk_regs = ARRAY_SIZE(fsys_clk_regs); 501 - 502 - samsung_cmu_register_one(np, &cmu); 502 + samsung_cmu_register_one(np, &fsys_cmu); 503 503 } 504 504 505 505 CLK_OF_DECLARE(exynos5260_clk_fsys, "samsung,exynos5260-clock-fsys", ··· 576 576 EN_IP_G2D_SECURE_SMMU_G2D, 15, 0, 0), 577 577 }; 578 578 579 + static const struct samsung_cmu_info g2d_cmu __initconst = { 580 + .mux_clks = g2d_mux_clks, 581 + .nr_mux_clks = ARRAY_SIZE(g2d_mux_clks), 582 + .div_clks = g2d_div_clks, 583 + .nr_div_clks = ARRAY_SIZE(g2d_div_clks), 584 + .gate_clks = g2d_gate_clks, 585 + .nr_gate_clks = ARRAY_SIZE(g2d_gate_clks), 586 + .nr_clk_ids = G2D_NR_CLK, 587 + .clk_regs = g2d_clk_regs, 588 + .nr_clk_regs = ARRAY_SIZE(g2d_clk_regs), 589 + }; 590 + 579 591 static void __init exynos5260_clk_g2d_init(struct device_node *np) 580 592 { 581 - struct samsung_cmu_info cmu = { NULL }; 582 - 583 - cmu.mux_clks = g2d_mux_clks; 584 - cmu.nr_mux_clks = ARRAY_SIZE(g2d_mux_clks); 585 - cmu.div_clks = g2d_div_clks; 586 - cmu.nr_div_clks = ARRAY_SIZE(g2d_div_clks); 587 - cmu.gate_clks = g2d_gate_clks; 588 - cmu.nr_gate_clks = ARRAY_SIZE(g2d_gate_clks); 589 - cmu.nr_clk_ids = G2D_NR_CLK; 590 - cmu.clk_regs = g2d_clk_regs; 591 - cmu.nr_clk_regs = ARRAY_SIZE(g2d_clk_regs); 592 - 593 - samsung_cmu_register_one(np, &cmu); 593 + samsung_cmu_register_one(np, &g2d_cmu); 594 594 } 595 595 596 596 CLK_OF_DECLARE(exynos5260_clk_g2d, "samsung,exynos5260-clock-g2d", ··· 637 637 pll2550_24mhz_tbl), 638 638 }; 639 639 640 + static const struct samsung_cmu_info g3d_cmu __initconst = { 641 + .pll_clks = g3d_pll_clks, 642 + .nr_pll_clks = ARRAY_SIZE(g3d_pll_clks), 643 + .mux_clks = g3d_mux_clks, 644 + .nr_mux_clks = ARRAY_SIZE(g3d_mux_clks), 645 + .div_clks = g3d_div_clks, 646 + .nr_div_clks = ARRAY_SIZE(g3d_div_clks), 647 + .gate_clks = g3d_gate_clks, 648 + .nr_gate_clks = ARRAY_SIZE(g3d_gate_clks), 649 + .nr_clk_ids = G3D_NR_CLK, 650 + .clk_regs = g3d_clk_regs, 651 + .nr_clk_regs = ARRAY_SIZE(g3d_clk_regs), 652 + }; 653 + 640 654 static void __init exynos5260_clk_g3d_init(struct device_node *np) 641 655 { 642 - struct samsung_cmu_info cmu = { NULL }; 643 - 644 - cmu.pll_clks = g3d_pll_clks; 645 - cmu.nr_pll_clks = ARRAY_SIZE(g3d_pll_clks); 646 - cmu.mux_clks = g3d_mux_clks; 647 - cmu.nr_mux_clks = ARRAY_SIZE(g3d_mux_clks); 648 - cmu.div_clks = g3d_div_clks; 649 - cmu.nr_div_clks = ARRAY_SIZE(g3d_div_clks); 650 - cmu.gate_clks = g3d_gate_clks; 651 - cmu.nr_gate_clks = ARRAY_SIZE(g3d_gate_clks); 652 - cmu.nr_clk_ids = G3D_NR_CLK; 653 - cmu.clk_regs = g3d_clk_regs; 654 - cmu.nr_clk_regs = ARRAY_SIZE(g3d_clk_regs); 655 - 656 - samsung_cmu_register_one(np, &cmu); 656 + samsung_cmu_register_one(np, &g3d_cmu); 657 657 } 658 658 659 659 CLK_OF_DECLARE(exynos5260_clk_g3d, "samsung,exynos5260-clock-g3d", ··· 772 772 EN_IP_GSCL_SECURE_SMMU_MSCL1, 20, 0, 0), 773 773 }; 774 774 775 + static const struct samsung_cmu_info gscl_cmu __initconst = { 776 + .mux_clks = gscl_mux_clks, 777 + .nr_mux_clks = ARRAY_SIZE(gscl_mux_clks), 778 + .div_clks = gscl_div_clks, 779 + .nr_div_clks = ARRAY_SIZE(gscl_div_clks), 780 + .gate_clks = gscl_gate_clks, 781 + .nr_gate_clks = ARRAY_SIZE(gscl_gate_clks), 782 + .nr_clk_ids = GSCL_NR_CLK, 783 + .clk_regs = gscl_clk_regs, 784 + .nr_clk_regs = ARRAY_SIZE(gscl_clk_regs), 785 + }; 786 + 775 787 static void __init exynos5260_clk_gscl_init(struct device_node *np) 776 788 { 777 - struct samsung_cmu_info cmu = { NULL }; 778 - 779 - cmu.mux_clks = gscl_mux_clks; 780 - cmu.nr_mux_clks = ARRAY_SIZE(gscl_mux_clks); 781 - cmu.div_clks = gscl_div_clks; 782 - cmu.nr_div_clks = ARRAY_SIZE(gscl_div_clks); 783 - cmu.gate_clks = gscl_gate_clks; 784 - cmu.nr_gate_clks = ARRAY_SIZE(gscl_gate_clks); 785 - cmu.nr_clk_ids = GSCL_NR_CLK; 786 - cmu.clk_regs = gscl_clk_regs; 787 - cmu.nr_clk_regs = ARRAY_SIZE(gscl_clk_regs); 788 - 789 - samsung_cmu_register_one(np, &cmu); 789 + samsung_cmu_register_one(np, &gscl_cmu); 790 790 } 791 791 792 792 CLK_OF_DECLARE(exynos5260_clk_gscl, "samsung,exynos5260-clock-gscl", ··· 891 891 EN_SCLK_ISP, 9, CLK_SET_RATE_PARENT, 0), 892 892 }; 893 893 894 + static const struct samsung_cmu_info isp_cmu __initconst = { 895 + .mux_clks = isp_mux_clks, 896 + .nr_mux_clks = ARRAY_SIZE(isp_mux_clks), 897 + .div_clks = isp_div_clks, 898 + .nr_div_clks = ARRAY_SIZE(isp_div_clks), 899 + .gate_clks = isp_gate_clks, 900 + .nr_gate_clks = ARRAY_SIZE(isp_gate_clks), 901 + .nr_clk_ids = ISP_NR_CLK, 902 + .clk_regs = isp_clk_regs, 903 + .nr_clk_regs = ARRAY_SIZE(isp_clk_regs), 904 + }; 905 + 894 906 static void __init exynos5260_clk_isp_init(struct device_node *np) 895 907 { 896 - struct samsung_cmu_info cmu = { NULL }; 897 - 898 - cmu.mux_clks = isp_mux_clks; 899 - cmu.nr_mux_clks = ARRAY_SIZE(isp_mux_clks); 900 - cmu.div_clks = isp_div_clks; 901 - cmu.nr_div_clks = ARRAY_SIZE(isp_div_clks); 902 - cmu.gate_clks = isp_gate_clks; 903 - cmu.nr_gate_clks = ARRAY_SIZE(isp_gate_clks); 904 - cmu.nr_clk_ids = ISP_NR_CLK; 905 - cmu.clk_regs = isp_clk_regs; 906 - cmu.nr_clk_regs = ARRAY_SIZE(isp_clk_regs); 907 - 908 - samsung_cmu_register_one(np, &cmu); 908 + samsung_cmu_register_one(np, &isp_cmu); 909 909 } 910 910 911 911 CLK_OF_DECLARE(exynos5260_clk_isp, "samsung,exynos5260-clock-isp", ··· 955 955 pll2550_24mhz_tbl), 956 956 }; 957 957 958 + static const struct samsung_cmu_info kfc_cmu __initconst = { 959 + .pll_clks = kfc_pll_clks, 960 + .nr_pll_clks = ARRAY_SIZE(kfc_pll_clks), 961 + .mux_clks = kfc_mux_clks, 962 + .nr_mux_clks = ARRAY_SIZE(kfc_mux_clks), 963 + .div_clks = kfc_div_clks, 964 + .nr_div_clks = ARRAY_SIZE(kfc_div_clks), 965 + .nr_clk_ids = KFC_NR_CLK, 966 + .clk_regs = kfc_clk_regs, 967 + .nr_clk_regs = ARRAY_SIZE(kfc_clk_regs), 968 + }; 969 + 958 970 static void __init exynos5260_clk_kfc_init(struct device_node *np) 959 971 { 960 - struct samsung_cmu_info cmu = { NULL }; 961 - 962 - cmu.pll_clks = kfc_pll_clks; 963 - cmu.nr_pll_clks = ARRAY_SIZE(kfc_pll_clks); 964 - cmu.mux_clks = kfc_mux_clks; 965 - cmu.nr_mux_clks = ARRAY_SIZE(kfc_mux_clks); 966 - cmu.div_clks = kfc_div_clks; 967 - cmu.nr_div_clks = ARRAY_SIZE(kfc_div_clks); 968 - cmu.nr_clk_ids = KFC_NR_CLK; 969 - cmu.clk_regs = kfc_clk_regs; 970 - cmu.nr_clk_regs = ARRAY_SIZE(kfc_clk_regs); 971 - 972 - samsung_cmu_register_one(np, &cmu); 972 + samsung_cmu_register_one(np, &kfc_cmu); 973 973 } 974 974 975 975 CLK_OF_DECLARE(exynos5260_clk_kfc, "samsung,exynos5260-clock-kfc", ··· 1011 1011 EN_IP_MFC_SECURE_SMMU2_MFC, 7, 0, 0), 1012 1012 }; 1013 1013 1014 + static const struct samsung_cmu_info mfc_cmu __initconst = { 1015 + .mux_clks = mfc_mux_clks, 1016 + .nr_mux_clks = ARRAY_SIZE(mfc_mux_clks), 1017 + .div_clks = mfc_div_clks, 1018 + .nr_div_clks = ARRAY_SIZE(mfc_div_clks), 1019 + .gate_clks = mfc_gate_clks, 1020 + .nr_gate_clks = ARRAY_SIZE(mfc_gate_clks), 1021 + .nr_clk_ids = MFC_NR_CLK, 1022 + .clk_regs = mfc_clk_regs, 1023 + .nr_clk_regs = ARRAY_SIZE(mfc_clk_regs), 1024 + }; 1025 + 1014 1026 static void __init exynos5260_clk_mfc_init(struct device_node *np) 1015 1027 { 1016 - struct samsung_cmu_info cmu = { NULL }; 1017 - 1018 - cmu.mux_clks = mfc_mux_clks; 1019 - cmu.nr_mux_clks = ARRAY_SIZE(mfc_mux_clks); 1020 - cmu.div_clks = mfc_div_clks; 1021 - cmu.nr_div_clks = ARRAY_SIZE(mfc_div_clks); 1022 - cmu.gate_clks = mfc_gate_clks; 1023 - cmu.nr_gate_clks = ARRAY_SIZE(mfc_gate_clks); 1024 - cmu.nr_clk_ids = MFC_NR_CLK; 1025 - cmu.clk_regs = mfc_clk_regs; 1026 - cmu.nr_clk_regs = ARRAY_SIZE(mfc_clk_regs); 1027 - 1028 - samsung_cmu_register_one(np, &cmu); 1028 + samsung_cmu_register_one(np, &mfc_cmu); 1029 1029 } 1030 1030 1031 1031 CLK_OF_DECLARE(exynos5260_clk_mfc, "samsung,exynos5260-clock-mfc", ··· 1158 1158 pll2550_24mhz_tbl), 1159 1159 }; 1160 1160 1161 + static const struct samsung_cmu_info mif_cmu __initconst = { 1162 + .pll_clks = mif_pll_clks, 1163 + .nr_pll_clks = ARRAY_SIZE(mif_pll_clks), 1164 + .mux_clks = mif_mux_clks, 1165 + .nr_mux_clks = ARRAY_SIZE(mif_mux_clks), 1166 + .div_clks = mif_div_clks, 1167 + .nr_div_clks = ARRAY_SIZE(mif_div_clks), 1168 + .gate_clks = mif_gate_clks, 1169 + .nr_gate_clks = ARRAY_SIZE(mif_gate_clks), 1170 + .nr_clk_ids = MIF_NR_CLK, 1171 + .clk_regs = mif_clk_regs, 1172 + .nr_clk_regs = ARRAY_SIZE(mif_clk_regs), 1173 + }; 1174 + 1161 1175 static void __init exynos5260_clk_mif_init(struct device_node *np) 1162 1176 { 1163 - struct samsung_cmu_info cmu = { NULL }; 1164 - 1165 - cmu.pll_clks = mif_pll_clks; 1166 - cmu.nr_pll_clks = ARRAY_SIZE(mif_pll_clks); 1167 - cmu.mux_clks = mif_mux_clks; 1168 - cmu.nr_mux_clks = ARRAY_SIZE(mif_mux_clks); 1169 - cmu.div_clks = mif_div_clks; 1170 - cmu.nr_div_clks = ARRAY_SIZE(mif_div_clks); 1171 - cmu.gate_clks = mif_gate_clks; 1172 - cmu.nr_gate_clks = ARRAY_SIZE(mif_gate_clks); 1173 - cmu.nr_clk_ids = MIF_NR_CLK; 1174 - cmu.clk_regs = mif_clk_regs; 1175 - cmu.nr_clk_regs = ARRAY_SIZE(mif_clk_regs); 1176 - 1177 - samsung_cmu_register_one(np, &cmu); 1177 + samsung_cmu_register_one(np, &mif_cmu); 1178 1178 } 1179 1179 1180 1180 CLK_OF_DECLARE(exynos5260_clk_mif, "samsung,exynos5260-clock-mif", ··· 1366 1366 EN_IP_PERI_SECURE_TZPC, 20, 0, 0), 1367 1367 }; 1368 1368 1369 + static const struct samsung_cmu_info peri_cmu __initconst = { 1370 + .mux_clks = peri_mux_clks, 1371 + .nr_mux_clks = ARRAY_SIZE(peri_mux_clks), 1372 + .div_clks = peri_div_clks, 1373 + .nr_div_clks = ARRAY_SIZE(peri_div_clks), 1374 + .gate_clks = peri_gate_clks, 1375 + .nr_gate_clks = ARRAY_SIZE(peri_gate_clks), 1376 + .nr_clk_ids = PERI_NR_CLK, 1377 + .clk_regs = peri_clk_regs, 1378 + .nr_clk_regs = ARRAY_SIZE(peri_clk_regs), 1379 + }; 1380 + 1369 1381 static void __init exynos5260_clk_peri_init(struct device_node *np) 1370 1382 { 1371 - struct samsung_cmu_info cmu = { NULL }; 1372 - 1373 - cmu.mux_clks = peri_mux_clks; 1374 - cmu.nr_mux_clks = ARRAY_SIZE(peri_mux_clks); 1375 - cmu.div_clks = peri_div_clks; 1376 - cmu.nr_div_clks = ARRAY_SIZE(peri_div_clks); 1377 - cmu.gate_clks = peri_gate_clks; 1378 - cmu.nr_gate_clks = ARRAY_SIZE(peri_gate_clks); 1379 - cmu.nr_clk_ids = PERI_NR_CLK; 1380 - cmu.clk_regs = peri_clk_regs; 1381 - cmu.nr_clk_regs = ARRAY_SIZE(peri_clk_regs); 1382 - 1383 - samsung_cmu_register_one(np, &cmu); 1383 + samsung_cmu_register_one(np, &peri_cmu); 1384 1384 } 1385 1385 1386 1386 CLK_OF_DECLARE(exynos5260_clk_peri, "samsung,exynos5260-clock-peri", ··· 1818 1818 pll2650_24mhz_tbl), 1819 1819 }; 1820 1820 1821 + static const struct samsung_cmu_info top_cmu __initconst = { 1822 + .pll_clks = top_pll_clks, 1823 + .nr_pll_clks = ARRAY_SIZE(top_pll_clks), 1824 + .mux_clks = top_mux_clks, 1825 + .nr_mux_clks = ARRAY_SIZE(top_mux_clks), 1826 + .div_clks = top_div_clks, 1827 + .nr_div_clks = ARRAY_SIZE(top_div_clks), 1828 + .gate_clks = top_gate_clks, 1829 + .nr_gate_clks = ARRAY_SIZE(top_gate_clks), 1830 + .fixed_clks = fixed_rate_clks, 1831 + .nr_fixed_clks = ARRAY_SIZE(fixed_rate_clks), 1832 + .nr_clk_ids = TOP_NR_CLK, 1833 + .clk_regs = top_clk_regs, 1834 + .nr_clk_regs = ARRAY_SIZE(top_clk_regs), 1835 + }; 1836 + 1821 1837 static void __init exynos5260_clk_top_init(struct device_node *np) 1822 1838 { 1823 - struct samsung_cmu_info cmu = { NULL }; 1824 - 1825 - cmu.pll_clks = top_pll_clks; 1826 - cmu.nr_pll_clks = ARRAY_SIZE(top_pll_clks); 1827 - cmu.mux_clks = top_mux_clks; 1828 - cmu.nr_mux_clks = ARRAY_SIZE(top_mux_clks); 1829 - cmu.div_clks = top_div_clks; 1830 - cmu.nr_div_clks = ARRAY_SIZE(top_div_clks); 1831 - cmu.gate_clks = top_gate_clks; 1832 - cmu.nr_gate_clks = ARRAY_SIZE(top_gate_clks); 1833 - cmu.fixed_clks = fixed_rate_clks; 1834 - cmu.nr_fixed_clks = ARRAY_SIZE(fixed_rate_clks); 1835 - cmu.nr_clk_ids = TOP_NR_CLK; 1836 - cmu.clk_regs = top_clk_regs; 1837 - cmu.nr_clk_regs = ARRAY_SIZE(top_clk_regs); 1838 - 1839 - samsung_cmu_register_one(np, &cmu); 1839 + samsung_cmu_register_one(np, &top_cmu); 1840 1840 } 1841 1841 1842 1842 CLK_OF_DECLARE(exynos5260_clk_top, "samsung,exynos5260-clock-top",
+41 -20
drivers/clk/samsung/clk-exynos5410.c
··· 14 14 #include <linux/clk-provider.h> 15 15 #include <linux/of.h> 16 16 #include <linux/of_address.h> 17 + #include <linux/clk.h> 17 18 18 19 #include "clk.h" 19 20 ··· 22 21 #define APLL_CON0 0x100 23 22 #define CPLL_LOCK 0x10020 24 23 #define CPLL_CON0 0x10120 24 + #define EPLL_LOCK 0x10040 25 + #define EPLL_CON0 0x10130 25 26 #define MPLL_LOCK 0x4000 26 27 #define MPLL_CON0 0x4100 27 28 #define BPLL_LOCK 0x20010 ··· 61 58 62 59 /* list of PLLs */ 63 60 enum exynos5410_plls { 64 - apll, cpll, mpll, 61 + apll, cpll, epll, mpll, 65 62 bpll, kpll, 66 63 nr_plls /* number of PLLs */ 67 64 }; ··· 70 67 PNAME(apll_p) = { "fin_pll", "fout_apll", }; 71 68 PNAME(bpll_p) = { "fin_pll", "fout_bpll", }; 72 69 PNAME(cpll_p) = { "fin_pll", "fout_cpll" }; 70 + PNAME(epll_p) = { "fin_pll", "fout_epll" }; 73 71 PNAME(mpll_p) = { "fin_pll", "fout_mpll", }; 74 72 PNAME(kpll_p) = { "fin_pll", "fout_kpll", }; 75 73 ··· 98 94 99 95 MUX(0, "sclk_bpll", bpll_p, SRC_CDREX, 0, 1), 100 96 MUX(0, "sclk_bpll_muxed", bpll_user_p, SRC_TOP2, 24, 1), 97 + 98 + MUX(0, "sclk_epll", epll_p, SRC_TOP2, 12, 1), 101 99 102 100 MUX(0, "sclk_cpll", cpll_p, SRC_TOP2, 8, 1), 103 101 ··· 182 176 GATE(CLK_MMC0, "sdmmc0", "aclk200", GATE_BUS_FSYS0, 12, 0, 0), 183 177 GATE(CLK_MMC1, "sdmmc1", "aclk200", GATE_BUS_FSYS0, 13, 0, 0), 184 178 GATE(CLK_MMC2, "sdmmc2", "aclk200", GATE_BUS_FSYS0, 14, 0, 0), 179 + GATE(CLK_PDMA1, "pdma1", "aclk200", GATE_BUS_FSYS0, 2, 0, 0), 180 + GATE(CLK_PDMA0, "pdma0", "aclk200", GATE_BUS_FSYS0, 1, 0, 0), 185 181 186 182 GATE(CLK_SCLK_USBPHY301, "sclk_usbphy301", "dout_usbphy301", 187 183 GATE_TOP_SCLK_FSYS, 7, CLK_SET_RATE_PARENT, 0), ··· 225 217 GATE(CLK_USBD301, "usbd301", "aclk200_fsys", GATE_IP_FSYS, 20, 0, 0), 226 218 }; 227 219 228 - static const struct samsung_pll_clock exynos5410_plls[nr_plls] __initconst = { 220 + static const struct samsung_pll_rate_table exynos5410_pll2550x_24mhz_tbl[] __initconst = { 221 + PLL_36XX_RATE(400000000U, 200, 3, 2, 0), 222 + PLL_36XX_RATE(333000000U, 111, 2, 2, 0), 223 + PLL_36XX_RATE(300000000U, 100, 2, 2, 0), 224 + PLL_36XX_RATE(266000000U, 266, 3, 3, 0), 225 + PLL_36XX_RATE(200000000U, 200, 3, 3, 0), 226 + PLL_36XX_RATE(192000000U, 192, 3, 3, 0), 227 + PLL_36XX_RATE(166000000U, 166, 3, 3, 0), 228 + PLL_36XX_RATE(133000000U, 266, 3, 4, 0), 229 + PLL_36XX_RATE(100000000U, 200, 3, 4, 0), 230 + PLL_36XX_RATE(66000000U, 176, 2, 5, 0), 231 + }; 232 + 233 + static struct samsung_pll_clock exynos5410_plls[nr_plls] __initdata = { 229 234 [apll] = PLL(pll_35xx, CLK_FOUT_APLL, "fout_apll", "fin_pll", APLL_LOCK, 230 235 APLL_CON0, NULL), 231 236 [cpll] = PLL(pll_35xx, CLK_FOUT_CPLL, "fout_cpll", "fin_pll", CPLL_LOCK, 232 237 CPLL_CON0, NULL), 238 + [epll] = PLL(pll_2650x, CLK_FOUT_EPLL, "fout_epll", "fin_pll", EPLL_LOCK, 239 + EPLL_CON0, NULL), 233 240 [mpll] = PLL(pll_35xx, CLK_FOUT_MPLL, "fout_mpll", "fin_pll", MPLL_LOCK, 234 241 MPLL_CON0, NULL), 235 242 [bpll] = PLL(pll_35xx, CLK_FOUT_BPLL, "fout_bpll", "fin_pll", BPLL_LOCK, ··· 253 230 KPLL_CON0, NULL), 254 231 }; 255 232 233 + static const struct samsung_cmu_info cmu __initconst = { 234 + .pll_clks = exynos5410_plls, 235 + .nr_pll_clks = ARRAY_SIZE(exynos5410_plls), 236 + .mux_clks = exynos5410_mux_clks, 237 + .nr_mux_clks = ARRAY_SIZE(exynos5410_mux_clks), 238 + .div_clks = exynos5410_div_clks, 239 + .nr_div_clks = ARRAY_SIZE(exynos5410_div_clks), 240 + .gate_clks = exynos5410_gate_clks, 241 + .nr_gate_clks = ARRAY_SIZE(exynos5410_gate_clks), 242 + .nr_clk_ids = CLK_NR_CLKS, 243 + }; 244 + 256 245 /* register exynos5410 clocks */ 257 246 static void __init exynos5410_clk_init(struct device_node *np) 258 247 { 259 - struct samsung_clk_provider *ctx; 260 - void __iomem *reg_base; 248 + struct clk *xxti = of_clk_get(np, 0); 261 249 262 - reg_base = of_iomap(np, 0); 263 - if (!reg_base) 264 - panic("%s: failed to map registers\n", __func__); 250 + if (!IS_ERR(xxti) && clk_get_rate(xxti) == 24 * MHZ) 251 + exynos5410_plls[epll].rate_table = exynos5410_pll2550x_24mhz_tbl; 265 252 266 - ctx = samsung_clk_init(np, reg_base, CLK_NR_CLKS); 267 - 268 - samsung_clk_register_pll(ctx, exynos5410_plls, 269 - ARRAY_SIZE(exynos5410_plls), reg_base); 270 - 271 - samsung_clk_register_mux(ctx, exynos5410_mux_clks, 272 - ARRAY_SIZE(exynos5410_mux_clks)); 273 - samsung_clk_register_div(ctx, exynos5410_div_clks, 274 - ARRAY_SIZE(exynos5410_div_clks)); 275 - samsung_clk_register_gate(ctx, exynos5410_gate_clks, 276 - ARRAY_SIZE(exynos5410_gate_clks)); 277 - 278 - samsung_clk_of_add_provider(np, ctx); 253 + samsung_cmu_register_one(np, &cmu); 279 254 280 255 pr_debug("Exynos5410: clock setup completed.\n"); 281 256 }
+37
drivers/clk/samsung/clk-exynos5420.c
··· 131 131 #define TOP_SPARE2 0x10b08 132 132 #define BPLL_LOCK 0x20010 133 133 #define BPLL_CON0 0x20110 134 + #define SRC_CDREX 0x20200 135 + #define DIV_CDREX0 0x20500 136 + #define DIV_CDREX1 0x20504 134 137 #define KPLL_LOCK 0x28000 135 138 #define KPLL_CON0 0x28100 136 139 #define SRC_KFC 0x28200 ··· 247 244 GATE_TOP_SCLK_FSYS, 248 245 GATE_TOP_SCLK_PERIC, 249 246 TOP_SPARE2, 247 + SRC_CDREX, 248 + DIV_CDREX0, 249 + DIV_CDREX1, 250 250 SRC_KFC, 251 251 DIV_KFC0, 252 252 }; ··· 454 448 "mout_sclk_epll", "mout_sclk_rpll"}; 455 449 PNAME(mout_mau_epll_clk_p) = {"mout_sclk_epll", "mout_sclk_dpll", 456 450 "mout_sclk_mpll", "mout_sclk_spll"}; 451 + PNAME(mout_mclk_cdrex_p) = {"mout_bpll", "mout_mx_mspll_ccore"}; 452 + 457 453 /* List of parents specific to exynos5800 */ 458 454 PNAME(mout_epll2_5800_p) = { "mout_sclk_epll", "ff_dout_epll2" }; 459 455 PNAME(mout_group1_5800_p) = { "mout_sclk_cpll", "mout_sclk_dpll", ··· 473 465 PNAME(mout_group7_5800_p) = { "mout_sclk_cpll", "mout_sclk_dpll", 474 466 "mout_sclk_mpll", "mout_sclk_spll", 475 467 "mout_epll2", "mout_sclk_ipll" }; 468 + PNAME(mout_mx_mspll_ccore_p) = {"sclk_bpll", "mout_sclk_dpll", 469 + "mout_sclk_mpll", "ff_dout_spll2", 470 + "mout_sclk_spll", "mout_sclk_epll"}; 476 471 PNAME(mout_mau_epll_clk_5800_p) = { "mout_sclk_epll", "mout_sclk_dpll", 477 472 "mout_sclk_mpll", 478 473 "ff_dout_spll2" }; ··· 534 523 MUX(0, "mout_aclk300_disp1", mout_group5_5800_p, SRC_TOP2, 24, 2), 535 524 MUX(0, "mout_aclk300_gscl", mout_group5_5800_p, SRC_TOP2, 28, 2), 536 525 526 + MUX(CLK_MOUT_MX_MSPLL_CCORE, "mout_mx_mspll_ccore", 527 + mout_mx_mspll_ccore_p, SRC_TOP7, 16, 2), 537 528 MUX(0, "mout_mau_epll_clk", mout_mau_epll_clk_5800_p, SRC_TOP7, 538 529 20, 2), 539 530 MUX(0, "sclk_bpll", mout_bpll_p, SRC_TOP7, 24, 1), ··· 614 601 MUX(0, "mout_aclk300_disp1", mout_group1_p, SRC_TOP2, 24, 2), 615 602 MUX(0, "mout_aclk300_gscl", mout_group1_p, SRC_TOP2, 28, 2), 616 603 604 + MUX(CLK_MOUT_MX_MSPLL_CCORE, "mout_mx_mspll_ccore", 605 + mout_group5_5800_p, SRC_TOP7, 16, 2), 617 606 MUX(0, "mout_mau_epll_clk", mout_mau_epll_clk_p, SRC_TOP7, 20, 2), 618 607 619 608 MUX(0, "mout_fimd1", mout_group3_p, SRC_DISP10, 4, 1), ··· 759 744 760 745 MUX(0, "mout_fimd1_final", mout_fimd1_final_p, TOP_SPARE2, 8, 1), 761 746 747 + /* CDREX block */ 748 + MUX_F(CLK_MOUT_MCLK_CDREX, "mout_mclk_cdrex", mout_mclk_cdrex_p, 749 + SRC_CDREX, 4, 1, CLK_SET_RATE_PARENT, 0), 750 + MUX_F(CLK_MOUT_BPLL, "mout_bpll", mout_bpll_p, SRC_CDREX, 0, 1, 751 + CLK_SET_RATE_PARENT, 0), 752 + 762 753 /* MAU Block */ 763 754 MUX(CLK_MOUT_MAUDIO0, "mout_maudio0", mout_maudio0_p, SRC_MAU, 28, 3), 764 755 ··· 856 835 DIV(0, "dout_disp1_blk", "aclk200_disp1", DIV2_RATIO0, 16, 2), 857 836 DIV(CLK_DOUT_ACLK400_DISP1, "dout_aclk400_disp1", 858 837 "mout_aclk400_disp1", DIV_TOP2, 4, 3), 838 + 839 + /* CDREX Block */ 840 + DIV(CLK_DOUT_PCLK_CDREX, "dout_pclk_cdrex", "dout_aclk_cdrex1", 841 + DIV_CDREX0, 28, 3), 842 + DIV_F(CLK_DOUT_SCLK_CDREX, "dout_sclk_cdrex", "mout_mclk_cdrex", 843 + DIV_CDREX0, 24, 3, CLK_SET_RATE_PARENT, 0), 844 + DIV(CLK_DOUT_ACLK_CDREX1, "dout_aclk_cdrex1", "dout_clk2x_phy0", 845 + DIV_CDREX0, 16, 3), 846 + DIV(CLK_DOUT_CCLK_DREX0, "dout_cclk_drex0", "dout_clk2x_phy0", 847 + DIV_CDREX0, 8, 3), 848 + DIV(CLK_DOUT_CLK2X_PHY0, "dout_clk2x_phy0", "dout_sclk_cdrex", 849 + DIV_CDREX0, 3, 5), 850 + 851 + DIV(CLK_DOUT_PCLK_CORE_MEM, "dout_pclk_core_mem", "mout_mclk_cdrex", 852 + DIV_CDREX1, 8, 3), 859 853 860 854 /* Audio Block */ 861 855 DIV(0, "dout_maudio0", "mout_maudio0", DIV_MAU, 20, 4), ··· 1400 1364 if (_get_rate("fin_pll") == 24 * MHZ) { 1401 1365 exynos5x_plls[apll].rate_table = exynos5420_pll2550x_24mhz_tbl; 1402 1366 exynos5x_plls[kpll].rate_table = exynos5420_pll2550x_24mhz_tbl; 1367 + exynos5x_plls[bpll].rate_table = exynos5420_pll2550x_24mhz_tbl; 1403 1368 } 1404 1369 1405 1370 samsung_clk_register_pll(ctx, exynos5x_plls, ARRAY_SIZE(exynos5x_plls),
+7 -2
drivers/clk/samsung/clk-exynos5440.c
··· 112 112 .priority = 128, 113 113 }; 114 114 115 + static const struct samsung_pll_clock exynos5440_plls[] __initconst = { 116 + PLL(pll_2550x, CLK_CPLLA, "cplla", "xtal", 0, 0x4c, NULL), 117 + PLL(pll_2550x, CLK_CPLLB, "cpllb", "xtal", 0, 0x50, NULL), 118 + }; 119 + 115 120 /* register exynos5440 clocks */ 116 121 static void __init exynos5440_clk_init(struct device_node *np) 117 122 { ··· 134 129 samsung_clk_of_register_fixed_ext(ctx, exynos5440_fixed_rate_ext_clks, 135 130 ARRAY_SIZE(exynos5440_fixed_rate_ext_clks), ext_clk_match); 136 131 137 - samsung_clk_register_pll2550x("cplla", "xtal", reg_base + 0x1c, 0x10); 138 - samsung_clk_register_pll2550x("cpllb", "xtal", reg_base + 0x20, 0x10); 132 + samsung_clk_register_pll(ctx, exynos5440_plls, 133 + ARRAY_SIZE(exynos5440_plls), ctx->reg_base); 139 134 140 135 samsung_clk_register_fixed_rate(ctx, exynos5440_fixed_rate_clks, 141 136 ARRAY_SIZE(exynos5440_fixed_rate_clks));
+107 -47
drivers/clk/samsung/clk-pll.c
··· 890 890 #define PLL2550X_M_SHIFT (4) 891 891 #define PLL2550X_S_SHIFT (0) 892 892 893 - struct samsung_clk_pll2550x { 894 - struct clk_hw hw; 895 - const void __iomem *reg_base; 896 - unsigned long offset; 897 - }; 898 - 899 - #define to_clk_pll2550x(_hw) container_of(_hw, struct samsung_clk_pll2550x, hw) 900 - 901 893 static unsigned long samsung_pll2550x_recalc_rate(struct clk_hw *hw, 902 894 unsigned long parent_rate) 903 895 { 904 - struct samsung_clk_pll2550x *pll = to_clk_pll2550x(hw); 896 + struct samsung_clk_pll *pll = to_clk_pll(hw); 905 897 u32 r, p, m, s, pll_stat; 906 898 u64 fvco = parent_rate; 907 899 908 - pll_stat = readl_relaxed(pll->reg_base + pll->offset * 3); 900 + pll_stat = readl_relaxed(pll->con_reg); 909 901 r = (pll_stat >> PLL2550X_R_SHIFT) & PLL2550X_R_MASK; 910 902 if (!r) 911 903 return 0; ··· 914 922 static const struct clk_ops samsung_pll2550x_clk_ops = { 915 923 .recalc_rate = samsung_pll2550x_recalc_rate, 916 924 }; 917 - 918 - struct clk * __init samsung_clk_register_pll2550x(const char *name, 919 - const char *pname, const void __iomem *reg_base, 920 - const unsigned long offset) 921 - { 922 - struct samsung_clk_pll2550x *pll; 923 - struct clk *clk; 924 - struct clk_init_data init; 925 - 926 - pll = kzalloc(sizeof(*pll), GFP_KERNEL); 927 - if (!pll) { 928 - pr_err("%s: could not allocate pll clk %s\n", __func__, name); 929 - return NULL; 930 - } 931 - 932 - init.name = name; 933 - init.ops = &samsung_pll2550x_clk_ops; 934 - init.flags = CLK_GET_RATE_NOCACHE; 935 - init.parent_names = &pname; 936 - init.num_parents = 1; 937 - 938 - pll->hw.init = &init; 939 - pll->reg_base = reg_base; 940 - pll->offset = offset; 941 - 942 - clk = clk_register(NULL, &pll->hw); 943 - if (IS_ERR(clk)) { 944 - pr_err("%s: failed to register pll clock %s\n", __func__, 945 - name); 946 - kfree(pll); 947 - } 948 - 949 - if (clk_register_clkdev(clk, name, NULL)) 950 - pr_err("%s: failed to register lookup for %s", __func__, name); 951 - 952 - return clk; 953 - } 954 925 955 926 /* 956 927 * PLL2550xx Clock Type ··· 1015 1060 1016 1061 static const struct clk_ops samsung_pll2550xx_clk_min_ops = { 1017 1062 .recalc_rate = samsung_pll2550xx_recalc_rate, 1063 + }; 1064 + 1065 + /* 1066 + * PLL2650x Clock Type 1067 + */ 1068 + 1069 + /* Maximum lock time can be 3000 * PDIV cycles */ 1070 + #define PLL2650X_LOCK_FACTOR 3000 1071 + 1072 + #define PLL2650X_M_MASK 0x1ff 1073 + #define PLL2650X_P_MASK 0x3f 1074 + #define PLL2650X_S_MASK 0x7 1075 + #define PLL2650X_K_MASK 0xffff 1076 + #define PLL2650X_LOCK_STAT_MASK 0x1 1077 + #define PLL2650X_M_SHIFT 16 1078 + #define PLL2650X_P_SHIFT 8 1079 + #define PLL2650X_S_SHIFT 0 1080 + #define PLL2650X_K_SHIFT 0 1081 + #define PLL2650X_LOCK_STAT_SHIFT 29 1082 + #define PLL2650X_PLL_ENABLE_SHIFT 31 1083 + 1084 + static unsigned long samsung_pll2650x_recalc_rate(struct clk_hw *hw, 1085 + unsigned long parent_rate) 1086 + { 1087 + struct samsung_clk_pll *pll = to_clk_pll(hw); 1088 + u64 fout = parent_rate; 1089 + u32 mdiv, pdiv, sdiv, pll_con0, pll_con1; 1090 + s16 kdiv; 1091 + 1092 + pll_con0 = readl_relaxed(pll->con_reg); 1093 + mdiv = (pll_con0 >> PLL2650X_M_SHIFT) & PLL2650X_M_MASK; 1094 + pdiv = (pll_con0 >> PLL2650X_P_SHIFT) & PLL2650X_P_MASK; 1095 + sdiv = (pll_con0 >> PLL2650X_S_SHIFT) & PLL2650X_S_MASK; 1096 + 1097 + pll_con1 = readl_relaxed(pll->con_reg + 4); 1098 + kdiv = (s16)((pll_con1 >> PLL2650X_K_SHIFT) & PLL2650X_K_MASK); 1099 + 1100 + fout *= (mdiv << 16) + kdiv; 1101 + do_div(fout, (pdiv << sdiv)); 1102 + fout >>= 16; 1103 + 1104 + return (unsigned long)fout; 1105 + } 1106 + 1107 + static int samsung_pll2650x_set_rate(struct clk_hw *hw, unsigned long drate, 1108 + unsigned long prate) 1109 + { 1110 + struct samsung_clk_pll *pll = to_clk_pll(hw); 1111 + const struct samsung_pll_rate_table *rate; 1112 + u32 con0, con1; 1113 + 1114 + /* Get required rate settings from table */ 1115 + rate = samsung_get_pll_settings(pll, drate); 1116 + if (!rate) { 1117 + pr_err("%s: Invalid rate : %lu for pll clk %s\n", __func__, 1118 + drate, clk_hw_get_name(hw)); 1119 + return -EINVAL; 1120 + } 1121 + 1122 + con0 = readl_relaxed(pll->con_reg); 1123 + con1 = readl_relaxed(pll->con_reg + 4); 1124 + 1125 + /* Set PLL lock time. */ 1126 + writel_relaxed(rate->pdiv * PLL2650X_LOCK_FACTOR, pll->lock_reg); 1127 + 1128 + /* Change PLL PMS values */ 1129 + con0 &= ~((PLL2650X_M_MASK << PLL2650X_M_SHIFT) | 1130 + (PLL2650X_P_MASK << PLL2650X_P_SHIFT) | 1131 + (PLL2650X_S_MASK << PLL2650X_S_SHIFT)); 1132 + con0 |= (rate->mdiv << PLL2650X_M_SHIFT) | 1133 + (rate->pdiv << PLL2650X_P_SHIFT) | 1134 + (rate->sdiv << PLL2650X_S_SHIFT); 1135 + con0 |= (1 << PLL2650X_PLL_ENABLE_SHIFT); 1136 + writel_relaxed(con0, pll->con_reg); 1137 + 1138 + con1 &= ~(PLL2650X_K_MASK << PLL2650X_K_SHIFT); 1139 + con1 |= ((rate->kdiv & PLL2650X_K_MASK) << PLL2650X_K_SHIFT); 1140 + writel_relaxed(con1, pll->con_reg + 4); 1141 + 1142 + do { 1143 + cpu_relax(); 1144 + con0 = readl_relaxed(pll->con_reg); 1145 + } while (!(con0 & (PLL2650X_LOCK_STAT_MASK 1146 + << PLL2650X_LOCK_STAT_SHIFT))); 1147 + 1148 + return 0; 1149 + } 1150 + 1151 + static const struct clk_ops samsung_pll2650x_clk_ops = { 1152 + .recalc_rate = samsung_pll2650x_recalc_rate, 1153 + .round_rate = samsung_pll_round_rate, 1154 + .set_rate = samsung_pll2650x_set_rate, 1155 + }; 1156 + 1157 + static const struct clk_ops samsung_pll2650x_clk_min_ops = { 1158 + .recalc_rate = samsung_pll2650x_recalc_rate, 1018 1159 }; 1019 1160 1020 1161 /* ··· 1314 1263 else 1315 1264 init.ops = &samsung_s3c2440_mpll_clk_ops; 1316 1265 break; 1266 + case pll_2550x: 1267 + init.ops = &samsung_pll2550x_clk_ops; 1268 + break; 1317 1269 case pll_2550xx: 1318 1270 if (!pll->rate_table) 1319 1271 init.ops = &samsung_pll2550xx_clk_min_ops; 1320 1272 else 1321 1273 init.ops = &samsung_pll2550xx_clk_ops; 1274 + break; 1275 + case pll_2650x: 1276 + if (!pll->rate_table) 1277 + init.ops = &samsung_pll2650x_clk_min_ops; 1278 + else 1279 + init.ops = &samsung_pll2650x_clk_ops; 1322 1280 break; 1323 1281 case pll_2650xx: 1324 1282 if (!pll->rate_table)
+2
drivers/clk/samsung/clk-pll.h
··· 31 31 pll_s3c2410_mpll, 32 32 pll_s3c2410_upll, 33 33 pll_s3c2440_mpll, 34 + pll_2550x, 34 35 pll_2550xx, 36 + pll_2650x, 35 37 pll_2650xx, 36 38 pll_1450x, 37 39 pll_1451x,
+3
include/dt-bindings/clock/exynos5410.h
··· 19 19 #define CLK_FOUT_MPLL 4 20 20 #define CLK_FOUT_BPLL 5 21 21 #define CLK_FOUT_KPLL 6 22 + #define CLK_FOUT_EPLL 7 22 23 23 24 /* gate for special clocks (sclk) */ 24 25 #define CLK_SCLK_UART0 128 ··· 56 55 #define CLK_MMC0 351 57 56 #define CLK_MMC1 352 58 57 #define CLK_MMC2 353 58 + #define CLK_PDMA0 362 59 + #define CLK_PDMA1 363 59 60 #define CLK_USBH20 365 60 61 #define CLK_USBD300 366 61 62 #define CLK_USBD301 367
+10 -1
include/dt-bindings/clock/exynos5420.h
··· 214 214 #define CLK_MOUT_SW_ACLK400 651 215 215 #define CLK_MOUT_USER_ACLK300_GSCL 652 216 216 #define CLK_MOUT_SW_ACLK300_GSCL 653 217 + #define CLK_MOUT_MCLK_CDREX 654 218 + #define CLK_MOUT_BPLL 655 219 + #define CLK_MOUT_MX_MSPLL_CCORE 656 217 220 218 221 /* divider clocks */ 219 222 #define CLK_DOUT_PIXEL 768 ··· 242 239 #define CLK_DOUT_ACLK300_DISP1 788 243 240 #define CLK_DOUT_ACLK300_GSCL 789 244 241 #define CLK_DOUT_ACLK400_DISP1 790 242 + #define CLK_DOUT_PCLK_CDREX 791 243 + #define CLK_DOUT_SCLK_CDREX 792 244 + #define CLK_DOUT_ACLK_CDREX1 793 245 + #define CLK_DOUT_CCLK_DREX0 794 246 + #define CLK_DOUT_CLK2X_PHY0 795 247 + #define CLK_DOUT_PCLK_CORE_MEM 796 245 248 246 249 /* must be greater than maximal clock id */ 247 - #define CLK_NR_CLKS 791 250 + #define CLK_NR_CLKS 797 248 251 249 252 #endif /* _DT_BINDINGS_CLOCK_EXYNOS_5420_H */
+2
include/dt-bindings/clock/exynos5440.h
··· 14 14 15 15 #define CLK_XTAL 1 16 16 #define CLK_ARM_CLK 2 17 + #define CLK_CPLLA 3 18 + #define CLK_CPLLB 4 17 19 #define CLK_SPI_BAUD 16 18 20 #define CLK_PB0_250 17 19 21 #define CLK_PR0_250 18