162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * SPEAr3xx machines clock framework source file
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright (C) 2012 ST Microelectronics
662306a36Sopenharmony_ci * Viresh Kumar <vireshk@kernel.org>
762306a36Sopenharmony_ci */
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#include <linux/clk.h>
1062306a36Sopenharmony_ci#include <linux/clkdev.h>
1162306a36Sopenharmony_ci#include <linux/clk/spear.h>
1262306a36Sopenharmony_ci#include <linux/err.h>
1362306a36Sopenharmony_ci#include <linux/io.h>
1462306a36Sopenharmony_ci#include <linux/of.h>
1562306a36Sopenharmony_ci#include <linux/spinlock_types.h>
1662306a36Sopenharmony_ci#include "clk.h"
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_cistatic DEFINE_SPINLOCK(_lock);
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci#define PLL1_CTR			(misc_base + 0x008)
2162306a36Sopenharmony_ci#define PLL1_FRQ			(misc_base + 0x00C)
2262306a36Sopenharmony_ci#define PLL2_CTR			(misc_base + 0x014)
2362306a36Sopenharmony_ci#define PLL2_FRQ			(misc_base + 0x018)
2462306a36Sopenharmony_ci#define PLL_CLK_CFG			(misc_base + 0x020)
2562306a36Sopenharmony_ci	/* PLL_CLK_CFG register masks */
2662306a36Sopenharmony_ci	#define MCTR_CLK_SHIFT		28
2762306a36Sopenharmony_ci	#define MCTR_CLK_MASK		3
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci#define CORE_CLK_CFG			(misc_base + 0x024)
3062306a36Sopenharmony_ci	/* CORE CLK CFG register masks */
3162306a36Sopenharmony_ci	#define GEN_SYNTH2_3_CLK_SHIFT	18
3262306a36Sopenharmony_ci	#define GEN_SYNTH2_3_CLK_MASK	1
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci	#define HCLK_RATIO_SHIFT	10
3562306a36Sopenharmony_ci	#define HCLK_RATIO_MASK		2
3662306a36Sopenharmony_ci	#define PCLK_RATIO_SHIFT	8
3762306a36Sopenharmony_ci	#define PCLK_RATIO_MASK		2
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_ci#define PERIP_CLK_CFG			(misc_base + 0x028)
4062306a36Sopenharmony_ci	/* PERIP_CLK_CFG register masks */
4162306a36Sopenharmony_ci	#define UART_CLK_SHIFT		4
4262306a36Sopenharmony_ci	#define UART_CLK_MASK		1
4362306a36Sopenharmony_ci	#define FIRDA_CLK_SHIFT		5
4462306a36Sopenharmony_ci	#define FIRDA_CLK_MASK		2
4562306a36Sopenharmony_ci	#define GPT0_CLK_SHIFT		8
4662306a36Sopenharmony_ci	#define GPT1_CLK_SHIFT		11
4762306a36Sopenharmony_ci	#define GPT2_CLK_SHIFT		12
4862306a36Sopenharmony_ci	#define GPT_CLK_MASK		1
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_ci#define PERIP1_CLK_ENB			(misc_base + 0x02C)
5162306a36Sopenharmony_ci	/* PERIP1_CLK_ENB register masks */
5262306a36Sopenharmony_ci	#define UART_CLK_ENB		3
5362306a36Sopenharmony_ci	#define SSP_CLK_ENB		5
5462306a36Sopenharmony_ci	#define I2C_CLK_ENB		7
5562306a36Sopenharmony_ci	#define JPEG_CLK_ENB		8
5662306a36Sopenharmony_ci	#define FIRDA_CLK_ENB		10
5762306a36Sopenharmony_ci	#define GPT1_CLK_ENB		11
5862306a36Sopenharmony_ci	#define GPT2_CLK_ENB		12
5962306a36Sopenharmony_ci	#define ADC_CLK_ENB		15
6062306a36Sopenharmony_ci	#define RTC_CLK_ENB		17
6162306a36Sopenharmony_ci	#define GPIO_CLK_ENB		18
6262306a36Sopenharmony_ci	#define DMA_CLK_ENB		19
6362306a36Sopenharmony_ci	#define SMI_CLK_ENB		21
6462306a36Sopenharmony_ci	#define GMAC_CLK_ENB		23
6562306a36Sopenharmony_ci	#define USBD_CLK_ENB		24
6662306a36Sopenharmony_ci	#define USBH_CLK_ENB		25
6762306a36Sopenharmony_ci	#define C3_CLK_ENB		31
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_ci#define RAS_CLK_ENB			(misc_base + 0x034)
7062306a36Sopenharmony_ci	#define RAS_AHB_CLK_ENB		0
7162306a36Sopenharmony_ci	#define RAS_PLL1_CLK_ENB	1
7262306a36Sopenharmony_ci	#define RAS_APB_CLK_ENB		2
7362306a36Sopenharmony_ci	#define RAS_32K_CLK_ENB		3
7462306a36Sopenharmony_ci	#define RAS_24M_CLK_ENB		4
7562306a36Sopenharmony_ci	#define RAS_48M_CLK_ENB		5
7662306a36Sopenharmony_ci	#define RAS_PLL2_CLK_ENB	7
7762306a36Sopenharmony_ci	#define RAS_SYNT0_CLK_ENB	8
7862306a36Sopenharmony_ci	#define RAS_SYNT1_CLK_ENB	9
7962306a36Sopenharmony_ci	#define RAS_SYNT2_CLK_ENB	10
8062306a36Sopenharmony_ci	#define RAS_SYNT3_CLK_ENB	11
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_ci#define PRSC0_CLK_CFG			(misc_base + 0x044)
8362306a36Sopenharmony_ci#define PRSC1_CLK_CFG			(misc_base + 0x048)
8462306a36Sopenharmony_ci#define PRSC2_CLK_CFG			(misc_base + 0x04C)
8562306a36Sopenharmony_ci#define AMEM_CLK_CFG			(misc_base + 0x050)
8662306a36Sopenharmony_ci	#define AMEM_CLK_ENB		0
8762306a36Sopenharmony_ci
8862306a36Sopenharmony_ci#define CLCD_CLK_SYNT			(misc_base + 0x05C)
8962306a36Sopenharmony_ci#define FIRDA_CLK_SYNT			(misc_base + 0x060)
9062306a36Sopenharmony_ci#define UART_CLK_SYNT			(misc_base + 0x064)
9162306a36Sopenharmony_ci#define GMAC_CLK_SYNT			(misc_base + 0x068)
9262306a36Sopenharmony_ci#define GEN0_CLK_SYNT			(misc_base + 0x06C)
9362306a36Sopenharmony_ci#define GEN1_CLK_SYNT			(misc_base + 0x070)
9462306a36Sopenharmony_ci#define GEN2_CLK_SYNT			(misc_base + 0x074)
9562306a36Sopenharmony_ci#define GEN3_CLK_SYNT			(misc_base + 0x078)
9662306a36Sopenharmony_ci
9762306a36Sopenharmony_ci/* pll rate configuration table, in ascending order of rates */
9862306a36Sopenharmony_cistatic struct pll_rate_tbl pll_rtbl[] = {
9962306a36Sopenharmony_ci	{.mode = 0, .m = 0x53, .n = 0x0C, .p = 0x1}, /* vco 332 & pll 166 MHz */
10062306a36Sopenharmony_ci	{.mode = 0, .m = 0x85, .n = 0x0C, .p = 0x1}, /* vco 532 & pll 266 MHz */
10162306a36Sopenharmony_ci	{.mode = 0, .m = 0xA6, .n = 0x0C, .p = 0x1}, /* vco 664 & pll 332 MHz */
10262306a36Sopenharmony_ci};
10362306a36Sopenharmony_ci
10462306a36Sopenharmony_ci/* aux rate configuration table, in ascending order of rates */
10562306a36Sopenharmony_cistatic struct aux_rate_tbl aux_rtbl[] = {
10662306a36Sopenharmony_ci	/* For PLL1 = 332 MHz */
10762306a36Sopenharmony_ci	{.xscale = 1, .yscale = 81, .eq = 0}, /* 2.049 MHz */
10862306a36Sopenharmony_ci	{.xscale = 1, .yscale = 59, .eq = 0}, /* 2.822 MHz */
10962306a36Sopenharmony_ci	{.xscale = 2, .yscale = 81, .eq = 0}, /* 4.098 MHz */
11062306a36Sopenharmony_ci	{.xscale = 3, .yscale = 89, .eq = 0}, /* 5.644 MHz */
11162306a36Sopenharmony_ci	{.xscale = 4, .yscale = 81, .eq = 0}, /* 8.197 MHz */
11262306a36Sopenharmony_ci	{.xscale = 4, .yscale = 59, .eq = 0}, /* 11.254 MHz */
11362306a36Sopenharmony_ci	{.xscale = 2, .yscale = 27, .eq = 0}, /* 12.296 MHz */
11462306a36Sopenharmony_ci	{.xscale = 2, .yscale = 8, .eq = 0}, /* 41.5 MHz */
11562306a36Sopenharmony_ci	{.xscale = 2, .yscale = 4, .eq = 0}, /* 83 MHz */
11662306a36Sopenharmony_ci	{.xscale = 1, .yscale = 2, .eq = 1}, /* 166 MHz */
11762306a36Sopenharmony_ci};
11862306a36Sopenharmony_ci
11962306a36Sopenharmony_ci/* gpt rate configuration table, in ascending order of rates */
12062306a36Sopenharmony_cistatic struct gpt_rate_tbl gpt_rtbl[] = {
12162306a36Sopenharmony_ci	/* For pll1 = 332 MHz */
12262306a36Sopenharmony_ci	{.mscale = 4, .nscale = 0}, /* 41.5 MHz */
12362306a36Sopenharmony_ci	{.mscale = 2, .nscale = 0}, /* 55.3 MHz */
12462306a36Sopenharmony_ci	{.mscale = 1, .nscale = 0}, /* 83 MHz */
12562306a36Sopenharmony_ci};
12662306a36Sopenharmony_ci
12762306a36Sopenharmony_ci/* clock parents */
12862306a36Sopenharmony_cistatic const char *uart0_parents[] = { "pll3_clk", "uart_syn_gclk", };
12962306a36Sopenharmony_cistatic const char *firda_parents[] = { "pll3_clk", "firda_syn_gclk",
13062306a36Sopenharmony_ci};
13162306a36Sopenharmony_cistatic const char *gpt0_parents[] = { "pll3_clk", "gpt0_syn_clk", };
13262306a36Sopenharmony_cistatic const char *gpt1_parents[] = { "pll3_clk", "gpt1_syn_clk", };
13362306a36Sopenharmony_cistatic const char *gpt2_parents[] = { "pll3_clk", "gpt2_syn_clk", };
13462306a36Sopenharmony_cistatic const char *gen2_3_parents[] = { "pll1_clk", "pll2_clk", };
13562306a36Sopenharmony_cistatic const char *ddr_parents[] = { "ahb_clk", "ahbmult2_clk", "none",
13662306a36Sopenharmony_ci	"pll2_clk", };
13762306a36Sopenharmony_ci
13862306a36Sopenharmony_ci#ifdef CONFIG_MACH_SPEAR300
13962306a36Sopenharmony_cistatic void __init spear300_clk_init(void)
14062306a36Sopenharmony_ci{
14162306a36Sopenharmony_ci	struct clk *clk;
14262306a36Sopenharmony_ci
14362306a36Sopenharmony_ci	clk = clk_register_fixed_factor(NULL, "clcd_clk", "ras_pll3_clk", 0,
14462306a36Sopenharmony_ci			1, 1);
14562306a36Sopenharmony_ci	clk_register_clkdev(clk, NULL, "60000000.clcd");
14662306a36Sopenharmony_ci
14762306a36Sopenharmony_ci	clk = clk_register_fixed_factor(NULL, "fsmc_clk", "ras_ahb_clk", 0, 1,
14862306a36Sopenharmony_ci			1);
14962306a36Sopenharmony_ci	clk_register_clkdev(clk, NULL, "94000000.flash");
15062306a36Sopenharmony_ci
15162306a36Sopenharmony_ci	clk = clk_register_fixed_factor(NULL, "sdhci_clk", "ras_ahb_clk", 0, 1,
15262306a36Sopenharmony_ci			1);
15362306a36Sopenharmony_ci	clk_register_clkdev(clk, NULL, "70000000.sdhci");
15462306a36Sopenharmony_ci
15562306a36Sopenharmony_ci	clk = clk_register_fixed_factor(NULL, "gpio1_clk", "ras_apb_clk", 0, 1,
15662306a36Sopenharmony_ci			1);
15762306a36Sopenharmony_ci	clk_register_clkdev(clk, NULL, "a9000000.gpio");
15862306a36Sopenharmony_ci
15962306a36Sopenharmony_ci	clk = clk_register_fixed_factor(NULL, "kbd_clk", "ras_apb_clk", 0, 1,
16062306a36Sopenharmony_ci			1);
16162306a36Sopenharmony_ci	clk_register_clkdev(clk, NULL, "a0000000.kbd");
16262306a36Sopenharmony_ci}
16362306a36Sopenharmony_ci#else
16462306a36Sopenharmony_cistatic inline void spear300_clk_init(void) { }
16562306a36Sopenharmony_ci#endif
16662306a36Sopenharmony_ci
16762306a36Sopenharmony_ci/* array of all spear 310 clock lookups */
16862306a36Sopenharmony_ci#ifdef CONFIG_MACH_SPEAR310
16962306a36Sopenharmony_cistatic void __init spear310_clk_init(void)
17062306a36Sopenharmony_ci{
17162306a36Sopenharmony_ci	struct clk *clk;
17262306a36Sopenharmony_ci
17362306a36Sopenharmony_ci	clk = clk_register_fixed_factor(NULL, "emi_clk", "ras_ahb_clk", 0, 1,
17462306a36Sopenharmony_ci			1);
17562306a36Sopenharmony_ci	clk_register_clkdev(clk, "emi", NULL);
17662306a36Sopenharmony_ci
17762306a36Sopenharmony_ci	clk = clk_register_fixed_factor(NULL, "fsmc_clk", "ras_ahb_clk", 0, 1,
17862306a36Sopenharmony_ci			1);
17962306a36Sopenharmony_ci	clk_register_clkdev(clk, NULL, "44000000.flash");
18062306a36Sopenharmony_ci
18162306a36Sopenharmony_ci	clk = clk_register_fixed_factor(NULL, "tdm_clk", "ras_ahb_clk", 0, 1,
18262306a36Sopenharmony_ci			1);
18362306a36Sopenharmony_ci	clk_register_clkdev(clk, NULL, "tdm");
18462306a36Sopenharmony_ci
18562306a36Sopenharmony_ci	clk = clk_register_fixed_factor(NULL, "uart1_clk", "ras_apb_clk", 0, 1,
18662306a36Sopenharmony_ci			1);
18762306a36Sopenharmony_ci	clk_register_clkdev(clk, NULL, "b2000000.serial");
18862306a36Sopenharmony_ci
18962306a36Sopenharmony_ci	clk = clk_register_fixed_factor(NULL, "uart2_clk", "ras_apb_clk", 0, 1,
19062306a36Sopenharmony_ci			1);
19162306a36Sopenharmony_ci	clk_register_clkdev(clk, NULL, "b2080000.serial");
19262306a36Sopenharmony_ci
19362306a36Sopenharmony_ci	clk = clk_register_fixed_factor(NULL, "uart3_clk", "ras_apb_clk", 0, 1,
19462306a36Sopenharmony_ci			1);
19562306a36Sopenharmony_ci	clk_register_clkdev(clk, NULL, "b2100000.serial");
19662306a36Sopenharmony_ci
19762306a36Sopenharmony_ci	clk = clk_register_fixed_factor(NULL, "uart4_clk", "ras_apb_clk", 0, 1,
19862306a36Sopenharmony_ci			1);
19962306a36Sopenharmony_ci	clk_register_clkdev(clk, NULL, "b2180000.serial");
20062306a36Sopenharmony_ci
20162306a36Sopenharmony_ci	clk = clk_register_fixed_factor(NULL, "uart5_clk", "ras_apb_clk", 0, 1,
20262306a36Sopenharmony_ci			1);
20362306a36Sopenharmony_ci	clk_register_clkdev(clk, NULL, "b2200000.serial");
20462306a36Sopenharmony_ci}
20562306a36Sopenharmony_ci#else
20662306a36Sopenharmony_cistatic inline void spear310_clk_init(void) { }
20762306a36Sopenharmony_ci#endif
20862306a36Sopenharmony_ci
20962306a36Sopenharmony_ci/* array of all spear 320 clock lookups */
21062306a36Sopenharmony_ci#ifdef CONFIG_MACH_SPEAR320
21162306a36Sopenharmony_ci
21262306a36Sopenharmony_ci#define SPEAR320_CONTROL_REG		(soc_config_base + 0x0010)
21362306a36Sopenharmony_ci#define SPEAR320_EXT_CTRL_REG		(soc_config_base + 0x0018)
21462306a36Sopenharmony_ci
21562306a36Sopenharmony_ci	#define SPEAR320_UARTX_PCLK_MASK		0x1
21662306a36Sopenharmony_ci	#define SPEAR320_UART2_PCLK_SHIFT		8
21762306a36Sopenharmony_ci	#define SPEAR320_UART3_PCLK_SHIFT		9
21862306a36Sopenharmony_ci	#define SPEAR320_UART4_PCLK_SHIFT		10
21962306a36Sopenharmony_ci	#define SPEAR320_UART5_PCLK_SHIFT		11
22062306a36Sopenharmony_ci	#define SPEAR320_UART6_PCLK_SHIFT		12
22162306a36Sopenharmony_ci	#define SPEAR320_RS485_PCLK_SHIFT		13
22262306a36Sopenharmony_ci	#define SMII_PCLK_SHIFT				18
22362306a36Sopenharmony_ci	#define SMII_PCLK_MASK				2
22462306a36Sopenharmony_ci	#define SMII_PCLK_VAL_PAD			0x0
22562306a36Sopenharmony_ci	#define SMII_PCLK_VAL_PLL2			0x1
22662306a36Sopenharmony_ci	#define SMII_PCLK_VAL_SYNTH0			0x2
22762306a36Sopenharmony_ci	#define SDHCI_PCLK_SHIFT			15
22862306a36Sopenharmony_ci	#define SDHCI_PCLK_MASK				1
22962306a36Sopenharmony_ci	#define SDHCI_PCLK_VAL_48M			0x0
23062306a36Sopenharmony_ci	#define SDHCI_PCLK_VAL_SYNTH3			0x1
23162306a36Sopenharmony_ci	#define I2S_REF_PCLK_SHIFT			8
23262306a36Sopenharmony_ci	#define I2S_REF_PCLK_MASK			1
23362306a36Sopenharmony_ci	#define I2S_REF_PCLK_SYNTH_VAL			0x1
23462306a36Sopenharmony_ci	#define I2S_REF_PCLK_PLL2_VAL			0x0
23562306a36Sopenharmony_ci	#define UART1_PCLK_SHIFT			6
23662306a36Sopenharmony_ci	#define UART1_PCLK_MASK				1
23762306a36Sopenharmony_ci	#define SPEAR320_UARTX_PCLK_VAL_SYNTH1		0x0
23862306a36Sopenharmony_ci	#define SPEAR320_UARTX_PCLK_VAL_APB		0x1
23962306a36Sopenharmony_ci
24062306a36Sopenharmony_cistatic const char *i2s_ref_parents[] = { "ras_pll2_clk", "ras_syn2_gclk", };
24162306a36Sopenharmony_cistatic const char *sdhci_parents[] = { "ras_pll3_clk", "ras_syn3_gclk", };
24262306a36Sopenharmony_cistatic const char *smii0_parents[] = { "smii_125m_pad", "ras_pll2_clk",
24362306a36Sopenharmony_ci	"ras_syn0_gclk", };
24462306a36Sopenharmony_cistatic const char *uartx_parents[] = { "ras_syn1_gclk", "ras_apb_clk", };
24562306a36Sopenharmony_ci
24662306a36Sopenharmony_cistatic void __init spear320_clk_init(void __iomem *soc_config_base,
24762306a36Sopenharmony_ci				     struct clk *ras_apb_clk)
24862306a36Sopenharmony_ci{
24962306a36Sopenharmony_ci	struct clk *clk;
25062306a36Sopenharmony_ci
25162306a36Sopenharmony_ci	clk = clk_register_fixed_rate(NULL, "smii_125m_pad_clk", NULL,
25262306a36Sopenharmony_ci			0, 125000000);
25362306a36Sopenharmony_ci	clk_register_clkdev(clk, "smii_125m_pad", NULL);
25462306a36Sopenharmony_ci
25562306a36Sopenharmony_ci	clk = clk_register_fixed_factor(NULL, "clcd_clk", "ras_pll3_clk", 0,
25662306a36Sopenharmony_ci			1, 1);
25762306a36Sopenharmony_ci	clk_register_clkdev(clk, NULL, "90000000.clcd");
25862306a36Sopenharmony_ci
25962306a36Sopenharmony_ci	clk = clk_register_fixed_factor(NULL, "emi_clk", "ras_ahb_clk", 0, 1,
26062306a36Sopenharmony_ci			1);
26162306a36Sopenharmony_ci	clk_register_clkdev(clk, "emi", NULL);
26262306a36Sopenharmony_ci
26362306a36Sopenharmony_ci	clk = clk_register_fixed_factor(NULL, "fsmc_clk", "ras_ahb_clk", 0, 1,
26462306a36Sopenharmony_ci			1);
26562306a36Sopenharmony_ci	clk_register_clkdev(clk, NULL, "4c000000.flash");
26662306a36Sopenharmony_ci
26762306a36Sopenharmony_ci	clk = clk_register_fixed_factor(NULL, "i2c1_clk", "ras_ahb_clk", 0, 1,
26862306a36Sopenharmony_ci			1);
26962306a36Sopenharmony_ci	clk_register_clkdev(clk, NULL, "a7000000.i2c");
27062306a36Sopenharmony_ci
27162306a36Sopenharmony_ci	clk = clk_register_fixed_factor(NULL, "pwm_clk", "ras_ahb_clk", 0, 1,
27262306a36Sopenharmony_ci			1);
27362306a36Sopenharmony_ci	clk_register_clkdev(clk, NULL, "a8000000.pwm");
27462306a36Sopenharmony_ci
27562306a36Sopenharmony_ci	clk = clk_register_fixed_factor(NULL, "ssp1_clk", "ras_ahb_clk", 0, 1,
27662306a36Sopenharmony_ci			1);
27762306a36Sopenharmony_ci	clk_register_clkdev(clk, NULL, "a5000000.spi");
27862306a36Sopenharmony_ci
27962306a36Sopenharmony_ci	clk = clk_register_fixed_factor(NULL, "ssp2_clk", "ras_ahb_clk", 0, 1,
28062306a36Sopenharmony_ci			1);
28162306a36Sopenharmony_ci	clk_register_clkdev(clk, NULL, "a6000000.spi");
28262306a36Sopenharmony_ci
28362306a36Sopenharmony_ci	clk = clk_register_fixed_factor(NULL, "can0_clk", "ras_apb_clk", 0, 1,
28462306a36Sopenharmony_ci			1);
28562306a36Sopenharmony_ci	clk_register_clkdev(clk, NULL, "c_can_platform.0");
28662306a36Sopenharmony_ci
28762306a36Sopenharmony_ci	clk = clk_register_fixed_factor(NULL, "can1_clk", "ras_apb_clk", 0, 1,
28862306a36Sopenharmony_ci			1);
28962306a36Sopenharmony_ci	clk_register_clkdev(clk, NULL, "c_can_platform.1");
29062306a36Sopenharmony_ci
29162306a36Sopenharmony_ci	clk = clk_register_fixed_factor(NULL, "i2s_clk", "ras_apb_clk", 0, 1,
29262306a36Sopenharmony_ci			1);
29362306a36Sopenharmony_ci	clk_register_clkdev(clk, NULL, "a9400000.i2s");
29462306a36Sopenharmony_ci
29562306a36Sopenharmony_ci	clk = clk_register_mux(NULL, "i2s_ref_clk", i2s_ref_parents,
29662306a36Sopenharmony_ci			ARRAY_SIZE(i2s_ref_parents),
29762306a36Sopenharmony_ci			CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT,
29862306a36Sopenharmony_ci			SPEAR320_CONTROL_REG, I2S_REF_PCLK_SHIFT,
29962306a36Sopenharmony_ci			I2S_REF_PCLK_MASK, 0, &_lock);
30062306a36Sopenharmony_ci	clk_register_clkdev(clk, "i2s_ref_clk", NULL);
30162306a36Sopenharmony_ci
30262306a36Sopenharmony_ci	clk = clk_register_fixed_factor(NULL, "i2s_sclk", "i2s_ref_clk",
30362306a36Sopenharmony_ci			CLK_SET_RATE_PARENT, 1,
30462306a36Sopenharmony_ci			4);
30562306a36Sopenharmony_ci	clk_register_clkdev(clk, "i2s_sclk", NULL);
30662306a36Sopenharmony_ci
30762306a36Sopenharmony_ci	clk = clk_register_fixed_factor(NULL, "macb1_clk", "ras_apb_clk", 0, 1,
30862306a36Sopenharmony_ci			1);
30962306a36Sopenharmony_ci	clk_register_clkdev(clk, "hclk", "aa000000.eth");
31062306a36Sopenharmony_ci
31162306a36Sopenharmony_ci	clk = clk_register_fixed_factor(NULL, "macb2_clk", "ras_apb_clk", 0, 1,
31262306a36Sopenharmony_ci			1);
31362306a36Sopenharmony_ci	clk_register_clkdev(clk, "hclk", "ab000000.eth");
31462306a36Sopenharmony_ci
31562306a36Sopenharmony_ci	clk = clk_register_mux(NULL, "rs485_clk", uartx_parents,
31662306a36Sopenharmony_ci			ARRAY_SIZE(uartx_parents),
31762306a36Sopenharmony_ci			CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT,
31862306a36Sopenharmony_ci			SPEAR320_EXT_CTRL_REG, SPEAR320_RS485_PCLK_SHIFT,
31962306a36Sopenharmony_ci			SPEAR320_UARTX_PCLK_MASK, 0, &_lock);
32062306a36Sopenharmony_ci	clk_register_clkdev(clk, NULL, "a9300000.serial");
32162306a36Sopenharmony_ci
32262306a36Sopenharmony_ci	clk = clk_register_mux(NULL, "sdhci_clk", sdhci_parents,
32362306a36Sopenharmony_ci			ARRAY_SIZE(sdhci_parents),
32462306a36Sopenharmony_ci			CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT,
32562306a36Sopenharmony_ci			SPEAR320_CONTROL_REG, SDHCI_PCLK_SHIFT, SDHCI_PCLK_MASK,
32662306a36Sopenharmony_ci			0, &_lock);
32762306a36Sopenharmony_ci	clk_register_clkdev(clk, NULL, "70000000.sdhci");
32862306a36Sopenharmony_ci
32962306a36Sopenharmony_ci	clk = clk_register_mux(NULL, "smii_pclk", smii0_parents,
33062306a36Sopenharmony_ci			ARRAY_SIZE(smii0_parents), CLK_SET_RATE_NO_REPARENT,
33162306a36Sopenharmony_ci			SPEAR320_CONTROL_REG, SMII_PCLK_SHIFT, SMII_PCLK_MASK,
33262306a36Sopenharmony_ci			0, &_lock);
33362306a36Sopenharmony_ci	clk_register_clkdev(clk, NULL, "smii_pclk");
33462306a36Sopenharmony_ci
33562306a36Sopenharmony_ci	clk = clk_register_fixed_factor(NULL, "smii_clk", "smii_pclk", 0, 1, 1);
33662306a36Sopenharmony_ci	clk_register_clkdev(clk, NULL, "smii");
33762306a36Sopenharmony_ci
33862306a36Sopenharmony_ci	clk = clk_register_mux(NULL, "uart1_clk", uartx_parents,
33962306a36Sopenharmony_ci			ARRAY_SIZE(uartx_parents),
34062306a36Sopenharmony_ci			CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT,
34162306a36Sopenharmony_ci			SPEAR320_CONTROL_REG, UART1_PCLK_SHIFT, UART1_PCLK_MASK,
34262306a36Sopenharmony_ci			0, &_lock);
34362306a36Sopenharmony_ci	clk_register_clkdev(clk, NULL, "a3000000.serial");
34462306a36Sopenharmony_ci	/* Enforce ras_apb_clk */
34562306a36Sopenharmony_ci	clk_set_parent(clk, ras_apb_clk);
34662306a36Sopenharmony_ci
34762306a36Sopenharmony_ci	clk = clk_register_mux(NULL, "uart2_clk", uartx_parents,
34862306a36Sopenharmony_ci			ARRAY_SIZE(uartx_parents),
34962306a36Sopenharmony_ci			CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT,
35062306a36Sopenharmony_ci			SPEAR320_EXT_CTRL_REG, SPEAR320_UART2_PCLK_SHIFT,
35162306a36Sopenharmony_ci			SPEAR320_UARTX_PCLK_MASK, 0, &_lock);
35262306a36Sopenharmony_ci	clk_register_clkdev(clk, NULL, "a4000000.serial");
35362306a36Sopenharmony_ci	/* Enforce ras_apb_clk */
35462306a36Sopenharmony_ci	clk_set_parent(clk, ras_apb_clk);
35562306a36Sopenharmony_ci
35662306a36Sopenharmony_ci	clk = clk_register_mux(NULL, "uart3_clk", uartx_parents,
35762306a36Sopenharmony_ci			ARRAY_SIZE(uartx_parents),
35862306a36Sopenharmony_ci			CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT,
35962306a36Sopenharmony_ci			SPEAR320_EXT_CTRL_REG, SPEAR320_UART3_PCLK_SHIFT,
36062306a36Sopenharmony_ci			SPEAR320_UARTX_PCLK_MASK, 0, &_lock);
36162306a36Sopenharmony_ci	clk_register_clkdev(clk, NULL, "a9100000.serial");
36262306a36Sopenharmony_ci
36362306a36Sopenharmony_ci	clk = clk_register_mux(NULL, "uart4_clk", uartx_parents,
36462306a36Sopenharmony_ci			ARRAY_SIZE(uartx_parents),
36562306a36Sopenharmony_ci			CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT,
36662306a36Sopenharmony_ci			SPEAR320_EXT_CTRL_REG, SPEAR320_UART4_PCLK_SHIFT,
36762306a36Sopenharmony_ci			SPEAR320_UARTX_PCLK_MASK, 0, &_lock);
36862306a36Sopenharmony_ci	clk_register_clkdev(clk, NULL, "a9200000.serial");
36962306a36Sopenharmony_ci
37062306a36Sopenharmony_ci	clk = clk_register_mux(NULL, "uart5_clk", uartx_parents,
37162306a36Sopenharmony_ci			ARRAY_SIZE(uartx_parents),
37262306a36Sopenharmony_ci			CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT,
37362306a36Sopenharmony_ci			SPEAR320_EXT_CTRL_REG, SPEAR320_UART5_PCLK_SHIFT,
37462306a36Sopenharmony_ci			SPEAR320_UARTX_PCLK_MASK, 0, &_lock);
37562306a36Sopenharmony_ci	clk_register_clkdev(clk, NULL, "60000000.serial");
37662306a36Sopenharmony_ci
37762306a36Sopenharmony_ci	clk = clk_register_mux(NULL, "uart6_clk", uartx_parents,
37862306a36Sopenharmony_ci			ARRAY_SIZE(uartx_parents),
37962306a36Sopenharmony_ci			CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT,
38062306a36Sopenharmony_ci			SPEAR320_EXT_CTRL_REG, SPEAR320_UART6_PCLK_SHIFT,
38162306a36Sopenharmony_ci			SPEAR320_UARTX_PCLK_MASK, 0, &_lock);
38262306a36Sopenharmony_ci	clk_register_clkdev(clk, NULL, "60100000.serial");
38362306a36Sopenharmony_ci}
38462306a36Sopenharmony_ci#else
38562306a36Sopenharmony_cistatic inline void spear320_clk_init(void __iomem *sb, struct clk *rc) { }
38662306a36Sopenharmony_ci#endif
38762306a36Sopenharmony_ci
38862306a36Sopenharmony_civoid __init spear3xx_clk_init(void __iomem *misc_base, void __iomem *soc_config_base)
38962306a36Sopenharmony_ci{
39062306a36Sopenharmony_ci	struct clk *clk, *clk1, *ras_apb_clk;
39162306a36Sopenharmony_ci
39262306a36Sopenharmony_ci	clk = clk_register_fixed_rate(NULL, "osc_32k_clk", NULL, 0, 32000);
39362306a36Sopenharmony_ci	clk_register_clkdev(clk, "osc_32k_clk", NULL);
39462306a36Sopenharmony_ci
39562306a36Sopenharmony_ci	clk = clk_register_fixed_rate(NULL, "osc_24m_clk", NULL, 0, 24000000);
39662306a36Sopenharmony_ci	clk_register_clkdev(clk, "osc_24m_clk", NULL);
39762306a36Sopenharmony_ci
39862306a36Sopenharmony_ci	/* clock derived from 32 KHz osc clk */
39962306a36Sopenharmony_ci	clk = clk_register_gate(NULL, "rtc-spear", "osc_32k_clk", 0,
40062306a36Sopenharmony_ci			PERIP1_CLK_ENB, RTC_CLK_ENB, 0, &_lock);
40162306a36Sopenharmony_ci	clk_register_clkdev(clk, NULL, "fc900000.rtc");
40262306a36Sopenharmony_ci
40362306a36Sopenharmony_ci	/* clock derived from 24 MHz osc clk */
40462306a36Sopenharmony_ci	clk = clk_register_fixed_rate(NULL, "pll3_clk", "osc_24m_clk", 0,
40562306a36Sopenharmony_ci			48000000);
40662306a36Sopenharmony_ci	clk_register_clkdev(clk, "pll3_clk", NULL);
40762306a36Sopenharmony_ci
40862306a36Sopenharmony_ci	clk = clk_register_fixed_factor(NULL, "wdt_clk", "osc_24m_clk", 0, 1,
40962306a36Sopenharmony_ci			1);
41062306a36Sopenharmony_ci	clk_register_clkdev(clk, NULL, "fc880000.wdt");
41162306a36Sopenharmony_ci
41262306a36Sopenharmony_ci	clk = clk_register_vco_pll("vco1_clk", "pll1_clk", NULL,
41362306a36Sopenharmony_ci			"osc_24m_clk", 0, PLL1_CTR, PLL1_FRQ, pll_rtbl,
41462306a36Sopenharmony_ci			ARRAY_SIZE(pll_rtbl), &_lock, &clk1, NULL);
41562306a36Sopenharmony_ci	clk_register_clkdev(clk, "vco1_clk", NULL);
41662306a36Sopenharmony_ci	clk_register_clkdev(clk1, "pll1_clk", NULL);
41762306a36Sopenharmony_ci
41862306a36Sopenharmony_ci	clk = clk_register_vco_pll("vco2_clk", "pll2_clk", NULL,
41962306a36Sopenharmony_ci			"osc_24m_clk", 0, PLL2_CTR, PLL2_FRQ, pll_rtbl,
42062306a36Sopenharmony_ci			ARRAY_SIZE(pll_rtbl), &_lock, &clk1, NULL);
42162306a36Sopenharmony_ci	clk_register_clkdev(clk, "vco2_clk", NULL);
42262306a36Sopenharmony_ci	clk_register_clkdev(clk1, "pll2_clk", NULL);
42362306a36Sopenharmony_ci
42462306a36Sopenharmony_ci	/* clock derived from pll1 clk */
42562306a36Sopenharmony_ci	clk = clk_register_fixed_factor(NULL, "cpu_clk", "pll1_clk",
42662306a36Sopenharmony_ci			CLK_SET_RATE_PARENT, 1, 1);
42762306a36Sopenharmony_ci	clk_register_clkdev(clk, "cpu_clk", NULL);
42862306a36Sopenharmony_ci
42962306a36Sopenharmony_ci	clk = clk_register_divider(NULL, "ahb_clk", "pll1_clk",
43062306a36Sopenharmony_ci			CLK_SET_RATE_PARENT, CORE_CLK_CFG, HCLK_RATIO_SHIFT,
43162306a36Sopenharmony_ci			HCLK_RATIO_MASK, 0, &_lock);
43262306a36Sopenharmony_ci	clk_register_clkdev(clk, "ahb_clk", NULL);
43362306a36Sopenharmony_ci
43462306a36Sopenharmony_ci	clk = clk_register_aux("uart_syn_clk", "uart_syn_gclk", "pll1_clk", 0,
43562306a36Sopenharmony_ci			UART_CLK_SYNT, NULL, aux_rtbl, ARRAY_SIZE(aux_rtbl),
43662306a36Sopenharmony_ci			&_lock, &clk1);
43762306a36Sopenharmony_ci	clk_register_clkdev(clk, "uart_syn_clk", NULL);
43862306a36Sopenharmony_ci	clk_register_clkdev(clk1, "uart_syn_gclk", NULL);
43962306a36Sopenharmony_ci
44062306a36Sopenharmony_ci	clk = clk_register_mux(NULL, "uart0_mclk", uart0_parents,
44162306a36Sopenharmony_ci			ARRAY_SIZE(uart0_parents),
44262306a36Sopenharmony_ci			CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT,
44362306a36Sopenharmony_ci			PERIP_CLK_CFG, UART_CLK_SHIFT, UART_CLK_MASK, 0,
44462306a36Sopenharmony_ci			&_lock);
44562306a36Sopenharmony_ci	clk_register_clkdev(clk, "uart0_mclk", NULL);
44662306a36Sopenharmony_ci
44762306a36Sopenharmony_ci	clk = clk_register_gate(NULL, "uart0", "uart0_mclk",
44862306a36Sopenharmony_ci			CLK_SET_RATE_PARENT, PERIP1_CLK_ENB, UART_CLK_ENB, 0,
44962306a36Sopenharmony_ci			&_lock);
45062306a36Sopenharmony_ci	clk_register_clkdev(clk, NULL, "d0000000.serial");
45162306a36Sopenharmony_ci
45262306a36Sopenharmony_ci	clk = clk_register_aux("firda_syn_clk", "firda_syn_gclk", "pll1_clk", 0,
45362306a36Sopenharmony_ci			FIRDA_CLK_SYNT, NULL, aux_rtbl, ARRAY_SIZE(aux_rtbl),
45462306a36Sopenharmony_ci			&_lock, &clk1);
45562306a36Sopenharmony_ci	clk_register_clkdev(clk, "firda_syn_clk", NULL);
45662306a36Sopenharmony_ci	clk_register_clkdev(clk1, "firda_syn_gclk", NULL);
45762306a36Sopenharmony_ci
45862306a36Sopenharmony_ci	clk = clk_register_mux(NULL, "firda_mclk", firda_parents,
45962306a36Sopenharmony_ci			ARRAY_SIZE(firda_parents),
46062306a36Sopenharmony_ci			CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT,
46162306a36Sopenharmony_ci			PERIP_CLK_CFG, FIRDA_CLK_SHIFT, FIRDA_CLK_MASK, 0,
46262306a36Sopenharmony_ci			&_lock);
46362306a36Sopenharmony_ci	clk_register_clkdev(clk, "firda_mclk", NULL);
46462306a36Sopenharmony_ci
46562306a36Sopenharmony_ci	clk = clk_register_gate(NULL, "firda_clk", "firda_mclk",
46662306a36Sopenharmony_ci			CLK_SET_RATE_PARENT, PERIP1_CLK_ENB, FIRDA_CLK_ENB, 0,
46762306a36Sopenharmony_ci			&_lock);
46862306a36Sopenharmony_ci	clk_register_clkdev(clk, NULL, "firda");
46962306a36Sopenharmony_ci
47062306a36Sopenharmony_ci	/* gpt clocks */
47162306a36Sopenharmony_ci	clk_register_gpt("gpt0_syn_clk", "pll1_clk", 0, PRSC0_CLK_CFG, gpt_rtbl,
47262306a36Sopenharmony_ci			ARRAY_SIZE(gpt_rtbl), &_lock);
47362306a36Sopenharmony_ci	clk = clk_register_mux(NULL, "gpt0_clk", gpt0_parents,
47462306a36Sopenharmony_ci			ARRAY_SIZE(gpt0_parents),
47562306a36Sopenharmony_ci			CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT,
47662306a36Sopenharmony_ci			PERIP_CLK_CFG, GPT0_CLK_SHIFT, GPT_CLK_MASK, 0, &_lock);
47762306a36Sopenharmony_ci	clk_register_clkdev(clk, NULL, "gpt0");
47862306a36Sopenharmony_ci
47962306a36Sopenharmony_ci	clk_register_gpt("gpt1_syn_clk", "pll1_clk", 0, PRSC1_CLK_CFG, gpt_rtbl,
48062306a36Sopenharmony_ci			ARRAY_SIZE(gpt_rtbl), &_lock);
48162306a36Sopenharmony_ci	clk = clk_register_mux(NULL, "gpt1_mclk", gpt1_parents,
48262306a36Sopenharmony_ci			ARRAY_SIZE(gpt1_parents),
48362306a36Sopenharmony_ci			CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT,
48462306a36Sopenharmony_ci			PERIP_CLK_CFG, GPT1_CLK_SHIFT, GPT_CLK_MASK, 0, &_lock);
48562306a36Sopenharmony_ci	clk_register_clkdev(clk, "gpt1_mclk", NULL);
48662306a36Sopenharmony_ci	clk = clk_register_gate(NULL, "gpt1_clk", "gpt1_mclk",
48762306a36Sopenharmony_ci			CLK_SET_RATE_PARENT, PERIP1_CLK_ENB, GPT1_CLK_ENB, 0,
48862306a36Sopenharmony_ci			&_lock);
48962306a36Sopenharmony_ci	clk_register_clkdev(clk, NULL, "gpt1");
49062306a36Sopenharmony_ci
49162306a36Sopenharmony_ci	clk_register_gpt("gpt2_syn_clk", "pll1_clk", 0, PRSC2_CLK_CFG, gpt_rtbl,
49262306a36Sopenharmony_ci			ARRAY_SIZE(gpt_rtbl), &_lock);
49362306a36Sopenharmony_ci	clk = clk_register_mux(NULL, "gpt2_mclk", gpt2_parents,
49462306a36Sopenharmony_ci			ARRAY_SIZE(gpt2_parents),
49562306a36Sopenharmony_ci			CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT,
49662306a36Sopenharmony_ci			PERIP_CLK_CFG, GPT2_CLK_SHIFT, GPT_CLK_MASK, 0, &_lock);
49762306a36Sopenharmony_ci	clk_register_clkdev(clk, "gpt2_mclk", NULL);
49862306a36Sopenharmony_ci	clk = clk_register_gate(NULL, "gpt2_clk", "gpt2_mclk",
49962306a36Sopenharmony_ci			CLK_SET_RATE_PARENT, PERIP1_CLK_ENB, GPT2_CLK_ENB, 0,
50062306a36Sopenharmony_ci			&_lock);
50162306a36Sopenharmony_ci	clk_register_clkdev(clk, NULL, "gpt2");
50262306a36Sopenharmony_ci
50362306a36Sopenharmony_ci	/* general synths clocks */
50462306a36Sopenharmony_ci	clk = clk_register_aux("gen0_syn_clk", "gen0_syn_gclk", "pll1_clk",
50562306a36Sopenharmony_ci			0, GEN0_CLK_SYNT, NULL, aux_rtbl, ARRAY_SIZE(aux_rtbl),
50662306a36Sopenharmony_ci			&_lock, &clk1);
50762306a36Sopenharmony_ci	clk_register_clkdev(clk, "gen0_syn_clk", NULL);
50862306a36Sopenharmony_ci	clk_register_clkdev(clk1, "gen0_syn_gclk", NULL);
50962306a36Sopenharmony_ci
51062306a36Sopenharmony_ci	clk = clk_register_aux("gen1_syn_clk", "gen1_syn_gclk", "pll1_clk",
51162306a36Sopenharmony_ci			0, GEN1_CLK_SYNT, NULL, aux_rtbl, ARRAY_SIZE(aux_rtbl),
51262306a36Sopenharmony_ci			&_lock, &clk1);
51362306a36Sopenharmony_ci	clk_register_clkdev(clk, "gen1_syn_clk", NULL);
51462306a36Sopenharmony_ci	clk_register_clkdev(clk1, "gen1_syn_gclk", NULL);
51562306a36Sopenharmony_ci
51662306a36Sopenharmony_ci	clk = clk_register_mux(NULL, "gen2_3_par_clk", gen2_3_parents,
51762306a36Sopenharmony_ci			ARRAY_SIZE(gen2_3_parents), CLK_SET_RATE_NO_REPARENT,
51862306a36Sopenharmony_ci			CORE_CLK_CFG, GEN_SYNTH2_3_CLK_SHIFT,
51962306a36Sopenharmony_ci			GEN_SYNTH2_3_CLK_MASK, 0, &_lock);
52062306a36Sopenharmony_ci	clk_register_clkdev(clk, "gen2_3_par_clk", NULL);
52162306a36Sopenharmony_ci
52262306a36Sopenharmony_ci	clk = clk_register_aux("gen2_syn_clk", "gen2_syn_gclk",
52362306a36Sopenharmony_ci			"gen2_3_par_clk", 0, GEN2_CLK_SYNT, NULL, aux_rtbl,
52462306a36Sopenharmony_ci			ARRAY_SIZE(aux_rtbl), &_lock, &clk1);
52562306a36Sopenharmony_ci	clk_register_clkdev(clk, "gen2_syn_clk", NULL);
52662306a36Sopenharmony_ci	clk_register_clkdev(clk1, "gen2_syn_gclk", NULL);
52762306a36Sopenharmony_ci
52862306a36Sopenharmony_ci	clk = clk_register_aux("gen3_syn_clk", "gen3_syn_gclk",
52962306a36Sopenharmony_ci			"gen2_3_par_clk", 0, GEN3_CLK_SYNT, NULL, aux_rtbl,
53062306a36Sopenharmony_ci			ARRAY_SIZE(aux_rtbl), &_lock, &clk1);
53162306a36Sopenharmony_ci	clk_register_clkdev(clk, "gen3_syn_clk", NULL);
53262306a36Sopenharmony_ci	clk_register_clkdev(clk1, "gen3_syn_gclk", NULL);
53362306a36Sopenharmony_ci
53462306a36Sopenharmony_ci	/* clock derived from pll3 clk */
53562306a36Sopenharmony_ci	clk = clk_register_gate(NULL, "usbh_clk", "pll3_clk", 0, PERIP1_CLK_ENB,
53662306a36Sopenharmony_ci			USBH_CLK_ENB, 0, &_lock);
53762306a36Sopenharmony_ci	clk_register_clkdev(clk, NULL, "e1800000.ehci");
53862306a36Sopenharmony_ci	clk_register_clkdev(clk, NULL, "e1900000.ohci");
53962306a36Sopenharmony_ci	clk_register_clkdev(clk, NULL, "e2100000.ohci");
54062306a36Sopenharmony_ci
54162306a36Sopenharmony_ci	clk = clk_register_fixed_factor(NULL, "usbh.0_clk", "usbh_clk", 0, 1,
54262306a36Sopenharmony_ci			1);
54362306a36Sopenharmony_ci	clk_register_clkdev(clk, "usbh.0_clk", NULL);
54462306a36Sopenharmony_ci
54562306a36Sopenharmony_ci	clk = clk_register_fixed_factor(NULL, "usbh.1_clk", "usbh_clk", 0, 1,
54662306a36Sopenharmony_ci			1);
54762306a36Sopenharmony_ci	clk_register_clkdev(clk, "usbh.1_clk", NULL);
54862306a36Sopenharmony_ci
54962306a36Sopenharmony_ci	clk = clk_register_gate(NULL, "usbd_clk", "pll3_clk", 0, PERIP1_CLK_ENB,
55062306a36Sopenharmony_ci			USBD_CLK_ENB, 0, &_lock);
55162306a36Sopenharmony_ci	clk_register_clkdev(clk, NULL, "e1100000.usbd");
55262306a36Sopenharmony_ci
55362306a36Sopenharmony_ci	/* clock derived from ahb clk */
55462306a36Sopenharmony_ci	clk = clk_register_fixed_factor(NULL, "ahbmult2_clk", "ahb_clk", 0, 2,
55562306a36Sopenharmony_ci			1);
55662306a36Sopenharmony_ci	clk_register_clkdev(clk, "ahbmult2_clk", NULL);
55762306a36Sopenharmony_ci
55862306a36Sopenharmony_ci	clk = clk_register_mux(NULL, "ddr_clk", ddr_parents,
55962306a36Sopenharmony_ci			ARRAY_SIZE(ddr_parents), CLK_SET_RATE_NO_REPARENT,
56062306a36Sopenharmony_ci			PLL_CLK_CFG, MCTR_CLK_SHIFT, MCTR_CLK_MASK, 0, &_lock);
56162306a36Sopenharmony_ci	clk_register_clkdev(clk, "ddr_clk", NULL);
56262306a36Sopenharmony_ci
56362306a36Sopenharmony_ci	clk = clk_register_divider(NULL, "apb_clk", "ahb_clk",
56462306a36Sopenharmony_ci			CLK_SET_RATE_PARENT, CORE_CLK_CFG, PCLK_RATIO_SHIFT,
56562306a36Sopenharmony_ci			PCLK_RATIO_MASK, 0, &_lock);
56662306a36Sopenharmony_ci	clk_register_clkdev(clk, "apb_clk", NULL);
56762306a36Sopenharmony_ci
56862306a36Sopenharmony_ci	clk = clk_register_gate(NULL, "amem_clk", "ahb_clk", 0, AMEM_CLK_CFG,
56962306a36Sopenharmony_ci			AMEM_CLK_ENB, 0, &_lock);
57062306a36Sopenharmony_ci	clk_register_clkdev(clk, "amem_clk", NULL);
57162306a36Sopenharmony_ci
57262306a36Sopenharmony_ci	clk = clk_register_gate(NULL, "c3_clk", "ahb_clk", 0, PERIP1_CLK_ENB,
57362306a36Sopenharmony_ci			C3_CLK_ENB, 0, &_lock);
57462306a36Sopenharmony_ci	clk_register_clkdev(clk, NULL, "c3_clk");
57562306a36Sopenharmony_ci
57662306a36Sopenharmony_ci	clk = clk_register_gate(NULL, "dma_clk", "ahb_clk", 0, PERIP1_CLK_ENB,
57762306a36Sopenharmony_ci			DMA_CLK_ENB, 0, &_lock);
57862306a36Sopenharmony_ci	clk_register_clkdev(clk, NULL, "fc400000.dma");
57962306a36Sopenharmony_ci
58062306a36Sopenharmony_ci	clk = clk_register_gate(NULL, "gmac_clk", "ahb_clk", 0, PERIP1_CLK_ENB,
58162306a36Sopenharmony_ci			GMAC_CLK_ENB, 0, &_lock);
58262306a36Sopenharmony_ci	clk_register_clkdev(clk, NULL, "e0800000.eth");
58362306a36Sopenharmony_ci
58462306a36Sopenharmony_ci	clk = clk_register_gate(NULL, "i2c0_clk", "ahb_clk", 0, PERIP1_CLK_ENB,
58562306a36Sopenharmony_ci			I2C_CLK_ENB, 0, &_lock);
58662306a36Sopenharmony_ci	clk_register_clkdev(clk, NULL, "d0180000.i2c");
58762306a36Sopenharmony_ci
58862306a36Sopenharmony_ci	clk = clk_register_gate(NULL, "jpeg_clk", "ahb_clk", 0, PERIP1_CLK_ENB,
58962306a36Sopenharmony_ci			JPEG_CLK_ENB, 0, &_lock);
59062306a36Sopenharmony_ci	clk_register_clkdev(clk, NULL, "jpeg");
59162306a36Sopenharmony_ci
59262306a36Sopenharmony_ci	clk = clk_register_gate(NULL, "smi_clk", "ahb_clk", 0, PERIP1_CLK_ENB,
59362306a36Sopenharmony_ci			SMI_CLK_ENB, 0, &_lock);
59462306a36Sopenharmony_ci	clk_register_clkdev(clk, NULL, "fc000000.flash");
59562306a36Sopenharmony_ci
59662306a36Sopenharmony_ci	/* clock derived from apb clk */
59762306a36Sopenharmony_ci	clk = clk_register_gate(NULL, "adc_clk", "apb_clk", 0, PERIP1_CLK_ENB,
59862306a36Sopenharmony_ci			ADC_CLK_ENB, 0, &_lock);
59962306a36Sopenharmony_ci	clk_register_clkdev(clk, NULL, "d0080000.adc");
60062306a36Sopenharmony_ci
60162306a36Sopenharmony_ci	clk = clk_register_gate(NULL, "gpio0_clk", "apb_clk", 0, PERIP1_CLK_ENB,
60262306a36Sopenharmony_ci			GPIO_CLK_ENB, 0, &_lock);
60362306a36Sopenharmony_ci	clk_register_clkdev(clk, NULL, "fc980000.gpio");
60462306a36Sopenharmony_ci
60562306a36Sopenharmony_ci	clk = clk_register_gate(NULL, "ssp0_clk", "apb_clk", 0, PERIP1_CLK_ENB,
60662306a36Sopenharmony_ci			SSP_CLK_ENB, 0, &_lock);
60762306a36Sopenharmony_ci	clk_register_clkdev(clk, NULL, "d0100000.spi");
60862306a36Sopenharmony_ci
60962306a36Sopenharmony_ci	/* RAS clk enable */
61062306a36Sopenharmony_ci	clk = clk_register_gate(NULL, "ras_ahb_clk", "ahb_clk", 0, RAS_CLK_ENB,
61162306a36Sopenharmony_ci			RAS_AHB_CLK_ENB, 0, &_lock);
61262306a36Sopenharmony_ci	clk_register_clkdev(clk, "ras_ahb_clk", NULL);
61362306a36Sopenharmony_ci
61462306a36Sopenharmony_ci	clk = clk_register_gate(NULL, "ras_apb_clk", "apb_clk", 0, RAS_CLK_ENB,
61562306a36Sopenharmony_ci			RAS_APB_CLK_ENB, 0, &_lock);
61662306a36Sopenharmony_ci	clk_register_clkdev(clk, "ras_apb_clk", NULL);
61762306a36Sopenharmony_ci	ras_apb_clk = clk;
61862306a36Sopenharmony_ci
61962306a36Sopenharmony_ci	clk = clk_register_gate(NULL, "ras_32k_clk", "osc_32k_clk", 0,
62062306a36Sopenharmony_ci			RAS_CLK_ENB, RAS_32K_CLK_ENB, 0, &_lock);
62162306a36Sopenharmony_ci	clk_register_clkdev(clk, "ras_32k_clk", NULL);
62262306a36Sopenharmony_ci
62362306a36Sopenharmony_ci	clk = clk_register_gate(NULL, "ras_24m_clk", "osc_24m_clk", 0,
62462306a36Sopenharmony_ci			RAS_CLK_ENB, RAS_24M_CLK_ENB, 0, &_lock);
62562306a36Sopenharmony_ci	clk_register_clkdev(clk, "ras_24m_clk", NULL);
62662306a36Sopenharmony_ci
62762306a36Sopenharmony_ci	clk = clk_register_gate(NULL, "ras_pll1_clk", "pll1_clk", 0,
62862306a36Sopenharmony_ci			RAS_CLK_ENB, RAS_PLL1_CLK_ENB, 0, &_lock);
62962306a36Sopenharmony_ci	clk_register_clkdev(clk, "ras_pll1_clk", NULL);
63062306a36Sopenharmony_ci
63162306a36Sopenharmony_ci	clk = clk_register_gate(NULL, "ras_pll2_clk", "pll2_clk", 0,
63262306a36Sopenharmony_ci			RAS_CLK_ENB, RAS_PLL2_CLK_ENB, 0, &_lock);
63362306a36Sopenharmony_ci	clk_register_clkdev(clk, "ras_pll2_clk", NULL);
63462306a36Sopenharmony_ci
63562306a36Sopenharmony_ci	clk = clk_register_gate(NULL, "ras_pll3_clk", "pll3_clk", 0,
63662306a36Sopenharmony_ci			RAS_CLK_ENB, RAS_48M_CLK_ENB, 0, &_lock);
63762306a36Sopenharmony_ci	clk_register_clkdev(clk, "ras_pll3_clk", NULL);
63862306a36Sopenharmony_ci
63962306a36Sopenharmony_ci	clk = clk_register_gate(NULL, "ras_syn0_gclk", "gen0_syn_gclk",
64062306a36Sopenharmony_ci			CLK_SET_RATE_PARENT, RAS_CLK_ENB, RAS_SYNT0_CLK_ENB, 0,
64162306a36Sopenharmony_ci			&_lock);
64262306a36Sopenharmony_ci	clk_register_clkdev(clk, "ras_syn0_gclk", NULL);
64362306a36Sopenharmony_ci
64462306a36Sopenharmony_ci	clk = clk_register_gate(NULL, "ras_syn1_gclk", "gen1_syn_gclk",
64562306a36Sopenharmony_ci			CLK_SET_RATE_PARENT, RAS_CLK_ENB, RAS_SYNT1_CLK_ENB, 0,
64662306a36Sopenharmony_ci			&_lock);
64762306a36Sopenharmony_ci	clk_register_clkdev(clk, "ras_syn1_gclk", NULL);
64862306a36Sopenharmony_ci
64962306a36Sopenharmony_ci	clk = clk_register_gate(NULL, "ras_syn2_gclk", "gen2_syn_gclk",
65062306a36Sopenharmony_ci			CLK_SET_RATE_PARENT, RAS_CLK_ENB, RAS_SYNT2_CLK_ENB, 0,
65162306a36Sopenharmony_ci			&_lock);
65262306a36Sopenharmony_ci	clk_register_clkdev(clk, "ras_syn2_gclk", NULL);
65362306a36Sopenharmony_ci
65462306a36Sopenharmony_ci	clk = clk_register_gate(NULL, "ras_syn3_gclk", "gen3_syn_gclk",
65562306a36Sopenharmony_ci			CLK_SET_RATE_PARENT, RAS_CLK_ENB, RAS_SYNT3_CLK_ENB, 0,
65662306a36Sopenharmony_ci			&_lock);
65762306a36Sopenharmony_ci	clk_register_clkdev(clk, "ras_syn3_gclk", NULL);
65862306a36Sopenharmony_ci
65962306a36Sopenharmony_ci	if (of_machine_is_compatible("st,spear300"))
66062306a36Sopenharmony_ci		spear300_clk_init();
66162306a36Sopenharmony_ci	else if (of_machine_is_compatible("st,spear310"))
66262306a36Sopenharmony_ci		spear310_clk_init();
66362306a36Sopenharmony_ci	else if (of_machine_is_compatible("st,spear320"))
66462306a36Sopenharmony_ci		spear320_clk_init(soc_config_base, ras_apb_clk);
66562306a36Sopenharmony_ci}
666