162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * SAMA7G5 PMC code.
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright (C) 2020 Microchip Technology Inc. and its subsidiaries
662306a36Sopenharmony_ci *
762306a36Sopenharmony_ci * Author: Claudiu Beznea <claudiu.beznea@microchip.com>
862306a36Sopenharmony_ci *
962306a36Sopenharmony_ci */
1062306a36Sopenharmony_ci#include <linux/clk.h>
1162306a36Sopenharmony_ci#include <linux/clk-provider.h>
1262306a36Sopenharmony_ci#include <linux/mfd/syscon.h>
1362306a36Sopenharmony_ci#include <linux/slab.h>
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci#include <dt-bindings/clock/at91.h>
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci#include "pmc.h"
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ci#define SAMA7G5_INIT_TABLE(_table, _count)		\
2062306a36Sopenharmony_ci	do {						\
2162306a36Sopenharmony_ci		u8 _i;					\
2262306a36Sopenharmony_ci		for (_i = 0; _i < (_count); _i++)	\
2362306a36Sopenharmony_ci			(_table)[_i] = _i;		\
2462306a36Sopenharmony_ci	} while (0)
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci#define SAMA7G5_FILL_TABLE(_to, _from, _count)		\
2762306a36Sopenharmony_ci	do {						\
2862306a36Sopenharmony_ci		u8 _i;					\
2962306a36Sopenharmony_ci		for (_i = 0; _i < (_count); _i++) {	\
3062306a36Sopenharmony_ci			(_to)[_i] = (_from)[_i];	\
3162306a36Sopenharmony_ci		}					\
3262306a36Sopenharmony_ci	} while (0)
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_cistatic DEFINE_SPINLOCK(pmc_pll_lock);
3562306a36Sopenharmony_cistatic DEFINE_SPINLOCK(pmc_mck0_lock);
3662306a36Sopenharmony_cistatic DEFINE_SPINLOCK(pmc_mckX_lock);
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci/*
3962306a36Sopenharmony_ci * PLL clocks identifiers
4062306a36Sopenharmony_ci * @PLL_ID_CPU:		CPU PLL identifier
4162306a36Sopenharmony_ci * @PLL_ID_SYS:		System PLL identifier
4262306a36Sopenharmony_ci * @PLL_ID_DDR:		DDR PLL identifier
4362306a36Sopenharmony_ci * @PLL_ID_IMG:		Image subsystem PLL identifier
4462306a36Sopenharmony_ci * @PLL_ID_BAUD:	Baud PLL identifier
4562306a36Sopenharmony_ci * @PLL_ID_AUDIO:	Audio PLL identifier
4662306a36Sopenharmony_ci * @PLL_ID_ETH:		Ethernet PLL identifier
4762306a36Sopenharmony_ci */
4862306a36Sopenharmony_cienum pll_ids {
4962306a36Sopenharmony_ci	PLL_ID_CPU,
5062306a36Sopenharmony_ci	PLL_ID_SYS,
5162306a36Sopenharmony_ci	PLL_ID_DDR,
5262306a36Sopenharmony_ci	PLL_ID_IMG,
5362306a36Sopenharmony_ci	PLL_ID_BAUD,
5462306a36Sopenharmony_ci	PLL_ID_AUDIO,
5562306a36Sopenharmony_ci	PLL_ID_ETH,
5662306a36Sopenharmony_ci	PLL_ID_MAX,
5762306a36Sopenharmony_ci};
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ci/*
6062306a36Sopenharmony_ci * PLL component identifier
6162306a36Sopenharmony_ci * @PLL_COMPID_FRAC: Fractional PLL component identifier
6262306a36Sopenharmony_ci * @PLL_COMPID_DIV0: 1st PLL divider component identifier
6362306a36Sopenharmony_ci * @PLL_COMPID_DIV1: 2nd PLL divider component identifier
6462306a36Sopenharmony_ci */
6562306a36Sopenharmony_cienum pll_component_id {
6662306a36Sopenharmony_ci	PLL_COMPID_FRAC,
6762306a36Sopenharmony_ci	PLL_COMPID_DIV0,
6862306a36Sopenharmony_ci	PLL_COMPID_DIV1,
6962306a36Sopenharmony_ci};
7062306a36Sopenharmony_ci
7162306a36Sopenharmony_ci/*
7262306a36Sopenharmony_ci * PLL type identifiers
7362306a36Sopenharmony_ci * @PLL_TYPE_FRAC:	fractional PLL identifier
7462306a36Sopenharmony_ci * @PLL_TYPE_DIV:	divider PLL identifier
7562306a36Sopenharmony_ci */
7662306a36Sopenharmony_cienum pll_type {
7762306a36Sopenharmony_ci	PLL_TYPE_FRAC,
7862306a36Sopenharmony_ci	PLL_TYPE_DIV,
7962306a36Sopenharmony_ci};
8062306a36Sopenharmony_ci
8162306a36Sopenharmony_ci/* Layout for fractional PLLs. */
8262306a36Sopenharmony_cistatic const struct clk_pll_layout pll_layout_frac = {
8362306a36Sopenharmony_ci	.mul_mask	= GENMASK(31, 24),
8462306a36Sopenharmony_ci	.frac_mask	= GENMASK(21, 0),
8562306a36Sopenharmony_ci	.mul_shift	= 24,
8662306a36Sopenharmony_ci	.frac_shift	= 0,
8762306a36Sopenharmony_ci};
8862306a36Sopenharmony_ci
8962306a36Sopenharmony_ci/* Layout for DIVPMC dividers. */
9062306a36Sopenharmony_cistatic const struct clk_pll_layout pll_layout_divpmc = {
9162306a36Sopenharmony_ci	.div_mask	= GENMASK(7, 0),
9262306a36Sopenharmony_ci	.endiv_mask	= BIT(29),
9362306a36Sopenharmony_ci	.div_shift	= 0,
9462306a36Sopenharmony_ci	.endiv_shift	= 29,
9562306a36Sopenharmony_ci};
9662306a36Sopenharmony_ci
9762306a36Sopenharmony_ci/* Layout for DIVIO dividers. */
9862306a36Sopenharmony_cistatic const struct clk_pll_layout pll_layout_divio = {
9962306a36Sopenharmony_ci	.div_mask	= GENMASK(19, 12),
10062306a36Sopenharmony_ci	.endiv_mask	= BIT(30),
10162306a36Sopenharmony_ci	.div_shift	= 12,
10262306a36Sopenharmony_ci	.endiv_shift	= 30,
10362306a36Sopenharmony_ci};
10462306a36Sopenharmony_ci
10562306a36Sopenharmony_ci/*
10662306a36Sopenharmony_ci * CPU PLL output range.
10762306a36Sopenharmony_ci * Notice: The upper limit has been setup to 1000000002 due to hardware
10862306a36Sopenharmony_ci * block which cannot output exactly 1GHz.
10962306a36Sopenharmony_ci */
11062306a36Sopenharmony_cistatic const struct clk_range cpu_pll_outputs[] = {
11162306a36Sopenharmony_ci	{ .min = 2343750, .max = 1000000002 },
11262306a36Sopenharmony_ci};
11362306a36Sopenharmony_ci
11462306a36Sopenharmony_ci/* PLL output range. */
11562306a36Sopenharmony_cistatic const struct clk_range pll_outputs[] = {
11662306a36Sopenharmony_ci	{ .min = 2343750, .max = 1200000000 },
11762306a36Sopenharmony_ci};
11862306a36Sopenharmony_ci
11962306a36Sopenharmony_ci/* CPU PLL characteristics. */
12062306a36Sopenharmony_cistatic const struct clk_pll_characteristics cpu_pll_characteristics = {
12162306a36Sopenharmony_ci	.input = { .min = 12000000, .max = 50000000 },
12262306a36Sopenharmony_ci	.num_output = ARRAY_SIZE(cpu_pll_outputs),
12362306a36Sopenharmony_ci	.output = cpu_pll_outputs,
12462306a36Sopenharmony_ci};
12562306a36Sopenharmony_ci
12662306a36Sopenharmony_ci/* PLL characteristics. */
12762306a36Sopenharmony_cistatic const struct clk_pll_characteristics pll_characteristics = {
12862306a36Sopenharmony_ci	.input = { .min = 12000000, .max = 50000000 },
12962306a36Sopenharmony_ci	.num_output = ARRAY_SIZE(pll_outputs),
13062306a36Sopenharmony_ci	.output = pll_outputs,
13162306a36Sopenharmony_ci};
13262306a36Sopenharmony_ci
13362306a36Sopenharmony_ci/*
13462306a36Sopenharmony_ci * SAMA7G5 PLL possible parents
13562306a36Sopenharmony_ci * @SAMA7G5_PLL_PARENT_MAINCK: MAINCK is PLL a parent
13662306a36Sopenharmony_ci * @SAMA7G5_PLL_PARENT_MAIN_XTAL: MAIN XTAL is a PLL parent
13762306a36Sopenharmony_ci * @SAMA7G5_PLL_PARENT_FRACCK: Frac PLL is a PLL parent (for PLL dividers)
13862306a36Sopenharmony_ci */
13962306a36Sopenharmony_cienum sama7g5_pll_parent {
14062306a36Sopenharmony_ci	SAMA7G5_PLL_PARENT_MAINCK,
14162306a36Sopenharmony_ci	SAMA7G5_PLL_PARENT_MAIN_XTAL,
14262306a36Sopenharmony_ci	SAMA7G5_PLL_PARENT_FRACCK,
14362306a36Sopenharmony_ci};
14462306a36Sopenharmony_ci
14562306a36Sopenharmony_ci/*
14662306a36Sopenharmony_ci * PLL clocks description
14762306a36Sopenharmony_ci * @n:		clock name
14862306a36Sopenharmony_ci * @l:		clock layout
14962306a36Sopenharmony_ci * @c:		clock characteristics
15062306a36Sopenharmony_ci * @hw:		pointer to clk_hw
15162306a36Sopenharmony_ci * @t:		clock type
15262306a36Sopenharmony_ci * @f:		clock flags
15362306a36Sopenharmony_ci * @p:		clock parent
15462306a36Sopenharmony_ci * @eid:	export index in sama7g5->chws[] array
15562306a36Sopenharmony_ci * @safe_div:	intermediate divider need to be set on PRE_RATE_CHANGE
15662306a36Sopenharmony_ci *		notification
15762306a36Sopenharmony_ci */
15862306a36Sopenharmony_cistatic struct sama7g5_pll {
15962306a36Sopenharmony_ci	const char *n;
16062306a36Sopenharmony_ci	const struct clk_pll_layout *l;
16162306a36Sopenharmony_ci	const struct clk_pll_characteristics *c;
16262306a36Sopenharmony_ci	struct clk_hw *hw;
16362306a36Sopenharmony_ci	unsigned long f;
16462306a36Sopenharmony_ci	enum sama7g5_pll_parent p;
16562306a36Sopenharmony_ci	u8 t;
16662306a36Sopenharmony_ci	u8 eid;
16762306a36Sopenharmony_ci	u8 safe_div;
16862306a36Sopenharmony_ci} sama7g5_plls[][PLL_ID_MAX] = {
16962306a36Sopenharmony_ci	[PLL_ID_CPU] = {
17062306a36Sopenharmony_ci		[PLL_COMPID_FRAC] = {
17162306a36Sopenharmony_ci			.n = "cpupll_fracck",
17262306a36Sopenharmony_ci			.p = SAMA7G5_PLL_PARENT_MAINCK,
17362306a36Sopenharmony_ci			.l = &pll_layout_frac,
17462306a36Sopenharmony_ci			.c = &cpu_pll_characteristics,
17562306a36Sopenharmony_ci			.t = PLL_TYPE_FRAC,
17662306a36Sopenharmony_ci			/*
17762306a36Sopenharmony_ci			 * This feeds cpupll_divpmcck which feeds CPU. It should
17862306a36Sopenharmony_ci			 * not be disabled.
17962306a36Sopenharmony_ci			 */
18062306a36Sopenharmony_ci			.f = CLK_IS_CRITICAL,
18162306a36Sopenharmony_ci		},
18262306a36Sopenharmony_ci
18362306a36Sopenharmony_ci		[PLL_COMPID_DIV0] = {
18462306a36Sopenharmony_ci			.n = "cpupll_divpmcck",
18562306a36Sopenharmony_ci			.p = SAMA7G5_PLL_PARENT_FRACCK,
18662306a36Sopenharmony_ci			.l = &pll_layout_divpmc,
18762306a36Sopenharmony_ci			.c = &cpu_pll_characteristics,
18862306a36Sopenharmony_ci			.t = PLL_TYPE_DIV,
18962306a36Sopenharmony_ci			/* This feeds CPU. It should not be disabled. */
19062306a36Sopenharmony_ci			.f = CLK_IS_CRITICAL | CLK_SET_RATE_PARENT,
19162306a36Sopenharmony_ci			.eid = PMC_CPUPLL,
19262306a36Sopenharmony_ci			/*
19362306a36Sopenharmony_ci			 * Safe div=15 should be safe even for switching b/w 1GHz and
19462306a36Sopenharmony_ci			 * 90MHz (frac pll might go up to 1.2GHz).
19562306a36Sopenharmony_ci			 */
19662306a36Sopenharmony_ci			.safe_div = 15,
19762306a36Sopenharmony_ci		},
19862306a36Sopenharmony_ci	},
19962306a36Sopenharmony_ci
20062306a36Sopenharmony_ci	[PLL_ID_SYS] = {
20162306a36Sopenharmony_ci		[PLL_COMPID_FRAC] = {
20262306a36Sopenharmony_ci			.n = "syspll_fracck",
20362306a36Sopenharmony_ci			.p = SAMA7G5_PLL_PARENT_MAINCK,
20462306a36Sopenharmony_ci			.l = &pll_layout_frac,
20562306a36Sopenharmony_ci			.c = &pll_characteristics,
20662306a36Sopenharmony_ci			.t = PLL_TYPE_FRAC,
20762306a36Sopenharmony_ci			/*
20862306a36Sopenharmony_ci			 * This feeds syspll_divpmcck which may feed critical parts
20962306a36Sopenharmony_ci			 * of the systems like timers. Therefore it should not be
21062306a36Sopenharmony_ci			 * disabled.
21162306a36Sopenharmony_ci			 */
21262306a36Sopenharmony_ci			.f = CLK_IS_CRITICAL | CLK_SET_RATE_GATE,
21362306a36Sopenharmony_ci		},
21462306a36Sopenharmony_ci
21562306a36Sopenharmony_ci		[PLL_COMPID_DIV0] = {
21662306a36Sopenharmony_ci			.n = "syspll_divpmcck",
21762306a36Sopenharmony_ci			.p = SAMA7G5_PLL_PARENT_FRACCK,
21862306a36Sopenharmony_ci			.l = &pll_layout_divpmc,
21962306a36Sopenharmony_ci			.c = &pll_characteristics,
22062306a36Sopenharmony_ci			.t = PLL_TYPE_DIV,
22162306a36Sopenharmony_ci			/*
22262306a36Sopenharmony_ci			 * This may feed critical parts of the systems like timers.
22362306a36Sopenharmony_ci			 * Therefore it should not be disabled.
22462306a36Sopenharmony_ci			 */
22562306a36Sopenharmony_ci			.f = CLK_IS_CRITICAL | CLK_SET_RATE_GATE,
22662306a36Sopenharmony_ci			.eid = PMC_SYSPLL,
22762306a36Sopenharmony_ci		},
22862306a36Sopenharmony_ci	},
22962306a36Sopenharmony_ci
23062306a36Sopenharmony_ci	[PLL_ID_DDR] = {
23162306a36Sopenharmony_ci		[PLL_COMPID_FRAC] = {
23262306a36Sopenharmony_ci			.n = "ddrpll_fracck",
23362306a36Sopenharmony_ci			.p = SAMA7G5_PLL_PARENT_MAINCK,
23462306a36Sopenharmony_ci			.l = &pll_layout_frac,
23562306a36Sopenharmony_ci			.c = &pll_characteristics,
23662306a36Sopenharmony_ci			.t = PLL_TYPE_FRAC,
23762306a36Sopenharmony_ci			/*
23862306a36Sopenharmony_ci			 * This feeds ddrpll_divpmcck which feeds DDR. It should not
23962306a36Sopenharmony_ci			 * be disabled.
24062306a36Sopenharmony_ci			 */
24162306a36Sopenharmony_ci			.f = CLK_IS_CRITICAL | CLK_SET_RATE_GATE,
24262306a36Sopenharmony_ci		},
24362306a36Sopenharmony_ci
24462306a36Sopenharmony_ci		[PLL_COMPID_DIV0] = {
24562306a36Sopenharmony_ci			.n = "ddrpll_divpmcck",
24662306a36Sopenharmony_ci			.p = SAMA7G5_PLL_PARENT_FRACCK,
24762306a36Sopenharmony_ci			.l = &pll_layout_divpmc,
24862306a36Sopenharmony_ci			.c = &pll_characteristics,
24962306a36Sopenharmony_ci			.t = PLL_TYPE_DIV,
25062306a36Sopenharmony_ci			/* This feeds DDR. It should not be disabled. */
25162306a36Sopenharmony_ci			.f = CLK_IS_CRITICAL | CLK_SET_RATE_GATE,
25262306a36Sopenharmony_ci		},
25362306a36Sopenharmony_ci	},
25462306a36Sopenharmony_ci
25562306a36Sopenharmony_ci	[PLL_ID_IMG] = {
25662306a36Sopenharmony_ci		[PLL_COMPID_FRAC] = {
25762306a36Sopenharmony_ci			.n = "imgpll_fracck",
25862306a36Sopenharmony_ci			.p = SAMA7G5_PLL_PARENT_MAINCK,
25962306a36Sopenharmony_ci			.l = &pll_layout_frac,
26062306a36Sopenharmony_ci			.c = &pll_characteristics,
26162306a36Sopenharmony_ci			.t = PLL_TYPE_FRAC,
26262306a36Sopenharmony_ci			.f = CLK_SET_RATE_GATE,
26362306a36Sopenharmony_ci		},
26462306a36Sopenharmony_ci
26562306a36Sopenharmony_ci		[PLL_COMPID_DIV0] = {
26662306a36Sopenharmony_ci			.n = "imgpll_divpmcck",
26762306a36Sopenharmony_ci			.p = SAMA7G5_PLL_PARENT_FRACCK,
26862306a36Sopenharmony_ci			.l = &pll_layout_divpmc,
26962306a36Sopenharmony_ci			.c = &pll_characteristics,
27062306a36Sopenharmony_ci			.t = PLL_TYPE_DIV,
27162306a36Sopenharmony_ci			.f = CLK_SET_RATE_GATE | CLK_SET_PARENT_GATE |
27262306a36Sopenharmony_ci			     CLK_SET_RATE_PARENT,
27362306a36Sopenharmony_ci		},
27462306a36Sopenharmony_ci	},
27562306a36Sopenharmony_ci
27662306a36Sopenharmony_ci	[PLL_ID_BAUD] = {
27762306a36Sopenharmony_ci		[PLL_COMPID_FRAC] = {
27862306a36Sopenharmony_ci			.n = "baudpll_fracck",
27962306a36Sopenharmony_ci			.p = SAMA7G5_PLL_PARENT_MAINCK,
28062306a36Sopenharmony_ci			.l = &pll_layout_frac,
28162306a36Sopenharmony_ci			.c = &pll_characteristics,
28262306a36Sopenharmony_ci			.t = PLL_TYPE_FRAC,
28362306a36Sopenharmony_ci			.f = CLK_SET_RATE_GATE, },
28462306a36Sopenharmony_ci
28562306a36Sopenharmony_ci		[PLL_COMPID_DIV0] = {
28662306a36Sopenharmony_ci			.n = "baudpll_divpmcck",
28762306a36Sopenharmony_ci			.p = SAMA7G5_PLL_PARENT_FRACCK,
28862306a36Sopenharmony_ci			.l = &pll_layout_divpmc,
28962306a36Sopenharmony_ci			.c = &pll_characteristics,
29062306a36Sopenharmony_ci			.t = PLL_TYPE_DIV,
29162306a36Sopenharmony_ci			.f = CLK_SET_RATE_GATE | CLK_SET_PARENT_GATE |
29262306a36Sopenharmony_ci			     CLK_SET_RATE_PARENT,
29362306a36Sopenharmony_ci		},
29462306a36Sopenharmony_ci	},
29562306a36Sopenharmony_ci
29662306a36Sopenharmony_ci	[PLL_ID_AUDIO] = {
29762306a36Sopenharmony_ci		[PLL_COMPID_FRAC] = {
29862306a36Sopenharmony_ci			.n = "audiopll_fracck",
29962306a36Sopenharmony_ci			.p = SAMA7G5_PLL_PARENT_MAIN_XTAL,
30062306a36Sopenharmony_ci			.l = &pll_layout_frac,
30162306a36Sopenharmony_ci			.c = &pll_characteristics,
30262306a36Sopenharmony_ci			.t = PLL_TYPE_FRAC,
30362306a36Sopenharmony_ci			.f = CLK_SET_RATE_GATE,
30462306a36Sopenharmony_ci		},
30562306a36Sopenharmony_ci
30662306a36Sopenharmony_ci		[PLL_COMPID_DIV0] = {
30762306a36Sopenharmony_ci			.n = "audiopll_divpmcck",
30862306a36Sopenharmony_ci			.p = SAMA7G5_PLL_PARENT_FRACCK,
30962306a36Sopenharmony_ci			.l = &pll_layout_divpmc,
31062306a36Sopenharmony_ci			.c = &pll_characteristics,
31162306a36Sopenharmony_ci			.t = PLL_TYPE_DIV,
31262306a36Sopenharmony_ci			.f = CLK_SET_RATE_GATE | CLK_SET_PARENT_GATE |
31362306a36Sopenharmony_ci			     CLK_SET_RATE_PARENT,
31462306a36Sopenharmony_ci			.eid = PMC_AUDIOPMCPLL,
31562306a36Sopenharmony_ci		},
31662306a36Sopenharmony_ci
31762306a36Sopenharmony_ci		[PLL_COMPID_DIV1] = {
31862306a36Sopenharmony_ci			.n = "audiopll_diviock",
31962306a36Sopenharmony_ci			.p = SAMA7G5_PLL_PARENT_FRACCK,
32062306a36Sopenharmony_ci			.l = &pll_layout_divio,
32162306a36Sopenharmony_ci			.c = &pll_characteristics,
32262306a36Sopenharmony_ci			.t = PLL_TYPE_DIV,
32362306a36Sopenharmony_ci			.f = CLK_SET_RATE_GATE | CLK_SET_PARENT_GATE |
32462306a36Sopenharmony_ci			     CLK_SET_RATE_PARENT,
32562306a36Sopenharmony_ci			.eid = PMC_AUDIOIOPLL,
32662306a36Sopenharmony_ci		},
32762306a36Sopenharmony_ci	},
32862306a36Sopenharmony_ci
32962306a36Sopenharmony_ci	[PLL_ID_ETH] = {
33062306a36Sopenharmony_ci		[PLL_COMPID_FRAC] = {
33162306a36Sopenharmony_ci			.n = "ethpll_fracck",
33262306a36Sopenharmony_ci			.p = SAMA7G5_PLL_PARENT_MAIN_XTAL,
33362306a36Sopenharmony_ci			.l = &pll_layout_frac,
33462306a36Sopenharmony_ci			.c = &pll_characteristics,
33562306a36Sopenharmony_ci			.t = PLL_TYPE_FRAC,
33662306a36Sopenharmony_ci			.f = CLK_SET_RATE_GATE,
33762306a36Sopenharmony_ci		},
33862306a36Sopenharmony_ci
33962306a36Sopenharmony_ci		[PLL_COMPID_DIV0] = {
34062306a36Sopenharmony_ci			.n = "ethpll_divpmcck",
34162306a36Sopenharmony_ci			.p = SAMA7G5_PLL_PARENT_FRACCK,
34262306a36Sopenharmony_ci			.l = &pll_layout_divpmc,
34362306a36Sopenharmony_ci			.c = &pll_characteristics,
34462306a36Sopenharmony_ci			.t = PLL_TYPE_DIV,
34562306a36Sopenharmony_ci			.f = CLK_SET_RATE_GATE | CLK_SET_PARENT_GATE |
34662306a36Sopenharmony_ci			     CLK_SET_RATE_PARENT,
34762306a36Sopenharmony_ci		},
34862306a36Sopenharmony_ci	},
34962306a36Sopenharmony_ci};
35062306a36Sopenharmony_ci
35162306a36Sopenharmony_ci/* Used to create an array entry identifying a PLL by its components. */
35262306a36Sopenharmony_ci#define PLL_IDS_TO_ARR_ENTRY(_id, _comp) { PLL_ID_##_id, PLL_COMPID_##_comp}
35362306a36Sopenharmony_ci
35462306a36Sopenharmony_ci/*
35562306a36Sopenharmony_ci * Master clock (MCK[1..4]) description
35662306a36Sopenharmony_ci * @n:			clock name
35762306a36Sopenharmony_ci * @ep:			extra parents names array (entry formed by PLL components
35862306a36Sopenharmony_ci *			identifiers (see enum pll_component_id))
35962306a36Sopenharmony_ci * @hw:			pointer to clk_hw
36062306a36Sopenharmony_ci * @ep_chg_id:		index in parents array that specifies the changeable
36162306a36Sopenharmony_ci *			parent
36262306a36Sopenharmony_ci * @ep_count:		extra parents count
36362306a36Sopenharmony_ci * @ep_mux_table:	mux table for extra parents
36462306a36Sopenharmony_ci * @id:			clock id
36562306a36Sopenharmony_ci * @eid:		export index in sama7g5->chws[] array
36662306a36Sopenharmony_ci * @c:			true if clock is critical and cannot be disabled
36762306a36Sopenharmony_ci */
36862306a36Sopenharmony_cistatic struct {
36962306a36Sopenharmony_ci	const char *n;
37062306a36Sopenharmony_ci	struct {
37162306a36Sopenharmony_ci		int pll_id;
37262306a36Sopenharmony_ci		int pll_compid;
37362306a36Sopenharmony_ci	} ep[4];
37462306a36Sopenharmony_ci	struct clk_hw *hw;
37562306a36Sopenharmony_ci	int ep_chg_id;
37662306a36Sopenharmony_ci	u8 ep_count;
37762306a36Sopenharmony_ci	u8 ep_mux_table[4];
37862306a36Sopenharmony_ci	u8 id;
37962306a36Sopenharmony_ci	u8 eid;
38062306a36Sopenharmony_ci	u8 c;
38162306a36Sopenharmony_ci} sama7g5_mckx[] = {
38262306a36Sopenharmony_ci	{ .n = "mck0", }, /* Dummy entry for MCK0 to store hw in probe. */
38362306a36Sopenharmony_ci	{ .n = "mck1",
38462306a36Sopenharmony_ci	  .id = 1,
38562306a36Sopenharmony_ci	  .ep = { PLL_IDS_TO_ARR_ENTRY(SYS, DIV0), },
38662306a36Sopenharmony_ci	  .ep_mux_table = { 5, },
38762306a36Sopenharmony_ci	  .ep_count = 1,
38862306a36Sopenharmony_ci	  .ep_chg_id = INT_MIN,
38962306a36Sopenharmony_ci	  .eid = PMC_MCK1,
39062306a36Sopenharmony_ci	  .c = 1, },
39162306a36Sopenharmony_ci
39262306a36Sopenharmony_ci	{ .n = "mck2",
39362306a36Sopenharmony_ci	  .id = 2,
39462306a36Sopenharmony_ci	  .ep = { PLL_IDS_TO_ARR_ENTRY(DDR, DIV0), },
39562306a36Sopenharmony_ci	  .ep_mux_table = { 6, },
39662306a36Sopenharmony_ci	  .ep_count = 1,
39762306a36Sopenharmony_ci	  .ep_chg_id = INT_MIN,
39862306a36Sopenharmony_ci	  .c = 1, },
39962306a36Sopenharmony_ci
40062306a36Sopenharmony_ci	{ .n = "mck3",
40162306a36Sopenharmony_ci	  .id = 3,
40262306a36Sopenharmony_ci	  .ep = { PLL_IDS_TO_ARR_ENTRY(SYS, DIV0), PLL_IDS_TO_ARR_ENTRY(DDR, DIV0),
40362306a36Sopenharmony_ci		  PLL_IDS_TO_ARR_ENTRY(IMG, DIV0), },
40462306a36Sopenharmony_ci	  .ep_mux_table = { 5, 6, 7, },
40562306a36Sopenharmony_ci	  .ep_count = 3,
40662306a36Sopenharmony_ci	  .ep_chg_id = 5, },
40762306a36Sopenharmony_ci
40862306a36Sopenharmony_ci	{ .n = "mck4",
40962306a36Sopenharmony_ci	  .id = 4,
41062306a36Sopenharmony_ci	  .ep = { PLL_IDS_TO_ARR_ENTRY(SYS, DIV0), },
41162306a36Sopenharmony_ci	  .ep_mux_table = { 5, },
41262306a36Sopenharmony_ci	  .ep_count = 1,
41362306a36Sopenharmony_ci	  .ep_chg_id = INT_MIN,
41462306a36Sopenharmony_ci	  .c = 1, },
41562306a36Sopenharmony_ci};
41662306a36Sopenharmony_ci
41762306a36Sopenharmony_ci/*
41862306a36Sopenharmony_ci * System clock description
41962306a36Sopenharmony_ci * @n:	clock name
42062306a36Sopenharmony_ci * @id: clock id
42162306a36Sopenharmony_ci */
42262306a36Sopenharmony_cistatic const struct {
42362306a36Sopenharmony_ci	const char *n;
42462306a36Sopenharmony_ci	u8 id;
42562306a36Sopenharmony_ci} sama7g5_systemck[] = {
42662306a36Sopenharmony_ci	{ .n = "pck0", .id = 8, },
42762306a36Sopenharmony_ci	{ .n = "pck1", .id = 9, },
42862306a36Sopenharmony_ci	{ .n = "pck2", .id = 10, },
42962306a36Sopenharmony_ci	{ .n = "pck3", .id = 11, },
43062306a36Sopenharmony_ci	{ .n = "pck4", .id = 12, },
43162306a36Sopenharmony_ci	{ .n = "pck5", .id = 13, },
43262306a36Sopenharmony_ci	{ .n = "pck6", .id = 14, },
43362306a36Sopenharmony_ci	{ .n = "pck7", .id = 15, },
43462306a36Sopenharmony_ci};
43562306a36Sopenharmony_ci
43662306a36Sopenharmony_ci/* Mux table for programmable clocks. */
43762306a36Sopenharmony_cistatic u32 sama7g5_prog_mux_table[] = { 0, 1, 2, 5, 6, 7, 8, 9, 10, };
43862306a36Sopenharmony_ci
43962306a36Sopenharmony_ci/*
44062306a36Sopenharmony_ci * Peripheral clock parent hw identifier (used to index in sama7g5_mckx[])
44162306a36Sopenharmony_ci * @PCK_PARENT_HW_MCK0: pck parent hw identifier is MCK0
44262306a36Sopenharmony_ci * @PCK_PARENT_HW_MCK1: pck parent hw identifier is MCK1
44362306a36Sopenharmony_ci * @PCK_PARENT_HW_MCK2: pck parent hw identifier is MCK2
44462306a36Sopenharmony_ci * @PCK_PARENT_HW_MCK3: pck parent hw identifier is MCK3
44562306a36Sopenharmony_ci * @PCK_PARENT_HW_MCK4: pck parent hw identifier is MCK4
44662306a36Sopenharmony_ci * @PCK_PARENT_HW_MAX: max identifier
44762306a36Sopenharmony_ci */
44862306a36Sopenharmony_cienum sama7g5_pck_parent_hw_id {
44962306a36Sopenharmony_ci	PCK_PARENT_HW_MCK0,
45062306a36Sopenharmony_ci	PCK_PARENT_HW_MCK1,
45162306a36Sopenharmony_ci	PCK_PARENT_HW_MCK2,
45262306a36Sopenharmony_ci	PCK_PARENT_HW_MCK3,
45362306a36Sopenharmony_ci	PCK_PARENT_HW_MCK4,
45462306a36Sopenharmony_ci	PCK_PARENT_HW_MAX,
45562306a36Sopenharmony_ci};
45662306a36Sopenharmony_ci
45762306a36Sopenharmony_ci/*
45862306a36Sopenharmony_ci * Peripheral clock description
45962306a36Sopenharmony_ci * @n:		clock name
46062306a36Sopenharmony_ci * @p:		clock parent hw id
46162306a36Sopenharmony_ci * @r:		clock range values
46262306a36Sopenharmony_ci * @id:		clock id
46362306a36Sopenharmony_ci * @chgp:	index in parent array of the changeable parent
46462306a36Sopenharmony_ci */
46562306a36Sopenharmony_cistatic struct {
46662306a36Sopenharmony_ci	const char *n;
46762306a36Sopenharmony_ci	enum sama7g5_pck_parent_hw_id p;
46862306a36Sopenharmony_ci	struct clk_range r;
46962306a36Sopenharmony_ci	u8 chgp;
47062306a36Sopenharmony_ci	u8 id;
47162306a36Sopenharmony_ci} sama7g5_periphck[] = {
47262306a36Sopenharmony_ci	{ .n = "pioA_clk",	.p = PCK_PARENT_HW_MCK0, .id = 11, },
47362306a36Sopenharmony_ci	{ .n = "securam_clk",	.p = PCK_PARENT_HW_MCK0, .id = 18, },
47462306a36Sopenharmony_ci	{ .n = "sfr_clk",	.p = PCK_PARENT_HW_MCK1, .id = 19, },
47562306a36Sopenharmony_ci	{ .n = "hsmc_clk",	.p = PCK_PARENT_HW_MCK1, .id = 21, },
47662306a36Sopenharmony_ci	{ .n = "xdmac0_clk",	.p = PCK_PARENT_HW_MCK1, .id = 22, },
47762306a36Sopenharmony_ci	{ .n = "xdmac1_clk",	.p = PCK_PARENT_HW_MCK1, .id = 23, },
47862306a36Sopenharmony_ci	{ .n = "xdmac2_clk",	.p = PCK_PARENT_HW_MCK1, .id = 24, },
47962306a36Sopenharmony_ci	{ .n = "acc_clk",	.p = PCK_PARENT_HW_MCK1, .id = 25, },
48062306a36Sopenharmony_ci	{ .n = "aes_clk",	.p = PCK_PARENT_HW_MCK1, .id = 27, },
48162306a36Sopenharmony_ci	{ .n = "tzaesbasc_clk",	.p = PCK_PARENT_HW_MCK1, .id = 28, },
48262306a36Sopenharmony_ci	{ .n = "asrc_clk",	.p = PCK_PARENT_HW_MCK1, .id = 30, .r = { .max = 200000000, }, },
48362306a36Sopenharmony_ci	{ .n = "cpkcc_clk",	.p = PCK_PARENT_HW_MCK0, .id = 32, },
48462306a36Sopenharmony_ci	{ .n = "csi_clk",	.p = PCK_PARENT_HW_MCK3, .id = 33, .r = { .max = 266000000, }, .chgp = 1, },
48562306a36Sopenharmony_ci	{ .n = "csi2dc_clk",	.p = PCK_PARENT_HW_MCK3, .id = 34, .r = { .max = 266000000, }, .chgp = 1, },
48662306a36Sopenharmony_ci	{ .n = "eic_clk",	.p = PCK_PARENT_HW_MCK1, .id = 37, },
48762306a36Sopenharmony_ci	{ .n = "flex0_clk",	.p = PCK_PARENT_HW_MCK1, .id = 38, },
48862306a36Sopenharmony_ci	{ .n = "flex1_clk",	.p = PCK_PARENT_HW_MCK1, .id = 39, },
48962306a36Sopenharmony_ci	{ .n = "flex2_clk",	.p = PCK_PARENT_HW_MCK1, .id = 40, },
49062306a36Sopenharmony_ci	{ .n = "flex3_clk",	.p = PCK_PARENT_HW_MCK1, .id = 41, },
49162306a36Sopenharmony_ci	{ .n = "flex4_clk",	.p = PCK_PARENT_HW_MCK1, .id = 42, },
49262306a36Sopenharmony_ci	{ .n = "flex5_clk",	.p = PCK_PARENT_HW_MCK1, .id = 43, },
49362306a36Sopenharmony_ci	{ .n = "flex6_clk",	.p = PCK_PARENT_HW_MCK1, .id = 44, },
49462306a36Sopenharmony_ci	{ .n = "flex7_clk",	.p = PCK_PARENT_HW_MCK1, .id = 45, },
49562306a36Sopenharmony_ci	{ .n = "flex8_clk",	.p = PCK_PARENT_HW_MCK1, .id = 46, },
49662306a36Sopenharmony_ci	{ .n = "flex9_clk",	.p = PCK_PARENT_HW_MCK1, .id = 47, },
49762306a36Sopenharmony_ci	{ .n = "flex10_clk",	.p = PCK_PARENT_HW_MCK1, .id = 48, },
49862306a36Sopenharmony_ci	{ .n = "flex11_clk",	.p = PCK_PARENT_HW_MCK1, .id = 49, },
49962306a36Sopenharmony_ci	{ .n = "gmac0_clk",	.p = PCK_PARENT_HW_MCK1, .id = 51, },
50062306a36Sopenharmony_ci	{ .n = "gmac1_clk",	.p = PCK_PARENT_HW_MCK1, .id = 52, },
50162306a36Sopenharmony_ci	{ .n = "icm_clk",	.p = PCK_PARENT_HW_MCK1, .id = 55, },
50262306a36Sopenharmony_ci	{ .n = "isc_clk",	.p = PCK_PARENT_HW_MCK3, .id = 56, .r = { .max = 266000000, }, .chgp = 1, },
50362306a36Sopenharmony_ci	{ .n = "i2smcc0_clk",	.p = PCK_PARENT_HW_MCK1, .id = 57, .r = { .max = 200000000, }, },
50462306a36Sopenharmony_ci	{ .n = "i2smcc1_clk",	.p = PCK_PARENT_HW_MCK1, .id = 58, .r = { .max = 200000000, }, },
50562306a36Sopenharmony_ci	{ .n = "matrix_clk",	.p = PCK_PARENT_HW_MCK1, .id = 60, },
50662306a36Sopenharmony_ci	{ .n = "mcan0_clk",	.p = PCK_PARENT_HW_MCK1, .id = 61, .r = { .max = 200000000, }, },
50762306a36Sopenharmony_ci	{ .n = "mcan1_clk",	.p = PCK_PARENT_HW_MCK1, .id = 62, .r = { .max = 200000000, }, },
50862306a36Sopenharmony_ci	{ .n = "mcan2_clk",	.p = PCK_PARENT_HW_MCK1, .id = 63, .r = { .max = 200000000, }, },
50962306a36Sopenharmony_ci	{ .n = "mcan3_clk",	.p = PCK_PARENT_HW_MCK1, .id = 64, .r = { .max = 200000000, }, },
51062306a36Sopenharmony_ci	{ .n = "mcan4_clk",	.p = PCK_PARENT_HW_MCK1, .id = 65, .r = { .max = 200000000, }, },
51162306a36Sopenharmony_ci	{ .n = "mcan5_clk",	.p = PCK_PARENT_HW_MCK1, .id = 66, .r = { .max = 200000000, }, },
51262306a36Sopenharmony_ci	{ .n = "pdmc0_clk",	.p = PCK_PARENT_HW_MCK1, .id = 68, .r = { .max = 200000000, }, },
51362306a36Sopenharmony_ci	{ .n = "pdmc1_clk",	.p = PCK_PARENT_HW_MCK1, .id = 69, .r = { .max = 200000000, }, },
51462306a36Sopenharmony_ci	{ .n = "pit64b0_clk",	.p = PCK_PARENT_HW_MCK1, .id = 70, },
51562306a36Sopenharmony_ci	{ .n = "pit64b1_clk",	.p = PCK_PARENT_HW_MCK1, .id = 71, },
51662306a36Sopenharmony_ci	{ .n = "pit64b2_clk",	.p = PCK_PARENT_HW_MCK1, .id = 72, },
51762306a36Sopenharmony_ci	{ .n = "pit64b3_clk",	.p = PCK_PARENT_HW_MCK1, .id = 73, },
51862306a36Sopenharmony_ci	{ .n = "pit64b4_clk",	.p = PCK_PARENT_HW_MCK1, .id = 74, },
51962306a36Sopenharmony_ci	{ .n = "pit64b5_clk",	.p = PCK_PARENT_HW_MCK1, .id = 75, },
52062306a36Sopenharmony_ci	{ .n = "pwm_clk",	.p = PCK_PARENT_HW_MCK1, .id = 77, },
52162306a36Sopenharmony_ci	{ .n = "qspi0_clk",	.p = PCK_PARENT_HW_MCK1, .id = 78, },
52262306a36Sopenharmony_ci	{ .n = "qspi1_clk",	.p = PCK_PARENT_HW_MCK1, .id = 79, },
52362306a36Sopenharmony_ci	{ .n = "sdmmc0_clk",	.p = PCK_PARENT_HW_MCK1, .id = 80, },
52462306a36Sopenharmony_ci	{ .n = "sdmmc1_clk",	.p = PCK_PARENT_HW_MCK1, .id = 81, },
52562306a36Sopenharmony_ci	{ .n = "sdmmc2_clk",	.p = PCK_PARENT_HW_MCK1, .id = 82, },
52662306a36Sopenharmony_ci	{ .n = "sha_clk",	.p = PCK_PARENT_HW_MCK1, .id = 83, },
52762306a36Sopenharmony_ci	{ .n = "spdifrx_clk",	.p = PCK_PARENT_HW_MCK1, .id = 84, .r = { .max = 200000000, }, },
52862306a36Sopenharmony_ci	{ .n = "spdiftx_clk",	.p = PCK_PARENT_HW_MCK1, .id = 85, .r = { .max = 200000000, }, },
52962306a36Sopenharmony_ci	{ .n = "ssc0_clk",	.p = PCK_PARENT_HW_MCK1, .id = 86, .r = { .max = 200000000, }, },
53062306a36Sopenharmony_ci	{ .n = "ssc1_clk",	.p = PCK_PARENT_HW_MCK1, .id = 87, .r = { .max = 200000000, }, },
53162306a36Sopenharmony_ci	{ .n = "tcb0_ch0_clk",	.p = PCK_PARENT_HW_MCK1, .id = 88, .r = { .max = 200000000, }, },
53262306a36Sopenharmony_ci	{ .n = "tcb0_ch1_clk",	.p = PCK_PARENT_HW_MCK1, .id = 89, .r = { .max = 200000000, }, },
53362306a36Sopenharmony_ci	{ .n = "tcb0_ch2_clk",	.p = PCK_PARENT_HW_MCK1, .id = 90, .r = { .max = 200000000, }, },
53462306a36Sopenharmony_ci	{ .n = "tcb1_ch0_clk",	.p = PCK_PARENT_HW_MCK1, .id = 91, .r = { .max = 200000000, }, },
53562306a36Sopenharmony_ci	{ .n = "tcb1_ch1_clk",	.p = PCK_PARENT_HW_MCK1, .id = 92, .r = { .max = 200000000, }, },
53662306a36Sopenharmony_ci	{ .n = "tcb1_ch2_clk",	.p = PCK_PARENT_HW_MCK1, .id = 93, .r = { .max = 200000000, }, },
53762306a36Sopenharmony_ci	{ .n = "tcpca_clk",	.p = PCK_PARENT_HW_MCK1, .id = 94, },
53862306a36Sopenharmony_ci	{ .n = "tcpcb_clk",	.p = PCK_PARENT_HW_MCK1, .id = 95, },
53962306a36Sopenharmony_ci	{ .n = "tdes_clk",	.p = PCK_PARENT_HW_MCK1, .id = 96, },
54062306a36Sopenharmony_ci	{ .n = "trng_clk",	.p = PCK_PARENT_HW_MCK1, .id = 97, },
54162306a36Sopenharmony_ci	{ .n = "udphsa_clk",	.p = PCK_PARENT_HW_MCK1, .id = 104, },
54262306a36Sopenharmony_ci	{ .n = "udphsb_clk",	.p = PCK_PARENT_HW_MCK1, .id = 105, },
54362306a36Sopenharmony_ci	{ .n = "uhphs_clk",	.p = PCK_PARENT_HW_MCK1, .id = 106, },
54462306a36Sopenharmony_ci};
54562306a36Sopenharmony_ci
54662306a36Sopenharmony_ci/*
54762306a36Sopenharmony_ci * Generic clock description
54862306a36Sopenharmony_ci * @n:			clock name
54962306a36Sopenharmony_ci * @pp:			PLL parents (entry formed by PLL components identifiers
55062306a36Sopenharmony_ci *			(see enum pll_component_id))
55162306a36Sopenharmony_ci * @pp_mux_table:	PLL parents mux table
55262306a36Sopenharmony_ci * @r:			clock output range
55362306a36Sopenharmony_ci * @pp_chg_id:		id in parent array of changeable PLL parent
55462306a36Sopenharmony_ci * @pp_count:		PLL parents count
55562306a36Sopenharmony_ci * @id:			clock id
55662306a36Sopenharmony_ci */
55762306a36Sopenharmony_cistatic const struct {
55862306a36Sopenharmony_ci	const char *n;
55962306a36Sopenharmony_ci	struct {
56062306a36Sopenharmony_ci		int pll_id;
56162306a36Sopenharmony_ci		int pll_compid;
56262306a36Sopenharmony_ci	} pp[8];
56362306a36Sopenharmony_ci	const char pp_mux_table[8];
56462306a36Sopenharmony_ci	struct clk_range r;
56562306a36Sopenharmony_ci	int pp_chg_id;
56662306a36Sopenharmony_ci	u8 pp_count;
56762306a36Sopenharmony_ci	u8 id;
56862306a36Sopenharmony_ci} sama7g5_gck[] = {
56962306a36Sopenharmony_ci	{ .n  = "adc_gclk",
57062306a36Sopenharmony_ci	  .id = 26,
57162306a36Sopenharmony_ci	  .r = { .max = 100000000, },
57262306a36Sopenharmony_ci	  .pp = { PLL_IDS_TO_ARR_ENTRY(SYS, DIV0), PLL_IDS_TO_ARR_ENTRY(IMG, DIV0),
57362306a36Sopenharmony_ci		  PLL_IDS_TO_ARR_ENTRY(AUDIO, DIV0), },
57462306a36Sopenharmony_ci	  .pp_mux_table = { 5, 7, 9, },
57562306a36Sopenharmony_ci	  .pp_count = 3,
57662306a36Sopenharmony_ci	  .pp_chg_id = INT_MIN, },
57762306a36Sopenharmony_ci
57862306a36Sopenharmony_ci	{ .n  = "asrc_gclk",
57962306a36Sopenharmony_ci	  .id = 30,
58062306a36Sopenharmony_ci	  .r = { .max = 200000000 },
58162306a36Sopenharmony_ci	  .pp = { PLL_IDS_TO_ARR_ENTRY(AUDIO, DIV0), },
58262306a36Sopenharmony_ci	  .pp_mux_table = { 9, },
58362306a36Sopenharmony_ci	  .pp_count = 1,
58462306a36Sopenharmony_ci	  .pp_chg_id = 3, },
58562306a36Sopenharmony_ci
58662306a36Sopenharmony_ci	{ .n  = "csi_gclk",
58762306a36Sopenharmony_ci	  .id = 33,
58862306a36Sopenharmony_ci	  .r = { .max = 27000000  },
58962306a36Sopenharmony_ci	  .pp = { PLL_IDS_TO_ARR_ENTRY(DDR, DIV0), PLL_IDS_TO_ARR_ENTRY(IMG, DIV0), },
59062306a36Sopenharmony_ci	  .pp_mux_table = { 6, 7, },
59162306a36Sopenharmony_ci	  .pp_count = 2,
59262306a36Sopenharmony_ci	  .pp_chg_id = INT_MIN, },
59362306a36Sopenharmony_ci
59462306a36Sopenharmony_ci	{ .n  = "flex0_gclk",
59562306a36Sopenharmony_ci	  .id = 38,
59662306a36Sopenharmony_ci	  .r = { .max = 200000000 },
59762306a36Sopenharmony_ci	  .pp = { PLL_IDS_TO_ARR_ENTRY(SYS, DIV0), PLL_IDS_TO_ARR_ENTRY(BAUD, DIV0), },
59862306a36Sopenharmony_ci	  .pp_mux_table = { 5, 8, },
59962306a36Sopenharmony_ci	  .pp_count = 2,
60062306a36Sopenharmony_ci	  .pp_chg_id = INT_MIN, },
60162306a36Sopenharmony_ci
60262306a36Sopenharmony_ci	{ .n  = "flex1_gclk",
60362306a36Sopenharmony_ci	  .id = 39,
60462306a36Sopenharmony_ci	  .r = { .max = 200000000 },
60562306a36Sopenharmony_ci	  .pp = { PLL_IDS_TO_ARR_ENTRY(SYS, DIV0), PLL_IDS_TO_ARR_ENTRY(BAUD, DIV0), },
60662306a36Sopenharmony_ci	  .pp_mux_table = { 5, 8, },
60762306a36Sopenharmony_ci	  .pp_count = 2,
60862306a36Sopenharmony_ci	  .pp_chg_id = INT_MIN, },
60962306a36Sopenharmony_ci
61062306a36Sopenharmony_ci	{ .n  = "flex2_gclk",
61162306a36Sopenharmony_ci	  .id = 40,
61262306a36Sopenharmony_ci	  .r = { .max = 200000000 },
61362306a36Sopenharmony_ci	  .pp = { PLL_IDS_TO_ARR_ENTRY(SYS, DIV0), PLL_IDS_TO_ARR_ENTRY(BAUD, DIV0), },
61462306a36Sopenharmony_ci	  .pp_mux_table = { 5, 8, },
61562306a36Sopenharmony_ci	  .pp_count = 2,
61662306a36Sopenharmony_ci	  .pp_chg_id = INT_MIN, },
61762306a36Sopenharmony_ci
61862306a36Sopenharmony_ci	{ .n  = "flex3_gclk",
61962306a36Sopenharmony_ci	  .id = 41,
62062306a36Sopenharmony_ci	  .r = { .max = 200000000 },
62162306a36Sopenharmony_ci	  .pp = { PLL_IDS_TO_ARR_ENTRY(SYS, DIV0), PLL_IDS_TO_ARR_ENTRY(BAUD, DIV0), },
62262306a36Sopenharmony_ci	  .pp_mux_table = { 5, 8, },
62362306a36Sopenharmony_ci	  .pp_count = 2,
62462306a36Sopenharmony_ci	  .pp_chg_id = INT_MIN, },
62562306a36Sopenharmony_ci
62662306a36Sopenharmony_ci	{ .n  = "flex4_gclk",
62762306a36Sopenharmony_ci	  .id = 42,
62862306a36Sopenharmony_ci	  .r = { .max = 200000000 },
62962306a36Sopenharmony_ci	  .pp = { PLL_IDS_TO_ARR_ENTRY(SYS, DIV0), PLL_IDS_TO_ARR_ENTRY(BAUD, DIV0), },
63062306a36Sopenharmony_ci	  .pp_mux_table = { 5, 8, },
63162306a36Sopenharmony_ci	  .pp_count = 2,
63262306a36Sopenharmony_ci	  .pp_chg_id = INT_MIN, },
63362306a36Sopenharmony_ci
63462306a36Sopenharmony_ci	{ .n  = "flex5_gclk",
63562306a36Sopenharmony_ci	  .id = 43,
63662306a36Sopenharmony_ci	  .r = { .max = 200000000 },
63762306a36Sopenharmony_ci	  .pp = { PLL_IDS_TO_ARR_ENTRY(SYS, DIV0), PLL_IDS_TO_ARR_ENTRY(BAUD, DIV0), },
63862306a36Sopenharmony_ci	  .pp_mux_table = { 5, 8, },
63962306a36Sopenharmony_ci	  .pp_count = 2,
64062306a36Sopenharmony_ci	  .pp_chg_id = INT_MIN, },
64162306a36Sopenharmony_ci
64262306a36Sopenharmony_ci	{ .n  = "flex6_gclk",
64362306a36Sopenharmony_ci	  .id = 44,
64462306a36Sopenharmony_ci	  .r = { .max = 200000000 },
64562306a36Sopenharmony_ci	  .pp = { PLL_IDS_TO_ARR_ENTRY(SYS, DIV0), PLL_IDS_TO_ARR_ENTRY(BAUD, DIV0), },
64662306a36Sopenharmony_ci	  .pp_mux_table = { 5, 8, },
64762306a36Sopenharmony_ci	  .pp_count = 2,
64862306a36Sopenharmony_ci	  .pp_chg_id = INT_MIN, },
64962306a36Sopenharmony_ci
65062306a36Sopenharmony_ci	{ .n  = "flex7_gclk",
65162306a36Sopenharmony_ci	  .id = 45,
65262306a36Sopenharmony_ci	  .r = { .max = 200000000 },
65362306a36Sopenharmony_ci	  .pp = { PLL_IDS_TO_ARR_ENTRY(SYS, DIV0), PLL_IDS_TO_ARR_ENTRY(BAUD, DIV0), },
65462306a36Sopenharmony_ci	  .pp_mux_table = { 5, 8, },
65562306a36Sopenharmony_ci	  .pp_count = 2,
65662306a36Sopenharmony_ci	  .pp_chg_id = INT_MIN, },
65762306a36Sopenharmony_ci
65862306a36Sopenharmony_ci	{ .n  = "flex8_gclk",
65962306a36Sopenharmony_ci	  .id = 46,
66062306a36Sopenharmony_ci	  .r = { .max = 200000000 },
66162306a36Sopenharmony_ci	  .pp = { PLL_IDS_TO_ARR_ENTRY(SYS, DIV0), PLL_IDS_TO_ARR_ENTRY(BAUD, DIV0), },
66262306a36Sopenharmony_ci	  .pp_mux_table = { 5, 8, },
66362306a36Sopenharmony_ci	  .pp_count = 2,
66462306a36Sopenharmony_ci	  .pp_chg_id = INT_MIN, },
66562306a36Sopenharmony_ci
66662306a36Sopenharmony_ci	{ .n  = "flex9_gclk",
66762306a36Sopenharmony_ci	  .id = 47,
66862306a36Sopenharmony_ci	  .r = { .max = 200000000 },
66962306a36Sopenharmony_ci	  .pp = { PLL_IDS_TO_ARR_ENTRY(SYS, DIV0), PLL_IDS_TO_ARR_ENTRY(BAUD, DIV0), },
67062306a36Sopenharmony_ci	  .pp_mux_table = { 5, 8, },
67162306a36Sopenharmony_ci	  .pp_count = 2,
67262306a36Sopenharmony_ci	  .pp_chg_id = INT_MIN, },
67362306a36Sopenharmony_ci
67462306a36Sopenharmony_ci	{ .n  = "flex10_gclk",
67562306a36Sopenharmony_ci	  .id = 48,
67662306a36Sopenharmony_ci	  .r = { .max = 200000000 },
67762306a36Sopenharmony_ci	  .pp = { PLL_IDS_TO_ARR_ENTRY(SYS, DIV0), PLL_IDS_TO_ARR_ENTRY(BAUD, DIV0), },
67862306a36Sopenharmony_ci	  .pp_mux_table = { 5, 8, },
67962306a36Sopenharmony_ci	  .pp_count = 2,
68062306a36Sopenharmony_ci	  .pp_chg_id = INT_MIN, },
68162306a36Sopenharmony_ci
68262306a36Sopenharmony_ci	{ .n  = "flex11_gclk",
68362306a36Sopenharmony_ci	  .id = 49,
68462306a36Sopenharmony_ci	  .r = { .max = 200000000 },
68562306a36Sopenharmony_ci	  .pp = { PLL_IDS_TO_ARR_ENTRY(SYS, DIV0), PLL_IDS_TO_ARR_ENTRY(BAUD, DIV0), },
68662306a36Sopenharmony_ci	  .pp_mux_table = { 5, 8, },
68762306a36Sopenharmony_ci	  .pp_count = 2,
68862306a36Sopenharmony_ci	  .pp_chg_id = INT_MIN, },
68962306a36Sopenharmony_ci
69062306a36Sopenharmony_ci	{ .n  = "gmac0_gclk",
69162306a36Sopenharmony_ci	  .id = 51,
69262306a36Sopenharmony_ci	  .r = { .max = 125000000 },
69362306a36Sopenharmony_ci	  .pp = { PLL_IDS_TO_ARR_ENTRY(ETH, DIV0), },
69462306a36Sopenharmony_ci	  .pp_mux_table = { 10, },
69562306a36Sopenharmony_ci	  .pp_count = 1,
69662306a36Sopenharmony_ci	  .pp_chg_id = 3, },
69762306a36Sopenharmony_ci
69862306a36Sopenharmony_ci	{ .n  = "gmac1_gclk",
69962306a36Sopenharmony_ci	  .id = 52,
70062306a36Sopenharmony_ci	  .r = { .max = 50000000  },
70162306a36Sopenharmony_ci	  .pp = { PLL_IDS_TO_ARR_ENTRY(ETH, DIV0), },
70262306a36Sopenharmony_ci	  .pp_mux_table = { 10, },
70362306a36Sopenharmony_ci	  .pp_count = 1,
70462306a36Sopenharmony_ci	  .pp_chg_id = INT_MIN, },
70562306a36Sopenharmony_ci
70662306a36Sopenharmony_ci	{ .n  = "gmac0_tsu_gclk",
70762306a36Sopenharmony_ci	  .id = 53,
70862306a36Sopenharmony_ci	  .r = { .max = 300000000 },
70962306a36Sopenharmony_ci	  .pp = { PLL_IDS_TO_ARR_ENTRY(AUDIO, DIV0), PLL_IDS_TO_ARR_ENTRY(ETH, DIV0), },
71062306a36Sopenharmony_ci	  .pp_mux_table = { 9, 10, },
71162306a36Sopenharmony_ci	  .pp_count = 2,
71262306a36Sopenharmony_ci	  .pp_chg_id = INT_MIN, },
71362306a36Sopenharmony_ci
71462306a36Sopenharmony_ci	{ .n  = "gmac1_tsu_gclk",
71562306a36Sopenharmony_ci	  .id = 54,
71662306a36Sopenharmony_ci	  .r = { .max = 300000000 },
71762306a36Sopenharmony_ci	  .pp = { PLL_IDS_TO_ARR_ENTRY(AUDIO, DIV0), PLL_IDS_TO_ARR_ENTRY(ETH, DIV0), },
71862306a36Sopenharmony_ci	  .pp_mux_table = { 9, 10, },
71962306a36Sopenharmony_ci	  .pp_count = 2,
72062306a36Sopenharmony_ci	  .pp_chg_id = INT_MIN, },
72162306a36Sopenharmony_ci
72262306a36Sopenharmony_ci	{ .n  = "i2smcc0_gclk",
72362306a36Sopenharmony_ci	  .id = 57,
72462306a36Sopenharmony_ci	  .r = { .max = 100000000 },
72562306a36Sopenharmony_ci	  .pp = { PLL_IDS_TO_ARR_ENTRY(SYS, DIV0), PLL_IDS_TO_ARR_ENTRY(AUDIO, DIV0), },
72662306a36Sopenharmony_ci	  .pp_mux_table = { 5, 9, },
72762306a36Sopenharmony_ci	  .pp_count = 2,
72862306a36Sopenharmony_ci	  .pp_chg_id = 4, },
72962306a36Sopenharmony_ci
73062306a36Sopenharmony_ci	{ .n  = "i2smcc1_gclk",
73162306a36Sopenharmony_ci	  .id = 58,
73262306a36Sopenharmony_ci	  .r = { .max = 100000000 },
73362306a36Sopenharmony_ci	  .pp = { PLL_IDS_TO_ARR_ENTRY(SYS, DIV0), PLL_IDS_TO_ARR_ENTRY(AUDIO, DIV0), },
73462306a36Sopenharmony_ci	  .pp_mux_table = { 5, 9, },
73562306a36Sopenharmony_ci	  .pp_count = 2,
73662306a36Sopenharmony_ci	  .pp_chg_id = 4, },
73762306a36Sopenharmony_ci
73862306a36Sopenharmony_ci	{ .n  = "mcan0_gclk",
73962306a36Sopenharmony_ci	  .id = 61,
74062306a36Sopenharmony_ci	  .r = { .max = 200000000 },
74162306a36Sopenharmony_ci	  .pp = { PLL_IDS_TO_ARR_ENTRY(SYS, DIV0), PLL_IDS_TO_ARR_ENTRY(BAUD, DIV0), },
74262306a36Sopenharmony_ci	  .pp_mux_table = { 5, 8, },
74362306a36Sopenharmony_ci	  .pp_count = 2,
74462306a36Sopenharmony_ci	  .pp_chg_id = INT_MIN, },
74562306a36Sopenharmony_ci
74662306a36Sopenharmony_ci	{ .n  = "mcan1_gclk",
74762306a36Sopenharmony_ci	  .id = 62,
74862306a36Sopenharmony_ci	  .r = { .max = 200000000 },
74962306a36Sopenharmony_ci	  .pp = { PLL_IDS_TO_ARR_ENTRY(SYS, DIV0), PLL_IDS_TO_ARR_ENTRY(BAUD, DIV0), },
75062306a36Sopenharmony_ci	  .pp_mux_table = { 5, 8, },
75162306a36Sopenharmony_ci	  .pp_count = 2,
75262306a36Sopenharmony_ci	  .pp_chg_id = INT_MIN, },
75362306a36Sopenharmony_ci
75462306a36Sopenharmony_ci	{ .n  = "mcan2_gclk",
75562306a36Sopenharmony_ci	  .id = 63,
75662306a36Sopenharmony_ci	  .r = { .max = 200000000 },
75762306a36Sopenharmony_ci	  .pp = { PLL_IDS_TO_ARR_ENTRY(SYS, DIV0), PLL_IDS_TO_ARR_ENTRY(BAUD, DIV0), },
75862306a36Sopenharmony_ci	  .pp_mux_table = { 5, 8, },
75962306a36Sopenharmony_ci	  .pp_count = 2,
76062306a36Sopenharmony_ci	  .pp_chg_id = INT_MIN, },
76162306a36Sopenharmony_ci
76262306a36Sopenharmony_ci	{ .n  = "mcan3_gclk",
76362306a36Sopenharmony_ci	  .id = 64,
76462306a36Sopenharmony_ci	  .r = { .max = 200000000 },
76562306a36Sopenharmony_ci	  .pp = { PLL_IDS_TO_ARR_ENTRY(SYS, DIV0), PLL_IDS_TO_ARR_ENTRY(BAUD, DIV0), },
76662306a36Sopenharmony_ci	  .pp_mux_table = { 5, 8, },
76762306a36Sopenharmony_ci	  .pp_count = 2,
76862306a36Sopenharmony_ci	  .pp_chg_id = INT_MIN, },
76962306a36Sopenharmony_ci
77062306a36Sopenharmony_ci	{ .n  = "mcan4_gclk",
77162306a36Sopenharmony_ci	  .id = 65,
77262306a36Sopenharmony_ci	  .r = { .max = 200000000 },
77362306a36Sopenharmony_ci	  .pp = { PLL_IDS_TO_ARR_ENTRY(SYS, DIV0), PLL_IDS_TO_ARR_ENTRY(BAUD, DIV0), },
77462306a36Sopenharmony_ci	  .pp_mux_table = { 5, 8, },
77562306a36Sopenharmony_ci	  .pp_count = 2,
77662306a36Sopenharmony_ci	  .pp_chg_id = INT_MIN, },
77762306a36Sopenharmony_ci
77862306a36Sopenharmony_ci	{ .n  = "mcan5_gclk",
77962306a36Sopenharmony_ci	  .id = 66,
78062306a36Sopenharmony_ci	  .r = { .max = 200000000 },
78162306a36Sopenharmony_ci	  .pp = { PLL_IDS_TO_ARR_ENTRY(SYS, DIV0), PLL_IDS_TO_ARR_ENTRY(BAUD, DIV0), },
78262306a36Sopenharmony_ci	  .pp_mux_table = { 5, 8, },
78362306a36Sopenharmony_ci	  .pp_count = 2,
78462306a36Sopenharmony_ci	  .pp_chg_id = INT_MIN, },
78562306a36Sopenharmony_ci
78662306a36Sopenharmony_ci	{ .n  = "pdmc0_gclk",
78762306a36Sopenharmony_ci	  .id = 68,
78862306a36Sopenharmony_ci	  .r = { .max = 50000000  },
78962306a36Sopenharmony_ci	  .pp = { PLL_IDS_TO_ARR_ENTRY(SYS, DIV0), PLL_IDS_TO_ARR_ENTRY(AUDIO, DIV0), },
79062306a36Sopenharmony_ci	  .pp_mux_table = { 5, 9, },
79162306a36Sopenharmony_ci	  .pp_count = 2,
79262306a36Sopenharmony_ci	  .pp_chg_id = INT_MIN, },
79362306a36Sopenharmony_ci
79462306a36Sopenharmony_ci	{ .n  = "pdmc1_gclk",
79562306a36Sopenharmony_ci	  .id = 69,
79662306a36Sopenharmony_ci	  .r = { .max = 50000000, },
79762306a36Sopenharmony_ci	  .pp = { PLL_IDS_TO_ARR_ENTRY(SYS, DIV0), PLL_IDS_TO_ARR_ENTRY(AUDIO, DIV0), },
79862306a36Sopenharmony_ci	  .pp_mux_table = { 5, 9, },
79962306a36Sopenharmony_ci	  .pp_count = 2,
80062306a36Sopenharmony_ci	  .pp_chg_id = INT_MIN, },
80162306a36Sopenharmony_ci
80262306a36Sopenharmony_ci	{ .n  = "pit64b0_gclk",
80362306a36Sopenharmony_ci	  .id = 70,
80462306a36Sopenharmony_ci	  .r = { .max = 200000000 },
80562306a36Sopenharmony_ci	  .pp = { PLL_IDS_TO_ARR_ENTRY(SYS, DIV0), PLL_IDS_TO_ARR_ENTRY(IMG, DIV0),
80662306a36Sopenharmony_ci		  PLL_IDS_TO_ARR_ENTRY(BAUD, DIV0), PLL_IDS_TO_ARR_ENTRY(AUDIO, DIV0),
80762306a36Sopenharmony_ci		  PLL_IDS_TO_ARR_ENTRY(ETH, DIV0), },
80862306a36Sopenharmony_ci	  .pp_mux_table = { 5, 7, 8, 9, 10, },
80962306a36Sopenharmony_ci	  .pp_count = 5,
81062306a36Sopenharmony_ci	  .pp_chg_id = INT_MIN, },
81162306a36Sopenharmony_ci
81262306a36Sopenharmony_ci	{ .n  = "pit64b1_gclk",
81362306a36Sopenharmony_ci	  .id = 71,
81462306a36Sopenharmony_ci	  .r = { .max = 200000000 },
81562306a36Sopenharmony_ci	  .pp = { PLL_IDS_TO_ARR_ENTRY(SYS, DIV0), PLL_IDS_TO_ARR_ENTRY(IMG, DIV0),
81662306a36Sopenharmony_ci		  PLL_IDS_TO_ARR_ENTRY(BAUD, DIV0), PLL_IDS_TO_ARR_ENTRY(AUDIO, DIV0),
81762306a36Sopenharmony_ci		  PLL_IDS_TO_ARR_ENTRY(ETH, DIV0), },
81862306a36Sopenharmony_ci	  .pp_mux_table = { 5, 7, 8, 9, 10, },
81962306a36Sopenharmony_ci	  .pp_count = 5,
82062306a36Sopenharmony_ci	  .pp_chg_id = INT_MIN, },
82162306a36Sopenharmony_ci
82262306a36Sopenharmony_ci	{ .n  = "pit64b2_gclk",
82362306a36Sopenharmony_ci	  .id = 72,
82462306a36Sopenharmony_ci	  .r = { .max = 200000000 },
82562306a36Sopenharmony_ci	  .pp = { PLL_IDS_TO_ARR_ENTRY(SYS, DIV0), PLL_IDS_TO_ARR_ENTRY(IMG, DIV0),
82662306a36Sopenharmony_ci		  PLL_IDS_TO_ARR_ENTRY(BAUD, DIV0), PLL_IDS_TO_ARR_ENTRY(AUDIO, DIV0),
82762306a36Sopenharmony_ci		  PLL_IDS_TO_ARR_ENTRY(ETH, DIV0), },
82862306a36Sopenharmony_ci	  .pp_mux_table = { 5, 7, 8, 9, 10, },
82962306a36Sopenharmony_ci	  .pp_count = 5,
83062306a36Sopenharmony_ci	  .pp_chg_id = INT_MIN, },
83162306a36Sopenharmony_ci
83262306a36Sopenharmony_ci	{ .n  = "pit64b3_gclk",
83362306a36Sopenharmony_ci	  .id = 73,
83462306a36Sopenharmony_ci	  .r = { .max = 200000000 },
83562306a36Sopenharmony_ci	  .pp = { PLL_IDS_TO_ARR_ENTRY(SYS, DIV0), PLL_IDS_TO_ARR_ENTRY(IMG, DIV0),
83662306a36Sopenharmony_ci		  PLL_IDS_TO_ARR_ENTRY(BAUD, DIV0), PLL_IDS_TO_ARR_ENTRY(AUDIO, DIV0),
83762306a36Sopenharmony_ci		  PLL_IDS_TO_ARR_ENTRY(ETH, DIV0), },
83862306a36Sopenharmony_ci	  .pp_mux_table = { 5, 7, 8, 9, 10, },
83962306a36Sopenharmony_ci	  .pp_count = 5,
84062306a36Sopenharmony_ci	  .pp_chg_id = INT_MIN, },
84162306a36Sopenharmony_ci
84262306a36Sopenharmony_ci	{ .n  = "pit64b4_gclk",
84362306a36Sopenharmony_ci	  .id = 74,
84462306a36Sopenharmony_ci	  .r = { .max = 200000000 },
84562306a36Sopenharmony_ci	  .pp = { PLL_IDS_TO_ARR_ENTRY(SYS, DIV0), PLL_IDS_TO_ARR_ENTRY(IMG, DIV0),
84662306a36Sopenharmony_ci		  PLL_IDS_TO_ARR_ENTRY(BAUD, DIV0), PLL_IDS_TO_ARR_ENTRY(AUDIO, DIV0),
84762306a36Sopenharmony_ci		  PLL_IDS_TO_ARR_ENTRY(ETH, DIV0), },
84862306a36Sopenharmony_ci	  .pp_mux_table = { 5, 7, 8, 9, 10, },
84962306a36Sopenharmony_ci	  .pp_count = 5,
85062306a36Sopenharmony_ci	  .pp_chg_id = INT_MIN, },
85162306a36Sopenharmony_ci
85262306a36Sopenharmony_ci	{ .n  = "pit64b5_gclk",
85362306a36Sopenharmony_ci	  .id = 75,
85462306a36Sopenharmony_ci	  .r = { .max = 200000000 },
85562306a36Sopenharmony_ci	  .pp = { PLL_IDS_TO_ARR_ENTRY(SYS, DIV0), PLL_IDS_TO_ARR_ENTRY(IMG, DIV0),
85662306a36Sopenharmony_ci		  PLL_IDS_TO_ARR_ENTRY(BAUD, DIV0), PLL_IDS_TO_ARR_ENTRY(AUDIO, DIV0),
85762306a36Sopenharmony_ci		  PLL_IDS_TO_ARR_ENTRY(ETH, DIV0), },
85862306a36Sopenharmony_ci	  .pp_mux_table = { 5, 7, 8, 9, 10, },
85962306a36Sopenharmony_ci	  .pp_count = 5,
86062306a36Sopenharmony_ci	  .pp_chg_id = INT_MIN, },
86162306a36Sopenharmony_ci
86262306a36Sopenharmony_ci	{ .n  = "qspi0_gclk",
86362306a36Sopenharmony_ci	  .id = 78,
86462306a36Sopenharmony_ci	  .r = { .max = 200000000 },
86562306a36Sopenharmony_ci	  .pp = { PLL_IDS_TO_ARR_ENTRY(SYS, DIV0), PLL_IDS_TO_ARR_ENTRY(BAUD, DIV0), },
86662306a36Sopenharmony_ci	  .pp_mux_table = { 5, 8, },
86762306a36Sopenharmony_ci	  .pp_count = 2,
86862306a36Sopenharmony_ci	  .pp_chg_id = INT_MIN, },
86962306a36Sopenharmony_ci
87062306a36Sopenharmony_ci	{ .n  = "qspi1_gclk",
87162306a36Sopenharmony_ci	  .id = 79,
87262306a36Sopenharmony_ci	  .r = { .max = 200000000 },
87362306a36Sopenharmony_ci	  .pp = { PLL_IDS_TO_ARR_ENTRY(SYS, DIV0), PLL_IDS_TO_ARR_ENTRY(BAUD, DIV0), },
87462306a36Sopenharmony_ci	  .pp_mux_table = { 5, 8, },
87562306a36Sopenharmony_ci	  .pp_count = 2,
87662306a36Sopenharmony_ci	  .pp_chg_id = INT_MIN, },
87762306a36Sopenharmony_ci
87862306a36Sopenharmony_ci	{ .n  = "sdmmc0_gclk",
87962306a36Sopenharmony_ci	  .id = 80,
88062306a36Sopenharmony_ci	  .r = { .max = 208000000 },
88162306a36Sopenharmony_ci	  .pp = { PLL_IDS_TO_ARR_ENTRY(SYS, DIV0), PLL_IDS_TO_ARR_ENTRY(BAUD, DIV0), },
88262306a36Sopenharmony_ci	  .pp_mux_table = { 5, 8, },
88362306a36Sopenharmony_ci	  .pp_count = 2,
88462306a36Sopenharmony_ci	  .pp_chg_id = 4, },
88562306a36Sopenharmony_ci
88662306a36Sopenharmony_ci	{ .n  = "sdmmc1_gclk",
88762306a36Sopenharmony_ci	  .id = 81,
88862306a36Sopenharmony_ci	  .r = { .max = 208000000 },
88962306a36Sopenharmony_ci	  .pp = { PLL_IDS_TO_ARR_ENTRY(SYS, DIV0), PLL_IDS_TO_ARR_ENTRY(BAUD, DIV0), },
89062306a36Sopenharmony_ci	  .pp_mux_table = { 5, 8, },
89162306a36Sopenharmony_ci	  .pp_count = 2,
89262306a36Sopenharmony_ci	  .pp_chg_id = 4, },
89362306a36Sopenharmony_ci
89462306a36Sopenharmony_ci	{ .n  = "sdmmc2_gclk",
89562306a36Sopenharmony_ci	  .id = 82,
89662306a36Sopenharmony_ci	  .r = { .max = 208000000 },
89762306a36Sopenharmony_ci	  .pp = { PLL_IDS_TO_ARR_ENTRY(SYS, DIV0), PLL_IDS_TO_ARR_ENTRY(BAUD, DIV0), },
89862306a36Sopenharmony_ci	  .pp_mux_table = { 5, 8, },
89962306a36Sopenharmony_ci	  .pp_count = 2,
90062306a36Sopenharmony_ci	  .pp_chg_id = 4, },
90162306a36Sopenharmony_ci
90262306a36Sopenharmony_ci	{ .n  = "spdifrx_gclk",
90362306a36Sopenharmony_ci	  .id = 84,
90462306a36Sopenharmony_ci	  .r = { .max = 150000000 },
90562306a36Sopenharmony_ci	  .pp = { PLL_IDS_TO_ARR_ENTRY(SYS, DIV0), PLL_IDS_TO_ARR_ENTRY(AUDIO, DIV0), },
90662306a36Sopenharmony_ci	  .pp_mux_table = { 5, 9, },
90762306a36Sopenharmony_ci	  .pp_count = 2,
90862306a36Sopenharmony_ci	  .pp_chg_id = 4, },
90962306a36Sopenharmony_ci
91062306a36Sopenharmony_ci	{ .n = "spdiftx_gclk",
91162306a36Sopenharmony_ci	  .id = 85,
91262306a36Sopenharmony_ci	  .r = { .max = 25000000  },
91362306a36Sopenharmony_ci	  .pp = { PLL_IDS_TO_ARR_ENTRY(SYS, DIV0), PLL_IDS_TO_ARR_ENTRY(AUDIO, DIV0), },
91462306a36Sopenharmony_ci	  .pp_mux_table = { 5, 9, },
91562306a36Sopenharmony_ci	  .pp_count = 2,
91662306a36Sopenharmony_ci	  .pp_chg_id = 4, },
91762306a36Sopenharmony_ci
91862306a36Sopenharmony_ci	{ .n  = "tcb0_ch0_gclk",
91962306a36Sopenharmony_ci	  .id = 88,
92062306a36Sopenharmony_ci	  .r = { .max = 200000000 },
92162306a36Sopenharmony_ci	  .pp = { PLL_IDS_TO_ARR_ENTRY(SYS, DIV0), PLL_IDS_TO_ARR_ENTRY(IMG, DIV0),
92262306a36Sopenharmony_ci		  PLL_IDS_TO_ARR_ENTRY(BAUD, DIV0), PLL_IDS_TO_ARR_ENTRY(AUDIO, DIV0),
92362306a36Sopenharmony_ci		  PLL_IDS_TO_ARR_ENTRY(ETH, DIV0), },
92462306a36Sopenharmony_ci	  .pp_mux_table = { 5, 7, 8, 9, 10, },
92562306a36Sopenharmony_ci	  .pp_count = 5,
92662306a36Sopenharmony_ci	  .pp_chg_id = INT_MIN, },
92762306a36Sopenharmony_ci
92862306a36Sopenharmony_ci	{ .n  = "tcb1_ch0_gclk",
92962306a36Sopenharmony_ci	  .id = 91,
93062306a36Sopenharmony_ci	  .r = { .max = 200000000 },
93162306a36Sopenharmony_ci	  .pp = { PLL_IDS_TO_ARR_ENTRY(SYS, DIV0), PLL_IDS_TO_ARR_ENTRY(IMG, DIV0),
93262306a36Sopenharmony_ci		  PLL_IDS_TO_ARR_ENTRY(BAUD, DIV0), PLL_IDS_TO_ARR_ENTRY(AUDIO, DIV0),
93362306a36Sopenharmony_ci		  PLL_IDS_TO_ARR_ENTRY(ETH, DIV0), },
93462306a36Sopenharmony_ci	  .pp_mux_table = { 5, 7, 8, 9, 10, },
93562306a36Sopenharmony_ci	  .pp_count = 5,
93662306a36Sopenharmony_ci	  .pp_chg_id = INT_MIN, },
93762306a36Sopenharmony_ci
93862306a36Sopenharmony_ci	{ .n  = "tcpca_gclk",
93962306a36Sopenharmony_ci	  .id = 94,
94062306a36Sopenharmony_ci	  .r = { .max = 32768, },
94162306a36Sopenharmony_ci	  .pp_chg_id = INT_MIN, },
94262306a36Sopenharmony_ci
94362306a36Sopenharmony_ci	{ .n  = "tcpcb_gclk",
94462306a36Sopenharmony_ci	  .id = 95,
94562306a36Sopenharmony_ci	  .r = { .max = 32768, },
94662306a36Sopenharmony_ci	  .pp_chg_id = INT_MIN, },
94762306a36Sopenharmony_ci};
94862306a36Sopenharmony_ci
94962306a36Sopenharmony_ci/* MCK0 characteristics. */
95062306a36Sopenharmony_cistatic const struct clk_master_characteristics mck0_characteristics = {
95162306a36Sopenharmony_ci	.output = { .min = 32768, .max = 200000000 },
95262306a36Sopenharmony_ci	.divisors = { 1, 2, 4, 3, 5 },
95362306a36Sopenharmony_ci	.have_div3_pres = 1,
95462306a36Sopenharmony_ci};
95562306a36Sopenharmony_ci
95662306a36Sopenharmony_ci/* MCK0 layout. */
95762306a36Sopenharmony_cistatic const struct clk_master_layout mck0_layout = {
95862306a36Sopenharmony_ci	.mask = 0x773,
95962306a36Sopenharmony_ci	.pres_shift = 4,
96062306a36Sopenharmony_ci	.offset = 0x28,
96162306a36Sopenharmony_ci};
96262306a36Sopenharmony_ci
96362306a36Sopenharmony_ci/* Programmable clock layout. */
96462306a36Sopenharmony_cistatic const struct clk_programmable_layout programmable_layout = {
96562306a36Sopenharmony_ci	.pres_mask = 0xff,
96662306a36Sopenharmony_ci	.pres_shift = 8,
96762306a36Sopenharmony_ci	.css_mask = 0x1f,
96862306a36Sopenharmony_ci	.have_slck_mck = 0,
96962306a36Sopenharmony_ci	.is_pres_direct = 1,
97062306a36Sopenharmony_ci};
97162306a36Sopenharmony_ci
97262306a36Sopenharmony_ci/* Peripheral clock layout. */
97362306a36Sopenharmony_cistatic const struct clk_pcr_layout sama7g5_pcr_layout = {
97462306a36Sopenharmony_ci	.offset = 0x88,
97562306a36Sopenharmony_ci	.cmd = BIT(31),
97662306a36Sopenharmony_ci	.gckcss_mask = GENMASK(12, 8),
97762306a36Sopenharmony_ci	.pid_mask = GENMASK(6, 0),
97862306a36Sopenharmony_ci};
97962306a36Sopenharmony_ci
98062306a36Sopenharmony_cistatic void __init sama7g5_pmc_setup(struct device_node *np)
98162306a36Sopenharmony_ci{
98262306a36Sopenharmony_ci	const char *main_xtal_name = "main_xtal";
98362306a36Sopenharmony_ci	struct pmc_data *sama7g5_pmc;
98462306a36Sopenharmony_ci	void **alloc_mem = NULL;
98562306a36Sopenharmony_ci	int alloc_mem_size = 0;
98662306a36Sopenharmony_ci	struct regmap *regmap;
98762306a36Sopenharmony_ci	struct clk_hw *hw, *main_rc_hw, *main_osc_hw, *main_xtal_hw;
98862306a36Sopenharmony_ci	struct clk_hw *td_slck_hw, *md_slck_hw;
98962306a36Sopenharmony_ci	static struct clk_parent_data parent_data;
99062306a36Sopenharmony_ci	struct clk_hw *parent_hws[10];
99162306a36Sopenharmony_ci	bool bypass;
99262306a36Sopenharmony_ci	int i, j;
99362306a36Sopenharmony_ci
99462306a36Sopenharmony_ci	td_slck_hw = __clk_get_hw(of_clk_get_by_name(np, "td_slck"));
99562306a36Sopenharmony_ci	md_slck_hw = __clk_get_hw(of_clk_get_by_name(np, "md_slck"));
99662306a36Sopenharmony_ci	main_xtal_hw = __clk_get_hw(of_clk_get_by_name(np, main_xtal_name));
99762306a36Sopenharmony_ci
99862306a36Sopenharmony_ci	if (!td_slck_hw || !md_slck_hw || !main_xtal_hw)
99962306a36Sopenharmony_ci		return;
100062306a36Sopenharmony_ci
100162306a36Sopenharmony_ci	regmap = device_node_to_regmap(np);
100262306a36Sopenharmony_ci	if (IS_ERR(regmap))
100362306a36Sopenharmony_ci		return;
100462306a36Sopenharmony_ci
100562306a36Sopenharmony_ci	sama7g5_pmc = pmc_data_allocate(PMC_MCK1 + 1,
100662306a36Sopenharmony_ci					nck(sama7g5_systemck),
100762306a36Sopenharmony_ci					nck(sama7g5_periphck),
100862306a36Sopenharmony_ci					nck(sama7g5_gck), 8);
100962306a36Sopenharmony_ci	if (!sama7g5_pmc)
101062306a36Sopenharmony_ci		return;
101162306a36Sopenharmony_ci
101262306a36Sopenharmony_ci	alloc_mem = kmalloc(sizeof(void *) *
101362306a36Sopenharmony_ci			    (ARRAY_SIZE(sama7g5_mckx) + ARRAY_SIZE(sama7g5_gck)),
101462306a36Sopenharmony_ci			    GFP_KERNEL);
101562306a36Sopenharmony_ci	if (!alloc_mem)
101662306a36Sopenharmony_ci		goto err_free;
101762306a36Sopenharmony_ci
101862306a36Sopenharmony_ci	main_rc_hw = at91_clk_register_main_rc_osc(regmap, "main_rc_osc", 12000000,
101962306a36Sopenharmony_ci						   50000000);
102062306a36Sopenharmony_ci	if (IS_ERR(main_rc_hw))
102162306a36Sopenharmony_ci		goto err_free;
102262306a36Sopenharmony_ci
102362306a36Sopenharmony_ci	bypass = of_property_read_bool(np, "atmel,osc-bypass");
102462306a36Sopenharmony_ci
102562306a36Sopenharmony_ci	parent_data.name = main_xtal_name;
102662306a36Sopenharmony_ci	parent_data.fw_name = main_xtal_name;
102762306a36Sopenharmony_ci	main_osc_hw = at91_clk_register_main_osc(regmap, "main_osc", NULL,
102862306a36Sopenharmony_ci						 &parent_data, bypass);
102962306a36Sopenharmony_ci	if (IS_ERR(main_osc_hw))
103062306a36Sopenharmony_ci		goto err_free;
103162306a36Sopenharmony_ci
103262306a36Sopenharmony_ci	parent_hws[0] = main_rc_hw;
103362306a36Sopenharmony_ci	parent_hws[1] = main_osc_hw;
103462306a36Sopenharmony_ci	hw = at91_clk_register_sam9x5_main(regmap, "mainck", NULL, parent_hws, 2);
103562306a36Sopenharmony_ci	if (IS_ERR(hw))
103662306a36Sopenharmony_ci		goto err_free;
103762306a36Sopenharmony_ci
103862306a36Sopenharmony_ci	sama7g5_pmc->chws[PMC_MAIN] = hw;
103962306a36Sopenharmony_ci
104062306a36Sopenharmony_ci	for (i = 0; i < PLL_ID_MAX; i++) {
104162306a36Sopenharmony_ci		for (j = 0; j < 3; j++) {
104262306a36Sopenharmony_ci			struct clk_hw *parent_hw;
104362306a36Sopenharmony_ci
104462306a36Sopenharmony_ci			if (!sama7g5_plls[i][j].n)
104562306a36Sopenharmony_ci				continue;
104662306a36Sopenharmony_ci
104762306a36Sopenharmony_ci			switch (sama7g5_plls[i][j].t) {
104862306a36Sopenharmony_ci			case PLL_TYPE_FRAC:
104962306a36Sopenharmony_ci				switch (sama7g5_plls[i][j].p) {
105062306a36Sopenharmony_ci				case SAMA7G5_PLL_PARENT_MAINCK:
105162306a36Sopenharmony_ci					parent_hw = sama7g5_pmc->chws[PMC_MAIN];
105262306a36Sopenharmony_ci					break;
105362306a36Sopenharmony_ci				case SAMA7G5_PLL_PARENT_MAIN_XTAL:
105462306a36Sopenharmony_ci					parent_hw = main_xtal_hw;
105562306a36Sopenharmony_ci					break;
105662306a36Sopenharmony_ci				default:
105762306a36Sopenharmony_ci					/* Should not happen. */
105862306a36Sopenharmony_ci					parent_hw = NULL;
105962306a36Sopenharmony_ci					break;
106062306a36Sopenharmony_ci				}
106162306a36Sopenharmony_ci
106262306a36Sopenharmony_ci				hw = sam9x60_clk_register_frac_pll(regmap,
106362306a36Sopenharmony_ci					&pmc_pll_lock, sama7g5_plls[i][j].n,
106462306a36Sopenharmony_ci					NULL, parent_hw, i,
106562306a36Sopenharmony_ci					sama7g5_plls[i][j].c,
106662306a36Sopenharmony_ci					sama7g5_plls[i][j].l,
106762306a36Sopenharmony_ci					sama7g5_plls[i][j].f);
106862306a36Sopenharmony_ci				break;
106962306a36Sopenharmony_ci
107062306a36Sopenharmony_ci			case PLL_TYPE_DIV:
107162306a36Sopenharmony_ci				hw = sam9x60_clk_register_div_pll(regmap,
107262306a36Sopenharmony_ci					&pmc_pll_lock, sama7g5_plls[i][j].n,
107362306a36Sopenharmony_ci					NULL, sama7g5_plls[i][0].hw, i,
107462306a36Sopenharmony_ci					sama7g5_plls[i][j].c,
107562306a36Sopenharmony_ci					sama7g5_plls[i][j].l,
107662306a36Sopenharmony_ci					sama7g5_plls[i][j].f,
107762306a36Sopenharmony_ci					sama7g5_plls[i][j].safe_div);
107862306a36Sopenharmony_ci				break;
107962306a36Sopenharmony_ci
108062306a36Sopenharmony_ci			default:
108162306a36Sopenharmony_ci				continue;
108262306a36Sopenharmony_ci			}
108362306a36Sopenharmony_ci
108462306a36Sopenharmony_ci			if (IS_ERR(hw))
108562306a36Sopenharmony_ci				goto err_free;
108662306a36Sopenharmony_ci
108762306a36Sopenharmony_ci			sama7g5_plls[i][j].hw = hw;
108862306a36Sopenharmony_ci			if (sama7g5_plls[i][j].eid)
108962306a36Sopenharmony_ci				sama7g5_pmc->chws[sama7g5_plls[i][j].eid] = hw;
109062306a36Sopenharmony_ci		}
109162306a36Sopenharmony_ci	}
109262306a36Sopenharmony_ci
109362306a36Sopenharmony_ci	hw = at91_clk_register_master_div(regmap, "mck0", NULL,
109462306a36Sopenharmony_ci					  sama7g5_plls[PLL_ID_CPU][1].hw,
109562306a36Sopenharmony_ci					  &mck0_layout, &mck0_characteristics,
109662306a36Sopenharmony_ci					  &pmc_mck0_lock, CLK_GET_RATE_NOCACHE, 5);
109762306a36Sopenharmony_ci	if (IS_ERR(hw))
109862306a36Sopenharmony_ci		goto err_free;
109962306a36Sopenharmony_ci
110062306a36Sopenharmony_ci	sama7g5_mckx[PCK_PARENT_HW_MCK0].hw = sama7g5_pmc->chws[PMC_MCK] = hw;
110162306a36Sopenharmony_ci
110262306a36Sopenharmony_ci	parent_hws[0] = md_slck_hw;
110362306a36Sopenharmony_ci	parent_hws[1] = td_slck_hw;
110462306a36Sopenharmony_ci	parent_hws[2] = sama7g5_pmc->chws[PMC_MAIN];
110562306a36Sopenharmony_ci	for (i = PCK_PARENT_HW_MCK1; i < ARRAY_SIZE(sama7g5_mckx); i++) {
110662306a36Sopenharmony_ci		u8 num_parents = 3 + sama7g5_mckx[i].ep_count;
110762306a36Sopenharmony_ci		struct clk_hw *tmp_parent_hws[8];
110862306a36Sopenharmony_ci		u32 *mux_table;
110962306a36Sopenharmony_ci
111062306a36Sopenharmony_ci		mux_table = kmalloc_array(num_parents, sizeof(*mux_table),
111162306a36Sopenharmony_ci					  GFP_KERNEL);
111262306a36Sopenharmony_ci		if (!mux_table)
111362306a36Sopenharmony_ci			goto err_free;
111462306a36Sopenharmony_ci
111562306a36Sopenharmony_ci		SAMA7G5_INIT_TABLE(mux_table, 3);
111662306a36Sopenharmony_ci		SAMA7G5_FILL_TABLE(&mux_table[3], sama7g5_mckx[i].ep_mux_table,
111762306a36Sopenharmony_ci				   sama7g5_mckx[i].ep_count);
111862306a36Sopenharmony_ci		for (j = 0; j < sama7g5_mckx[i].ep_count; j++) {
111962306a36Sopenharmony_ci			u8 pll_id = sama7g5_mckx[i].ep[j].pll_id;
112062306a36Sopenharmony_ci			u8 pll_compid = sama7g5_mckx[i].ep[j].pll_compid;
112162306a36Sopenharmony_ci
112262306a36Sopenharmony_ci			tmp_parent_hws[j] = sama7g5_plls[pll_id][pll_compid].hw;
112362306a36Sopenharmony_ci		}
112462306a36Sopenharmony_ci		SAMA7G5_FILL_TABLE(&parent_hws[3], tmp_parent_hws,
112562306a36Sopenharmony_ci				   sama7g5_mckx[i].ep_count);
112662306a36Sopenharmony_ci
112762306a36Sopenharmony_ci		hw = at91_clk_sama7g5_register_master(regmap, sama7g5_mckx[i].n,
112862306a36Sopenharmony_ci				   num_parents, NULL, parent_hws, mux_table,
112962306a36Sopenharmony_ci				   &pmc_mckX_lock, sama7g5_mckx[i].id,
113062306a36Sopenharmony_ci				   sama7g5_mckx[i].c,
113162306a36Sopenharmony_ci				   sama7g5_mckx[i].ep_chg_id);
113262306a36Sopenharmony_ci		if (IS_ERR(hw))
113362306a36Sopenharmony_ci			goto err_free;
113462306a36Sopenharmony_ci
113562306a36Sopenharmony_ci		alloc_mem[alloc_mem_size++] = mux_table;
113662306a36Sopenharmony_ci
113762306a36Sopenharmony_ci		sama7g5_mckx[i].hw = hw;
113862306a36Sopenharmony_ci		if (sama7g5_mckx[i].eid)
113962306a36Sopenharmony_ci			sama7g5_pmc->chws[sama7g5_mckx[i].eid] = hw;
114062306a36Sopenharmony_ci	}
114162306a36Sopenharmony_ci
114262306a36Sopenharmony_ci	hw = at91_clk_sama7g5_register_utmi(regmap, "utmick", NULL, main_xtal_hw);
114362306a36Sopenharmony_ci	if (IS_ERR(hw))
114462306a36Sopenharmony_ci		goto err_free;
114562306a36Sopenharmony_ci
114662306a36Sopenharmony_ci	sama7g5_pmc->chws[PMC_UTMI] = hw;
114762306a36Sopenharmony_ci
114862306a36Sopenharmony_ci	parent_hws[0] = md_slck_hw;
114962306a36Sopenharmony_ci	parent_hws[1] = td_slck_hw;
115062306a36Sopenharmony_ci	parent_hws[2] = sama7g5_pmc->chws[PMC_MAIN];
115162306a36Sopenharmony_ci	parent_hws[3] = sama7g5_plls[PLL_ID_SYS][PLL_COMPID_DIV0].hw;
115262306a36Sopenharmony_ci	parent_hws[4] = sama7g5_plls[PLL_ID_DDR][PLL_COMPID_DIV0].hw;
115362306a36Sopenharmony_ci	parent_hws[5] = sama7g5_plls[PLL_ID_IMG][PLL_COMPID_DIV0].hw;
115462306a36Sopenharmony_ci	parent_hws[6] = sama7g5_plls[PLL_ID_BAUD][PLL_COMPID_DIV0].hw;
115562306a36Sopenharmony_ci	parent_hws[7] = sama7g5_plls[PLL_ID_AUDIO][PLL_COMPID_DIV0].hw;
115662306a36Sopenharmony_ci	parent_hws[8] = sama7g5_plls[PLL_ID_ETH][PLL_COMPID_DIV0].hw;
115762306a36Sopenharmony_ci	for (i = 0; i < 8; i++) {
115862306a36Sopenharmony_ci		char name[6];
115962306a36Sopenharmony_ci
116062306a36Sopenharmony_ci		snprintf(name, sizeof(name), "prog%d", i);
116162306a36Sopenharmony_ci
116262306a36Sopenharmony_ci		hw = at91_clk_register_programmable(regmap, name, NULL, parent_hws,
116362306a36Sopenharmony_ci						    9, i,
116462306a36Sopenharmony_ci						    &programmable_layout,
116562306a36Sopenharmony_ci						    sama7g5_prog_mux_table);
116662306a36Sopenharmony_ci		if (IS_ERR(hw))
116762306a36Sopenharmony_ci			goto err_free;
116862306a36Sopenharmony_ci
116962306a36Sopenharmony_ci		sama7g5_pmc->pchws[i] = hw;
117062306a36Sopenharmony_ci	}
117162306a36Sopenharmony_ci
117262306a36Sopenharmony_ci	for (i = 0; i < ARRAY_SIZE(sama7g5_systemck); i++) {
117362306a36Sopenharmony_ci		hw = at91_clk_register_system(regmap, sama7g5_systemck[i].n,
117462306a36Sopenharmony_ci					      NULL, sama7g5_pmc->pchws[i],
117562306a36Sopenharmony_ci					      sama7g5_systemck[i].id, 0);
117662306a36Sopenharmony_ci		if (IS_ERR(hw))
117762306a36Sopenharmony_ci			goto err_free;
117862306a36Sopenharmony_ci
117962306a36Sopenharmony_ci		sama7g5_pmc->shws[sama7g5_systemck[i].id] = hw;
118062306a36Sopenharmony_ci	}
118162306a36Sopenharmony_ci
118262306a36Sopenharmony_ci	for (i = 0; i < ARRAY_SIZE(sama7g5_periphck); i++) {
118362306a36Sopenharmony_ci		hw = at91_clk_register_sam9x5_peripheral(regmap, &pmc_pcr_lock,
118462306a36Sopenharmony_ci						&sama7g5_pcr_layout,
118562306a36Sopenharmony_ci						sama7g5_periphck[i].n,
118662306a36Sopenharmony_ci						NULL,
118762306a36Sopenharmony_ci						sama7g5_mckx[sama7g5_periphck[i].p].hw,
118862306a36Sopenharmony_ci						sama7g5_periphck[i].id,
118962306a36Sopenharmony_ci						&sama7g5_periphck[i].r,
119062306a36Sopenharmony_ci						sama7g5_periphck[i].chgp ? 0 :
119162306a36Sopenharmony_ci						INT_MIN, 0);
119262306a36Sopenharmony_ci		if (IS_ERR(hw))
119362306a36Sopenharmony_ci			goto err_free;
119462306a36Sopenharmony_ci
119562306a36Sopenharmony_ci		sama7g5_pmc->phws[sama7g5_periphck[i].id] = hw;
119662306a36Sopenharmony_ci	}
119762306a36Sopenharmony_ci
119862306a36Sopenharmony_ci	parent_hws[0] = md_slck_hw;
119962306a36Sopenharmony_ci	parent_hws[1] = td_slck_hw;
120062306a36Sopenharmony_ci	parent_hws[2] = sama7g5_pmc->chws[PMC_MAIN];
120162306a36Sopenharmony_ci	for (i = 0; i < ARRAY_SIZE(sama7g5_gck); i++) {
120262306a36Sopenharmony_ci		u8 num_parents = 3 + sama7g5_gck[i].pp_count;
120362306a36Sopenharmony_ci		struct clk_hw *tmp_parent_hws[8];
120462306a36Sopenharmony_ci		u32 *mux_table;
120562306a36Sopenharmony_ci
120662306a36Sopenharmony_ci		mux_table = kmalloc_array(num_parents, sizeof(*mux_table),
120762306a36Sopenharmony_ci					  GFP_KERNEL);
120862306a36Sopenharmony_ci		if (!mux_table)
120962306a36Sopenharmony_ci			goto err_free;
121062306a36Sopenharmony_ci
121162306a36Sopenharmony_ci		SAMA7G5_INIT_TABLE(mux_table, 3);
121262306a36Sopenharmony_ci		SAMA7G5_FILL_TABLE(&mux_table[3], sama7g5_gck[i].pp_mux_table,
121362306a36Sopenharmony_ci				   sama7g5_gck[i].pp_count);
121462306a36Sopenharmony_ci		for (j = 0; j < sama7g5_gck[i].pp_count; j++) {
121562306a36Sopenharmony_ci			u8 pll_id = sama7g5_gck[i].pp[j].pll_id;
121662306a36Sopenharmony_ci			u8 pll_compid = sama7g5_gck[i].pp[j].pll_compid;
121762306a36Sopenharmony_ci
121862306a36Sopenharmony_ci			tmp_parent_hws[j] = sama7g5_plls[pll_id][pll_compid].hw;
121962306a36Sopenharmony_ci		}
122062306a36Sopenharmony_ci		SAMA7G5_FILL_TABLE(&parent_hws[3], tmp_parent_hws,
122162306a36Sopenharmony_ci				   sama7g5_gck[i].pp_count);
122262306a36Sopenharmony_ci
122362306a36Sopenharmony_ci		hw = at91_clk_register_generated(regmap, &pmc_pcr_lock,
122462306a36Sopenharmony_ci						 &sama7g5_pcr_layout,
122562306a36Sopenharmony_ci						 sama7g5_gck[i].n, NULL,
122662306a36Sopenharmony_ci						 parent_hws, mux_table,
122762306a36Sopenharmony_ci						 num_parents,
122862306a36Sopenharmony_ci						 sama7g5_gck[i].id,
122962306a36Sopenharmony_ci						 &sama7g5_gck[i].r,
123062306a36Sopenharmony_ci						 sama7g5_gck[i].pp_chg_id);
123162306a36Sopenharmony_ci		if (IS_ERR(hw))
123262306a36Sopenharmony_ci			goto err_free;
123362306a36Sopenharmony_ci
123462306a36Sopenharmony_ci		sama7g5_pmc->ghws[sama7g5_gck[i].id] = hw;
123562306a36Sopenharmony_ci		alloc_mem[alloc_mem_size++] = mux_table;
123662306a36Sopenharmony_ci	}
123762306a36Sopenharmony_ci
123862306a36Sopenharmony_ci	of_clk_add_hw_provider(np, of_clk_hw_pmc_get, sama7g5_pmc);
123962306a36Sopenharmony_ci
124062306a36Sopenharmony_ci	return;
124162306a36Sopenharmony_ci
124262306a36Sopenharmony_cierr_free:
124362306a36Sopenharmony_ci	if (alloc_mem) {
124462306a36Sopenharmony_ci		for (i = 0; i < alloc_mem_size; i++)
124562306a36Sopenharmony_ci			kfree(alloc_mem[i]);
124662306a36Sopenharmony_ci		kfree(alloc_mem);
124762306a36Sopenharmony_ci	}
124862306a36Sopenharmony_ci
124962306a36Sopenharmony_ci	kfree(sama7g5_pmc);
125062306a36Sopenharmony_ci}
125162306a36Sopenharmony_ci
125262306a36Sopenharmony_ci/* Some clks are used for a clocksource */
125362306a36Sopenharmony_ciCLK_OF_DECLARE(sama7g5_pmc, "microchip,sama7g5-pmc", sama7g5_pmc_setup);
1254