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

clk: st: Support for ClockGenA9/DDR/GPU

The patch added support for DT registration of ClockGenA9/DDR/GPU

ClockgenA9/DDR : It includes c32 type PLL (also in ClockgenA1x), hence
only CLK_OF_DECLARE implementation is required.

ClockgenGPU : It includes c65 type PLL (also in ClockgenAx), hence
only CLK_OF_DECLARE implementation is required.

Signed-off-by: Pankaj Dev <pankaj.dev@st.com>
Signed-off-by: Gabriel Fernandez <gabriel.fernandez@st.com>
Signed-off-by: Mike Turquette <mturquette@linaro.org>

authored by

Gabriel FERNANDEZ and committed by
Mike Turquette
ec8d27b4 5f7aa907

+139
+139
drivers/clk/st/clkgen-pll.c
··· 110 110 .ops = &stm_pll3200c32_ops, 111 111 }; 112 112 113 + /* 415 specific */ 114 + static struct clkgen_pll_data st_pll3200c32_a9_415 = { 115 + .pdn_status = CLKGEN_FIELD(0x0, 0x1, 0), 116 + .locked_status = CLKGEN_FIELD(0x6C, 0x1, 0), 117 + .ndiv = CLKGEN_FIELD(0x0, C32_NDIV_MASK, 9), 118 + .idf = CLKGEN_FIELD(0x0, C32_IDF_MASK, 22), 119 + .num_odfs = 1, 120 + .odf = { CLKGEN_FIELD(0x0, C32_ODF_MASK, 3) }, 121 + .odf_gate = { CLKGEN_FIELD(0x0, 0x1, 28) }, 122 + .ops = &stm_pll3200c32_ops, 123 + }; 124 + 125 + static struct clkgen_pll_data st_pll3200c32_ddr_415 = { 126 + .pdn_status = CLKGEN_FIELD(0x0, 0x1, 0), 127 + .locked_status = CLKGEN_FIELD(0x100, 0x1, 0), 128 + .ndiv = CLKGEN_FIELD(0x8, C32_NDIV_MASK, 0), 129 + .idf = CLKGEN_FIELD(0x0, C32_IDF_MASK, 25), 130 + .num_odfs = 2, 131 + .odf = { CLKGEN_FIELD(0x8, C32_ODF_MASK, 8), 132 + CLKGEN_FIELD(0x8, C32_ODF_MASK, 14) }, 133 + .odf_gate = { CLKGEN_FIELD(0x4, 0x1, 28), 134 + CLKGEN_FIELD(0x4, 0x1, 29) }, 135 + .ops = &stm_pll3200c32_ops, 136 + }; 137 + 138 + static struct clkgen_pll_data st_pll1200c32_gpu_415 = { 139 + .pdn_status = CLKGEN_FIELD(0x144, 0x1, 3), 140 + .locked_status = CLKGEN_FIELD(0x168, 0x1, 0), 141 + .ldf = CLKGEN_FIELD(0x0, C32_LDF_MASK, 3), 142 + .idf = CLKGEN_FIELD(0x0, C32_IDF_MASK, 0), 143 + .num_odfs = 0, 144 + .odf = { CLKGEN_FIELD(0x0, C32_ODF_MASK, 10) }, 145 + .ops = &st_pll1200c32_ops, 146 + }; 147 + 148 + /* 416 specific */ 149 + static struct clkgen_pll_data st_pll3200c32_a9_416 = { 150 + .pdn_status = CLKGEN_FIELD(0x0, 0x1, 0), 151 + .locked_status = CLKGEN_FIELD(0x6C, 0x1, 0), 152 + .ndiv = CLKGEN_FIELD(0x8, C32_NDIV_MASK, 0), 153 + .idf = CLKGEN_FIELD(0x0, C32_IDF_MASK, 25), 154 + .num_odfs = 1, 155 + .odf = { CLKGEN_FIELD(0x8, C32_ODF_MASK, 8) }, 156 + .odf_gate = { CLKGEN_FIELD(0x4, 0x1, 28) }, 157 + .ops = &stm_pll3200c32_ops, 158 + }; 159 + 160 + static struct clkgen_pll_data st_pll3200c32_ddr_416 = { 161 + .pdn_status = CLKGEN_FIELD(0x0, 0x1, 0), 162 + .locked_status = CLKGEN_FIELD(0x10C, 0x1, 0), 163 + .ndiv = CLKGEN_FIELD(0x8, C32_NDIV_MASK, 0), 164 + .idf = CLKGEN_FIELD(0x0, C32_IDF_MASK, 25), 165 + .num_odfs = 2, 166 + .odf = { CLKGEN_FIELD(0x8, C32_ODF_MASK, 8), 167 + CLKGEN_FIELD(0x8, C32_ODF_MASK, 14) }, 168 + .odf_gate = { CLKGEN_FIELD(0x4, 0x1, 28), 169 + CLKGEN_FIELD(0x4, 0x1, 29) }, 170 + .ops = &stm_pll3200c32_ops, 171 + }; 172 + 173 + static struct clkgen_pll_data st_pll1200c32_gpu_416 = { 174 + .pdn_status = CLKGEN_FIELD(0x8E4, 0x1, 3), 175 + .locked_status = CLKGEN_FIELD(0x90C, 0x1, 0), 176 + .ldf = CLKGEN_FIELD(0x0, C32_LDF_MASK, 3), 177 + .idf = CLKGEN_FIELD(0x0, C32_IDF_MASK, 0), 178 + .num_odfs = 0, 179 + .odf = { CLKGEN_FIELD(0x0, C32_ODF_MASK, 10) }, 180 + .ops = &st_pll1200c32_ops, 181 + }; 182 + 113 183 /** 114 184 * DOC: Clock Generated by PLL, rate set and enabled by bootloader 115 185 * ··· 554 484 .compatible = "st,plls-c32-a1x-1", 555 485 .data = &st_pll3200c32_a1x_1, 556 486 }, 487 + { 488 + .compatible = "st,stih415-plls-c32-a9", 489 + .data = &st_pll3200c32_a9_415, 490 + }, 491 + { 492 + .compatible = "st,stih415-plls-c32-ddr", 493 + .data = &st_pll3200c32_ddr_415, 494 + }, 495 + { 496 + .compatible = "st,stih416-plls-c32-a9", 497 + .data = &st_pll3200c32_a9_416, 498 + }, 499 + { 500 + .compatible = "st,stih416-plls-c32-ddr", 501 + .data = &st_pll3200c32_ddr_416, 502 + }, 557 503 {} 558 504 }; 559 505 ··· 643 557 kfree(clk_data); 644 558 } 645 559 CLK_OF_DECLARE(clkgen_c32_pll, "st,clkgen-plls-c32", clkgen_c32_pll_setup); 560 + 561 + static struct of_device_id c32_gpu_pll_of_match[] = { 562 + { 563 + .compatible = "st,stih415-gpu-pll-c32", 564 + .data = &st_pll1200c32_gpu_415, 565 + }, 566 + { 567 + .compatible = "st,stih416-gpu-pll-c32", 568 + .data = &st_pll1200c32_gpu_416, 569 + }, 570 + }; 571 + 572 + static void __init clkgengpu_c32_pll_setup(struct device_node *np) 573 + { 574 + const struct of_device_id *match; 575 + struct clk *clk; 576 + const char *parent_name; 577 + void __iomem *reg; 578 + const char *clk_name; 579 + struct clkgen_pll_data *data; 580 + 581 + match = of_match_node(c32_gpu_pll_of_match, np); 582 + if (!match) { 583 + pr_err("%s: No matching data\n", __func__); 584 + return; 585 + } 586 + 587 + data = (struct clkgen_pll_data *)match->data; 588 + 589 + parent_name = of_clk_get_parent_name(np, 0); 590 + if (!parent_name) 591 + return; 592 + 593 + reg = clkgen_get_register_base(np); 594 + if (!reg) 595 + return; 596 + 597 + if (of_property_read_string_index(np, "clock-output-names", 598 + 0, &clk_name)) 599 + return; 600 + 601 + /* 602 + * PLL 1200MHz output 603 + */ 604 + clk = clkgen_pll_register(parent_name, data, reg, clk_name); 605 + 606 + if (!IS_ERR(clk)) 607 + of_clk_add_provider(np, of_clk_src_simple_get, clk); 608 + 609 + return; 610 + } 611 + CLK_OF_DECLARE(clkgengpu_c32_pll, 612 + "st,clkgengpu-pll-c32", clkgengpu_c32_pll_setup);