Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.5.6.
   1/*
   2 * Copyright 2013 Emilio López
   3 *
   4 * Emilio López <emilio@elopez.com.ar>
   5 *
   6 * This program is free software; you can redistribute it and/or modify
   7 * it under the terms of the GNU General Public License as published by
   8 * the Free Software Foundation; either version 2 of the License, or
   9 * (at your option) any later version.
  10 *
  11 * This program is distributed in the hope that it will be useful,
  12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14 * GNU General Public License for more details.
  15 */
  16
  17#include <linux/clk.h>
  18#include <linux/clk-provider.h>
  19#include <linux/clkdev.h>
  20#include <linux/of.h>
  21#include <linux/of_address.h>
  22#include <linux/reset-controller.h>
  23#include <linux/slab.h>
  24#include <linux/spinlock.h>
  25#include <linux/log2.h>
  26
  27#include "clk-factors.h"
  28
  29static DEFINE_SPINLOCK(clk_lock);
  30
  31/* Maximum number of parents our clocks have */
  32#define SUNXI_MAX_PARENTS	5
  33
  34/**
  35 * sun4i_get_pll1_factors() - calculates n, k, m, p factors for PLL1
  36 * PLL1 rate is calculated as follows
  37 * rate = (parent_rate * n * (k + 1) >> p) / (m + 1);
  38 * parent_rate is always 24Mhz
  39 */
  40
  41static void sun4i_get_pll1_factors(struct factors_request *req)
  42{
  43	u8 div;
  44
  45	/* Normalize value to a 6M multiple */
  46	div = req->rate / 6000000;
  47	req->rate = 6000000 * div;
  48
  49	/* m is always zero for pll1 */
  50	req->m = 0;
  51
  52	/* k is 1 only on these cases */
  53	if (req->rate >= 768000000 || req->rate == 42000000 ||
  54			req->rate == 54000000)
  55		req->k = 1;
  56	else
  57		req->k = 0;
  58
  59	/* p will be 3 for divs under 10 */
  60	if (div < 10)
  61		req->p = 3;
  62
  63	/* p will be 2 for divs between 10 - 20 and odd divs under 32 */
  64	else if (div < 20 || (div < 32 && (div & 1)))
  65		req->p = 2;
  66
  67	/* p will be 1 for even divs under 32, divs under 40 and odd pairs
  68	 * of divs between 40-62 */
  69	else if (div < 40 || (div < 64 && (div & 2)))
  70		req->p = 1;
  71
  72	/* any other entries have p = 0 */
  73	else
  74		req->p = 0;
  75
  76	/* calculate a suitable n based on k and p */
  77	div <<= req->p;
  78	div /= (req->k + 1);
  79	req->n = div / 4;
  80}
  81
  82/**
  83 * sun6i_a31_get_pll1_factors() - calculates n, k and m factors for PLL1
  84 * PLL1 rate is calculated as follows
  85 * rate = parent_rate * (n + 1) * (k + 1) / (m + 1);
  86 * parent_rate should always be 24MHz
  87 */
  88static void sun6i_a31_get_pll1_factors(struct factors_request *req)
  89{
  90	/*
  91	 * We can operate only on MHz, this will make our life easier
  92	 * later.
  93	 */
  94	u32 freq_mhz = req->rate / 1000000;
  95	u32 parent_freq_mhz = req->parent_rate / 1000000;
  96
  97	/*
  98	 * Round down the frequency to the closest multiple of either
  99	 * 6 or 16
 100	 */
 101	u32 round_freq_6 = round_down(freq_mhz, 6);
 102	u32 round_freq_16 = round_down(freq_mhz, 16);
 103
 104	if (round_freq_6 > round_freq_16)
 105		freq_mhz = round_freq_6;
 106	else
 107		freq_mhz = round_freq_16;
 108
 109	req->rate = freq_mhz * 1000000;
 110
 111	/* If the frequency is a multiple of 32 MHz, k is always 3 */
 112	if (!(freq_mhz % 32))
 113		req->k = 3;
 114	/* If the frequency is a multiple of 9 MHz, k is always 2 */
 115	else if (!(freq_mhz % 9))
 116		req->k = 2;
 117	/* If the frequency is a multiple of 8 MHz, k is always 1 */
 118	else if (!(freq_mhz % 8))
 119		req->k = 1;
 120	/* Otherwise, we don't use the k factor */
 121	else
 122		req->k = 0;
 123
 124	/*
 125	 * If the frequency is a multiple of 2 but not a multiple of
 126	 * 3, m is 3. This is the first time we use 6 here, yet we
 127	 * will use it on several other places.
 128	 * We use this number because it's the lowest frequency we can
 129	 * generate (with n = 0, k = 0, m = 3), so every other frequency
 130	 * somehow relates to this frequency.
 131	 */
 132	if ((freq_mhz % 6) == 2 || (freq_mhz % 6) == 4)
 133		req->m = 2;
 134	/*
 135	 * If the frequency is a multiple of 6MHz, but the factor is
 136	 * odd, m will be 3
 137	 */
 138	else if ((freq_mhz / 6) & 1)
 139		req->m = 3;
 140	/* Otherwise, we end up with m = 1 */
 141	else
 142		req->m = 1;
 143
 144	/* Calculate n thanks to the above factors we already got */
 145	req->n = freq_mhz * (req->m + 1) / ((req->k + 1) * parent_freq_mhz)
 146		 - 1;
 147
 148	/*
 149	 * If n end up being outbound, and that we can still decrease
 150	 * m, do it.
 151	 */
 152	if ((req->n + 1) > 31 && (req->m + 1) > 1) {
 153		req->n = (req->n + 1) / 2 - 1;
 154		req->m = (req->m + 1) / 2 - 1;
 155	}
 156}
 157
 158/**
 159 * sun8i_a23_get_pll1_factors() - calculates n, k, m, p factors for PLL1
 160 * PLL1 rate is calculated as follows
 161 * rate = (parent_rate * (n + 1) * (k + 1) >> p) / (m + 1);
 162 * parent_rate is always 24Mhz
 163 */
 164
 165static void sun8i_a23_get_pll1_factors(struct factors_request *req)
 166{
 167	u8 div;
 168
 169	/* Normalize value to a 6M multiple */
 170	div = req->rate / 6000000;
 171	req->rate = 6000000 * div;
 172
 173	/* m is always zero for pll1 */
 174	req->m = 0;
 175
 176	/* k is 1 only on these cases */
 177	if (req->rate >= 768000000 || req->rate == 42000000 ||
 178			req->rate == 54000000)
 179		req->k = 1;
 180	else
 181		req->k = 0;
 182
 183	/* p will be 2 for divs under 20 and odd divs under 32 */
 184	if (div < 20 || (div < 32 && (div & 1)))
 185		req->p = 2;
 186
 187	/* p will be 1 for even divs under 32, divs under 40 and odd pairs
 188	 * of divs between 40-62 */
 189	else if (div < 40 || (div < 64 && (div & 2)))
 190		req->p = 1;
 191
 192	/* any other entries have p = 0 */
 193	else
 194		req->p = 0;
 195
 196	/* calculate a suitable n based on k and p */
 197	div <<= req->p;
 198	div /= (req->k + 1);
 199	req->n = div / 4 - 1;
 200}
 201
 202/**
 203 * sun4i_get_pll5_factors() - calculates n, k factors for PLL5
 204 * PLL5 rate is calculated as follows
 205 * rate = parent_rate * n * (k + 1)
 206 * parent_rate is always 24Mhz
 207 */
 208
 209static void sun4i_get_pll5_factors(struct factors_request *req)
 210{
 211	u8 div;
 212
 213	/* Normalize value to a parent_rate multiple (24M) */
 214	div = req->rate / req->parent_rate;
 215	req->rate = req->parent_rate * div;
 216
 217	if (div < 31)
 218		req->k = 0;
 219	else if (div / 2 < 31)
 220		req->k = 1;
 221	else if (div / 3 < 31)
 222		req->k = 2;
 223	else
 224		req->k = 3;
 225
 226	req->n = DIV_ROUND_UP(div, (req->k + 1));
 227}
 228
 229/**
 230 * sun6i_a31_get_pll6_factors() - calculates n, k factors for A31 PLL6x2
 231 * PLL6x2 rate is calculated as follows
 232 * rate = parent_rate * (n + 1) * (k + 1)
 233 * parent_rate is always 24Mhz
 234 */
 235
 236static void sun6i_a31_get_pll6_factors(struct factors_request *req)
 237{
 238	u8 div;
 239
 240	/* Normalize value to a parent_rate multiple (24M) */
 241	div = req->rate / req->parent_rate;
 242	req->rate = req->parent_rate * div;
 243
 244	req->k = div / 32;
 245	if (req->k > 3)
 246		req->k = 3;
 247
 248	req->n = DIV_ROUND_UP(div, (req->k + 1)) - 1;
 249}
 250
 251/**
 252 * sun5i_a13_get_ahb_factors() - calculates m, p factors for AHB
 253 * AHB rate is calculated as follows
 254 * rate = parent_rate >> p
 255 */
 256
 257static void sun5i_a13_get_ahb_factors(struct factors_request *req)
 258{
 259	u32 div;
 260
 261	/* divide only */
 262	if (req->parent_rate < req->rate)
 263		req->rate = req->parent_rate;
 264
 265	/*
 266	 * user manual says valid speed is 8k ~ 276M, but tests show it
 267	 * can work at speeds up to 300M, just after reparenting to pll6
 268	 */
 269	if (req->rate < 8000)
 270		req->rate = 8000;
 271	if (req->rate > 300000000)
 272		req->rate = 300000000;
 273
 274	div = order_base_2(DIV_ROUND_UP(req->parent_rate, req->rate));
 275
 276	/* p = 0 ~ 3 */
 277	if (div > 3)
 278		div = 3;
 279
 280	req->rate = req->parent_rate >> div;
 281
 282	req->p = div;
 283}
 284
 285#define SUN6I_AHB1_PARENT_PLL6	3
 286
 287/**
 288 * sun6i_a31_get_ahb_factors() - calculates m, p factors for AHB
 289 * AHB rate is calculated as follows
 290 * rate = parent_rate >> p
 291 *
 292 * if parent is pll6, then
 293 * parent_rate = pll6 rate / (m + 1)
 294 */
 295
 296static void sun6i_get_ahb1_factors(struct factors_request *req)
 297{
 298	u8 div, calcp, calcm = 1;
 299
 300	/*
 301	 * clock can only divide, so we will never be able to achieve
 302	 * frequencies higher than the parent frequency
 303	 */
 304	if (req->parent_rate && req->rate > req->parent_rate)
 305		req->rate = req->parent_rate;
 306
 307	div = DIV_ROUND_UP(req->parent_rate, req->rate);
 308
 309	/* calculate pre-divider if parent is pll6 */
 310	if (req->parent_index == SUN6I_AHB1_PARENT_PLL6) {
 311		if (div < 4)
 312			calcp = 0;
 313		else if (div / 2 < 4)
 314			calcp = 1;
 315		else if (div / 4 < 4)
 316			calcp = 2;
 317		else
 318			calcp = 3;
 319
 320		calcm = DIV_ROUND_UP(div, 1 << calcp);
 321	} else {
 322		calcp = __roundup_pow_of_two(div);
 323		calcp = calcp > 3 ? 3 : calcp;
 324	}
 325
 326	req->rate = (req->parent_rate / calcm) >> calcp;
 327	req->p = calcp;
 328	req->m = calcm - 1;
 329}
 330
 331/**
 332 * sun6i_ahb1_recalc() - calculates AHB clock rate from m, p factors and
 333 *			 parent index
 334 */
 335static void sun6i_ahb1_recalc(struct factors_request *req)
 336{
 337	req->rate = req->parent_rate;
 338
 339	/* apply pre-divider first if parent is pll6 */
 340	if (req->parent_index == SUN6I_AHB1_PARENT_PLL6)
 341		req->rate /= req->m + 1;
 342
 343	/* clk divider */
 344	req->rate >>= req->p;
 345}
 346
 347/**
 348 * sun4i_get_apb1_factors() - calculates m, p factors for APB1
 349 * APB1 rate is calculated as follows
 350 * rate = (parent_rate >> p) / (m + 1);
 351 */
 352
 353static void sun4i_get_apb1_factors(struct factors_request *req)
 354{
 355	u8 calcm, calcp;
 356	int div;
 357
 358	if (req->parent_rate < req->rate)
 359		req->rate = req->parent_rate;
 360
 361	div = DIV_ROUND_UP(req->parent_rate, req->rate);
 362
 363	/* Invalid rate! */
 364	if (div > 32)
 365		return;
 366
 367	if (div <= 4)
 368		calcp = 0;
 369	else if (div <= 8)
 370		calcp = 1;
 371	else if (div <= 16)
 372		calcp = 2;
 373	else
 374		calcp = 3;
 375
 376	calcm = (div >> calcp) - 1;
 377
 378	req->rate = (req->parent_rate >> calcp) / (calcm + 1);
 379	req->m = calcm;
 380	req->p = calcp;
 381}
 382
 383
 384
 385
 386/**
 387 * sun7i_a20_get_out_factors() - calculates m, p factors for CLK_OUT_A/B
 388 * CLK_OUT rate is calculated as follows
 389 * rate = (parent_rate >> p) / (m + 1);
 390 */
 391
 392static void sun7i_a20_get_out_factors(struct factors_request *req)
 393{
 394	u8 div, calcm, calcp;
 395
 396	/* These clocks can only divide, so we will never be able to achieve
 397	 * frequencies higher than the parent frequency */
 398	if (req->rate > req->parent_rate)
 399		req->rate = req->parent_rate;
 400
 401	div = DIV_ROUND_UP(req->parent_rate, req->rate);
 402
 403	if (div < 32)
 404		calcp = 0;
 405	else if (div / 2 < 32)
 406		calcp = 1;
 407	else if (div / 4 < 32)
 408		calcp = 2;
 409	else
 410		calcp = 3;
 411
 412	calcm = DIV_ROUND_UP(div, 1 << calcp);
 413
 414	req->rate = (req->parent_rate >> calcp) / calcm;
 415	req->m = calcm - 1;
 416	req->p = calcp;
 417}
 418
 419/**
 420 * sunxi_factors_clk_setup() - Setup function for factor clocks
 421 */
 422
 423static const struct clk_factors_config sun4i_pll1_config = {
 424	.nshift = 8,
 425	.nwidth = 5,
 426	.kshift = 4,
 427	.kwidth = 2,
 428	.mshift = 0,
 429	.mwidth = 2,
 430	.pshift = 16,
 431	.pwidth = 2,
 432};
 433
 434static const struct clk_factors_config sun6i_a31_pll1_config = {
 435	.nshift	= 8,
 436	.nwidth = 5,
 437	.kshift = 4,
 438	.kwidth = 2,
 439	.mshift = 0,
 440	.mwidth = 2,
 441	.n_start = 1,
 442};
 443
 444static const struct clk_factors_config sun8i_a23_pll1_config = {
 445	.nshift = 8,
 446	.nwidth = 5,
 447	.kshift = 4,
 448	.kwidth = 2,
 449	.mshift = 0,
 450	.mwidth = 2,
 451	.pshift = 16,
 452	.pwidth = 2,
 453	.n_start = 1,
 454};
 455
 456static const struct clk_factors_config sun4i_pll5_config = {
 457	.nshift = 8,
 458	.nwidth = 5,
 459	.kshift = 4,
 460	.kwidth = 2,
 461};
 462
 463static const struct clk_factors_config sun6i_a31_pll6_config = {
 464	.nshift	= 8,
 465	.nwidth = 5,
 466	.kshift = 4,
 467	.kwidth = 2,
 468	.n_start = 1,
 469};
 470
 471static const struct clk_factors_config sun5i_a13_ahb_config = {
 472	.pshift = 4,
 473	.pwidth = 2,
 474};
 475
 476static const struct clk_factors_config sun6i_ahb1_config = {
 477	.mshift = 6,
 478	.mwidth = 2,
 479	.pshift = 4,
 480	.pwidth = 2,
 481};
 482
 483static const struct clk_factors_config sun4i_apb1_config = {
 484	.mshift = 0,
 485	.mwidth = 5,
 486	.pshift = 16,
 487	.pwidth = 2,
 488};
 489
 490/* user manual says "n" but it's really "p" */
 491static const struct clk_factors_config sun7i_a20_out_config = {
 492	.mshift = 8,
 493	.mwidth = 5,
 494	.pshift = 20,
 495	.pwidth = 2,
 496};
 497
 498static const struct factors_data sun4i_pll1_data __initconst = {
 499	.enable = 31,
 500	.table = &sun4i_pll1_config,
 501	.getter = sun4i_get_pll1_factors,
 502};
 503
 504static const struct factors_data sun6i_a31_pll1_data __initconst = {
 505	.enable = 31,
 506	.table = &sun6i_a31_pll1_config,
 507	.getter = sun6i_a31_get_pll1_factors,
 508};
 509
 510static const struct factors_data sun8i_a23_pll1_data __initconst = {
 511	.enable = 31,
 512	.table = &sun8i_a23_pll1_config,
 513	.getter = sun8i_a23_get_pll1_factors,
 514};
 515
 516static const struct factors_data sun7i_a20_pll4_data __initconst = {
 517	.enable = 31,
 518	.table = &sun4i_pll5_config,
 519	.getter = sun4i_get_pll5_factors,
 520};
 521
 522static const struct factors_data sun4i_pll5_data __initconst = {
 523	.enable = 31,
 524	.table = &sun4i_pll5_config,
 525	.getter = sun4i_get_pll5_factors,
 526};
 527
 528static const struct factors_data sun6i_a31_pll6_data __initconst = {
 529	.enable = 31,
 530	.table = &sun6i_a31_pll6_config,
 531	.getter = sun6i_a31_get_pll6_factors,
 532};
 533
 534static const struct factors_data sun5i_a13_ahb_data __initconst = {
 535	.mux = 6,
 536	.muxmask = BIT(1) | BIT(0),
 537	.table = &sun5i_a13_ahb_config,
 538	.getter = sun5i_a13_get_ahb_factors,
 539};
 540
 541static const struct factors_data sun6i_ahb1_data __initconst = {
 542	.mux = 12,
 543	.muxmask = BIT(1) | BIT(0),
 544	.table = &sun6i_ahb1_config,
 545	.getter = sun6i_get_ahb1_factors,
 546	.recalc = sun6i_ahb1_recalc,
 547};
 548
 549static const struct factors_data sun4i_apb1_data __initconst = {
 550	.mux = 24,
 551	.muxmask = BIT(1) | BIT(0),
 552	.table = &sun4i_apb1_config,
 553	.getter = sun4i_get_apb1_factors,
 554};
 555
 556static const struct factors_data sun7i_a20_out_data __initconst = {
 557	.enable = 31,
 558	.mux = 24,
 559	.muxmask = BIT(1) | BIT(0),
 560	.table = &sun7i_a20_out_config,
 561	.getter = sun7i_a20_get_out_factors,
 562};
 563
 564static struct clk * __init sunxi_factors_clk_setup(struct device_node *node,
 565						   const struct factors_data *data)
 566{
 567	void __iomem *reg;
 568
 569	reg = of_iomap(node, 0);
 570	if (!reg) {
 571		pr_err("Could not get registers for factors-clk: %s\n",
 572		       node->name);
 573		return NULL;
 574	}
 575
 576	return sunxi_factors_register(node, data, &clk_lock, reg);
 577}
 578
 579static void __init sun4i_pll1_clk_setup(struct device_node *node)
 580{
 581	sunxi_factors_clk_setup(node, &sun4i_pll1_data);
 582}
 583CLK_OF_DECLARE(sun4i_pll1, "allwinner,sun4i-a10-pll1-clk",
 584	       sun4i_pll1_clk_setup);
 585
 586static void __init sun6i_pll1_clk_setup(struct device_node *node)
 587{
 588	sunxi_factors_clk_setup(node, &sun6i_a31_pll1_data);
 589}
 590CLK_OF_DECLARE(sun6i_pll1, "allwinner,sun6i-a31-pll1-clk",
 591	       sun6i_pll1_clk_setup);
 592
 593static void __init sun8i_pll1_clk_setup(struct device_node *node)
 594{
 595	sunxi_factors_clk_setup(node, &sun8i_a23_pll1_data);
 596}
 597CLK_OF_DECLARE(sun8i_pll1, "allwinner,sun8i-a23-pll1-clk",
 598	       sun8i_pll1_clk_setup);
 599
 600static void __init sun7i_pll4_clk_setup(struct device_node *node)
 601{
 602	sunxi_factors_clk_setup(node, &sun7i_a20_pll4_data);
 603}
 604CLK_OF_DECLARE(sun7i_pll4, "allwinner,sun7i-a20-pll4-clk",
 605	       sun7i_pll4_clk_setup);
 606
 607static void __init sun5i_ahb_clk_setup(struct device_node *node)
 608{
 609	sunxi_factors_clk_setup(node, &sun5i_a13_ahb_data);
 610}
 611CLK_OF_DECLARE(sun5i_ahb, "allwinner,sun5i-a13-ahb-clk",
 612	       sun5i_ahb_clk_setup);
 613
 614static void __init sun6i_ahb1_clk_setup(struct device_node *node)
 615{
 616	sunxi_factors_clk_setup(node, &sun6i_ahb1_data);
 617}
 618CLK_OF_DECLARE(sun6i_a31_ahb1, "allwinner,sun6i-a31-ahb1-clk",
 619	       sun6i_ahb1_clk_setup);
 620
 621static void __init sun4i_apb1_clk_setup(struct device_node *node)
 622{
 623	sunxi_factors_clk_setup(node, &sun4i_apb1_data);
 624}
 625CLK_OF_DECLARE(sun4i_apb1, "allwinner,sun4i-a10-apb1-clk",
 626	       sun4i_apb1_clk_setup);
 627
 628static void __init sun7i_out_clk_setup(struct device_node *node)
 629{
 630	sunxi_factors_clk_setup(node, &sun7i_a20_out_data);
 631}
 632CLK_OF_DECLARE(sun7i_out, "allwinner,sun7i-a20-out-clk",
 633	       sun7i_out_clk_setup);
 634
 635
 636/**
 637 * sunxi_mux_clk_setup() - Setup function for muxes
 638 */
 639
 640#define SUNXI_MUX_GATE_WIDTH	2
 641
 642struct mux_data {
 643	u8 shift;
 644};
 645
 646static const struct mux_data sun4i_cpu_mux_data __initconst = {
 647	.shift = 16,
 648};
 649
 650static const struct mux_data sun6i_a31_ahb1_mux_data __initconst = {
 651	.shift = 12,
 652};
 653
 654static const struct mux_data sun8i_h3_ahb2_mux_data __initconst = {
 655	.shift = 0,
 656};
 657
 658static struct clk * __init sunxi_mux_clk_setup(struct device_node *node,
 659					       const struct mux_data *data)
 660{
 661	struct clk *clk;
 662	const char *clk_name = node->name;
 663	const char *parents[SUNXI_MAX_PARENTS];
 664	void __iomem *reg;
 665	int i;
 666
 667	reg = of_iomap(node, 0);
 668	if (!reg) {
 669		pr_err("Could not map registers for mux-clk: %s\n",
 670		       of_node_full_name(node));
 671		return NULL;
 672	}
 673
 674	i = of_clk_parent_fill(node, parents, SUNXI_MAX_PARENTS);
 675	if (of_property_read_string(node, "clock-output-names", &clk_name)) {
 676		pr_err("%s: could not read clock-output-names from \"%s\"\n",
 677		       __func__, of_node_full_name(node));
 678		goto out_unmap;
 679	}
 680
 681	clk = clk_register_mux(NULL, clk_name, parents, i,
 682			       CLK_SET_RATE_PARENT, reg,
 683			       data->shift, SUNXI_MUX_GATE_WIDTH,
 684			       0, &clk_lock);
 685
 686	if (IS_ERR(clk)) {
 687		pr_err("%s: failed to register mux clock %s: %ld\n", __func__,
 688		       clk_name, PTR_ERR(clk));
 689		goto out_unmap;
 690	}
 691
 692	if (of_clk_add_provider(node, of_clk_src_simple_get, clk)) {
 693		pr_err("%s: failed to add clock provider for %s\n",
 694		       __func__, clk_name);
 695		clk_unregister_divider(clk);
 696		goto out_unmap;
 697	}
 698
 699	return clk;
 700out_unmap:
 701	iounmap(reg);
 702	return NULL;
 703}
 704
 705static void __init sun4i_cpu_clk_setup(struct device_node *node)
 706{
 707	struct clk *clk;
 708
 709	clk = sunxi_mux_clk_setup(node, &sun4i_cpu_mux_data);
 710	if (!clk)
 711		return;
 712
 713	/* Protect CPU clock */
 714	__clk_get(clk);
 715	clk_prepare_enable(clk);
 716}
 717CLK_OF_DECLARE(sun4i_cpu, "allwinner,sun4i-a10-cpu-clk",
 718	       sun4i_cpu_clk_setup);
 719
 720static void __init sun6i_ahb1_mux_clk_setup(struct device_node *node)
 721{
 722	sunxi_mux_clk_setup(node, &sun6i_a31_ahb1_mux_data);
 723}
 724CLK_OF_DECLARE(sun6i_ahb1_mux, "allwinner,sun6i-a31-ahb1-mux-clk",
 725	       sun6i_ahb1_mux_clk_setup);
 726
 727static void __init sun8i_ahb2_clk_setup(struct device_node *node)
 728{
 729	sunxi_mux_clk_setup(node, &sun8i_h3_ahb2_mux_data);
 730}
 731CLK_OF_DECLARE(sun8i_ahb2, "allwinner,sun8i-h3-ahb2-clk",
 732	       sun8i_ahb2_clk_setup);
 733
 734
 735/**
 736 * sunxi_divider_clk_setup() - Setup function for simple divider clocks
 737 */
 738
 739struct div_data {
 740	u8	shift;
 741	u8	pow;
 742	u8	width;
 743	const struct clk_div_table *table;
 744};
 745
 746static const struct div_data sun4i_axi_data __initconst = {
 747	.shift	= 0,
 748	.pow	= 0,
 749	.width	= 2,
 750};
 751
 752static const struct clk_div_table sun8i_a23_axi_table[] __initconst = {
 753	{ .val = 0, .div = 1 },
 754	{ .val = 1, .div = 2 },
 755	{ .val = 2, .div = 3 },
 756	{ .val = 3, .div = 4 },
 757	{ .val = 4, .div = 4 },
 758	{ .val = 5, .div = 4 },
 759	{ .val = 6, .div = 4 },
 760	{ .val = 7, .div = 4 },
 761	{ } /* sentinel */
 762};
 763
 764static const struct div_data sun8i_a23_axi_data __initconst = {
 765	.width	= 3,
 766	.table	= sun8i_a23_axi_table,
 767};
 768
 769static const struct div_data sun4i_ahb_data __initconst = {
 770	.shift	= 4,
 771	.pow	= 1,
 772	.width	= 2,
 773};
 774
 775static const struct clk_div_table sun4i_apb0_table[] __initconst = {
 776	{ .val = 0, .div = 2 },
 777	{ .val = 1, .div = 2 },
 778	{ .val = 2, .div = 4 },
 779	{ .val = 3, .div = 8 },
 780	{ } /* sentinel */
 781};
 782
 783static const struct div_data sun4i_apb0_data __initconst = {
 784	.shift	= 8,
 785	.pow	= 1,
 786	.width	= 2,
 787	.table	= sun4i_apb0_table,
 788};
 789
 790static void __init sunxi_divider_clk_setup(struct device_node *node,
 791					   const struct div_data *data)
 792{
 793	struct clk *clk;
 794	const char *clk_name = node->name;
 795	const char *clk_parent;
 796	void __iomem *reg;
 797
 798	reg = of_iomap(node, 0);
 799	if (!reg) {
 800		pr_err("Could not map registers for mux-clk: %s\n",
 801		       of_node_full_name(node));
 802		return;
 803	}
 804
 805	clk_parent = of_clk_get_parent_name(node, 0);
 806
 807	if (of_property_read_string(node, "clock-output-names", &clk_name)) {
 808		pr_err("%s: could not read clock-output-names from \"%s\"\n",
 809		       __func__, of_node_full_name(node));
 810		goto out_unmap;
 811	}
 812
 813	clk = clk_register_divider_table(NULL, clk_name, clk_parent, 0,
 814					 reg, data->shift, data->width,
 815					 data->pow ? CLK_DIVIDER_POWER_OF_TWO : 0,
 816					 data->table, &clk_lock);
 817	if (IS_ERR(clk)) {
 818		pr_err("%s: failed to register divider clock %s: %ld\n",
 819		       __func__, clk_name, PTR_ERR(clk));
 820		goto out_unmap;
 821	}
 822
 823	if (of_clk_add_provider(node, of_clk_src_simple_get, clk)) {
 824		pr_err("%s: failed to add clock provider for %s\n",
 825		       __func__, clk_name);
 826		goto out_unregister;
 827	}
 828
 829	if (clk_register_clkdev(clk, clk_name, NULL)) {
 830		of_clk_del_provider(node);
 831		goto out_unregister;
 832	}
 833
 834	return;
 835out_unregister:
 836	clk_unregister_divider(clk);
 837
 838out_unmap:
 839	iounmap(reg);
 840}
 841
 842static void __init sun4i_ahb_clk_setup(struct device_node *node)
 843{
 844	sunxi_divider_clk_setup(node, &sun4i_ahb_data);
 845}
 846CLK_OF_DECLARE(sun4i_ahb, "allwinner,sun4i-a10-ahb-clk",
 847	       sun4i_ahb_clk_setup);
 848
 849static void __init sun4i_apb0_clk_setup(struct device_node *node)
 850{
 851	sunxi_divider_clk_setup(node, &sun4i_apb0_data);
 852}
 853CLK_OF_DECLARE(sun4i_apb0, "allwinner,sun4i-a10-apb0-clk",
 854	       sun4i_apb0_clk_setup);
 855
 856static void __init sun4i_axi_clk_setup(struct device_node *node)
 857{
 858	sunxi_divider_clk_setup(node, &sun4i_axi_data);
 859}
 860CLK_OF_DECLARE(sun4i_axi, "allwinner,sun4i-a10-axi-clk",
 861	       sun4i_axi_clk_setup);
 862
 863static void __init sun8i_axi_clk_setup(struct device_node *node)
 864{
 865	sunxi_divider_clk_setup(node, &sun8i_a23_axi_data);
 866}
 867CLK_OF_DECLARE(sun8i_axi, "allwinner,sun8i-a23-axi-clk",
 868	       sun8i_axi_clk_setup);
 869
 870
 871
 872/**
 873 * sunxi_gates_clk_setup() - Setup function for leaf gates on clocks
 874 */
 875
 876#define SUNXI_GATES_MAX_SIZE	64
 877
 878struct gates_data {
 879	DECLARE_BITMAP(mask, SUNXI_GATES_MAX_SIZE);
 880};
 881
 882/**
 883 * sunxi_divs_clk_setup() helper data
 884 */
 885
 886#define SUNXI_DIVS_MAX_QTY	4
 887#define SUNXI_DIVISOR_WIDTH	2
 888
 889struct divs_data {
 890	const struct factors_data *factors; /* data for the factor clock */
 891	int ndivs; /* number of outputs */
 892	/*
 893	 * List of outputs. Refer to the diagram for sunxi_divs_clk_setup():
 894	 * self or base factor clock refers to the output from the pll
 895	 * itself. The remaining refer to fixed or configurable divider
 896	 * outputs.
 897	 */
 898	struct {
 899		u8 self; /* is it the base factor clock? (only one) */
 900		u8 fixed; /* is it a fixed divisor? if not... */
 901		struct clk_div_table *table; /* is it a table based divisor? */
 902		u8 shift; /* otherwise it's a normal divisor with this shift */
 903		u8 pow;   /* is it power-of-two based? */
 904		u8 gate;  /* is it independently gateable? */
 905	} div[SUNXI_DIVS_MAX_QTY];
 906};
 907
 908static struct clk_div_table pll6_sata_tbl[] = {
 909	{ .val = 0, .div = 6, },
 910	{ .val = 1, .div = 12, },
 911	{ .val = 2, .div = 18, },
 912	{ .val = 3, .div = 24, },
 913	{ } /* sentinel */
 914};
 915
 916static const struct divs_data pll5_divs_data __initconst = {
 917	.factors = &sun4i_pll5_data,
 918	.ndivs = 2,
 919	.div = {
 920		{ .shift = 0, .pow = 0, }, /* M, DDR */
 921		{ .shift = 16, .pow = 1, }, /* P, other */
 922		/* No output for the base factor clock */
 923	}
 924};
 925
 926static const struct divs_data pll6_divs_data __initconst = {
 927	.factors = &sun4i_pll5_data,
 928	.ndivs = 4,
 929	.div = {
 930		{ .shift = 0, .table = pll6_sata_tbl, .gate = 14 }, /* M, SATA */
 931		{ .fixed = 2 }, /* P, other */
 932		{ .self = 1 }, /* base factor clock, 2x */
 933		{ .fixed = 4 }, /* pll6 / 4, used as ahb input */
 934	}
 935};
 936
 937static const struct divs_data sun6i_a31_pll6_divs_data __initconst = {
 938	.factors = &sun6i_a31_pll6_data,
 939	.ndivs = 2,
 940	.div = {
 941		{ .fixed = 2 }, /* normal output */
 942		{ .self = 1 }, /* base factor clock, 2x */
 943	}
 944};
 945
 946/**
 947 * sunxi_divs_clk_setup() - Setup function for leaf divisors on clocks
 948 *
 949 * These clocks look something like this
 950 *            ________________________
 951 *           |         ___divisor 1---|----> to consumer
 952 * parent >--|  pll___/___divisor 2---|----> to consumer
 953 *           |        \_______________|____> to consumer
 954 *           |________________________|
 955 */
 956
 957static struct clk ** __init sunxi_divs_clk_setup(struct device_node *node,
 958						 const struct divs_data *data)
 959{
 960	struct clk_onecell_data *clk_data;
 961	const char *parent;
 962	const char *clk_name;
 963	struct clk **clks, *pclk;
 964	struct clk_hw *gate_hw, *rate_hw;
 965	const struct clk_ops *rate_ops;
 966	struct clk_gate *gate = NULL;
 967	struct clk_fixed_factor *fix_factor;
 968	struct clk_divider *divider;
 969	struct factors_data factors = *data->factors;
 970	char *derived_name = NULL;
 971	void __iomem *reg;
 972	int ndivs = SUNXI_DIVS_MAX_QTY, i = 0;
 973	int flags, clkflags;
 974
 975	/* if number of children known, use it */
 976	if (data->ndivs)
 977		ndivs = data->ndivs;
 978
 979	/* Try to find a name for base factor clock */
 980	for (i = 0; i < ndivs; i++) {
 981		if (data->div[i].self) {
 982			of_property_read_string_index(node, "clock-output-names",
 983						      i, &factors.name);
 984			break;
 985		}
 986	}
 987	/* If we don't have a .self clk use the first output-name up to '_' */
 988	if (factors.name == NULL) {
 989		char *endp;
 990
 991		of_property_read_string_index(node, "clock-output-names",
 992						      0, &clk_name);
 993		endp = strchr(clk_name, '_');
 994		if (endp) {
 995			derived_name = kstrndup(clk_name, endp - clk_name,
 996						GFP_KERNEL);
 997			factors.name = derived_name;
 998		} else {
 999			factors.name = clk_name;
1000		}
1001	}
1002
1003	/* Set up factor clock that we will be dividing */
1004	pclk = sunxi_factors_clk_setup(node, &factors);
1005	if (!pclk)
1006		return NULL;
1007
1008	parent = __clk_get_name(pclk);
1009	kfree(derived_name);
1010
1011	reg = of_iomap(node, 0);
1012	if (!reg) {
1013		pr_err("Could not map registers for divs-clk: %s\n",
1014		       of_node_full_name(node));
1015		return NULL;
1016	}
1017
1018	clk_data = kmalloc(sizeof(struct clk_onecell_data), GFP_KERNEL);
1019	if (!clk_data)
1020		goto out_unmap;
1021
1022	clks = kcalloc(ndivs, sizeof(*clks), GFP_KERNEL);
1023	if (!clks)
1024		goto free_clkdata;
1025
1026	clk_data->clks = clks;
1027
1028	/* It's not a good idea to have automatic reparenting changing
1029	 * our RAM clock! */
1030	clkflags = !strcmp("pll5", parent) ? 0 : CLK_SET_RATE_PARENT;
1031
1032	for (i = 0; i < ndivs; i++) {
1033		if (of_property_read_string_index(node, "clock-output-names",
1034						  i, &clk_name) != 0)
1035			break;
1036
1037		/* If this is the base factor clock, only update clks */
1038		if (data->div[i].self) {
1039			clk_data->clks[i] = pclk;
1040			continue;
1041		}
1042
1043		gate_hw = NULL;
1044		rate_hw = NULL;
1045		rate_ops = NULL;
1046
1047		/* If this leaf clock can be gated, create a gate */
1048		if (data->div[i].gate) {
1049			gate = kzalloc(sizeof(*gate), GFP_KERNEL);
1050			if (!gate)
1051				goto free_clks;
1052
1053			gate->reg = reg;
1054			gate->bit_idx = data->div[i].gate;
1055			gate->lock = &clk_lock;
1056
1057			gate_hw = &gate->hw;
1058		}
1059
1060		/* Leaves can be fixed or configurable divisors */
1061		if (data->div[i].fixed) {
1062			fix_factor = kzalloc(sizeof(*fix_factor), GFP_KERNEL);
1063			if (!fix_factor)
1064				goto free_gate;
1065
1066			fix_factor->mult = 1;
1067			fix_factor->div = data->div[i].fixed;
1068
1069			rate_hw = &fix_factor->hw;
1070			rate_ops = &clk_fixed_factor_ops;
1071		} else {
1072			divider = kzalloc(sizeof(*divider), GFP_KERNEL);
1073			if (!divider)
1074				goto free_gate;
1075
1076			flags = data->div[i].pow ? CLK_DIVIDER_POWER_OF_TWO : 0;
1077
1078			divider->reg = reg;
1079			divider->shift = data->div[i].shift;
1080			divider->width = SUNXI_DIVISOR_WIDTH;
1081			divider->flags = flags;
1082			divider->lock = &clk_lock;
1083			divider->table = data->div[i].table;
1084
1085			rate_hw = &divider->hw;
1086			rate_ops = &clk_divider_ops;
1087		}
1088
1089		/* Wrap the (potential) gate and the divisor on a composite
1090		 * clock to unify them */
1091		clks[i] = clk_register_composite(NULL, clk_name, &parent, 1,
1092						 NULL, NULL,
1093						 rate_hw, rate_ops,
1094						 gate_hw, &clk_gate_ops,
1095						 clkflags);
1096
1097		WARN_ON(IS_ERR(clk_data->clks[i]));
1098	}
1099
1100	/* Adjust to the real max */
1101	clk_data->clk_num = i;
1102
1103	if (of_clk_add_provider(node, of_clk_src_onecell_get, clk_data)) {
1104		pr_err("%s: failed to add clock provider for %s\n",
1105		       __func__, clk_name);
1106		goto free_gate;
1107	}
1108
1109	return clks;
1110free_gate:
1111	kfree(gate);
1112free_clks:
1113	kfree(clks);
1114free_clkdata:
1115	kfree(clk_data);
1116out_unmap:
1117	iounmap(reg);
1118	return NULL;
1119}
1120
1121static void __init sun4i_pll5_clk_setup(struct device_node *node)
1122{
1123	struct clk **clks;
1124
1125	clks = sunxi_divs_clk_setup(node, &pll5_divs_data);
1126	if (!clks)
1127		return;
1128
1129	/* Protect PLL5_DDR */
1130	__clk_get(clks[0]);
1131	clk_prepare_enable(clks[0]);
1132}
1133CLK_OF_DECLARE(sun4i_pll5, "allwinner,sun4i-a10-pll5-clk",
1134	       sun4i_pll5_clk_setup);
1135
1136static void __init sun4i_pll6_clk_setup(struct device_node *node)
1137{
1138	sunxi_divs_clk_setup(node, &pll6_divs_data);
1139}
1140CLK_OF_DECLARE(sun4i_pll6, "allwinner,sun4i-a10-pll6-clk",
1141	       sun4i_pll6_clk_setup);
1142
1143static void __init sun6i_pll6_clk_setup(struct device_node *node)
1144{
1145	sunxi_divs_clk_setup(node, &sun6i_a31_pll6_divs_data);
1146}
1147CLK_OF_DECLARE(sun6i_pll6, "allwinner,sun6i-a31-pll6-clk",
1148	       sun6i_pll6_clk_setup);
1149
1150/*
1151 * sun6i display
1152 *
1153 * rate = parent_rate / (m + 1);
1154 */
1155static void sun6i_display_factors(struct factors_request *req)
1156{
1157	u8 m;
1158
1159	if (req->rate > req->parent_rate)
1160		req->rate = req->parent_rate;
1161
1162	m = DIV_ROUND_UP(req->parent_rate, req->rate);
1163
1164	req->rate = req->parent_rate / m;
1165	req->m = m - 1;
1166}
1167
1168static const struct clk_factors_config sun6i_display_config = {
1169	.mshift = 0,
1170	.mwidth = 4,
1171};
1172
1173static const struct factors_data sun6i_display_data __initconst = {
1174	.enable = 31,
1175	.mux = 24,
1176	.muxmask = BIT(2) | BIT(1) | BIT(0),
1177	.table = &sun6i_display_config,
1178	.getter = sun6i_display_factors,
1179};
1180
1181static void __init sun6i_display_setup(struct device_node *node)
1182{
1183	sunxi_factors_clk_setup(node, &sun6i_display_data);
1184}
1185CLK_OF_DECLARE(sun6i_display, "allwinner,sun6i-a31-display-clk",
1186	       sun6i_display_setup);