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

Merge tag 'clk-renesas-for-v4.12-tag2' of git://git.kernel.org/pub/scm/linux/kernel/git/geert/renesas-drivers into clk-next

Pull Renesas clk driver updates from Geert Uytterhoeven:

- Add support for the Clock Pulse Generator / Module Standby and
Software Reset module on revision ES2.0 of the R-Car H3 SoC, which
differs from ES1.x in some areas.
- Add IMR clocks for R-Car H3 and M3-W,
- Add workaround for PLL0/2/4 errata on R-Car H3 ES1.0,
- Small fixes and cleanups.

* tag 'clk-renesas-for-v4.12-tag2' of git://git.kernel.org/pub/scm/linux/kernel/git/geert/renesas-drivers:
clk: renesas: rcar-gen3-cpg: Add support for RCLK on R-Car H3 ES2.0
clk: renesas: r8a7795: Add support for R-Car H3 ES2.0
clk: renesas: Add r8a7795 ES2.0 CPG Core Clock Definitions
clk: renesas: cpg-mssr: Add support for fixing up clock tables
clk: renesas: rcar-gen3: Add workaround for PLL0/2/4 errata on H3 ES1.0
clk: renesas: rcar-gen3-cpg: Pass mode pins to rcar_gen3_cpg_init()
clk: renesas: r8a7796: Reformat core clock table
clk: renesas: r8a7795: Reformat core clock table
clk: renesas: r8a7796: Correct name of watchdog clock
clk: renesas: r8a7795: Correct name of watchdog clock
clk: renesas: r8a7795: Correct parent clock and sort order for Audio DMACs
clk: renesas: r8a7796: Add IMR clocks
clk: renesas: r8a7795: Add IMR clocks

+305 -77
+163 -58
drivers/clk/renesas/r8a7795-cpg-mssr.c
··· 16 16 #include <linux/init.h> 17 17 #include <linux/kernel.h> 18 18 #include <linux/soc/renesas/rcar-rst.h> 19 + #include <linux/sys_soc.h> 19 20 20 21 #include <dt-bindings/clock/r8a7795-cpg-mssr.h> 21 22 ··· 25 24 26 25 enum clk_ids { 27 26 /* Core Clock Outputs exported to DT */ 28 - LAST_DT_CORE_CLK = R8A7795_CLK_OSC, 27 + LAST_DT_CORE_CLK = R8A7795_CLK_S0D12, 29 28 30 29 /* External Input Clocks */ 31 30 CLK_EXTAL, ··· 52 51 MOD_CLK_BASE 53 52 }; 54 53 55 - static const struct cpg_core_clk r8a7795_core_clks[] __initconst = { 54 + static struct cpg_core_clk r8a7795_core_clks[] __initdata = { 56 55 /* External Clock Inputs */ 57 - DEF_INPUT("extal", CLK_EXTAL), 58 - DEF_INPUT("extalr", CLK_EXTALR), 56 + DEF_INPUT("extal", CLK_EXTAL), 57 + DEF_INPUT("extalr", CLK_EXTALR), 59 58 60 59 /* Internal Core Clocks */ 61 60 DEF_BASE(".main", CLK_MAIN, CLK_TYPE_GEN3_MAIN, CLK_EXTAL), ··· 79 78 DEF_FIXED("zt", R8A7795_CLK_ZT, CLK_PLL1_DIV2, 4, 1), 80 79 DEF_FIXED("zx", R8A7795_CLK_ZX, CLK_PLL1_DIV2, 2, 1), 81 80 DEF_FIXED("s0d1", R8A7795_CLK_S0D1, CLK_S0, 1, 1), 81 + DEF_FIXED("s0d2", R8A7795_CLK_S0D2, CLK_S0, 2, 1), 82 + DEF_FIXED("s0d3", R8A7795_CLK_S0D3, CLK_S0, 3, 1), 82 83 DEF_FIXED("s0d4", R8A7795_CLK_S0D4, CLK_S0, 4, 1), 84 + DEF_FIXED("s0d6", R8A7795_CLK_S0D6, CLK_S0, 6, 1), 85 + DEF_FIXED("s0d8", R8A7795_CLK_S0D8, CLK_S0, 8, 1), 86 + DEF_FIXED("s0d12", R8A7795_CLK_S0D12, CLK_S0, 12, 1), 83 87 DEF_FIXED("s1d1", R8A7795_CLK_S1D1, CLK_S1, 1, 1), 84 88 DEF_FIXED("s1d2", R8A7795_CLK_S1D2, CLK_S1, 2, 1), 85 89 DEF_FIXED("s1d4", R8A7795_CLK_S1D4, CLK_S1, 4, 1), ··· 95 89 DEF_FIXED("s3d2", R8A7795_CLK_S3D2, CLK_S3, 2, 1), 96 90 DEF_FIXED("s3d4", R8A7795_CLK_S3D4, CLK_S3, 4, 1), 97 91 98 - DEF_GEN3_SD("sd0", R8A7795_CLK_SD0, CLK_SDSRC, 0x0074), 99 - DEF_GEN3_SD("sd1", R8A7795_CLK_SD1, CLK_SDSRC, 0x0078), 100 - DEF_GEN3_SD("sd2", R8A7795_CLK_SD2, CLK_SDSRC, 0x0268), 101 - DEF_GEN3_SD("sd3", R8A7795_CLK_SD3, CLK_SDSRC, 0x026c), 92 + DEF_GEN3_SD("sd0", R8A7795_CLK_SD0, CLK_SDSRC, 0x074), 93 + DEF_GEN3_SD("sd1", R8A7795_CLK_SD1, CLK_SDSRC, 0x078), 94 + DEF_GEN3_SD("sd2", R8A7795_CLK_SD2, CLK_SDSRC, 0x268), 95 + DEF_GEN3_SD("sd3", R8A7795_CLK_SD3, CLK_SDSRC, 0x26c), 102 96 103 97 DEF_FIXED("cl", R8A7795_CLK_CL, CLK_PLL1_DIV2, 48, 1), 104 98 DEF_FIXED("cp", R8A7795_CLK_CP, CLK_EXTAL, 2, 1), 105 99 106 - DEF_DIV6P1("mso", R8A7795_CLK_MSO, CLK_PLL1_DIV4, 0x014), 107 - DEF_DIV6P1("hdmi", R8A7795_CLK_HDMI, CLK_PLL1_DIV4, 0x250), 108 100 DEF_DIV6P1("canfd", R8A7795_CLK_CANFD, CLK_PLL1_DIV4, 0x244), 109 101 DEF_DIV6P1("csi0", R8A7795_CLK_CSI0, CLK_PLL1_DIV4, 0x00c), 102 + DEF_DIV6P1("mso", R8A7795_CLK_MSO, CLK_PLL1_DIV4, 0x014), 103 + DEF_DIV6P1("hdmi", R8A7795_CLK_HDMI, CLK_PLL1_DIV4, 0x250), 110 104 111 - DEF_DIV6_RO("osc", R8A7795_CLK_OSC, CLK_EXTAL, CPG_RCKCR, 8), 105 + DEF_DIV6_RO("osc", R8A7795_CLK_OSC, CLK_EXTAL, CPG_RCKCR, 8), 112 106 DEF_DIV6_RO("r_int", CLK_RINT, CLK_EXTAL, CPG_RCKCR, 32), 113 107 114 - DEF_BASE("r", R8A7795_CLK_R, CLK_TYPE_GEN3_R, CLK_RINT), 108 + DEF_BASE("r", R8A7795_CLK_R, CLK_TYPE_GEN3_R, CLK_RINT), 115 109 }; 116 110 117 - static const struct mssr_mod_clk r8a7795_mod_clks[] __initconst = { 118 - DEF_MOD("fdp1-2", 117, R8A7795_CLK_S2D1), 119 - DEF_MOD("fdp1-1", 118, R8A7795_CLK_S2D1), 120 - DEF_MOD("fdp1-0", 119, R8A7795_CLK_S2D1), 111 + static struct mssr_mod_clk r8a7795_mod_clks[] __initdata = { 112 + DEF_MOD("fdp1-2", 117, R8A7795_CLK_S2D1), /* ES1.x */ 113 + DEF_MOD("fdp1-1", 118, R8A7795_CLK_S0D1), 114 + DEF_MOD("fdp1-0", 119, R8A7795_CLK_S0D1), 121 115 DEF_MOD("scif5", 202, R8A7795_CLK_S3D4), 122 116 DEF_MOD("scif4", 203, R8A7795_CLK_S3D4), 123 117 DEF_MOD("scif3", 204, R8A7795_CLK_S3D4), ··· 127 121 DEF_MOD("msiof2", 209, R8A7795_CLK_MSO), 128 122 DEF_MOD("msiof1", 210, R8A7795_CLK_MSO), 129 123 DEF_MOD("msiof0", 211, R8A7795_CLK_MSO), 130 - DEF_MOD("sys-dmac2", 217, R8A7795_CLK_S3D1), 131 - DEF_MOD("sys-dmac1", 218, R8A7795_CLK_S3D1), 132 - DEF_MOD("sys-dmac0", 219, R8A7795_CLK_S3D1), 124 + DEF_MOD("sys-dmac2", 217, R8A7795_CLK_S0D3), 125 + DEF_MOD("sys-dmac1", 218, R8A7795_CLK_S0D3), 126 + DEF_MOD("sys-dmac0", 219, R8A7795_CLK_S0D3), 133 127 DEF_MOD("cmt3", 300, R8A7795_CLK_R), 134 128 DEF_MOD("cmt2", 301, R8A7795_CLK_R), 135 129 DEF_MOD("cmt1", 302, R8A7795_CLK_R), ··· 141 135 DEF_MOD("sdif0", 314, R8A7795_CLK_SD0), 142 136 DEF_MOD("pcie1", 318, R8A7795_CLK_S3D1), 143 137 DEF_MOD("pcie0", 319, R8A7795_CLK_S3D1), 144 - DEF_MOD("usb3-if1", 327, R8A7795_CLK_S3D1), 138 + DEF_MOD("usb3-if1", 327, R8A7795_CLK_S3D1), /* ES1.x */ 145 139 DEF_MOD("usb3-if0", 328, R8A7795_CLK_S3D1), 146 140 DEF_MOD("usb-dmac0", 330, R8A7795_CLK_S3D1), 147 141 DEF_MOD("usb-dmac1", 331, R8A7795_CLK_S3D1), 148 - DEF_MOD("rwdt0", 402, R8A7795_CLK_R), 142 + DEF_MOD("rwdt", 402, R8A7795_CLK_R), 149 143 DEF_MOD("intc-ex", 407, R8A7795_CLK_CP), 150 144 DEF_MOD("intc-ap", 408, R8A7795_CLK_S3D1), 151 - DEF_MOD("audmac0", 502, R8A7795_CLK_S3D4), 152 - DEF_MOD("audmac1", 501, R8A7795_CLK_S3D4), 145 + DEF_MOD("audmac1", 501, R8A7795_CLK_S0D3), 146 + DEF_MOD("audmac0", 502, R8A7795_CLK_S0D3), 153 147 DEF_MOD("drif7", 508, R8A7795_CLK_S3D2), 154 148 DEF_MOD("drif6", 509, R8A7795_CLK_S3D2), 155 149 DEF_MOD("drif5", 510, R8A7795_CLK_S3D2), ··· 165 159 DEF_MOD("hscif0", 520, R8A7795_CLK_S3D1), 166 160 DEF_MOD("thermal", 522, R8A7795_CLK_CP), 167 161 DEF_MOD("pwm", 523, R8A7795_CLK_S3D4), 168 - DEF_MOD("fcpvd3", 600, R8A7795_CLK_S2D1), 169 - DEF_MOD("fcpvd2", 601, R8A7795_CLK_S2D1), 170 - DEF_MOD("fcpvd1", 602, R8A7795_CLK_S2D1), 171 - DEF_MOD("fcpvd0", 603, R8A7795_CLK_S2D1), 172 - DEF_MOD("fcpvb1", 606, R8A7795_CLK_S2D1), 173 - DEF_MOD("fcpvb0", 607, R8A7795_CLK_S2D1), 174 - DEF_MOD("fcpvi2", 609, R8A7795_CLK_S2D1), 175 - DEF_MOD("fcpvi1", 610, R8A7795_CLK_S2D1), 176 - DEF_MOD("fcpvi0", 611, R8A7795_CLK_S2D1), 177 - DEF_MOD("fcpf2", 613, R8A7795_CLK_S2D1), 178 - DEF_MOD("fcpf1", 614, R8A7795_CLK_S2D1), 179 - DEF_MOD("fcpf0", 615, R8A7795_CLK_S2D1), 180 - DEF_MOD("fcpci1", 616, R8A7795_CLK_S2D1), 181 - DEF_MOD("fcpci0", 617, R8A7795_CLK_S2D1), 182 - DEF_MOD("fcpcs", 619, R8A7795_CLK_S2D1), 183 - DEF_MOD("vspd3", 620, R8A7795_CLK_S2D1), 184 - DEF_MOD("vspd2", 621, R8A7795_CLK_S2D1), 185 - DEF_MOD("vspd1", 622, R8A7795_CLK_S2D1), 186 - DEF_MOD("vspd0", 623, R8A7795_CLK_S2D1), 187 - DEF_MOD("vspbc", 624, R8A7795_CLK_S2D1), 188 - DEF_MOD("vspbd", 626, R8A7795_CLK_S2D1), 189 - DEF_MOD("vspi2", 629, R8A7795_CLK_S2D1), 190 - DEF_MOD("vspi1", 630, R8A7795_CLK_S2D1), 191 - DEF_MOD("vspi0", 631, R8A7795_CLK_S2D1), 162 + DEF_MOD("fcpvd3", 600, R8A7795_CLK_S2D1), /* ES1.x */ 163 + DEF_MOD("fcpvd2", 601, R8A7795_CLK_S0D2), 164 + DEF_MOD("fcpvd1", 602, R8A7795_CLK_S0D2), 165 + DEF_MOD("fcpvd0", 603, R8A7795_CLK_S0D2), 166 + DEF_MOD("fcpvb1", 606, R8A7795_CLK_S0D1), 167 + DEF_MOD("fcpvb0", 607, R8A7795_CLK_S0D1), 168 + DEF_MOD("fcpvi2", 609, R8A7795_CLK_S2D1), /* ES1.x */ 169 + DEF_MOD("fcpvi1", 610, R8A7795_CLK_S0D1), 170 + DEF_MOD("fcpvi0", 611, R8A7795_CLK_S0D1), 171 + DEF_MOD("fcpf2", 613, R8A7795_CLK_S2D1), /* ES1.x */ 172 + DEF_MOD("fcpf1", 614, R8A7795_CLK_S0D1), 173 + DEF_MOD("fcpf0", 615, R8A7795_CLK_S0D1), 174 + DEF_MOD("fcpci1", 616, R8A7795_CLK_S2D1), /* ES1.x */ 175 + DEF_MOD("fcpci0", 617, R8A7795_CLK_S2D1), /* ES1.x */ 176 + DEF_MOD("fcpcs", 619, R8A7795_CLK_S0D1), 177 + DEF_MOD("vspd3", 620, R8A7795_CLK_S2D1), /* ES1.x */ 178 + DEF_MOD("vspd2", 621, R8A7795_CLK_S0D2), 179 + DEF_MOD("vspd1", 622, R8A7795_CLK_S0D2), 180 + DEF_MOD("vspd0", 623, R8A7795_CLK_S0D2), 181 + DEF_MOD("vspbc", 624, R8A7795_CLK_S0D1), 182 + DEF_MOD("vspbd", 626, R8A7795_CLK_S0D1), 183 + DEF_MOD("vspi2", 629, R8A7795_CLK_S2D1), /* ES1.x */ 184 + DEF_MOD("vspi1", 630, R8A7795_CLK_S0D1), 185 + DEF_MOD("vspi0", 631, R8A7795_CLK_S0D1), 192 186 DEF_MOD("ehci2", 701, R8A7795_CLK_S3D4), 193 187 DEF_MOD("ehci1", 702, R8A7795_CLK_S3D4), 194 188 DEF_MOD("ehci0", 703, R8A7795_CLK_S3D4), 195 189 DEF_MOD("hsusb", 704, R8A7795_CLK_S3D4), 196 - DEF_MOD("csi21", 713, R8A7795_CLK_CSI0), 190 + DEF_MOD("csi21", 713, R8A7795_CLK_CSI0), /* ES1.x */ 197 191 DEF_MOD("csi20", 714, R8A7795_CLK_CSI0), 198 192 DEF_MOD("csi41", 715, R8A7795_CLK_CSI0), 199 193 DEF_MOD("csi40", 716, R8A7795_CLK_CSI0), ··· 204 198 DEF_MOD("lvds", 727, R8A7795_CLK_S0D4), 205 199 DEF_MOD("hdmi1", 728, R8A7795_CLK_HDMI), 206 200 DEF_MOD("hdmi0", 729, R8A7795_CLK_HDMI), 207 - DEF_MOD("vin7", 804, R8A7795_CLK_S2D1), 208 - DEF_MOD("vin6", 805, R8A7795_CLK_S2D1), 209 - DEF_MOD("vin5", 806, R8A7795_CLK_S2D1), 210 - DEF_MOD("vin4", 807, R8A7795_CLK_S2D1), 211 - DEF_MOD("vin3", 808, R8A7795_CLK_S2D1), 212 - DEF_MOD("vin2", 809, R8A7795_CLK_S2D1), 213 - DEF_MOD("vin1", 810, R8A7795_CLK_S2D1), 214 - DEF_MOD("vin0", 811, R8A7795_CLK_S2D1), 215 - DEF_MOD("etheravb", 812, R8A7795_CLK_S3D2), 201 + DEF_MOD("vin7", 804, R8A7795_CLK_S0D2), 202 + DEF_MOD("vin6", 805, R8A7795_CLK_S0D2), 203 + DEF_MOD("vin5", 806, R8A7795_CLK_S0D2), 204 + DEF_MOD("vin4", 807, R8A7795_CLK_S0D2), 205 + DEF_MOD("vin3", 808, R8A7795_CLK_S0D2), 206 + DEF_MOD("vin2", 809, R8A7795_CLK_S0D2), 207 + DEF_MOD("vin1", 810, R8A7795_CLK_S0D2), 208 + DEF_MOD("vin0", 811, R8A7795_CLK_S0D2), 209 + DEF_MOD("etheravb", 812, R8A7795_CLK_S0D6), 216 210 DEF_MOD("sata0", 815, R8A7795_CLK_S3D2), 211 + DEF_MOD("imr3", 820, R8A7795_CLK_S0D2), 212 + DEF_MOD("imr2", 821, R8A7795_CLK_S0D2), 213 + DEF_MOD("imr1", 822, R8A7795_CLK_S0D2), 214 + DEF_MOD("imr0", 823, R8A7795_CLK_S0D2), 217 215 DEF_MOD("gpio7", 905, R8A7795_CLK_CP), 218 216 DEF_MOD("gpio6", 906, R8A7795_CLK_CP), 219 217 DEF_MOD("gpio5", 907, R8A7795_CLK_CP), ··· 320 310 { 2, 192, 192, }, 321 311 }; 322 312 313 + static const struct soc_device_attribute r8a7795es1[] __initconst = { 314 + { .soc_id = "r8a7795", .revision = "ES1.*" }, 315 + { /* sentinel */ } 316 + }; 317 + 318 + 319 + /* 320 + * Fixups for R-Car H3 ES1.x 321 + */ 322 + 323 + static const unsigned int r8a7795es1_mod_nullify[] __initconst = { 324 + MOD_CLK_ID(326), /* USB-DMAC3-0 */ 325 + MOD_CLK_ID(329), /* USB-DMAC3-1 */ 326 + MOD_CLK_ID(700), /* EHCI/OHCI3 */ 327 + MOD_CLK_ID(705), /* HS-USB-IF3 */ 328 + 329 + }; 330 + 331 + static const struct mssr_mod_reparent r8a7795es1_mod_reparent[] __initconst = { 332 + { MOD_CLK_ID(118), R8A7795_CLK_S2D1 }, /* FDP1-1 */ 333 + { MOD_CLK_ID(119), R8A7795_CLK_S2D1 }, /* FDP1-0 */ 334 + { MOD_CLK_ID(217), R8A7795_CLK_S3D1 }, /* SYS-DMAC2 */ 335 + { MOD_CLK_ID(218), R8A7795_CLK_S3D1 }, /* SYS-DMAC1 */ 336 + { MOD_CLK_ID(219), R8A7795_CLK_S3D1 }, /* SYS-DMAC0 */ 337 + { MOD_CLK_ID(501), R8A7795_CLK_S3D1 }, /* AUDMAC1 */ 338 + { MOD_CLK_ID(502), R8A7795_CLK_S3D1 }, /* AUDMAC0 */ 339 + { MOD_CLK_ID(601), R8A7795_CLK_S2D1 }, /* FCPVD2 */ 340 + { MOD_CLK_ID(602), R8A7795_CLK_S2D1 }, /* FCPVD1 */ 341 + { MOD_CLK_ID(603), R8A7795_CLK_S2D1 }, /* FCPVD0 */ 342 + { MOD_CLK_ID(606), R8A7795_CLK_S2D1 }, /* FCPVB1 */ 343 + { MOD_CLK_ID(607), R8A7795_CLK_S2D1 }, /* FCPVB0 */ 344 + { MOD_CLK_ID(610), R8A7795_CLK_S2D1 }, /* FCPVI1 */ 345 + { MOD_CLK_ID(611), R8A7795_CLK_S2D1 }, /* FCPVI0 */ 346 + { MOD_CLK_ID(614), R8A7795_CLK_S2D1 }, /* FCPF1 */ 347 + { MOD_CLK_ID(615), R8A7795_CLK_S2D1 }, /* FCPF0 */ 348 + { MOD_CLK_ID(619), R8A7795_CLK_S2D1 }, /* FCPCS */ 349 + { MOD_CLK_ID(621), R8A7795_CLK_S2D1 }, /* VSPD2 */ 350 + { MOD_CLK_ID(622), R8A7795_CLK_S2D1 }, /* VSPD1 */ 351 + { MOD_CLK_ID(623), R8A7795_CLK_S2D1 }, /* VSPD0 */ 352 + { MOD_CLK_ID(624), R8A7795_CLK_S2D1 }, /* VSPBC */ 353 + { MOD_CLK_ID(626), R8A7795_CLK_S2D1 }, /* VSPBD */ 354 + { MOD_CLK_ID(630), R8A7795_CLK_S2D1 }, /* VSPI1 */ 355 + { MOD_CLK_ID(631), R8A7795_CLK_S2D1 }, /* VSPI0 */ 356 + { MOD_CLK_ID(804), R8A7795_CLK_S2D1 }, /* VIN7 */ 357 + { MOD_CLK_ID(805), R8A7795_CLK_S2D1 }, /* VIN6 */ 358 + { MOD_CLK_ID(806), R8A7795_CLK_S2D1 }, /* VIN5 */ 359 + { MOD_CLK_ID(807), R8A7795_CLK_S2D1 }, /* VIN4 */ 360 + { MOD_CLK_ID(808), R8A7795_CLK_S2D1 }, /* VIN3 */ 361 + { MOD_CLK_ID(809), R8A7795_CLK_S2D1 }, /* VIN2 */ 362 + { MOD_CLK_ID(810), R8A7795_CLK_S2D1 }, /* VIN1 */ 363 + { MOD_CLK_ID(811), R8A7795_CLK_S2D1 }, /* VIN0 */ 364 + { MOD_CLK_ID(812), R8A7795_CLK_S3D2 }, /* EAVB-IF */ 365 + { MOD_CLK_ID(820), R8A7795_CLK_S2D1 }, /* IMR3 */ 366 + { MOD_CLK_ID(821), R8A7795_CLK_S2D1 }, /* IMR2 */ 367 + { MOD_CLK_ID(822), R8A7795_CLK_S2D1 }, /* IMR1 */ 368 + { MOD_CLK_ID(823), R8A7795_CLK_S2D1 }, /* IMR0 */ 369 + }; 370 + 371 + 372 + /* 373 + * Fixups for R-Car H3 ES2.x 374 + */ 375 + 376 + static const unsigned int r8a7795es2_mod_nullify[] __initconst = { 377 + MOD_CLK_ID(117), /* FDP1-2 */ 378 + MOD_CLK_ID(327), /* USB3-IF1 */ 379 + MOD_CLK_ID(600), /* FCPVD3 */ 380 + MOD_CLK_ID(609), /* FCPVI2 */ 381 + MOD_CLK_ID(613), /* FCPF2 */ 382 + MOD_CLK_ID(616), /* FCPCI1 */ 383 + MOD_CLK_ID(617), /* FCPCI0 */ 384 + MOD_CLK_ID(620), /* VSPD3 */ 385 + MOD_CLK_ID(629), /* VSPI2 */ 386 + MOD_CLK_ID(713), /* CSI21 */ 387 + }; 388 + 323 389 static int __init r8a7795_cpg_mssr_init(struct device *dev) 324 390 { 325 391 const struct rcar_gen3_cpg_pll_config *cpg_pll_config; ··· 412 326 return -EINVAL; 413 327 } 414 328 415 - return rcar_gen3_cpg_init(cpg_pll_config, CLK_EXTALR); 329 + if (soc_device_match(r8a7795es1)) { 330 + cpg_core_nullify_range(r8a7795_core_clks, 331 + ARRAY_SIZE(r8a7795_core_clks), 332 + R8A7795_CLK_S0D2, R8A7795_CLK_S0D12); 333 + mssr_mod_nullify(r8a7795_mod_clks, 334 + ARRAY_SIZE(r8a7795_mod_clks), 335 + r8a7795es1_mod_nullify, 336 + ARRAY_SIZE(r8a7795es1_mod_nullify)); 337 + mssr_mod_reparent(r8a7795_mod_clks, 338 + ARRAY_SIZE(r8a7795_mod_clks), 339 + r8a7795es1_mod_reparent, 340 + ARRAY_SIZE(r8a7795es1_mod_reparent)); 341 + } else { 342 + mssr_mod_nullify(r8a7795_mod_clks, 343 + ARRAY_SIZE(r8a7795_mod_clks), 344 + r8a7795es2_mod_nullify, 345 + ARRAY_SIZE(r8a7795es2_mod_nullify)); 346 + } 347 + 348 + return rcar_gen3_cpg_init(cpg_pll_config, CLK_EXTALR, cpg_mode); 416 349 } 417 350 418 351 const struct cpg_mssr_info r8a7795_cpg_mssr_info __initconst = {
+10 -8
drivers/clk/renesas/r8a7796-cpg-mssr.c
··· 54 54 55 55 static const struct cpg_core_clk r8a7796_core_clks[] __initconst = { 56 56 /* External Clock Inputs */ 57 - DEF_INPUT("extal", CLK_EXTAL), 58 - DEF_INPUT("extalr", CLK_EXTALR), 57 + DEF_INPUT("extal", CLK_EXTAL), 58 + DEF_INPUT("extalr", CLK_EXTALR), 59 59 60 60 /* Internal Core Clocks */ 61 61 DEF_BASE(".main", CLK_MAIN, CLK_TYPE_GEN3_MAIN, CLK_EXTAL), ··· 95 95 DEF_FIXED("s3d2", R8A7796_CLK_S3D2, CLK_S3, 2, 1), 96 96 DEF_FIXED("s3d4", R8A7796_CLK_S3D4, CLK_S3, 4, 1), 97 97 98 - DEF_GEN3_SD("sd0", R8A7796_CLK_SD0, CLK_SDSRC, 0x0074), 99 - DEF_GEN3_SD("sd1", R8A7796_CLK_SD1, CLK_SDSRC, 0x0078), 100 - DEF_GEN3_SD("sd2", R8A7796_CLK_SD2, CLK_SDSRC, 0x0268), 101 - DEF_GEN3_SD("sd3", R8A7796_CLK_SD3, CLK_SDSRC, 0x026c), 98 + DEF_GEN3_SD("sd0", R8A7796_CLK_SD0, CLK_SDSRC, 0x074), 99 + DEF_GEN3_SD("sd1", R8A7796_CLK_SD1, CLK_SDSRC, 0x078), 100 + DEF_GEN3_SD("sd2", R8A7796_CLK_SD2, CLK_SDSRC, 0x268), 101 + DEF_GEN3_SD("sd3", R8A7796_CLK_SD3, CLK_SDSRC, 0x26c), 102 102 103 103 DEF_FIXED("cl", R8A7796_CLK_CL, CLK_PLL1_DIV2, 48, 1), 104 104 DEF_FIXED("cp", R8A7796_CLK_CP, CLK_EXTAL, 2, 1), ··· 135 135 DEF_MOD("sdif2", 312, R8A7796_CLK_SD2), 136 136 DEF_MOD("sdif1", 313, R8A7796_CLK_SD1), 137 137 DEF_MOD("sdif0", 314, R8A7796_CLK_SD0), 138 - DEF_MOD("rwdt0", 402, R8A7796_CLK_R), 138 + DEF_MOD("rwdt", 402, R8A7796_CLK_R), 139 139 DEF_MOD("intc-ap", 408, R8A7796_CLK_S3D1), 140 140 DEF_MOD("drif7", 508, R8A7796_CLK_S3D2), 141 141 DEF_MOD("drif6", 509, R8A7796_CLK_S3D2), ··· 179 179 DEF_MOD("vin1", 810, R8A7796_CLK_S0D2), 180 180 DEF_MOD("vin0", 811, R8A7796_CLK_S0D2), 181 181 DEF_MOD("etheravb", 812, R8A7796_CLK_S0D6), 182 + DEF_MOD("imr1", 822, R8A7796_CLK_S0D2), 183 + DEF_MOD("imr0", 823, R8A7796_CLK_S0D2), 182 184 DEF_MOD("gpio7", 905, R8A7796_CLK_S3D4), 183 185 DEF_MOD("gpio6", 906, R8A7796_CLK_S3D4), 184 186 DEF_MOD("gpio5", 907, R8A7796_CLK_S3D4), ··· 273 271 return -EINVAL; 274 272 } 275 273 276 - return rcar_gen3_cpg_init(cpg_pll_config, CLK_EXTALR); 274 + return rcar_gen3_cpg_init(cpg_pll_config, CLK_EXTALR, cpg_mode); 277 275 } 278 276 279 277 const struct cpg_mssr_info r8a7796_cpg_mssr_info __initconst = {
+52 -10
drivers/clk/renesas/rcar-gen3-cpg.c
··· 20 20 #include <linux/init.h> 21 21 #include <linux/io.h> 22 22 #include <linux/slab.h> 23 + #include <linux/sys_soc.h> 23 24 24 25 #include "renesas-cpg-mssr.h" 25 26 #include "rcar-gen3-cpg.h" ··· 248 247 249 248 static const struct rcar_gen3_cpg_pll_config *cpg_pll_config __initdata; 250 249 static unsigned int cpg_clk_extalr __initdata; 250 + static u32 cpg_mode __initdata; 251 + static u32 cpg_quirks __initdata; 252 + 253 + #define PLL_ERRATA BIT(0) /* Missing PLL0/2/4 post-divider */ 254 + #define RCKCR_CKSEL BIT(1) /* Manual RCLK parent selection */ 255 + 256 + static const struct soc_device_attribute cpg_quirks_match[] __initconst = { 257 + { 258 + .soc_id = "r8a7795", .revision = "ES1.0", 259 + .data = (void *)(PLL_ERRATA | RCKCR_CKSEL), 260 + }, 261 + { 262 + .soc_id = "r8a7795", .revision = "ES1.*", 263 + .data = (void *)RCKCR_CKSEL, 264 + }, 265 + { 266 + .soc_id = "r8a7796", .revision = "ES1.0", 267 + .data = (void *)RCKCR_CKSEL, 268 + }, 269 + { /* sentinel */ } 270 + }; 251 271 252 272 struct clk * __init rcar_gen3_cpg_clk_register(struct device *dev, 253 273 const struct cpg_core_clk *core, const struct cpg_mssr_info *info, ··· 297 275 */ 298 276 value = readl(base + CPG_PLL0CR); 299 277 mult = (((value >> 24) & 0x7f) + 1) * 2; 278 + if (cpg_quirks & PLL_ERRATA) 279 + mult *= 2; 300 280 break; 301 281 302 282 case CLK_TYPE_GEN3_PLL1: ··· 314 290 */ 315 291 value = readl(base + CPG_PLL2CR); 316 292 mult = (((value >> 24) & 0x7f) + 1) * 2; 293 + if (cpg_quirks & PLL_ERRATA) 294 + mult *= 2; 317 295 break; 318 296 319 297 case CLK_TYPE_GEN3_PLL3: ··· 331 305 */ 332 306 value = readl(base + CPG_PLL4CR); 333 307 mult = (((value >> 24) & 0x7f) + 1) * 2; 308 + if (cpg_quirks & PLL_ERRATA) 309 + mult *= 2; 334 310 break; 335 311 336 312 case CLK_TYPE_GEN3_SD: 337 313 return cpg_sd_clk_register(core, base, __clk_get_name(parent)); 338 314 339 315 case CLK_TYPE_GEN3_R: 340 - /* 341 - * RINT is default. 342 - * Only if EXTALR is populated, we switch to it. 343 - */ 344 - value = readl(base + CPG_RCKCR) & 0x3f; 316 + if (cpg_quirks & RCKCR_CKSEL) { 317 + /* 318 + * RINT is default. 319 + * Only if EXTALR is populated, we switch to it. 320 + */ 321 + value = readl(base + CPG_RCKCR) & 0x3f; 345 322 346 - if (clk_get_rate(clks[cpg_clk_extalr])) { 347 - parent = clks[cpg_clk_extalr]; 348 - value |= BIT(15); 323 + if (clk_get_rate(clks[cpg_clk_extalr])) { 324 + parent = clks[cpg_clk_extalr]; 325 + value |= BIT(15); 326 + } 327 + 328 + writel(value, base + CPG_RCKCR); 329 + break; 349 330 } 350 331 351 - writel(value, base + CPG_RCKCR); 332 + /* Select parent clock of RCLK by MD28 */ 333 + if (cpg_mode & BIT(28)) 334 + parent = clks[cpg_clk_extalr]; 352 335 break; 353 336 354 337 default: ··· 369 334 } 370 335 371 336 int __init rcar_gen3_cpg_init(const struct rcar_gen3_cpg_pll_config *config, 372 - unsigned int clk_extalr) 337 + unsigned int clk_extalr, u32 mode) 373 338 { 339 + const struct soc_device_attribute *attr; 340 + 374 341 cpg_pll_config = config; 375 342 cpg_clk_extalr = clk_extalr; 343 + cpg_mode = mode; 344 + attr = soc_device_match(cpg_quirks_match); 345 + if (attr) 346 + cpg_quirks = (uintptr_t)attr->data; 347 + pr_debug("%s: mode = 0x%x quirks = 0x%x\n", __func__, mode, cpg_quirks); 376 348 return 0; 377 349 }
+1 -1
drivers/clk/renesas/rcar-gen3-cpg.h
··· 37 37 const struct cpg_core_clk *core, const struct cpg_mssr_info *info, 38 38 struct clk **clks, void __iomem *base); 39 39 int rcar_gen3_cpg_init(const struct rcar_gen3_cpg_pll_config *config, 40 - unsigned int clk_extalr); 40 + unsigned int clk_extalr, u32 mode); 41 41 42 42 #endif
+50
drivers/clk/renesas/renesas-cpg-mssr.c
··· 265 265 WARN_DEBUG(id >= priv->num_core_clks); 266 266 WARN_DEBUG(PTR_ERR(priv->clks[id]) != -ENOENT); 267 267 268 + if (!core->name) { 269 + /* Skip NULLified clock */ 270 + return; 271 + } 272 + 268 273 switch (core->type) { 269 274 case CLK_TYPE_IN: 270 275 clk = of_clk_get_by_name(priv->dev->of_node, core->name); ··· 339 334 WARN_DEBUG(id >= priv->num_core_clks + priv->num_mod_clks); 340 335 WARN_DEBUG(mod->parent >= priv->num_core_clks + priv->num_mod_clks); 341 336 WARN_DEBUG(PTR_ERR(priv->clks[id]) != -ENOENT); 337 + 338 + if (!mod->name) { 339 + /* Skip NULLified clock */ 340 + return; 341 + } 342 342 343 343 parent = priv->clks[mod->parent]; 344 344 if (IS_ERR(parent)) { ··· 743 733 } 744 734 745 735 subsys_initcall(cpg_mssr_init); 736 + 737 + void __init cpg_core_nullify_range(struct cpg_core_clk *core_clks, 738 + unsigned int num_core_clks, 739 + unsigned int first_clk, 740 + unsigned int last_clk) 741 + { 742 + unsigned int i; 743 + 744 + for (i = 0; i < num_core_clks; i++) 745 + if (core_clks[i].id >= first_clk && 746 + core_clks[i].id <= last_clk) 747 + core_clks[i].name = NULL; 748 + } 749 + 750 + void __init mssr_mod_nullify(struct mssr_mod_clk *mod_clks, 751 + unsigned int num_mod_clks, 752 + const unsigned int *clks, unsigned int n) 753 + { 754 + unsigned int i, j; 755 + 756 + for (i = 0, j = 0; i < num_mod_clks && j < n; i++) 757 + if (mod_clks[i].id == clks[j]) { 758 + mod_clks[i].name = NULL; 759 + j++; 760 + } 761 + } 762 + 763 + void __init mssr_mod_reparent(struct mssr_mod_clk *mod_clks, 764 + unsigned int num_mod_clks, 765 + const struct mssr_mod_reparent *clks, 766 + unsigned int n) 767 + { 768 + unsigned int i, j; 769 + 770 + for (i = 0, j = 0; i < num_mod_clks && j < n; i++) 771 + if (mod_clks[i].id == clks[j].clk) { 772 + mod_clks[i].parent = clks[j].parent; 773 + j++; 774 + } 775 + } 746 776 747 777 MODULE_DESCRIPTION("Renesas CPG/MSSR Driver"); 748 778 MODULE_LICENSE("GPL v2");
+22
drivers/clk/renesas/renesas-cpg-mssr.h
··· 134 134 extern const struct cpg_mssr_info r8a7745_cpg_mssr_info; 135 135 extern const struct cpg_mssr_info r8a7795_cpg_mssr_info; 136 136 extern const struct cpg_mssr_info r8a7796_cpg_mssr_info; 137 + 138 + 139 + /* 140 + * Helpers for fixing up clock tables depending on SoC revision 141 + */ 142 + 143 + struct mssr_mod_reparent { 144 + unsigned int clk, parent; 145 + }; 146 + 147 + 148 + extern void cpg_core_nullify_range(struct cpg_core_clk *core_clks, 149 + unsigned int num_core_clks, 150 + unsigned int first_clk, 151 + unsigned int last_clk); 152 + extern void mssr_mod_nullify(struct mssr_mod_clk *mod_clks, 153 + unsigned int num_mod_clks, 154 + const unsigned int *clks, unsigned int n); 155 + extern void mssr_mod_reparent(struct mssr_mod_clk *mod_clks, 156 + unsigned int num_mod_clks, 157 + const struct mssr_mod_reparent *clks, 158 + unsigned int n); 137 159 #endif
+7
include/dt-bindings/clock/r8a7795-cpg-mssr.h
··· 60 60 #define R8A7795_CLK_R 45 61 61 #define R8A7795_CLK_OSC 46 62 62 63 + /* r8a7795 ES2.0 CPG Core Clocks */ 64 + #define R8A7795_CLK_S0D2 47 65 + #define R8A7795_CLK_S0D3 48 66 + #define R8A7795_CLK_S0D6 49 67 + #define R8A7795_CLK_S0D8 50 68 + #define R8A7795_CLK_S0D12 51 69 + 63 70 #endif /* __DT_BINDINGS_CLOCK_R8A7795_CPG_MSSR_H__ */