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

clk: prima2: enable dt-binding clkdev mapping

this patche deletes hard code that registers clkdev by things like:
clk_register_clkdev(clk, NULL, "b0030000.nand");
clk_register_clkdev(clk, NULL, "b0040000.audio");
clk_register_clkdev(clk, NULL, "b0080000.usp");
prima2 clock controller becomes a clock provider and every dt node
just declares its clock sources by dt prop.

it also makes us easier to extend this driver to support both prima2
and marco as marco has different address mapping with prima2.

Signed-off-by: Barry Song <Baohua.Song@csr.com>
Signed-off-by: Mike Turquette <mturquette@linaro.org>

authored by

Barry Song and committed by
Mike Turquette
eb8b8f2e 38a8b096

+182 -125
+73
Documentation/devicetree/bindings/clock/prima2-clock.txt
··· 1 + * Clock bindings for CSR SiRFprimaII 2 + 3 + Required properties: 4 + - compatible: Should be "sirf,prima2-clkc" 5 + - reg: Address and length of the register set 6 + - interrupts: Should contain clock controller interrupt 7 + - #clock-cells: Should be <1> 8 + 9 + The clock consumer should specify the desired clock by having the clock 10 + ID in its "clocks" phandle cell. The following is a full list of prima2 11 + clocks and IDs. 12 + 13 + Clock ID 14 + --------------------------- 15 + rtc 0 16 + osc 1 17 + pll1 2 18 + pll2 3 19 + pll3 4 20 + mem 5 21 + sys 6 22 + security 7 23 + dsp 8 24 + gps 9 25 + mf 10 26 + io 11 27 + cpu 12 28 + uart0 13 29 + uart1 14 30 + uart2 15 31 + tsc 16 32 + i2c0 17 33 + i2c1 18 34 + spi0 19 35 + spi1 20 36 + pwmc 21 37 + efuse 22 38 + pulse 23 39 + dmac0 24 40 + dmac1 25 41 + nand 26 42 + audio 27 43 + usp0 28 44 + usp1 29 45 + usp2 30 46 + vip 31 47 + gfx 32 48 + mm 33 49 + lcd 34 50 + vpp 35 51 + mmc01 36 52 + mmc23 37 53 + mmc45 38 54 + usbpll 39 55 + usb0 40 56 + usb1 41 57 + 58 + Examples: 59 + 60 + clks: clock-controller@88000000 { 61 + compatible = "sirf,prima2-clkc"; 62 + reg = <0x88000000 0x1000>; 63 + interrupts = <3>; 64 + #clock-cells = <1>; 65 + }; 66 + 67 + i2c0: i2c@b00e0000 { 68 + cell-index = <0>; 69 + compatible = "sirf,prima2-i2c"; 70 + reg = <0xb00e0000 0x10000>; 71 + interrupts = <24>; 72 + clocks = <&clks 17>; 73 + };
+30 -1
arch/arm/boot/dts/prima2.dtsi
··· 58 58 #size-cells = <1>; 59 59 ranges = <0x88000000 0x88000000 0x40000>; 60 60 61 - clock-controller@88000000 { 61 + clks: clock-controller@88000000 { 62 62 compatible = "sirf,prima2-clkc"; 63 63 reg = <0x88000000 0x1000>; 64 64 interrupts = <3>; 65 + #clock-cells = <1>; 65 66 }; 66 67 67 68 reset-controller@88010000 { ··· 86 85 compatible = "sirf,prima2-memc"; 87 86 reg = <0x90000000 0x10000>; 88 87 interrupts = <27>; 88 + clocks = <&clks 5>; 89 89 }; 90 90 }; 91 91 ··· 106 104 compatible = "sirf,prima2-vpp"; 107 105 reg = <0x90020000 0x10000>; 108 106 interrupts = <31>; 107 + clocks = <&clks 35>; 109 108 }; 110 109 }; 111 110 ··· 120 117 compatible = "powervr,sgx531"; 121 118 reg = <0x98000000 0x8000000>; 122 119 interrupts = <6>; 120 + clocks = <&clks 32>; 123 121 }; 124 122 }; 125 123 ··· 134 130 compatible = "sirf,prima2-video-codec"; 135 131 reg = <0xa0000000 0x8000000>; 136 132 interrupts = <5>; 133 + clocks = <&clks 33>; 137 134 }; 138 135 }; 139 136 ··· 154 149 compatible = "sirf,prima2-gps"; 155 150 reg = <0xa8010000 0x10000>; 156 151 interrupts = <7>; 152 + clocks = <&clks 9>; 157 153 }; 158 154 159 155 dsp@a9000000 { 160 156 compatible = "sirf,prima2-dsp"; 161 157 reg = <0xa9000000 0x1000000>; 162 158 interrupts = <8>; 159 + clocks = <&clks 8>; 163 160 }; 164 161 }; 165 162 ··· 181 174 compatible = "sirf,prima2-nand"; 182 175 reg = <0xb0030000 0x10000>; 183 176 interrupts = <41>; 177 + clocks = <&clks 26>; 184 178 }; 185 179 186 180 audio@b0040000 { 187 181 compatible = "sirf,prima2-audio"; 188 182 reg = <0xb0040000 0x10000>; 189 183 interrupts = <35>; 184 + clocks = <&clks 27>; 190 185 }; 191 186 192 187 uart0: uart@b0050000 { ··· 196 187 compatible = "sirf,prima2-uart"; 197 188 reg = <0xb0050000 0x10000>; 198 189 interrupts = <17>; 190 + clocks = <&clks 13>; 199 191 }; 200 192 201 193 uart1: uart@b0060000 { ··· 204 194 compatible = "sirf,prima2-uart"; 205 195 reg = <0xb0060000 0x10000>; 206 196 interrupts = <18>; 197 + clocks = <&clks 14>; 207 198 }; 208 199 209 200 uart2: uart@b0070000 { ··· 212 201 compatible = "sirf,prima2-uart"; 213 202 reg = <0xb0070000 0x10000>; 214 203 interrupts = <19>; 204 + clocks = <&clks 15>; 215 205 }; 216 206 217 207 usp0: usp@b0080000 { ··· 220 208 compatible = "sirf,prima2-usp"; 221 209 reg = <0xb0080000 0x10000>; 222 210 interrupts = <20>; 211 + clocks = <&clks 28>; 223 212 }; 224 213 225 214 usp1: usp@b0090000 { ··· 228 215 compatible = "sirf,prima2-usp"; 229 216 reg = <0xb0090000 0x10000>; 230 217 interrupts = <21>; 218 + clocks = <&clks 29>; 231 219 }; 232 220 233 221 usp2: usp@b00a0000 { ··· 236 222 compatible = "sirf,prima2-usp"; 237 223 reg = <0xb00a0000 0x10000>; 238 224 interrupts = <22>; 225 + clocks = <&clks 30>; 239 226 }; 240 227 241 228 dmac0: dma-controller@b00b0000 { ··· 244 229 compatible = "sirf,prima2-dmac"; 245 230 reg = <0xb00b0000 0x10000>; 246 231 interrupts = <12>; 232 + clocks = <&clks 24>; 247 233 }; 248 234 249 235 dmac1: dma-controller@b0160000 { ··· 252 236 compatible = "sirf,prima2-dmac"; 253 237 reg = <0xb0160000 0x10000>; 254 238 interrupts = <13>; 239 + clocks = <&clks 25>; 255 240 }; 256 241 257 242 vip@b00C0000 { 258 243 compatible = "sirf,prima2-vip"; 259 244 reg = <0xb00C0000 0x10000>; 245 + clocks = <&clks 31>; 260 246 }; 261 247 262 248 spi0: spi@b00d0000 { ··· 266 248 compatible = "sirf,prima2-spi"; 267 249 reg = <0xb00d0000 0x10000>; 268 250 interrupts = <15>; 251 + clocks = <&clks 19>; 269 252 }; 270 253 271 254 spi1: spi@b0170000 { ··· 274 255 compatible = "sirf,prima2-spi"; 275 256 reg = <0xb0170000 0x10000>; 276 257 interrupts = <16>; 258 + clocks = <&clks 20>; 277 259 }; 278 260 279 261 i2c0: i2c@b00e0000 { ··· 282 262 compatible = "sirf,prima2-i2c"; 283 263 reg = <0xb00e0000 0x10000>; 284 264 interrupts = <24>; 265 + clocks = <&clks 17>; 285 266 }; 286 267 287 268 i2c1: i2c@b00f0000 { ··· 290 269 compatible = "sirf,prima2-i2c"; 291 270 reg = <0xb00f0000 0x10000>; 292 271 interrupts = <25>; 272 + clocks = <&clks 18>; 293 273 }; 294 274 295 275 tsc@b0110000 { 296 276 compatible = "sirf,prima2-tsc"; 297 277 reg = <0xb0110000 0x10000>; 298 278 interrupts = <33>; 279 + clocks = <&clks 16>; 299 280 }; 300 281 301 282 gpio: pinctrl@b0120000 { ··· 530 507 pwm@b0130000 { 531 508 compatible = "sirf,prima2-pwm"; 532 509 reg = <0xb0130000 0x10000>; 510 + clocks = <&clks 21>; 533 511 }; 534 512 535 513 efusesys@b0140000 { 536 514 compatible = "sirf,prima2-efuse"; 537 515 reg = <0xb0140000 0x10000>; 516 + clocks = <&clks 22>; 538 517 }; 539 518 540 519 pulsec@b0150000 { 541 520 compatible = "sirf,prima2-pulsec"; 542 521 reg = <0xb0150000 0x10000>; 543 522 interrupts = <48>; 523 + clocks = <&clks 23>; 544 524 }; 545 525 546 526 pci-iobg { ··· 642 616 compatible = "chipidea,ci13611a-prima2"; 643 617 reg = <0xb8000000 0x10000>; 644 618 interrupts = <10>; 619 + clocks = <&clks 40>; 645 620 }; 646 621 647 622 usb1: usb@b00f0000 { 648 623 compatible = "chipidea,ci13611a-prima2"; 649 624 reg = <0xb8010000 0x10000>; 650 625 interrupts = <11>; 626 + clocks = <&clks 41>; 651 627 }; 652 628 653 629 sata@b00f0000 { ··· 662 634 compatible = "sirf,prima2-security"; 663 635 reg = <0xb8030000 0x10000>; 664 636 interrupts = <42>; 637 + clocks = <&clks 7>; 665 638 }; 666 639 }; 667 640 };
+79 -124
drivers/clk/clk-prima2.c
··· 1025 1025 {}, 1026 1026 }; 1027 1027 1028 + enum prima2_clk_index { 1029 + /* 0 1 2 3 4 5 6 7 8 9 */ 1030 + rtc, osc, pll1, pll2, pll3, mem, sys, security, dsp, gps, 1031 + mf, io, cpu, uart0, uart1, uart2, tsc, i2c0, i2c1, spi0, 1032 + spi1, pwmc, efuse, pulse, dmac0, dmac1, nand, audio, usp0, usp1, 1033 + usp2, vip, gfx, mm, lcd, vpp, mmc01, mmc23, mmc45, usbpll, 1034 + usb0, usb1, maxclk, 1035 + }; 1036 + 1037 + static __initdata struct clk_hw* prima2_clk_hw_array[maxclk] = { 1038 + NULL, /* dummy */ 1039 + NULL, 1040 + &clk_pll1.hw, 1041 + &clk_pll2.hw, 1042 + &clk_pll3.hw, 1043 + &clk_mem.hw, 1044 + &clk_sys.hw, 1045 + &clk_security.hw, 1046 + &clk_dsp.hw, 1047 + &clk_gps.hw, 1048 + &clk_mf.hw, 1049 + &clk_io.hw, 1050 + &clk_cpu.hw, 1051 + &clk_uart0.hw, 1052 + &clk_uart1.hw, 1053 + &clk_uart2.hw, 1054 + &clk_tsc.hw, 1055 + &clk_i2c0.hw, 1056 + &clk_i2c1.hw, 1057 + &clk_spi0.hw, 1058 + &clk_spi1.hw, 1059 + &clk_pwmc.hw, 1060 + &clk_efuse.hw, 1061 + &clk_pulse.hw, 1062 + &clk_dmac0.hw, 1063 + &clk_dmac1.hw, 1064 + &clk_nand.hw, 1065 + &clk_audio.hw, 1066 + &clk_usp0.hw, 1067 + &clk_usp1.hw, 1068 + &clk_usp2.hw, 1069 + &clk_vip.hw, 1070 + &clk_gfx.hw, 1071 + &clk_mm.hw, 1072 + &clk_lcd.hw, 1073 + &clk_vpp.hw, 1074 + &clk_mmc01.hw, 1075 + &clk_mmc23.hw, 1076 + &clk_mmc45.hw, 1077 + &usb_pll_clk_hw, 1078 + &clk_usb0.hw, 1079 + &clk_usb1.hw, 1080 + }; 1081 + 1082 + static struct clk *prima2_clks[maxclk]; 1083 + static struct clk_onecell_data clk_data; 1084 + 1028 1085 void __init sirfsoc_of_clk_init(void) 1029 1086 { 1030 - struct clk *clk; 1031 1087 struct device_node *np; 1032 - 1033 - np = of_find_matching_node(NULL, clkc_ids); 1034 - if (!np) 1035 - panic("unable to find compatible clkc node in dtb\n"); 1036 - 1037 - sirfsoc_clk_vbase = of_iomap(np, 0); 1038 - if (!sirfsoc_clk_vbase) 1039 - panic("unable to map clkc registers\n"); 1040 - 1041 - of_node_put(np); 1088 + int i; 1042 1089 1043 1090 np = of_find_matching_node(NULL, rsc_ids); 1044 1091 if (!np) ··· 1097 1050 1098 1051 of_node_put(np); 1099 1052 1053 + np = of_find_matching_node(NULL, clkc_ids); 1054 + if (!np) 1055 + return; 1056 + 1057 + sirfsoc_clk_vbase = of_iomap(np, 0); 1058 + if (!sirfsoc_clk_vbase) 1059 + panic("unable to map clkc registers\n"); 1100 1060 1101 1061 /* These are always available (RTC and 26MHz OSC)*/ 1102 - clk = clk_register_fixed_rate(NULL, "rtc", NULL, 1062 + prima2_clks[rtc] = clk_register_fixed_rate(NULL, "rtc", NULL, 1103 1063 CLK_IS_ROOT, 32768); 1104 - BUG_ON(IS_ERR(clk)); 1105 - clk = clk_register_fixed_rate(NULL, "osc", NULL, 1064 + prima2_clks[osc]= clk_register_fixed_rate(NULL, "osc", NULL, 1106 1065 CLK_IS_ROOT, 26000000); 1107 - BUG_ON(IS_ERR(clk)); 1108 1066 1109 - clk = clk_register(NULL, &clk_pll1.hw); 1110 - BUG_ON(IS_ERR(clk)); 1111 - clk = clk_register(NULL, &clk_pll2.hw); 1112 - BUG_ON(IS_ERR(clk)); 1113 - clk = clk_register(NULL, &clk_pll3.hw); 1114 - BUG_ON(IS_ERR(clk)); 1115 - clk = clk_register(NULL, &clk_mem.hw); 1116 - BUG_ON(IS_ERR(clk)); 1117 - clk = clk_register(NULL, &clk_sys.hw); 1118 - BUG_ON(IS_ERR(clk)); 1119 - clk = clk_register(NULL, &clk_security.hw); 1120 - BUG_ON(IS_ERR(clk)); 1121 - clk_register_clkdev(clk, NULL, "b8030000.security"); 1122 - clk = clk_register(NULL, &clk_dsp.hw); 1123 - BUG_ON(IS_ERR(clk)); 1124 - clk = clk_register(NULL, &clk_gps.hw); 1125 - BUG_ON(IS_ERR(clk)); 1126 - clk_register_clkdev(clk, NULL, "a8010000.gps"); 1127 - clk = clk_register(NULL, &clk_mf.hw); 1128 - BUG_ON(IS_ERR(clk)); 1129 - clk = clk_register(NULL, &clk_io.hw); 1130 - BUG_ON(IS_ERR(clk)); 1131 - clk_register_clkdev(clk, NULL, "io"); 1132 - clk = clk_register(NULL, &clk_cpu.hw); 1133 - BUG_ON(IS_ERR(clk)); 1134 - clk_register_clkdev(clk, NULL, "cpu"); 1135 - clk = clk_register(NULL, &clk_uart0.hw); 1136 - BUG_ON(IS_ERR(clk)); 1137 - clk_register_clkdev(clk, NULL, "b0050000.uart"); 1138 - clk = clk_register(NULL, &clk_uart1.hw); 1139 - BUG_ON(IS_ERR(clk)); 1140 - clk_register_clkdev(clk, NULL, "b0060000.uart"); 1141 - clk = clk_register(NULL, &clk_uart2.hw); 1142 - BUG_ON(IS_ERR(clk)); 1143 - clk_register_clkdev(clk, NULL, "b0070000.uart"); 1144 - clk = clk_register(NULL, &clk_tsc.hw); 1145 - BUG_ON(IS_ERR(clk)); 1146 - clk_register_clkdev(clk, NULL, "b0110000.tsc"); 1147 - clk = clk_register(NULL, &clk_i2c0.hw); 1148 - BUG_ON(IS_ERR(clk)); 1149 - clk_register_clkdev(clk, NULL, "b00e0000.i2c"); 1150 - clk = clk_register(NULL, &clk_i2c1.hw); 1151 - BUG_ON(IS_ERR(clk)); 1152 - clk_register_clkdev(clk, NULL, "b00f0000.i2c"); 1153 - clk = clk_register(NULL, &clk_spi0.hw); 1154 - BUG_ON(IS_ERR(clk)); 1155 - clk_register_clkdev(clk, NULL, "b00d0000.spi"); 1156 - clk = clk_register(NULL, &clk_spi1.hw); 1157 - BUG_ON(IS_ERR(clk)); 1158 - clk_register_clkdev(clk, NULL, "b0170000.spi"); 1159 - clk = clk_register(NULL, &clk_pwmc.hw); 1160 - BUG_ON(IS_ERR(clk)); 1161 - clk_register_clkdev(clk, NULL, "b0130000.pwm"); 1162 - clk = clk_register(NULL, &clk_efuse.hw); 1163 - BUG_ON(IS_ERR(clk)); 1164 - clk_register_clkdev(clk, NULL, "b0140000.efusesys"); 1165 - clk = clk_register(NULL, &clk_pulse.hw); 1166 - BUG_ON(IS_ERR(clk)); 1167 - clk_register_clkdev(clk, NULL, "b0150000.pulsec"); 1168 - clk = clk_register(NULL, &clk_dmac0.hw); 1169 - BUG_ON(IS_ERR(clk)); 1170 - clk_register_clkdev(clk, NULL, "b00b0000.dma-controller"); 1171 - clk = clk_register(NULL, &clk_dmac1.hw); 1172 - BUG_ON(IS_ERR(clk)); 1173 - clk_register_clkdev(clk, NULL, "b0160000.dma-controller"); 1174 - clk = clk_register(NULL, &clk_nand.hw); 1175 - BUG_ON(IS_ERR(clk)); 1176 - clk_register_clkdev(clk, NULL, "b0030000.nand"); 1177 - clk = clk_register(NULL, &clk_audio.hw); 1178 - BUG_ON(IS_ERR(clk)); 1179 - clk_register_clkdev(clk, NULL, "b0040000.audio"); 1180 - clk = clk_register(NULL, &clk_usp0.hw); 1181 - BUG_ON(IS_ERR(clk)); 1182 - clk_register_clkdev(clk, NULL, "b0080000.usp"); 1183 - clk = clk_register(NULL, &clk_usp1.hw); 1184 - BUG_ON(IS_ERR(clk)); 1185 - clk_register_clkdev(clk, NULL, "b0090000.usp"); 1186 - clk = clk_register(NULL, &clk_usp2.hw); 1187 - BUG_ON(IS_ERR(clk)); 1188 - clk_register_clkdev(clk, NULL, "b00a0000.usp"); 1189 - clk = clk_register(NULL, &clk_vip.hw); 1190 - BUG_ON(IS_ERR(clk)); 1191 - clk_register_clkdev(clk, NULL, "b00c0000.vip"); 1192 - clk = clk_register(NULL, &clk_gfx.hw); 1193 - BUG_ON(IS_ERR(clk)); 1194 - clk_register_clkdev(clk, NULL, "98000000.graphics"); 1195 - clk = clk_register(NULL, &clk_mm.hw); 1196 - BUG_ON(IS_ERR(clk)); 1197 - clk_register_clkdev(clk, NULL, "a0000000.multimedia"); 1198 - clk = clk_register(NULL, &clk_lcd.hw); 1199 - BUG_ON(IS_ERR(clk)); 1200 - clk_register_clkdev(clk, NULL, "90010000.display"); 1201 - clk = clk_register(NULL, &clk_vpp.hw); 1202 - BUG_ON(IS_ERR(clk)); 1203 - clk_register_clkdev(clk, NULL, "90020000.vpp"); 1204 - clk = clk_register(NULL, &clk_mmc01.hw); 1205 - BUG_ON(IS_ERR(clk)); 1206 - clk = clk_register(NULL, &clk_mmc23.hw); 1207 - BUG_ON(IS_ERR(clk)); 1208 - clk = clk_register(NULL, &clk_mmc45.hw); 1209 - BUG_ON(IS_ERR(clk)); 1210 - clk = clk_register(NULL, &usb_pll_clk_hw); 1211 - BUG_ON(IS_ERR(clk)); 1212 - clk = clk_register(NULL, &clk_usb0.hw); 1213 - BUG_ON(IS_ERR(clk)); 1214 - clk_register_clkdev(clk, NULL, "b00e0000.usb"); 1215 - clk = clk_register(NULL, &clk_usb1.hw); 1216 - BUG_ON(IS_ERR(clk)); 1217 - clk_register_clkdev(clk, NULL, "b00f0000.usb"); 1067 + for (i = pll1; i < maxclk; i++) { 1068 + prima2_clks[i] = clk_register(NULL, prima2_clk_hw_array[i]); 1069 + BUG_ON(!prima2_clks[i]); 1070 + } 1071 + clk_register_clkdev(prima2_clks[cpu], NULL, "cpu"); 1072 + clk_register_clkdev(prima2_clks[io], NULL, "io"); 1073 + clk_register_clkdev(prima2_clks[mem], NULL, "mem"); 1074 + 1075 + clk_data.clks = prima2_clks; 1076 + clk_data.clk_num = maxclk; 1077 + 1078 + of_clk_add_provider(np, of_clk_src_onecell_get, &clk_data); 1218 1079 }