.. | .. |
---|
1 | 1 | // SPDX-License-Identifier: GPL-2.0 |
---|
2 | 2 | /* |
---|
3 | | - * R9A09G032 clock driver |
---|
| 3 | + * R9A06G032 clock driver |
---|
4 | 4 | * |
---|
5 | 5 | * Copyright (C) 2018 Renesas Electronics Europe Limited |
---|
6 | 6 | * |
---|
.. | .. |
---|
11 | 11 | #include <linux/clk-provider.h> |
---|
12 | 12 | #include <linux/delay.h> |
---|
13 | 13 | #include <linux/init.h> |
---|
| 14 | +#include <linux/io.h> |
---|
14 | 15 | #include <linux/kernel.h> |
---|
15 | 16 | #include <linux/math64.h> |
---|
16 | 17 | #include <linux/of.h> |
---|
17 | 18 | #include <linux/of_address.h> |
---|
18 | 19 | #include <linux/platform_device.h> |
---|
| 20 | +#include <linux/pm_clock.h> |
---|
| 21 | +#include <linux/pm_domain.h> |
---|
19 | 22 | #include <linux/slab.h> |
---|
20 | 23 | #include <linux/spinlock.h> |
---|
21 | 24 | #include <dt-bindings/clock/r9a06g032-sysctrl.h> |
---|
.. | .. |
---|
28 | 31 | /* This is used to describe a clock for instantiation */ |
---|
29 | 32 | struct r9a06g032_clkdesc { |
---|
30 | 33 | const char *name; |
---|
| 34 | + uint32_t managed: 1; |
---|
31 | 35 | uint32_t type: 3; |
---|
32 | 36 | uint32_t index: 8; |
---|
33 | 37 | uint32_t source : 8; /* source index + 1 (0 == none) */ |
---|
.. | .. |
---|
60 | 64 | #define D_GATE(_idx, _n, _src, ...) \ |
---|
61 | 65 | { .type = K_GATE, .index = R9A06G032_##_idx, \ |
---|
62 | 66 | .source = 1 + R9A06G032_##_src, .name = _n, \ |
---|
63 | | - .gate = I_GATE(__VA_ARGS__), } |
---|
| 67 | + .gate = I_GATE(__VA_ARGS__) } |
---|
| 68 | +#define D_MODULE(_idx, _n, _src, ...) \ |
---|
| 69 | + { .type = K_GATE, .index = R9A06G032_##_idx, \ |
---|
| 70 | + .source = 1 + R9A06G032_##_src, .name = _n, \ |
---|
| 71 | + .managed = 1, .gate = I_GATE(__VA_ARGS__) } |
---|
64 | 72 | #define D_ROOT(_idx, _n, _mul, _div) \ |
---|
65 | 73 | { .type = K_FFC, .index = R9A06G032_##_idx, .name = _n, \ |
---|
66 | 74 | .div = _div, .mul = _mul } |
---|
.. | .. |
---|
121 | 129 | |
---|
122 | 130 | #define R9A06G032_CLOCK_COUNT (R9A06G032_UART_GROUP_34567 + 1) |
---|
123 | 131 | |
---|
124 | | -static const struct r9a06g032_clkdesc r9a06g032_clocks[] __initconst = { |
---|
| 132 | +static const struct r9a06g032_clkdesc r9a06g032_clocks[] = { |
---|
125 | 133 | D_ROOT(CLKOUT, "clkout", 25, 1), |
---|
126 | 134 | D_ROOT(CLK_PLL_USB, "clk_pll_usb", 12, 10), |
---|
127 | 135 | D_FFC(CLKOUT_D10, "clkout_d10", CLKOUT, 10), |
---|
.. | .. |
---|
170 | 178 | D_GATE(CLK_P6_PG2, "clk_p6_pg2", DIV_P6_PG, 0x8a3, 0x8a4, 0x8a5, 0, 0xb61, 0, 0), |
---|
171 | 179 | D_GATE(CLK_P6_PG3, "clk_p6_pg3", DIV_P6_PG, 0x8a6, 0x8a7, 0x8a8, 0, 0xb62, 0, 0), |
---|
172 | 180 | D_GATE(CLK_P6_PG4, "clk_p6_pg4", DIV_P6_PG, 0x8a9, 0x8aa, 0x8ab, 0, 0xb63, 0, 0), |
---|
| 181 | + D_MODULE(CLK_PCI_USB, "clk_pci_usb", CLKOUT_D40, 0xe6, 0, 0, 0, 0, 0, 0), |
---|
173 | 182 | D_GATE(CLK_QSPI0, "clk_qspi0", DIV_QSPI0, 0x2a4, 0x2a5, 0, 0, 0, 0, 0), |
---|
174 | 183 | D_GATE(CLK_QSPI1, "clk_qspi1", DIV_QSPI1, 0x484, 0x485, 0, 0, 0, 0, 0), |
---|
175 | 184 | D_GATE(CLK_RGMII_REF, "clk_rgmii_ref", CLKOUT_D8, 0x340, 0, 0, 0, 0, 0, 0), |
---|
.. | .. |
---|
186 | 195 | D_GATE(CLK_SPI5, "clk_spi5", DIV_P4_PG, 0x822, 0x823, 0, 0, 0, 0, 0), |
---|
187 | 196 | D_GATE(CLK_SWITCH, "clk_switch", DIV_SWITCH, 0x982, 0x983, 0, 0, 0, 0, 0), |
---|
188 | 197 | D_DIV(DIV_MOTOR, "div_motor", CLKOUT_D5, 84, 2, 8), |
---|
189 | | - D_GATE(HCLK_ECAT125, "hclk_ecat125", CLKOUT_D8, 0x400, 0x401, 0, 0x402, 0, 0x440, 0x441), |
---|
190 | | - D_GATE(HCLK_PINCONFIG, "hclk_pinconfig", CLKOUT_D40, 0x740, 0x741, 0x742, 0, 0xae0, 0, 0), |
---|
191 | | - D_GATE(HCLK_SERCOS, "hclk_sercos", CLKOUT_D10, 0x420, 0x422, 0, 0x421, 0, 0x460, 0x461), |
---|
192 | | - D_GATE(HCLK_SGPIO2, "hclk_sgpio2", DIV_P5_PG, 0x8c3, 0x8c4, 0x8c5, 0, 0xb41, 0, 0), |
---|
193 | | - D_GATE(HCLK_SGPIO3, "hclk_sgpio3", DIV_P5_PG, 0x8c6, 0x8c7, 0x8c8, 0, 0xb42, 0, 0), |
---|
194 | | - D_GATE(HCLK_SGPIO4, "hclk_sgpio4", DIV_P5_PG, 0x8c9, 0x8ca, 0x8cb, 0, 0xb43, 0, 0), |
---|
195 | | - D_GATE(HCLK_TIMER0, "hclk_timer0", CLKOUT_D40, 0x743, 0x744, 0x745, 0, 0xae1, 0, 0), |
---|
196 | | - D_GATE(HCLK_TIMER1, "hclk_timer1", CLKOUT_D40, 0x746, 0x747, 0x748, 0, 0xae2, 0, 0), |
---|
197 | | - D_GATE(HCLK_USBF, "hclk_usbf", CLKOUT_D8, 0xe3, 0, 0, 0xe4, 0, 0x102, 0x103), |
---|
198 | | - D_GATE(HCLK_USBH, "hclk_usbh", CLKOUT_D8, 0xe0, 0xe1, 0, 0xe2, 0, 0x100, 0x101), |
---|
199 | | - D_GATE(HCLK_USBPM, "hclk_usbpm", CLKOUT_D8, 0xe5, 0, 0, 0, 0, 0, 0), |
---|
| 198 | + D_MODULE(HCLK_ECAT125, "hclk_ecat125", CLKOUT_D8, 0x400, 0x401, 0, 0x402, 0, 0x440, 0x441), |
---|
| 199 | + D_MODULE(HCLK_PINCONFIG, "hclk_pinconfig", CLKOUT_D40, 0x740, 0x741, 0x742, 0, 0xae0, 0, 0), |
---|
| 200 | + D_MODULE(HCLK_SERCOS, "hclk_sercos", CLKOUT_D10, 0x420, 0x422, 0, 0x421, 0, 0x460, 0x461), |
---|
| 201 | + D_MODULE(HCLK_SGPIO2, "hclk_sgpio2", DIV_P5_PG, 0x8c3, 0x8c4, 0x8c5, 0, 0xb41, 0, 0), |
---|
| 202 | + D_MODULE(HCLK_SGPIO3, "hclk_sgpio3", DIV_P5_PG, 0x8c6, 0x8c7, 0x8c8, 0, 0xb42, 0, 0), |
---|
| 203 | + D_MODULE(HCLK_SGPIO4, "hclk_sgpio4", DIV_P5_PG, 0x8c9, 0x8ca, 0x8cb, 0, 0xb43, 0, 0), |
---|
| 204 | + D_MODULE(HCLK_TIMER0, "hclk_timer0", CLKOUT_D40, 0x743, 0x744, 0x745, 0, 0xae1, 0, 0), |
---|
| 205 | + D_MODULE(HCLK_TIMER1, "hclk_timer1", CLKOUT_D40, 0x746, 0x747, 0x748, 0, 0xae2, 0, 0), |
---|
| 206 | + D_MODULE(HCLK_USBF, "hclk_usbf", CLKOUT_D8, 0xe3, 0, 0, 0xe4, 0, 0x102, 0x103), |
---|
| 207 | + D_MODULE(HCLK_USBH, "hclk_usbh", CLKOUT_D8, 0xe0, 0xe1, 0, 0xe2, 0, 0x100, 0x101), |
---|
| 208 | + D_MODULE(HCLK_USBPM, "hclk_usbpm", CLKOUT_D8, 0xe5, 0, 0, 0, 0, 0, 0), |
---|
200 | 209 | D_GATE(CLK_48_PG_F, "clk_48_pg_f", CLK_48, 0x78c, 0x78d, 0, 0x78e, 0, 0xb04, 0xb05), |
---|
201 | 210 | D_GATE(CLK_48_PG4, "clk_48_pg4", CLK_48, 0x789, 0x78a, 0x78b, 0, 0xb03, 0, 0), |
---|
202 | 211 | D_FFC(CLK_DDRPHY_PLLCLK_D4, "clk_ddrphy_pllclk_d4", CLK_DDRPHY_PLLCLK, 4), |
---|
.. | .. |
---|
206 | 215 | D_FFC(CLK_REF_SYNC_D8, "clk_ref_sync_d8", CLK_REF_SYNC, 8), |
---|
207 | 216 | D_FFC(CLK_SERCOS100_D2, "clk_sercos100_d2", CLK_SERCOS100, 2), |
---|
208 | 217 | D_DIV(DIV_CA7, "div_ca7", CLK_REF_SYNC, 57, 1, 4, 1, 2, 4), |
---|
209 | | - D_GATE(HCLK_CAN0, "hclk_can0", CLK_48, 0x783, 0x784, 0x785, 0, 0xb01, 0, 0), |
---|
210 | | - D_GATE(HCLK_CAN1, "hclk_can1", CLK_48, 0x786, 0x787, 0x788, 0, 0xb02, 0, 0), |
---|
211 | | - D_GATE(HCLK_DELTASIGMA, "hclk_deltasigma", DIV_MOTOR, 0x1ef, 0x1f0, 0x1f1, 0, 0, 0, 0), |
---|
212 | | - D_GATE(HCLK_PWMPTO, "hclk_pwmpto", DIV_MOTOR, 0x1ec, 0x1ed, 0x1ee, 0, 0, 0, 0), |
---|
213 | | - D_GATE(HCLK_RSV, "hclk_rsv", CLK_48, 0x780, 0x781, 0x782, 0, 0xb00, 0, 0), |
---|
214 | | - D_GATE(HCLK_SGPIO0, "hclk_sgpio0", DIV_MOTOR, 0x1e0, 0x1e1, 0x1e2, 0, 0, 0, 0), |
---|
215 | | - D_GATE(HCLK_SGPIO1, "hclk_sgpio1", DIV_MOTOR, 0x1e3, 0x1e4, 0x1e5, 0, 0, 0, 0), |
---|
| 218 | + D_MODULE(HCLK_CAN0, "hclk_can0", CLK_48, 0x783, 0x784, 0x785, 0, 0xb01, 0, 0), |
---|
| 219 | + D_MODULE(HCLK_CAN1, "hclk_can1", CLK_48, 0x786, 0x787, 0x788, 0, 0xb02, 0, 0), |
---|
| 220 | + D_MODULE(HCLK_DELTASIGMA, "hclk_deltasigma", DIV_MOTOR, 0x1ef, 0x1f0, 0x1f1, 0, 0, 0, 0), |
---|
| 221 | + D_MODULE(HCLK_PWMPTO, "hclk_pwmpto", DIV_MOTOR, 0x1ec, 0x1ed, 0x1ee, 0, 0, 0, 0), |
---|
| 222 | + D_MODULE(HCLK_RSV, "hclk_rsv", CLK_48, 0x780, 0x781, 0x782, 0, 0xb00, 0, 0), |
---|
| 223 | + D_MODULE(HCLK_SGPIO0, "hclk_sgpio0", DIV_MOTOR, 0x1e0, 0x1e1, 0x1e2, 0, 0, 0, 0), |
---|
| 224 | + D_MODULE(HCLK_SGPIO1, "hclk_sgpio1", DIV_MOTOR, 0x1e3, 0x1e4, 0x1e5, 0, 0, 0, 0), |
---|
216 | 225 | D_DIV(RTOS_MDC, "rtos_mdc", CLK_REF_SYNC, 100, 80, 640, 80, 160, 320, 640), |
---|
217 | 226 | D_GATE(CLK_CM3, "clk_cm3", CLK_REF_SYNC_D4, 0xba0, 0xba1, 0, 0xba2, 0, 0xbc0, 0xbc1), |
---|
218 | 227 | D_GATE(CLK_DDRC, "clk_ddrc", CLK_DDRPHY_PLLCLK_D4, 0x323, 0x324, 0, 0, 0, 0, 0), |
---|
.. | .. |
---|
220 | 229 | D_GATE(CLK_HSR50, "clk_hsr50", CLK_HSR100_D2, 0x484, 0x485, 0, 0, 0, 0, 0), |
---|
221 | 230 | D_GATE(CLK_HW_RTOS, "clk_hw_rtos", CLK_REF_SYNC_D4, 0xc60, 0xc61, 0, 0, 0, 0, 0), |
---|
222 | 231 | D_GATE(CLK_SERCOS50, "clk_sercos50", CLK_SERCOS100_D2, 0x424, 0x423, 0, 0, 0, 0, 0), |
---|
223 | | - D_GATE(HCLK_ADC, "hclk_adc", CLK_REF_SYNC_D8, 0x1af, 0x1b0, 0x1b1, 0, 0, 0, 0), |
---|
224 | | - D_GATE(HCLK_CM3, "hclk_cm3", CLK_REF_SYNC_D4, 0xc20, 0xc21, 0xc22, 0, 0, 0, 0), |
---|
225 | | - D_GATE(HCLK_CRYPTO_EIP150, "hclk_crypto_eip150", CLK_REF_SYNC_D4, 0x123, 0x124, 0x125, 0, 0x142, 0, 0), |
---|
226 | | - D_GATE(HCLK_CRYPTO_EIP93, "hclk_crypto_eip93", CLK_REF_SYNC_D4, 0x120, 0x121, 0, 0x122, 0, 0x140, 0x141), |
---|
227 | | - D_GATE(HCLK_DDRC, "hclk_ddrc", CLK_REF_SYNC_D4, 0x320, 0x322, 0, 0x321, 0, 0x3a0, 0x3a1), |
---|
228 | | - D_GATE(HCLK_DMA0, "hclk_dma0", CLK_REF_SYNC_D4, 0x260, 0x261, 0x262, 0x263, 0x2c0, 0x2c1, 0x2c2), |
---|
229 | | - D_GATE(HCLK_DMA1, "hclk_dma1", CLK_REF_SYNC_D4, 0x264, 0x265, 0x266, 0x267, 0x2c3, 0x2c4, 0x2c5), |
---|
230 | | - D_GATE(HCLK_GMAC0, "hclk_gmac0", CLK_REF_SYNC_D4, 0x360, 0x361, 0x362, 0x363, 0x3c0, 0x3c1, 0x3c2), |
---|
231 | | - D_GATE(HCLK_GMAC1, "hclk_gmac1", CLK_REF_SYNC_D4, 0x380, 0x381, 0x382, 0x383, 0x3e0, 0x3e1, 0x3e2), |
---|
232 | | - D_GATE(HCLK_GPIO0, "hclk_gpio0", CLK_REF_SYNC_D4, 0x212, 0x213, 0x214, 0, 0, 0, 0), |
---|
233 | | - D_GATE(HCLK_GPIO1, "hclk_gpio1", CLK_REF_SYNC_D4, 0x215, 0x216, 0x217, 0, 0, 0, 0), |
---|
234 | | - D_GATE(HCLK_GPIO2, "hclk_gpio2", CLK_REF_SYNC_D4, 0x229, 0x22a, 0x22b, 0, 0, 0, 0), |
---|
235 | | - D_GATE(HCLK_HSR, "hclk_hsr", CLK_HSR100_D2, 0x480, 0x482, 0, 0x481, 0, 0x4c0, 0x4c1), |
---|
236 | | - D_GATE(HCLK_I2C0, "hclk_i2c0", CLK_REF_SYNC_D8, 0x1a9, 0x1aa, 0x1ab, 0, 0, 0, 0), |
---|
237 | | - D_GATE(HCLK_I2C1, "hclk_i2c1", CLK_REF_SYNC_D8, 0x1ac, 0x1ad, 0x1ae, 0, 0, 0, 0), |
---|
238 | | - D_GATE(HCLK_LCD, "hclk_lcd", CLK_REF_SYNC_D4, 0x7a0, 0x7a1, 0x7a2, 0, 0xb20, 0, 0), |
---|
239 | | - D_GATE(HCLK_MSEBI_M, "hclk_msebi_m", CLK_REF_SYNC_D4, 0x164, 0x165, 0x166, 0, 0x183, 0, 0), |
---|
240 | | - D_GATE(HCLK_MSEBI_S, "hclk_msebi_s", CLK_REF_SYNC_D4, 0x160, 0x161, 0x162, 0x163, 0x180, 0x181, 0x182), |
---|
241 | | - D_GATE(HCLK_NAND, "hclk_nand", CLK_REF_SYNC_D4, 0x280, 0x281, 0x282, 0x283, 0x2e0, 0x2e1, 0x2e2), |
---|
242 | | - D_GATE(HCLK_PG_I, "hclk_pg_i", CLK_REF_SYNC_D4, 0x7ac, 0x7ad, 0, 0x7ae, 0, 0xb24, 0xb25), |
---|
243 | | - D_GATE(HCLK_PG19, "hclk_pg19", CLK_REF_SYNC_D4, 0x22c, 0x22d, 0x22e, 0, 0, 0, 0), |
---|
244 | | - D_GATE(HCLK_PG20, "hclk_pg20", CLK_REF_SYNC_D4, 0x22f, 0x230, 0x231, 0, 0, 0, 0), |
---|
245 | | - D_GATE(HCLK_PG3, "hclk_pg3", CLK_REF_SYNC_D4, 0x7a6, 0x7a7, 0x7a8, 0, 0xb22, 0, 0), |
---|
246 | | - D_GATE(HCLK_PG4, "hclk_pg4", CLK_REF_SYNC_D4, 0x7a9, 0x7aa, 0x7ab, 0, 0xb23, 0, 0), |
---|
247 | | - D_GATE(HCLK_QSPI0, "hclk_qspi0", CLK_REF_SYNC_D4, 0x2a0, 0x2a1, 0x2a2, 0x2a3, 0x300, 0x301, 0x302), |
---|
248 | | - D_GATE(HCLK_QSPI1, "hclk_qspi1", CLK_REF_SYNC_D4, 0x480, 0x481, 0x482, 0x483, 0x4c0, 0x4c1, 0x4c2), |
---|
249 | | - D_GATE(HCLK_ROM, "hclk_rom", CLK_REF_SYNC_D4, 0xaa0, 0xaa1, 0xaa2, 0, 0xb80, 0, 0), |
---|
250 | | - D_GATE(HCLK_RTC, "hclk_rtc", CLK_REF_SYNC_D8, 0xa00, 0, 0, 0, 0, 0, 0), |
---|
251 | | - D_GATE(HCLK_SDIO0, "hclk_sdio0", CLK_REF_SYNC_D4, 0x60, 0x61, 0x62, 0x63, 0x80, 0x81, 0x82), |
---|
252 | | - D_GATE(HCLK_SDIO1, "hclk_sdio1", CLK_REF_SYNC_D4, 0x640, 0x641, 0x642, 0x643, 0x660, 0x661, 0x662), |
---|
253 | | - D_GATE(HCLK_SEMAP, "hclk_semap", CLK_REF_SYNC_D4, 0x7a3, 0x7a4, 0x7a5, 0, 0xb21, 0, 0), |
---|
254 | | - D_GATE(HCLK_SPI0, "hclk_spi0", CLK_REF_SYNC_D4, 0x200, 0x201, 0x202, 0, 0, 0, 0), |
---|
255 | | - D_GATE(HCLK_SPI1, "hclk_spi1", CLK_REF_SYNC_D4, 0x203, 0x204, 0x205, 0, 0, 0, 0), |
---|
256 | | - D_GATE(HCLK_SPI2, "hclk_spi2", CLK_REF_SYNC_D4, 0x206, 0x207, 0x208, 0, 0, 0, 0), |
---|
257 | | - D_GATE(HCLK_SPI3, "hclk_spi3", CLK_REF_SYNC_D4, 0x209, 0x20a, 0x20b, 0, 0, 0, 0), |
---|
258 | | - D_GATE(HCLK_SPI4, "hclk_spi4", CLK_REF_SYNC_D4, 0x20c, 0x20d, 0x20e, 0, 0, 0, 0), |
---|
259 | | - D_GATE(HCLK_SPI5, "hclk_spi5", CLK_REF_SYNC_D4, 0x20f, 0x210, 0x211, 0, 0, 0, 0), |
---|
260 | | - D_GATE(HCLK_SWITCH, "hclk_switch", CLK_REF_SYNC_D4, 0x980, 0, 0x981, 0, 0, 0, 0), |
---|
261 | | - D_GATE(HCLK_SWITCH_RG, "hclk_switch_rg", CLK_REF_SYNC_D4, 0xc40, 0xc41, 0xc42, 0, 0, 0, 0), |
---|
262 | | - D_GATE(HCLK_UART0, "hclk_uart0", CLK_REF_SYNC_D8, 0x1a0, 0x1a1, 0x1a2, 0, 0, 0, 0), |
---|
263 | | - D_GATE(HCLK_UART1, "hclk_uart1", CLK_REF_SYNC_D8, 0x1a3, 0x1a4, 0x1a5, 0, 0, 0, 0), |
---|
264 | | - D_GATE(HCLK_UART2, "hclk_uart2", CLK_REF_SYNC_D8, 0x1a6, 0x1a7, 0x1a8, 0, 0, 0, 0), |
---|
265 | | - D_GATE(HCLK_UART3, "hclk_uart3", CLK_REF_SYNC_D4, 0x218, 0x219, 0x21a, 0, 0, 0, 0), |
---|
266 | | - D_GATE(HCLK_UART4, "hclk_uart4", CLK_REF_SYNC_D4, 0x21b, 0x21c, 0x21d, 0, 0, 0, 0), |
---|
267 | | - D_GATE(HCLK_UART5, "hclk_uart5", CLK_REF_SYNC_D4, 0x220, 0x221, 0x222, 0, 0, 0, 0), |
---|
268 | | - D_GATE(HCLK_UART6, "hclk_uart6", CLK_REF_SYNC_D4, 0x223, 0x224, 0x225, 0, 0, 0, 0), |
---|
269 | | - D_GATE(HCLK_UART7, "hclk_uart7", CLK_REF_SYNC_D4, 0x226, 0x227, 0x228, 0, 0, 0, 0), |
---|
| 232 | + D_MODULE(HCLK_ADC, "hclk_adc", CLK_REF_SYNC_D8, 0x1af, 0x1b0, 0x1b1, 0, 0, 0, 0), |
---|
| 233 | + D_MODULE(HCLK_CM3, "hclk_cm3", CLK_REF_SYNC_D4, 0xc20, 0xc21, 0xc22, 0, 0, 0, 0), |
---|
| 234 | + D_MODULE(HCLK_CRYPTO_EIP150, "hclk_crypto_eip150", CLK_REF_SYNC_D4, 0x123, 0x124, 0x125, 0, 0x142, 0, 0), |
---|
| 235 | + D_MODULE(HCLK_CRYPTO_EIP93, "hclk_crypto_eip93", CLK_REF_SYNC_D4, 0x120, 0x121, 0, 0x122, 0, 0x140, 0x141), |
---|
| 236 | + D_MODULE(HCLK_DDRC, "hclk_ddrc", CLK_REF_SYNC_D4, 0x320, 0x322, 0, 0x321, 0, 0x3a0, 0x3a1), |
---|
| 237 | + D_MODULE(HCLK_DMA0, "hclk_dma0", CLK_REF_SYNC_D4, 0x260, 0x261, 0x262, 0x263, 0x2c0, 0x2c1, 0x2c2), |
---|
| 238 | + D_MODULE(HCLK_DMA1, "hclk_dma1", CLK_REF_SYNC_D4, 0x264, 0x265, 0x266, 0x267, 0x2c3, 0x2c4, 0x2c5), |
---|
| 239 | + D_MODULE(HCLK_GMAC0, "hclk_gmac0", CLK_REF_SYNC_D4, 0x360, 0x361, 0x362, 0x363, 0x3c0, 0x3c1, 0x3c2), |
---|
| 240 | + D_MODULE(HCLK_GMAC1, "hclk_gmac1", CLK_REF_SYNC_D4, 0x380, 0x381, 0x382, 0x383, 0x3e0, 0x3e1, 0x3e2), |
---|
| 241 | + D_MODULE(HCLK_GPIO0, "hclk_gpio0", CLK_REF_SYNC_D4, 0x212, 0x213, 0x214, 0, 0, 0, 0), |
---|
| 242 | + D_MODULE(HCLK_GPIO1, "hclk_gpio1", CLK_REF_SYNC_D4, 0x215, 0x216, 0x217, 0, 0, 0, 0), |
---|
| 243 | + D_MODULE(HCLK_GPIO2, "hclk_gpio2", CLK_REF_SYNC_D4, 0x229, 0x22a, 0x22b, 0, 0, 0, 0), |
---|
| 244 | + D_MODULE(HCLK_HSR, "hclk_hsr", CLK_HSR100_D2, 0x480, 0x482, 0, 0x481, 0, 0x4c0, 0x4c1), |
---|
| 245 | + D_MODULE(HCLK_I2C0, "hclk_i2c0", CLK_REF_SYNC_D8, 0x1a9, 0x1aa, 0x1ab, 0, 0, 0, 0), |
---|
| 246 | + D_MODULE(HCLK_I2C1, "hclk_i2c1", CLK_REF_SYNC_D8, 0x1ac, 0x1ad, 0x1ae, 0, 0, 0, 0), |
---|
| 247 | + D_MODULE(HCLK_LCD, "hclk_lcd", CLK_REF_SYNC_D4, 0x7a0, 0x7a1, 0x7a2, 0, 0xb20, 0, 0), |
---|
| 248 | + D_MODULE(HCLK_MSEBI_M, "hclk_msebi_m", CLK_REF_SYNC_D4, 0x164, 0x165, 0x166, 0, 0x183, 0, 0), |
---|
| 249 | + D_MODULE(HCLK_MSEBI_S, "hclk_msebi_s", CLK_REF_SYNC_D4, 0x160, 0x161, 0x162, 0x163, 0x180, 0x181, 0x182), |
---|
| 250 | + D_MODULE(HCLK_NAND, "hclk_nand", CLK_REF_SYNC_D4, 0x280, 0x281, 0x282, 0x283, 0x2e0, 0x2e1, 0x2e2), |
---|
| 251 | + D_MODULE(HCLK_PG_I, "hclk_pg_i", CLK_REF_SYNC_D4, 0x7ac, 0x7ad, 0, 0x7ae, 0, 0xb24, 0xb25), |
---|
| 252 | + D_MODULE(HCLK_PG19, "hclk_pg19", CLK_REF_SYNC_D4, 0x22c, 0x22d, 0x22e, 0, 0, 0, 0), |
---|
| 253 | + D_MODULE(HCLK_PG20, "hclk_pg20", CLK_REF_SYNC_D4, 0x22f, 0x230, 0x231, 0, 0, 0, 0), |
---|
| 254 | + D_MODULE(HCLK_PG3, "hclk_pg3", CLK_REF_SYNC_D4, 0x7a6, 0x7a7, 0x7a8, 0, 0xb22, 0, 0), |
---|
| 255 | + D_MODULE(HCLK_PG4, "hclk_pg4", CLK_REF_SYNC_D4, 0x7a9, 0x7aa, 0x7ab, 0, 0xb23, 0, 0), |
---|
| 256 | + D_MODULE(HCLK_QSPI0, "hclk_qspi0", CLK_REF_SYNC_D4, 0x2a0, 0x2a1, 0x2a2, 0x2a3, 0x300, 0x301, 0x302), |
---|
| 257 | + D_MODULE(HCLK_QSPI1, "hclk_qspi1", CLK_REF_SYNC_D4, 0x480, 0x481, 0x482, 0x483, 0x4c0, 0x4c1, 0x4c2), |
---|
| 258 | + D_MODULE(HCLK_ROM, "hclk_rom", CLK_REF_SYNC_D4, 0xaa0, 0xaa1, 0xaa2, 0, 0xb80, 0, 0), |
---|
| 259 | + D_MODULE(HCLK_RTC, "hclk_rtc", CLK_REF_SYNC_D8, 0xa00, 0, 0, 0, 0, 0, 0), |
---|
| 260 | + D_MODULE(HCLK_SDIO0, "hclk_sdio0", CLK_REF_SYNC_D4, 0x60, 0x61, 0x62, 0x63, 0x80, 0x81, 0x82), |
---|
| 261 | + D_MODULE(HCLK_SDIO1, "hclk_sdio1", CLK_REF_SYNC_D4, 0x640, 0x641, 0x642, 0x643, 0x660, 0x661, 0x662), |
---|
| 262 | + D_MODULE(HCLK_SEMAP, "hclk_semap", CLK_REF_SYNC_D4, 0x7a3, 0x7a4, 0x7a5, 0, 0xb21, 0, 0), |
---|
| 263 | + D_MODULE(HCLK_SPI0, "hclk_spi0", CLK_REF_SYNC_D4, 0x200, 0x201, 0x202, 0, 0, 0, 0), |
---|
| 264 | + D_MODULE(HCLK_SPI1, "hclk_spi1", CLK_REF_SYNC_D4, 0x203, 0x204, 0x205, 0, 0, 0, 0), |
---|
| 265 | + D_MODULE(HCLK_SPI2, "hclk_spi2", CLK_REF_SYNC_D4, 0x206, 0x207, 0x208, 0, 0, 0, 0), |
---|
| 266 | + D_MODULE(HCLK_SPI3, "hclk_spi3", CLK_REF_SYNC_D4, 0x209, 0x20a, 0x20b, 0, 0, 0, 0), |
---|
| 267 | + D_MODULE(HCLK_SPI4, "hclk_spi4", CLK_REF_SYNC_D4, 0x20c, 0x20d, 0x20e, 0, 0, 0, 0), |
---|
| 268 | + D_MODULE(HCLK_SPI5, "hclk_spi5", CLK_REF_SYNC_D4, 0x20f, 0x210, 0x211, 0, 0, 0, 0), |
---|
| 269 | + D_MODULE(HCLK_SWITCH, "hclk_switch", CLK_REF_SYNC_D4, 0x980, 0, 0x981, 0, 0, 0, 0), |
---|
| 270 | + D_MODULE(HCLK_SWITCH_RG, "hclk_switch_rg", CLK_REF_SYNC_D4, 0xc40, 0xc41, 0xc42, 0, 0, 0, 0), |
---|
| 271 | + D_MODULE(HCLK_UART0, "hclk_uart0", CLK_REF_SYNC_D8, 0x1a0, 0x1a1, 0x1a2, 0, 0, 0, 0), |
---|
| 272 | + D_MODULE(HCLK_UART1, "hclk_uart1", CLK_REF_SYNC_D8, 0x1a3, 0x1a4, 0x1a5, 0, 0, 0, 0), |
---|
| 273 | + D_MODULE(HCLK_UART2, "hclk_uart2", CLK_REF_SYNC_D8, 0x1a6, 0x1a7, 0x1a8, 0, 0, 0, 0), |
---|
| 274 | + D_MODULE(HCLK_UART3, "hclk_uart3", CLK_REF_SYNC_D4, 0x218, 0x219, 0x21a, 0, 0, 0, 0), |
---|
| 275 | + D_MODULE(HCLK_UART4, "hclk_uart4", CLK_REF_SYNC_D4, 0x21b, 0x21c, 0x21d, 0, 0, 0, 0), |
---|
| 276 | + D_MODULE(HCLK_UART5, "hclk_uart5", CLK_REF_SYNC_D4, 0x220, 0x221, 0x222, 0, 0, 0, 0), |
---|
| 277 | + D_MODULE(HCLK_UART6, "hclk_uart6", CLK_REF_SYNC_D4, 0x223, 0x224, 0x225, 0, 0, 0, 0), |
---|
| 278 | + D_MODULE(HCLK_UART7, "hclk_uart7", CLK_REF_SYNC_D4, 0x226, 0x227, 0x228, 0, 0, 0, 0), |
---|
270 | 279 | /* |
---|
271 | 280 | * These are not hardware clocks, but are needed to handle the special |
---|
272 | 281 | * case where we have a 'selector bit' that doesn't just change the |
---|
.. | .. |
---|
277 | 286 | .name = "uart_group_012", |
---|
278 | 287 | .type = K_BITSEL, |
---|
279 | 288 | .source = 1 + R9A06G032_DIV_UART, |
---|
280 | | - /* R9A06G032_SYSCTRL_REG_PWRCTRL_PG1_PR2 */ |
---|
281 | | - .dual.sel = ((0xec / 4) << 5) | 24, |
---|
| 289 | + /* R9A06G032_SYSCTRL_REG_PWRCTRL_PG0_0 */ |
---|
| 290 | + .dual.sel = ((0x34 / 4) << 5) | 30, |
---|
282 | 291 | .dual.group = 0, |
---|
283 | 292 | }, |
---|
284 | 293 | { |
---|
.. | .. |
---|
286 | 295 | .name = "uart_group_34567", |
---|
287 | 296 | .type = K_BITSEL, |
---|
288 | 297 | .source = 1 + R9A06G032_DIV_P2_PG, |
---|
289 | | - /* R9A06G032_SYSCTRL_REG_PWRCTRL_PG0_0 */ |
---|
290 | | - .dual.sel = ((0x34 / 4) << 5) | 30, |
---|
| 298 | + /* R9A06G032_SYSCTRL_REG_PWRCTRL_PG1_PR2 */ |
---|
| 299 | + .dual.sel = ((0xec / 4) << 5) | 24, |
---|
291 | 300 | .dual.group = 1, |
---|
292 | 301 | }, |
---|
293 | 302 | D_UGATE(CLK_UART0, "clk_uart0", UART_GROUP_012, 0, 0, 0x1b2, 0x1b3, 0x1b4, 0x1b5), |
---|
.. | .. |
---|
329 | 338 | } |
---|
330 | 339 | |
---|
331 | 340 | /* |
---|
332 | | - * This implements the R9A09G032 clock gate 'driver'. We cannot use the system's |
---|
333 | | - * clock gate framework as the gates on the R9A09G032 have a special enabling |
---|
| 341 | + * This implements the R9A06G032 clock gate 'driver'. We cannot use the system's |
---|
| 342 | + * clock gate framework as the gates on the R9A06G032 have a special enabling |
---|
334 | 343 | * sequence, therefore we use this little proxy. |
---|
335 | 344 | */ |
---|
336 | 345 | struct r9a06g032_clk_gate { |
---|
.. | .. |
---|
342 | 351 | }; |
---|
343 | 352 | |
---|
344 | 353 | #define to_r9a06g032_gate(_hw) container_of(_hw, struct r9a06g032_clk_gate, hw) |
---|
| 354 | + |
---|
| 355 | +static int create_add_module_clock(struct of_phandle_args *clkspec, |
---|
| 356 | + struct device *dev) |
---|
| 357 | +{ |
---|
| 358 | + struct clk *clk; |
---|
| 359 | + int error; |
---|
| 360 | + |
---|
| 361 | + clk = of_clk_get_from_provider(clkspec); |
---|
| 362 | + if (IS_ERR(clk)) |
---|
| 363 | + return PTR_ERR(clk); |
---|
| 364 | + |
---|
| 365 | + error = pm_clk_create(dev); |
---|
| 366 | + if (error) { |
---|
| 367 | + clk_put(clk); |
---|
| 368 | + return error; |
---|
| 369 | + } |
---|
| 370 | + |
---|
| 371 | + error = pm_clk_add_clk(dev, clk); |
---|
| 372 | + if (error) { |
---|
| 373 | + pm_clk_destroy(dev); |
---|
| 374 | + clk_put(clk); |
---|
| 375 | + } |
---|
| 376 | + |
---|
| 377 | + return error; |
---|
| 378 | +} |
---|
| 379 | + |
---|
| 380 | +static int r9a06g032_attach_dev(struct generic_pm_domain *pd, |
---|
| 381 | + struct device *dev) |
---|
| 382 | +{ |
---|
| 383 | + struct device_node *np = dev->of_node; |
---|
| 384 | + struct of_phandle_args clkspec; |
---|
| 385 | + int i = 0; |
---|
| 386 | + int error; |
---|
| 387 | + int index; |
---|
| 388 | + |
---|
| 389 | + while (!of_parse_phandle_with_args(np, "clocks", "#clock-cells", i++, |
---|
| 390 | + &clkspec)) { |
---|
| 391 | + if (clkspec.np != pd->dev.of_node) |
---|
| 392 | + continue; |
---|
| 393 | + |
---|
| 394 | + index = clkspec.args[0]; |
---|
| 395 | + if (index < R9A06G032_CLOCK_COUNT && |
---|
| 396 | + r9a06g032_clocks[index].managed) { |
---|
| 397 | + error = create_add_module_clock(&clkspec, dev); |
---|
| 398 | + of_node_put(clkspec.np); |
---|
| 399 | + if (error) |
---|
| 400 | + return error; |
---|
| 401 | + } |
---|
| 402 | + } |
---|
| 403 | + |
---|
| 404 | + return 0; |
---|
| 405 | +} |
---|
| 406 | + |
---|
| 407 | +static void r9a06g032_detach_dev(struct generic_pm_domain *unused, struct device *dev) |
---|
| 408 | +{ |
---|
| 409 | + if (!pm_clk_no_clocks(dev)) |
---|
| 410 | + pm_clk_destroy(dev); |
---|
| 411 | +} |
---|
| 412 | + |
---|
| 413 | +static int r9a06g032_add_clk_domain(struct device *dev) |
---|
| 414 | +{ |
---|
| 415 | + struct device_node *np = dev->of_node; |
---|
| 416 | + struct generic_pm_domain *pd; |
---|
| 417 | + |
---|
| 418 | + pd = devm_kzalloc(dev, sizeof(*pd), GFP_KERNEL); |
---|
| 419 | + if (!pd) |
---|
| 420 | + return -ENOMEM; |
---|
| 421 | + |
---|
| 422 | + pd->name = np->name; |
---|
| 423 | + pd->flags = GENPD_FLAG_PM_CLK | GENPD_FLAG_ALWAYS_ON | |
---|
| 424 | + GENPD_FLAG_ACTIVE_WAKEUP; |
---|
| 425 | + pd->attach_dev = r9a06g032_attach_dev; |
---|
| 426 | + pd->detach_dev = r9a06g032_detach_dev; |
---|
| 427 | + pm_genpd_init(pd, &pm_domain_always_on_gov, false); |
---|
| 428 | + |
---|
| 429 | + of_genpd_add_provider_simple(np, pd); |
---|
| 430 | + return 0; |
---|
| 431 | +} |
---|
345 | 432 | |
---|
346 | 433 | static void |
---|
347 | 434 | r9a06g032_clk_gate_set(struct r9a06g032_priv *clocks, |
---|
.. | .. |
---|
416 | 503 | { |
---|
417 | 504 | struct clk *clk; |
---|
418 | 505 | struct r9a06g032_clk_gate *g; |
---|
419 | | - struct clk_init_data init = {}; |
---|
| 506 | + struct clk_init_data init; |
---|
420 | 507 | |
---|
421 | 508 | g = kzalloc(sizeof(*g), GFP_KERNEL); |
---|
422 | 509 | if (!g) |
---|
.. | .. |
---|
424 | 511 | |
---|
425 | 512 | init.name = desc->name; |
---|
426 | 513 | init.ops = &r9a06g032_clk_gate_ops; |
---|
427 | | - init.flags = CLK_IS_BASIC | CLK_SET_RATE_PARENT; |
---|
| 514 | + init.flags = CLK_SET_RATE_PARENT; |
---|
428 | 515 | init.parent_names = parent_name ? &parent_name : NULL; |
---|
429 | 516 | init.num_parents = parent_name ? 1 : 0; |
---|
430 | 517 | |
---|
.. | .. |
---|
586 | 673 | { |
---|
587 | 674 | struct r9a06g032_clk_div *div; |
---|
588 | 675 | struct clk *clk; |
---|
589 | | - struct clk_init_data init = {}; |
---|
| 676 | + struct clk_init_data init; |
---|
590 | 677 | unsigned int i; |
---|
591 | 678 | |
---|
592 | 679 | div = kzalloc(sizeof(*div), GFP_KERNEL); |
---|
.. | .. |
---|
595 | 682 | |
---|
596 | 683 | init.name = desc->name; |
---|
597 | 684 | init.ops = &r9a06g032_clk_div_ops; |
---|
598 | | - init.flags = CLK_IS_BASIC | CLK_SET_RATE_PARENT; |
---|
| 685 | + init.flags = CLK_SET_RATE_PARENT; |
---|
599 | 686 | init.parent_names = parent_name ? &parent_name : NULL; |
---|
600 | 687 | init.num_parents = parent_name ? 1 : 0; |
---|
601 | 688 | |
---|
.. | .. |
---|
670 | 757 | { |
---|
671 | 758 | struct clk *clk; |
---|
672 | 759 | struct r9a06g032_clk_bitsel *g; |
---|
673 | | - struct clk_init_data init = {}; |
---|
| 760 | + struct clk_init_data init; |
---|
674 | 761 | const char *names[2]; |
---|
675 | 762 | |
---|
676 | 763 | /* allocate the gate */ |
---|
.. | .. |
---|
683 | 770 | |
---|
684 | 771 | init.name = desc->name; |
---|
685 | 772 | init.ops = &clk_bitselect_ops; |
---|
686 | | - init.flags = CLK_IS_BASIC | CLK_SET_RATE_PARENT; |
---|
| 773 | + init.flags = CLK_SET_RATE_PARENT; |
---|
687 | 774 | init.parent_names = names; |
---|
688 | 775 | init.num_parents = 2; |
---|
689 | 776 | |
---|
.. | .. |
---|
761 | 848 | { |
---|
762 | 849 | struct r9a06g032_clk_dualgate *g; |
---|
763 | 850 | struct clk *clk; |
---|
764 | | - struct clk_init_data init = {}; |
---|
| 851 | + struct clk_init_data init; |
---|
765 | 852 | |
---|
766 | 853 | /* allocate the gate */ |
---|
767 | 854 | g = kzalloc(sizeof(*g), GFP_KERNEL); |
---|
.. | .. |
---|
777 | 864 | |
---|
778 | 865 | init.name = desc->name; |
---|
779 | 866 | init.ops = &r9a06g032_clk_dualgate_ops; |
---|
780 | | - init.flags = CLK_IS_BASIC | CLK_SET_RATE_PARENT; |
---|
| 867 | + init.flags = CLK_SET_RATE_PARENT; |
---|
781 | 868 | init.parent_names = &parent_name; |
---|
782 | 869 | init.num_parents = 1; |
---|
783 | 870 | g->hw.init = &init; |
---|
.. | .. |
---|
869 | 956 | if (error) |
---|
870 | 957 | return error; |
---|
871 | 958 | |
---|
872 | | - return devm_add_action_or_reset(dev, |
---|
| 959 | + error = devm_add_action_or_reset(dev, |
---|
873 | 960 | r9a06g032_clocks_del_clk_provider, np); |
---|
| 961 | + if (error) |
---|
| 962 | + return error; |
---|
| 963 | + |
---|
| 964 | + return r9a06g032_add_clk_domain(dev); |
---|
874 | 965 | } |
---|
875 | 966 | |
---|
876 | 967 | static const struct of_device_id r9a06g032_match[] = { |
---|