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