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

ARM: u300: convert MMC/SD clock to device tree

This converts the last of the U300 clocks to being probed from
the device tree.

Acked-by: Mike Turquette <mturquette@linaro.org>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>

+47 -7
+23
Documentation/devicetree/bindings/clock/ste-u300-syscon-clock.txt
··· 55 55 (...) 56 56 clocks = <&gpio_clk>; 57 57 }; 58 + 59 + 60 + Bindings for the MMC/SD card clock: 61 + 62 + Required properties: 63 + - compatible: must be "stericsson,u300-syscon-mclk" 64 + - #clock-cells: must be <0> 65 + 66 + Optional properties: 67 + - clocks: parent clock(s) 68 + 69 + mmc_mclk: mmc_mclk { 70 + #clock-cells = <0>; 71 + compatible = "stericsson,u300-syscon-mclk"; 72 + clocks = <&mmc_pclk>; 73 + }; 74 + 75 + mmcsd: mmcsd@c0001000 { 76 + compatible = "arm,pl18x", "arm,primecell"; 77 + clocks = <&mmc_pclk>, <&mmc_mclk>; 78 + clock-names = "apb_pclk", "mclk"; 79 + (...) 80 + };
+7 -2
arch/arm/boot/dts/ste-u300.dts
··· 205 205 clock-id = <5>; 206 206 clocks = <&fast_clk>; 207 207 }; 208 + mmc_mclk: mmc_mclk { 209 + #clock-cells = <0>; 210 + compatible = "stericsson,u300-syscon-mclk"; 211 + clocks = <&mmc_pclk>; 212 + }; 208 213 spi_clk: spi_p_clk@26M { 209 214 #clock-cells = <0>; 210 215 compatible = "stericsson,u300-syscon-clk"; ··· 438 433 reg = <0xc0001000 0x1000>; 439 434 interrupt-parent = <&vicb>; 440 435 interrupts = <6 7>; 441 - clocks = <&mmc_pclk>; 442 - clock-names = "apb_pclk"; 436 + clocks = <&mmc_pclk>, <&mmc_mclk>; 437 + clock-names = "apb_pclk", "mclk"; 443 438 max-frequency = <24000000>; 444 439 bus-width = <4>; // SD-card slot 445 440 mmc-cap-mmc-highspeed;
+17 -5
drivers/clk/clk-u300.c
··· 1139 1139 return clk; 1140 1140 } 1141 1141 1142 + static void __init of_u300_syscon_mclk_init(struct device_node *np) 1143 + { 1144 + struct clk *clk = ERR_PTR(-EINVAL); 1145 + const char *clk_name = np->name; 1146 + const char *parent_name; 1147 + 1148 + parent_name = of_clk_get_parent_name(np, 0); 1149 + clk = mclk_clk_register(NULL, clk_name, parent_name, false); 1150 + if (!IS_ERR(clk)) 1151 + of_clk_add_provider(np, of_clk_src_simple_get, clk); 1152 + } 1153 + 1142 1154 static const __initconst struct of_device_id u300_clk_match[] = { 1143 1155 { 1144 1156 .compatible = "fixed-clock", ··· 1164 1152 .compatible = "stericsson,u300-syscon-clk", 1165 1153 .data = of_u300_syscon_clk_init, 1166 1154 }, 1155 + { 1156 + .compatible = "stericsson,u300-syscon-mclk", 1157 + .data = of_u300_syscon_mclk_init, 1158 + }, 1167 1159 }; 1160 + 1168 1161 1169 1162 void __init u300_clk_init(void __iomem *base) 1170 1163 { 1171 1164 u16 val; 1172 - struct clk *clk; 1173 1165 1174 1166 syscon_vbase = base; 1175 1167 ··· 1191 1175 writew(val, syscon_vbase + U300_SYSCON_PMCR); 1192 1176 1193 1177 of_clk_init(u300_clk_match); 1194 - 1195 - /* Then this special MMC/SD clock */ 1196 - clk = mclk_clk_register(NULL, "mmc_clk", "mmc_p_clk", false); 1197 - clk_register_clkdev(clk, NULL, "mmci"); 1198 1178 }