Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.1.
   1/*
   2 * common clks module for all SiRF SoCs
   3 *
   4 * Copyright (c) 2011 - 2014 Cambridge Silicon Radio Limited, a CSR plc group
   5 * company.
   6 *
   7 * Licensed under GPLv2 or later.
   8 */
   9
  10#define KHZ     1000
  11#define MHZ     (KHZ * KHZ)
  12
  13static void *sirfsoc_clk_vbase;
  14static void *sirfsoc_rsc_vbase;
  15static struct clk_onecell_data clk_data;
  16
  17/*
  18 * SiRFprimaII clock controller
  19 * - 2 oscillators: osc-26MHz, rtc-32.768KHz
  20 * - 3 standard configurable plls: pll1, pll2 & pll3
  21 * - 2 exclusive plls: usb phy pll and sata phy pll
  22 * - 8 clock domains: cpu/cpudiv, mem/memdiv, sys/io, dsp, graphic, multimedia,
  23 *     display and sdphy.
  24 *     Each clock domain can select its own clock source from five clock sources,
  25 *     X_XIN, X_XINW, PLL1, PLL2 and PLL3. The domain clock is used as the source
  26 *     clock of the group clock.
  27 *     - dsp domain: gps, mf
  28 *     - io domain: dmac, nand, audio, uart, i2c, spi, usp, pwm, pulse
  29 *     - sys domain: security
  30 */
  31
  32struct clk_pll {
  33	struct clk_hw hw;
  34	unsigned short regofs;  /* register offset */
  35};
  36
  37#define to_pllclk(_hw) container_of(_hw, struct clk_pll, hw)
  38
  39struct clk_dmn {
  40	struct clk_hw hw;
  41	signed char enable_bit; /* enable bit: 0 ~ 63 */
  42	unsigned short regofs;  /* register offset */
  43};
  44
  45#define to_dmnclk(_hw) container_of(_hw, struct clk_dmn, hw)
  46
  47struct clk_std {
  48	struct clk_hw hw;
  49	signed char enable_bit; /* enable bit: 0 ~ 63 */
  50};
  51
  52#define to_stdclk(_hw) container_of(_hw, struct clk_std, hw)
  53
  54static int std_clk_is_enabled(struct clk_hw *hw);
  55static int std_clk_enable(struct clk_hw *hw);
  56static void std_clk_disable(struct clk_hw *hw);
  57
  58static inline unsigned long clkc_readl(unsigned reg)
  59{
  60	return readl(sirfsoc_clk_vbase + reg);
  61}
  62
  63static inline void clkc_writel(u32 val, unsigned reg)
  64{
  65	writel(val, sirfsoc_clk_vbase + reg);
  66}
  67
  68/*
  69 * std pll
  70 */
  71
  72static unsigned long pll_clk_recalc_rate(struct clk_hw *hw,
  73	unsigned long parent_rate)
  74{
  75	unsigned long fin = parent_rate;
  76	struct clk_pll *clk = to_pllclk(hw);
  77	u32 regcfg2 = clk->regofs + SIRFSOC_CLKC_PLL1_CFG2 -
  78		SIRFSOC_CLKC_PLL1_CFG0;
  79
  80	if (clkc_readl(regcfg2) & BIT(2)) {
  81		/* pll bypass mode */
  82		return fin;
  83	} else {
  84		/* fout = fin * nf / nr / od */
  85		u32 cfg0 = clkc_readl(clk->regofs);
  86		u32 nf = (cfg0 & (BIT(13) - 1)) + 1;
  87		u32 nr = ((cfg0 >> 13) & (BIT(6) - 1)) + 1;
  88		u32 od = ((cfg0 >> 19) & (BIT(4) - 1)) + 1;
  89		WARN_ON(fin % MHZ);
  90		return fin / MHZ * nf / nr / od * MHZ;
  91	}
  92}
  93
  94static long pll_clk_round_rate(struct clk_hw *hw, unsigned long rate,
  95	unsigned long *parent_rate)
  96{
  97	unsigned long fin, nf, nr, od;
  98	u64 dividend;
  99
 100	/*
 101	 * fout = fin * nf / (nr * od);
 102	 * set od = 1, nr = fin/MHz, so fout = nf * MHz
 103	 */
 104	rate = rate - rate % MHZ;
 105
 106	nf = rate / MHZ;
 107	if (nf > BIT(13))
 108		nf = BIT(13);
 109	if (nf < 1)
 110		nf = 1;
 111
 112	fin = *parent_rate;
 113
 114	nr = fin / MHZ;
 115	if (nr > BIT(6))
 116		nr = BIT(6);
 117	od = 1;
 118
 119	dividend = (u64)fin * nf;
 120	do_div(dividend, nr * od);
 121
 122	return (long)dividend;
 123}
 124
 125static int pll_clk_set_rate(struct clk_hw *hw, unsigned long rate,
 126	unsigned long parent_rate)
 127{
 128	struct clk_pll *clk = to_pllclk(hw);
 129	unsigned long fin, nf, nr, od, reg;
 130
 131	/*
 132	 * fout = fin * nf / (nr * od);
 133	 * set od = 1, nr = fin/MHz, so fout = nf * MHz
 134	 */
 135
 136	nf = rate / MHZ;
 137	if (unlikely((rate % MHZ) || nf > BIT(13) || nf < 1))
 138		return -EINVAL;
 139
 140	fin = parent_rate;
 141	BUG_ON(fin < MHZ);
 142
 143	nr = fin / MHZ;
 144	BUG_ON((fin % MHZ) || nr > BIT(6));
 145
 146	od = 1;
 147
 148	reg = (nf - 1) | ((nr - 1) << 13) | ((od - 1) << 19);
 149	clkc_writel(reg, clk->regofs);
 150
 151	reg = clk->regofs + SIRFSOC_CLKC_PLL1_CFG1 - SIRFSOC_CLKC_PLL1_CFG0;
 152	clkc_writel((nf >> 1) - 1, reg);
 153
 154	reg = clk->regofs + SIRFSOC_CLKC_PLL1_CFG2 - SIRFSOC_CLKC_PLL1_CFG0;
 155	while (!(clkc_readl(reg) & BIT(6)))
 156		cpu_relax();
 157
 158	return 0;
 159}
 160
 161static long cpu_clk_round_rate(struct clk_hw *hw, unsigned long rate,
 162	unsigned long *parent_rate)
 163{
 164	/*
 165	 * SiRF SoC has not cpu clock control,
 166	 * So bypass to it's parent pll.
 167	 */
 168	struct clk *parent_clk = clk_get_parent(hw->clk);
 169	struct clk *pll_parent_clk = clk_get_parent(parent_clk);
 170	unsigned long pll_parent_rate = clk_get_rate(pll_parent_clk);
 171	return pll_clk_round_rate(__clk_get_hw(parent_clk), rate, &pll_parent_rate);
 172}
 173
 174static unsigned long cpu_clk_recalc_rate(struct clk_hw *hw,
 175	unsigned long parent_rate)
 176{
 177	/*
 178	 * SiRF SoC has not cpu clock control,
 179	 * So return the parent pll rate.
 180	 */
 181	struct clk *parent_clk = clk_get_parent(hw->clk);
 182	return __clk_get_rate(parent_clk);
 183}
 184
 185static struct clk_ops std_pll_ops = {
 186	.recalc_rate = pll_clk_recalc_rate,
 187	.round_rate = pll_clk_round_rate,
 188	.set_rate = pll_clk_set_rate,
 189};
 190
 191static const char *pll_clk_parents[] = {
 192	"osc",
 193};
 194
 195static struct clk_init_data clk_pll1_init = {
 196	.name = "pll1",
 197	.ops = &std_pll_ops,
 198	.parent_names = pll_clk_parents,
 199	.num_parents = ARRAY_SIZE(pll_clk_parents),
 200};
 201
 202static struct clk_init_data clk_pll2_init = {
 203	.name = "pll2",
 204	.ops = &std_pll_ops,
 205	.parent_names = pll_clk_parents,
 206	.num_parents = ARRAY_SIZE(pll_clk_parents),
 207};
 208
 209static struct clk_init_data clk_pll3_init = {
 210	.name = "pll3",
 211	.ops = &std_pll_ops,
 212	.parent_names = pll_clk_parents,
 213	.num_parents = ARRAY_SIZE(pll_clk_parents),
 214};
 215
 216static struct clk_pll clk_pll1 = {
 217	.regofs = SIRFSOC_CLKC_PLL1_CFG0,
 218	.hw = {
 219		.init = &clk_pll1_init,
 220	},
 221};
 222
 223static struct clk_pll clk_pll2 = {
 224	.regofs = SIRFSOC_CLKC_PLL2_CFG0,
 225	.hw = {
 226		.init = &clk_pll2_init,
 227	},
 228};
 229
 230static struct clk_pll clk_pll3 = {
 231	.regofs = SIRFSOC_CLKC_PLL3_CFG0,
 232	.hw = {
 233		.init = &clk_pll3_init,
 234	},
 235};
 236
 237/*
 238 * usb uses specified pll
 239 */
 240
 241static int usb_pll_clk_enable(struct clk_hw *hw)
 242{
 243	u32 reg = readl(sirfsoc_rsc_vbase + SIRFSOC_USBPHY_PLL_CTRL);
 244	reg &= ~(SIRFSOC_USBPHY_PLL_POWERDOWN | SIRFSOC_USBPHY_PLL_BYPASS);
 245	writel(reg, sirfsoc_rsc_vbase + SIRFSOC_USBPHY_PLL_CTRL);
 246	while (!(readl(sirfsoc_rsc_vbase + SIRFSOC_USBPHY_PLL_CTRL) &
 247			SIRFSOC_USBPHY_PLL_LOCK))
 248		cpu_relax();
 249
 250	return 0;
 251}
 252
 253static void usb_pll_clk_disable(struct clk_hw *clk)
 254{
 255	u32 reg = readl(sirfsoc_rsc_vbase + SIRFSOC_USBPHY_PLL_CTRL);
 256	reg |= (SIRFSOC_USBPHY_PLL_POWERDOWN | SIRFSOC_USBPHY_PLL_BYPASS);
 257	writel(reg, sirfsoc_rsc_vbase + SIRFSOC_USBPHY_PLL_CTRL);
 258}
 259
 260static unsigned long usb_pll_clk_recalc_rate(struct clk_hw *hw, unsigned long parent_rate)
 261{
 262	u32 reg = readl(sirfsoc_rsc_vbase + SIRFSOC_USBPHY_PLL_CTRL);
 263	return (reg & SIRFSOC_USBPHY_PLL_BYPASS) ? parent_rate : 48*MHZ;
 264}
 265
 266static struct clk_ops usb_pll_ops = {
 267	.enable = usb_pll_clk_enable,
 268	.disable = usb_pll_clk_disable,
 269	.recalc_rate = usb_pll_clk_recalc_rate,
 270};
 271
 272static struct clk_init_data clk_usb_pll_init = {
 273	.name = "usb_pll",
 274	.ops = &usb_pll_ops,
 275	.parent_names = pll_clk_parents,
 276	.num_parents = ARRAY_SIZE(pll_clk_parents),
 277};
 278
 279static struct clk_hw usb_pll_clk_hw = {
 280	.init = &clk_usb_pll_init,
 281};
 282
 283/*
 284 * clock domains - cpu, mem, sys/io, dsp, gfx
 285 */
 286
 287static const char *dmn_clk_parents[] = {
 288	"rtc",
 289	"osc",
 290	"pll1",
 291	"pll2",
 292	"pll3",
 293};
 294
 295static u8 dmn_clk_get_parent(struct clk_hw *hw)
 296{
 297	struct clk_dmn *clk = to_dmnclk(hw);
 298	u32 cfg = clkc_readl(clk->regofs);
 299
 300	/* parent of io domain can only be pll3 */
 301	if (strcmp(hw->init->name, "io") == 0)
 302		return 4;
 303
 304	WARN_ON((cfg & (BIT(3) - 1)) > 4);
 305
 306	return cfg & (BIT(3) - 1);
 307}
 308
 309static int dmn_clk_set_parent(struct clk_hw *hw, u8 parent)
 310{
 311	struct clk_dmn *clk = to_dmnclk(hw);
 312	u32 cfg = clkc_readl(clk->regofs);
 313
 314	/* parent of io domain can only be pll3 */
 315	if (strcmp(hw->init->name, "io") == 0)
 316		return -EINVAL;
 317
 318	cfg &= ~(BIT(3) - 1);
 319	clkc_writel(cfg | parent, clk->regofs);
 320	/* BIT(3) - switching status: 1 - busy, 0 - done */
 321	while (clkc_readl(clk->regofs) & BIT(3))
 322		cpu_relax();
 323
 324	return 0;
 325}
 326
 327static unsigned long dmn_clk_recalc_rate(struct clk_hw *hw,
 328	unsigned long parent_rate)
 329
 330{
 331	unsigned long fin = parent_rate;
 332	struct clk_dmn *clk = to_dmnclk(hw);
 333
 334	u32 cfg = clkc_readl(clk->regofs);
 335
 336	if (cfg & BIT(24)) {
 337		/* fcd bypass mode */
 338		return fin;
 339	} else {
 340		/*
 341		 * wait count: bit[19:16], hold count: bit[23:20]
 342		 */
 343		u32 wait = (cfg >> 16) & (BIT(4) - 1);
 344		u32 hold = (cfg >> 20) & (BIT(4) - 1);
 345
 346		return fin / (wait + hold + 2);
 347	}
 348}
 349
 350static long dmn_clk_round_rate(struct clk_hw *hw, unsigned long rate,
 351	unsigned long *parent_rate)
 352{
 353	unsigned long fin;
 354	unsigned ratio, wait, hold;
 355	unsigned bits = (strcmp(hw->init->name, "mem") == 0) ? 3 : 4;
 356
 357	fin = *parent_rate;
 358	ratio = fin / rate;
 359
 360	if (ratio < 2)
 361		ratio = 2;
 362	if (ratio > BIT(bits + 1))
 363		ratio = BIT(bits + 1);
 364
 365	wait = (ratio >> 1) - 1;
 366	hold = ratio - wait - 2;
 367
 368	return fin / (wait + hold + 2);
 369}
 370
 371static int dmn_clk_set_rate(struct clk_hw *hw, unsigned long rate,
 372	unsigned long parent_rate)
 373{
 374	struct clk_dmn *clk = to_dmnclk(hw);
 375	unsigned long fin;
 376	unsigned ratio, wait, hold, reg;
 377	unsigned bits = (strcmp(hw->init->name, "mem") == 0) ? 3 : 4;
 378
 379	fin = parent_rate;
 380	ratio = fin / rate;
 381
 382	if (unlikely(ratio < 2 || ratio > BIT(bits + 1)))
 383		return -EINVAL;
 384
 385	WARN_ON(fin % rate);
 386
 387	wait = (ratio >> 1) - 1;
 388	hold = ratio - wait - 2;
 389
 390	reg = clkc_readl(clk->regofs);
 391	reg &= ~(((BIT(bits) - 1) << 16) | ((BIT(bits) - 1) << 20));
 392	reg |= (wait << 16) | (hold << 20) | BIT(25);
 393	clkc_writel(reg, clk->regofs);
 394
 395	/* waiting FCD been effective */
 396	while (clkc_readl(clk->regofs) & BIT(25))
 397		cpu_relax();
 398
 399	return 0;
 400}
 401
 402static int cpu_clk_set_rate(struct clk_hw *hw, unsigned long rate,
 403		unsigned long parent_rate)
 404{
 405	int ret1, ret2;
 406	struct clk *cur_parent;
 407
 408	if (rate == clk_get_rate(clk_pll1.hw.clk)) {
 409		ret1 = clk_set_parent(hw->clk, clk_pll1.hw.clk);
 410		return ret1;
 411	}
 412
 413	if (rate == clk_get_rate(clk_pll2.hw.clk)) {
 414		ret1 = clk_set_parent(hw->clk, clk_pll2.hw.clk);
 415		return ret1;
 416	}
 417
 418	if (rate == clk_get_rate(clk_pll3.hw.clk)) {
 419		ret1 = clk_set_parent(hw->clk, clk_pll3.hw.clk);
 420		return ret1;
 421	}
 422
 423	cur_parent = clk_get_parent(hw->clk);
 424
 425	/* switch to tmp pll before setting parent clock's rate */
 426	if (cur_parent ==  clk_pll1.hw.clk) {
 427		ret1 = clk_set_parent(hw->clk, clk_pll2.hw.clk);
 428		BUG_ON(ret1);
 429	}
 430
 431	ret2 = clk_set_rate(clk_pll1.hw.clk, rate);
 432
 433	ret1 = clk_set_parent(hw->clk, clk_pll1.hw.clk);
 434
 435	return ret2 ? ret2 : ret1;
 436}
 437
 438static struct clk_ops msi_ops = {
 439	.set_rate = dmn_clk_set_rate,
 440	.round_rate = dmn_clk_round_rate,
 441	.recalc_rate = dmn_clk_recalc_rate,
 442	.set_parent = dmn_clk_set_parent,
 443	.get_parent = dmn_clk_get_parent,
 444};
 445
 446static struct clk_init_data clk_mem_init = {
 447	.name = "mem",
 448	.ops = &msi_ops,
 449	.parent_names = dmn_clk_parents,
 450	.num_parents = ARRAY_SIZE(dmn_clk_parents),
 451};
 452
 453static struct clk_dmn clk_mem = {
 454	.regofs = SIRFSOC_CLKC_MEM_CFG,
 455	.hw = {
 456		.init = &clk_mem_init,
 457	},
 458};
 459
 460static struct clk_init_data clk_sys_init = {
 461	.name = "sys",
 462	.ops = &msi_ops,
 463	.parent_names = dmn_clk_parents,
 464	.num_parents = ARRAY_SIZE(dmn_clk_parents),
 465	.flags = CLK_SET_RATE_GATE,
 466};
 467
 468static struct clk_dmn clk_sys = {
 469	.regofs = SIRFSOC_CLKC_SYS_CFG,
 470	.hw = {
 471		.init = &clk_sys_init,
 472	},
 473};
 474
 475static struct clk_init_data clk_io_init = {
 476	.name = "io",
 477	.ops = &msi_ops,
 478	.parent_names = dmn_clk_parents,
 479	.num_parents = ARRAY_SIZE(dmn_clk_parents),
 480};
 481
 482static struct clk_dmn clk_io = {
 483	.regofs = SIRFSOC_CLKC_IO_CFG,
 484	.hw = {
 485		.init = &clk_io_init,
 486	},
 487};
 488
 489static struct clk_ops cpu_ops = {
 490	.set_parent = dmn_clk_set_parent,
 491	.get_parent = dmn_clk_get_parent,
 492	.set_rate = cpu_clk_set_rate,
 493	.round_rate = cpu_clk_round_rate,
 494	.recalc_rate = cpu_clk_recalc_rate,
 495};
 496
 497static struct clk_init_data clk_cpu_init = {
 498	.name = "cpu",
 499	.ops = &cpu_ops,
 500	.parent_names = dmn_clk_parents,
 501	.num_parents = ARRAY_SIZE(dmn_clk_parents),
 502	.flags = CLK_SET_RATE_PARENT,
 503};
 504
 505static struct clk_dmn clk_cpu = {
 506	.regofs = SIRFSOC_CLKC_CPU_CFG,
 507	.hw = {
 508		.init = &clk_cpu_init,
 509	},
 510};
 511
 512static struct clk_ops dmn_ops = {
 513	.is_enabled = std_clk_is_enabled,
 514	.enable = std_clk_enable,
 515	.disable = std_clk_disable,
 516	.set_rate = dmn_clk_set_rate,
 517	.round_rate = dmn_clk_round_rate,
 518	.recalc_rate = dmn_clk_recalc_rate,
 519	.set_parent = dmn_clk_set_parent,
 520	.get_parent = dmn_clk_get_parent,
 521};
 522
 523/* dsp, gfx, mm, lcd and vpp domain */
 524
 525static struct clk_init_data clk_dsp_init = {
 526	.name = "dsp",
 527	.ops = &dmn_ops,
 528	.parent_names = dmn_clk_parents,
 529	.num_parents = ARRAY_SIZE(dmn_clk_parents),
 530};
 531
 532static struct clk_dmn clk_dsp = {
 533	.regofs = SIRFSOC_CLKC_DSP_CFG,
 534	.enable_bit = 0,
 535	.hw = {
 536		.init = &clk_dsp_init,
 537	},
 538};
 539
 540static struct clk_init_data clk_gfx_init = {
 541	.name = "gfx",
 542	.ops = &dmn_ops,
 543	.parent_names = dmn_clk_parents,
 544	.num_parents = ARRAY_SIZE(dmn_clk_parents),
 545};
 546
 547static struct clk_dmn clk_gfx = {
 548	.regofs = SIRFSOC_CLKC_GFX_CFG,
 549	.enable_bit = 8,
 550	.hw = {
 551		.init = &clk_gfx_init,
 552	},
 553};
 554
 555static struct clk_init_data clk_mm_init = {
 556	.name = "mm",
 557	.ops = &dmn_ops,
 558	.parent_names = dmn_clk_parents,
 559	.num_parents = ARRAY_SIZE(dmn_clk_parents),
 560};
 561
 562static struct clk_dmn clk_mm = {
 563	.regofs = SIRFSOC_CLKC_MM_CFG,
 564	.enable_bit = 9,
 565	.hw = {
 566		.init = &clk_mm_init,
 567	},
 568};
 569
 570/*
 571 * for atlas6, gfx2d holds the bit of prima2's clk_mm
 572 */
 573#define clk_gfx2d clk_mm
 574
 575static struct clk_init_data clk_lcd_init = {
 576	.name = "lcd",
 577	.ops = &dmn_ops,
 578	.parent_names = dmn_clk_parents,
 579	.num_parents = ARRAY_SIZE(dmn_clk_parents),
 580};
 581
 582static struct clk_dmn clk_lcd = {
 583	.regofs = SIRFSOC_CLKC_LCD_CFG,
 584	.enable_bit = 10,
 585	.hw = {
 586		.init = &clk_lcd_init,
 587	},
 588};
 589
 590static struct clk_init_data clk_vpp_init = {
 591	.name = "vpp",
 592	.ops = &dmn_ops,
 593	.parent_names = dmn_clk_parents,
 594	.num_parents = ARRAY_SIZE(dmn_clk_parents),
 595};
 596
 597static struct clk_dmn clk_vpp = {
 598	.regofs = SIRFSOC_CLKC_LCD_CFG,
 599	.enable_bit = 11,
 600	.hw = {
 601		.init = &clk_vpp_init,
 602	},
 603};
 604
 605static struct clk_init_data clk_mmc01_init = {
 606	.name = "mmc01",
 607	.ops = &dmn_ops,
 608	.parent_names = dmn_clk_parents,
 609	.num_parents = ARRAY_SIZE(dmn_clk_parents),
 610};
 611
 612static struct clk_init_data clk_mmc23_init = {
 613	.name = "mmc23",
 614	.ops = &dmn_ops,
 615	.parent_names = dmn_clk_parents,
 616	.num_parents = ARRAY_SIZE(dmn_clk_parents),
 617};
 618
 619static struct clk_init_data clk_mmc45_init = {
 620	.name = "mmc45",
 621	.ops = &dmn_ops,
 622	.parent_names = dmn_clk_parents,
 623	.num_parents = ARRAY_SIZE(dmn_clk_parents),
 624};
 625
 626/*
 627 * peripheral controllers in io domain
 628 */
 629
 630static int std_clk_is_enabled(struct clk_hw *hw)
 631{
 632	u32 reg;
 633	int bit;
 634	struct clk_std *clk = to_stdclk(hw);
 635
 636	bit = clk->enable_bit % 32;
 637	reg = clk->enable_bit / 32;
 638	reg = SIRFSOC_CLKC_CLK_EN0 + reg * sizeof(reg);
 639
 640	return !!(clkc_readl(reg) & BIT(bit));
 641}
 642
 643static int std_clk_enable(struct clk_hw *hw)
 644{
 645	u32 val, reg;
 646	int bit;
 647	struct clk_std *clk = to_stdclk(hw);
 648
 649	BUG_ON(clk->enable_bit < 0 || clk->enable_bit > 63);
 650
 651	bit = clk->enable_bit % 32;
 652	reg = clk->enable_bit / 32;
 653	reg = SIRFSOC_CLKC_CLK_EN0 + reg * sizeof(reg);
 654
 655	val = clkc_readl(reg) | BIT(bit);
 656	clkc_writel(val, reg);
 657	return 0;
 658}
 659
 660static void std_clk_disable(struct clk_hw *hw)
 661{
 662	u32 val, reg;
 663	int bit;
 664	struct clk_std *clk = to_stdclk(hw);
 665
 666	BUG_ON(clk->enable_bit < 0 || clk->enable_bit > 63);
 667
 668	bit = clk->enable_bit % 32;
 669	reg = clk->enable_bit / 32;
 670	reg = SIRFSOC_CLKC_CLK_EN0 + reg * sizeof(reg);
 671
 672	val = clkc_readl(reg) & ~BIT(bit);
 673	clkc_writel(val, reg);
 674}
 675
 676static const char *std_clk_io_parents[] = {
 677	"io",
 678};
 679
 680static struct clk_ops ios_ops = {
 681	.is_enabled = std_clk_is_enabled,
 682	.enable = std_clk_enable,
 683	.disable = std_clk_disable,
 684};
 685
 686static struct clk_init_data clk_cphif_init = {
 687	.name = "cphif",
 688	.ops = &ios_ops,
 689	.parent_names = std_clk_io_parents,
 690	.num_parents = ARRAY_SIZE(std_clk_io_parents),
 691};
 692
 693static struct clk_std clk_cphif = {
 694	.enable_bit = 20,
 695	.hw = {
 696		.init = &clk_cphif_init,
 697	},
 698};
 699
 700static struct clk_init_data clk_dmac0_init = {
 701	.name = "dmac0",
 702	.ops = &ios_ops,
 703	.parent_names = std_clk_io_parents,
 704	.num_parents = ARRAY_SIZE(std_clk_io_parents),
 705};
 706
 707static struct clk_std clk_dmac0 = {
 708	.enable_bit = 32,
 709	.hw = {
 710		.init = &clk_dmac0_init,
 711	},
 712};
 713
 714static struct clk_init_data clk_dmac1_init = {
 715	.name = "dmac1",
 716	.ops = &ios_ops,
 717	.parent_names = std_clk_io_parents,
 718	.num_parents = ARRAY_SIZE(std_clk_io_parents),
 719};
 720
 721static struct clk_std clk_dmac1 = {
 722	.enable_bit = 33,
 723	.hw = {
 724		.init = &clk_dmac1_init,
 725	},
 726};
 727
 728static struct clk_init_data clk_audio_init = {
 729	.name = "audio",
 730	.ops = &ios_ops,
 731	.parent_names = std_clk_io_parents,
 732	.num_parents = ARRAY_SIZE(std_clk_io_parents),
 733};
 734
 735static struct clk_std clk_audio = {
 736	.enable_bit = 35,
 737	.hw = {
 738		.init = &clk_audio_init,
 739	},
 740};
 741
 742static struct clk_init_data clk_uart0_init = {
 743	.name = "uart0",
 744	.ops = &ios_ops,
 745	.parent_names = std_clk_io_parents,
 746	.num_parents = ARRAY_SIZE(std_clk_io_parents),
 747};
 748
 749static struct clk_std clk_uart0 = {
 750	.enable_bit = 36,
 751	.hw = {
 752		.init = &clk_uart0_init,
 753	},
 754};
 755
 756static struct clk_init_data clk_uart1_init = {
 757	.name = "uart1",
 758	.ops = &ios_ops,
 759	.parent_names = std_clk_io_parents,
 760	.num_parents = ARRAY_SIZE(std_clk_io_parents),
 761};
 762
 763static struct clk_std clk_uart1 = {
 764	.enable_bit = 37,
 765	.hw = {
 766		.init = &clk_uart1_init,
 767	},
 768};
 769
 770static struct clk_init_data clk_uart2_init = {
 771	.name = "uart2",
 772	.ops = &ios_ops,
 773	.parent_names = std_clk_io_parents,
 774	.num_parents = ARRAY_SIZE(std_clk_io_parents),
 775};
 776
 777static struct clk_std clk_uart2 = {
 778	.enable_bit = 38,
 779	.hw = {
 780		.init = &clk_uart2_init,
 781	},
 782};
 783
 784static struct clk_init_data clk_usp0_init = {
 785	.name = "usp0",
 786	.ops = &ios_ops,
 787	.parent_names = std_clk_io_parents,
 788	.num_parents = ARRAY_SIZE(std_clk_io_parents),
 789};
 790
 791static struct clk_std clk_usp0 = {
 792	.enable_bit = 39,
 793	.hw = {
 794		.init = &clk_usp0_init,
 795	},
 796};
 797
 798static struct clk_init_data clk_usp1_init = {
 799	.name = "usp1",
 800	.ops = &ios_ops,
 801	.parent_names = std_clk_io_parents,
 802	.num_parents = ARRAY_SIZE(std_clk_io_parents),
 803};
 804
 805static struct clk_std clk_usp1 = {
 806	.enable_bit = 40,
 807	.hw = {
 808		.init = &clk_usp1_init,
 809	},
 810};
 811
 812static struct clk_init_data clk_usp2_init = {
 813	.name = "usp2",
 814	.ops = &ios_ops,
 815	.parent_names = std_clk_io_parents,
 816	.num_parents = ARRAY_SIZE(std_clk_io_parents),
 817};
 818
 819static struct clk_std clk_usp2 = {
 820	.enable_bit = 41,
 821	.hw = {
 822		.init = &clk_usp2_init,
 823	},
 824};
 825
 826static struct clk_init_data clk_vip_init = {
 827	.name = "vip",
 828	.ops = &ios_ops,
 829	.parent_names = std_clk_io_parents,
 830	.num_parents = ARRAY_SIZE(std_clk_io_parents),
 831};
 832
 833static struct clk_std clk_vip = {
 834	.enable_bit = 42,
 835	.hw = {
 836		.init = &clk_vip_init,
 837	},
 838};
 839
 840static struct clk_init_data clk_spi0_init = {
 841	.name = "spi0",
 842	.ops = &ios_ops,
 843	.parent_names = std_clk_io_parents,
 844	.num_parents = ARRAY_SIZE(std_clk_io_parents),
 845};
 846
 847static struct clk_std clk_spi0 = {
 848	.enable_bit = 43,
 849	.hw = {
 850		.init = &clk_spi0_init,
 851	},
 852};
 853
 854static struct clk_init_data clk_spi1_init = {
 855	.name = "spi1",
 856	.ops = &ios_ops,
 857	.parent_names = std_clk_io_parents,
 858	.num_parents = ARRAY_SIZE(std_clk_io_parents),
 859};
 860
 861static struct clk_std clk_spi1 = {
 862	.enable_bit = 44,
 863	.hw = {
 864		.init = &clk_spi1_init,
 865	},
 866};
 867
 868static struct clk_init_data clk_tsc_init = {
 869	.name = "tsc",
 870	.ops = &ios_ops,
 871	.parent_names = std_clk_io_parents,
 872	.num_parents = ARRAY_SIZE(std_clk_io_parents),
 873};
 874
 875static struct clk_std clk_tsc = {
 876	.enable_bit = 45,
 877	.hw = {
 878		.init = &clk_tsc_init,
 879	},
 880};
 881
 882static struct clk_init_data clk_i2c0_init = {
 883	.name = "i2c0",
 884	.ops = &ios_ops,
 885	.parent_names = std_clk_io_parents,
 886	.num_parents = ARRAY_SIZE(std_clk_io_parents),
 887};
 888
 889static struct clk_std clk_i2c0 = {
 890	.enable_bit = 46,
 891	.hw = {
 892		.init = &clk_i2c0_init,
 893	},
 894};
 895
 896static struct clk_init_data clk_i2c1_init = {
 897	.name = "i2c1",
 898	.ops = &ios_ops,
 899	.parent_names = std_clk_io_parents,
 900	.num_parents = ARRAY_SIZE(std_clk_io_parents),
 901};
 902
 903static struct clk_std clk_i2c1 = {
 904	.enable_bit = 47,
 905	.hw = {
 906		.init = &clk_i2c1_init,
 907	},
 908};
 909
 910static struct clk_init_data clk_pwmc_init = {
 911	.name = "pwmc",
 912	.ops = &ios_ops,
 913	.parent_names = std_clk_io_parents,
 914	.num_parents = ARRAY_SIZE(std_clk_io_parents),
 915};
 916
 917static struct clk_std clk_pwmc = {
 918	.enable_bit = 48,
 919	.hw = {
 920		.init = &clk_pwmc_init,
 921	},
 922};
 923
 924static struct clk_init_data clk_efuse_init = {
 925	.name = "efuse",
 926	.ops = &ios_ops,
 927	.parent_names = std_clk_io_parents,
 928	.num_parents = ARRAY_SIZE(std_clk_io_parents),
 929};
 930
 931static struct clk_std clk_efuse = {
 932	.enable_bit = 49,
 933	.hw = {
 934		.init = &clk_efuse_init,
 935	},
 936};
 937
 938static struct clk_init_data clk_pulse_init = {
 939	.name = "pulse",
 940	.ops = &ios_ops,
 941	.parent_names = std_clk_io_parents,
 942	.num_parents = ARRAY_SIZE(std_clk_io_parents),
 943};
 944
 945static struct clk_std clk_pulse = {
 946	.enable_bit = 50,
 947	.hw = {
 948		.init = &clk_pulse_init,
 949	},
 950};
 951
 952static const char *std_clk_dsp_parents[] = {
 953	"dsp",
 954};
 955
 956static struct clk_init_data clk_gps_init = {
 957	.name = "gps",
 958	.ops = &ios_ops,
 959	.parent_names = std_clk_dsp_parents,
 960	.num_parents = ARRAY_SIZE(std_clk_dsp_parents),
 961};
 962
 963static struct clk_std clk_gps = {
 964	.enable_bit = 1,
 965	.hw = {
 966		.init = &clk_gps_init,
 967	},
 968};
 969
 970static struct clk_init_data clk_mf_init = {
 971	.name = "mf",
 972	.ops = &ios_ops,
 973	.parent_names = std_clk_io_parents,
 974	.num_parents = ARRAY_SIZE(std_clk_io_parents),
 975};
 976
 977static struct clk_std clk_mf = {
 978	.enable_bit = 2,
 979	.hw = {
 980		.init = &clk_mf_init,
 981	},
 982};
 983
 984static const char *std_clk_sys_parents[] = {
 985	"sys",
 986};
 987
 988static struct clk_init_data clk_security_init = {
 989	.name = "security",
 990	.ops = &ios_ops,
 991	.parent_names = std_clk_sys_parents,
 992	.num_parents = ARRAY_SIZE(std_clk_sys_parents),
 993};
 994
 995static struct clk_std clk_security = {
 996	.enable_bit = 19,
 997	.hw = {
 998		.init = &clk_security_init,
 999	},
1000};
1001
1002static const char *std_clk_usb_parents[] = {
1003	"usb_pll",
1004};
1005
1006static struct clk_init_data clk_usb0_init = {
1007	.name = "usb0",
1008	.ops = &ios_ops,
1009	.parent_names = std_clk_usb_parents,
1010	.num_parents = ARRAY_SIZE(std_clk_usb_parents),
1011};
1012
1013static struct clk_std clk_usb0 = {
1014	.enable_bit = 16,
1015	.hw = {
1016		.init = &clk_usb0_init,
1017	},
1018};
1019
1020static struct clk_init_data clk_usb1_init = {
1021	.name = "usb1",
1022	.ops = &ios_ops,
1023	.parent_names = std_clk_usb_parents,
1024	.num_parents = ARRAY_SIZE(std_clk_usb_parents),
1025};
1026
1027static struct clk_std clk_usb1 = {
1028	.enable_bit = 17,
1029	.hw = {
1030		.init = &clk_usb1_init,
1031	},
1032};