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-qoriq.c (38361B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 * Copyright 2013 Freescale Semiconductor, Inc.
      4 * Copyright 2021 NXP
      5 *
      6 * clock driver for Freescale QorIQ SoCs.
      7 */
      8
      9#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
     10
     11#include <dt-bindings/clock/fsl,qoriq-clockgen.h>
     12#include <linux/clk.h>
     13#include <linux/clk-provider.h>
     14#include <linux/clkdev.h>
     15#include <linux/fsl/guts.h>
     16#include <linux/io.h>
     17#include <linux/kernel.h>
     18#include <linux/module.h>
     19#include <linux/of_address.h>
     20#include <linux/of_platform.h>
     21#include <linux/of.h>
     22#include <linux/slab.h>
     23
     24#define PLL_DIV1	0
     25#define PLL_DIV2	1
     26#define PLL_DIV3	2
     27#define PLL_DIV4	3
     28
     29#define PLATFORM_PLL	0
     30#define CGA_PLL1	1
     31#define CGA_PLL2	2
     32#define CGA_PLL3	3
     33#define CGA_PLL4	4	/* only on clockgen-1.0, which lacks CGB */
     34#define CGB_PLL1	4
     35#define CGB_PLL2	5
     36#define MAX_PLL_DIV	32
     37
     38struct clockgen_pll_div {
     39	struct clk *clk;
     40	char name[32];
     41};
     42
     43struct clockgen_pll {
     44	struct clockgen_pll_div div[MAX_PLL_DIV];
     45};
     46
     47#define CLKSEL_VALID	1
     48#define CLKSEL_80PCT	2	/* Only allowed if PLL <= 80% of max cpu freq */
     49
     50struct clockgen_sourceinfo {
     51	u32 flags;	/* CLKSEL_xxx */
     52	int pll;	/* CGx_PLLn */
     53	int div;	/* PLL_DIVn */
     54};
     55
     56#define NUM_MUX_PARENTS	16
     57
     58struct clockgen_muxinfo {
     59	struct clockgen_sourceinfo clksel[NUM_MUX_PARENTS];
     60};
     61
     62#define NUM_HWACCEL	5
     63#define NUM_CMUX	8
     64
     65struct clockgen;
     66
     67/*
     68 * cmux freq must be >= platform pll.
     69 * If not set, cmux freq must be >= platform pll/2
     70 */
     71#define CG_CMUX_GE_PLAT		1
     72
     73#define CG_PLL_8BIT		2	/* PLLCnGSR[CFG] is 8 bits, not 6 */
     74#define CG_VER3			4	/* version 3 cg: reg layout different */
     75#define CG_LITTLE_ENDIAN	8
     76
     77struct clockgen_chipinfo {
     78	const char *compat, *guts_compat;
     79	const struct clockgen_muxinfo *cmux_groups[2];
     80	const struct clockgen_muxinfo *hwaccel[NUM_HWACCEL];
     81	void (*init_periph)(struct clockgen *cg);
     82	int cmux_to_group[NUM_CMUX + 1]; /* array should be -1 terminated */
     83	u32 pll_mask;	/* 1 << n bit set if PLL n is valid */
     84	u32 flags;	/* CG_xxx */
     85};
     86
     87struct clockgen {
     88	struct device_node *node;
     89	void __iomem *regs;
     90	struct clockgen_chipinfo info; /* mutable copy */
     91	struct clk *sysclk, *coreclk;
     92	struct clockgen_pll pll[6];
     93	struct clk *cmux[NUM_CMUX];
     94	struct clk *hwaccel[NUM_HWACCEL];
     95	struct clk *fman[2];
     96	struct ccsr_guts __iomem *guts;
     97};
     98
     99static struct clockgen clockgen;
    100static bool add_cpufreq_dev __initdata;
    101
    102static void cg_out(struct clockgen *cg, u32 val, u32 __iomem *reg)
    103{
    104	if (cg->info.flags & CG_LITTLE_ENDIAN)
    105		iowrite32(val, reg);
    106	else
    107		iowrite32be(val, reg);
    108}
    109
    110static u32 cg_in(struct clockgen *cg, u32 __iomem *reg)
    111{
    112	u32 val;
    113
    114	if (cg->info.flags & CG_LITTLE_ENDIAN)
    115		val = ioread32(reg);
    116	else
    117		val = ioread32be(reg);
    118
    119	return val;
    120}
    121
    122static const struct clockgen_muxinfo p2041_cmux_grp1 = {
    123	{
    124		[0] = { CLKSEL_VALID, CGA_PLL1, PLL_DIV1 },
    125		[1] = { CLKSEL_VALID, CGA_PLL1, PLL_DIV2 },
    126		[4] = { CLKSEL_VALID, CGA_PLL2, PLL_DIV1 },
    127	}
    128};
    129
    130static const struct clockgen_muxinfo p2041_cmux_grp2 = {
    131	{
    132		[0] = { CLKSEL_VALID, CGA_PLL1, PLL_DIV1 },
    133		[4] = { CLKSEL_VALID, CGA_PLL2, PLL_DIV1 },
    134		[5] = { CLKSEL_VALID, CGA_PLL2, PLL_DIV2 },
    135	}
    136};
    137
    138static const struct clockgen_muxinfo p5020_cmux_grp1 = {
    139	{
    140		[0] = { CLKSEL_VALID, CGA_PLL1, PLL_DIV1 },
    141		[1] = { CLKSEL_VALID, CGA_PLL1, PLL_DIV2 },
    142		[4] = { CLKSEL_VALID | CLKSEL_80PCT, CGA_PLL2, PLL_DIV1 },
    143	}
    144};
    145
    146static const struct clockgen_muxinfo p5020_cmux_grp2 = {
    147	{
    148		[0] = { CLKSEL_VALID | CLKSEL_80PCT, CGA_PLL1, PLL_DIV1 },
    149		[4] = { CLKSEL_VALID, CGA_PLL2, PLL_DIV1 },
    150		[5] = { CLKSEL_VALID, CGA_PLL2, PLL_DIV2 },
    151	}
    152};
    153
    154static const struct clockgen_muxinfo p5040_cmux_grp1 = {
    155	{
    156		[0] = { CLKSEL_VALID, CGA_PLL1, PLL_DIV1 },
    157		[1] = { CLKSEL_VALID, CGA_PLL1, PLL_DIV2 },
    158		[4] = { CLKSEL_VALID | CLKSEL_80PCT, CGA_PLL2, PLL_DIV1 },
    159		[5] = { CLKSEL_VALID | CLKSEL_80PCT, CGA_PLL2, PLL_DIV2 },
    160	}
    161};
    162
    163static const struct clockgen_muxinfo p5040_cmux_grp2 = {
    164	{
    165		[0] = { CLKSEL_VALID | CLKSEL_80PCT, CGA_PLL1, PLL_DIV1 },
    166		[1] = { CLKSEL_VALID | CLKSEL_80PCT, CGA_PLL1, PLL_DIV2 },
    167		[4] = { CLKSEL_VALID, CGA_PLL2, PLL_DIV1 },
    168		[5] = { CLKSEL_VALID, CGA_PLL2, PLL_DIV2 },
    169	}
    170};
    171
    172static const struct clockgen_muxinfo p4080_cmux_grp1 = {
    173	{
    174		[0] = { CLKSEL_VALID, CGA_PLL1, PLL_DIV1 },
    175		[1] = { CLKSEL_VALID, CGA_PLL1, PLL_DIV2 },
    176		[4] = { CLKSEL_VALID, CGA_PLL2, PLL_DIV1 },
    177		[5] = { CLKSEL_VALID, CGA_PLL2, PLL_DIV2 },
    178		[8] = { CLKSEL_VALID | CLKSEL_80PCT, CGA_PLL3, PLL_DIV1 },
    179	}
    180};
    181
    182static const struct clockgen_muxinfo p4080_cmux_grp2 = {
    183	{
    184		[0] = { CLKSEL_VALID | CLKSEL_80PCT, CGA_PLL1, PLL_DIV1 },
    185		[8] = { CLKSEL_VALID, CGA_PLL3, PLL_DIV1 },
    186		[9] = { CLKSEL_VALID, CGA_PLL3, PLL_DIV2 },
    187		[12] = { CLKSEL_VALID, CGA_PLL4, PLL_DIV1 },
    188		[13] = { CLKSEL_VALID, CGA_PLL4, PLL_DIV2 },
    189	}
    190};
    191
    192static const struct clockgen_muxinfo t1023_cmux = {
    193	{
    194		[0] = { CLKSEL_VALID, CGA_PLL1, PLL_DIV1 },
    195		[1] = { CLKSEL_VALID, CGA_PLL1, PLL_DIV2 },
    196	}
    197};
    198
    199static const struct clockgen_muxinfo t1040_cmux = {
    200	{
    201		[0] = { CLKSEL_VALID, CGA_PLL1, PLL_DIV1 },
    202		[1] = { CLKSEL_VALID, CGA_PLL1, PLL_DIV2 },
    203		[4] = { CLKSEL_VALID, CGA_PLL2, PLL_DIV1 },
    204		[5] = { CLKSEL_VALID, CGA_PLL2, PLL_DIV2 },
    205	}
    206};
    207
    208
    209static const struct clockgen_muxinfo clockgen2_cmux_cga = {
    210	{
    211		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV1 },
    212		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV2 },
    213		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV4 },
    214		{},
    215		{ CLKSEL_VALID, CGA_PLL2, PLL_DIV1 },
    216		{ CLKSEL_VALID, CGA_PLL2, PLL_DIV2 },
    217		{ CLKSEL_VALID, CGA_PLL2, PLL_DIV4 },
    218		{},
    219		{ CLKSEL_VALID, CGA_PLL3, PLL_DIV1 },
    220		{ CLKSEL_VALID, CGA_PLL3, PLL_DIV2 },
    221		{ CLKSEL_VALID, CGA_PLL3, PLL_DIV4 },
    222	},
    223};
    224
    225static const struct clockgen_muxinfo clockgen2_cmux_cga12 = {
    226	{
    227		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV1 },
    228		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV2 },
    229		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV4 },
    230		{},
    231		{ CLKSEL_VALID, CGA_PLL2, PLL_DIV1 },
    232		{ CLKSEL_VALID, CGA_PLL2, PLL_DIV2 },
    233		{ CLKSEL_VALID, CGA_PLL2, PLL_DIV4 },
    234	},
    235};
    236
    237static const struct clockgen_muxinfo clockgen2_cmux_cgb = {
    238	{
    239		{ CLKSEL_VALID, CGB_PLL1, PLL_DIV1 },
    240		{ CLKSEL_VALID, CGB_PLL1, PLL_DIV2 },
    241		{ CLKSEL_VALID, CGB_PLL1, PLL_DIV4 },
    242		{},
    243		{ CLKSEL_VALID, CGB_PLL2, PLL_DIV1 },
    244		{ CLKSEL_VALID, CGB_PLL2, PLL_DIV2 },
    245		{ CLKSEL_VALID, CGB_PLL2, PLL_DIV4 },
    246	},
    247};
    248
    249static const struct clockgen_muxinfo ls1021a_cmux = {
    250	{
    251		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV1 },
    252		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV2 },
    253		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV4 },
    254	}
    255};
    256
    257static const struct clockgen_muxinfo ls1028a_hwa1 = {
    258	{
    259		{ CLKSEL_VALID, PLATFORM_PLL, PLL_DIV1 },
    260		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV1 },
    261		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV2 },
    262		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV3 },
    263		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV4 },
    264		{},
    265		{ CLKSEL_VALID, CGA_PLL2, PLL_DIV2 },
    266		{ CLKSEL_VALID, CGA_PLL2, PLL_DIV3 },
    267	},
    268};
    269
    270static const struct clockgen_muxinfo ls1028a_hwa2 = {
    271	{
    272		{ CLKSEL_VALID, PLATFORM_PLL, PLL_DIV1 },
    273		{ CLKSEL_VALID, CGA_PLL2, PLL_DIV1 },
    274		{ CLKSEL_VALID, CGA_PLL2, PLL_DIV2 },
    275		{ CLKSEL_VALID, CGA_PLL2, PLL_DIV3 },
    276		{ CLKSEL_VALID, CGA_PLL2, PLL_DIV4 },
    277		{},
    278		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV2 },
    279		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV3 },
    280	},
    281};
    282
    283static const struct clockgen_muxinfo ls1028a_hwa3 = {
    284	{
    285		{ CLKSEL_VALID, PLATFORM_PLL, PLL_DIV1 },
    286		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV1 },
    287		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV2 },
    288		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV3 },
    289		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV4 },
    290		{},
    291		{ CLKSEL_VALID, CGA_PLL2, PLL_DIV2 },
    292		{ CLKSEL_VALID, CGA_PLL2, PLL_DIV3 },
    293	},
    294};
    295
    296static const struct clockgen_muxinfo ls1028a_hwa4 = {
    297	{
    298		{ CLKSEL_VALID, PLATFORM_PLL, PLL_DIV1 },
    299		{ CLKSEL_VALID, CGA_PLL2, PLL_DIV1 },
    300		{ CLKSEL_VALID, CGA_PLL2, PLL_DIV2 },
    301		{ CLKSEL_VALID, CGA_PLL2, PLL_DIV3 },
    302		{ CLKSEL_VALID, CGA_PLL2, PLL_DIV4 },
    303		{},
    304		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV2 },
    305		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV3 },
    306	},
    307};
    308
    309static const struct clockgen_muxinfo ls1043a_hwa1 = {
    310	{
    311		{},
    312		{},
    313		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV2 },
    314		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV3 },
    315		{},
    316		{},
    317		{ CLKSEL_VALID, CGA_PLL2, PLL_DIV2 },
    318		{ CLKSEL_VALID, CGA_PLL2, PLL_DIV3 },
    319	},
    320};
    321
    322static const struct clockgen_muxinfo ls1043a_hwa2 = {
    323	{
    324		{},
    325		{ CLKSEL_VALID, CGA_PLL2, PLL_DIV1 },
    326		{},
    327		{ CLKSEL_VALID, CGA_PLL2, PLL_DIV3 },
    328	},
    329};
    330
    331static const struct clockgen_muxinfo ls1046a_hwa1 = {
    332	{
    333		{},
    334		{},
    335		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV2 },
    336		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV3 },
    337		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV4 },
    338		{ CLKSEL_VALID, PLATFORM_PLL, PLL_DIV1 },
    339		{ CLKSEL_VALID, CGA_PLL2, PLL_DIV2 },
    340		{ CLKSEL_VALID, CGA_PLL2, PLL_DIV3 },
    341	},
    342};
    343
    344static const struct clockgen_muxinfo ls1046a_hwa2 = {
    345	{
    346		{},
    347		{ CLKSEL_VALID, CGA_PLL2, PLL_DIV1 },
    348		{ CLKSEL_VALID, CGA_PLL2, PLL_DIV2 },
    349		{ CLKSEL_VALID, CGA_PLL2, PLL_DIV3 },
    350		{},
    351		{},
    352		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV2 },
    353	},
    354};
    355
    356static const struct clockgen_muxinfo ls1088a_hwa1 = {
    357	{
    358		{},
    359		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV1 },
    360		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV2 },
    361		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV3 },
    362		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV4 },
    363		{},
    364		{ CLKSEL_VALID, CGA_PLL2, PLL_DIV2 },
    365		{ CLKSEL_VALID, CGA_PLL2, PLL_DIV3 },
    366	},
    367};
    368
    369static const struct clockgen_muxinfo ls1088a_hwa2 = {
    370	{
    371		{},
    372		{ CLKSEL_VALID, CGA_PLL2, PLL_DIV1 },
    373		{ CLKSEL_VALID, CGA_PLL2, PLL_DIV2 },
    374		{ CLKSEL_VALID, CGA_PLL2, PLL_DIV3 },
    375		{ CLKSEL_VALID, CGA_PLL2, PLL_DIV4 },
    376		{},
    377		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV2 },
    378		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV3 },
    379	},
    380};
    381
    382static const struct clockgen_muxinfo ls1012a_cmux = {
    383	{
    384		[0] = { CLKSEL_VALID, CGA_PLL1, PLL_DIV1 },
    385		{},
    386		[2] = { CLKSEL_VALID, CGA_PLL1, PLL_DIV2 },
    387	}
    388};
    389
    390static const struct clockgen_muxinfo t1023_hwa1 = {
    391	{
    392		{},
    393		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV1 },
    394		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV2 },
    395		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV3 },
    396	},
    397};
    398
    399static const struct clockgen_muxinfo t1023_hwa2 = {
    400	{
    401		[6] = { CLKSEL_VALID, CGA_PLL1, PLL_DIV2 },
    402	},
    403};
    404
    405static const struct clockgen_muxinfo t2080_hwa1 = {
    406	{
    407		{},
    408		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV1 },
    409		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV2 },
    410		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV3 },
    411		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV4 },
    412		{ CLKSEL_VALID, PLATFORM_PLL, PLL_DIV1 },
    413		{ CLKSEL_VALID, CGA_PLL2, PLL_DIV2 },
    414		{ CLKSEL_VALID, CGA_PLL2, PLL_DIV3 },
    415	},
    416};
    417
    418static const struct clockgen_muxinfo t2080_hwa2 = {
    419	{
    420		{},
    421		{ CLKSEL_VALID, CGA_PLL2, PLL_DIV1 },
    422		{ CLKSEL_VALID, CGA_PLL2, PLL_DIV2 },
    423		{ CLKSEL_VALID, CGA_PLL2, PLL_DIV3 },
    424		{ CLKSEL_VALID, CGA_PLL2, PLL_DIV4 },
    425		{ CLKSEL_VALID, PLATFORM_PLL, PLL_DIV1 },
    426		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV2 },
    427		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV3 },
    428	},
    429};
    430
    431static const struct clockgen_muxinfo t4240_hwa1 = {
    432	{
    433		{ CLKSEL_VALID, PLATFORM_PLL, PLL_DIV2 },
    434		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV1 },
    435		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV2 },
    436		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV3 },
    437		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV4 },
    438		{},
    439		{ CLKSEL_VALID, CGA_PLL2, PLL_DIV2 },
    440		{ CLKSEL_VALID, CGA_PLL2, PLL_DIV3 },
    441	},
    442};
    443
    444static const struct clockgen_muxinfo t4240_hwa4 = {
    445	{
    446		[2] = { CLKSEL_VALID, CGB_PLL1, PLL_DIV2 },
    447		[3] = { CLKSEL_VALID, CGB_PLL1, PLL_DIV3 },
    448		[4] = { CLKSEL_VALID, CGB_PLL1, PLL_DIV4 },
    449		[5] = { CLKSEL_VALID, PLATFORM_PLL, PLL_DIV1 },
    450		[6] = { CLKSEL_VALID, CGB_PLL2, PLL_DIV2 },
    451	},
    452};
    453
    454static const struct clockgen_muxinfo t4240_hwa5 = {
    455	{
    456		[2] = { CLKSEL_VALID, CGB_PLL2, PLL_DIV2 },
    457		[3] = { CLKSEL_VALID, CGB_PLL2, PLL_DIV3 },
    458		[4] = { CLKSEL_VALID, CGB_PLL2, PLL_DIV4 },
    459		[5] = { CLKSEL_VALID, PLATFORM_PLL, PLL_DIV1 },
    460		[6] = { CLKSEL_VALID, CGB_PLL1, PLL_DIV2 },
    461		[7] = { CLKSEL_VALID, CGB_PLL1, PLL_DIV3 },
    462	},
    463};
    464
    465#define RCWSR7_FM1_CLK_SEL	0x40000000
    466#define RCWSR7_FM2_CLK_SEL	0x20000000
    467#define RCWSR7_HWA_ASYNC_DIV	0x04000000
    468
    469static void __init p2041_init_periph(struct clockgen *cg)
    470{
    471	u32 reg;
    472
    473	reg = ioread32be(&cg->guts->rcwsr[7]);
    474
    475	if (reg & RCWSR7_FM1_CLK_SEL)
    476		cg->fman[0] = cg->pll[CGA_PLL2].div[PLL_DIV2].clk;
    477	else
    478		cg->fman[0] = cg->pll[PLATFORM_PLL].div[PLL_DIV2].clk;
    479}
    480
    481static void __init p4080_init_periph(struct clockgen *cg)
    482{
    483	u32 reg;
    484
    485	reg = ioread32be(&cg->guts->rcwsr[7]);
    486
    487	if (reg & RCWSR7_FM1_CLK_SEL)
    488		cg->fman[0] = cg->pll[CGA_PLL3].div[PLL_DIV2].clk;
    489	else
    490		cg->fman[0] = cg->pll[PLATFORM_PLL].div[PLL_DIV2].clk;
    491
    492	if (reg & RCWSR7_FM2_CLK_SEL)
    493		cg->fman[1] = cg->pll[CGA_PLL3].div[PLL_DIV2].clk;
    494	else
    495		cg->fman[1] = cg->pll[PLATFORM_PLL].div[PLL_DIV2].clk;
    496}
    497
    498static void __init p5020_init_periph(struct clockgen *cg)
    499{
    500	u32 reg;
    501	int div = PLL_DIV2;
    502
    503	reg = ioread32be(&cg->guts->rcwsr[7]);
    504	if (reg & RCWSR7_HWA_ASYNC_DIV)
    505		div = PLL_DIV4;
    506
    507	if (reg & RCWSR7_FM1_CLK_SEL)
    508		cg->fman[0] = cg->pll[CGA_PLL2].div[div].clk;
    509	else
    510		cg->fman[0] = cg->pll[PLATFORM_PLL].div[PLL_DIV2].clk;
    511}
    512
    513static void __init p5040_init_periph(struct clockgen *cg)
    514{
    515	u32 reg;
    516	int div = PLL_DIV2;
    517
    518	reg = ioread32be(&cg->guts->rcwsr[7]);
    519	if (reg & RCWSR7_HWA_ASYNC_DIV)
    520		div = PLL_DIV4;
    521
    522	if (reg & RCWSR7_FM1_CLK_SEL)
    523		cg->fman[0] = cg->pll[CGA_PLL3].div[div].clk;
    524	else
    525		cg->fman[0] = cg->pll[PLATFORM_PLL].div[PLL_DIV2].clk;
    526
    527	if (reg & RCWSR7_FM2_CLK_SEL)
    528		cg->fman[1] = cg->pll[CGA_PLL3].div[div].clk;
    529	else
    530		cg->fman[1] = cg->pll[PLATFORM_PLL].div[PLL_DIV2].clk;
    531}
    532
    533static void __init t1023_init_periph(struct clockgen *cg)
    534{
    535	cg->fman[0] = cg->hwaccel[1];
    536}
    537
    538static void __init t1040_init_periph(struct clockgen *cg)
    539{
    540	cg->fman[0] = cg->pll[PLATFORM_PLL].div[PLL_DIV1].clk;
    541}
    542
    543static void __init t2080_init_periph(struct clockgen *cg)
    544{
    545	cg->fman[0] = cg->hwaccel[0];
    546}
    547
    548static void __init t4240_init_periph(struct clockgen *cg)
    549{
    550	cg->fman[0] = cg->hwaccel[3];
    551	cg->fman[1] = cg->hwaccel[4];
    552}
    553
    554static const struct clockgen_chipinfo chipinfo[] = {
    555	{
    556		.compat = "fsl,b4420-clockgen",
    557		.guts_compat = "fsl,b4860-device-config",
    558		.init_periph = t2080_init_periph,
    559		.cmux_groups = {
    560			&clockgen2_cmux_cga12, &clockgen2_cmux_cgb
    561		},
    562		.hwaccel = {
    563			&t2080_hwa1
    564		},
    565		.cmux_to_group = {
    566			0, 1, 1, 1, -1
    567		},
    568		.pll_mask = BIT(PLATFORM_PLL) |
    569			    BIT(CGA_PLL1) | BIT(CGA_PLL2) | BIT(CGA_PLL3) |
    570			    BIT(CGB_PLL1) | BIT(CGB_PLL2),
    571		.flags = CG_PLL_8BIT,
    572	},
    573	{
    574		.compat = "fsl,b4860-clockgen",
    575		.guts_compat = "fsl,b4860-device-config",
    576		.init_periph = t2080_init_periph,
    577		.cmux_groups = {
    578			&clockgen2_cmux_cga12, &clockgen2_cmux_cgb
    579		},
    580		.hwaccel = {
    581			&t2080_hwa1
    582		},
    583		.cmux_to_group = {
    584			0, 1, 1, 1, -1
    585		},
    586		.pll_mask = BIT(PLATFORM_PLL) |
    587			    BIT(CGA_PLL1) | BIT(CGA_PLL2) | BIT(CGA_PLL3) |
    588			    BIT(CGB_PLL1) | BIT(CGB_PLL2),
    589		.flags = CG_PLL_8BIT,
    590	},
    591	{
    592		.compat = "fsl,ls1021a-clockgen",
    593		.cmux_groups = {
    594			&ls1021a_cmux
    595		},
    596		.cmux_to_group = {
    597			0, -1
    598		},
    599		.pll_mask = BIT(PLATFORM_PLL) |
    600			    BIT(CGA_PLL1) | BIT(CGA_PLL2),
    601	},
    602	{
    603		.compat = "fsl,ls1028a-clockgen",
    604		.cmux_groups = {
    605			&clockgen2_cmux_cga12
    606		},
    607		.hwaccel = {
    608			&ls1028a_hwa1, &ls1028a_hwa2,
    609			&ls1028a_hwa3, &ls1028a_hwa4
    610		},
    611		.cmux_to_group = {
    612			0, 0, 0, 0, -1
    613		},
    614		.pll_mask = BIT(PLATFORM_PLL) |
    615			    BIT(CGA_PLL1) | BIT(CGA_PLL2),
    616		.flags = CG_VER3 | CG_LITTLE_ENDIAN,
    617	},
    618	{
    619		.compat = "fsl,ls1043a-clockgen",
    620		.init_periph = t2080_init_periph,
    621		.cmux_groups = {
    622			&t1040_cmux
    623		},
    624		.hwaccel = {
    625			&ls1043a_hwa1, &ls1043a_hwa2
    626		},
    627		.cmux_to_group = {
    628			0, -1
    629		},
    630		.pll_mask = BIT(PLATFORM_PLL) |
    631			    BIT(CGA_PLL1) | BIT(CGA_PLL2),
    632		.flags = CG_PLL_8BIT,
    633	},
    634	{
    635		.compat = "fsl,ls1046a-clockgen",
    636		.init_periph = t2080_init_periph,
    637		.cmux_groups = {
    638			&t1040_cmux
    639		},
    640		.hwaccel = {
    641			&ls1046a_hwa1, &ls1046a_hwa2
    642		},
    643		.cmux_to_group = {
    644			0, -1
    645		},
    646		.pll_mask = BIT(PLATFORM_PLL) |
    647			    BIT(CGA_PLL1) | BIT(CGA_PLL2),
    648		.flags = CG_PLL_8BIT,
    649	},
    650	{
    651		.compat = "fsl,ls1088a-clockgen",
    652		.cmux_groups = {
    653			&clockgen2_cmux_cga12
    654		},
    655		.hwaccel = {
    656			&ls1088a_hwa1, &ls1088a_hwa2
    657		},
    658		.cmux_to_group = {
    659			0, 0, -1
    660		},
    661		.pll_mask = BIT(PLATFORM_PLL) |
    662			    BIT(CGA_PLL1) | BIT(CGA_PLL2),
    663		.flags = CG_VER3 | CG_LITTLE_ENDIAN,
    664	},
    665	{
    666		.compat = "fsl,ls1012a-clockgen",
    667		.cmux_groups = {
    668			&ls1012a_cmux
    669		},
    670		.cmux_to_group = {
    671			0, -1
    672		},
    673		.pll_mask = BIT(PLATFORM_PLL) | BIT(CGA_PLL1),
    674	},
    675	{
    676		.compat = "fsl,ls2080a-clockgen",
    677		.cmux_groups = {
    678			&clockgen2_cmux_cga12, &clockgen2_cmux_cgb
    679		},
    680		.cmux_to_group = {
    681			0, 0, 1, 1, -1
    682		},
    683		.pll_mask = BIT(PLATFORM_PLL) |
    684			    BIT(CGA_PLL1) | BIT(CGA_PLL2) |
    685			    BIT(CGB_PLL1) | BIT(CGB_PLL2),
    686		.flags = CG_VER3 | CG_LITTLE_ENDIAN,
    687	},
    688	{
    689		.compat = "fsl,lx2160a-clockgen",
    690		.cmux_groups = {
    691			&clockgen2_cmux_cga12, &clockgen2_cmux_cgb
    692		},
    693		.cmux_to_group = {
    694			0, 0, 0, 0, 1, 1, 1, 1, -1
    695		},
    696		.pll_mask = BIT(PLATFORM_PLL) |
    697			    BIT(CGA_PLL1) | BIT(CGA_PLL2) |
    698			    BIT(CGB_PLL1) | BIT(CGB_PLL2),
    699		.flags = CG_VER3 | CG_LITTLE_ENDIAN,
    700	},
    701	{
    702		.compat = "fsl,p2041-clockgen",
    703		.guts_compat = "fsl,qoriq-device-config-1.0",
    704		.init_periph = p2041_init_periph,
    705		.cmux_groups = {
    706			&p2041_cmux_grp1, &p2041_cmux_grp2
    707		},
    708		.cmux_to_group = {
    709			0, 0, 1, 1, -1
    710		},
    711		.pll_mask = BIT(PLATFORM_PLL) |
    712			    BIT(CGA_PLL1) | BIT(CGA_PLL2),
    713	},
    714	{
    715		.compat = "fsl,p3041-clockgen",
    716		.guts_compat = "fsl,qoriq-device-config-1.0",
    717		.init_periph = p2041_init_periph,
    718		.cmux_groups = {
    719			&p2041_cmux_grp1, &p2041_cmux_grp2
    720		},
    721		.cmux_to_group = {
    722			0, 0, 1, 1, -1
    723		},
    724		.pll_mask = BIT(PLATFORM_PLL) |
    725			    BIT(CGA_PLL1) | BIT(CGA_PLL2),
    726	},
    727	{
    728		.compat = "fsl,p4080-clockgen",
    729		.guts_compat = "fsl,qoriq-device-config-1.0",
    730		.init_periph = p4080_init_periph,
    731		.cmux_groups = {
    732			&p4080_cmux_grp1, &p4080_cmux_grp2
    733		},
    734		.cmux_to_group = {
    735			0, 0, 0, 0, 1, 1, 1, 1, -1
    736		},
    737		.pll_mask = BIT(PLATFORM_PLL) |
    738			    BIT(CGA_PLL1) | BIT(CGA_PLL2) |
    739			    BIT(CGA_PLL3) | BIT(CGA_PLL4),
    740	},
    741	{
    742		.compat = "fsl,p5020-clockgen",
    743		.guts_compat = "fsl,qoriq-device-config-1.0",
    744		.init_periph = p5020_init_periph,
    745		.cmux_groups = {
    746			&p5020_cmux_grp1, &p5020_cmux_grp2
    747		},
    748		.cmux_to_group = {
    749			0, 1, -1
    750		},
    751		.pll_mask = BIT(PLATFORM_PLL) |
    752			    BIT(CGA_PLL1) | BIT(CGA_PLL2),
    753	},
    754	{
    755		.compat = "fsl,p5040-clockgen",
    756		.guts_compat = "fsl,p5040-device-config",
    757		.init_periph = p5040_init_periph,
    758		.cmux_groups = {
    759			&p5040_cmux_grp1, &p5040_cmux_grp2
    760		},
    761		.cmux_to_group = {
    762			0, 0, 1, 1, -1
    763		},
    764		.pll_mask = BIT(PLATFORM_PLL) |
    765			    BIT(CGA_PLL1) | BIT(CGA_PLL2) | BIT(CGA_PLL3),
    766	},
    767	{
    768		.compat = "fsl,t1023-clockgen",
    769		.guts_compat = "fsl,t1023-device-config",
    770		.init_periph = t1023_init_periph,
    771		.cmux_groups = {
    772			&t1023_cmux
    773		},
    774		.hwaccel = {
    775			&t1023_hwa1, &t1023_hwa2
    776		},
    777		.cmux_to_group = {
    778			0, 0, -1
    779		},
    780		.pll_mask = BIT(PLATFORM_PLL) | BIT(CGA_PLL1),
    781		.flags = CG_PLL_8BIT,
    782	},
    783	{
    784		.compat = "fsl,t1040-clockgen",
    785		.guts_compat = "fsl,t1040-device-config",
    786		.init_periph = t1040_init_periph,
    787		.cmux_groups = {
    788			&t1040_cmux
    789		},
    790		.cmux_to_group = {
    791			0, 0, 0, 0, -1
    792		},
    793		.pll_mask = BIT(PLATFORM_PLL) |
    794			    BIT(CGA_PLL1) | BIT(CGA_PLL2),
    795		.flags = CG_PLL_8BIT,
    796	},
    797	{
    798		.compat = "fsl,t2080-clockgen",
    799		.guts_compat = "fsl,t2080-device-config",
    800		.init_periph = t2080_init_periph,
    801		.cmux_groups = {
    802			&clockgen2_cmux_cga12
    803		},
    804		.hwaccel = {
    805			&t2080_hwa1, &t2080_hwa2
    806		},
    807		.cmux_to_group = {
    808			0, -1
    809		},
    810		.pll_mask = BIT(PLATFORM_PLL) |
    811			    BIT(CGA_PLL1) | BIT(CGA_PLL2),
    812		.flags = CG_PLL_8BIT,
    813	},
    814	{
    815		.compat = "fsl,t4240-clockgen",
    816		.guts_compat = "fsl,t4240-device-config",
    817		.init_periph = t4240_init_periph,
    818		.cmux_groups = {
    819			&clockgen2_cmux_cga, &clockgen2_cmux_cgb
    820		},
    821		.hwaccel = {
    822			&t4240_hwa1, NULL, NULL, &t4240_hwa4, &t4240_hwa5
    823		},
    824		.cmux_to_group = {
    825			0, 0, 1, -1
    826		},
    827		.pll_mask = BIT(PLATFORM_PLL) |
    828			    BIT(CGA_PLL1) | BIT(CGA_PLL2) | BIT(CGA_PLL3) |
    829			    BIT(CGB_PLL1) | BIT(CGB_PLL2),
    830		.flags = CG_PLL_8BIT,
    831	},
    832	{},
    833};
    834
    835struct mux_hwclock {
    836	struct clk_hw hw;
    837	struct clockgen *cg;
    838	const struct clockgen_muxinfo *info;
    839	u32 __iomem *reg;
    840	u8 parent_to_clksel[NUM_MUX_PARENTS];
    841	s8 clksel_to_parent[NUM_MUX_PARENTS];
    842	int num_parents;
    843};
    844
    845#define to_mux_hwclock(p)	container_of(p, struct mux_hwclock, hw)
    846#define CLKSEL_MASK		0x78000000
    847#define	CLKSEL_SHIFT		27
    848
    849static int mux_set_parent(struct clk_hw *hw, u8 idx)
    850{
    851	struct mux_hwclock *hwc = to_mux_hwclock(hw);
    852	u32 clksel;
    853
    854	if (idx >= hwc->num_parents)
    855		return -EINVAL;
    856
    857	clksel = hwc->parent_to_clksel[idx];
    858	cg_out(hwc->cg, (clksel << CLKSEL_SHIFT) & CLKSEL_MASK, hwc->reg);
    859
    860	return 0;
    861}
    862
    863static u8 mux_get_parent(struct clk_hw *hw)
    864{
    865	struct mux_hwclock *hwc = to_mux_hwclock(hw);
    866	u32 clksel;
    867	s8 ret;
    868
    869	clksel = (cg_in(hwc->cg, hwc->reg) & CLKSEL_MASK) >> CLKSEL_SHIFT;
    870
    871	ret = hwc->clksel_to_parent[clksel];
    872	if (ret < 0) {
    873		pr_err("%s: mux at %p has bad clksel\n", __func__, hwc->reg);
    874		return 0;
    875	}
    876
    877	return ret;
    878}
    879
    880static const struct clk_ops cmux_ops = {
    881	.get_parent = mux_get_parent,
    882	.set_parent = mux_set_parent,
    883};
    884
    885/*
    886 * Don't allow setting for now, as the clock options haven't been
    887 * sanitized for additional restrictions.
    888 */
    889static const struct clk_ops hwaccel_ops = {
    890	.get_parent = mux_get_parent,
    891};
    892
    893static const struct clockgen_pll_div *get_pll_div(struct clockgen *cg,
    894						  struct mux_hwclock *hwc,
    895						  int idx)
    896{
    897	int pll, div;
    898
    899	if (!(hwc->info->clksel[idx].flags & CLKSEL_VALID))
    900		return NULL;
    901
    902	pll = hwc->info->clksel[idx].pll;
    903	div = hwc->info->clksel[idx].div;
    904
    905	return &cg->pll[pll].div[div];
    906}
    907
    908static struct clk * __init create_mux_common(struct clockgen *cg,
    909					     struct mux_hwclock *hwc,
    910					     const struct clk_ops *ops,
    911					     unsigned long min_rate,
    912					     unsigned long max_rate,
    913					     unsigned long pct80_rate,
    914					     const char *fmt, int idx)
    915{
    916	struct clk_init_data init = {};
    917	struct clk *clk;
    918	const struct clockgen_pll_div *div;
    919	const char *parent_names[NUM_MUX_PARENTS];
    920	char name[32];
    921	int i, j;
    922
    923	snprintf(name, sizeof(name), fmt, idx);
    924
    925	for (i = 0, j = 0; i < NUM_MUX_PARENTS; i++) {
    926		unsigned long rate;
    927
    928		hwc->clksel_to_parent[i] = -1;
    929
    930		div = get_pll_div(cg, hwc, i);
    931		if (!div)
    932			continue;
    933
    934		rate = clk_get_rate(div->clk);
    935
    936		if (hwc->info->clksel[i].flags & CLKSEL_80PCT &&
    937		    rate > pct80_rate)
    938			continue;
    939		if (rate < min_rate)
    940			continue;
    941		if (rate > max_rate)
    942			continue;
    943
    944		parent_names[j] = div->name;
    945		hwc->parent_to_clksel[j] = i;
    946		hwc->clksel_to_parent[i] = j;
    947		j++;
    948	}
    949
    950	init.name = name;
    951	init.ops = ops;
    952	init.parent_names = parent_names;
    953	init.num_parents = hwc->num_parents = j;
    954	init.flags = 0;
    955	hwc->hw.init = &init;
    956	hwc->cg = cg;
    957
    958	clk = clk_register(NULL, &hwc->hw);
    959	if (IS_ERR(clk)) {
    960		pr_err("%s: Couldn't register %s: %ld\n", __func__, name,
    961		       PTR_ERR(clk));
    962		kfree(hwc);
    963		return NULL;
    964	}
    965
    966	return clk;
    967}
    968
    969static struct clk * __init create_one_cmux(struct clockgen *cg, int idx)
    970{
    971	struct mux_hwclock *hwc;
    972	const struct clockgen_pll_div *div;
    973	unsigned long plat_rate, min_rate;
    974	u64 max_rate, pct80_rate;
    975	u32 clksel;
    976
    977	hwc = kzalloc(sizeof(*hwc), GFP_KERNEL);
    978	if (!hwc)
    979		return NULL;
    980
    981	if (cg->info.flags & CG_VER3)
    982		hwc->reg = cg->regs + 0x70000 + 0x20 * idx;
    983	else
    984		hwc->reg = cg->regs + 0x20 * idx;
    985
    986	hwc->info = cg->info.cmux_groups[cg->info.cmux_to_group[idx]];
    987
    988	/*
    989	 * Find the rate for the default clksel, and treat it as the
    990	 * maximum rated core frequency.  If this is an incorrect
    991	 * assumption, certain clock options (possibly including the
    992	 * default clksel) may be inappropriately excluded on certain
    993	 * chips.
    994	 */
    995	clksel = (cg_in(cg, hwc->reg) & CLKSEL_MASK) >> CLKSEL_SHIFT;
    996	div = get_pll_div(cg, hwc, clksel);
    997	if (!div) {
    998		kfree(hwc);
    999		return NULL;
   1000	}
   1001
   1002	max_rate = clk_get_rate(div->clk);
   1003	pct80_rate = max_rate * 8;
   1004	do_div(pct80_rate, 10);
   1005
   1006	plat_rate = clk_get_rate(cg->pll[PLATFORM_PLL].div[PLL_DIV1].clk);
   1007
   1008	if (cg->info.flags & CG_CMUX_GE_PLAT)
   1009		min_rate = plat_rate;
   1010	else
   1011		min_rate = plat_rate / 2;
   1012
   1013	return create_mux_common(cg, hwc, &cmux_ops, min_rate, max_rate,
   1014				 pct80_rate, "cg-cmux%d", idx);
   1015}
   1016
   1017static struct clk * __init create_one_hwaccel(struct clockgen *cg, int idx)
   1018{
   1019	struct mux_hwclock *hwc;
   1020
   1021	hwc = kzalloc(sizeof(*hwc), GFP_KERNEL);
   1022	if (!hwc)
   1023		return NULL;
   1024
   1025	hwc->reg = cg->regs + 0x20 * idx + 0x10;
   1026	hwc->info = cg->info.hwaccel[idx];
   1027
   1028	return create_mux_common(cg, hwc, &hwaccel_ops, 0, ULONG_MAX, 0,
   1029				 "cg-hwaccel%d", idx);
   1030}
   1031
   1032static void __init create_muxes(struct clockgen *cg)
   1033{
   1034	int i;
   1035
   1036	for (i = 0; i < ARRAY_SIZE(cg->cmux); i++) {
   1037		if (cg->info.cmux_to_group[i] < 0)
   1038			break;
   1039		if (cg->info.cmux_to_group[i] >=
   1040		    ARRAY_SIZE(cg->info.cmux_groups)) {
   1041			WARN_ON_ONCE(1);
   1042			continue;
   1043		}
   1044
   1045		cg->cmux[i] = create_one_cmux(cg, i);
   1046	}
   1047
   1048	for (i = 0; i < ARRAY_SIZE(cg->hwaccel); i++) {
   1049		if (!cg->info.hwaccel[i])
   1050			continue;
   1051
   1052		cg->hwaccel[i] = create_one_hwaccel(cg, i);
   1053	}
   1054}
   1055
   1056static void __init _clockgen_init(struct device_node *np, bool legacy);
   1057
   1058/*
   1059 * Legacy nodes may get probed before the parent clockgen node.
   1060 * It is assumed that device trees with legacy nodes will not
   1061 * contain a "clocks" property -- otherwise the input clocks may
   1062 * not be initialized at this point.
   1063 */
   1064static void __init legacy_init_clockgen(struct device_node *np)
   1065{
   1066	if (!clockgen.node)
   1067		_clockgen_init(of_get_parent(np), true);
   1068}
   1069
   1070/* Legacy node */
   1071static void __init core_mux_init(struct device_node *np)
   1072{
   1073	struct clk *clk;
   1074	struct resource res;
   1075	int idx, rc;
   1076
   1077	legacy_init_clockgen(np);
   1078
   1079	if (of_address_to_resource(np, 0, &res))
   1080		return;
   1081
   1082	idx = (res.start & 0xf0) >> 5;
   1083	clk = clockgen.cmux[idx];
   1084
   1085	rc = of_clk_add_provider(np, of_clk_src_simple_get, clk);
   1086	if (rc) {
   1087		pr_err("%s: Couldn't register clk provider for node %pOFn: %d\n",
   1088		       __func__, np, rc);
   1089		return;
   1090	}
   1091}
   1092
   1093static struct clk __init
   1094*sysclk_from_fixed(struct device_node *node, const char *name)
   1095{
   1096	u32 rate;
   1097
   1098	if (of_property_read_u32(node, "clock-frequency", &rate))
   1099		return ERR_PTR(-ENODEV);
   1100
   1101	return clk_register_fixed_rate(NULL, name, NULL, 0, rate);
   1102}
   1103
   1104static struct clk __init *input_clock(const char *name, struct clk *clk)
   1105{
   1106	const char *input_name;
   1107
   1108	/* Register the input clock under the desired name. */
   1109	input_name = __clk_get_name(clk);
   1110	clk = clk_register_fixed_factor(NULL, name, input_name,
   1111					0, 1, 1);
   1112	if (IS_ERR(clk))
   1113		pr_err("%s: Couldn't register %s: %ld\n", __func__, name,
   1114		       PTR_ERR(clk));
   1115
   1116	return clk;
   1117}
   1118
   1119static struct clk __init *input_clock_by_name(const char *name,
   1120					      const char *dtname)
   1121{
   1122	struct clk *clk;
   1123
   1124	clk = of_clk_get_by_name(clockgen.node, dtname);
   1125	if (IS_ERR(clk))
   1126		return clk;
   1127
   1128	return input_clock(name, clk);
   1129}
   1130
   1131static struct clk __init *input_clock_by_index(const char *name, int idx)
   1132{
   1133	struct clk *clk;
   1134
   1135	clk = of_clk_get(clockgen.node, 0);
   1136	if (IS_ERR(clk))
   1137		return clk;
   1138
   1139	return input_clock(name, clk);
   1140}
   1141
   1142static struct clk * __init create_sysclk(const char *name)
   1143{
   1144	struct device_node *sysclk;
   1145	struct clk *clk;
   1146
   1147	clk = sysclk_from_fixed(clockgen.node, name);
   1148	if (!IS_ERR(clk))
   1149		return clk;
   1150
   1151	clk = input_clock_by_name(name, "sysclk");
   1152	if (!IS_ERR(clk))
   1153		return clk;
   1154
   1155	clk = input_clock_by_index(name, 0);
   1156	if (!IS_ERR(clk))
   1157		return clk;
   1158
   1159	sysclk = of_get_child_by_name(clockgen.node, "sysclk");
   1160	if (sysclk) {
   1161		clk = sysclk_from_fixed(sysclk, name);
   1162		if (!IS_ERR(clk))
   1163			return clk;
   1164	}
   1165
   1166	pr_err("%s: No input sysclk\n", __func__);
   1167	return NULL;
   1168}
   1169
   1170static struct clk * __init create_coreclk(const char *name)
   1171{
   1172	struct clk *clk;
   1173
   1174	clk = input_clock_by_name(name, "coreclk");
   1175	if (!IS_ERR(clk))
   1176		return clk;
   1177
   1178	/*
   1179	 * This indicates a mix of legacy nodes with the new coreclk
   1180	 * mechanism, which should never happen.  If this error occurs,
   1181	 * don't use the wrong input clock just because coreclk isn't
   1182	 * ready yet.
   1183	 */
   1184	if (WARN_ON(PTR_ERR(clk) == -EPROBE_DEFER))
   1185		return clk;
   1186
   1187	return NULL;
   1188}
   1189
   1190/* Legacy node */
   1191static void __init sysclk_init(struct device_node *node)
   1192{
   1193	struct clk *clk;
   1194
   1195	legacy_init_clockgen(node);
   1196
   1197	clk = clockgen.sysclk;
   1198	if (clk)
   1199		of_clk_add_provider(node, of_clk_src_simple_get, clk);
   1200}
   1201
   1202#define PLL_KILL BIT(31)
   1203
   1204static void __init create_one_pll(struct clockgen *cg, int idx)
   1205{
   1206	u32 __iomem *reg;
   1207	u32 mult;
   1208	struct clockgen_pll *pll = &cg->pll[idx];
   1209	const char *input = "cg-sysclk";
   1210	int i;
   1211
   1212	if (!(cg->info.pll_mask & (1 << idx)))
   1213		return;
   1214
   1215	if (cg->coreclk && idx != PLATFORM_PLL) {
   1216		if (IS_ERR(cg->coreclk))
   1217			return;
   1218
   1219		input = "cg-coreclk";
   1220	}
   1221
   1222	if (cg->info.flags & CG_VER3) {
   1223		switch (idx) {
   1224		case PLATFORM_PLL:
   1225			reg = cg->regs + 0x60080;
   1226			break;
   1227		case CGA_PLL1:
   1228			reg = cg->regs + 0x80;
   1229			break;
   1230		case CGA_PLL2:
   1231			reg = cg->regs + 0xa0;
   1232			break;
   1233		case CGB_PLL1:
   1234			reg = cg->regs + 0x10080;
   1235			break;
   1236		case CGB_PLL2:
   1237			reg = cg->regs + 0x100a0;
   1238			break;
   1239		default:
   1240			WARN_ONCE(1, "index %d\n", idx);
   1241			return;
   1242		}
   1243	} else {
   1244		if (idx == PLATFORM_PLL)
   1245			reg = cg->regs + 0xc00;
   1246		else
   1247			reg = cg->regs + 0x800 + 0x20 * (idx - 1);
   1248	}
   1249
   1250	/* Get the multiple of PLL */
   1251	mult = cg_in(cg, reg);
   1252
   1253	/* Check if this PLL is disabled */
   1254	if (mult & PLL_KILL) {
   1255		pr_debug("%s(): pll %p disabled\n", __func__, reg);
   1256		return;
   1257	}
   1258
   1259	if ((cg->info.flags & CG_VER3) ||
   1260	    ((cg->info.flags & CG_PLL_8BIT) && idx != PLATFORM_PLL))
   1261		mult = (mult & GENMASK(8, 1)) >> 1;
   1262	else
   1263		mult = (mult & GENMASK(6, 1)) >> 1;
   1264
   1265	for (i = 0; i < ARRAY_SIZE(pll->div); i++) {
   1266		struct clk *clk;
   1267		int ret;
   1268
   1269		/*
   1270		 * For platform PLL, there are MAX_PLL_DIV divider clocks.
   1271		 * For core PLL, there are 4 divider clocks at most.
   1272		 */
   1273		if (idx != PLATFORM_PLL && i >= 4)
   1274			break;
   1275
   1276		snprintf(pll->div[i].name, sizeof(pll->div[i].name),
   1277			 "cg-pll%d-div%d", idx, i + 1);
   1278
   1279		clk = clk_register_fixed_factor(NULL,
   1280				pll->div[i].name, input, 0, mult, i + 1);
   1281		if (IS_ERR(clk)) {
   1282			pr_err("%s: %s: register failed %ld\n",
   1283			       __func__, pll->div[i].name, PTR_ERR(clk));
   1284			continue;
   1285		}
   1286
   1287		pll->div[i].clk = clk;
   1288		ret = clk_register_clkdev(clk, pll->div[i].name, NULL);
   1289		if (ret != 0)
   1290			pr_err("%s: %s: register to lookup table failed %d\n",
   1291			       __func__, pll->div[i].name, ret);
   1292
   1293	}
   1294}
   1295
   1296static void __init create_plls(struct clockgen *cg)
   1297{
   1298	int i;
   1299
   1300	for (i = 0; i < ARRAY_SIZE(cg->pll); i++)
   1301		create_one_pll(cg, i);
   1302}
   1303
   1304static void __init legacy_pll_init(struct device_node *np, int idx)
   1305{
   1306	struct clockgen_pll *pll;
   1307	struct clk_onecell_data *onecell_data;
   1308	struct clk **subclks;
   1309	int count, rc;
   1310
   1311	legacy_init_clockgen(np);
   1312
   1313	pll = &clockgen.pll[idx];
   1314	count = of_property_count_strings(np, "clock-output-names");
   1315
   1316	BUILD_BUG_ON(ARRAY_SIZE(pll->div) < 4);
   1317	subclks = kcalloc(4, sizeof(struct clk *), GFP_KERNEL);
   1318	if (!subclks)
   1319		return;
   1320
   1321	onecell_data = kmalloc(sizeof(*onecell_data), GFP_KERNEL);
   1322	if (!onecell_data)
   1323		goto err_clks;
   1324
   1325	if (count <= 3) {
   1326		subclks[0] = pll->div[0].clk;
   1327		subclks[1] = pll->div[1].clk;
   1328		subclks[2] = pll->div[3].clk;
   1329	} else {
   1330		subclks[0] = pll->div[0].clk;
   1331		subclks[1] = pll->div[1].clk;
   1332		subclks[2] = pll->div[2].clk;
   1333		subclks[3] = pll->div[3].clk;
   1334	}
   1335
   1336	onecell_data->clks = subclks;
   1337	onecell_data->clk_num = count;
   1338
   1339	rc = of_clk_add_provider(np, of_clk_src_onecell_get, onecell_data);
   1340	if (rc) {
   1341		pr_err("%s: Couldn't register clk provider for node %pOFn: %d\n",
   1342		       __func__, np, rc);
   1343		goto err_cell;
   1344	}
   1345
   1346	return;
   1347err_cell:
   1348	kfree(onecell_data);
   1349err_clks:
   1350	kfree(subclks);
   1351}
   1352
   1353/* Legacy node */
   1354static void __init pltfrm_pll_init(struct device_node *np)
   1355{
   1356	legacy_pll_init(np, PLATFORM_PLL);
   1357}
   1358
   1359/* Legacy node */
   1360static void __init core_pll_init(struct device_node *np)
   1361{
   1362	struct resource res;
   1363	int idx;
   1364
   1365	if (of_address_to_resource(np, 0, &res))
   1366		return;
   1367
   1368	if ((res.start & 0xfff) == 0xc00) {
   1369		/*
   1370		 * ls1021a devtree labels the platform PLL
   1371		 * with the core PLL compatible
   1372		 */
   1373		pltfrm_pll_init(np);
   1374	} else {
   1375		idx = (res.start & 0xf0) >> 5;
   1376		legacy_pll_init(np, CGA_PLL1 + idx);
   1377	}
   1378}
   1379
   1380static struct clk *clockgen_clk_get(struct of_phandle_args *clkspec, void *data)
   1381{
   1382	struct clockgen *cg = data;
   1383	struct clk *clk;
   1384	struct clockgen_pll *pll;
   1385	u32 type, idx;
   1386
   1387	if (clkspec->args_count < 2) {
   1388		pr_err("%s: insufficient phandle args\n", __func__);
   1389		return ERR_PTR(-EINVAL);
   1390	}
   1391
   1392	type = clkspec->args[0];
   1393	idx = clkspec->args[1];
   1394
   1395	switch (type) {
   1396	case QORIQ_CLK_SYSCLK:
   1397		if (idx != 0)
   1398			goto bad_args;
   1399		clk = cg->sysclk;
   1400		break;
   1401	case QORIQ_CLK_CMUX:
   1402		if (idx >= ARRAY_SIZE(cg->cmux))
   1403			goto bad_args;
   1404		clk = cg->cmux[idx];
   1405		break;
   1406	case QORIQ_CLK_HWACCEL:
   1407		if (idx >= ARRAY_SIZE(cg->hwaccel))
   1408			goto bad_args;
   1409		clk = cg->hwaccel[idx];
   1410		break;
   1411	case QORIQ_CLK_FMAN:
   1412		if (idx >= ARRAY_SIZE(cg->fman))
   1413			goto bad_args;
   1414		clk = cg->fman[idx];
   1415		break;
   1416	case QORIQ_CLK_PLATFORM_PLL:
   1417		pll = &cg->pll[PLATFORM_PLL];
   1418		if (idx >= ARRAY_SIZE(pll->div))
   1419			goto bad_args;
   1420		clk = pll->div[idx].clk;
   1421		break;
   1422	case QORIQ_CLK_CORECLK:
   1423		if (idx != 0)
   1424			goto bad_args;
   1425		clk = cg->coreclk;
   1426		if (IS_ERR(clk))
   1427			clk = NULL;
   1428		break;
   1429	default:
   1430		goto bad_args;
   1431	}
   1432
   1433	if (!clk)
   1434		return ERR_PTR(-ENOENT);
   1435	return clk;
   1436
   1437bad_args:
   1438	pr_err("%s: Bad phandle args %u %u\n", __func__, type, idx);
   1439	return ERR_PTR(-EINVAL);
   1440}
   1441
   1442#ifdef CONFIG_PPC
   1443#include <asm/mpc85xx.h>
   1444
   1445static const u32 a4510_svrs[] __initconst = {
   1446	(SVR_P2040 << 8) | 0x10,	/* P2040 1.0 */
   1447	(SVR_P2040 << 8) | 0x11,	/* P2040 1.1 */
   1448	(SVR_P2041 << 8) | 0x10,	/* P2041 1.0 */
   1449	(SVR_P2041 << 8) | 0x11,	/* P2041 1.1 */
   1450	(SVR_P3041 << 8) | 0x10,	/* P3041 1.0 */
   1451	(SVR_P3041 << 8) | 0x11,	/* P3041 1.1 */
   1452	(SVR_P4040 << 8) | 0x20,	/* P4040 2.0 */
   1453	(SVR_P4080 << 8) | 0x20,	/* P4080 2.0 */
   1454	(SVR_P5010 << 8) | 0x10,	/* P5010 1.0 */
   1455	(SVR_P5010 << 8) | 0x20,	/* P5010 2.0 */
   1456	(SVR_P5020 << 8) | 0x10,	/* P5020 1.0 */
   1457	(SVR_P5021 << 8) | 0x10,	/* P5021 1.0 */
   1458	(SVR_P5040 << 8) | 0x10,	/* P5040 1.0 */
   1459};
   1460
   1461#define SVR_SECURITY	0x80000	/* The Security (E) bit */
   1462
   1463static bool __init has_erratum_a4510(void)
   1464{
   1465	u32 svr = mfspr(SPRN_SVR);
   1466	int i;
   1467
   1468	svr &= ~SVR_SECURITY;
   1469
   1470	for (i = 0; i < ARRAY_SIZE(a4510_svrs); i++) {
   1471		if (svr == a4510_svrs[i])
   1472			return true;
   1473	}
   1474
   1475	return false;
   1476}
   1477#else
   1478static bool __init has_erratum_a4510(void)
   1479{
   1480	return false;
   1481}
   1482#endif
   1483
   1484static void __init _clockgen_init(struct device_node *np, bool legacy)
   1485{
   1486	int i, ret;
   1487	bool is_old_ls1021a = false;
   1488
   1489	/* May have already been called by a legacy probe */
   1490	if (clockgen.node)
   1491		return;
   1492
   1493	clockgen.node = np;
   1494	clockgen.regs = of_iomap(np, 0);
   1495	if (!clockgen.regs &&
   1496	    of_device_is_compatible(of_root, "fsl,ls1021a")) {
   1497		/* Compatibility hack for old, broken device trees */
   1498		clockgen.regs = ioremap(0x1ee1000, 0x1000);
   1499		is_old_ls1021a = true;
   1500	}
   1501	if (!clockgen.regs) {
   1502		pr_err("%s(): %pOFn: of_iomap() failed\n", __func__, np);
   1503		return;
   1504	}
   1505
   1506	for (i = 0; i < ARRAY_SIZE(chipinfo); i++) {
   1507		if (of_device_is_compatible(np, chipinfo[i].compat))
   1508			break;
   1509		if (is_old_ls1021a &&
   1510		    !strcmp(chipinfo[i].compat, "fsl,ls1021a-clockgen"))
   1511			break;
   1512	}
   1513
   1514	if (i == ARRAY_SIZE(chipinfo)) {
   1515		pr_err("%s: unknown clockgen node %pOF\n", __func__, np);
   1516		goto err;
   1517	}
   1518	clockgen.info = chipinfo[i];
   1519
   1520	if (clockgen.info.guts_compat) {
   1521		struct device_node *guts;
   1522
   1523		guts = of_find_compatible_node(NULL, NULL,
   1524					       clockgen.info.guts_compat);
   1525		if (guts) {
   1526			clockgen.guts = of_iomap(guts, 0);
   1527			if (!clockgen.guts) {
   1528				pr_err("%s: Couldn't map %pOF regs\n", __func__,
   1529				       guts);
   1530			}
   1531			of_node_put(guts);
   1532		}
   1533
   1534	}
   1535
   1536	if (has_erratum_a4510())
   1537		clockgen.info.flags |= CG_CMUX_GE_PLAT;
   1538
   1539	clockgen.sysclk = create_sysclk("cg-sysclk");
   1540	clockgen.coreclk = create_coreclk("cg-coreclk");
   1541	create_plls(&clockgen);
   1542	create_muxes(&clockgen);
   1543
   1544	if (clockgen.info.init_periph)
   1545		clockgen.info.init_periph(&clockgen);
   1546
   1547	ret = of_clk_add_provider(np, clockgen_clk_get, &clockgen);
   1548	if (ret) {
   1549		pr_err("%s: Couldn't register clk provider for node %pOFn: %d\n",
   1550		       __func__, np, ret);
   1551	}
   1552
   1553	/* Don't create cpufreq device for legacy clockgen blocks */
   1554	add_cpufreq_dev = !legacy;
   1555
   1556	return;
   1557err:
   1558	iounmap(clockgen.regs);
   1559	clockgen.regs = NULL;
   1560}
   1561
   1562static void __init clockgen_init(struct device_node *np)
   1563{
   1564	_clockgen_init(np, false);
   1565}
   1566
   1567static int __init clockgen_cpufreq_init(void)
   1568{
   1569	struct platform_device *pdev;
   1570
   1571	if (add_cpufreq_dev) {
   1572		pdev = platform_device_register_simple("qoriq-cpufreq", -1,
   1573				NULL, 0);
   1574		if (IS_ERR(pdev))
   1575			pr_err("Couldn't register qoriq-cpufreq err=%ld\n",
   1576				PTR_ERR(pdev));
   1577	}
   1578	return 0;
   1579}
   1580device_initcall(clockgen_cpufreq_init);
   1581
   1582CLK_OF_DECLARE(qoriq_clockgen_1, "fsl,qoriq-clockgen-1.0", clockgen_init);
   1583CLK_OF_DECLARE(qoriq_clockgen_2, "fsl,qoriq-clockgen-2.0", clockgen_init);
   1584CLK_OF_DECLARE(qoriq_clockgen_b4420, "fsl,b4420-clockgen", clockgen_init);
   1585CLK_OF_DECLARE(qoriq_clockgen_b4860, "fsl,b4860-clockgen", clockgen_init);
   1586CLK_OF_DECLARE(qoriq_clockgen_ls1012a, "fsl,ls1012a-clockgen", clockgen_init);
   1587CLK_OF_DECLARE(qoriq_clockgen_ls1021a, "fsl,ls1021a-clockgen", clockgen_init);
   1588CLK_OF_DECLARE(qoriq_clockgen_ls1028a, "fsl,ls1028a-clockgen", clockgen_init);
   1589CLK_OF_DECLARE(qoriq_clockgen_ls1043a, "fsl,ls1043a-clockgen", clockgen_init);
   1590CLK_OF_DECLARE(qoriq_clockgen_ls1046a, "fsl,ls1046a-clockgen", clockgen_init);
   1591CLK_OF_DECLARE(qoriq_clockgen_ls1088a, "fsl,ls1088a-clockgen", clockgen_init);
   1592CLK_OF_DECLARE(qoriq_clockgen_ls2080a, "fsl,ls2080a-clockgen", clockgen_init);
   1593CLK_OF_DECLARE(qoriq_clockgen_lx2160a, "fsl,lx2160a-clockgen", clockgen_init);
   1594CLK_OF_DECLARE(qoriq_clockgen_p2041, "fsl,p2041-clockgen", clockgen_init);
   1595CLK_OF_DECLARE(qoriq_clockgen_p3041, "fsl,p3041-clockgen", clockgen_init);
   1596CLK_OF_DECLARE(qoriq_clockgen_p4080, "fsl,p4080-clockgen", clockgen_init);
   1597CLK_OF_DECLARE(qoriq_clockgen_p5020, "fsl,p5020-clockgen", clockgen_init);
   1598CLK_OF_DECLARE(qoriq_clockgen_p5040, "fsl,p5040-clockgen", clockgen_init);
   1599CLK_OF_DECLARE(qoriq_clockgen_t1023, "fsl,t1023-clockgen", clockgen_init);
   1600CLK_OF_DECLARE(qoriq_clockgen_t1040, "fsl,t1040-clockgen", clockgen_init);
   1601CLK_OF_DECLARE(qoriq_clockgen_t2080, "fsl,t2080-clockgen", clockgen_init);
   1602CLK_OF_DECLARE(qoriq_clockgen_t4240, "fsl,t4240-clockgen", clockgen_init);
   1603
   1604/* Legacy nodes */
   1605CLK_OF_DECLARE(qoriq_sysclk_1, "fsl,qoriq-sysclk-1.0", sysclk_init);
   1606CLK_OF_DECLARE(qoriq_sysclk_2, "fsl,qoriq-sysclk-2.0", sysclk_init);
   1607CLK_OF_DECLARE(qoriq_core_pll_1, "fsl,qoriq-core-pll-1.0", core_pll_init);
   1608CLK_OF_DECLARE(qoriq_core_pll_2, "fsl,qoriq-core-pll-2.0", core_pll_init);
   1609CLK_OF_DECLARE(qoriq_core_mux_1, "fsl,qoriq-core-mux-1.0", core_mux_init);
   1610CLK_OF_DECLARE(qoriq_core_mux_2, "fsl,qoriq-core-mux-2.0", core_mux_init);
   1611CLK_OF_DECLARE(qoriq_pltfrm_pll_1, "fsl,qoriq-platform-pll-1.0", pltfrm_pll_init);
   1612CLK_OF_DECLARE(qoriq_pltfrm_pll_2, "fsl,qoriq-platform-pll-2.0", pltfrm_pll_init);