File Index
Files and directories
Sign in
FILE

spear1340_clock.c

File preview with syntax highlighting.

linux-6.19.14/drivers/clk/spear/spear1340_clock.c C
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * arch/arm/mach-spear13xx/spear1340_clock.c
   4 *
   5 * SPEAr1340 machine clock framework source file
   6 *
   7 * Copyright (C) 2012 ST Microelectronics
   8 * Viresh Kumar <vireshk@kernel.org>
   9 */
  10
  11#include <linux/clkdev.h>
  12#include <linux/clk/spear.h>
  13#include <linux/err.h>
  14#include <linux/io.h>
  15#include <linux/spinlock_types.h>
  16#include "clk.h"
  17
  18/* Clock Configuration Registers */
  19#define SPEAR1340_SYS_CLK_CTRL			(misc_base + 0x200)
  20	#define SPEAR1340_HCLK_SRC_SEL_SHIFT	27
  21	#define SPEAR1340_HCLK_SRC_SEL_MASK	1
  22	#define SPEAR1340_SCLK_SRC_SEL_SHIFT	23
  23	#define SPEAR1340_SCLK_SRC_SEL_MASK	3
  24
  25/* PLL related registers and bit values */
  26#define SPEAR1340_PLL_CFG			(misc_base + 0x210)
  27	/* PLL_CFG bit values */
  28	#define SPEAR1340_CLCD_SYNT_CLK_MASK		1
  29	#define SPEAR1340_CLCD_SYNT_CLK_SHIFT		31
  30	#define SPEAR1340_GEN_SYNT2_3_CLK_SHIFT		29
  31	#define SPEAR1340_GEN_SYNT_CLK_MASK		2
  32	#define SPEAR1340_GEN_SYNT0_1_CLK_SHIFT		27
  33	#define SPEAR1340_PLL_CLK_MASK			2
  34	#define SPEAR1340_PLL3_CLK_SHIFT		24
  35	#define SPEAR1340_PLL2_CLK_SHIFT		22
  36	#define SPEAR1340_PLL1_CLK_SHIFT		20
  37
  38#define SPEAR1340_PLL1_CTR			(misc_base + 0x214)
  39#define SPEAR1340_PLL1_FRQ			(misc_base + 0x218)
  40#define SPEAR1340_PLL2_CTR			(misc_base + 0x220)
  41#define SPEAR1340_PLL2_FRQ			(misc_base + 0x224)
  42#define SPEAR1340_PLL3_CTR			(misc_base + 0x22C)
  43#define SPEAR1340_PLL3_FRQ			(misc_base + 0x230)
  44#define SPEAR1340_PLL4_CTR			(misc_base + 0x238)
  45#define SPEAR1340_PLL4_FRQ			(misc_base + 0x23C)
  46#define SPEAR1340_PERIP_CLK_CFG			(misc_base + 0x244)
  47	/* PERIP_CLK_CFG bit values */
  48	#define SPEAR1340_SPDIF_CLK_MASK		1
  49	#define SPEAR1340_SPDIF_OUT_CLK_SHIFT		15
  50	#define SPEAR1340_SPDIF_IN_CLK_SHIFT		14
  51	#define SPEAR1340_GPT3_CLK_SHIFT		13
  52	#define SPEAR1340_GPT2_CLK_SHIFT		12
  53	#define SPEAR1340_GPT_CLK_MASK			1
  54	#define SPEAR1340_GPT1_CLK_SHIFT		9
  55	#define SPEAR1340_GPT0_CLK_SHIFT		8
  56	#define SPEAR1340_UART_CLK_MASK			2
  57	#define SPEAR1340_UART1_CLK_SHIFT		6
  58	#define SPEAR1340_UART0_CLK_SHIFT		4
  59	#define SPEAR1340_CLCD_CLK_MASK			2
  60	#define SPEAR1340_CLCD_CLK_SHIFT		2
  61	#define SPEAR1340_C3_CLK_MASK			1
  62	#define SPEAR1340_C3_CLK_SHIFT			1
  63
  64#define SPEAR1340_GMAC_CLK_CFG			(misc_base + 0x248)
  65	#define SPEAR1340_GMAC_PHY_CLK_MASK		1
  66	#define SPEAR1340_GMAC_PHY_CLK_SHIFT		2
  67	#define SPEAR1340_GMAC_PHY_INPUT_CLK_MASK	2
  68	#define SPEAR1340_GMAC_PHY_INPUT_CLK_SHIFT	0
  69
  70#define SPEAR1340_I2S_CLK_CFG			(misc_base + 0x24C)
  71	/* I2S_CLK_CFG register mask */
  72	#define SPEAR1340_I2S_SCLK_X_MASK		0x1F
  73	#define SPEAR1340_I2S_SCLK_X_SHIFT		27
  74	#define SPEAR1340_I2S_SCLK_Y_MASK		0x1F
  75	#define SPEAR1340_I2S_SCLK_Y_SHIFT		22
  76	#define SPEAR1340_I2S_SCLK_EQ_SEL_SHIFT		21
  77	#define SPEAR1340_I2S_SCLK_SYNTH_ENB		20
  78	#define SPEAR1340_I2S_PRS1_CLK_X_MASK		0xFF
  79	#define SPEAR1340_I2S_PRS1_CLK_X_SHIFT		12
  80	#define SPEAR1340_I2S_PRS1_CLK_Y_MASK		0xFF
  81	#define SPEAR1340_I2S_PRS1_CLK_Y_SHIFT		4
  82	#define SPEAR1340_I2S_PRS1_EQ_SEL_SHIFT		3
  83	#define SPEAR1340_I2S_REF_SEL_MASK		1
  84	#define SPEAR1340_I2S_REF_SHIFT			2
  85	#define SPEAR1340_I2S_SRC_CLK_MASK		2
  86	#define SPEAR1340_I2S_SRC_CLK_SHIFT		0
  87
  88#define SPEAR1340_C3_CLK_SYNT			(misc_base + 0x250)
  89#define SPEAR1340_UART0_CLK_SYNT		(misc_base + 0x254)
  90#define SPEAR1340_UART1_CLK_SYNT		(misc_base + 0x258)
  91#define SPEAR1340_GMAC_CLK_SYNT			(misc_base + 0x25C)
  92#define SPEAR1340_SDHCI_CLK_SYNT		(misc_base + 0x260)
  93#define SPEAR1340_CFXD_CLK_SYNT			(misc_base + 0x264)
  94#define SPEAR1340_ADC_CLK_SYNT			(misc_base + 0x270)
  95#define SPEAR1340_AMBA_CLK_SYNT			(misc_base + 0x274)
  96#define SPEAR1340_CLCD_CLK_SYNT			(misc_base + 0x27C)
  97#define SPEAR1340_SYS_CLK_SYNT			(misc_base + 0x284)
  98#define SPEAR1340_GEN_CLK_SYNT0			(misc_base + 0x28C)
  99#define SPEAR1340_GEN_CLK_SYNT1			(misc_base + 0x294)
 100#define SPEAR1340_GEN_CLK_SYNT2			(misc_base + 0x29C)
 101#define SPEAR1340_GEN_CLK_SYNT3			(misc_base + 0x304)
 102#define SPEAR1340_PERIP1_CLK_ENB		(misc_base + 0x30C)
 103	#define SPEAR1340_RTC_CLK_ENB			31
 104	#define SPEAR1340_ADC_CLK_ENB			30
 105	#define SPEAR1340_C3_CLK_ENB			29
 106	#define SPEAR1340_CLCD_CLK_ENB			27
 107	#define SPEAR1340_DMA_CLK_ENB			25
 108	#define SPEAR1340_GPIO1_CLK_ENB			24
 109	#define SPEAR1340_GPIO0_CLK_ENB			23
 110	#define SPEAR1340_GPT1_CLK_ENB			22
 111	#define SPEAR1340_GPT0_CLK_ENB			21
 112	#define SPEAR1340_I2S_PLAY_CLK_ENB		20
 113	#define SPEAR1340_I2S_REC_CLK_ENB		19
 114	#define SPEAR1340_I2C0_CLK_ENB			18
 115	#define SPEAR1340_SSP_CLK_ENB			17
 116	#define SPEAR1340_UART0_CLK_ENB			15
 117	#define SPEAR1340_PCIE_SATA_CLK_ENB		12
 118	#define SPEAR1340_UOC_CLK_ENB			11
 119	#define SPEAR1340_UHC1_CLK_ENB			10
 120	#define SPEAR1340_UHC0_CLK_ENB			9
 121	#define SPEAR1340_GMAC_CLK_ENB			8
 122	#define SPEAR1340_CFXD_CLK_ENB			7
 123	#define SPEAR1340_SDHCI_CLK_ENB			6
 124	#define SPEAR1340_SMI_CLK_ENB			5
 125	#define SPEAR1340_FSMC_CLK_ENB			4
 126	#define SPEAR1340_SYSRAM0_CLK_ENB		3
 127	#define SPEAR1340_SYSRAM1_CLK_ENB		2
 128	#define SPEAR1340_SYSROM_CLK_ENB		1
 129	#define SPEAR1340_BUS_CLK_ENB			0
 130
 131#define SPEAR1340_PERIP2_CLK_ENB		(misc_base + 0x310)
 132	#define SPEAR1340_THSENS_CLK_ENB		8
 133	#define SPEAR1340_I2S_REF_PAD_CLK_ENB		7
 134	#define SPEAR1340_ACP_CLK_ENB			6
 135	#define SPEAR1340_GPT3_CLK_ENB			5
 136	#define SPEAR1340_GPT2_CLK_ENB			4
 137	#define SPEAR1340_KBD_CLK_ENB			3
 138	#define SPEAR1340_CPU_DBG_CLK_ENB		2
 139	#define SPEAR1340_DDR_CORE_CLK_ENB		1
 140	#define SPEAR1340_DDR_CTRL_CLK_ENB		0
 141
 142#define SPEAR1340_PERIP3_CLK_ENB		(misc_base + 0x314)
 143	#define SPEAR1340_PLGPIO_CLK_ENB		18
 144	#define SPEAR1340_VIDEO_DEC_CLK_ENB		16
 145	#define SPEAR1340_VIDEO_ENC_CLK_ENB		15
 146	#define SPEAR1340_SPDIF_OUT_CLK_ENB		13
 147	#define SPEAR1340_SPDIF_IN_CLK_ENB		12
 148	#define SPEAR1340_VIDEO_IN_CLK_ENB		11
 149	#define SPEAR1340_CAM0_CLK_ENB			10
 150	#define SPEAR1340_CAM1_CLK_ENB			9
 151	#define SPEAR1340_CAM2_CLK_ENB			8
 152	#define SPEAR1340_CAM3_CLK_ENB			7
 153	#define SPEAR1340_MALI_CLK_ENB			6
 154	#define SPEAR1340_CEC0_CLK_ENB			5
 155	#define SPEAR1340_CEC1_CLK_ENB			4
 156	#define SPEAR1340_PWM_CLK_ENB			3
 157	#define SPEAR1340_I2C1_CLK_ENB			2
 158	#define SPEAR1340_UART1_CLK_ENB			1
 159
 160static DEFINE_SPINLOCK(_lock);
 161
 162/* pll rate configuration table, in ascending order of rates */
 163static struct pll_rate_tbl pll_rtbl[] = {
 164	/* PCLK 24MHz */
 165	{.mode = 0, .m = 0x83, .n = 0x04, .p = 0x5}, /* vco 1572, pll 49.125 MHz */
 166	{.mode = 0, .m = 0x7D, .n = 0x06, .p = 0x3}, /* vco 1000, pll 125 MHz */
 167	{.mode = 0, .m = 0x64, .n = 0x06, .p = 0x1}, /* vco 800, pll 400 MHz */
 168	{.mode = 0, .m = 0x7D, .n = 0x06, .p = 0x1}, /* vco 1000, pll 500 MHz */
 169	{.mode = 0, .m = 0xA6, .n = 0x06, .p = 0x1}, /* vco 1328, pll 664 MHz */
 170	{.mode = 0, .m = 0xC8, .n = 0x06, .p = 0x1}, /* vco 1600, pll 800 MHz */
 171	{.mode = 0, .m = 0x7D, .n = 0x06, .p = 0x0}, /* vco 1, pll 1 GHz */
 172	{.mode = 0, .m = 0x96, .n = 0x06, .p = 0x0}, /* vco 1200, pll 1200 MHz */
 173};
 174
 175/* vco-pll4 rate configuration table, in ascending order of rates */
 176static struct pll_rate_tbl pll4_rtbl[] = {
 177	{.mode = 0, .m = 0x7D, .n = 0x06, .p = 0x2}, /* vco 1000, pll 250 MHz */
 178	{.mode = 0, .m = 0xA6, .n = 0x06, .p = 0x2}, /* vco 1328, pll 332 MHz */
 179	{.mode = 0, .m = 0xC8, .n = 0x06, .p = 0x2}, /* vco 1600, pll 400 MHz */
 180	{.mode = 0, .m = 0x7D, .n = 0x06, .p = 0x0}, /* vco 1, pll 1 GHz */
 181};
 182
 183/*
 184 * All below entries generate 166 MHz for
 185 * different values of vco1div2
 186 */
 187static struct frac_rate_tbl amba_synth_rtbl[] = {
 188	{.div = 0x073A8}, /* for vco1div2 = 600 MHz */
 189	{.div = 0x06062}, /* for vco1div2 = 500 MHz */
 190	{.div = 0x04D1B}, /* for vco1div2 = 400 MHz */
 191	{.div = 0x04000}, /* for vco1div2 = 332 MHz */
 192	{.div = 0x03031}, /* for vco1div2 = 250 MHz */
 193	{.div = 0x0268D}, /* for vco1div2 = 200 MHz */
 194};
 195
 196/*
 197 * Synthesizer Clock derived from vcodiv2. This clock is one of the
 198 * possible clocks to feed cpu directly.
 199 * We can program this synthesizer to make cpu run on different clock
 200 * frequencies.
 201 * Following table provides configuration values to let cpu run on 200,
 202 * 250, 332, 400 or 500 MHz considering different possibilities of input
 203 * (vco1div2) clock.
 204 *
 205 * --------------------------------------------------------------------
 206 * vco1div2(Mhz)	fout(Mhz)	cpuclk = fout/2		div
 207 * --------------------------------------------------------------------
 208 * 400			200		100			0x04000
 209 * 400			250		125			0x03333
 210 * 400			332		166			0x0268D
 211 * 400			400		200			0x02000
 212 * --------------------------------------------------------------------
 213 * 500			200		100			0x05000
 214 * 500			250		125			0x04000
 215 * 500			332		166			0x03031
 216 * 500			400		200			0x02800
 217 * 500			500		250			0x02000
 218 * --------------------------------------------------------------------
 219 * 600			200		100			0x06000
 220 * 600			250		125			0x04CCE
 221 * 600			332		166			0x039D5
 222 * 600			400		200			0x03000
 223 * 600			500		250			0x02666
 224 * --------------------------------------------------------------------
 225 * 664			200		100			0x06a38
 226 * 664			250		125			0x054FD
 227 * 664			332		166			0x04000
 228 * 664			400		200			0x0351E
 229 * 664			500		250			0x02A7E
 230 * --------------------------------------------------------------------
 231 * 800			200		100			0x08000
 232 * 800			250		125			0x06666
 233 * 800			332		166			0x04D18
 234 * 800			400		200			0x04000
 235 * 800			500		250			0x03333
 236 * --------------------------------------------------------------------
 237 * sys rate configuration table is in descending order of divisor.
 238 */
 239static struct frac_rate_tbl sys_synth_rtbl[] = {
 240	{.div = 0x08000},
 241	{.div = 0x06a38},
 242	{.div = 0x06666},
 243	{.div = 0x06000},
 244	{.div = 0x054FD},
 245	{.div = 0x05000},
 246	{.div = 0x04D18},
 247	{.div = 0x04CCE},
 248	{.div = 0x04000},
 249	{.div = 0x039D5},
 250	{.div = 0x0351E},
 251	{.div = 0x03333},
 252	{.div = 0x03031},
 253	{.div = 0x03000},
 254	{.div = 0x02A7E},
 255	{.div = 0x02800},
 256	{.div = 0x0268D},
 257	{.div = 0x02666},
 258	{.div = 0x02000},
 259};
 260
 261/* aux rate configuration table, in ascending order of rates */
 262static struct aux_rate_tbl aux_rtbl[] = {
 263	/* 12.29MHz for vic1div2=600MHz and 10.24MHz for VCO1div2=500MHz */
 264	{.xscale = 5, .yscale = 122, .eq = 0},
 265	/* 14.70MHz for vic1div2=600MHz and 12.29MHz for VCO1div2=500MHz */
 266	{.xscale = 10, .yscale = 204, .eq = 0},
 267	/* 48MHz for vic1div2=600MHz and 40 MHz for VCO1div2=500MHz */
 268	{.xscale = 4, .yscale = 25, .eq = 0},
 269	/* 57.14MHz for vic1div2=600MHz and 48 MHz for VCO1div2=500MHz */
 270	{.xscale = 4, .yscale = 21, .eq = 0},
 271	/* 83.33MHz for vic1div2=600MHz and 69.44MHz for VCO1div2=500MHz */
 272	{.xscale = 5, .yscale = 18, .eq = 0},
 273	/* 100MHz for vic1div2=600MHz and 83.33 MHz for VCO1div2=500MHz */
 274	{.xscale = 2, .yscale = 6, .eq = 0},
 275	/* 125MHz for vic1div2=600MHz and 104.1MHz for VCO1div2=500MHz */
 276	{.xscale = 5, .yscale = 12, .eq = 0},
 277	/* 150MHz for vic1div2=600MHz and 125MHz for VCO1div2=500MHz */
 278	{.xscale = 2, .yscale = 4, .eq = 0},
 279	/* 166MHz for vic1div2=600MHz and 138.88MHz for VCO1div2=500MHz */
 280	{.xscale = 5, .yscale = 18, .eq = 1},
 281	/* 200MHz for vic1div2=600MHz and 166MHz for VCO1div2=500MHz */
 282	{.xscale = 1, .yscale = 3, .eq = 1},
 283	/* 250MHz for vic1div2=600MHz and 208.33MHz for VCO1div2=500MHz */
 284	{.xscale = 5, .yscale = 12, .eq = 1},
 285	/* 300MHz for vic1div2=600MHz and 250MHz for VCO1div2=500MHz */
 286	{.xscale = 1, .yscale = 2, .eq = 1},
 287};
 288
 289/* gmac rate configuration table, in ascending order of rates */
 290static struct aux_rate_tbl gmac_rtbl[] = {
 291	/* For gmac phy input clk */
 292	{.xscale = 2, .yscale = 6, .eq = 0}, /* divided by 6 */
 293	{.xscale = 2, .yscale = 4, .eq = 0}, /* divided by 4 */
 294	{.xscale = 1, .yscale = 3, .eq = 1}, /* divided by 3 */
 295	{.xscale = 1, .yscale = 2, .eq = 1}, /* divided by 2 */
 296};
 297
 298/* clcd rate configuration table, in ascending order of rates */
 299static struct frac_rate_tbl clcd_rtbl[] = {
 300	{.div = 0x18000}, /* 25 Mhz , for vc01div4 = 300 MHz*/
 301	{.div = 0x1638E}, /* 27 Mhz , for vc01div4 = 300 MHz*/
 302	{.div = 0x14000}, /* 25 Mhz , for vc01div4 = 250 MHz*/
 303	{.div = 0x1284B}, /* 27 Mhz , for vc01div4 = 250 MHz*/
 304	{.div = 0x0D8D3}, /* 58 Mhz , for vco1div4 = 393 MHz */
 305	{.div = 0x0B72C}, /* 58 Mhz , for vco1div4 = 332 MHz */
 306	{.div = 0x0A584}, /* 58 Mhz , for vco1div4 = 300 MHz */
 307	{.div = 0x093B1}, /* 65 Mhz , for vc01div4 = 300 MHz*/
 308	{.div = 0x089EE}, /* 58 Mhz , for vc01div4 = 250 MHz*/
 309	{.div = 0x081BA}, /* 74 Mhz , for vc01div4 = 300 MHz*/
 310	{.div = 0x07BA0}, /* 65 Mhz , for vc01div4 = 250 MHz*/
 311	{.div = 0x06f1C}, /* 72 Mhz , for vc01div4 = 250 MHz*/
 312	{.div = 0x06E58}, /* 58 Mhz , for vco1div4 = 200 MHz */
 313	{.div = 0x06c1B}, /* 74 Mhz , for vc01div4 = 250 MHz*/
 314	{.div = 0x058E3}, /* 108 Mhz , for vc01div4 = 300 MHz*/
 315	{.div = 0x04A12}, /* 108 Mhz , for vc01div4 = 250 MHz*/
 316	{.div = 0x040A5}, /* 148.5 Mhz , for vc01div4 = 300 MHz*/
 317	{.div = 0x0378E}, /* 144 Mhz , for vc01div4 = 250 MHz*/
 318	{.div = 0x0360D}, /* 148 Mhz , for vc01div4 = 250 MHz*/
 319	{.div = 0x035E0}, /* 148.5 MHz, for vc01div4 = 250 MHz*/
 320};
 321
 322/* i2s prescaler1 masks */
 323static const struct aux_clk_masks i2s_prs1_masks = {
 324	.eq_sel_mask = AUX_EQ_SEL_MASK,
 325	.eq_sel_shift = SPEAR1340_I2S_PRS1_EQ_SEL_SHIFT,
 326	.eq1_mask = AUX_EQ1_SEL,
 327	.eq2_mask = AUX_EQ2_SEL,
 328	.xscale_sel_mask = SPEAR1340_I2S_PRS1_CLK_X_MASK,
 329	.xscale_sel_shift = SPEAR1340_I2S_PRS1_CLK_X_SHIFT,
 330	.yscale_sel_mask = SPEAR1340_I2S_PRS1_CLK_Y_MASK,
 331	.yscale_sel_shift = SPEAR1340_I2S_PRS1_CLK_Y_SHIFT,
 332};
 333
 334/* i2s sclk (bit clock) syynthesizers masks */
 335static const struct aux_clk_masks i2s_sclk_masks = {
 336	.eq_sel_mask = AUX_EQ_SEL_MASK,
 337	.eq_sel_shift = SPEAR1340_I2S_SCLK_EQ_SEL_SHIFT,
 338	.eq1_mask = AUX_EQ1_SEL,
 339	.eq2_mask = AUX_EQ2_SEL,
 340	.xscale_sel_mask = SPEAR1340_I2S_SCLK_X_MASK,
 341	.xscale_sel_shift = SPEAR1340_I2S_SCLK_X_SHIFT,
 342	.yscale_sel_mask = SPEAR1340_I2S_SCLK_Y_MASK,
 343	.yscale_sel_shift = SPEAR1340_I2S_SCLK_Y_SHIFT,
 344	.enable_bit = SPEAR1340_I2S_SCLK_SYNTH_ENB,
 345};
 346
 347/* i2s prs1 aux rate configuration table, in ascending order of rates */
 348static struct aux_rate_tbl i2s_prs1_rtbl[] = {
 349	/* For parent clk = 49.152 MHz */
 350	{.xscale = 1, .yscale = 12, .eq = 0}, /* 2.048 MHz, smp freq = 8Khz */
 351	{.xscale = 11, .yscale = 96, .eq = 0}, /* 2.816 MHz, smp freq = 11Khz */
 352	{.xscale = 1, .yscale = 6, .eq = 0}, /* 4.096 MHz, smp freq = 16Khz */
 353	{.xscale = 11, .yscale = 48, .eq = 0}, /* 5.632 MHz, smp freq = 22Khz */
 354
 355	/*
 356	 * with parent clk = 49.152, freq gen is 8.192 MHz, smp freq = 32Khz
 357	 * with parent clk = 12.288, freq gen is 2.048 MHz, smp freq = 8Khz
 358	 */
 359	{.xscale = 1, .yscale = 3, .eq = 0},
 360
 361	/* For parent clk = 49.152 MHz */
 362	{.xscale = 17, .yscale = 37, .eq = 0}, /* 11.289 MHz, smp freq = 44Khz*/
 363	{.xscale = 1, .yscale = 2, .eq = 0}, /* 12.288 MHz, smp freq = 48Khz*/
 364};
 365
 366/* i2s sclk aux rate configuration table, in ascending order of rates */
 367static struct aux_rate_tbl i2s_sclk_rtbl[] = {
 368	/* For sclk = ref_clk * x/2/y */
 369	{.xscale = 1, .yscale = 4, .eq = 0},
 370	{.xscale = 1, .yscale = 2, .eq = 0},
 371};
 372
 373/* adc rate configuration table, in ascending order of rates */
 374/* possible adc range is 2.5 MHz to 20 MHz. */
 375static struct aux_rate_tbl adc_rtbl[] = {
 376	/* For ahb = 166.67 MHz */
 377	{.xscale = 1, .yscale = 31, .eq = 0}, /* 2.68 MHz */
 378	{.xscale = 2, .yscale = 21, .eq = 0}, /* 7.94 MHz */
 379	{.xscale = 4, .yscale = 21, .eq = 0}, /* 15.87 MHz */
 380	{.xscale = 10, .yscale = 42, .eq = 0}, /* 19.84 MHz */
 381};
 382
 383/* General synth rate configuration table, in ascending order of rates */
 384static struct frac_rate_tbl gen_rtbl[] = {
 385	{.div = 0x1A92B}, /* 22.5792 MHz for vco1div4=300 MHz*/
 386	{.div = 0x186A0}, /* 24.576 MHz for vco1div4=300 MHz*/
 387	{.div = 0x18000}, /* 25 MHz for vco1div4=300 MHz*/
 388	{.div = 0x1624E}, /* 22.5792 MHz for vco1div4=250 MHz*/
 389	{.div = 0x14585}, /* 24.576 MHz for vco1div4=250 MHz*/
 390	{.div = 0x14000}, /* 25 MHz for vco1div4=250 MHz*/
 391	{.div = 0x0D495}, /* 45.1584 MHz for vco1div4=300 MHz*/
 392	{.div = 0x0C000}, /* 50 MHz for vco1div4=300 MHz*/
 393	{.div = 0x0B127}, /* 45.1584 MHz for vco1div4=250 MHz*/
 394	{.div = 0x0A000}, /* 50 MHz for vco1div4=250 MHz*/
 395	{.div = 0x07530}, /* 81.92 MHz for vco1div4=300 MHz*/
 396	{.div = 0x061A8}, /* 81.92 MHz for vco1div4=250 MHz*/
 397	{.div = 0x06000}, /* 100 MHz for vco1div4=300 MHz*/
 398	{.div = 0x05000}, /* 100 MHz for vco1div4=250 MHz*/
 399	{.div = 0x03000}, /* 200 MHz for vco1div4=300 MHz*/
 400	{.div = 0x02DB6}, /* 210 MHz for vco1div4=300 MHz*/
 401	{.div = 0x02BA2}, /* 220 MHz for vco1div4=300 MHz*/
 402	{.div = 0x029BD}, /* 230 MHz for vco1div4=300 MHz*/
 403	{.div = 0x02800}, /* 200 MHz for vco1div4=250 MHz*/
 404	{.div = 0x02666}, /* 250 MHz for vco1div4=300 MHz*/
 405	{.div = 0x02620}, /* 210 MHz for vco1div4=250 MHz*/
 406	{.div = 0x02460}, /* 220 MHz for vco1div4=250 MHz*/
 407	{.div = 0x022C0}, /* 230 MHz for vco1div4=250 MHz*/
 408	{.div = 0x02160}, /* 240 MHz for vco1div4=250 MHz*/
 409	{.div = 0x02000}, /* 250 MHz for vco1div4=250 MHz*/
 410};
 411
 412/* clock parents */
 413static const char *vco_parents[] = { "osc_24m_clk", "osc_25m_clk", };
 414static const char *sys_parents[] = { "pll1_clk", "pll1_clk", "pll1_clk",
 415	"pll1_clk", "sys_syn_clk", "sys_syn_clk", "pll2_clk", "pll3_clk", };
 416static const char *ahb_parents[] = { "cpu_div3_clk", "amba_syn_clk", };
 417static const char *gpt_parents[] = { "osc_24m_clk", "apb_clk", };
 418static const char *uart0_parents[] = { "pll5_clk", "osc_24m_clk",
 419	"uart0_syn_gclk", };
 420static const char *uart1_parents[] = { "pll5_clk", "osc_24m_clk",
 421	"uart1_syn_gclk", };
 422static const char *c3_parents[] = { "pll5_clk", "c3_syn_gclk", };
 423static const char *gmac_phy_input_parents[] = { "gmii_pad_clk", "pll2_clk",
 424	"osc_25m_clk", };
 425static const char *gmac_phy_parents[] = { "phy_input_mclk", "phy_syn_gclk", };
 426static const char *clcd_synth_parents[] = { "vco1div4_clk", "pll2_clk", };
 427static const char *clcd_pixel_parents[] = { "pll5_clk", "clcd_syn_clk", };
 428static const char *i2s_src_parents[] = { "vco1div2_clk", "pll2_clk", "pll3_clk",
 429	"i2s_src_pad_clk", };
 430static const char *i2s_ref_parents[] = { "i2s_src_mclk", "i2s_prs1_clk", };
 431static const char *spdif_out_parents[] = { "i2s_src_pad_clk", "gen_syn2_clk", };
 432static const char *spdif_in_parents[] = { "pll2_clk", "gen_syn3_clk", };
 433
 434static const char *gen_synth0_1_parents[] = { "vco1div4_clk", "vco3div2_clk",
 435	"pll3_clk", };
 436static const char *gen_synth2_3_parents[] = { "vco1div4_clk", "vco2div2_clk",
 437	"pll2_clk", };
 438
 439void __init spear1340_clk_init(void __iomem *misc_base)
 440{
 441	struct clk *clk, *clk1;
 442
 443	clk = clk_register_fixed_rate(NULL, "osc_32k_clk", NULL, 0, 32000);
 444	clk_register_clkdev(clk, "osc_32k_clk", NULL);
 445
 446	clk = clk_register_fixed_rate(NULL, "osc_24m_clk", NULL, 0, 24000000);
 447	clk_register_clkdev(clk, "osc_24m_clk", NULL);
 448
 449	clk = clk_register_fixed_rate(NULL, "osc_25m_clk", NULL, 0, 25000000);
 450	clk_register_clkdev(clk, "osc_25m_clk", NULL);
 451
 452	clk = clk_register_fixed_rate(NULL, "gmii_pad_clk", NULL, 0, 125000000);
 453	clk_register_clkdev(clk, "gmii_pad_clk", NULL);
 454
 455	clk = clk_register_fixed_rate(NULL, "i2s_src_pad_clk", NULL, 0,
 456				      12288000);
 457	clk_register_clkdev(clk, "i2s_src_pad_clk", NULL);
 458
 459	/* clock derived from 32 KHz osc clk */
 460	clk = clk_register_gate(NULL, "rtc-spear", "osc_32k_clk", 0,
 461			SPEAR1340_PERIP1_CLK_ENB, SPEAR1340_RTC_CLK_ENB, 0,
 462			&_lock);
 463	clk_register_clkdev(clk, NULL, "e0580000.rtc");
 464
 465	/* clock derived from 24 or 25 MHz osc clk */
 466	/* vco-pll */
 467	clk = clk_register_mux(NULL, "vco1_mclk", vco_parents,
 468			ARRAY_SIZE(vco_parents), CLK_SET_RATE_NO_REPARENT,
 469			SPEAR1340_PLL_CFG, SPEAR1340_PLL1_CLK_SHIFT,
 470			SPEAR1340_PLL_CLK_MASK, 0, &_lock);
 471	clk_register_clkdev(clk, "vco1_mclk", NULL);
 472	clk = clk_register_vco_pll("vco1_clk", "pll1_clk", NULL, "vco1_mclk", 0,
 473			SPEAR1340_PLL1_CTR, SPEAR1340_PLL1_FRQ, pll_rtbl,
 474			ARRAY_SIZE(pll_rtbl), &_lock, &clk1, NULL);
 475	clk_register_clkdev(clk, "vco1_clk", NULL);
 476	clk_register_clkdev(clk1, "pll1_clk", NULL);
 477
 478	clk = clk_register_mux(NULL, "vco2_mclk", vco_parents,
 479			ARRAY_SIZE(vco_parents), CLK_SET_RATE_NO_REPARENT,
 480			SPEAR1340_PLL_CFG, SPEAR1340_PLL2_CLK_SHIFT,
 481			SPEAR1340_PLL_CLK_MASK, 0, &_lock);
 482	clk_register_clkdev(clk, "vco2_mclk", NULL);
 483	clk = clk_register_vco_pll("vco2_clk", "pll2_clk", NULL, "vco2_mclk", 0,
 484			SPEAR1340_PLL2_CTR, SPEAR1340_PLL2_FRQ, pll_rtbl,
 485			ARRAY_SIZE(pll_rtbl), &_lock, &clk1, NULL);
 486	clk_register_clkdev(clk, "vco2_clk", NULL);
 487	clk_register_clkdev(clk1, "pll2_clk", NULL);
 488
 489	clk = clk_register_mux(NULL, "vco3_mclk", vco_parents,
 490			ARRAY_SIZE(vco_parents), CLK_SET_RATE_NO_REPARENT,
 491			SPEAR1340_PLL_CFG, SPEAR1340_PLL3_CLK_SHIFT,
 492			SPEAR1340_PLL_CLK_MASK, 0, &_lock);
 493	clk_register_clkdev(clk, "vco3_mclk", NULL);
 494	clk = clk_register_vco_pll("vco3_clk", "pll3_clk", NULL, "vco3_mclk", 0,
 495			SPEAR1340_PLL3_CTR, SPEAR1340_PLL3_FRQ, pll_rtbl,
 496			ARRAY_SIZE(pll_rtbl), &_lock, &clk1, NULL);
 497	clk_register_clkdev(clk, "vco3_clk", NULL);
 498	clk_register_clkdev(clk1, "pll3_clk", NULL);
 499
 500	clk = clk_register_vco_pll("vco4_clk", "pll4_clk", NULL, "osc_24m_clk",
 501			0, SPEAR1340_PLL4_CTR, SPEAR1340_PLL4_FRQ, pll4_rtbl,
 502			ARRAY_SIZE(pll4_rtbl), &_lock, &clk1, NULL);
 503	clk_register_clkdev(clk, "vco4_clk", NULL);
 504	clk_register_clkdev(clk1, "pll4_clk", NULL);
 505
 506	clk = clk_register_fixed_rate(NULL, "pll5_clk", "osc_24m_clk", 0,
 507			48000000);
 508	clk_register_clkdev(clk, "pll5_clk", NULL);
 509
 510	clk = clk_register_fixed_rate(NULL, "pll6_clk", "osc_25m_clk", 0,
 511			25000000);
 512	clk_register_clkdev(clk, "pll6_clk", NULL);
 513
 514	/* vco div n clocks */
 515	clk = clk_register_fixed_factor(NULL, "vco1div2_clk", "vco1_clk", 0, 1,
 516			2);
 517	clk_register_clkdev(clk, "vco1div2_clk", NULL);
 518
 519	clk = clk_register_fixed_factor(NULL, "vco1div4_clk", "vco1_clk", 0, 1,
 520			4);
 521	clk_register_clkdev(clk, "vco1div4_clk", NULL);
 522
 523	clk = clk_register_fixed_factor(NULL, "vco2div2_clk", "vco2_clk", 0, 1,
 524			2);
 525	clk_register_clkdev(clk, "vco2div2_clk", NULL);
 526
 527	clk = clk_register_fixed_factor(NULL, "vco3div2_clk", "vco3_clk", 0, 1,
 528			2);
 529	clk_register_clkdev(clk, "vco3div2_clk", NULL);
 530
 531	/* peripherals */
 532	clk_register_fixed_factor(NULL, "thermal_clk", "osc_24m_clk", 0, 1,
 533			128);
 534	clk = clk_register_gate(NULL, "thermal_gclk", "thermal_clk", 0,
 535			SPEAR1340_PERIP2_CLK_ENB, SPEAR1340_THSENS_CLK_ENB, 0,
 536			&_lock);
 537	clk_register_clkdev(clk, NULL, "e07008c4.thermal");
 538
 539	/* clock derived from pll4 clk */
 540	clk = clk_register_fixed_factor(NULL, "ddr_clk", "pll4_clk", 0, 1,
 541			1);
 542	clk_register_clkdev(clk, "ddr_clk", NULL);
 543
 544	/* clock derived from pll1 clk */
 545	clk = clk_register_frac("sys_syn_clk", "vco1div2_clk", 0,
 546			SPEAR1340_SYS_CLK_SYNT, sys_synth_rtbl,
 547			ARRAY_SIZE(sys_synth_rtbl), &_lock);
 548	clk_register_clkdev(clk, "sys_syn_clk", NULL);
 549
 550	clk = clk_register_frac("amba_syn_clk", "vco1div2_clk", 0,
 551			SPEAR1340_AMBA_CLK_SYNT, amba_synth_rtbl,
 552			ARRAY_SIZE(amba_synth_rtbl), &_lock);
 553	clk_register_clkdev(clk, "amba_syn_clk", NULL);
 554
 555	clk = clk_register_mux(NULL, "sys_mclk", sys_parents,
 556			ARRAY_SIZE(sys_parents), CLK_SET_RATE_NO_REPARENT,
 557			SPEAR1340_SYS_CLK_CTRL, SPEAR1340_SCLK_SRC_SEL_SHIFT,
 558			SPEAR1340_SCLK_SRC_SEL_MASK, 0, &_lock);
 559	clk_register_clkdev(clk, "sys_mclk", NULL);
 560
 561	clk = clk_register_fixed_factor(NULL, "cpu_clk", "sys_mclk", 0, 1,
 562			2);
 563	clk_register_clkdev(clk, "cpu_clk", NULL);
 564
 565	clk = clk_register_fixed_factor(NULL, "cpu_div3_clk", "cpu_clk", 0, 1,
 566			3);
 567	clk_register_clkdev(clk, "cpu_div3_clk", NULL);
 568
 569	clk = clk_register_fixed_factor(NULL, "wdt_clk", "cpu_clk", 0, 1,
 570			2);
 571	clk_register_clkdev(clk, NULL, "ec800620.wdt");
 572
 573	clk = clk_register_fixed_factor(NULL, "smp_twd_clk", "cpu_clk", 0, 1,
 574			2);
 575	clk_register_clkdev(clk, NULL, "smp_twd");
 576
 577	clk = clk_register_mux(NULL, "ahb_clk", ahb_parents,
 578			ARRAY_SIZE(ahb_parents), CLK_SET_RATE_NO_REPARENT,
 579			SPEAR1340_SYS_CLK_CTRL, SPEAR1340_HCLK_SRC_SEL_SHIFT,
 580			SPEAR1340_HCLK_SRC_SEL_MASK, 0, &_lock);
 581	clk_register_clkdev(clk, "ahb_clk", NULL);
 582
 583	clk = clk_register_fixed_factor(NULL, "apb_clk", "ahb_clk", 0, 1,
 584			2);
 585	clk_register_clkdev(clk, "apb_clk", NULL);
 586
 587	/* gpt clocks */
 588	clk = clk_register_mux(NULL, "gpt0_mclk", gpt_parents,
 589			ARRAY_SIZE(gpt_parents), CLK_SET_RATE_NO_REPARENT,
 590			SPEAR1340_PERIP_CLK_CFG, SPEAR1340_GPT0_CLK_SHIFT,
 591			SPEAR1340_GPT_CLK_MASK, 0, &_lock);
 592	clk_register_clkdev(clk, "gpt0_mclk", NULL);
 593	clk = clk_register_gate(NULL, "gpt0_clk", "gpt0_mclk", 0,
 594			SPEAR1340_PERIP1_CLK_ENB, SPEAR1340_GPT0_CLK_ENB, 0,
 595			&_lock);
 596	clk_register_clkdev(clk, NULL, "gpt0");
 597
 598	clk = clk_register_mux(NULL, "gpt1_mclk", gpt_parents,
 599			ARRAY_SIZE(gpt_parents), CLK_SET_RATE_NO_REPARENT,
 600			SPEAR1340_PERIP_CLK_CFG, SPEAR1340_GPT1_CLK_SHIFT,
 601			SPEAR1340_GPT_CLK_MASK, 0, &_lock);
 602	clk_register_clkdev(clk, "gpt1_mclk", NULL);
 603	clk = clk_register_gate(NULL, "gpt1_clk", "gpt1_mclk", 0,
 604			SPEAR1340_PERIP1_CLK_ENB, SPEAR1340_GPT1_CLK_ENB, 0,
 605			&_lock);
 606	clk_register_clkdev(clk, NULL, "gpt1");
 607
 608	clk = clk_register_mux(NULL, "gpt2_mclk", gpt_parents,
 609			ARRAY_SIZE(gpt_parents), CLK_SET_RATE_NO_REPARENT,
 610			SPEAR1340_PERIP_CLK_CFG, SPEAR1340_GPT2_CLK_SHIFT,
 611			SPEAR1340_GPT_CLK_MASK, 0, &_lock);
 612	clk_register_clkdev(clk, "gpt2_mclk", NULL);
 613	clk = clk_register_gate(NULL, "gpt2_clk", "gpt2_mclk", 0,
 614			SPEAR1340_PERIP2_CLK_ENB, SPEAR1340_GPT2_CLK_ENB, 0,
 615			&_lock);
 616	clk_register_clkdev(clk, NULL, "gpt2");
 617
 618	clk = clk_register_mux(NULL, "gpt3_mclk", gpt_parents,
 619			ARRAY_SIZE(gpt_parents), CLK_SET_RATE_NO_REPARENT,
 620			SPEAR1340_PERIP_CLK_CFG, SPEAR1340_GPT3_CLK_SHIFT,
 621			SPEAR1340_GPT_CLK_MASK, 0, &_lock);
 622	clk_register_clkdev(clk, "gpt3_mclk", NULL);
 623	clk = clk_register_gate(NULL, "gpt3_clk", "gpt3_mclk", 0,
 624			SPEAR1340_PERIP2_CLK_ENB, SPEAR1340_GPT3_CLK_ENB, 0,
 625			&_lock);
 626	clk_register_clkdev(clk, NULL, "gpt3");
 627
 628	/* others */
 629	clk = clk_register_aux("uart0_syn_clk", "uart0_syn_gclk",
 630			"vco1div2_clk", 0, SPEAR1340_UART0_CLK_SYNT, NULL,
 631			aux_rtbl, ARRAY_SIZE(aux_rtbl), &_lock, &clk1);
 632	clk_register_clkdev(clk, "uart0_syn_clk", NULL);
 633	clk_register_clkdev(clk1, "uart0_syn_gclk", NULL);
 634
 635	clk = clk_register_mux(NULL, "uart0_mclk", uart0_parents,
 636			ARRAY_SIZE(uart0_parents),
 637			CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT,
 638			SPEAR1340_PERIP_CLK_CFG, SPEAR1340_UART0_CLK_SHIFT,
 639			SPEAR1340_UART_CLK_MASK, 0, &_lock);
 640	clk_register_clkdev(clk, "uart0_mclk", NULL);
 641
 642	clk = clk_register_gate(NULL, "uart0_clk", "uart0_mclk",
 643			CLK_SET_RATE_PARENT, SPEAR1340_PERIP1_CLK_ENB,
 644			SPEAR1340_UART0_CLK_ENB, 0, &_lock);
 645	clk_register_clkdev(clk, NULL, "e0000000.serial");
 646
 647	clk = clk_register_aux("uart1_syn_clk", "uart1_syn_gclk",
 648			"vco1div2_clk", 0, SPEAR1340_UART1_CLK_SYNT, NULL,
 649			aux_rtbl, ARRAY_SIZE(aux_rtbl), &_lock, &clk1);
 650	clk_register_clkdev(clk, "uart1_syn_clk", NULL);
 651	clk_register_clkdev(clk1, "uart1_syn_gclk", NULL);
 652
 653	clk = clk_register_mux(NULL, "uart1_mclk", uart1_parents,
 654			ARRAY_SIZE(uart1_parents), CLK_SET_RATE_NO_REPARENT,
 655			SPEAR1340_PERIP_CLK_CFG, SPEAR1340_UART1_CLK_SHIFT,
 656			SPEAR1340_UART_CLK_MASK, 0, &_lock);
 657	clk_register_clkdev(clk, "uart1_mclk", NULL);
 658
 659	clk = clk_register_gate(NULL, "uart1_clk", "uart1_mclk", 0,
 660			SPEAR1340_PERIP3_CLK_ENB, SPEAR1340_UART1_CLK_ENB, 0,
 661			&_lock);
 662	clk_register_clkdev(clk, NULL, "b4100000.serial");
 663
 664	clk = clk_register_aux("sdhci_syn_clk", "sdhci_syn_gclk",
 665			"vco1div2_clk", 0, SPEAR1340_SDHCI_CLK_SYNT, NULL,
 666			aux_rtbl, ARRAY_SIZE(aux_rtbl), &_lock, &clk1);
 667	clk_register_clkdev(clk, "sdhci_syn_clk", NULL);
 668	clk_register_clkdev(clk1, "sdhci_syn_gclk", NULL);
 669
 670	clk = clk_register_gate(NULL, "sdhci_clk", "sdhci_syn_gclk",
 671			CLK_SET_RATE_PARENT, SPEAR1340_PERIP1_CLK_ENB,
 672			SPEAR1340_SDHCI_CLK_ENB, 0, &_lock);
 673	clk_register_clkdev(clk, NULL, "b3000000.sdhci");
 674
 675	clk = clk_register_aux("cfxd_syn_clk", "cfxd_syn_gclk", "vco1div2_clk",
 676			0, SPEAR1340_CFXD_CLK_SYNT, NULL, aux_rtbl,
 677			ARRAY_SIZE(aux_rtbl), &_lock, &clk1);
 678	clk_register_clkdev(clk, "cfxd_syn_clk", NULL);
 679	clk_register_clkdev(clk1, "cfxd_syn_gclk", NULL);
 680
 681	clk = clk_register_gate(NULL, "cfxd_clk", "cfxd_syn_gclk",
 682			CLK_SET_RATE_PARENT, SPEAR1340_PERIP1_CLK_ENB,
 683			SPEAR1340_CFXD_CLK_ENB, 0, &_lock);
 684	clk_register_clkdev(clk, NULL, "b2800000.cf");
 685	clk_register_clkdev(clk, NULL, "arasan_xd");
 686
 687	clk = clk_register_aux("c3_syn_clk", "c3_syn_gclk", "vco1div2_clk", 0,
 688			SPEAR1340_C3_CLK_SYNT, NULL, aux_rtbl,
 689			ARRAY_SIZE(aux_rtbl), &_lock, &clk1);
 690	clk_register_clkdev(clk, "c3_syn_clk", NULL);
 691	clk_register_clkdev(clk1, "c3_syn_gclk", NULL);
 692
 693	clk = clk_register_mux(NULL, "c3_mclk", c3_parents,
 694			ARRAY_SIZE(c3_parents),
 695			CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT,
 696			SPEAR1340_PERIP_CLK_CFG, SPEAR1340_C3_CLK_SHIFT,
 697			SPEAR1340_C3_CLK_MASK, 0, &_lock);
 698	clk_register_clkdev(clk, "c3_mclk", NULL);
 699
 700	clk = clk_register_gate(NULL, "c3_clk", "c3_mclk", CLK_SET_RATE_PARENT,
 701			SPEAR1340_PERIP1_CLK_ENB, SPEAR1340_C3_CLK_ENB, 0,
 702			&_lock);
 703	clk_register_clkdev(clk, NULL, "e1800000.c3");
 704
 705	/* gmac */
 706	clk = clk_register_mux(NULL, "phy_input_mclk", gmac_phy_input_parents,
 707			ARRAY_SIZE(gmac_phy_input_parents),
 708			CLK_SET_RATE_NO_REPARENT, SPEAR1340_GMAC_CLK_CFG,
 709			SPEAR1340_GMAC_PHY_INPUT_CLK_SHIFT,
 710			SPEAR1340_GMAC_PHY_INPUT_CLK_MASK, 0, &_lock);
 711	clk_register_clkdev(clk, "phy_input_mclk", NULL);
 712
 713	clk = clk_register_aux("phy_syn_clk", "phy_syn_gclk", "phy_input_mclk",
 714			0, SPEAR1340_GMAC_CLK_SYNT, NULL, gmac_rtbl,
 715			ARRAY_SIZE(gmac_rtbl), &_lock, &clk1);
 716	clk_register_clkdev(clk, "phy_syn_clk", NULL);
 717	clk_register_clkdev(clk1, "phy_syn_gclk", NULL);
 718
 719	clk = clk_register_mux(NULL, "phy_mclk", gmac_phy_parents,
 720			ARRAY_SIZE(gmac_phy_parents), CLK_SET_RATE_NO_REPARENT,
 721			SPEAR1340_PERIP_CLK_CFG, SPEAR1340_GMAC_PHY_CLK_SHIFT,
 722			SPEAR1340_GMAC_PHY_CLK_MASK, 0, &_lock);
 723	clk_register_clkdev(clk, "stmmacphy.0", NULL);
 724
 725	/* clcd */
 726	clk = clk_register_mux(NULL, "clcd_syn_mclk", clcd_synth_parents,
 727			ARRAY_SIZE(clcd_synth_parents),
 728			CLK_SET_RATE_NO_REPARENT, SPEAR1340_CLCD_CLK_SYNT,
 729			SPEAR1340_CLCD_SYNT_CLK_SHIFT,
 730			SPEAR1340_CLCD_SYNT_CLK_MASK, 0, &_lock);
 731	clk_register_clkdev(clk, "clcd_syn_mclk", NULL);
 732
 733	clk = clk_register_frac("clcd_syn_clk", "clcd_syn_mclk", 0,
 734			SPEAR1340_CLCD_CLK_SYNT, clcd_rtbl,
 735			ARRAY_SIZE(clcd_rtbl), &_lock);
 736	clk_register_clkdev(clk, "clcd_syn_clk", NULL);
 737
 738	clk = clk_register_mux(NULL, "clcd_pixel_mclk", clcd_pixel_parents,
 739			ARRAY_SIZE(clcd_pixel_parents),
 740			CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT,
 741			SPEAR1340_PERIP_CLK_CFG, SPEAR1340_CLCD_CLK_SHIFT,
 742			SPEAR1340_CLCD_CLK_MASK, 0, &_lock);
 743	clk_register_clkdev(clk, "clcd_pixel_mclk", NULL);
 744
 745	clk = clk_register_gate(NULL, "clcd_clk", "clcd_pixel_mclk", 0,
 746			SPEAR1340_PERIP1_CLK_ENB, SPEAR1340_CLCD_CLK_ENB, 0,
 747			&_lock);
 748	clk_register_clkdev(clk, NULL, "e1000000.clcd");
 749
 750	/* i2s */
 751	clk = clk_register_mux(NULL, "i2s_src_mclk", i2s_src_parents,
 752			ARRAY_SIZE(i2s_src_parents), CLK_SET_RATE_NO_REPARENT,
 753			SPEAR1340_I2S_CLK_CFG, SPEAR1340_I2S_SRC_CLK_SHIFT,
 754			SPEAR1340_I2S_SRC_CLK_MASK, 0, &_lock);
 755	clk_register_clkdev(clk, "i2s_src_mclk", NULL);
 756
 757	clk = clk_register_aux("i2s_prs1_clk", NULL, "i2s_src_mclk",
 758			CLK_SET_RATE_PARENT, SPEAR1340_I2S_CLK_CFG,
 759			&i2s_prs1_masks, i2s_prs1_rtbl,
 760			ARRAY_SIZE(i2s_prs1_rtbl), &_lock, NULL);
 761	clk_register_clkdev(clk, "i2s_prs1_clk", NULL);
 762
 763	clk = clk_register_mux(NULL, "i2s_ref_mclk", i2s_ref_parents,
 764			ARRAY_SIZE(i2s_ref_parents),
 765			CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT,
 766			SPEAR1340_I2S_CLK_CFG, SPEAR1340_I2S_REF_SHIFT,
 767			SPEAR1340_I2S_REF_SEL_MASK, 0, &_lock);
 768	clk_register_clkdev(clk, "i2s_ref_mclk", NULL);
 769
 770	clk = clk_register_gate(NULL, "i2s_ref_pad_clk", "i2s_ref_mclk", 0,
 771			SPEAR1340_PERIP2_CLK_ENB, SPEAR1340_I2S_REF_PAD_CLK_ENB,
 772			0, &_lock);
 773	clk_register_clkdev(clk, "i2s_ref_pad_clk", NULL);
 774
 775	clk = clk_register_aux("i2s_sclk_clk", "i2s_sclk_gclk", "i2s_ref_mclk",
 776			0, SPEAR1340_I2S_CLK_CFG, &i2s_sclk_masks,
 777			i2s_sclk_rtbl, ARRAY_SIZE(i2s_sclk_rtbl), &_lock,
 778			&clk1);
 779	clk_register_clkdev(clk, "i2s_sclk_clk", NULL);
 780	clk_register_clkdev(clk1, "i2s_sclk_gclk", NULL);
 781
 782	/* clock derived from ahb clk */
 783	clk = clk_register_gate(NULL, "i2c0_clk", "ahb_clk", 0,
 784			SPEAR1340_PERIP1_CLK_ENB, SPEAR1340_I2C0_CLK_ENB, 0,
 785			&_lock);
 786	clk_register_clkdev(clk, NULL, "e0280000.i2c");
 787
 788	clk = clk_register_gate(NULL, "i2c1_clk", "ahb_clk", 0,
 789			SPEAR1340_PERIP3_CLK_ENB, SPEAR1340_I2C1_CLK_ENB, 0,
 790			&_lock);
 791	clk_register_clkdev(clk, NULL, "b4000000.i2c");
 792
 793	clk = clk_register_gate(NULL, "dma_clk", "ahb_clk", 0,
 794			SPEAR1340_PERIP1_CLK_ENB, SPEAR1340_DMA_CLK_ENB, 0,
 795			&_lock);
 796	clk_register_clkdev(clk, NULL, "ea800000.dma");
 797	clk_register_clkdev(clk, NULL, "eb000000.dma");
 798
 799	clk = clk_register_gate(NULL, "gmac_clk", "ahb_clk", 0,
 800			SPEAR1340_PERIP1_CLK_ENB, SPEAR1340_GMAC_CLK_ENB, 0,
 801			&_lock);
 802	clk_register_clkdev(clk, NULL, "e2000000.eth");
 803
 804	clk = clk_register_gate(NULL, "fsmc_clk", "ahb_clk", 0,
 805			SPEAR1340_PERIP1_CLK_ENB, SPEAR1340_FSMC_CLK_ENB, 0,
 806			&_lock);
 807	clk_register_clkdev(clk, NULL, "b0000000.flash");
 808
 809	clk = clk_register_gate(NULL, "smi_clk", "ahb_clk", 0,
 810			SPEAR1340_PERIP1_CLK_ENB, SPEAR1340_SMI_CLK_ENB, 0,
 811			&_lock);
 812	clk_register_clkdev(clk, NULL, "ea000000.flash");
 813
 814	clk = clk_register_gate(NULL, "usbh0_clk", "ahb_clk", 0,
 815			SPEAR1340_PERIP1_CLK_ENB, SPEAR1340_UHC0_CLK_ENB, 0,
 816			&_lock);
 817	clk_register_clkdev(clk, NULL, "e4000000.ohci");
 818	clk_register_clkdev(clk, NULL, "e4800000.ehci");
 819
 820	clk = clk_register_gate(NULL, "usbh1_clk", "ahb_clk", 0,
 821			SPEAR1340_PERIP1_CLK_ENB, SPEAR1340_UHC1_CLK_ENB, 0,
 822			&_lock);
 823	clk_register_clkdev(clk, NULL, "e5000000.ohci");
 824	clk_register_clkdev(clk, NULL, "e5800000.ehci");
 825
 826	clk = clk_register_gate(NULL, "uoc_clk", "ahb_clk", 0,
 827			SPEAR1340_PERIP1_CLK_ENB, SPEAR1340_UOC_CLK_ENB, 0,
 828			&_lock);
 829	clk_register_clkdev(clk, NULL, "e3800000.otg");
 830
 831	clk = clk_register_gate(NULL, "pcie_sata_clk", "ahb_clk", 0,
 832			SPEAR1340_PERIP1_CLK_ENB, SPEAR1340_PCIE_SATA_CLK_ENB,
 833			0, &_lock);
 834	clk_register_clkdev(clk, NULL, "b1000000.pcie");
 835	clk_register_clkdev(clk, NULL, "b1000000.ahci");
 836
 837	clk = clk_register_gate(NULL, "sysram0_clk", "ahb_clk", 0,
 838			SPEAR1340_PERIP1_CLK_ENB, SPEAR1340_SYSRAM0_CLK_ENB, 0,
 839			&_lock);
 840	clk_register_clkdev(clk, "sysram0_clk", NULL);
 841
 842	clk = clk_register_gate(NULL, "sysram1_clk", "ahb_clk", 0,
 843			SPEAR1340_PERIP1_CLK_ENB, SPEAR1340_SYSRAM1_CLK_ENB, 0,
 844			&_lock);
 845	clk_register_clkdev(clk, "sysram1_clk", NULL);
 846
 847	clk = clk_register_aux("adc_syn_clk", "adc_syn_gclk", "ahb_clk",
 848			0, SPEAR1340_ADC_CLK_SYNT, NULL, adc_rtbl,
 849			ARRAY_SIZE(adc_rtbl), &_lock, &clk1);
 850	clk_register_clkdev(clk, "adc_syn_clk", NULL);
 851	clk_register_clkdev(clk1, "adc_syn_gclk", NULL);
 852
 853	clk = clk_register_gate(NULL, "adc_clk", "adc_syn_gclk",
 854			CLK_SET_RATE_PARENT, SPEAR1340_PERIP1_CLK_ENB,
 855			SPEAR1340_ADC_CLK_ENB, 0, &_lock);
 856	clk_register_clkdev(clk, NULL, "e0080000.adc");
 857
 858	/* clock derived from apb clk */
 859	clk = clk_register_gate(NULL, "ssp_clk", "apb_clk", 0,
 860			SPEAR1340_PERIP1_CLK_ENB, SPEAR1340_SSP_CLK_ENB, 0,
 861			&_lock);
 862	clk_register_clkdev(clk, NULL, "e0100000.spi");
 863
 864	clk = clk_register_gate(NULL, "gpio0_clk", "apb_clk", 0,
 865			SPEAR1340_PERIP1_CLK_ENB, SPEAR1340_GPIO0_CLK_ENB, 0,
 866			&_lock);
 867	clk_register_clkdev(clk, NULL, "e0600000.gpio");
 868
 869	clk = clk_register_gate(NULL, "gpio1_clk", "apb_clk", 0,
 870			SPEAR1340_PERIP1_CLK_ENB, SPEAR1340_GPIO1_CLK_ENB, 0,
 871			&_lock);
 872	clk_register_clkdev(clk, NULL, "e0680000.gpio");
 873
 874	clk = clk_register_gate(NULL, "i2s_play_clk", "apb_clk", 0,
 875			SPEAR1340_PERIP1_CLK_ENB, SPEAR1340_I2S_PLAY_CLK_ENB, 0,
 876			&_lock);
 877	clk_register_clkdev(clk, NULL, "b2400000.i2s-play");
 878
 879	clk = clk_register_gate(NULL, "i2s_rec_clk", "apb_clk", 0,
 880			SPEAR1340_PERIP1_CLK_ENB, SPEAR1340_I2S_REC_CLK_ENB, 0,
 881			&_lock);
 882	clk_register_clkdev(clk, NULL, "b2000000.i2s-rec");
 883
 884	clk = clk_register_gate(NULL, "kbd_clk", "apb_clk", 0,
 885			SPEAR1340_PERIP2_CLK_ENB, SPEAR1340_KBD_CLK_ENB, 0,
 886			&_lock);
 887	clk_register_clkdev(clk, NULL, "e0300000.kbd");
 888
 889	/* RAS clks */
 890	clk = clk_register_mux(NULL, "gen_syn0_1_mclk", gen_synth0_1_parents,
 891			ARRAY_SIZE(gen_synth0_1_parents),
 892			CLK_SET_RATE_NO_REPARENT, SPEAR1340_PLL_CFG,
 893			SPEAR1340_GEN_SYNT0_1_CLK_SHIFT,
 894			SPEAR1340_GEN_SYNT_CLK_MASK, 0, &_lock);
 895	clk_register_clkdev(clk, "gen_syn0_1_mclk", NULL);
 896
 897	clk = clk_register_mux(NULL, "gen_syn2_3_mclk", gen_synth2_3_parents,
 898			ARRAY_SIZE(gen_synth2_3_parents),
 899			CLK_SET_RATE_NO_REPARENT, SPEAR1340_PLL_CFG,
 900			SPEAR1340_GEN_SYNT2_3_CLK_SHIFT,
 901			SPEAR1340_GEN_SYNT_CLK_MASK, 0, &_lock);
 902	clk_register_clkdev(clk, "gen_syn2_3_mclk", NULL);
 903
 904	clk = clk_register_frac("gen_syn0_clk", "gen_syn0_1_mclk", 0,
 905			SPEAR1340_GEN_CLK_SYNT0, gen_rtbl, ARRAY_SIZE(gen_rtbl),
 906			&_lock);
 907	clk_register_clkdev(clk, "gen_syn0_clk", NULL);
 908
 909	clk = clk_register_frac("gen_syn1_clk", "gen_syn0_1_mclk", 0,
 910			SPEAR1340_GEN_CLK_SYNT1, gen_rtbl, ARRAY_SIZE(gen_rtbl),
 911			&_lock);
 912	clk_register_clkdev(clk, "gen_syn1_clk", NULL);
 913
 914	clk = clk_register_frac("gen_syn2_clk", "gen_syn2_3_mclk", 0,
 915			SPEAR1340_GEN_CLK_SYNT2, gen_rtbl, ARRAY_SIZE(gen_rtbl),
 916			&_lock);
 917	clk_register_clkdev(clk, "gen_syn2_clk", NULL);
 918
 919	clk = clk_register_frac("gen_syn3_clk", "gen_syn2_3_mclk", 0,
 920			SPEAR1340_GEN_CLK_SYNT3, gen_rtbl, ARRAY_SIZE(gen_rtbl),
 921			&_lock);
 922	clk_register_clkdev(clk, "gen_syn3_clk", NULL);
 923
 924	clk = clk_register_gate(NULL, "mali_clk", "gen_syn3_clk",
 925			CLK_SET_RATE_PARENT, SPEAR1340_PERIP3_CLK_ENB,
 926			SPEAR1340_MALI_CLK_ENB, 0, &_lock);
 927	clk_register_clkdev(clk, NULL, "mali");
 928
 929	clk = clk_register_gate(NULL, "cec0_clk", "ahb_clk", 0,
 930			SPEAR1340_PERIP3_CLK_ENB, SPEAR1340_CEC0_CLK_ENB, 0,
 931			&_lock);
 932	clk_register_clkdev(clk, NULL, "spear_cec.0");
 933
 934	clk = clk_register_gate(NULL, "cec1_clk", "ahb_clk", 0,
 935			SPEAR1340_PERIP3_CLK_ENB, SPEAR1340_CEC1_CLK_ENB, 0,
 936			&_lock);
 937	clk_register_clkdev(clk, NULL, "spear_cec.1");
 938
 939	clk = clk_register_mux(NULL, "spdif_out_mclk", spdif_out_parents,
 940			ARRAY_SIZE(spdif_out_parents),
 941			CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT,
 942			SPEAR1340_PERIP_CLK_CFG, SPEAR1340_SPDIF_OUT_CLK_SHIFT,
 943			SPEAR1340_SPDIF_CLK_MASK, 0, &_lock);
 944	clk_register_clkdev(clk, "spdif_out_mclk", NULL);
 945
 946	clk = clk_register_gate(NULL, "spdif_out_clk", "spdif_out_mclk",
 947			CLK_SET_RATE_PARENT, SPEAR1340_PERIP3_CLK_ENB,
 948			SPEAR1340_SPDIF_OUT_CLK_ENB, 0, &_lock);
 949	clk_register_clkdev(clk, NULL, "d0000000.spdif-out");
 950
 951	clk = clk_register_mux(NULL, "spdif_in_mclk", spdif_in_parents,
 952			ARRAY_SIZE(spdif_in_parents),
 953			CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT,
 954			SPEAR1340_PERIP_CLK_CFG, SPEAR1340_SPDIF_IN_CLK_SHIFT,
 955			SPEAR1340_SPDIF_CLK_MASK, 0, &_lock);
 956	clk_register_clkdev(clk, "spdif_in_mclk", NULL);
 957
 958	clk = clk_register_gate(NULL, "spdif_in_clk", "spdif_in_mclk",
 959			CLK_SET_RATE_PARENT, SPEAR1340_PERIP3_CLK_ENB,
 960			SPEAR1340_SPDIF_IN_CLK_ENB, 0, &_lock);
 961	clk_register_clkdev(clk, NULL, "d0100000.spdif-in");
 962
 963	clk = clk_register_gate(NULL, "acp_clk", "ahb_clk", 0,
 964			SPEAR1340_PERIP2_CLK_ENB, SPEAR1340_ACP_CLK_ENB, 0,
 965			&_lock);
 966	clk_register_clkdev(clk, NULL, "acp_clk");
 967
 968	clk = clk_register_gate(NULL, "plgpio_clk", "ahb_clk", 0,
 969			SPEAR1340_PERIP3_CLK_ENB, SPEAR1340_PLGPIO_CLK_ENB, 0,
 970			&_lock);
 971	clk_register_clkdev(clk, NULL, "e2800000.gpio");
 972
 973	clk = clk_register_gate(NULL, "video_dec_clk", "ahb_clk", 0,
 974			SPEAR1340_PERIP3_CLK_ENB, SPEAR1340_VIDEO_DEC_CLK_ENB,
 975			0, &_lock);
 976	clk_register_clkdev(clk, NULL, "video_dec");
 977
 978	clk = clk_register_gate(NULL, "video_enc_clk", "ahb_clk", 0,
 979			SPEAR1340_PERIP3_CLK_ENB, SPEAR1340_VIDEO_ENC_CLK_ENB,
 980			0, &_lock);
 981	clk_register_clkdev(clk, NULL, "video_enc");
 982
 983	clk = clk_register_gate(NULL, "video_in_clk", "ahb_clk", 0,
 984			SPEAR1340_PERIP3_CLK_ENB, SPEAR1340_VIDEO_IN_CLK_ENB, 0,
 985			&_lock);
 986	clk_register_clkdev(clk, NULL, "spear_vip");
 987
 988	clk = clk_register_gate(NULL, "cam0_clk", "ahb_clk", 0,
 989			SPEAR1340_PERIP3_CLK_ENB, SPEAR1340_CAM0_CLK_ENB, 0,
 990			&_lock);
 991	clk_register_clkdev(clk, NULL, "d0200000.cam0");
 992
 993	clk = clk_register_gate(NULL, "cam1_clk", "ahb_clk", 0,
 994			SPEAR1340_PERIP3_CLK_ENB, SPEAR1340_CAM1_CLK_ENB, 0,
 995			&_lock);
 996	clk_register_clkdev(clk, NULL, "d0300000.cam1");
 997
 998	clk = clk_register_gate(NULL, "cam2_clk", "ahb_clk", 0,
 999			SPEAR1340_PERIP3_CLK_ENB, SPEAR1340_CAM2_CLK_ENB, 0,
1000			&_lock);
1001	clk_register_clkdev(clk, NULL, "d0400000.cam2");
1002
1003	clk = clk_register_gate(NULL, "cam3_clk", "ahb_clk", 0,
1004			SPEAR1340_PERIP3_CLK_ENB, SPEAR1340_CAM3_CLK_ENB, 0,
1005			&_lock);
1006	clk_register_clkdev(clk, NULL, "d0500000.cam3");
1007
1008	clk = clk_register_gate(NULL, "pwm_clk", "ahb_clk", 0,
1009			SPEAR1340_PERIP3_CLK_ENB, SPEAR1340_PWM_CLK_ENB, 0,
1010			&_lock);
1011	clk_register_clkdev(clk, NULL, "e0180000.pwm");
1012}
~/ Read-only file preview.