| .. | .. |
|---|
| 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 | + i++; |
|---|
| 403 | + } |
|---|
| 404 | + |
|---|
| 405 | + return 0; |
|---|
| 406 | +} |
|---|
| 407 | + |
|---|
| 408 | +static void r9a06g032_detach_dev(struct generic_pm_domain *unused, struct device *dev) |
|---|
| 409 | +{ |
|---|
| 410 | + if (!pm_clk_no_clocks(dev)) |
|---|
| 411 | + pm_clk_destroy(dev); |
|---|
| 412 | +} |
|---|
| 413 | + |
|---|
| 414 | +static int r9a06g032_add_clk_domain(struct device *dev) |
|---|
| 415 | +{ |
|---|
| 416 | + struct device_node *np = dev->of_node; |
|---|
| 417 | + struct generic_pm_domain *pd; |
|---|
| 418 | + |
|---|
| 419 | + pd = devm_kzalloc(dev, sizeof(*pd), GFP_KERNEL); |
|---|
| 420 | + if (!pd) |
|---|
| 421 | + return -ENOMEM; |
|---|
| 422 | + |
|---|
| 423 | + pd->name = np->name; |
|---|
| 424 | + pd->flags = GENPD_FLAG_PM_CLK | GENPD_FLAG_ALWAYS_ON | |
|---|
| 425 | + GENPD_FLAG_ACTIVE_WAKEUP; |
|---|
| 426 | + pd->attach_dev = r9a06g032_attach_dev; |
|---|
| 427 | + pd->detach_dev = r9a06g032_detach_dev; |
|---|
| 428 | + pm_genpd_init(pd, &pm_domain_always_on_gov, false); |
|---|
| 429 | + |
|---|
| 430 | + of_genpd_add_provider_simple(np, pd); |
|---|
| 431 | + return 0; |
|---|
| 432 | +} |
|---|
| 345 | 433 | |
|---|
| 346 | 434 | static void |
|---|
| 347 | 435 | r9a06g032_clk_gate_set(struct r9a06g032_priv *clocks, |
|---|
| .. | .. |
|---|
| 416 | 504 | { |
|---|
| 417 | 505 | struct clk *clk; |
|---|
| 418 | 506 | struct r9a06g032_clk_gate *g; |
|---|
| 419 | | - struct clk_init_data init = {}; |
|---|
| 507 | + struct clk_init_data init; |
|---|
| 420 | 508 | |
|---|
| 421 | 509 | g = kzalloc(sizeof(*g), GFP_KERNEL); |
|---|
| 422 | 510 | if (!g) |
|---|
| .. | .. |
|---|
| 424 | 512 | |
|---|
| 425 | 513 | init.name = desc->name; |
|---|
| 426 | 514 | init.ops = &r9a06g032_clk_gate_ops; |
|---|
| 427 | | - init.flags = CLK_IS_BASIC | CLK_SET_RATE_PARENT; |
|---|
| 515 | + init.flags = CLK_SET_RATE_PARENT; |
|---|
| 428 | 516 | init.parent_names = parent_name ? &parent_name : NULL; |
|---|
| 429 | 517 | init.num_parents = parent_name ? 1 : 0; |
|---|
| 430 | 518 | |
|---|
| .. | .. |
|---|
| 586 | 674 | { |
|---|
| 587 | 675 | struct r9a06g032_clk_div *div; |
|---|
| 588 | 676 | struct clk *clk; |
|---|
| 589 | | - struct clk_init_data init = {}; |
|---|
| 677 | + struct clk_init_data init; |
|---|
| 590 | 678 | unsigned int i; |
|---|
| 591 | 679 | |
|---|
| 592 | 680 | div = kzalloc(sizeof(*div), GFP_KERNEL); |
|---|
| .. | .. |
|---|
| 595 | 683 | |
|---|
| 596 | 684 | init.name = desc->name; |
|---|
| 597 | 685 | init.ops = &r9a06g032_clk_div_ops; |
|---|
| 598 | | - init.flags = CLK_IS_BASIC | CLK_SET_RATE_PARENT; |
|---|
| 686 | + init.flags = CLK_SET_RATE_PARENT; |
|---|
| 599 | 687 | init.parent_names = parent_name ? &parent_name : NULL; |
|---|
| 600 | 688 | init.num_parents = parent_name ? 1 : 0; |
|---|
| 601 | 689 | |
|---|
| .. | .. |
|---|
| 670 | 758 | { |
|---|
| 671 | 759 | struct clk *clk; |
|---|
| 672 | 760 | struct r9a06g032_clk_bitsel *g; |
|---|
| 673 | | - struct clk_init_data init = {}; |
|---|
| 761 | + struct clk_init_data init; |
|---|
| 674 | 762 | const char *names[2]; |
|---|
| 675 | 763 | |
|---|
| 676 | 764 | /* allocate the gate */ |
|---|
| .. | .. |
|---|
| 683 | 771 | |
|---|
| 684 | 772 | init.name = desc->name; |
|---|
| 685 | 773 | init.ops = &clk_bitselect_ops; |
|---|
| 686 | | - init.flags = CLK_IS_BASIC | CLK_SET_RATE_PARENT; |
|---|
| 774 | + init.flags = CLK_SET_RATE_PARENT; |
|---|
| 687 | 775 | init.parent_names = names; |
|---|
| 688 | 776 | init.num_parents = 2; |
|---|
| 689 | 777 | |
|---|
| .. | .. |
|---|
| 761 | 849 | { |
|---|
| 762 | 850 | struct r9a06g032_clk_dualgate *g; |
|---|
| 763 | 851 | struct clk *clk; |
|---|
| 764 | | - struct clk_init_data init = {}; |
|---|
| 852 | + struct clk_init_data init; |
|---|
| 765 | 853 | |
|---|
| 766 | 854 | /* allocate the gate */ |
|---|
| 767 | 855 | g = kzalloc(sizeof(*g), GFP_KERNEL); |
|---|
| .. | .. |
|---|
| 777 | 865 | |
|---|
| 778 | 866 | init.name = desc->name; |
|---|
| 779 | 867 | init.ops = &r9a06g032_clk_dualgate_ops; |
|---|
| 780 | | - init.flags = CLK_IS_BASIC | CLK_SET_RATE_PARENT; |
|---|
| 868 | + init.flags = CLK_SET_RATE_PARENT; |
|---|
| 781 | 869 | init.parent_names = &parent_name; |
|---|
| 782 | 870 | init.num_parents = 1; |
|---|
| 783 | 871 | g->hw.init = &init; |
|---|
| .. | .. |
|---|
| 869 | 957 | if (error) |
|---|
| 870 | 958 | return error; |
|---|
| 871 | 959 | |
|---|
| 872 | | - return devm_add_action_or_reset(dev, |
|---|
| 960 | + error = devm_add_action_or_reset(dev, |
|---|
| 873 | 961 | r9a06g032_clocks_del_clk_provider, np); |
|---|
| 962 | + if (error) |
|---|
| 963 | + return error; |
|---|
| 964 | + |
|---|
| 965 | + return r9a06g032_add_clk_domain(dev); |
|---|
| 874 | 966 | } |
|---|
| 875 | 967 | |
|---|
| 876 | 968 | static const struct of_device_id r9a06g032_match[] = { |
|---|