File Index
Files and directories
Sign in
FILE

clk-rp1.c

File preview with syntax highlighting.

linux-6.19.14/drivers/clk/clk-rp1.c C
   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 */
 276static 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
 312struct 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
 322struct 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
 330struct rp1_pll_data {
 331	u32 ctrl_reg;
 332	u32 fc0_src;
 333};
 334
 335struct rp1_pll_ph_data {
 336	unsigned int phase;
 337	unsigned int fixed_divider;
 338	u32 ph_reg;
 339	u32 fc0_src;
 340};
 341
 342struct rp1_pll_divider_data {
 343	u32 sec_reg;
 344	u32 fc0_src;
 345};
 346
 347struct 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
 361struct 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
 371static struct rp1_clk_desc *clk_audio_core;
 372static struct rp1_clk_desc *clk_audio;
 373static struct rp1_clk_desc *clk_i2s;
 374static struct clk_hw *clk_xosc;
 375
 376static inline
 377void clockman_write(struct rp1_clockman *clockman, u32 reg, u32 val)
 378{
 379	regmap_write(clockman->regmap, reg, val);
 380}
 381
 382static 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
 391static 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
 401static 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
 435static 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
 446static 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
 477static 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
 514static 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
 535static 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
 547static 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
 573done:
 574	*divider1 = best_div1;
 575	*divider2 = best_div2;
 576}
 577
 578static 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
 601static 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
 622static 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
 638static 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
 647static 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
 664static 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
 676static 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
 685static 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
 696static 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
 705static 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
 721static 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
 733static 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
 764static 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
 770static 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
 778static 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
 787static 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
 813static 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
 831static 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
 847static 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
 878static 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
 913static 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
 951static 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
 975static 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
 981static 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
1034static 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
1094static 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
1155static 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
1169static 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
1177static int rp1_varsrc_determine_rate(struct clk_hw *hw,
1178				     struct clk_rate_request *req)
1179{
1180	return 0;
1181}
1182
1183static 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
1192static 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
1198static 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
1206static 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
1215static 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
1227static 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
1233static 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
1247static 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
1270static 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
1308static 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
1323static 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
1338static 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
1353static 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
1368static 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
1383static 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
1398static 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
1413static 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
1428static 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
1439static 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
1458static 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
1464static 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
1483static const struct clk_parent_data clk_sys_parents[] = {
1484	{ .index = 0 },
1485	{ .index = -1 },
1486	{ .hw = &pll_sys_desc.hw },
1487};
1488
1489static 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
1509static 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
1526static 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
1543static 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
1560static 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
1575static 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
1590static 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
1610static 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
1616static 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
1635static 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
1641static 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
1660static const struct clk_parent_data clk_pwm0_parents[] = {
1661	{ .index = -1 },
1662	{ .hw = &pll_video_sec_desc.hw },
1663	{ .index = 0 },
1664};
1665
1666static 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
1686static const struct clk_parent_data clk_pwm1_parents[] = {
1687	{ .index = -1 },
1688	{ .hw = &pll_video_sec_desc.hw },
1689	{ .index = 0 },
1690};
1691
1692static 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
1712static 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
1720static 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
1739static 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
1746static 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
1765static 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
1771static 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
1790static 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
1809static 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
1829static 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
1848static 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
1867static 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
1888static 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
1899static 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
1918static 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
1937static 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
1958static 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
1977static 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
1998static 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
2011static 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
2024static 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
2035static 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
2055static 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
2066static 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
2086static 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
2105static 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
2126static 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
2145static 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
2166static 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
2185static 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
2206static 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
2217static 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
2236static 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
2255static 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
2276static 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
2320static 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
2379static 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
2384static 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
2394static 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
2443static const struct of_device_id rp1_clk_of_match[] = {
2444	{ .compatible = "raspberrypi,rp1-clocks" },
2445	{}
2446};
2447MODULE_DEVICE_TABLE(of, rp1_clk_of_match);
2448
2449static 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
2457module_platform_driver(rp1_clk_driver);
2458
2459MODULE_AUTHOR("Naushir Patuck <naush@raspberrypi.com>");
2460MODULE_AUTHOR("Andrea della Porta <andrea.porta@suse.com>");
2461MODULE_DESCRIPTION("RP1 clock driver");
2462MODULE_LICENSE("GPL");
~/ Read-only file preview.