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