1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * Copyright (C) 2023 Raspberry Pi Ltd. 4 * 5 * Clock driver for RP1 PCIe multifunction chip. 6 */ 7 8 #include <linux/bitfield.h> 9 #include <linux/clk-provider.h> 10 #include <linux/regmap.h> 11 #include <linux/math64.h> 12 #include <linux/module.h> 13 #include <linux/platform_device.h> 14 #include <linux/units.h> 15 16 #include <dt-bindings/clock/raspberrypi,rp1-clocks.h> 17 18 #define PLL_SYS_OFFSET 0x08000 19 #define PLL_SYS_CS (PLL_SYS_OFFSET + 0x00) 20 #define PLL_SYS_PWR (PLL_SYS_OFFSET + 0x04) 21 #define PLL_SYS_FBDIV_INT (PLL_SYS_OFFSET + 0x08) 22 #define PLL_SYS_FBDIV_FRAC (PLL_SYS_OFFSET + 0x0c) 23 #define PLL_SYS_PRIM (PLL_SYS_OFFSET + 0x10) 24 #define PLL_SYS_SEC (PLL_SYS_OFFSET + 0x14) 25 26 #define PLL_AUDIO_OFFSET 0x0c000 27 #define PLL_AUDIO_CS (PLL_AUDIO_OFFSET + 0x00) 28 #define PLL_AUDIO_PWR (PLL_AUDIO_OFFSET + 0x04) 29 #define PLL_AUDIO_FBDIV_INT (PLL_AUDIO_OFFSET + 0x08) 30 #define PLL_AUDIO_FBDIV_FRAC (PLL_AUDIO_OFFSET + 0x0c) 31 #define PLL_AUDIO_PRIM (PLL_AUDIO_OFFSET + 0x10) 32 #define PLL_AUDIO_SEC (PLL_AUDIO_OFFSET + 0x14) 33 #define PLL_AUDIO_TERN (PLL_AUDIO_OFFSET + 0x18) 34 35 #define PLL_VIDEO_OFFSET 0x10000 36 #define PLL_VIDEO_CS (PLL_VIDEO_OFFSET + 0x00) 37 #define PLL_VIDEO_PWR (PLL_VIDEO_OFFSET + 0x04) 38 #define PLL_VIDEO_FBDIV_INT (PLL_VIDEO_OFFSET + 0x08) 39 #define PLL_VIDEO_FBDIV_FRAC (PLL_VIDEO_OFFSET + 0x0c) 40 #define PLL_VIDEO_PRIM (PLL_VIDEO_OFFSET + 0x10) 41 #define PLL_VIDEO_SEC (PLL_VIDEO_OFFSET + 0x14) 42 43 #define GPCLK_OE_CTRL 0x00000 44 45 #define CLK_SYS_OFFSET 0x00014 46 #define CLK_SYS_CTRL (CLK_SYS_OFFSET + 0x00) 47 #define CLK_SYS_DIV_INT (CLK_SYS_OFFSET + 0x04) 48 #define CLK_SYS_SEL (CLK_SYS_OFFSET + 0x0c) 49 50 #define CLK_SLOW_OFFSET 0x00024 51 #define CLK_SLOW_SYS_CTRL (CLK_SLOW_OFFSET + 0x00) 52 #define CLK_SLOW_SYS_DIV_INT (CLK_SLOW_OFFSET + 0x04) 53 #define CLK_SLOW_SYS_SEL (CLK_SLOW_OFFSET + 0x0c) 54 55 #define CLK_DMA_OFFSET 0x00044 56 #define CLK_DMA_CTRL (CLK_DMA_OFFSET + 0x00) 57 #define CLK_DMA_DIV_INT (CLK_DMA_OFFSET + 0x04) 58 #define CLK_DMA_SEL (CLK_DMA_OFFSET + 0x0c) 59 60 #define CLK_UART_OFFSET 0x00054 61 #define CLK_UART_CTRL (CLK_UART_OFFSET + 0x00) 62 #define CLK_UART_DIV_INT (CLK_UART_OFFSET + 0x04) 63 #define CLK_UART_SEL (CLK_UART_OFFSET + 0x0c) 64 65 #define CLK_ETH_OFFSET 0x00064 66 #define CLK_ETH_CTRL (CLK_ETH_OFFSET + 0x00) 67 #define CLK_ETH_DIV_INT (CLK_ETH_OFFSET + 0x04) 68 #define CLK_ETH_SEL (CLK_ETH_OFFSET + 0x0c) 69 70 #define CLK_PWM0_OFFSET 0x00074 71 #define CLK_PWM0_CTRL (CLK_PWM0_OFFSET + 0x00) 72 #define CLK_PWM0_DIV_INT (CLK_PWM0_OFFSET + 0x04) 73 #define CLK_PWM0_DIV_FRAC (CLK_PWM0_OFFSET + 0x08) 74 #define CLK_PWM0_SEL (CLK_PWM0_OFFSET + 0x0c) 75 76 #define CLK_PWM1_OFFSET 0x00084 77 #define CLK_PWM1_CTRL (CLK_PWM1_OFFSET + 0x00) 78 #define CLK_PWM1_DIV_INT (CLK_PWM1_OFFSET + 0x04) 79 #define CLK_PWM1_DIV_FRAC (CLK_PWM1_OFFSET + 0x08) 80 #define CLK_PWM1_SEL (CLK_PWM1_OFFSET + 0x0c) 81 82 #define CLK_AUDIO_IN_OFFSET 0x00094 83 #define CLK_AUDIO_IN_CTRL (CLK_AUDIO_IN_OFFSET + 0x00) 84 #define CLK_AUDIO_IN_DIV_INT (CLK_AUDIO_IN_OFFSET + 0x04) 85 #define CLK_AUDIO_IN_SEL (CLK_AUDIO_IN_OFFSET + 0x0c) 86 87 #define CLK_AUDIO_OUT_OFFSET 0x000a4 88 #define CLK_AUDIO_OUT_CTRL (CLK_AUDIO_OUT_OFFSET + 0x00) 89 #define CLK_AUDIO_OUT_DIV_INT (CLK_AUDIO_OUT_OFFSET + 0x04) 90 #define CLK_AUDIO_OUT_SEL (CLK_AUDIO_OUT_OFFSET + 0x0c) 91 92 #define CLK_I2S_OFFSET 0x000b4 93 #define CLK_I2S_CTRL (CLK_I2S_OFFSET + 0x00) 94 #define CLK_I2S_DIV_INT (CLK_I2S_OFFSET + 0x04) 95 #define CLK_I2S_SEL (CLK_I2S_OFFSET + 0x0c) 96 97 #define CLK_MIPI0_CFG_OFFSET 0x000c4 98 #define CLK_MIPI0_CFG_CTRL (CLK_MIPI0_CFG_OFFSET + 0x00) 99 #define CLK_MIPI0_CFG_DIV_INT (CLK_MIPI0_CFG_OFFSET + 0x04) 100 #define CLK_MIPI0_CFG_SEL (CLK_MIPI0_CFG_OFFSET + 0x0c) 101 102 #define CLK_MIPI1_CFG_OFFSET 0x000d4 103 #define CLK_MIPI1_CFG_CTRL (CLK_MIPI1_CFG_OFFSET + 0x00) 104 #define CLK_MIPI1_CFG_DIV_INT (CLK_MIPI1_CFG_OFFSET + 0x04) 105 #define CLK_MIPI1_CFG_SEL (CLK_MIPI1_CFG_OFFSET + 0x0c) 106 107 #define CLK_PCIE_AUX_OFFSET 0x000e4 108 #define CLK_PCIE_AUX_CTRL (CLK_PCIE_AUX_OFFSET + 0x00) 109 #define CLK_PCIE_AUX_DIV_INT (CLK_PCIE_AUX_OFFSET + 0x04) 110 #define CLK_PCIE_AUX_SEL (CLK_PCIE_AUX_OFFSET + 0x0c) 111 112 #define CLK_USBH0_MICROFRAME_OFFSET 0x000f4 113 #define CLK_USBH0_MICROFRAME_CTRL (CLK_USBH0_MICROFRAME_OFFSET + 0x00) 114 #define CLK_USBH0_MICROFRAME_DIV_INT (CLK_USBH0_MICROFRAME_OFFSET + 0x04) 115 #define CLK_USBH0_MICROFRAME_SEL (CLK_USBH0_MICROFRAME_OFFSET + 0x0c) 116 117 #define CLK_USBH1_MICROFRAME_OFFSET 0x00104 118 #define CLK_USBH1_MICROFRAME_CTRL (CLK_USBH1_MICROFRAME_OFFSET + 0x00) 119 #define CLK_USBH1_MICROFRAME_DIV_INT (CLK_USBH1_MICROFRAME_OFFSET + 0x04) 120 #define CLK_USBH1_MICROFRAME_SEL (CLK_USBH1_MICROFRAME_OFFSET + 0x0c) 121 122 #define CLK_USBH0_SUSPEND_OFFSET 0x00114 123 #define CLK_USBH0_SUSPEND_CTRL (CLK_USBH0_SUSPEND_OFFSET + 0x00) 124 #define CLK_USBH0_SUSPEND_DIV_INT (CLK_USBH0_SUSPEND_OFFSET + 0x04) 125 #define CLK_USBH0_SUSPEND_SEL (CLK_USBH0_SUSPEND_OFFSET + 0x0c) 126 127 #define CLK_USBH1_SUSPEND_OFFSET 0x00124 128 #define CLK_USBH1_SUSPEND_CTRL (CLK_USBH1_SUSPEND_OFFSET + 0x00) 129 #define CLK_USBH1_SUSPEND_DIV_INT (CLK_USBH1_SUSPEND_OFFSET + 0x04) 130 #define CLK_USBH1_SUSPEND_SEL (CLK_USBH1_SUSPEND_OFFSET + 0x0c) 131 132 #define CLK_ETH_TSU_OFFSET 0x00134 133 #define CLK_ETH_TSU_CTRL (CLK_ETH_TSU_OFFSET + 0x00) 134 #define CLK_ETH_TSU_DIV_INT (CLK_ETH_TSU_OFFSET + 0x04) 135 #define CLK_ETH_TSU_SEL (CLK_ETH_TSU_OFFSET + 0x0c) 136 137 #define CLK_ADC_OFFSET 0x00144 138 #define CLK_ADC_CTRL (CLK_ADC_OFFSET + 0x00) 139 #define CLK_ADC_DIV_INT (CLK_ADC_OFFSET + 0x04) 140 #define CLK_ADC_SEL (CLK_ADC_OFFSET + 0x0c) 141 142 #define CLK_SDIO_TIMER_OFFSET 0x00154 143 #define CLK_SDIO_TIMER_CTRL (CLK_SDIO_TIMER_OFFSET + 0x00) 144 #define CLK_SDIO_TIMER_DIV_INT (CLK_SDIO_TIMER_OFFSET + 0x04) 145 #define CLK_SDIO_TIMER_SEL (CLK_SDIO_TIMER_OFFSET + 0x0c) 146 147 #define CLK_SDIO_ALT_SRC_OFFSET 0x00164 148 #define CLK_SDIO_ALT_SRC_CTRL (CLK_SDIO_ALT_SRC_OFFSET + 0x00) 149 #define CLK_SDIO_ALT_SRC_DIV_INT (CLK_SDIO_ALT_SRC_OFFSET + 0x04) 150 #define CLK_SDIO_ALT_SRC_SEL (CLK_SDIO_ALT_SRC_OFFSET + 0x0c) 151 152 #define CLK_GP0_OFFSET 0x00174 153 #define CLK_GP0_CTRL (CLK_GP0_OFFSET + 0x00) 154 #define CLK_GP0_DIV_INT (CLK_GP0_OFFSET + 0x04) 155 #define CLK_GP0_DIV_FRAC (CLK_GP0_OFFSET + 0x08) 156 #define CLK_GP0_SEL (CLK_GP0_OFFSET + 0x0c) 157 158 #define CLK_GP1_OFFSET 0x00184 159 #define CLK_GP1_CTRL (CLK_GP1_OFFSET + 0x00) 160 #define CLK_GP1_DIV_INT (CLK_GP1_OFFSET + 0x04) 161 #define CLK_GP1_DIV_FRAC (CLK_GP1_OFFSET + 0x08) 162 #define CLK_GP1_SEL (CLK_GP1_OFFSET + 0x0c) 163 164 #define CLK_GP2_OFFSET 0x00194 165 #define CLK_GP2_CTRL (CLK_GP2_OFFSET + 0x00) 166 #define CLK_GP2_DIV_INT (CLK_GP2_OFFSET + 0x04) 167 #define CLK_GP2_DIV_FRAC (CLK_GP2_OFFSET + 0x08) 168 #define CLK_GP2_SEL (CLK_GP2_OFFSET + 0x0c) 169 170 #define CLK_GP3_OFFSET 0x001a4 171 #define CLK_GP3_CTRL (CLK_GP3_OFFSET + 0x00) 172 #define CLK_GP3_DIV_INT (CLK_GP3_OFFSET + 0x04) 173 #define CLK_GP3_DIV_FRAC (CLK_GP3_OFFSET + 0x08) 174 #define CLK_GP3_SEL (CLK_GP3_OFFSET + 0x0c) 175 176 #define CLK_GP4_OFFSET 0x001b4 177 #define CLK_GP4_CTRL (CLK_GP4_OFFSET + 0x00) 178 #define CLK_GP4_DIV_INT (CLK_GP4_OFFSET + 0x04) 179 #define CLK_GP4_DIV_FRAC (CLK_GP4_OFFSET + 0x08) 180 #define CLK_GP4_SEL (CLK_GP4_OFFSET + 0x0c) 181 182 #define CLK_GP5_OFFSET 0x001c4 183 #define CLK_GP5_CTRL (CLK_GP5_OFFSET + 0x00) 184 #define CLK_GP5_DIV_INT (CLK_GP5_OFFSET + 0x04) 185 #define CLK_GP5_DIV_FRAC (CLK_GP5_OFFSET + 0x08) 186 #define CLK_GP5_SEL (CLK_GP5_OFFSET + 0x0c) 187 188 #define CLK_SYS_RESUS_CTRL 0x0020c 189 190 #define CLK_SLOW_SYS_RESUS_CTRL 0x00214 191 192 #define FC0_OFFSET 0x0021c 193 #define FC0_REF_KHZ (FC0_OFFSET + 0x00) 194 #define FC0_MIN_KHZ (FC0_OFFSET + 0x04) 195 #define FC0_MAX_KHZ (FC0_OFFSET + 0x08) 196 #define FC0_DELAY (FC0_OFFSET + 0x0c) 197 #define FC0_INTERVAL (FC0_OFFSET + 0x10) 198 #define FC0_SRC (FC0_OFFSET + 0x14) 199 #define FC0_STATUS (FC0_OFFSET + 0x18) 200 #define FC0_RESULT (FC0_OFFSET + 0x1c) 201 #define FC_SIZE 0x20 202 #define FC_COUNT 8 203 #define FC_NUM(idx, off) ((idx) * 32 + (off)) 204 205 #define AUX_SEL 1 206 207 #define VIDEO_CLOCKS_OFFSET 0x4000 208 #define VIDEO_CLK_VEC_CTRL (VIDEO_CLOCKS_OFFSET + 0x0000) 209 #define VIDEO_CLK_VEC_DIV_INT (VIDEO_CLOCKS_OFFSET + 0x0004) 210 #define VIDEO_CLK_VEC_SEL (VIDEO_CLOCKS_OFFSET + 0x000c) 211 #define VIDEO_CLK_DPI_CTRL (VIDEO_CLOCKS_OFFSET + 0x0010) 212 #define VIDEO_CLK_DPI_DIV_INT (VIDEO_CLOCKS_OFFSET + 0x0014) 213 #define VIDEO_CLK_DPI_SEL (VIDEO_CLOCKS_OFFSET + 0x001c) 214 #define VIDEO_CLK_MIPI0_DPI_CTRL (VIDEO_CLOCKS_OFFSET + 0x0020) 215 #define VIDEO_CLK_MIPI0_DPI_DIV_INT (VIDEO_CLOCKS_OFFSET + 0x0024) 216 #define VIDEO_CLK_MIPI0_DPI_DIV_FRAC (VIDEO_CLOCKS_OFFSET + 0x0028) 217 #define VIDEO_CLK_MIPI0_DPI_SEL (VIDEO_CLOCKS_OFFSET + 0x002c) 218 #define VIDEO_CLK_MIPI1_DPI_CTRL (VIDEO_CLOCKS_OFFSET + 0x0030) 219 #define VIDEO_CLK_MIPI1_DPI_DIV_INT (VIDEO_CLOCKS_OFFSET + 0x0034) 220 #define VIDEO_CLK_MIPI1_DPI_DIV_FRAC (VIDEO_CLOCKS_OFFSET + 0x0038) 221 #define VIDEO_CLK_MIPI1_DPI_SEL (VIDEO_CLOCKS_OFFSET + 0x003c) 222 223 #define DIV_INT_8BIT_MAX GENMASK(7, 0) /* max divide for most clocks */ 224 #define DIV_INT_16BIT_MAX GENMASK(15, 0) /* max divide for GPx, PWM */ 225 #define DIV_INT_24BIT_MAX GENMASK(23, 0) /* max divide for CLK_SYS */ 226 227 #define FC0_STATUS_DONE BIT(4) 228 #define FC0_STATUS_RUNNING BIT(8) 229 #define FC0_RESULT_FRAC_SHIFT 5 230 231 #define PLL_PRIM_DIV1_MASK GENMASK(18, 16) 232 #define PLL_PRIM_DIV2_MASK GENMASK(14, 12) 233 234 #define PLL_SEC_DIV_MASK GENMASK(12, 8) 235 236 #define PLL_CS_LOCK BIT(31) 237 #define PLL_CS_REFDIV_MASK BIT(1) 238 239 #define PLL_PWR_PD BIT(0) 240 #define PLL_PWR_DACPD BIT(1) 241 #define PLL_PWR_DSMPD BIT(2) 242 #define PLL_PWR_POSTDIVPD BIT(3) 243 #define PLL_PWR_4PHASEPD BIT(4) 244 #define PLL_PWR_VCOPD BIT(5) 245 #define PLL_PWR_MASK GENMASK(5, 0) 246 247 #define PLL_SEC_RST BIT(16) 248 #define PLL_SEC_IMPL BIT(31) 249 250 /* PLL phase output for both PRI and SEC */ 251 #define PLL_PH_EN BIT(4) 252 #define PLL_PH_PHASE_SHIFT 0 253 254 #define RP1_PLL_PHASE_0 0 255 #define RP1_PLL_PHASE_90 1 256 #define RP1_PLL_PHASE_180 2 257 #define RP1_PLL_PHASE_270 3 258 259 /* Clock fields for all clocks */ 260 #define CLK_CTRL_ENABLE BIT(11) 261 #define CLK_CTRL_AUXSRC_MASK GENMASK(9, 5) 262 #define CLK_CTRL_SRC_SHIFT 0 263 #define CLK_DIV_FRAC_BITS 16 264 265 #define LOCK_TIMEOUT_US 100000 266 #define LOCK_POLL_DELAY_US 5 267 268 #define MAX_CLK_PARENTS 16 269 270 #define PLL_DIV_INVALID 19 271 /* 272 * Secondary PLL channel output divider table. 273 * Divider values range from 8 to 19, where 274 * 19 means invalid. 275 */ 276 static const struct clk_div_table pll_sec_div_table[] = { 277 { 0x00, PLL_DIV_INVALID }, 278 { 0x01, PLL_DIV_INVALID }, 279 { 0x02, PLL_DIV_INVALID }, 280 { 0x03, PLL_DIV_INVALID }, 281 { 0x04, PLL_DIV_INVALID }, 282 { 0x05, PLL_DIV_INVALID }, 283 { 0x06, PLL_DIV_INVALID }, 284 { 0x07, PLL_DIV_INVALID }, 285 { 0x08, 8 }, 286 { 0x09, 9 }, 287 { 0x0a, 10 }, 288 { 0x0b, 11 }, 289 { 0x0c, 12 }, 290 { 0x0d, 13 }, 291 { 0x0e, 14 }, 292 { 0x0f, 15 }, 293 { 0x10, 16 }, 294 { 0x11, 17 }, 295 { 0x12, 18 }, 296 { 0x13, PLL_DIV_INVALID }, 297 { 0x14, PLL_DIV_INVALID }, 298 { 0x15, PLL_DIV_INVALID }, 299 { 0x16, PLL_DIV_INVALID }, 300 { 0x17, PLL_DIV_INVALID }, 301 { 0x18, PLL_DIV_INVALID }, 302 { 0x19, PLL_DIV_INVALID }, 303 { 0x1a, PLL_DIV_INVALID }, 304 { 0x1b, PLL_DIV_INVALID }, 305 { 0x1c, PLL_DIV_INVALID }, 306 { 0x1d, PLL_DIV_INVALID }, 307 { 0x1e, PLL_DIV_INVALID }, 308 { 0x1f, PLL_DIV_INVALID }, 309 { 0 } 310 }; 311 312 struct rp1_clockman { 313 struct device *dev; 314 void __iomem *regs; 315 struct regmap *regmap; 316 spinlock_t regs_lock; /* spinlock for all clocks */ 317 318 /* Must be last */ 319 struct clk_hw_onecell_data onecell; 320 }; 321 322 struct rp1_pll_core_data { 323 u32 cs_reg; 324 u32 pwr_reg; 325 u32 fbdiv_int_reg; 326 u32 fbdiv_frac_reg; 327 u32 fc0_src; 328 }; 329 330 struct rp1_pll_data { 331 u32 ctrl_reg; 332 u32 fc0_src; 333 }; 334 335 struct rp1_pll_ph_data { 336 unsigned int phase; 337 unsigned int fixed_divider; 338 u32 ph_reg; 339 u32 fc0_src; 340 }; 341 342 struct rp1_pll_divider_data { 343 u32 sec_reg; 344 u32 fc0_src; 345 }; 346 347 struct rp1_clock_data { 348 int num_std_parents; 349 int num_aux_parents; 350 u32 oe_mask; 351 u32 clk_src_mask; 352 u32 ctrl_reg; 353 u32 div_int_reg; 354 u32 div_frac_reg; 355 u32 sel_reg; 356 u32 div_int_max; 357 unsigned long max_freq; 358 u32 fc0_src; 359 }; 360 361 struct rp1_clk_desc { 362 struct clk_hw *(*clk_register)(struct rp1_clockman *clockman, 363 struct rp1_clk_desc *desc); 364 const void *data; 365 struct clk_hw hw; 366 struct rp1_clockman *clockman; 367 unsigned long cached_rate; 368 struct clk_divider div; 369 }; 370 371 static struct rp1_clk_desc *clk_audio_core; 372 static struct rp1_clk_desc *clk_audio; 373 static struct rp1_clk_desc *clk_i2s; 374 static struct clk_hw *clk_xosc; 375 376 static inline 377 void clockman_write(struct rp1_clockman *clockman, u32 reg, u32 val) 378 { 379 regmap_write(clockman->regmap, reg, val); 380 } 381 382 static inline u32 clockman_read(struct rp1_clockman *clockman, u32 reg) 383 { 384 u32 val; 385 386 regmap_read(clockman->regmap, reg, &val); 387 388 return val; 389 } 390 391 static int rp1_pll_core_is_on(struct clk_hw *hw) 392 { 393 struct rp1_clk_desc *pll_core = container_of(hw, struct rp1_clk_desc, hw); 394 struct rp1_clockman *clockman = pll_core->clockman; 395 const struct rp1_pll_core_data *data = pll_core->data; 396 u32 pwr = clockman_read(clockman, data->pwr_reg); 397 398 return (pwr & PLL_PWR_PD) || (pwr & PLL_PWR_POSTDIVPD); 399 } 400 401 static int rp1_pll_core_on(struct clk_hw *hw) 402 { 403 struct rp1_clk_desc *pll_core = container_of(hw, struct rp1_clk_desc, hw); 404 struct rp1_clockman *clockman = pll_core->clockman; 405 const struct rp1_pll_core_data *data = pll_core->data; 406 u32 fbdiv_frac, val; 407 int ret; 408 409 spin_lock(&clockman->regs_lock); 410 411 if (!(clockman_read(clockman, data->cs_reg) & PLL_CS_LOCK)) { 412 /* Reset to a known state. */ 413 clockman_write(clockman, data->pwr_reg, PLL_PWR_MASK); 414 clockman_write(clockman, data->fbdiv_int_reg, 20); 415 clockman_write(clockman, data->fbdiv_frac_reg, 0); 416 clockman_write(clockman, data->cs_reg, PLL_CS_REFDIV_MASK); 417 } 418 419 /* Come out of reset. */ 420 fbdiv_frac = clockman_read(clockman, data->fbdiv_frac_reg); 421 clockman_write(clockman, data->pwr_reg, fbdiv_frac ? 0 : PLL_PWR_DSMPD); 422 spin_unlock(&clockman->regs_lock); 423 424 /* Wait for the PLL to lock. */ 425 ret = regmap_read_poll_timeout(clockman->regmap, data->cs_reg, val, 426 val & PLL_CS_LOCK, 427 LOCK_POLL_DELAY_US, LOCK_TIMEOUT_US); 428 if (ret) 429 dev_err(clockman->dev, "%s: can't lock PLL\n", 430 clk_hw_get_name(hw)); 431 432 return ret; 433 } 434 435 static void rp1_pll_core_off(struct clk_hw *hw) 436 { 437 struct rp1_clk_desc *pll_core = container_of(hw, struct rp1_clk_desc, hw); 438 struct rp1_clockman *clockman = pll_core->clockman; 439 const struct rp1_pll_core_data *data = pll_core->data; 440 441 spin_lock(&clockman->regs_lock); 442 clockman_write(clockman, data->pwr_reg, 0); 443 spin_unlock(&clockman->regs_lock); 444 } 445 446 static inline unsigned long get_pll_core_divider(struct clk_hw *hw, 447 unsigned long rate, 448 unsigned long parent_rate, 449 u32 *div_int, u32 *div_frac) 450 { 451 u32 fbdiv_int, fbdiv_frac; 452 unsigned long calc_rate; 453 u64 shifted_fbdiv_int; 454 u64 div_fp64; /* 32.32 fixed point fraction. */ 455 456 /* Factor of reference clock to VCO frequency. */ 457 div_fp64 = (u64)(rate) << 32; 458 div_fp64 = DIV_ROUND_CLOSEST_ULL(div_fp64, parent_rate); 459 460 /* Round the fractional component at 24 bits. */ 461 div_fp64 += 1 << (32 - 24 - 1); 462 463 fbdiv_int = div_fp64 >> 32; 464 fbdiv_frac = (div_fp64 >> (32 - 24)) & 0xffffff; 465 466 shifted_fbdiv_int = (u64)fbdiv_int << 24; 467 calc_rate = (u64)parent_rate * (shifted_fbdiv_int + fbdiv_frac); 468 calc_rate += BIT(23); 469 calc_rate >>= 24; 470 471 *div_int = fbdiv_int; 472 *div_frac = fbdiv_frac; 473 474 return calc_rate; 475 } 476 477 static int rp1_pll_core_set_rate(struct clk_hw *hw, 478 unsigned long rate, unsigned long parent_rate) 479 { 480 struct rp1_clk_desc *pll_core = container_of(hw, struct rp1_clk_desc, hw); 481 struct rp1_clockman *clockman = pll_core->clockman; 482 const struct rp1_pll_core_data *data = pll_core->data; 483 u32 fbdiv_int, fbdiv_frac; 484 485 /* Disable dividers to start with. */ 486 spin_lock(&clockman->regs_lock); 487 clockman_write(clockman, data->fbdiv_int_reg, 0); 488 clockman_write(clockman, data->fbdiv_frac_reg, 0); 489 spin_unlock(&clockman->regs_lock); 490 491 get_pll_core_divider(hw, rate, parent_rate, 492 &fbdiv_int, &fbdiv_frac); 493 494 spin_lock(&clockman->regs_lock); 495 clockman_write(clockman, data->pwr_reg, fbdiv_frac ? 0 : PLL_PWR_DSMPD); 496 clockman_write(clockman, data->fbdiv_int_reg, fbdiv_int); 497 clockman_write(clockman, data->fbdiv_frac_reg, fbdiv_frac); 498 spin_unlock(&clockman->regs_lock); 499 500 /* Check that reference frequency is no greater than VCO / 16. */ 501 if (WARN_ON_ONCE(parent_rate > (rate / 16))) 502 return -ERANGE; 503 504 spin_lock(&clockman->regs_lock); 505 /* Don't need to divide ref unless parent_rate > (output freq / 16) */ 506 clockman_write(clockman, data->cs_reg, 507 clockman_read(clockman, data->cs_reg) | 508 PLL_CS_REFDIV_MASK); 509 spin_unlock(&clockman->regs_lock); 510 511 return 0; 512 } 513 514 static unsigned long rp1_pll_core_recalc_rate(struct clk_hw *hw, 515 unsigned long parent_rate) 516 { 517 struct rp1_clk_desc *pll_core = container_of(hw, struct rp1_clk_desc, hw); 518 struct rp1_clockman *clockman = pll_core->clockman; 519 const struct rp1_pll_core_data *data = pll_core->data; 520 u32 fbdiv_int, fbdiv_frac; 521 unsigned long calc_rate; 522 u64 shifted_fbdiv_int; 523 524 fbdiv_int = clockman_read(clockman, data->fbdiv_int_reg); 525 fbdiv_frac = clockman_read(clockman, data->fbdiv_frac_reg); 526 527 shifted_fbdiv_int = (u64)fbdiv_int << 24; 528 calc_rate = (u64)parent_rate * (shifted_fbdiv_int + fbdiv_frac); 529 calc_rate += BIT(23); 530 calc_rate >>= 24; 531 532 return calc_rate; 533 } 534 535 static int rp1_pll_core_determine_rate(struct clk_hw *hw, 536 struct clk_rate_request *req) 537 { 538 u32 fbdiv_int, fbdiv_frac; 539 540 req->rate = get_pll_core_divider(hw, req->rate, req->best_parent_rate, 541 &fbdiv_int, 542 &fbdiv_frac); 543 544 return 0; 545 } 546 547 static void get_pll_prim_dividers(unsigned long rate, unsigned long parent_rate, 548 u32 *divider1, u32 *divider2) 549 { 550 unsigned int div1, div2; 551 unsigned int best_div1 = 7, best_div2 = 7; 552 unsigned long best_rate_diff = 553 abs_diff(DIV_ROUND_CLOSEST(parent_rate, best_div1 * best_div2), rate); 554 unsigned long rate_diff, calc_rate; 555 556 for (div1 = 1; div1 <= 7; div1++) { 557 for (div2 = 1; div2 <= div1; div2++) { 558 calc_rate = DIV_ROUND_CLOSEST(parent_rate, div1 * div2); 559 rate_diff = abs_diff(calc_rate, rate); 560 561 if (calc_rate == rate) { 562 best_div1 = div1; 563 best_div2 = div2; 564 goto done; 565 } else if (rate_diff < best_rate_diff) { 566 best_div1 = div1; 567 best_div2 = div2; 568 best_rate_diff = rate_diff; 569 } 570 } 571 } 572 573 done: 574 *divider1 = best_div1; 575 *divider2 = best_div2; 576 } 577 578 static int rp1_pll_set_rate(struct clk_hw *hw, 579 unsigned long rate, unsigned long parent_rate) 580 { 581 struct rp1_clk_desc *pll = container_of(hw, struct rp1_clk_desc, hw); 582 struct rp1_clockman *clockman = pll->clockman; 583 const struct rp1_pll_data *data = pll->data; 584 585 u32 prim, prim_div1, prim_div2; 586 587 get_pll_prim_dividers(rate, parent_rate, &prim_div1, &prim_div2); 588 589 spin_lock(&clockman->regs_lock); 590 prim = clockman_read(clockman, data->ctrl_reg); 591 prim &= ~PLL_PRIM_DIV1_MASK; 592 prim |= FIELD_PREP(PLL_PRIM_DIV1_MASK, prim_div1); 593 prim &= ~PLL_PRIM_DIV2_MASK; 594 prim |= FIELD_PREP(PLL_PRIM_DIV2_MASK, prim_div2); 595 clockman_write(clockman, data->ctrl_reg, prim); 596 spin_unlock(&clockman->regs_lock); 597 598 return 0; 599 } 600 601 static unsigned long rp1_pll_recalc_rate(struct clk_hw *hw, 602 unsigned long parent_rate) 603 { 604 struct rp1_clk_desc *pll = container_of(hw, struct rp1_clk_desc, hw); 605 struct rp1_clockman *clockman = pll->clockman; 606 const struct rp1_pll_data *data = pll->data; 607 u32 prim, prim_div1, prim_div2; 608 609 prim = clockman_read(clockman, data->ctrl_reg); 610 prim_div1 = FIELD_GET(PLL_PRIM_DIV1_MASK, prim); 611 prim_div2 = FIELD_GET(PLL_PRIM_DIV2_MASK, prim); 612 613 if (!prim_div1 || !prim_div2) { 614 dev_err(clockman->dev, "%s: (%s) zero divider value\n", 615 __func__, clk_hw_get_name(hw)); 616 return 0; 617 } 618 619 return DIV_ROUND_CLOSEST(parent_rate, prim_div1 * prim_div2); 620 } 621 622 static int rp1_pll_determine_rate(struct clk_hw *hw, 623 struct clk_rate_request *req) 624 { 625 struct clk_hw *clk_audio_hw = &clk_audio->hw; 626 u32 div1, div2; 627 628 if (hw == clk_audio_hw && clk_audio->cached_rate == req->rate) 629 req->best_parent_rate = clk_audio_core->cached_rate; 630 631 get_pll_prim_dividers(req->rate, req->best_parent_rate, &div1, &div2); 632 633 req->rate = DIV_ROUND_CLOSEST(req->best_parent_rate, div1 * div2); 634 635 return 0; 636 } 637 638 static int rp1_pll_ph_is_on(struct clk_hw *hw) 639 { 640 struct rp1_clk_desc *pll_ph = container_of(hw, struct rp1_clk_desc, hw); 641 struct rp1_clockman *clockman = pll_ph->clockman; 642 const struct rp1_pll_ph_data *data = pll_ph->data; 643 644 return !!(clockman_read(clockman, data->ph_reg) & PLL_PH_EN); 645 } 646 647 static int rp1_pll_ph_on(struct clk_hw *hw) 648 { 649 struct rp1_clk_desc *pll_ph = container_of(hw, struct rp1_clk_desc, hw); 650 struct rp1_clockman *clockman = pll_ph->clockman; 651 const struct rp1_pll_ph_data *data = pll_ph->data; 652 u32 ph_reg; 653 654 spin_lock(&clockman->regs_lock); 655 ph_reg = clockman_read(clockman, data->ph_reg); 656 ph_reg |= data->phase << PLL_PH_PHASE_SHIFT; 657 ph_reg |= PLL_PH_EN; 658 clockman_write(clockman, data->ph_reg, ph_reg); 659 spin_unlock(&clockman->regs_lock); 660 661 return 0; 662 } 663 664 static void rp1_pll_ph_off(struct clk_hw *hw) 665 { 666 struct rp1_clk_desc *pll_ph = container_of(hw, struct rp1_clk_desc, hw); 667 struct rp1_clockman *clockman = pll_ph->clockman; 668 const struct rp1_pll_ph_data *data = pll_ph->data; 669 670 spin_lock(&clockman->regs_lock); 671 clockman_write(clockman, data->ph_reg, 672 clockman_read(clockman, data->ph_reg) & ~PLL_PH_EN); 673 spin_unlock(&clockman->regs_lock); 674 } 675 676 static unsigned long rp1_pll_ph_recalc_rate(struct clk_hw *hw, 677 unsigned long parent_rate) 678 { 679 struct rp1_clk_desc *pll_ph = container_of(hw, struct rp1_clk_desc, hw); 680 const struct rp1_pll_ph_data *data = pll_ph->data; 681 682 return parent_rate / data->fixed_divider; 683 } 684 685 static int rp1_pll_ph_determine_rate(struct clk_hw *hw, 686 struct clk_rate_request *req) 687 { 688 struct rp1_clk_desc *pll_ph = container_of(hw, struct rp1_clk_desc, hw); 689 const struct rp1_pll_ph_data *data = pll_ph->data; 690 691 req->rate = req->best_parent_rate / data->fixed_divider; 692 693 return 0; 694 } 695 696 static int rp1_pll_divider_is_on(struct clk_hw *hw) 697 { 698 struct rp1_clk_desc *divider = container_of(hw, struct rp1_clk_desc, div.hw); 699 struct rp1_clockman *clockman = divider->clockman; 700 const struct rp1_pll_data *data = divider->data; 701 702 return !(clockman_read(clockman, data->ctrl_reg) & PLL_SEC_RST); 703 } 704 705 static int rp1_pll_divider_on(struct clk_hw *hw) 706 { 707 struct rp1_clk_desc *divider = container_of(hw, struct rp1_clk_desc, div.hw); 708 struct rp1_clockman *clockman = divider->clockman; 709 const struct rp1_pll_data *data = divider->data; 710 711 spin_lock(&clockman->regs_lock); 712 /* Check the implementation bit is set! */ 713 WARN_ON(!(clockman_read(clockman, data->ctrl_reg) & PLL_SEC_IMPL)); 714 clockman_write(clockman, data->ctrl_reg, 715 clockman_read(clockman, data->ctrl_reg) & ~PLL_SEC_RST); 716 spin_unlock(&clockman->regs_lock); 717 718 return 0; 719 } 720 721 static void rp1_pll_divider_off(struct clk_hw *hw) 722 { 723 struct rp1_clk_desc *divider = container_of(hw, struct rp1_clk_desc, div.hw); 724 struct rp1_clockman *clockman = divider->clockman; 725 const struct rp1_pll_data *data = divider->data; 726 727 spin_lock(&clockman->regs_lock); 728 clockman_write(clockman, data->ctrl_reg, 729 clockman_read(clockman, data->ctrl_reg) | PLL_SEC_RST); 730 spin_unlock(&clockman->regs_lock); 731 } 732 733 static int rp1_pll_divider_set_rate(struct clk_hw *hw, 734 unsigned long rate, 735 unsigned long parent_rate) 736 { 737 struct rp1_clk_desc *divider = container_of(hw, struct rp1_clk_desc, div.hw); 738 struct rp1_clockman *clockman = divider->clockman; 739 const struct rp1_pll_data *data = divider->data; 740 u32 div, sec; 741 742 div = DIV_ROUND_UP_ULL(parent_rate, rate); 743 div = clamp(div, 8u, 19u); 744 745 spin_lock(&clockman->regs_lock); 746 sec = clockman_read(clockman, data->ctrl_reg); 747 sec &= ~PLL_SEC_DIV_MASK; 748 sec |= FIELD_PREP(PLL_SEC_DIV_MASK, div); 749 750 /* Must keep the divider in reset to change the value. */ 751 sec |= PLL_SEC_RST; 752 clockman_write(clockman, data->ctrl_reg, sec); 753 754 /* must sleep 10 pll vco cycles */ 755 ndelay(div64_ul(10ULL * div * NSEC_PER_SEC, parent_rate)); 756 757 sec &= ~PLL_SEC_RST; 758 clockman_write(clockman, data->ctrl_reg, sec); 759 spin_unlock(&clockman->regs_lock); 760 761 return 0; 762 } 763 764 static unsigned long rp1_pll_divider_recalc_rate(struct clk_hw *hw, 765 unsigned long parent_rate) 766 { 767 return clk_divider_ops.recalc_rate(hw, parent_rate); 768 } 769 770 static int rp1_pll_divider_determine_rate(struct clk_hw *hw, 771 struct clk_rate_request *req) 772 { 773 req->rate = clk_divider_ops.determine_rate(hw, req); 774 775 return 0; 776 } 777 778 static int rp1_clock_is_on(struct clk_hw *hw) 779 { 780 struct rp1_clk_desc *clock = container_of(hw, struct rp1_clk_desc, hw); 781 struct rp1_clockman *clockman = clock->clockman; 782 const struct rp1_clock_data *data = clock->data; 783 784 return !!(clockman_read(clockman, data->ctrl_reg) & CLK_CTRL_ENABLE); 785 } 786 787 static unsigned long rp1_clock_recalc_rate(struct clk_hw *hw, 788 unsigned long parent_rate) 789 { 790 struct rp1_clk_desc *clock = container_of(hw, struct rp1_clk_desc, hw); 791 struct rp1_clockman *clockman = clock->clockman; 792 const struct rp1_clock_data *data = clock->data; 793 u64 calc_rate; 794 u64 div; 795 u32 frac; 796 797 div = clockman_read(clockman, data->div_int_reg); 798 frac = (data->div_frac_reg != 0) ? 799 clockman_read(clockman, data->div_frac_reg) : 0; 800 801 /* If the integer portion of the divider is 0, treat it as 2^16 */ 802 if (!div) 803 div = 1 << 16; 804 805 div = (div << CLK_DIV_FRAC_BITS) | (frac >> (32 - CLK_DIV_FRAC_BITS)); 806 807 calc_rate = (u64)parent_rate << CLK_DIV_FRAC_BITS; 808 calc_rate = div64_u64(calc_rate, div); 809 810 return calc_rate; 811 } 812 813 static int rp1_clock_on(struct clk_hw *hw) 814 { 815 struct rp1_clk_desc *clock = container_of(hw, struct rp1_clk_desc, hw); 816 struct rp1_clockman *clockman = clock->clockman; 817 const struct rp1_clock_data *data = clock->data; 818 819 spin_lock(&clockman->regs_lock); 820 clockman_write(clockman, data->ctrl_reg, 821 clockman_read(clockman, data->ctrl_reg) | CLK_CTRL_ENABLE); 822 /* If this is a GPCLK, turn on the output-enable */ 823 if (data->oe_mask) 824 clockman_write(clockman, GPCLK_OE_CTRL, 825 clockman_read(clockman, GPCLK_OE_CTRL) | data->oe_mask); 826 spin_unlock(&clockman->regs_lock); 827 828 return 0; 829 } 830 831 static void rp1_clock_off(struct clk_hw *hw) 832 { 833 struct rp1_clk_desc *clock = container_of(hw, struct rp1_clk_desc, hw); 834 struct rp1_clockman *clockman = clock->clockman; 835 const struct rp1_clock_data *data = clock->data; 836 837 spin_lock(&clockman->regs_lock); 838 clockman_write(clockman, data->ctrl_reg, 839 clockman_read(clockman, data->ctrl_reg) & ~CLK_CTRL_ENABLE); 840 /* If this is a GPCLK, turn off the output-enable */ 841 if (data->oe_mask) 842 clockman_write(clockman, GPCLK_OE_CTRL, 843 clockman_read(clockman, GPCLK_OE_CTRL) & ~data->oe_mask); 844 spin_unlock(&clockman->regs_lock); 845 } 846 847 static u32 rp1_clock_choose_div(unsigned long rate, unsigned long parent_rate, 848 const struct rp1_clock_data *data) 849 { 850 u64 div; 851 852 /* 853 * Due to earlier rounding, calculated parent_rate may differ from 854 * expected value. Don't fail on a small discrepancy near unity divide. 855 */ 856 if (!rate || rate > parent_rate + (parent_rate >> CLK_DIV_FRAC_BITS)) 857 return 0; 858 859 /* 860 * Always express div in fixed-point format for fractional division; 861 * If no fractional divider is present, the fraction part will be zero. 862 */ 863 if (data->div_frac_reg) { 864 div = (u64)parent_rate << CLK_DIV_FRAC_BITS; 865 div = DIV_ROUND_CLOSEST_ULL(div, rate); 866 } else { 867 div = DIV_ROUND_CLOSEST_ULL(parent_rate, rate); 868 div <<= CLK_DIV_FRAC_BITS; 869 } 870 871 div = clamp(div, 872 1ull << CLK_DIV_FRAC_BITS, 873 (u64)data->div_int_max << CLK_DIV_FRAC_BITS); 874 875 return div; 876 } 877 878 static u8 rp1_clock_get_parent(struct clk_hw *hw) 879 { 880 struct rp1_clk_desc *clock = container_of(hw, struct rp1_clk_desc, hw); 881 struct rp1_clockman *clockman = clock->clockman; 882 const struct rp1_clock_data *data = clock->data; 883 u32 sel, ctrl; 884 u8 parent; 885 886 /* Sel is one-hot, so find the first bit set */ 887 sel = clockman_read(clockman, data->sel_reg); 888 parent = ffs(sel) - 1; 889 890 /* sel == 0 implies the parent clock is not enabled yet. */ 891 if (!sel) { 892 /* Read the clock src from the CTRL register instead */ 893 ctrl = clockman_read(clockman, data->ctrl_reg); 894 parent = (ctrl & data->clk_src_mask) >> CLK_CTRL_SRC_SHIFT; 895 } 896 897 if (parent >= data->num_std_parents) 898 parent = AUX_SEL; 899 900 if (parent == AUX_SEL) { 901 /* 902 * Clock parent is an auxiliary source, so get the parent from 903 * the AUXSRC register field. 904 */ 905 ctrl = clockman_read(clockman, data->ctrl_reg); 906 parent = FIELD_GET(CLK_CTRL_AUXSRC_MASK, ctrl); 907 parent += data->num_std_parents; 908 } 909 910 return parent; 911 } 912 913 static int rp1_clock_set_parent(struct clk_hw *hw, u8 index) 914 { 915 struct rp1_clk_desc *clock = container_of(hw, struct rp1_clk_desc, hw); 916 struct rp1_clockman *clockman = clock->clockman; 917 const struct rp1_clock_data *data = clock->data; 918 u32 ctrl, sel; 919 920 spin_lock(&clockman->regs_lock); 921 ctrl = clockman_read(clockman, data->ctrl_reg); 922 923 if (index >= data->num_std_parents) { 924 /* This is an aux source request */ 925 if (index >= data->num_std_parents + data->num_aux_parents) { 926 spin_unlock(&clockman->regs_lock); 927 return -EINVAL; 928 } 929 930 /* Select parent from aux list */ 931 ctrl &= ~CLK_CTRL_AUXSRC_MASK; 932 ctrl |= FIELD_PREP(CLK_CTRL_AUXSRC_MASK, index - data->num_std_parents); 933 /* Set src to aux list */ 934 ctrl &= ~data->clk_src_mask; 935 ctrl |= (AUX_SEL << CLK_CTRL_SRC_SHIFT) & data->clk_src_mask; 936 } else { 937 ctrl &= ~data->clk_src_mask; 938 ctrl |= (index << CLK_CTRL_SRC_SHIFT) & data->clk_src_mask; 939 } 940 941 clockman_write(clockman, data->ctrl_reg, ctrl); 942 spin_unlock(&clockman->regs_lock); 943 944 sel = rp1_clock_get_parent(hw); 945 if (sel != index) 946 return -EINVAL; 947 948 return 0; 949 } 950 951 static int rp1_clock_set_rate_and_parent(struct clk_hw *hw, 952 unsigned long rate, 953 unsigned long parent_rate, 954 u8 parent) 955 { 956 struct rp1_clk_desc *clock = container_of(hw, struct rp1_clk_desc, hw); 957 struct rp1_clockman *clockman = clock->clockman; 958 const struct rp1_clock_data *data = clock->data; 959 u32 div = rp1_clock_choose_div(rate, parent_rate, data); 960 961 spin_lock(&clockman->regs_lock); 962 963 clockman_write(clockman, data->div_int_reg, div >> CLK_DIV_FRAC_BITS); 964 if (data->div_frac_reg) 965 clockman_write(clockman, data->div_frac_reg, div << (32 - CLK_DIV_FRAC_BITS)); 966 967 spin_unlock(&clockman->regs_lock); 968 969 if (parent != 0xff) 970 return rp1_clock_set_parent(hw, parent); 971 972 return 0; 973 } 974 975 static int rp1_clock_set_rate(struct clk_hw *hw, unsigned long rate, 976 unsigned long parent_rate) 977 { 978 return rp1_clock_set_rate_and_parent(hw, rate, parent_rate, 0xff); 979 } 980 981 static unsigned long calc_core_pll_rate(struct clk_hw *pll_hw, 982 unsigned long target_rate, 983 int *pdiv_prim, int *pdiv_clk) 984 { 985 static const int prim_divs[] = { 986 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 15, 16, 987 18, 20, 21, 24, 25, 28, 30, 35, 36, 42, 49, 988 }; 989 const unsigned long xosc_rate = clk_hw_get_rate(clk_xosc); 990 const unsigned long core_min = xosc_rate * 16; 991 const unsigned long core_max = 2400000000; 992 int best_div_prim = 1, best_div_clk = 1; 993 unsigned long best_rate = core_max + 1; 994 unsigned long core_rate = 0; 995 int div_int, div_frac; 996 u64 div; 997 int i; 998 999 /* Given the target rate, choose a set of divisors/multipliers */ 1000 for (i = 0; i < ARRAY_SIZE(prim_divs); i++) { 1001 int div_prim = prim_divs[i]; 1002 int div_clk; 1003 1004 for (div_clk = 1; div_clk <= 256; div_clk++) { 1005 core_rate = target_rate * div_clk * div_prim; 1006 if (core_rate >= core_min) { 1007 if (core_rate < best_rate) { 1008 best_rate = core_rate; 1009 best_div_prim = div_prim; 1010 best_div_clk = div_clk; 1011 } 1012 break; 1013 } 1014 } 1015 } 1016 1017 if (best_rate < core_max) { 1018 div = ((best_rate << 24) + xosc_rate / 2) / xosc_rate; 1019 div_int = div >> 24; 1020 div_frac = div % (1 << 24); 1021 core_rate = (xosc_rate * ((div_int << 24) + div_frac) + (1 << 23)) >> 24; 1022 } else { 1023 core_rate = 0; 1024 } 1025 1026 if (pdiv_prim) 1027 *pdiv_prim = best_div_prim; 1028 if (pdiv_clk) 1029 *pdiv_clk = best_div_clk; 1030 1031 return core_rate; 1032 } 1033 1034 static void rp1_clock_choose_div_and_prate(struct clk_hw *hw, 1035 int parent_idx, 1036 unsigned long rate, 1037 unsigned long *prate, 1038 unsigned long *calc_rate) 1039 { 1040 struct rp1_clk_desc *clock = container_of(hw, struct rp1_clk_desc, hw); 1041 const struct rp1_clock_data *data = clock->data; 1042 struct clk_hw *clk_audio_hw = &clk_audio->hw; 1043 struct clk_hw *clk_i2s_hw = &clk_i2s->hw; 1044 struct clk_hw *parent; 1045 u32 div; 1046 u64 tmp; 1047 1048 parent = clk_hw_get_parent_by_index(hw, parent_idx); 1049 1050 if (hw == clk_i2s_hw && clk_i2s->cached_rate == rate && parent == clk_audio_hw) { 1051 *prate = clk_audio->cached_rate; 1052 *calc_rate = rate; 1053 return; 1054 } 1055 1056 if (hw == clk_i2s_hw && parent == clk_audio_hw) { 1057 unsigned long core_rate, audio_rate, i2s_rate; 1058 int div_prim, div_clk; 1059 1060 core_rate = calc_core_pll_rate(parent, rate, &div_prim, &div_clk); 1061 audio_rate = DIV_ROUND_CLOSEST(core_rate, div_prim); 1062 i2s_rate = DIV_ROUND_CLOSEST(audio_rate, div_clk); 1063 clk_audio_core->cached_rate = core_rate; 1064 clk_audio->cached_rate = audio_rate; 1065 clk_i2s->cached_rate = i2s_rate; 1066 *prate = audio_rate; 1067 *calc_rate = i2s_rate; 1068 return; 1069 } 1070 1071 *prate = clk_hw_get_rate(parent); 1072 div = rp1_clock_choose_div(rate, *prate, data); 1073 1074 if (!div) { 1075 *calc_rate = 0; 1076 return; 1077 } 1078 1079 /* Recalculate to account for rounding errors */ 1080 tmp = (u64)*prate << CLK_DIV_FRAC_BITS; 1081 tmp = div_u64(tmp, div); 1082 1083 /* 1084 * Prevent overclocks - if all parent choices result in 1085 * a downstream clock in excess of the maximum, then the 1086 * call to set the clock will fail. 1087 */ 1088 if (tmp > data->max_freq) 1089 *calc_rate = 0; 1090 else 1091 *calc_rate = tmp; 1092 } 1093 1094 static int rp1_clock_determine_rate(struct clk_hw *hw, 1095 struct clk_rate_request *req) 1096 { 1097 struct clk_hw *parent, *best_parent = NULL; 1098 unsigned long best_rate = 0; 1099 unsigned long best_prate = 0; 1100 unsigned long best_rate_diff = ULONG_MAX; 1101 unsigned long prate, calc_rate; 1102 size_t i; 1103 1104 /* 1105 * If the NO_REPARENT flag is set, try to use existing parent. 1106 */ 1107 if ((clk_hw_get_flags(hw) & CLK_SET_RATE_NO_REPARENT)) { 1108 i = rp1_clock_get_parent(hw); 1109 parent = clk_hw_get_parent_by_index(hw, i); 1110 if (parent) { 1111 rp1_clock_choose_div_and_prate(hw, i, req->rate, &prate, 1112 &calc_rate); 1113 if (calc_rate > 0) { 1114 req->best_parent_hw = parent; 1115 req->best_parent_rate = prate; 1116 req->rate = calc_rate; 1117 return 0; 1118 } 1119 } 1120 } 1121 1122 /* 1123 * Select parent clock that results in the closest rate (lower or 1124 * higher) 1125 */ 1126 for (i = 0; i < clk_hw_get_num_parents(hw); i++) { 1127 parent = clk_hw_get_parent_by_index(hw, i); 1128 if (!parent) 1129 continue; 1130 1131 rp1_clock_choose_div_and_prate(hw, i, req->rate, &prate, 1132 &calc_rate); 1133 1134 if (abs_diff(calc_rate, req->rate) < best_rate_diff) { 1135 best_parent = parent; 1136 best_prate = prate; 1137 best_rate = calc_rate; 1138 best_rate_diff = abs_diff(calc_rate, req->rate); 1139 1140 if (best_rate_diff == 0) 1141 break; 1142 } 1143 } 1144 1145 if (best_rate == 0) 1146 return -EINVAL; 1147 1148 req->best_parent_hw = best_parent; 1149 req->best_parent_rate = best_prate; 1150 req->rate = best_rate; 1151 1152 return 0; 1153 } 1154 1155 static int rp1_varsrc_set_rate(struct clk_hw *hw, 1156 unsigned long rate, unsigned long parent_rate) 1157 { 1158 struct rp1_clk_desc *clock = container_of(hw, struct rp1_clk_desc, hw); 1159 1160 /* 1161 * "varsrc" exists purely to let clock dividers know the frequency 1162 * of an externally-managed clock source (such as MIPI DSI byte-clock) 1163 * which may change at run-time as a side-effect of some other driver. 1164 */ 1165 clock->cached_rate = rate; 1166 return 0; 1167 } 1168 1169 static unsigned long rp1_varsrc_recalc_rate(struct clk_hw *hw, 1170 unsigned long parent_rate) 1171 { 1172 struct rp1_clk_desc *clock = container_of(hw, struct rp1_clk_desc, hw); 1173 1174 return clock->cached_rate; 1175 } 1176 1177 static int rp1_varsrc_determine_rate(struct clk_hw *hw, 1178 struct clk_rate_request *req) 1179 { 1180 return 0; 1181 } 1182 1183 static const struct clk_ops rp1_pll_core_ops = { 1184 .is_prepared = rp1_pll_core_is_on, 1185 .prepare = rp1_pll_core_on, 1186 .unprepare = rp1_pll_core_off, 1187 .set_rate = rp1_pll_core_set_rate, 1188 .recalc_rate = rp1_pll_core_recalc_rate, 1189 .determine_rate = rp1_pll_core_determine_rate, 1190 }; 1191 1192 static const struct clk_ops rp1_pll_ops = { 1193 .set_rate = rp1_pll_set_rate, 1194 .recalc_rate = rp1_pll_recalc_rate, 1195 .determine_rate = rp1_pll_determine_rate, 1196 }; 1197 1198 static const struct clk_ops rp1_pll_ph_ops = { 1199 .is_prepared = rp1_pll_ph_is_on, 1200 .prepare = rp1_pll_ph_on, 1201 .unprepare = rp1_pll_ph_off, 1202 .recalc_rate = rp1_pll_ph_recalc_rate, 1203 .determine_rate = rp1_pll_ph_determine_rate, 1204 }; 1205 1206 static const struct clk_ops rp1_pll_divider_ops = { 1207 .is_prepared = rp1_pll_divider_is_on, 1208 .prepare = rp1_pll_divider_on, 1209 .unprepare = rp1_pll_divider_off, 1210 .set_rate = rp1_pll_divider_set_rate, 1211 .recalc_rate = rp1_pll_divider_recalc_rate, 1212 .determine_rate = rp1_pll_divider_determine_rate, 1213 }; 1214 1215 static const struct clk_ops rp1_clk_ops = { 1216 .is_prepared = rp1_clock_is_on, 1217 .prepare = rp1_clock_on, 1218 .unprepare = rp1_clock_off, 1219 .recalc_rate = rp1_clock_recalc_rate, 1220 .get_parent = rp1_clock_get_parent, 1221 .set_parent = rp1_clock_set_parent, 1222 .set_rate_and_parent = rp1_clock_set_rate_and_parent, 1223 .set_rate = rp1_clock_set_rate, 1224 .determine_rate = rp1_clock_determine_rate, 1225 }; 1226 1227 static const struct clk_ops rp1_varsrc_ops = { 1228 .set_rate = rp1_varsrc_set_rate, 1229 .recalc_rate = rp1_varsrc_recalc_rate, 1230 .determine_rate = rp1_varsrc_determine_rate, 1231 }; 1232 1233 static struct clk_hw *rp1_register_pll(struct rp1_clockman *clockman, 1234 struct rp1_clk_desc *desc) 1235 { 1236 int ret; 1237 1238 desc->clockman = clockman; 1239 1240 ret = devm_clk_hw_register(clockman->dev, &desc->hw); 1241 if (ret) 1242 return ERR_PTR(ret); 1243 1244 return &desc->hw; 1245 } 1246 1247 static struct clk_hw *rp1_register_pll_divider(struct rp1_clockman *clockman, 1248 struct rp1_clk_desc *desc) 1249 { 1250 const struct rp1_pll_data *divider_data = desc->data; 1251 int ret; 1252 1253 desc->div.reg = clockman->regs + divider_data->ctrl_reg; 1254 desc->div.shift = __ffs(PLL_SEC_DIV_MASK); 1255 desc->div.width = __ffs(~(PLL_SEC_DIV_MASK >> desc->div.shift)); 1256 desc->div.flags = CLK_DIVIDER_ROUND_CLOSEST; 1257 desc->div.lock = &clockman->regs_lock; 1258 desc->div.hw.init = desc->hw.init; 1259 desc->div.table = pll_sec_div_table; 1260 1261 desc->clockman = clockman; 1262 1263 ret = devm_clk_hw_register(clockman->dev, &desc->div.hw); 1264 if (ret) 1265 return ERR_PTR(ret); 1266 1267 return &desc->div.hw; 1268 } 1269 1270 static struct clk_hw *rp1_register_clock(struct rp1_clockman *clockman, 1271 struct rp1_clk_desc *desc) 1272 { 1273 const struct rp1_clock_data *clock_data = desc->data; 1274 int ret; 1275 1276 if (WARN_ON_ONCE(MAX_CLK_PARENTS < 1277 clock_data->num_std_parents + clock_data->num_aux_parents)) 1278 return ERR_PTR(-EINVAL); 1279 1280 /* There must be a gap for the AUX selector */ 1281 if (WARN_ON_ONCE(clock_data->num_std_parents > AUX_SEL && 1282 desc->hw.init->parent_data[AUX_SEL].index != -1)) 1283 return ERR_PTR(-EINVAL); 1284 1285 desc->clockman = clockman; 1286 1287 ret = devm_clk_hw_register(clockman->dev, &desc->hw); 1288 if (ret) 1289 return ERR_PTR(ret); 1290 1291 return &desc->hw; 1292 } 1293 1294 /* Assignment helper macros for different clock types. */ 1295 #define _REGISTER(f, ...) { .clk_register = f, __VA_ARGS__ } 1296 1297 #define CLK_DATA(type, ...) .data = &(struct type) { __VA_ARGS__ } 1298 1299 #define REGISTER_PLL(...) _REGISTER(&rp1_register_pll, \ 1300 __VA_ARGS__) 1301 1302 #define REGISTER_PLL_DIV(...) _REGISTER(&rp1_register_pll_divider, \ 1303 __VA_ARGS__) 1304 1305 #define REGISTER_CLK(...) _REGISTER(&rp1_register_clock, \ 1306 __VA_ARGS__) 1307 1308 static struct rp1_clk_desc pll_sys_core_desc = REGISTER_PLL( 1309 .hw.init = CLK_HW_INIT_PARENTS_DATA( 1310 "pll_sys_core", 1311 (const struct clk_parent_data[]) { { .index = 0 } }, 1312 &rp1_pll_core_ops, 1313 CLK_IS_CRITICAL 1314 ), 1315 CLK_DATA(rp1_pll_core_data, 1316 .cs_reg = PLL_SYS_CS, 1317 .pwr_reg = PLL_SYS_PWR, 1318 .fbdiv_int_reg = PLL_SYS_FBDIV_INT, 1319 .fbdiv_frac_reg = PLL_SYS_FBDIV_FRAC, 1320 ) 1321 ); 1322 1323 static struct rp1_clk_desc pll_audio_core_desc = REGISTER_PLL( 1324 .hw.init = CLK_HW_INIT_PARENTS_DATA( 1325 "pll_audio_core", 1326 (const struct clk_parent_data[]) { { .index = 0 } }, 1327 &rp1_pll_core_ops, 1328 CLK_IS_CRITICAL 1329 ), 1330 CLK_DATA(rp1_pll_core_data, 1331 .cs_reg = PLL_AUDIO_CS, 1332 .pwr_reg = PLL_AUDIO_PWR, 1333 .fbdiv_int_reg = PLL_AUDIO_FBDIV_INT, 1334 .fbdiv_frac_reg = PLL_AUDIO_FBDIV_FRAC, 1335 ) 1336 ); 1337 1338 static struct rp1_clk_desc pll_video_core_desc = REGISTER_PLL( 1339 .hw.init = CLK_HW_INIT_PARENTS_DATA( 1340 "pll_video_core", 1341 (const struct clk_parent_data[]) { { .index = 0 } }, 1342 &rp1_pll_core_ops, 1343 CLK_IS_CRITICAL 1344 ), 1345 CLK_DATA(rp1_pll_core_data, 1346 .cs_reg = PLL_VIDEO_CS, 1347 .pwr_reg = PLL_VIDEO_PWR, 1348 .fbdiv_int_reg = PLL_VIDEO_FBDIV_INT, 1349 .fbdiv_frac_reg = PLL_VIDEO_FBDIV_FRAC, 1350 ) 1351 ); 1352 1353 static struct rp1_clk_desc pll_sys_desc = REGISTER_PLL( 1354 .hw.init = CLK_HW_INIT_PARENTS_DATA( 1355 "pll_sys", 1356 (const struct clk_parent_data[]) { 1357 { .hw = &pll_sys_core_desc.hw } 1358 }, 1359 &rp1_pll_ops, 1360 0 1361 ), 1362 CLK_DATA(rp1_pll_data, 1363 .ctrl_reg = PLL_SYS_PRIM, 1364 .fc0_src = FC_NUM(0, 2), 1365 ) 1366 ); 1367 1368 static struct rp1_clk_desc pll_audio_desc = REGISTER_PLL( 1369 .hw.init = CLK_HW_INIT_PARENTS_DATA( 1370 "pll_audio", 1371 (const struct clk_parent_data[]) { 1372 { .hw = &pll_audio_core_desc.hw } 1373 }, 1374 &rp1_pll_ops, 1375 CLK_SET_RATE_PARENT 1376 ), 1377 CLK_DATA(rp1_pll_data, 1378 .ctrl_reg = PLL_AUDIO_PRIM, 1379 .fc0_src = FC_NUM(4, 2), 1380 ) 1381 ); 1382 1383 static struct rp1_clk_desc pll_video_desc = REGISTER_PLL( 1384 .hw.init = CLK_HW_INIT_PARENTS_DATA( 1385 "pll_video", 1386 (const struct clk_parent_data[]) { 1387 { .hw = &pll_video_core_desc.hw } 1388 }, 1389 &rp1_pll_ops, 1390 0 1391 ), 1392 CLK_DATA(rp1_pll_data, 1393 .ctrl_reg = PLL_VIDEO_PRIM, 1394 .fc0_src = FC_NUM(3, 2), 1395 ) 1396 ); 1397 1398 static struct rp1_clk_desc pll_sys_sec_desc = REGISTER_PLL_DIV( 1399 .hw.init = CLK_HW_INIT_PARENTS_DATA( 1400 "pll_sys_sec", 1401 (const struct clk_parent_data[]) { 1402 { .hw = &pll_sys_core_desc.hw } 1403 }, 1404 &rp1_pll_divider_ops, 1405 0 1406 ), 1407 CLK_DATA(rp1_pll_data, 1408 .ctrl_reg = PLL_SYS_SEC, 1409 .fc0_src = FC_NUM(2, 2), 1410 ) 1411 ); 1412 1413 static struct rp1_clk_desc pll_video_sec_desc = REGISTER_PLL_DIV( 1414 .hw.init = CLK_HW_INIT_PARENTS_DATA( 1415 "pll_video_sec", 1416 (const struct clk_parent_data[]) { 1417 { .hw = &pll_video_core_desc.hw } 1418 }, 1419 &rp1_pll_divider_ops, 1420 0 1421 ), 1422 CLK_DATA(rp1_pll_data, 1423 .ctrl_reg = PLL_VIDEO_SEC, 1424 .fc0_src = FC_NUM(5, 3), 1425 ) 1426 ); 1427 1428 static const struct clk_parent_data clk_eth_tsu_parents[] = { 1429 { .index = 0 }, 1430 { .hw = &pll_video_sec_desc.hw }, 1431 { .index = -1 }, 1432 { .index = -1 }, 1433 { .index = -1 }, 1434 { .index = -1 }, 1435 { .index = -1 }, 1436 { .index = -1 }, 1437 }; 1438 1439 static struct rp1_clk_desc clk_eth_tsu_desc = REGISTER_CLK( 1440 .hw.init = CLK_HW_INIT_PARENTS_DATA( 1441 "clk_eth_tsu", 1442 clk_eth_tsu_parents, 1443 &rp1_clk_ops, 1444 0 1445 ), 1446 CLK_DATA(rp1_clock_data, 1447 .num_std_parents = 0, 1448 .num_aux_parents = 8, 1449 .ctrl_reg = CLK_ETH_TSU_CTRL, 1450 .div_int_reg = CLK_ETH_TSU_DIV_INT, 1451 .sel_reg = CLK_ETH_TSU_SEL, 1452 .div_int_max = DIV_INT_8BIT_MAX, 1453 .max_freq = 50 * HZ_PER_MHZ, 1454 .fc0_src = FC_NUM(5, 7), 1455 ) 1456 ); 1457 1458 static const struct clk_parent_data clk_eth_parents[] = { 1459 { .hw = &pll_sys_sec_desc.div.hw }, 1460 { .hw = &pll_sys_desc.hw }, 1461 { .hw = &pll_video_sec_desc.hw }, 1462 }; 1463 1464 static struct rp1_clk_desc clk_eth_desc = REGISTER_CLK( 1465 .hw.init = CLK_HW_INIT_PARENTS_DATA( 1466 "clk_eth", 1467 clk_eth_parents, 1468 &rp1_clk_ops, 1469 0 1470 ), 1471 CLK_DATA(rp1_clock_data, 1472 .num_std_parents = 0, 1473 .num_aux_parents = 3, 1474 .ctrl_reg = CLK_ETH_CTRL, 1475 .div_int_reg = CLK_ETH_DIV_INT, 1476 .sel_reg = CLK_ETH_SEL, 1477 .div_int_max = DIV_INT_8BIT_MAX, 1478 .max_freq = 125 * HZ_PER_MHZ, 1479 .fc0_src = FC_NUM(4, 6), 1480 ) 1481 ); 1482 1483 static const struct clk_parent_data clk_sys_parents[] = { 1484 { .index = 0 }, 1485 { .index = -1 }, 1486 { .hw = &pll_sys_desc.hw }, 1487 }; 1488 1489 static struct rp1_clk_desc clk_sys_desc = REGISTER_CLK( 1490 .hw.init = CLK_HW_INIT_PARENTS_DATA( 1491 "clk_sys", 1492 clk_sys_parents, 1493 &rp1_clk_ops, 1494 CLK_IS_CRITICAL 1495 ), 1496 CLK_DATA(rp1_clock_data, 1497 .num_std_parents = 3, 1498 .num_aux_parents = 0, 1499 .ctrl_reg = CLK_SYS_CTRL, 1500 .div_int_reg = CLK_SYS_DIV_INT, 1501 .sel_reg = CLK_SYS_SEL, 1502 .div_int_max = DIV_INT_24BIT_MAX, 1503 .max_freq = 200 * HZ_PER_MHZ, 1504 .fc0_src = FC_NUM(0, 4), 1505 .clk_src_mask = 0x3, 1506 ) 1507 ); 1508 1509 static struct rp1_clk_desc pll_sys_pri_ph_desc = REGISTER_PLL( 1510 .hw.init = CLK_HW_INIT_PARENTS_DATA( 1511 "pll_sys_pri_ph", 1512 (const struct clk_parent_data[]) { 1513 { .hw = &pll_sys_desc.hw } 1514 }, 1515 &rp1_pll_ph_ops, 1516 0 1517 ), 1518 CLK_DATA(rp1_pll_ph_data, 1519 .ph_reg = PLL_SYS_PRIM, 1520 .fixed_divider = 2, 1521 .phase = RP1_PLL_PHASE_0, 1522 .fc0_src = FC_NUM(1, 2), 1523 ) 1524 ); 1525 1526 static struct rp1_clk_desc pll_audio_pri_ph_desc = REGISTER_PLL( 1527 .hw.init = CLK_HW_INIT_PARENTS_DATA( 1528 "pll_audio_pri_ph", 1529 (const struct clk_parent_data[]) { 1530 { .hw = &pll_audio_desc.hw } 1531 }, 1532 &rp1_pll_ph_ops, 1533 0 1534 ), 1535 CLK_DATA(rp1_pll_ph_data, 1536 .ph_reg = PLL_AUDIO_PRIM, 1537 .fixed_divider = 2, 1538 .phase = RP1_PLL_PHASE_0, 1539 .fc0_src = FC_NUM(5, 1), 1540 ) 1541 ); 1542 1543 static struct rp1_clk_desc pll_video_pri_ph_desc = REGISTER_PLL( 1544 .hw.init = CLK_HW_INIT_PARENTS_DATA( 1545 "pll_video_pri_ph", 1546 (const struct clk_parent_data[]) { 1547 { .hw = &pll_video_desc.hw } 1548 }, 1549 &rp1_pll_ph_ops, 1550 0 1551 ), 1552 CLK_DATA(rp1_pll_ph_data, 1553 .ph_reg = PLL_VIDEO_PRIM, 1554 .fixed_divider = 2, 1555 .phase = RP1_PLL_PHASE_0, 1556 .fc0_src = FC_NUM(4, 3), 1557 ) 1558 ); 1559 1560 static struct rp1_clk_desc pll_audio_sec_desc = REGISTER_PLL_DIV( 1561 .hw.init = CLK_HW_INIT_PARENTS_DATA( 1562 "pll_audio_sec", 1563 (const struct clk_parent_data[]) { 1564 { .hw = &pll_audio_core_desc.hw } 1565 }, 1566 &rp1_pll_divider_ops, 1567 0 1568 ), 1569 CLK_DATA(rp1_pll_data, 1570 .ctrl_reg = PLL_AUDIO_SEC, 1571 .fc0_src = FC_NUM(6, 2), 1572 ) 1573 ); 1574 1575 static struct rp1_clk_desc pll_audio_tern_desc = REGISTER_PLL_DIV( 1576 .hw.init = CLK_HW_INIT_PARENTS_DATA( 1577 "pll_audio_tern", 1578 (const struct clk_parent_data[]) { 1579 { .hw = &pll_audio_core_desc.hw } 1580 }, 1581 &rp1_pll_divider_ops, 1582 0 1583 ), 1584 CLK_DATA(rp1_pll_data, 1585 .ctrl_reg = PLL_AUDIO_TERN, 1586 .fc0_src = FC_NUM(6, 2), 1587 ) 1588 ); 1589 1590 static struct rp1_clk_desc clk_slow_sys_desc = REGISTER_CLK( 1591 .hw.init = CLK_HW_INIT_PARENTS_DATA( 1592 "clk_slow_sys", 1593 (const struct clk_parent_data[]) { { .index = 0 } }, 1594 &rp1_clk_ops, 1595 CLK_IS_CRITICAL 1596 ), 1597 CLK_DATA(rp1_clock_data, 1598 .num_std_parents = 1, 1599 .num_aux_parents = 0, 1600 .ctrl_reg = CLK_SLOW_SYS_CTRL, 1601 .div_int_reg = CLK_SLOW_SYS_DIV_INT, 1602 .sel_reg = CLK_SLOW_SYS_SEL, 1603 .div_int_max = DIV_INT_8BIT_MAX, 1604 .max_freq = 50 * HZ_PER_MHZ, 1605 .fc0_src = FC_NUM(1, 4), 1606 .clk_src_mask = 0x1, 1607 ) 1608 ); 1609 1610 static const struct clk_parent_data clk_dma_parents[] = { 1611 { .hw = &pll_sys_pri_ph_desc.hw }, 1612 { .hw = &pll_video_desc.hw }, 1613 { .index = 0 }, 1614 }; 1615 1616 static struct rp1_clk_desc clk_dma_desc = REGISTER_CLK( 1617 .hw.init = CLK_HW_INIT_PARENTS_DATA( 1618 "clk_dma", 1619 clk_dma_parents, 1620 &rp1_clk_ops, 1621 0 1622 ), 1623 CLK_DATA(rp1_clock_data, 1624 .num_std_parents = 0, 1625 .num_aux_parents = 3, 1626 .ctrl_reg = CLK_DMA_CTRL, 1627 .div_int_reg = CLK_DMA_DIV_INT, 1628 .sel_reg = CLK_DMA_SEL, 1629 .div_int_max = DIV_INT_8BIT_MAX, 1630 .max_freq = 100 * HZ_PER_MHZ, 1631 .fc0_src = FC_NUM(2, 2), 1632 ) 1633 ); 1634 1635 static const struct clk_parent_data clk_uart_parents[] = { 1636 { .hw = &pll_sys_pri_ph_desc.hw }, 1637 { .hw = &pll_video_desc.hw }, 1638 { .index = 0 }, 1639 }; 1640 1641 static struct rp1_clk_desc clk_uart_desc = REGISTER_CLK( 1642 .hw.init = CLK_HW_INIT_PARENTS_DATA( 1643 "clk_uart", 1644 clk_uart_parents, 1645 &rp1_clk_ops, 1646 0 1647 ), 1648 CLK_DATA(rp1_clock_data, 1649 .num_std_parents = 0, 1650 .num_aux_parents = 3, 1651 .ctrl_reg = CLK_UART_CTRL, 1652 .div_int_reg = CLK_UART_DIV_INT, 1653 .sel_reg = CLK_UART_SEL, 1654 .div_int_max = DIV_INT_8BIT_MAX, 1655 .max_freq = 100 * HZ_PER_MHZ, 1656 .fc0_src = FC_NUM(6, 7), 1657 ) 1658 ); 1659 1660 static const struct clk_parent_data clk_pwm0_parents[] = { 1661 { .index = -1 }, 1662 { .hw = &pll_video_sec_desc.hw }, 1663 { .index = 0 }, 1664 }; 1665 1666 static struct rp1_clk_desc clk_pwm0_desc = REGISTER_CLK( 1667 .hw.init = CLK_HW_INIT_PARENTS_DATA( 1668 "clk_pwm0", 1669 clk_pwm0_parents, 1670 &rp1_clk_ops, 1671 0 1672 ), 1673 CLK_DATA(rp1_clock_data, 1674 .num_std_parents = 0, 1675 .num_aux_parents = 3, 1676 .ctrl_reg = CLK_PWM0_CTRL, 1677 .div_int_reg = CLK_PWM0_DIV_INT, 1678 .div_frac_reg = CLK_PWM0_DIV_FRAC, 1679 .sel_reg = CLK_PWM0_SEL, 1680 .div_int_max = DIV_INT_16BIT_MAX, 1681 .max_freq = 76800 * HZ_PER_KHZ, 1682 .fc0_src = FC_NUM(0, 5), 1683 ) 1684 ); 1685 1686 static const struct clk_parent_data clk_pwm1_parents[] = { 1687 { .index = -1 }, 1688 { .hw = &pll_video_sec_desc.hw }, 1689 { .index = 0 }, 1690 }; 1691 1692 static struct rp1_clk_desc clk_pwm1_desc = REGISTER_CLK( 1693 .hw.init = CLK_HW_INIT_PARENTS_DATA( 1694 "clk_pwm1", 1695 clk_pwm1_parents, 1696 &rp1_clk_ops, 1697 0 1698 ), 1699 CLK_DATA(rp1_clock_data, 1700 .num_std_parents = 0, 1701 .num_aux_parents = 3, 1702 .ctrl_reg = CLK_PWM1_CTRL, 1703 .div_int_reg = CLK_PWM1_DIV_INT, 1704 .div_frac_reg = CLK_PWM1_DIV_FRAC, 1705 .sel_reg = CLK_PWM1_SEL, 1706 .div_int_max = DIV_INT_16BIT_MAX, 1707 .max_freq = 76800 * HZ_PER_KHZ, 1708 .fc0_src = FC_NUM(1, 5), 1709 ) 1710 ); 1711 1712 static const struct clk_parent_data clk_audio_in_parents[] = { 1713 { .index = -1 }, 1714 { .index = -1 }, 1715 { .index = -1 }, 1716 { .hw = &pll_video_sec_desc.hw }, 1717 { .index = 0 }, 1718 }; 1719 1720 static struct rp1_clk_desc clk_audio_in_desc = REGISTER_CLK( 1721 .hw.init = CLK_HW_INIT_PARENTS_DATA( 1722 "clk_audio_in", 1723 clk_audio_in_parents, 1724 &rp1_clk_ops, 1725 0 1726 ), 1727 CLK_DATA(rp1_clock_data, 1728 .num_std_parents = 0, 1729 .num_aux_parents = 5, 1730 .ctrl_reg = CLK_AUDIO_IN_CTRL, 1731 .div_int_reg = CLK_AUDIO_IN_DIV_INT, 1732 .sel_reg = CLK_AUDIO_IN_SEL, 1733 .div_int_max = DIV_INT_8BIT_MAX, 1734 .max_freq = 76800 * HZ_PER_KHZ, 1735 .fc0_src = FC_NUM(2, 5), 1736 ) 1737 ); 1738 1739 static const struct clk_parent_data clk_audio_out_parents[] = { 1740 { .index = -1 }, 1741 { .index = -1 }, 1742 { .hw = &pll_video_sec_desc.hw }, 1743 { .index = 0 }, 1744 }; 1745 1746 static struct rp1_clk_desc clk_audio_out_desc = REGISTER_CLK( 1747 .hw.init = CLK_HW_INIT_PARENTS_DATA( 1748 "clk_audio_out", 1749 clk_audio_out_parents, 1750 &rp1_clk_ops, 1751 0 1752 ), 1753 CLK_DATA(rp1_clock_data, 1754 .num_std_parents = 0, 1755 .num_aux_parents = 4, 1756 .ctrl_reg = CLK_AUDIO_OUT_CTRL, 1757 .div_int_reg = CLK_AUDIO_OUT_DIV_INT, 1758 .sel_reg = CLK_AUDIO_OUT_SEL, 1759 .div_int_max = DIV_INT_8BIT_MAX, 1760 .max_freq = 153600 * HZ_PER_KHZ, 1761 .fc0_src = FC_NUM(3, 5), 1762 ) 1763 ); 1764 1765 static const struct clk_parent_data clk_i2s_parents[] = { 1766 { .index = 0 }, 1767 { .hw = &pll_audio_desc.hw }, 1768 { .hw = &pll_audio_sec_desc.hw }, 1769 }; 1770 1771 static struct rp1_clk_desc clk_i2s_desc = REGISTER_CLK( 1772 .hw.init = CLK_HW_INIT_PARENTS_DATA( 1773 "clk_i2s", 1774 clk_i2s_parents, 1775 &rp1_clk_ops, 1776 CLK_SET_RATE_PARENT 1777 ), 1778 CLK_DATA(rp1_clock_data, 1779 .num_std_parents = 0, 1780 .num_aux_parents = 3, 1781 .ctrl_reg = CLK_I2S_CTRL, 1782 .div_int_reg = CLK_I2S_DIV_INT, 1783 .sel_reg = CLK_I2S_SEL, 1784 .div_int_max = DIV_INT_8BIT_MAX, 1785 .max_freq = 50 * HZ_PER_MHZ, 1786 .fc0_src = FC_NUM(4, 4), 1787 ) 1788 ); 1789 1790 static struct rp1_clk_desc clk_mipi0_cfg_desc = REGISTER_CLK( 1791 .hw.init = CLK_HW_INIT_PARENTS_DATA( 1792 "clk_mipi0_cfg", 1793 (const struct clk_parent_data[]) { { .index = 0 } }, 1794 &rp1_clk_ops, 1795 0 1796 ), 1797 CLK_DATA(rp1_clock_data, 1798 .num_std_parents = 0, 1799 .num_aux_parents = 1, 1800 .ctrl_reg = CLK_MIPI0_CFG_CTRL, 1801 .div_int_reg = CLK_MIPI0_CFG_DIV_INT, 1802 .sel_reg = CLK_MIPI0_CFG_SEL, 1803 .div_int_max = DIV_INT_8BIT_MAX, 1804 .max_freq = 50 * HZ_PER_MHZ, 1805 .fc0_src = FC_NUM(4, 5), 1806 ) 1807 ); 1808 1809 static struct rp1_clk_desc clk_mipi1_cfg_desc = REGISTER_CLK( 1810 .hw.init = CLK_HW_INIT_PARENTS_DATA( 1811 "clk_mipi1_cfg", 1812 (const struct clk_parent_data[]) { { .index = 0 } }, 1813 &rp1_clk_ops, 1814 0 1815 ), 1816 CLK_DATA(rp1_clock_data, 1817 .num_std_parents = 0, 1818 .num_aux_parents = 1, 1819 .ctrl_reg = CLK_MIPI1_CFG_CTRL, 1820 .div_int_reg = CLK_MIPI1_CFG_DIV_INT, 1821 .sel_reg = CLK_MIPI1_CFG_SEL, 1822 .div_int_max = DIV_INT_8BIT_MAX, 1823 .max_freq = 50 * HZ_PER_MHZ, 1824 .fc0_src = FC_NUM(5, 6), 1825 .clk_src_mask = 0x1, 1826 ) 1827 ); 1828 1829 static struct rp1_clk_desc clk_adc_desc = REGISTER_CLK( 1830 .hw.init = CLK_HW_INIT_PARENTS_DATA( 1831 "clk_adc", 1832 (const struct clk_parent_data[]) { { .index = 0 } }, 1833 &rp1_clk_ops, 1834 0 1835 ), 1836 CLK_DATA(rp1_clock_data, 1837 .num_std_parents = 0, 1838 .num_aux_parents = 1, 1839 .ctrl_reg = CLK_ADC_CTRL, 1840 .div_int_reg = CLK_ADC_DIV_INT, 1841 .sel_reg = CLK_ADC_SEL, 1842 .div_int_max = DIV_INT_8BIT_MAX, 1843 .max_freq = 50 * HZ_PER_MHZ, 1844 .fc0_src = FC_NUM(5, 5), 1845 ) 1846 ); 1847 1848 static struct rp1_clk_desc clk_sdio_timer_desc = REGISTER_CLK( 1849 .hw.init = CLK_HW_INIT_PARENTS_DATA( 1850 "clk_sdio_timer", 1851 (const struct clk_parent_data[]) { { .index = 0 } }, 1852 &rp1_clk_ops, 1853 0 1854 ), 1855 CLK_DATA(rp1_clock_data, 1856 .num_std_parents = 0, 1857 .num_aux_parents = 1, 1858 .ctrl_reg = CLK_SDIO_TIMER_CTRL, 1859 .div_int_reg = CLK_SDIO_TIMER_DIV_INT, 1860 .sel_reg = CLK_SDIO_TIMER_SEL, 1861 .div_int_max = DIV_INT_8BIT_MAX, 1862 .max_freq = 50 * HZ_PER_MHZ, 1863 .fc0_src = FC_NUM(3, 4), 1864 ) 1865 ); 1866 1867 static struct rp1_clk_desc clk_sdio_alt_src_desc = REGISTER_CLK( 1868 .hw.init = CLK_HW_INIT_PARENTS_DATA( 1869 "clk_sdio_alt_src", 1870 (const struct clk_parent_data[]) { 1871 { .hw = &pll_sys_desc.hw } 1872 }, 1873 &rp1_clk_ops, 1874 0 1875 ), 1876 CLK_DATA(rp1_clock_data, 1877 .num_std_parents = 0, 1878 .num_aux_parents = 1, 1879 .ctrl_reg = CLK_SDIO_ALT_SRC_CTRL, 1880 .div_int_reg = CLK_SDIO_ALT_SRC_DIV_INT, 1881 .sel_reg = CLK_SDIO_ALT_SRC_SEL, 1882 .div_int_max = DIV_INT_8BIT_MAX, 1883 .max_freq = 200 * HZ_PER_MHZ, 1884 .fc0_src = FC_NUM(5, 4), 1885 ) 1886 ); 1887 1888 static const struct clk_parent_data clk_dpi_parents[] = { 1889 { .hw = &pll_sys_desc.hw }, 1890 { .hw = &pll_video_sec_desc.hw }, 1891 { .hw = &pll_video_desc.hw }, 1892 { .index = -1 }, 1893 { .index = -1 }, 1894 { .index = -1 }, 1895 { .index = -1 }, 1896 { .index = -1 }, 1897 }; 1898 1899 static struct rp1_clk_desc clk_dpi_desc = REGISTER_CLK( 1900 .hw.init = CLK_HW_INIT_PARENTS_DATA( 1901 "clk_dpi", 1902 clk_dpi_parents, 1903 &rp1_clk_ops, 1904 CLK_SET_RATE_NO_REPARENT /* Let DPI driver set parent */ 1905 ), 1906 CLK_DATA(rp1_clock_data, 1907 .num_std_parents = 0, 1908 .num_aux_parents = 8, 1909 .ctrl_reg = VIDEO_CLK_DPI_CTRL, 1910 .div_int_reg = VIDEO_CLK_DPI_DIV_INT, 1911 .sel_reg = VIDEO_CLK_DPI_SEL, 1912 .div_int_max = DIV_INT_8BIT_MAX, 1913 .max_freq = 200 * HZ_PER_MHZ, 1914 .fc0_src = FC_NUM(1, 6), 1915 ) 1916 ); 1917 1918 static const struct clk_parent_data clk_gp0_parents[] = { 1919 { .index = 0 }, 1920 { .index = -1 }, 1921 { .index = -1 }, 1922 { .index = -1 }, 1923 { .index = -1 }, 1924 { .index = -1 }, 1925 { .hw = &pll_sys_desc.hw }, 1926 { .index = -1 }, 1927 { .index = -1 }, 1928 { .index = -1 }, 1929 { .hw = &clk_i2s_desc.hw }, 1930 { .hw = &clk_adc_desc.hw }, 1931 { .index = -1 }, 1932 { .index = -1 }, 1933 { .index = -1 }, 1934 { .hw = &clk_sys_desc.hw }, 1935 }; 1936 1937 static struct rp1_clk_desc clk_gp0_desc = REGISTER_CLK( 1938 .hw.init = CLK_HW_INIT_PARENTS_DATA( 1939 "clk_gp0", 1940 clk_gp0_parents, 1941 &rp1_clk_ops, 1942 0 1943 ), 1944 CLK_DATA(rp1_clock_data, 1945 .num_std_parents = 0, 1946 .num_aux_parents = 16, 1947 .oe_mask = BIT(0), 1948 .ctrl_reg = CLK_GP0_CTRL, 1949 .div_int_reg = CLK_GP0_DIV_INT, 1950 .div_frac_reg = CLK_GP0_DIV_FRAC, 1951 .sel_reg = CLK_GP0_SEL, 1952 .div_int_max = DIV_INT_16BIT_MAX, 1953 .max_freq = 100 * HZ_PER_MHZ, 1954 .fc0_src = FC_NUM(0, 1), 1955 ) 1956 ); 1957 1958 static const struct clk_parent_data clk_gp1_parents[] = { 1959 { .hw = &clk_sdio_timer_desc.hw }, 1960 { .index = -1 }, 1961 { .index = -1 }, 1962 { .index = -1 }, 1963 { .index = -1 }, 1964 { .index = -1 }, 1965 { .hw = &pll_sys_pri_ph_desc.hw }, 1966 { .index = -1 }, 1967 { .index = -1 }, 1968 { .index = -1 }, 1969 { .hw = &clk_adc_desc.hw }, 1970 { .hw = &clk_dpi_desc.hw }, 1971 { .hw = &clk_pwm0_desc.hw }, 1972 { .index = -1 }, 1973 { .index = -1 }, 1974 { .index = -1 }, 1975 }; 1976 1977 static struct rp1_clk_desc clk_gp1_desc = REGISTER_CLK( 1978 .hw.init = CLK_HW_INIT_PARENTS_DATA( 1979 "clk_gp1", 1980 clk_gp1_parents, 1981 &rp1_clk_ops, 1982 0 1983 ), 1984 CLK_DATA(rp1_clock_data, 1985 .num_std_parents = 0, 1986 .num_aux_parents = 16, 1987 .oe_mask = BIT(1), 1988 .ctrl_reg = CLK_GP1_CTRL, 1989 .div_int_reg = CLK_GP1_DIV_INT, 1990 .div_frac_reg = CLK_GP1_DIV_FRAC, 1991 .sel_reg = CLK_GP1_SEL, 1992 .div_int_max = DIV_INT_16BIT_MAX, 1993 .max_freq = 100 * HZ_PER_MHZ, 1994 .fc0_src = FC_NUM(1, 1), 1995 ) 1996 ); 1997 1998 static struct rp1_clk_desc clksrc_mipi0_dsi_byteclk_desc = REGISTER_CLK( 1999 .hw.init = CLK_HW_INIT_PARENTS_DATA( 2000 "clksrc_mipi0_dsi_byteclk", 2001 (const struct clk_parent_data[]) { { .index = 0 } }, 2002 &rp1_varsrc_ops, 2003 0 2004 ), 2005 CLK_DATA(rp1_clock_data, 2006 .num_std_parents = 1, 2007 .num_aux_parents = 0, 2008 ) 2009 ); 2010 2011 static struct rp1_clk_desc clksrc_mipi1_dsi_byteclk_desc = REGISTER_CLK( 2012 .hw.init = CLK_HW_INIT_PARENTS_DATA( 2013 "clksrc_mipi1_dsi_byteclk", 2014 (const struct clk_parent_data[]) { { .index = 0 } }, 2015 &rp1_varsrc_ops, 2016 0 2017 ), 2018 CLK_DATA(rp1_clock_data, 2019 .num_std_parents = 1, 2020 .num_aux_parents = 0, 2021 ) 2022 ); 2023 2024 static const struct clk_parent_data clk_mipi0_dpi_parents[] = { 2025 { .hw = &pll_sys_desc.hw }, 2026 { .hw = &pll_video_sec_desc.hw }, 2027 { .hw = &pll_video_desc.hw }, 2028 { .hw = &clksrc_mipi0_dsi_byteclk_desc.hw }, 2029 { .index = -1 }, 2030 { .index = -1 }, 2031 { .index = -1 }, 2032 { .index = -1 }, 2033 }; 2034 2035 static struct rp1_clk_desc clk_mipi0_dpi_desc = REGISTER_CLK( 2036 .hw.init = CLK_HW_INIT_PARENTS_DATA( 2037 "clk_mipi0_dpi", 2038 clk_mipi0_dpi_parents, 2039 &rp1_clk_ops, 2040 CLK_SET_RATE_NO_REPARENT /* Let DSI driver set parent */ 2041 ), 2042 CLK_DATA(rp1_clock_data, 2043 .num_std_parents = 0, 2044 .num_aux_parents = 8, 2045 .ctrl_reg = VIDEO_CLK_MIPI0_DPI_CTRL, 2046 .div_int_reg = VIDEO_CLK_MIPI0_DPI_DIV_INT, 2047 .div_frac_reg = VIDEO_CLK_MIPI0_DPI_DIV_FRAC, 2048 .sel_reg = VIDEO_CLK_MIPI0_DPI_SEL, 2049 .div_int_max = DIV_INT_8BIT_MAX, 2050 .max_freq = 200 * HZ_PER_MHZ, 2051 .fc0_src = FC_NUM(2, 6), 2052 ) 2053 ); 2054 2055 static const struct clk_parent_data clk_mipi1_dpi_parents[] = { 2056 { .hw = &pll_sys_desc.hw }, 2057 { .hw = &pll_video_sec_desc.hw }, 2058 { .hw = &pll_video_desc.hw }, 2059 { .hw = &clksrc_mipi1_dsi_byteclk_desc.hw }, 2060 { .index = -1 }, 2061 { .index = -1 }, 2062 { .index = -1 }, 2063 { .index = -1 }, 2064 }; 2065 2066 static struct rp1_clk_desc clk_mipi1_dpi_desc = REGISTER_CLK( 2067 .hw.init = CLK_HW_INIT_PARENTS_DATA( 2068 "clk_mipi1_dpi", 2069 clk_mipi1_dpi_parents, 2070 &rp1_clk_ops, 2071 CLK_SET_RATE_NO_REPARENT /* Let DSI driver set parent */ 2072 ), 2073 CLK_DATA(rp1_clock_data, 2074 .num_std_parents = 0, 2075 .num_aux_parents = 8, 2076 .ctrl_reg = VIDEO_CLK_MIPI1_DPI_CTRL, 2077 .div_int_reg = VIDEO_CLK_MIPI1_DPI_DIV_INT, 2078 .div_frac_reg = VIDEO_CLK_MIPI1_DPI_DIV_FRAC, 2079 .sel_reg = VIDEO_CLK_MIPI1_DPI_SEL, 2080 .div_int_max = DIV_INT_8BIT_MAX, 2081 .max_freq = 200 * HZ_PER_MHZ, 2082 .fc0_src = FC_NUM(3, 6), 2083 ) 2084 ); 2085 2086 static const struct clk_parent_data clk_gp2_parents[] = { 2087 { .hw = &clk_sdio_alt_src_desc.hw }, 2088 { .index = -1 }, 2089 { .index = -1 }, 2090 { .index = -1 }, 2091 { .index = -1 }, 2092 { .index = -1 }, 2093 { .hw = &pll_sys_sec_desc.hw }, 2094 { .index = -1 }, 2095 { .hw = &pll_video_desc.hw }, 2096 { .hw = &clk_audio_in_desc.hw }, 2097 { .hw = &clk_dpi_desc.hw }, 2098 { .hw = &clk_pwm0_desc.hw }, 2099 { .hw = &clk_pwm1_desc.hw }, 2100 { .hw = &clk_mipi0_dpi_desc.hw }, 2101 { .hw = &clk_mipi1_cfg_desc.hw }, 2102 { .hw = &clk_sys_desc.hw }, 2103 }; 2104 2105 static struct rp1_clk_desc clk_gp2_desc = REGISTER_CLK( 2106 .hw.init = CLK_HW_INIT_PARENTS_DATA( 2107 "clk_gp2", 2108 clk_gp2_parents, 2109 &rp1_clk_ops, 2110 0 2111 ), 2112 CLK_DATA(rp1_clock_data, 2113 .num_std_parents = 0, 2114 .num_aux_parents = 16, 2115 .oe_mask = BIT(2), 2116 .ctrl_reg = CLK_GP2_CTRL, 2117 .div_int_reg = CLK_GP2_DIV_INT, 2118 .div_frac_reg = CLK_GP2_DIV_FRAC, 2119 .sel_reg = CLK_GP2_SEL, 2120 .div_int_max = DIV_INT_16BIT_MAX, 2121 .max_freq = 100 * HZ_PER_MHZ, 2122 .fc0_src = FC_NUM(2, 1), 2123 ) 2124 ); 2125 2126 static const struct clk_parent_data clk_gp3_parents[] = { 2127 { .index = 0 }, 2128 { .index = -1 }, 2129 { .index = -1 }, 2130 { .index = -1 }, 2131 { .index = -1 }, 2132 { .index = -1 }, 2133 { .index = -1 }, 2134 { .index = -1 }, 2135 { .hw = &pll_video_pri_ph_desc.hw }, 2136 { .hw = &clk_audio_out_desc.hw }, 2137 { .index = -1 }, 2138 { .index = -1 }, 2139 { .hw = &clk_mipi1_dpi_desc.hw }, 2140 { .index = -1 }, 2141 { .index = -1 }, 2142 { .index = -1 }, 2143 }; 2144 2145 static struct rp1_clk_desc clk_gp3_desc = REGISTER_CLK( 2146 .hw.init = CLK_HW_INIT_PARENTS_DATA( 2147 "clk_gp3", 2148 clk_gp3_parents, 2149 &rp1_clk_ops, 2150 0 2151 ), 2152 CLK_DATA(rp1_clock_data, 2153 .num_std_parents = 0, 2154 .num_aux_parents = 16, 2155 .oe_mask = BIT(3), 2156 .ctrl_reg = CLK_GP3_CTRL, 2157 .div_int_reg = CLK_GP3_DIV_INT, 2158 .div_frac_reg = CLK_GP3_DIV_FRAC, 2159 .sel_reg = CLK_GP3_SEL, 2160 .div_int_max = DIV_INT_16BIT_MAX, 2161 .max_freq = 100 * HZ_PER_MHZ, 2162 .fc0_src = FC_NUM(3, 1), 2163 ) 2164 ); 2165 2166 static const struct clk_parent_data clk_gp4_parents[] = { 2167 { .index = 0 }, 2168 { .index = -1 }, 2169 { .index = -1 }, 2170 { .index = -1 }, 2171 { .index = -1 }, 2172 { .index = -1 }, 2173 { .index = -1 }, 2174 { .hw = &pll_video_sec_desc.hw }, 2175 { .index = -1 }, 2176 { .index = -1 }, 2177 { .index = -1 }, 2178 { .hw = &clk_mipi0_cfg_desc.hw }, 2179 { .hw = &clk_uart_desc.hw }, 2180 { .index = -1 }, 2181 { .index = -1 }, 2182 { .hw = &clk_sys_desc.hw }, 2183 }; 2184 2185 static struct rp1_clk_desc clk_gp4_desc = REGISTER_CLK( 2186 .hw.init = CLK_HW_INIT_PARENTS_DATA( 2187 "clk_gp4", 2188 clk_gp4_parents, 2189 &rp1_clk_ops, 2190 0 2191 ), 2192 CLK_DATA(rp1_clock_data, 2193 .num_std_parents = 0, 2194 .num_aux_parents = 16, 2195 .oe_mask = BIT(4), 2196 .ctrl_reg = CLK_GP4_CTRL, 2197 .div_int_reg = CLK_GP4_DIV_INT, 2198 .div_frac_reg = CLK_GP4_DIV_FRAC, 2199 .sel_reg = CLK_GP4_SEL, 2200 .div_int_max = DIV_INT_16BIT_MAX, 2201 .max_freq = 100 * HZ_PER_MHZ, 2202 .fc0_src = FC_NUM(4, 1), 2203 ) 2204 ); 2205 2206 static const struct clk_parent_data clk_vec_parents[] = { 2207 { .hw = &pll_sys_pri_ph_desc.hw }, 2208 { .hw = &pll_video_sec_desc.hw }, 2209 { .hw = &pll_video_desc.hw }, 2210 { .index = -1 }, 2211 { .index = -1 }, 2212 { .index = -1 }, 2213 { .index = -1 }, 2214 { .index = -1 }, 2215 }; 2216 2217 static struct rp1_clk_desc clk_vec_desc = REGISTER_CLK( 2218 .hw.init = CLK_HW_INIT_PARENTS_DATA( 2219 "clk_vec", 2220 clk_vec_parents, 2221 &rp1_clk_ops, 2222 CLK_SET_RATE_NO_REPARENT /* Let VEC driver set parent */ 2223 ), 2224 CLK_DATA(rp1_clock_data, 2225 .num_std_parents = 0, 2226 .num_aux_parents = 8, 2227 .ctrl_reg = VIDEO_CLK_VEC_CTRL, 2228 .div_int_reg = VIDEO_CLK_VEC_DIV_INT, 2229 .sel_reg = VIDEO_CLK_VEC_SEL, 2230 .div_int_max = DIV_INT_8BIT_MAX, 2231 .max_freq = 108 * HZ_PER_MHZ, 2232 .fc0_src = FC_NUM(0, 6), 2233 ) 2234 ); 2235 2236 static const struct clk_parent_data clk_gp5_parents[] = { 2237 { .index = 0 }, 2238 { .index = -1 }, 2239 { .index = -1 }, 2240 { .index = -1 }, 2241 { .index = -1 }, 2242 { .index = -1 }, 2243 { .index = -1 }, 2244 { .hw = &pll_video_sec_desc.hw }, 2245 { .hw = &clk_eth_tsu_desc.hw }, 2246 { .index = -1 }, 2247 { .hw = &clk_vec_desc.hw }, 2248 { .index = -1 }, 2249 { .index = -1 }, 2250 { .index = -1 }, 2251 { .index = -1 }, 2252 { .index = -1 }, 2253 }; 2254 2255 static struct rp1_clk_desc clk_gp5_desc = REGISTER_CLK( 2256 .hw.init = CLK_HW_INIT_PARENTS_DATA( 2257 "clk_gp5", 2258 clk_gp5_parents, 2259 &rp1_clk_ops, 2260 0 2261 ), 2262 CLK_DATA(rp1_clock_data, 2263 .num_std_parents = 0, 2264 .num_aux_parents = 16, 2265 .oe_mask = BIT(5), 2266 .ctrl_reg = CLK_GP5_CTRL, 2267 .div_int_reg = CLK_GP5_DIV_INT, 2268 .div_frac_reg = CLK_GP5_DIV_FRAC, 2269 .sel_reg = CLK_GP5_SEL, 2270 .div_int_max = DIV_INT_16BIT_MAX, 2271 .max_freq = 100 * HZ_PER_MHZ, 2272 .fc0_src = FC_NUM(5, 1), 2273 ) 2274 ); 2275 2276 static struct rp1_clk_desc *const clk_desc_array[] = { 2277 [RP1_PLL_SYS_CORE] = &pll_sys_core_desc, 2278 [RP1_PLL_AUDIO_CORE] = &pll_audio_core_desc, 2279 [RP1_PLL_VIDEO_CORE] = &pll_video_core_desc, 2280 [RP1_PLL_SYS] = &pll_sys_desc, 2281 [RP1_CLK_ETH_TSU] = &clk_eth_tsu_desc, 2282 [RP1_CLK_ETH] = &clk_eth_desc, 2283 [RP1_CLK_SYS] = &clk_sys_desc, 2284 [RP1_PLL_SYS_PRI_PH] = &pll_sys_pri_ph_desc, 2285 [RP1_PLL_SYS_SEC] = &pll_sys_sec_desc, 2286 [RP1_PLL_AUDIO] = &pll_audio_desc, 2287 [RP1_PLL_VIDEO] = &pll_video_desc, 2288 [RP1_PLL_AUDIO_PRI_PH] = &pll_audio_pri_ph_desc, 2289 [RP1_PLL_VIDEO_PRI_PH] = &pll_video_pri_ph_desc, 2290 [RP1_PLL_AUDIO_SEC] = &pll_audio_sec_desc, 2291 [RP1_PLL_VIDEO_SEC] = &pll_video_sec_desc, 2292 [RP1_PLL_AUDIO_TERN] = &pll_audio_tern_desc, 2293 [RP1_CLK_SLOW_SYS] = &clk_slow_sys_desc, 2294 [RP1_CLK_DMA] = &clk_dma_desc, 2295 [RP1_CLK_UART] = &clk_uart_desc, 2296 [RP1_CLK_PWM0] = &clk_pwm0_desc, 2297 [RP1_CLK_PWM1] = &clk_pwm1_desc, 2298 [RP1_CLK_AUDIO_IN] = &clk_audio_in_desc, 2299 [RP1_CLK_AUDIO_OUT] = &clk_audio_out_desc, 2300 [RP1_CLK_I2S] = &clk_i2s_desc, 2301 [RP1_CLK_MIPI0_CFG] = &clk_mipi0_cfg_desc, 2302 [RP1_CLK_MIPI1_CFG] = &clk_mipi1_cfg_desc, 2303 [RP1_CLK_ADC] = &clk_adc_desc, 2304 [RP1_CLK_SDIO_TIMER] = &clk_sdio_timer_desc, 2305 [RP1_CLK_SDIO_ALT_SRC] = &clk_sdio_alt_src_desc, 2306 [RP1_CLK_GP0] = &clk_gp0_desc, 2307 [RP1_CLK_GP1] = &clk_gp1_desc, 2308 [RP1_CLK_GP2] = &clk_gp2_desc, 2309 [RP1_CLK_GP3] = &clk_gp3_desc, 2310 [RP1_CLK_GP4] = &clk_gp4_desc, 2311 [RP1_CLK_GP5] = &clk_gp5_desc, 2312 [RP1_CLK_VEC] = &clk_vec_desc, 2313 [RP1_CLK_DPI] = &clk_dpi_desc, 2314 [RP1_CLK_MIPI0_DPI] = &clk_mipi0_dpi_desc, 2315 [RP1_CLK_MIPI1_DPI] = &clk_mipi1_dpi_desc, 2316 [RP1_CLK_MIPI0_DSI_BYTECLOCK] = &clksrc_mipi0_dsi_byteclk_desc, 2317 [RP1_CLK_MIPI1_DSI_BYTECLOCK] = &clksrc_mipi1_dsi_byteclk_desc, 2318 }; 2319 2320 static const struct regmap_range rp1_reg_ranges[] = { 2321 regmap_reg_range(PLL_SYS_CS, PLL_SYS_SEC), 2322 regmap_reg_range(PLL_AUDIO_CS, PLL_AUDIO_TERN), 2323 regmap_reg_range(PLL_VIDEO_CS, PLL_VIDEO_SEC), 2324 regmap_reg_range(GPCLK_OE_CTRL, GPCLK_OE_CTRL), 2325 regmap_reg_range(CLK_SYS_CTRL, CLK_SYS_DIV_INT), 2326 regmap_reg_range(CLK_SYS_SEL, CLK_SYS_SEL), 2327 regmap_reg_range(CLK_SLOW_SYS_CTRL, CLK_SLOW_SYS_DIV_INT), 2328 regmap_reg_range(CLK_SLOW_SYS_SEL, CLK_SLOW_SYS_SEL), 2329 regmap_reg_range(CLK_DMA_CTRL, CLK_DMA_DIV_INT), 2330 regmap_reg_range(CLK_DMA_SEL, CLK_DMA_SEL), 2331 regmap_reg_range(CLK_UART_CTRL, CLK_UART_DIV_INT), 2332 regmap_reg_range(CLK_UART_SEL, CLK_UART_SEL), 2333 regmap_reg_range(CLK_ETH_CTRL, CLK_ETH_DIV_INT), 2334 regmap_reg_range(CLK_ETH_SEL, CLK_ETH_SEL), 2335 regmap_reg_range(CLK_PWM0_CTRL, CLK_PWM0_SEL), 2336 regmap_reg_range(CLK_PWM1_CTRL, CLK_PWM1_SEL), 2337 regmap_reg_range(CLK_AUDIO_IN_CTRL, CLK_AUDIO_IN_DIV_INT), 2338 regmap_reg_range(CLK_AUDIO_IN_SEL, CLK_AUDIO_IN_SEL), 2339 regmap_reg_range(CLK_AUDIO_OUT_CTRL, CLK_AUDIO_OUT_DIV_INT), 2340 regmap_reg_range(CLK_AUDIO_OUT_SEL, CLK_AUDIO_OUT_SEL), 2341 regmap_reg_range(CLK_I2S_CTRL, CLK_I2S_DIV_INT), 2342 regmap_reg_range(CLK_I2S_SEL, CLK_I2S_SEL), 2343 regmap_reg_range(CLK_MIPI0_CFG_CTRL, CLK_MIPI0_CFG_DIV_INT), 2344 regmap_reg_range(CLK_MIPI0_CFG_SEL, CLK_MIPI0_CFG_SEL), 2345 regmap_reg_range(CLK_MIPI1_CFG_CTRL, CLK_MIPI1_CFG_DIV_INT), 2346 regmap_reg_range(CLK_MIPI1_CFG_SEL, CLK_MIPI1_CFG_SEL), 2347 regmap_reg_range(CLK_PCIE_AUX_CTRL, CLK_PCIE_AUX_DIV_INT), 2348 regmap_reg_range(CLK_PCIE_AUX_SEL, CLK_PCIE_AUX_SEL), 2349 regmap_reg_range(CLK_USBH0_MICROFRAME_CTRL, CLK_USBH0_MICROFRAME_DIV_INT), 2350 regmap_reg_range(CLK_USBH0_MICROFRAME_SEL, CLK_USBH0_MICROFRAME_SEL), 2351 regmap_reg_range(CLK_USBH1_MICROFRAME_CTRL, CLK_USBH1_MICROFRAME_DIV_INT), 2352 regmap_reg_range(CLK_USBH1_MICROFRAME_SEL, CLK_USBH1_MICROFRAME_SEL), 2353 regmap_reg_range(CLK_USBH0_SUSPEND_CTRL, CLK_USBH0_SUSPEND_DIV_INT), 2354 regmap_reg_range(CLK_USBH0_SUSPEND_SEL, CLK_USBH0_SUSPEND_SEL), 2355 regmap_reg_range(CLK_USBH1_SUSPEND_CTRL, CLK_USBH1_SUSPEND_DIV_INT), 2356 regmap_reg_range(CLK_USBH1_SUSPEND_SEL, CLK_USBH1_SUSPEND_SEL), 2357 regmap_reg_range(CLK_ETH_TSU_CTRL, CLK_ETH_TSU_DIV_INT), 2358 regmap_reg_range(CLK_ETH_TSU_SEL, CLK_ETH_TSU_SEL), 2359 regmap_reg_range(CLK_ADC_CTRL, CLK_ADC_DIV_INT), 2360 regmap_reg_range(CLK_ADC_SEL, CLK_ADC_SEL), 2361 regmap_reg_range(CLK_SDIO_TIMER_CTRL, CLK_SDIO_TIMER_DIV_INT), 2362 regmap_reg_range(CLK_SDIO_TIMER_SEL, CLK_SDIO_TIMER_SEL), 2363 regmap_reg_range(CLK_SDIO_ALT_SRC_CTRL, CLK_SDIO_ALT_SRC_DIV_INT), 2364 regmap_reg_range(CLK_SDIO_ALT_SRC_SEL, CLK_SDIO_ALT_SRC_SEL), 2365 regmap_reg_range(CLK_GP0_CTRL, CLK_GP0_SEL), 2366 regmap_reg_range(CLK_GP1_CTRL, CLK_GP1_SEL), 2367 regmap_reg_range(CLK_GP2_CTRL, CLK_GP2_SEL), 2368 regmap_reg_range(CLK_GP3_CTRL, CLK_GP3_SEL), 2369 regmap_reg_range(CLK_GP4_CTRL, CLK_GP4_SEL), 2370 regmap_reg_range(CLK_GP5_CTRL, CLK_GP5_SEL), 2371 regmap_reg_range(CLK_SYS_RESUS_CTRL, CLK_SYS_RESUS_CTRL), 2372 regmap_reg_range(CLK_SLOW_SYS_RESUS_CTRL, CLK_SLOW_SYS_RESUS_CTRL), 2373 regmap_reg_range(FC0_REF_KHZ, FC0_RESULT), 2374 regmap_reg_range(VIDEO_CLK_VEC_CTRL, VIDEO_CLK_VEC_DIV_INT), 2375 regmap_reg_range(VIDEO_CLK_VEC_SEL, VIDEO_CLK_DPI_DIV_INT), 2376 regmap_reg_range(VIDEO_CLK_DPI_SEL, VIDEO_CLK_MIPI1_DPI_SEL), 2377 }; 2378 2379 static const struct regmap_access_table rp1_reg_table = { 2380 .yes_ranges = rp1_reg_ranges, 2381 .n_yes_ranges = ARRAY_SIZE(rp1_reg_ranges), 2382 }; 2383 2384 static const struct regmap_config rp1_clk_regmap_cfg = { 2385 .reg_bits = 32, 2386 .val_bits = 32, 2387 .reg_stride = 4, 2388 .max_register = PLL_VIDEO_SEC, 2389 .name = "rp1-clk", 2390 .rd_table = &rp1_reg_table, 2391 .disable_locking = true, 2392 }; 2393 2394 static int rp1_clk_probe(struct platform_device *pdev) 2395 { 2396 const size_t asize = ARRAY_SIZE(clk_desc_array); 2397 struct rp1_clk_desc *desc; 2398 struct device *dev = &pdev->dev; 2399 struct rp1_clockman *clockman; 2400 struct clk_hw **hws; 2401 unsigned int i; 2402 2403 clockman = devm_kzalloc(dev, struct_size(clockman, onecell.hws, asize), 2404 GFP_KERNEL); 2405 if (!clockman) 2406 return -ENOMEM; 2407 2408 spin_lock_init(&clockman->regs_lock); 2409 clockman->dev = dev; 2410 2411 clockman->regs = devm_platform_ioremap_resource(pdev, 0); 2412 if (IS_ERR(clockman->regs)) 2413 return PTR_ERR(clockman->regs); 2414 2415 clockman->regmap = devm_regmap_init_mmio(dev, clockman->regs, 2416 &rp1_clk_regmap_cfg); 2417 if (IS_ERR(clockman->regmap)) { 2418 dev_err_probe(dev, PTR_ERR(clockman->regmap), 2419 "could not init clock regmap\n"); 2420 return PTR_ERR(clockman->regmap); 2421 } 2422 2423 clockman->onecell.num = asize; 2424 hws = clockman->onecell.hws; 2425 2426 for (i = 0; i < asize; i++) { 2427 desc = clk_desc_array[i]; 2428 if (desc && desc->clk_register && desc->data) 2429 hws[i] = desc->clk_register(clockman, desc); 2430 } 2431 2432 clk_audio_core = &pll_audio_core_desc; 2433 clk_audio = &pll_audio_desc; 2434 clk_i2s = &clk_i2s_desc; 2435 clk_xosc = clk_hw_get_parent_by_index(&clk_i2s->hw, 0); 2436 2437 platform_set_drvdata(pdev, clockman); 2438 2439 return devm_of_clk_add_hw_provider(dev, of_clk_hw_onecell_get, 2440 &clockman->onecell); 2441 } 2442 2443 static const struct of_device_id rp1_clk_of_match[] = { 2444 { .compatible = "raspberrypi,rp1-clocks" }, 2445 {} 2446 }; 2447 MODULE_DEVICE_TABLE(of, rp1_clk_of_match); 2448 2449 static struct platform_driver rp1_clk_driver = { 2450 .driver = { 2451 .name = "rp1-clk", 2452 .of_match_table = rp1_clk_of_match, 2453 }, 2454 .probe = rp1_clk_probe, 2455 }; 2456 2457 module_platform_driver(rp1_clk_driver); 2458 2459 MODULE_AUTHOR("Naushir Patuck <naush@raspberrypi.com>"); 2460 MODULE_AUTHOR("Andrea della Porta <andrea.porta@suse.com>"); 2461 MODULE_DESCRIPTION("RP1 clock driver"); 2462 MODULE_LICENSE("GPL"); 2463