cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

clk-sunxi.c (27752B)


      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);