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					       unsigned long flags)
 661{
 662	struct clk *clk;
 663	const char *clk_name = node->name;
 664	const char *parents[SUNXI_MAX_PARENTS];
 665	void __iomem *reg;
 666	int i;
 667
 668	reg = of_iomap(node, 0);
 669	if (!reg) {
 670		pr_err("Could not map registers for mux-clk: %pOF\n", 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 \"%pOF\"\n",
 677		       __func__, node);
 678		goto out_unmap;
 679	}
 680
 681	clk = clk_register_mux(NULL, clk_name, parents, i,
 682			       CLK_SET_RATE_PARENT | flags, 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	/* Protect CPU clock */
 708	sunxi_mux_clk_setup(node, &sun4i_cpu_mux_data, CLK_IS_CRITICAL);
 709}
 710CLK_OF_DECLARE(sun4i_cpu, "allwinner,sun4i-a10-cpu-clk",
 711	       sun4i_cpu_clk_setup);
 712
 713static void __init sun6i_ahb1_mux_clk_setup(struct device_node *node)
 714{
 715	sunxi_mux_clk_setup(node, &sun6i_a31_ahb1_mux_data, 0);
 716}
 717CLK_OF_DECLARE(sun6i_ahb1_mux, "allwinner,sun6i-a31-ahb1-mux-clk",
 718	       sun6i_ahb1_mux_clk_setup);
 719
 720static void __init sun8i_ahb2_clk_setup(struct device_node *node)
 721{
 722	sunxi_mux_clk_setup(node, &sun8i_h3_ahb2_mux_data, 0);
 723}
 724CLK_OF_DECLARE(sun8i_ahb2, "allwinner,sun8i-h3-ahb2-clk",
 725	       sun8i_ahb2_clk_setup);
 726
 727
 728/**
 729 * sunxi_divider_clk_setup() - Setup function for simple divider clocks
 730 */
 731
 732struct div_data {
 733	u8	shift;
 734	u8	pow;
 735	u8	width;
 736	const struct clk_div_table *table;
 737};
 738
 739static const struct div_data sun4i_axi_data __initconst = {
 740	.shift	= 0,
 741	.pow	= 0,
 742	.width	= 2,
 743};
 744
 745static const struct clk_div_table sun8i_a23_axi_table[] __initconst = {
 746	{ .val = 0, .div = 1 },
 747	{ .val = 1, .div = 2 },
 748	{ .val = 2, .div = 3 },
 749	{ .val = 3, .div = 4 },
 750	{ .val = 4, .div = 4 },
 751	{ .val = 5, .div = 4 },
 752	{ .val = 6, .div = 4 },
 753	{ .val = 7, .div = 4 },
 754	{ } /* sentinel */
 755};
 756
 757static const struct div_data sun8i_a23_axi_data __initconst = {
 758	.width	= 3,
 759	.table	= sun8i_a23_axi_table,
 760};
 761
 762static const struct div_data sun4i_ahb_data __initconst = {
 763	.shift	= 4,
 764	.pow	= 1,
 765	.width	= 2,
 766};
 767
 768static const struct clk_div_table sun4i_apb0_table[] __initconst = {
 769	{ .val = 0, .div = 2 },
 770	{ .val = 1, .div = 2 },
 771	{ .val = 2, .div = 4 },
 772	{ .val = 3, .div = 8 },
 773	{ } /* sentinel */
 774};
 775
 776static const struct div_data sun4i_apb0_data __initconst = {
 777	.shift	= 8,
 778	.pow	= 1,
 779	.width	= 2,
 780	.table	= sun4i_apb0_table,
 781};
 782
 783static void __init sunxi_divider_clk_setup(struct device_node *node,
 784					   const struct div_data *data)
 785{
 786	struct clk *clk;
 787	const char *clk_name = node->name;
 788	const char *clk_parent;
 789	void __iomem *reg;
 790
 791	reg = of_iomap(node, 0);
 792	if (!reg) {
 793		pr_err("Could not map registers for mux-clk: %pOF\n", node);
 794		return;
 795	}
 796
 797	clk_parent = of_clk_get_parent_name(node, 0);
 798
 799	if (of_property_read_string(node, "clock-output-names", &clk_name)) {
 800		pr_err("%s: could not read clock-output-names from \"%pOF\"\n",
 801		       __func__, node);
 802		goto out_unmap;
 803	}
 804
 805	clk = clk_register_divider_table(NULL, clk_name, clk_parent, 0,
 806					 reg, data->shift, data->width,
 807					 data->pow ? CLK_DIVIDER_POWER_OF_TWO : 0,
 808					 data->table, &clk_lock);
 809	if (IS_ERR(clk)) {
 810		pr_err("%s: failed to register divider clock %s: %ld\n",
 811		       __func__, clk_name, PTR_ERR(clk));
 812		goto out_unmap;
 813	}
 814
 815	if (of_clk_add_provider(node, of_clk_src_simple_get, clk)) {
 816		pr_err("%s: failed to add clock provider for %s\n",
 817		       __func__, clk_name);
 818		goto out_unregister;
 819	}
 820
 821	if (clk_register_clkdev(clk, clk_name, NULL)) {
 822		of_clk_del_provider(node);
 823		goto out_unregister;
 824	}
 825
 826	return;
 827out_unregister:
 828	clk_unregister_divider(clk);
 829
 830out_unmap:
 831	iounmap(reg);
 832}
 833
 834static void __init sun4i_ahb_clk_setup(struct device_node *node)
 835{
 836	sunxi_divider_clk_setup(node, &sun4i_ahb_data);
 837}
 838CLK_OF_DECLARE(sun4i_ahb, "allwinner,sun4i-a10-ahb-clk",
 839	       sun4i_ahb_clk_setup);
 840
 841static void __init sun4i_apb0_clk_setup(struct device_node *node)
 842{
 843	sunxi_divider_clk_setup(node, &sun4i_apb0_data);
 844}
 845CLK_OF_DECLARE(sun4i_apb0, "allwinner,sun4i-a10-apb0-clk",
 846	       sun4i_apb0_clk_setup);
 847
 848static void __init sun4i_axi_clk_setup(struct device_node *node)
 849{
 850	sunxi_divider_clk_setup(node, &sun4i_axi_data);
 851}
 852CLK_OF_DECLARE(sun4i_axi, "allwinner,sun4i-a10-axi-clk",
 853	       sun4i_axi_clk_setup);
 854
 855static void __init sun8i_axi_clk_setup(struct device_node *node)
 856{
 857	sunxi_divider_clk_setup(node, &sun8i_a23_axi_data);
 858}
 859CLK_OF_DECLARE(sun8i_axi, "allwinner,sun8i-a23-axi-clk",
 860	       sun8i_axi_clk_setup);
 861
 862
 863
 864/**
 865 * sunxi_gates_clk_setup() - Setup function for leaf gates on clocks
 866 */
 867
 868#define SUNXI_GATES_MAX_SIZE	64
 869
 870struct gates_data {
 871	DECLARE_BITMAP(mask, SUNXI_GATES_MAX_SIZE);
 872};
 873
 874/**
 875 * sunxi_divs_clk_setup() helper data
 876 */
 877
 878#define SUNXI_DIVS_MAX_QTY	4
 879#define SUNXI_DIVISOR_WIDTH	2
 880
 881struct divs_data {
 882	const struct factors_data *factors; /* data for the factor clock */
 883	int ndivs; /* number of outputs */
 884	/*
 885	 * List of outputs. Refer to the diagram for sunxi_divs_clk_setup():
 886	 * self or base factor clock refers to the output from the pll
 887	 * itself. The remaining refer to fixed or configurable divider
 888	 * outputs.
 889	 */
 890	struct {
 891		u8 self; /* is it the base factor clock? (only one) */
 892		u8 fixed; /* is it a fixed divisor? if not... */
 893		struct clk_div_table *table; /* is it a table based divisor? */
 894		u8 shift; /* otherwise it's a normal divisor with this shift */
 895		u8 pow;   /* is it power-of-two based? */
 896		u8 gate;  /* is it independently gateable? */
 897		bool critical;
 898	} div[SUNXI_DIVS_MAX_QTY];
 899};
 900
 901static struct clk_div_table pll6_sata_tbl[] = {
 902	{ .val = 0, .div = 6, },
 903	{ .val = 1, .div = 12, },
 904	{ .val = 2, .div = 18, },
 905	{ .val = 3, .div = 24, },
 906	{ } /* sentinel */
 907};
 908
 909static const struct divs_data pll5_divs_data __initconst = {
 910	.factors = &sun4i_pll5_data,
 911	.ndivs = 2,
 912	.div = {
 913		/* Protect PLL5_DDR */
 914		{ .shift = 0, .pow = 0, .critical = true }, /* M, DDR */
 915		{ .shift = 16, .pow = 1, }, /* P, other */
 916		/* No output for the base factor clock */
 917	}
 918};
 919
 920static const struct divs_data pll6_divs_data __initconst = {
 921	.factors = &sun4i_pll5_data,
 922	.ndivs = 4,
 923	.div = {
 924		{ .shift = 0, .table = pll6_sata_tbl, .gate = 14 }, /* M, SATA */
 925		{ .fixed = 2 }, /* P, other */
 926		{ .self = 1 }, /* base factor clock, 2x */
 927		{ .fixed = 4 }, /* pll6 / 4, used as ahb input */
 928	}
 929};
 930
 931static const struct divs_data sun6i_a31_pll6_divs_data __initconst = {
 932	.factors = &sun6i_a31_pll6_data,
 933	.ndivs = 2,
 934	.div = {
 935		{ .fixed = 2 }, /* normal output */
 936		{ .self = 1 }, /* base factor clock, 2x */
 937	}
 938};
 939
 940/**
 941 * sunxi_divs_clk_setup() - Setup function for leaf divisors on clocks
 942 *
 943 * These clocks look something like this
 944 *            ________________________
 945 *           |         ___divisor 1---|----> to consumer
 946 * parent >--|  pll___/___divisor 2---|----> to consumer
 947 *           |        \_______________|____> to consumer
 948 *           |________________________|
 949 */
 950
 951static struct clk ** __init sunxi_divs_clk_setup(struct device_node *node,
 952						 const struct divs_data *data)
 953{
 954	struct clk_onecell_data *clk_data;
 955	const char *parent;
 956	const char *clk_name;
 957	struct clk **clks, *pclk;
 958	struct clk_hw *gate_hw, *rate_hw;
 959	const struct clk_ops *rate_ops;
 960	struct clk_gate *gate = NULL;
 961	struct clk_fixed_factor *fix_factor;
 962	struct clk_divider *divider;
 963	struct factors_data factors = *data->factors;
 964	char *derived_name = NULL;
 965	void __iomem *reg;
 966	int ndivs = SUNXI_DIVS_MAX_QTY, i = 0;
 967	int flags, clkflags;
 968
 969	/* if number of children known, use it */
 970	if (data->ndivs)
 971		ndivs = data->ndivs;
 972
 973	/* Try to find a name for base factor clock */
 974	for (i = 0; i < ndivs; i++) {
 975		if (data->div[i].self) {
 976			of_property_read_string_index(node, "clock-output-names",
 977						      i, &factors.name);
 978			break;
 979		}
 980	}
 981	/* If we don't have a .self clk use the first output-name up to '_' */
 982	if (factors.name == NULL) {
 983		char *endp;
 984
 985		of_property_read_string_index(node, "clock-output-names",
 986						      0, &clk_name);
 987		endp = strchr(clk_name, '_');
 988		if (endp) {
 989			derived_name = kstrndup(clk_name, endp - clk_name,
 990						GFP_KERNEL);
 991			factors.name = derived_name;
 992		} else {
 993			factors.name = clk_name;
 994		}
 995	}
 996
 997	/* Set up factor clock that we will be dividing */
 998	pclk = sunxi_factors_clk_setup(node, &factors);
 999	if (!pclk)
1000		return NULL;
1001
1002	parent = __clk_get_name(pclk);
1003	kfree(derived_name);
1004
1005	reg = of_iomap(node, 0);
1006	if (!reg) {
1007		pr_err("Could not map registers for divs-clk: %pOF\n", node);
1008		return NULL;
1009	}
1010
1011	clk_data = kmalloc(sizeof(struct clk_onecell_data), GFP_KERNEL);
1012	if (!clk_data)
1013		goto out_unmap;
1014
1015	clks = kcalloc(ndivs, sizeof(*clks), GFP_KERNEL);
1016	if (!clks)
1017		goto free_clkdata;
1018
1019	clk_data->clks = clks;
1020
1021	/* It's not a good idea to have automatic reparenting changing
1022	 * our RAM clock! */
1023	clkflags = !strcmp("pll5", parent) ? 0 : CLK_SET_RATE_PARENT;
1024
1025	for (i = 0; i < ndivs; i++) {
1026		if (of_property_read_string_index(node, "clock-output-names",
1027						  i, &clk_name) != 0)
1028			break;
1029
1030		/* If this is the base factor clock, only update clks */
1031		if (data->div[i].self) {
1032			clk_data->clks[i] = pclk;
1033			continue;
1034		}
1035
1036		gate_hw = NULL;
1037		rate_hw = NULL;
1038		rate_ops = NULL;
1039
1040		/* If this leaf clock can be gated, create a gate */
1041		if (data->div[i].gate) {
1042			gate = kzalloc(sizeof(*gate), GFP_KERNEL);
1043			if (!gate)
1044				goto free_clks;
1045
1046			gate->reg = reg;
1047			gate->bit_idx = data->div[i].gate;
1048			gate->lock = &clk_lock;
1049
1050			gate_hw = &gate->hw;
1051		}
1052
1053		/* Leaves can be fixed or configurable divisors */
1054		if (data->div[i].fixed) {
1055			fix_factor = kzalloc(sizeof(*fix_factor), GFP_KERNEL);
1056			if (!fix_factor)
1057				goto free_gate;
1058
1059			fix_factor->mult = 1;
1060			fix_factor->div = data->div[i].fixed;
1061
1062			rate_hw = &fix_factor->hw;
1063			rate_ops = &clk_fixed_factor_ops;
1064		} else {
1065			divider = kzalloc(sizeof(*divider), GFP_KERNEL);
1066			if (!divider)
1067				goto free_gate;
1068
1069			flags = data->div[i].pow ? CLK_DIVIDER_POWER_OF_TWO : 0;
1070
1071			divider->reg = reg;
1072			divider->shift = data->div[i].shift;
1073			divider->width = SUNXI_DIVISOR_WIDTH;
1074			divider->flags = flags;
1075			divider->lock = &clk_lock;
1076			divider->table = data->div[i].table;
1077
1078			rate_hw = &divider->hw;
1079			rate_ops = &clk_divider_ops;
1080		}
1081
1082		/* Wrap the (potential) gate and the divisor on a composite
1083		 * clock to unify them */
1084		clks[i] = clk_register_composite(NULL, clk_name, &parent, 1,
1085						 NULL, NULL,
1086						 rate_hw, rate_ops,
1087						 gate_hw, &clk_gate_ops,
1088						 clkflags |
1089						 data->div[i].critical ?
1090							CLK_IS_CRITICAL : 0);
1091
1092		WARN_ON(IS_ERR(clk_data->clks[i]));
1093	}
1094
1095	/* Adjust to the real max */
1096	clk_data->clk_num = i;
1097
1098	if (of_clk_add_provider(node, of_clk_src_onecell_get, clk_data)) {
1099		pr_err("%s: failed to add clock provider for %s\n",
1100		       __func__, clk_name);
1101		goto free_gate;
1102	}
1103
1104	return clks;
1105free_gate:
1106	kfree(gate);
1107free_clks:
1108	kfree(clks);
1109free_clkdata:
1110	kfree(clk_data);
1111out_unmap:
1112	iounmap(reg);
1113	return NULL;
1114}
1115
1116static void __init sun4i_pll5_clk_setup(struct device_node *node)
1117{
1118	sunxi_divs_clk_setup(node, &pll5_divs_data);
1119}
1120CLK_OF_DECLARE(sun4i_pll5, "allwinner,sun4i-a10-pll5-clk",
1121	       sun4i_pll5_clk_setup);
1122
1123static void __init sun4i_pll6_clk_setup(struct device_node *node)
1124{
1125	sunxi_divs_clk_setup(node, &pll6_divs_data);
1126}
1127CLK_OF_DECLARE(sun4i_pll6, "allwinner,sun4i-a10-pll6-clk",
1128	       sun4i_pll6_clk_setup);
1129
1130static void __init sun6i_pll6_clk_setup(struct device_node *node)
1131{
1132	sunxi_divs_clk_setup(node, &sun6i_a31_pll6_divs_data);
1133}
1134CLK_OF_DECLARE(sun6i_pll6, "allwinner,sun6i-a31-pll6-clk",
1135	       sun6i_pll6_clk_setup);
1136
1137/*
1138 * sun6i display
1139 *
1140 * rate = parent_rate / (m + 1);
1141 */
1142static void sun6i_display_factors(struct factors_request *req)
1143{
1144	u8 m;
1145
1146	if (req->rate > req->parent_rate)
1147		req->rate = req->parent_rate;
1148
1149	m = DIV_ROUND_UP(req->parent_rate, req->rate);
1150
1151	req->rate = req->parent_rate / m;
1152	req->m = m - 1;
1153}
1154
1155static const struct clk_factors_config sun6i_display_config = {
1156	.mshift = 0,
1157	.mwidth = 4,
1158};
1159
1160static const struct factors_data sun6i_display_data __initconst = {
1161	.enable = 31,
1162	.mux = 24,
1163	.muxmask = BIT(2) | BIT(1) | BIT(0),
1164	.table = &sun6i_display_config,
1165	.getter = sun6i_display_factors,
1166};
1167
1168static void __init sun6i_display_setup(struct device_node *node)
1169{
1170	sunxi_factors_clk_setup(node, &sun6i_display_data);
1171}
1172CLK_OF_DECLARE(sun6i_display, "allwinner,sun6i-a31-display-clk",
1173	       sun6i_display_setup);