162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Clock definitions for u8500 platform. 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 2012 ST-Ericsson SA 662306a36Sopenharmony_ci * Author: Ulf Hansson <ulf.hansson@linaro.org> 762306a36Sopenharmony_ci */ 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#include <linux/of.h> 1062306a36Sopenharmony_ci#include <linux/of_address.h> 1162306a36Sopenharmony_ci#include <linux/clk-provider.h> 1262306a36Sopenharmony_ci#include <linux/mfd/dbx500-prcmu.h> 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci#include "clk.h" 1562306a36Sopenharmony_ci#include "prcc.h" 1662306a36Sopenharmony_ci#include "reset-prcc.h" 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_cistatic struct clk *prcc_pclk[(PRCC_NUM_PERIPH_CLUSTERS + 1) * PRCC_PERIPHS_PER_CLUSTER]; 1962306a36Sopenharmony_cistatic struct clk *prcc_kclk[(PRCC_NUM_PERIPH_CLUSTERS + 1) * PRCC_PERIPHS_PER_CLUSTER]; 2062306a36Sopenharmony_cistatic struct clk_hw *clkout_clk[2]; 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci#define PRCC_SHOW(clk, base, bit) \ 2362306a36Sopenharmony_ci clk[(base * PRCC_PERIPHS_PER_CLUSTER) + bit] 2462306a36Sopenharmony_ci#define PRCC_PCLK_STORE(clk, base, bit) \ 2562306a36Sopenharmony_ci prcc_pclk[(base * PRCC_PERIPHS_PER_CLUSTER) + bit] = clk 2662306a36Sopenharmony_ci#define PRCC_KCLK_STORE(clk, base, bit) \ 2762306a36Sopenharmony_ci prcc_kclk[(base * PRCC_PERIPHS_PER_CLUSTER) + bit] = clk 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_cistatic struct clk *ux500_twocell_get(struct of_phandle_args *clkspec, 3062306a36Sopenharmony_ci void *data) 3162306a36Sopenharmony_ci{ 3262306a36Sopenharmony_ci struct clk **clk_data = data; 3362306a36Sopenharmony_ci unsigned int base, bit; 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci if (clkspec->args_count != 2) 3662306a36Sopenharmony_ci return ERR_PTR(-EINVAL); 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ci base = clkspec->args[0]; 3962306a36Sopenharmony_ci bit = clkspec->args[1]; 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ci if (base != 1 && base != 2 && base != 3 && base != 5 && base != 6) { 4262306a36Sopenharmony_ci pr_err("%s: invalid PRCC base %d\n", __func__, base); 4362306a36Sopenharmony_ci return ERR_PTR(-EINVAL); 4462306a36Sopenharmony_ci } 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_ci return PRCC_SHOW(clk_data, base, bit); 4762306a36Sopenharmony_ci} 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_cistatic struct clk_hw_onecell_data u8500_prcmu_hw_clks = { 5062306a36Sopenharmony_ci .hws = { 5162306a36Sopenharmony_ci /* 5262306a36Sopenharmony_ci * This assignment makes sure the dynamic array 5362306a36Sopenharmony_ci * gets the right size. 5462306a36Sopenharmony_ci */ 5562306a36Sopenharmony_ci [PRCMU_NUM_CLKS] = NULL, 5662306a36Sopenharmony_ci }, 5762306a36Sopenharmony_ci .num = PRCMU_NUM_CLKS, 5862306a36Sopenharmony_ci}; 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_ci/* Essentially names for the first PRCMU_CLKSRC_* defines */ 6162306a36Sopenharmony_cistatic const char * const u8500_clkout_parents[] = { 6262306a36Sopenharmony_ci "clk38m_to_clkgen", 6362306a36Sopenharmony_ci "aclk", 6462306a36Sopenharmony_ci /* Just called "sysclk" in documentation */ 6562306a36Sopenharmony_ci "ab8500_sysclk", 6662306a36Sopenharmony_ci "lcdclk", 6762306a36Sopenharmony_ci "sdmmcclk", 6862306a36Sopenharmony_ci "tvclk", 6962306a36Sopenharmony_ci "timclk", 7062306a36Sopenharmony_ci /* CLK009 is not implemented, add it if you need it */ 7162306a36Sopenharmony_ci "clk009", 7262306a36Sopenharmony_ci}; 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_cistatic struct clk_hw *ux500_clkout_get(struct of_phandle_args *clkspec, 7562306a36Sopenharmony_ci void *data) 7662306a36Sopenharmony_ci{ 7762306a36Sopenharmony_ci u32 id, source, divider; 7862306a36Sopenharmony_ci struct clk_hw *clkout; 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_ci if (clkspec->args_count != 3) 8162306a36Sopenharmony_ci return ERR_PTR(-EINVAL); 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_ci id = clkspec->args[0]; 8462306a36Sopenharmony_ci source = clkspec->args[1]; 8562306a36Sopenharmony_ci divider = clkspec->args[2]; 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_ci if (id > 1) { 8862306a36Sopenharmony_ci pr_err("%s: invalid clkout ID %d\n", __func__, id); 8962306a36Sopenharmony_ci return ERR_PTR(-EINVAL); 9062306a36Sopenharmony_ci } 9162306a36Sopenharmony_ci 9262306a36Sopenharmony_ci if (clkout_clk[id]) { 9362306a36Sopenharmony_ci pr_info("%s: clkout%d already registered, not reconfiguring\n", 9462306a36Sopenharmony_ci __func__, id + 1); 9562306a36Sopenharmony_ci return clkout_clk[id]; 9662306a36Sopenharmony_ci } 9762306a36Sopenharmony_ci 9862306a36Sopenharmony_ci if (source > 7) { 9962306a36Sopenharmony_ci pr_err("%s: invalid source ID %d\n", __func__, source); 10062306a36Sopenharmony_ci return ERR_PTR(-EINVAL); 10162306a36Sopenharmony_ci } 10262306a36Sopenharmony_ci 10362306a36Sopenharmony_ci if (divider == 0 || divider > 63) { 10462306a36Sopenharmony_ci pr_err("%s: invalid divider %d\n", __func__, divider); 10562306a36Sopenharmony_ci return ERR_PTR(-EINVAL); 10662306a36Sopenharmony_ci } 10762306a36Sopenharmony_ci 10862306a36Sopenharmony_ci pr_debug("registering clkout%d with source %d and divider %d\n", 10962306a36Sopenharmony_ci id + 1, source, divider); 11062306a36Sopenharmony_ci 11162306a36Sopenharmony_ci clkout = clk_reg_prcmu_clkout(id ? "clkout2" : "clkout1", 11262306a36Sopenharmony_ci u8500_clkout_parents, 11362306a36Sopenharmony_ci ARRAY_SIZE(u8500_clkout_parents), 11462306a36Sopenharmony_ci source, divider); 11562306a36Sopenharmony_ci if (IS_ERR(clkout)) { 11662306a36Sopenharmony_ci pr_err("failed to register clkout%d\n", id + 1); 11762306a36Sopenharmony_ci return ERR_CAST(clkout); 11862306a36Sopenharmony_ci } 11962306a36Sopenharmony_ci 12062306a36Sopenharmony_ci clkout_clk[id] = clkout; 12162306a36Sopenharmony_ci 12262306a36Sopenharmony_ci return clkout; 12362306a36Sopenharmony_ci} 12462306a36Sopenharmony_ci 12562306a36Sopenharmony_cistatic void u8500_clk_init(struct device_node *np) 12662306a36Sopenharmony_ci{ 12762306a36Sopenharmony_ci struct prcmu_fw_version *fw_version; 12862306a36Sopenharmony_ci struct device_node *child = NULL; 12962306a36Sopenharmony_ci const char *sgaclk_parent = NULL; 13062306a36Sopenharmony_ci struct clk *clk, *rtc_clk, *twd_clk; 13162306a36Sopenharmony_ci u32 bases[CLKRST_MAX]; 13262306a36Sopenharmony_ci struct u8500_prcc_reset *rstc; 13362306a36Sopenharmony_ci int i; 13462306a36Sopenharmony_ci 13562306a36Sopenharmony_ci /* 13662306a36Sopenharmony_ci * We allocate the reset controller here so that we can fill in the 13762306a36Sopenharmony_ci * base addresses properly and pass to the reset controller init 13862306a36Sopenharmony_ci * function later on. 13962306a36Sopenharmony_ci */ 14062306a36Sopenharmony_ci rstc = kzalloc(sizeof(*rstc), GFP_KERNEL); 14162306a36Sopenharmony_ci if (!rstc) 14262306a36Sopenharmony_ci return; 14362306a36Sopenharmony_ci 14462306a36Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(bases); i++) { 14562306a36Sopenharmony_ci struct resource r; 14662306a36Sopenharmony_ci 14762306a36Sopenharmony_ci if (of_address_to_resource(np, i, &r)) 14862306a36Sopenharmony_ci /* Not much choice but to continue */ 14962306a36Sopenharmony_ci pr_err("failed to get CLKRST %d base address\n", 15062306a36Sopenharmony_ci i + 1); 15162306a36Sopenharmony_ci bases[i] = r.start; 15262306a36Sopenharmony_ci rstc->phy_base[i] = r.start; 15362306a36Sopenharmony_ci } 15462306a36Sopenharmony_ci 15562306a36Sopenharmony_ci /* Clock sources */ 15662306a36Sopenharmony_ci u8500_prcmu_hw_clks.hws[PRCMU_PLLSOC0] = 15762306a36Sopenharmony_ci clk_reg_prcmu_gate("soc0_pll", NULL, PRCMU_PLLSOC0, 15862306a36Sopenharmony_ci CLK_IGNORE_UNUSED); 15962306a36Sopenharmony_ci 16062306a36Sopenharmony_ci u8500_prcmu_hw_clks.hws[PRCMU_PLLSOC1] = 16162306a36Sopenharmony_ci clk_reg_prcmu_gate("soc1_pll", NULL, PRCMU_PLLSOC1, 16262306a36Sopenharmony_ci CLK_IGNORE_UNUSED); 16362306a36Sopenharmony_ci 16462306a36Sopenharmony_ci u8500_prcmu_hw_clks.hws[PRCMU_PLLDDR] = 16562306a36Sopenharmony_ci clk_reg_prcmu_gate("ddr_pll", NULL, PRCMU_PLLDDR, 16662306a36Sopenharmony_ci CLK_IGNORE_UNUSED); 16762306a36Sopenharmony_ci 16862306a36Sopenharmony_ci /* 16962306a36Sopenharmony_ci * Read-only clocks that only return their current rate, only used 17062306a36Sopenharmony_ci * as parents to other clocks and not visible in the device tree. 17162306a36Sopenharmony_ci * clk38m_to_clkgen is the same as the SYSCLK, i.e. the root clock. 17262306a36Sopenharmony_ci */ 17362306a36Sopenharmony_ci clk_reg_prcmu_rate("clk38m_to_clkgen", NULL, PRCMU_SYSCLK, 17462306a36Sopenharmony_ci CLK_IGNORE_UNUSED); 17562306a36Sopenharmony_ci clk_reg_prcmu_rate("aclk", NULL, PRCMU_ACLK, 17662306a36Sopenharmony_ci CLK_IGNORE_UNUSED); 17762306a36Sopenharmony_ci 17862306a36Sopenharmony_ci /* TODO: add CLK009 if needed */ 17962306a36Sopenharmony_ci 18062306a36Sopenharmony_ci rtc_clk = clk_register_fixed_rate(NULL, "rtc32k", "NULL", 18162306a36Sopenharmony_ci CLK_IGNORE_UNUSED, 18262306a36Sopenharmony_ci 32768); 18362306a36Sopenharmony_ci 18462306a36Sopenharmony_ci /* PRCMU clocks */ 18562306a36Sopenharmony_ci fw_version = prcmu_get_fw_version(); 18662306a36Sopenharmony_ci if (fw_version != NULL) { 18762306a36Sopenharmony_ci switch (fw_version->project) { 18862306a36Sopenharmony_ci case PRCMU_FW_PROJECT_U8500_C2: 18962306a36Sopenharmony_ci case PRCMU_FW_PROJECT_U8500_SSG1: 19062306a36Sopenharmony_ci case PRCMU_FW_PROJECT_U8520: 19162306a36Sopenharmony_ci case PRCMU_FW_PROJECT_U8420: 19262306a36Sopenharmony_ci case PRCMU_FW_PROJECT_U8420_SYSCLK: 19362306a36Sopenharmony_ci case PRCMU_FW_PROJECT_U8500_SSG2: 19462306a36Sopenharmony_ci sgaclk_parent = "soc0_pll"; 19562306a36Sopenharmony_ci break; 19662306a36Sopenharmony_ci default: 19762306a36Sopenharmony_ci break; 19862306a36Sopenharmony_ci } 19962306a36Sopenharmony_ci } 20062306a36Sopenharmony_ci 20162306a36Sopenharmony_ci if (sgaclk_parent) 20262306a36Sopenharmony_ci u8500_prcmu_hw_clks.hws[PRCMU_SGACLK] = 20362306a36Sopenharmony_ci clk_reg_prcmu_gate("sgclk", sgaclk_parent, 20462306a36Sopenharmony_ci PRCMU_SGACLK, 0); 20562306a36Sopenharmony_ci else 20662306a36Sopenharmony_ci u8500_prcmu_hw_clks.hws[PRCMU_SGACLK] = 20762306a36Sopenharmony_ci clk_reg_prcmu_gate("sgclk", NULL, PRCMU_SGACLK, 0); 20862306a36Sopenharmony_ci 20962306a36Sopenharmony_ci u8500_prcmu_hw_clks.hws[PRCMU_UARTCLK] = 21062306a36Sopenharmony_ci clk_reg_prcmu_gate("uartclk", NULL, PRCMU_UARTCLK, 0); 21162306a36Sopenharmony_ci u8500_prcmu_hw_clks.hws[PRCMU_MSP02CLK] = 21262306a36Sopenharmony_ci clk_reg_prcmu_gate("msp02clk", NULL, PRCMU_MSP02CLK, 0); 21362306a36Sopenharmony_ci u8500_prcmu_hw_clks.hws[PRCMU_MSP1CLK] = 21462306a36Sopenharmony_ci clk_reg_prcmu_gate("msp1clk", NULL, PRCMU_MSP1CLK, 0); 21562306a36Sopenharmony_ci u8500_prcmu_hw_clks.hws[PRCMU_I2CCLK] = 21662306a36Sopenharmony_ci clk_reg_prcmu_gate("i2cclk", NULL, PRCMU_I2CCLK, 0); 21762306a36Sopenharmony_ci u8500_prcmu_hw_clks.hws[PRCMU_SLIMCLK] = 21862306a36Sopenharmony_ci clk_reg_prcmu_gate("slimclk", NULL, PRCMU_SLIMCLK, 0); 21962306a36Sopenharmony_ci u8500_prcmu_hw_clks.hws[PRCMU_PER1CLK] = 22062306a36Sopenharmony_ci clk_reg_prcmu_gate("per1clk", NULL, PRCMU_PER1CLK, 0); 22162306a36Sopenharmony_ci u8500_prcmu_hw_clks.hws[PRCMU_PER2CLK] = 22262306a36Sopenharmony_ci clk_reg_prcmu_gate("per2clk", NULL, PRCMU_PER2CLK, 0); 22362306a36Sopenharmony_ci u8500_prcmu_hw_clks.hws[PRCMU_PER3CLK] = 22462306a36Sopenharmony_ci clk_reg_prcmu_gate("per3clk", NULL, PRCMU_PER3CLK, 0); 22562306a36Sopenharmony_ci u8500_prcmu_hw_clks.hws[PRCMU_PER5CLK] = 22662306a36Sopenharmony_ci clk_reg_prcmu_gate("per5clk", NULL, PRCMU_PER5CLK, 0); 22762306a36Sopenharmony_ci u8500_prcmu_hw_clks.hws[PRCMU_PER6CLK] = 22862306a36Sopenharmony_ci clk_reg_prcmu_gate("per6clk", NULL, PRCMU_PER6CLK, 0); 22962306a36Sopenharmony_ci u8500_prcmu_hw_clks.hws[PRCMU_PER7CLK] = 23062306a36Sopenharmony_ci clk_reg_prcmu_gate("per7clk", NULL, PRCMU_PER7CLK, 0); 23162306a36Sopenharmony_ci u8500_prcmu_hw_clks.hws[PRCMU_LCDCLK] = 23262306a36Sopenharmony_ci clk_reg_prcmu_scalable("lcdclk", NULL, PRCMU_LCDCLK, 0, 23362306a36Sopenharmony_ci CLK_SET_RATE_GATE); 23462306a36Sopenharmony_ci u8500_prcmu_hw_clks.hws[PRCMU_BMLCLK] = 23562306a36Sopenharmony_ci clk_reg_prcmu_opp_gate("bmlclk", NULL, PRCMU_BMLCLK, 0); 23662306a36Sopenharmony_ci u8500_prcmu_hw_clks.hws[PRCMU_HSITXCLK] = 23762306a36Sopenharmony_ci clk_reg_prcmu_scalable("hsitxclk", NULL, PRCMU_HSITXCLK, 0, 23862306a36Sopenharmony_ci CLK_SET_RATE_GATE); 23962306a36Sopenharmony_ci u8500_prcmu_hw_clks.hws[PRCMU_HSIRXCLK] = 24062306a36Sopenharmony_ci clk_reg_prcmu_scalable("hsirxclk", NULL, PRCMU_HSIRXCLK, 0, 24162306a36Sopenharmony_ci CLK_SET_RATE_GATE); 24262306a36Sopenharmony_ci u8500_prcmu_hw_clks.hws[PRCMU_HDMICLK] = 24362306a36Sopenharmony_ci clk_reg_prcmu_scalable("hdmiclk", NULL, PRCMU_HDMICLK, 0, 24462306a36Sopenharmony_ci CLK_SET_RATE_GATE); 24562306a36Sopenharmony_ci u8500_prcmu_hw_clks.hws[PRCMU_APEATCLK] = 24662306a36Sopenharmony_ci clk_reg_prcmu_gate("apeatclk", NULL, PRCMU_APEATCLK, 0); 24762306a36Sopenharmony_ci u8500_prcmu_hw_clks.hws[PRCMU_APETRACECLK] = 24862306a36Sopenharmony_ci clk_reg_prcmu_scalable("apetraceclk", NULL, PRCMU_APETRACECLK, 0, 24962306a36Sopenharmony_ci CLK_SET_RATE_GATE); 25062306a36Sopenharmony_ci u8500_prcmu_hw_clks.hws[PRCMU_MCDECLK] = 25162306a36Sopenharmony_ci clk_reg_prcmu_gate("mcdeclk", NULL, PRCMU_MCDECLK, 0); 25262306a36Sopenharmony_ci u8500_prcmu_hw_clks.hws[PRCMU_IPI2CCLK] = 25362306a36Sopenharmony_ci clk_reg_prcmu_opp_gate("ipi2cclk", NULL, PRCMU_IPI2CCLK, 0); 25462306a36Sopenharmony_ci u8500_prcmu_hw_clks.hws[PRCMU_DSIALTCLK] = 25562306a36Sopenharmony_ci clk_reg_prcmu_gate("dsialtclk", NULL, PRCMU_DSIALTCLK, 0); 25662306a36Sopenharmony_ci u8500_prcmu_hw_clks.hws[PRCMU_DMACLK] = 25762306a36Sopenharmony_ci clk_reg_prcmu_gate("dmaclk", NULL, PRCMU_DMACLK, 0); 25862306a36Sopenharmony_ci u8500_prcmu_hw_clks.hws[PRCMU_B2R2CLK] = 25962306a36Sopenharmony_ci clk_reg_prcmu_gate("b2r2clk", NULL, PRCMU_B2R2CLK, 0); 26062306a36Sopenharmony_ci u8500_prcmu_hw_clks.hws[PRCMU_TVCLK] = 26162306a36Sopenharmony_ci clk_reg_prcmu_scalable("tvclk", NULL, PRCMU_TVCLK, 0, 26262306a36Sopenharmony_ci CLK_SET_RATE_GATE); 26362306a36Sopenharmony_ci u8500_prcmu_hw_clks.hws[PRCMU_SSPCLK] = 26462306a36Sopenharmony_ci clk_reg_prcmu_gate("sspclk", NULL, PRCMU_SSPCLK, 0); 26562306a36Sopenharmony_ci u8500_prcmu_hw_clks.hws[PRCMU_RNGCLK] = 26662306a36Sopenharmony_ci clk_reg_prcmu_gate("rngclk", NULL, PRCMU_RNGCLK, 0); 26762306a36Sopenharmony_ci u8500_prcmu_hw_clks.hws[PRCMU_UICCCLK] = 26862306a36Sopenharmony_ci clk_reg_prcmu_gate("uiccclk", NULL, PRCMU_UICCCLK, 0); 26962306a36Sopenharmony_ci u8500_prcmu_hw_clks.hws[PRCMU_TIMCLK] = 27062306a36Sopenharmony_ci clk_reg_prcmu_gate("timclk", NULL, PRCMU_TIMCLK, 0); 27162306a36Sopenharmony_ci u8500_prcmu_hw_clks.hws[PRCMU_SYSCLK] = 27262306a36Sopenharmony_ci clk_reg_prcmu_gate("ab8500_sysclk", NULL, PRCMU_SYSCLK, 0); 27362306a36Sopenharmony_ci u8500_prcmu_hw_clks.hws[PRCMU_SDMMCCLK] = 27462306a36Sopenharmony_ci clk_reg_prcmu_opp_volt_scalable("sdmmcclk", NULL, 27562306a36Sopenharmony_ci PRCMU_SDMMCCLK, 100000000, 27662306a36Sopenharmony_ci CLK_SET_RATE_GATE); 27762306a36Sopenharmony_ci u8500_prcmu_hw_clks.hws[PRCMU_PLLDSI] = 27862306a36Sopenharmony_ci clk_reg_prcmu_scalable("dsi_pll", "hdmiclk", 27962306a36Sopenharmony_ci PRCMU_PLLDSI, 0, CLK_SET_RATE_GATE); 28062306a36Sopenharmony_ci u8500_prcmu_hw_clks.hws[PRCMU_DSI0CLK] = 28162306a36Sopenharmony_ci clk_reg_prcmu_scalable("dsi0clk", "dsi_pll", 28262306a36Sopenharmony_ci PRCMU_DSI0CLK, 0, CLK_SET_RATE_GATE); 28362306a36Sopenharmony_ci u8500_prcmu_hw_clks.hws[PRCMU_DSI1CLK] = 28462306a36Sopenharmony_ci clk_reg_prcmu_scalable("dsi1clk", "dsi_pll", 28562306a36Sopenharmony_ci PRCMU_DSI1CLK, 0, CLK_SET_RATE_GATE); 28662306a36Sopenharmony_ci u8500_prcmu_hw_clks.hws[PRCMU_DSI0ESCCLK] = 28762306a36Sopenharmony_ci clk_reg_prcmu_scalable("dsi0escclk", "tvclk", 28862306a36Sopenharmony_ci PRCMU_DSI0ESCCLK, 0, CLK_SET_RATE_GATE); 28962306a36Sopenharmony_ci u8500_prcmu_hw_clks.hws[PRCMU_DSI1ESCCLK] = 29062306a36Sopenharmony_ci clk_reg_prcmu_scalable("dsi1escclk", "tvclk", 29162306a36Sopenharmony_ci PRCMU_DSI1ESCCLK, 0, CLK_SET_RATE_GATE); 29262306a36Sopenharmony_ci u8500_prcmu_hw_clks.hws[PRCMU_DSI2ESCCLK] = 29362306a36Sopenharmony_ci clk_reg_prcmu_scalable("dsi2escclk", "tvclk", 29462306a36Sopenharmony_ci PRCMU_DSI2ESCCLK, 0, CLK_SET_RATE_GATE); 29562306a36Sopenharmony_ci u8500_prcmu_hw_clks.hws[PRCMU_ARMSS] = 29662306a36Sopenharmony_ci clk_reg_prcmu_scalable_rate("armss", NULL, 29762306a36Sopenharmony_ci PRCMU_ARMSS, 0, CLK_IGNORE_UNUSED); 29862306a36Sopenharmony_ci 29962306a36Sopenharmony_ci twd_clk = clk_register_fixed_factor(NULL, "smp_twd", "armss", 30062306a36Sopenharmony_ci CLK_IGNORE_UNUSED, 1, 2); 30162306a36Sopenharmony_ci 30262306a36Sopenharmony_ci /* PRCC P-clocks */ 30362306a36Sopenharmony_ci clk = clk_reg_prcc_pclk("p1_pclk0", "per1clk", bases[CLKRST1_INDEX], 30462306a36Sopenharmony_ci BIT(0), 0); 30562306a36Sopenharmony_ci PRCC_PCLK_STORE(clk, 1, 0); 30662306a36Sopenharmony_ci 30762306a36Sopenharmony_ci clk = clk_reg_prcc_pclk("p1_pclk1", "per1clk", bases[CLKRST1_INDEX], 30862306a36Sopenharmony_ci BIT(1), 0); 30962306a36Sopenharmony_ci PRCC_PCLK_STORE(clk, 1, 1); 31062306a36Sopenharmony_ci 31162306a36Sopenharmony_ci clk = clk_reg_prcc_pclk("p1_pclk2", "per1clk", bases[CLKRST1_INDEX], 31262306a36Sopenharmony_ci BIT(2), 0); 31362306a36Sopenharmony_ci PRCC_PCLK_STORE(clk, 1, 2); 31462306a36Sopenharmony_ci 31562306a36Sopenharmony_ci clk = clk_reg_prcc_pclk("p1_pclk3", "per1clk", bases[CLKRST1_INDEX], 31662306a36Sopenharmony_ci BIT(3), 0); 31762306a36Sopenharmony_ci PRCC_PCLK_STORE(clk, 1, 3); 31862306a36Sopenharmony_ci 31962306a36Sopenharmony_ci clk = clk_reg_prcc_pclk("p1_pclk4", "per1clk", bases[CLKRST1_INDEX], 32062306a36Sopenharmony_ci BIT(4), 0); 32162306a36Sopenharmony_ci PRCC_PCLK_STORE(clk, 1, 4); 32262306a36Sopenharmony_ci 32362306a36Sopenharmony_ci clk = clk_reg_prcc_pclk("p1_pclk5", "per1clk", bases[CLKRST1_INDEX], 32462306a36Sopenharmony_ci BIT(5), 0); 32562306a36Sopenharmony_ci PRCC_PCLK_STORE(clk, 1, 5); 32662306a36Sopenharmony_ci 32762306a36Sopenharmony_ci clk = clk_reg_prcc_pclk("p1_pclk6", "per1clk", bases[CLKRST1_INDEX], 32862306a36Sopenharmony_ci BIT(6), 0); 32962306a36Sopenharmony_ci PRCC_PCLK_STORE(clk, 1, 6); 33062306a36Sopenharmony_ci 33162306a36Sopenharmony_ci clk = clk_reg_prcc_pclk("p1_pclk7", "per1clk", bases[CLKRST1_INDEX], 33262306a36Sopenharmony_ci BIT(7), 0); 33362306a36Sopenharmony_ci PRCC_PCLK_STORE(clk, 1, 7); 33462306a36Sopenharmony_ci 33562306a36Sopenharmony_ci clk = clk_reg_prcc_pclk("p1_pclk8", "per1clk", bases[CLKRST1_INDEX], 33662306a36Sopenharmony_ci BIT(8), 0); 33762306a36Sopenharmony_ci PRCC_PCLK_STORE(clk, 1, 8); 33862306a36Sopenharmony_ci 33962306a36Sopenharmony_ci clk = clk_reg_prcc_pclk("p1_pclk9", "per1clk", bases[CLKRST1_INDEX], 34062306a36Sopenharmony_ci BIT(9), 0); 34162306a36Sopenharmony_ci PRCC_PCLK_STORE(clk, 1, 9); 34262306a36Sopenharmony_ci 34362306a36Sopenharmony_ci clk = clk_reg_prcc_pclk("p1_pclk10", "per1clk", bases[CLKRST1_INDEX], 34462306a36Sopenharmony_ci BIT(10), 0); 34562306a36Sopenharmony_ci PRCC_PCLK_STORE(clk, 1, 10); 34662306a36Sopenharmony_ci 34762306a36Sopenharmony_ci clk = clk_reg_prcc_pclk("p1_pclk11", "per1clk", bases[CLKRST1_INDEX], 34862306a36Sopenharmony_ci BIT(11), 0); 34962306a36Sopenharmony_ci PRCC_PCLK_STORE(clk, 1, 11); 35062306a36Sopenharmony_ci 35162306a36Sopenharmony_ci clk = clk_reg_prcc_pclk("p2_pclk0", "per2clk", bases[CLKRST2_INDEX], 35262306a36Sopenharmony_ci BIT(0), 0); 35362306a36Sopenharmony_ci PRCC_PCLK_STORE(clk, 2, 0); 35462306a36Sopenharmony_ci 35562306a36Sopenharmony_ci clk = clk_reg_prcc_pclk("p2_pclk1", "per2clk", bases[CLKRST2_INDEX], 35662306a36Sopenharmony_ci BIT(1), 0); 35762306a36Sopenharmony_ci PRCC_PCLK_STORE(clk, 2, 1); 35862306a36Sopenharmony_ci 35962306a36Sopenharmony_ci clk = clk_reg_prcc_pclk("p2_pclk2", "per2clk", bases[CLKRST2_INDEX], 36062306a36Sopenharmony_ci BIT(2), 0); 36162306a36Sopenharmony_ci PRCC_PCLK_STORE(clk, 2, 2); 36262306a36Sopenharmony_ci 36362306a36Sopenharmony_ci clk = clk_reg_prcc_pclk("p2_pclk3", "per2clk", bases[CLKRST2_INDEX], 36462306a36Sopenharmony_ci BIT(3), 0); 36562306a36Sopenharmony_ci PRCC_PCLK_STORE(clk, 2, 3); 36662306a36Sopenharmony_ci 36762306a36Sopenharmony_ci clk = clk_reg_prcc_pclk("p2_pclk4", "per2clk", bases[CLKRST2_INDEX], 36862306a36Sopenharmony_ci BIT(4), 0); 36962306a36Sopenharmony_ci PRCC_PCLK_STORE(clk, 2, 4); 37062306a36Sopenharmony_ci 37162306a36Sopenharmony_ci clk = clk_reg_prcc_pclk("p2_pclk5", "per2clk", bases[CLKRST2_INDEX], 37262306a36Sopenharmony_ci BIT(5), 0); 37362306a36Sopenharmony_ci PRCC_PCLK_STORE(clk, 2, 5); 37462306a36Sopenharmony_ci 37562306a36Sopenharmony_ci clk = clk_reg_prcc_pclk("p2_pclk6", "per2clk", bases[CLKRST2_INDEX], 37662306a36Sopenharmony_ci BIT(6), 0); 37762306a36Sopenharmony_ci PRCC_PCLK_STORE(clk, 2, 6); 37862306a36Sopenharmony_ci 37962306a36Sopenharmony_ci clk = clk_reg_prcc_pclk("p2_pclk7", "per2clk", bases[CLKRST2_INDEX], 38062306a36Sopenharmony_ci BIT(7), 0); 38162306a36Sopenharmony_ci PRCC_PCLK_STORE(clk, 2, 7); 38262306a36Sopenharmony_ci 38362306a36Sopenharmony_ci clk = clk_reg_prcc_pclk("p2_pclk8", "per2clk", bases[CLKRST2_INDEX], 38462306a36Sopenharmony_ci BIT(8), 0); 38562306a36Sopenharmony_ci PRCC_PCLK_STORE(clk, 2, 8); 38662306a36Sopenharmony_ci 38762306a36Sopenharmony_ci clk = clk_reg_prcc_pclk("p2_pclk9", "per2clk", bases[CLKRST2_INDEX], 38862306a36Sopenharmony_ci BIT(9), 0); 38962306a36Sopenharmony_ci PRCC_PCLK_STORE(clk, 2, 9); 39062306a36Sopenharmony_ci 39162306a36Sopenharmony_ci clk = clk_reg_prcc_pclk("p2_pclk10", "per2clk", bases[CLKRST2_INDEX], 39262306a36Sopenharmony_ci BIT(10), 0); 39362306a36Sopenharmony_ci PRCC_PCLK_STORE(clk, 2, 10); 39462306a36Sopenharmony_ci 39562306a36Sopenharmony_ci clk = clk_reg_prcc_pclk("p2_pclk11", "per2clk", bases[CLKRST2_INDEX], 39662306a36Sopenharmony_ci BIT(11), 0); 39762306a36Sopenharmony_ci PRCC_PCLK_STORE(clk, 2, 11); 39862306a36Sopenharmony_ci 39962306a36Sopenharmony_ci clk = clk_reg_prcc_pclk("p2_pclk12", "per2clk", bases[CLKRST2_INDEX], 40062306a36Sopenharmony_ci BIT(12), 0); 40162306a36Sopenharmony_ci PRCC_PCLK_STORE(clk, 2, 12); 40262306a36Sopenharmony_ci 40362306a36Sopenharmony_ci clk = clk_reg_prcc_pclk("p3_pclk0", "per3clk", bases[CLKRST3_INDEX], 40462306a36Sopenharmony_ci BIT(0), 0); 40562306a36Sopenharmony_ci PRCC_PCLK_STORE(clk, 3, 0); 40662306a36Sopenharmony_ci 40762306a36Sopenharmony_ci clk = clk_reg_prcc_pclk("p3_pclk1", "per3clk", bases[CLKRST3_INDEX], 40862306a36Sopenharmony_ci BIT(1), 0); 40962306a36Sopenharmony_ci PRCC_PCLK_STORE(clk, 3, 1); 41062306a36Sopenharmony_ci 41162306a36Sopenharmony_ci clk = clk_reg_prcc_pclk("p3_pclk2", "per3clk", bases[CLKRST3_INDEX], 41262306a36Sopenharmony_ci BIT(2), 0); 41362306a36Sopenharmony_ci PRCC_PCLK_STORE(clk, 3, 2); 41462306a36Sopenharmony_ci 41562306a36Sopenharmony_ci clk = clk_reg_prcc_pclk("p3_pclk3", "per3clk", bases[CLKRST3_INDEX], 41662306a36Sopenharmony_ci BIT(3), 0); 41762306a36Sopenharmony_ci PRCC_PCLK_STORE(clk, 3, 3); 41862306a36Sopenharmony_ci 41962306a36Sopenharmony_ci clk = clk_reg_prcc_pclk("p3_pclk4", "per3clk", bases[CLKRST3_INDEX], 42062306a36Sopenharmony_ci BIT(4), 0); 42162306a36Sopenharmony_ci PRCC_PCLK_STORE(clk, 3, 4); 42262306a36Sopenharmony_ci 42362306a36Sopenharmony_ci clk = clk_reg_prcc_pclk("p3_pclk5", "per3clk", bases[CLKRST3_INDEX], 42462306a36Sopenharmony_ci BIT(5), 0); 42562306a36Sopenharmony_ci PRCC_PCLK_STORE(clk, 3, 5); 42662306a36Sopenharmony_ci 42762306a36Sopenharmony_ci clk = clk_reg_prcc_pclk("p3_pclk6", "per3clk", bases[CLKRST3_INDEX], 42862306a36Sopenharmony_ci BIT(6), 0); 42962306a36Sopenharmony_ci PRCC_PCLK_STORE(clk, 3, 6); 43062306a36Sopenharmony_ci 43162306a36Sopenharmony_ci clk = clk_reg_prcc_pclk("p3_pclk7", "per3clk", bases[CLKRST3_INDEX], 43262306a36Sopenharmony_ci BIT(7), 0); 43362306a36Sopenharmony_ci PRCC_PCLK_STORE(clk, 3, 7); 43462306a36Sopenharmony_ci 43562306a36Sopenharmony_ci clk = clk_reg_prcc_pclk("p3_pclk8", "per3clk", bases[CLKRST3_INDEX], 43662306a36Sopenharmony_ci BIT(8), 0); 43762306a36Sopenharmony_ci PRCC_PCLK_STORE(clk, 3, 8); 43862306a36Sopenharmony_ci 43962306a36Sopenharmony_ci clk = clk_reg_prcc_pclk("p5_pclk0", "per5clk", bases[CLKRST5_INDEX], 44062306a36Sopenharmony_ci BIT(0), 0); 44162306a36Sopenharmony_ci PRCC_PCLK_STORE(clk, 5, 0); 44262306a36Sopenharmony_ci 44362306a36Sopenharmony_ci clk = clk_reg_prcc_pclk("p5_pclk1", "per5clk", bases[CLKRST5_INDEX], 44462306a36Sopenharmony_ci BIT(1), 0); 44562306a36Sopenharmony_ci PRCC_PCLK_STORE(clk, 5, 1); 44662306a36Sopenharmony_ci 44762306a36Sopenharmony_ci clk = clk_reg_prcc_pclk("p6_pclk0", "per6clk", bases[CLKRST6_INDEX], 44862306a36Sopenharmony_ci BIT(0), 0); 44962306a36Sopenharmony_ci PRCC_PCLK_STORE(clk, 6, 0); 45062306a36Sopenharmony_ci 45162306a36Sopenharmony_ci clk = clk_reg_prcc_pclk("p6_pclk1", "per6clk", bases[CLKRST6_INDEX], 45262306a36Sopenharmony_ci BIT(1), 0); 45362306a36Sopenharmony_ci PRCC_PCLK_STORE(clk, 6, 1); 45462306a36Sopenharmony_ci 45562306a36Sopenharmony_ci clk = clk_reg_prcc_pclk("p6_pclk2", "per6clk", bases[CLKRST6_INDEX], 45662306a36Sopenharmony_ci BIT(2), 0); 45762306a36Sopenharmony_ci PRCC_PCLK_STORE(clk, 6, 2); 45862306a36Sopenharmony_ci 45962306a36Sopenharmony_ci clk = clk_reg_prcc_pclk("p6_pclk3", "per6clk", bases[CLKRST6_INDEX], 46062306a36Sopenharmony_ci BIT(3), 0); 46162306a36Sopenharmony_ci PRCC_PCLK_STORE(clk, 6, 3); 46262306a36Sopenharmony_ci 46362306a36Sopenharmony_ci clk = clk_reg_prcc_pclk("p6_pclk4", "per6clk", bases[CLKRST6_INDEX], 46462306a36Sopenharmony_ci BIT(4), 0); 46562306a36Sopenharmony_ci PRCC_PCLK_STORE(clk, 6, 4); 46662306a36Sopenharmony_ci 46762306a36Sopenharmony_ci clk = clk_reg_prcc_pclk("p6_pclk5", "per6clk", bases[CLKRST6_INDEX], 46862306a36Sopenharmony_ci BIT(5), 0); 46962306a36Sopenharmony_ci PRCC_PCLK_STORE(clk, 6, 5); 47062306a36Sopenharmony_ci 47162306a36Sopenharmony_ci clk = clk_reg_prcc_pclk("p6_pclk6", "per6clk", bases[CLKRST6_INDEX], 47262306a36Sopenharmony_ci BIT(6), 0); 47362306a36Sopenharmony_ci PRCC_PCLK_STORE(clk, 6, 6); 47462306a36Sopenharmony_ci 47562306a36Sopenharmony_ci clk = clk_reg_prcc_pclk("p6_pclk7", "per6clk", bases[CLKRST6_INDEX], 47662306a36Sopenharmony_ci BIT(7), 0); 47762306a36Sopenharmony_ci PRCC_PCLK_STORE(clk, 6, 7); 47862306a36Sopenharmony_ci 47962306a36Sopenharmony_ci /* PRCC K-clocks 48062306a36Sopenharmony_ci * 48162306a36Sopenharmony_ci * FIXME: Some drivers requires PERPIH[n| to be automatically enabled 48262306a36Sopenharmony_ci * by enabling just the K-clock, even if it is not a valid parent to 48362306a36Sopenharmony_ci * the K-clock. Until drivers get fixed we might need some kind of 48462306a36Sopenharmony_ci * "parent muxed join". 48562306a36Sopenharmony_ci */ 48662306a36Sopenharmony_ci 48762306a36Sopenharmony_ci /* Periph1 */ 48862306a36Sopenharmony_ci clk = clk_reg_prcc_kclk("p1_uart0_kclk", "uartclk", 48962306a36Sopenharmony_ci bases[CLKRST1_INDEX], BIT(0), CLK_SET_RATE_GATE); 49062306a36Sopenharmony_ci PRCC_KCLK_STORE(clk, 1, 0); 49162306a36Sopenharmony_ci 49262306a36Sopenharmony_ci clk = clk_reg_prcc_kclk("p1_uart1_kclk", "uartclk", 49362306a36Sopenharmony_ci bases[CLKRST1_INDEX], BIT(1), CLK_SET_RATE_GATE); 49462306a36Sopenharmony_ci PRCC_KCLK_STORE(clk, 1, 1); 49562306a36Sopenharmony_ci 49662306a36Sopenharmony_ci clk = clk_reg_prcc_kclk("p1_i2c1_kclk", "i2cclk", 49762306a36Sopenharmony_ci bases[CLKRST1_INDEX], BIT(2), CLK_SET_RATE_GATE); 49862306a36Sopenharmony_ci PRCC_KCLK_STORE(clk, 1, 2); 49962306a36Sopenharmony_ci 50062306a36Sopenharmony_ci clk = clk_reg_prcc_kclk("p1_msp0_kclk", "msp02clk", 50162306a36Sopenharmony_ci bases[CLKRST1_INDEX], BIT(3), CLK_SET_RATE_GATE); 50262306a36Sopenharmony_ci PRCC_KCLK_STORE(clk, 1, 3); 50362306a36Sopenharmony_ci 50462306a36Sopenharmony_ci clk = clk_reg_prcc_kclk("p1_msp1_kclk", "msp1clk", 50562306a36Sopenharmony_ci bases[CLKRST1_INDEX], BIT(4), CLK_SET_RATE_GATE); 50662306a36Sopenharmony_ci PRCC_KCLK_STORE(clk, 1, 4); 50762306a36Sopenharmony_ci 50862306a36Sopenharmony_ci clk = clk_reg_prcc_kclk("p1_sdi0_kclk", "sdmmcclk", 50962306a36Sopenharmony_ci bases[CLKRST1_INDEX], BIT(5), CLK_SET_RATE_GATE); 51062306a36Sopenharmony_ci PRCC_KCLK_STORE(clk, 1, 5); 51162306a36Sopenharmony_ci 51262306a36Sopenharmony_ci clk = clk_reg_prcc_kclk("p1_i2c2_kclk", "i2cclk", 51362306a36Sopenharmony_ci bases[CLKRST1_INDEX], BIT(6), CLK_SET_RATE_GATE); 51462306a36Sopenharmony_ci PRCC_KCLK_STORE(clk, 1, 6); 51562306a36Sopenharmony_ci 51662306a36Sopenharmony_ci clk = clk_reg_prcc_kclk("p1_slimbus0_kclk", "slimclk", 51762306a36Sopenharmony_ci bases[CLKRST1_INDEX], BIT(8), CLK_SET_RATE_GATE); 51862306a36Sopenharmony_ci PRCC_KCLK_STORE(clk, 1, 8); 51962306a36Sopenharmony_ci 52062306a36Sopenharmony_ci clk = clk_reg_prcc_kclk("p1_i2c4_kclk", "i2cclk", 52162306a36Sopenharmony_ci bases[CLKRST1_INDEX], BIT(9), CLK_SET_RATE_GATE); 52262306a36Sopenharmony_ci PRCC_KCLK_STORE(clk, 1, 9); 52362306a36Sopenharmony_ci 52462306a36Sopenharmony_ci clk = clk_reg_prcc_kclk("p1_msp3_kclk", "msp1clk", 52562306a36Sopenharmony_ci bases[CLKRST1_INDEX], BIT(10), CLK_SET_RATE_GATE); 52662306a36Sopenharmony_ci PRCC_KCLK_STORE(clk, 1, 10); 52762306a36Sopenharmony_ci 52862306a36Sopenharmony_ci /* Periph2 */ 52962306a36Sopenharmony_ci clk = clk_reg_prcc_kclk("p2_i2c3_kclk", "i2cclk", 53062306a36Sopenharmony_ci bases[CLKRST2_INDEX], BIT(0), CLK_SET_RATE_GATE); 53162306a36Sopenharmony_ci PRCC_KCLK_STORE(clk, 2, 0); 53262306a36Sopenharmony_ci 53362306a36Sopenharmony_ci clk = clk_reg_prcc_kclk("p2_sdi4_kclk", "sdmmcclk", 53462306a36Sopenharmony_ci bases[CLKRST2_INDEX], BIT(2), CLK_SET_RATE_GATE); 53562306a36Sopenharmony_ci PRCC_KCLK_STORE(clk, 2, 2); 53662306a36Sopenharmony_ci 53762306a36Sopenharmony_ci clk = clk_reg_prcc_kclk("p2_msp2_kclk", "msp02clk", 53862306a36Sopenharmony_ci bases[CLKRST2_INDEX], BIT(3), CLK_SET_RATE_GATE); 53962306a36Sopenharmony_ci PRCC_KCLK_STORE(clk, 2, 3); 54062306a36Sopenharmony_ci 54162306a36Sopenharmony_ci clk = clk_reg_prcc_kclk("p2_sdi1_kclk", "sdmmcclk", 54262306a36Sopenharmony_ci bases[CLKRST2_INDEX], BIT(4), CLK_SET_RATE_GATE); 54362306a36Sopenharmony_ci PRCC_KCLK_STORE(clk, 2, 4); 54462306a36Sopenharmony_ci 54562306a36Sopenharmony_ci clk = clk_reg_prcc_kclk("p2_sdi3_kclk", "sdmmcclk", 54662306a36Sopenharmony_ci bases[CLKRST2_INDEX], BIT(5), CLK_SET_RATE_GATE); 54762306a36Sopenharmony_ci PRCC_KCLK_STORE(clk, 2, 5); 54862306a36Sopenharmony_ci 54962306a36Sopenharmony_ci /* Note that rate is received from parent. */ 55062306a36Sopenharmony_ci clk = clk_reg_prcc_kclk("p2_ssirx_kclk", "hsirxclk", 55162306a36Sopenharmony_ci bases[CLKRST2_INDEX], BIT(6), 55262306a36Sopenharmony_ci CLK_SET_RATE_GATE|CLK_SET_RATE_PARENT); 55362306a36Sopenharmony_ci PRCC_KCLK_STORE(clk, 2, 6); 55462306a36Sopenharmony_ci 55562306a36Sopenharmony_ci clk = clk_reg_prcc_kclk("p2_ssitx_kclk", "hsitxclk", 55662306a36Sopenharmony_ci bases[CLKRST2_INDEX], BIT(7), 55762306a36Sopenharmony_ci CLK_SET_RATE_GATE|CLK_SET_RATE_PARENT); 55862306a36Sopenharmony_ci PRCC_KCLK_STORE(clk, 2, 7); 55962306a36Sopenharmony_ci 56062306a36Sopenharmony_ci /* Periph3 */ 56162306a36Sopenharmony_ci clk = clk_reg_prcc_kclk("p3_ssp0_kclk", "sspclk", 56262306a36Sopenharmony_ci bases[CLKRST3_INDEX], BIT(1), CLK_SET_RATE_GATE); 56362306a36Sopenharmony_ci PRCC_KCLK_STORE(clk, 3, 1); 56462306a36Sopenharmony_ci 56562306a36Sopenharmony_ci clk = clk_reg_prcc_kclk("p3_ssp1_kclk", "sspclk", 56662306a36Sopenharmony_ci bases[CLKRST3_INDEX], BIT(2), CLK_SET_RATE_GATE); 56762306a36Sopenharmony_ci PRCC_KCLK_STORE(clk, 3, 2); 56862306a36Sopenharmony_ci 56962306a36Sopenharmony_ci clk = clk_reg_prcc_kclk("p3_i2c0_kclk", "i2cclk", 57062306a36Sopenharmony_ci bases[CLKRST3_INDEX], BIT(3), CLK_SET_RATE_GATE); 57162306a36Sopenharmony_ci PRCC_KCLK_STORE(clk, 3, 3); 57262306a36Sopenharmony_ci 57362306a36Sopenharmony_ci clk = clk_reg_prcc_kclk("p3_sdi2_kclk", "sdmmcclk", 57462306a36Sopenharmony_ci bases[CLKRST3_INDEX], BIT(4), CLK_SET_RATE_GATE); 57562306a36Sopenharmony_ci PRCC_KCLK_STORE(clk, 3, 4); 57662306a36Sopenharmony_ci 57762306a36Sopenharmony_ci clk = clk_reg_prcc_kclk("p3_ske_kclk", "rtc32k", 57862306a36Sopenharmony_ci bases[CLKRST3_INDEX], BIT(5), CLK_SET_RATE_GATE); 57962306a36Sopenharmony_ci PRCC_KCLK_STORE(clk, 3, 5); 58062306a36Sopenharmony_ci 58162306a36Sopenharmony_ci clk = clk_reg_prcc_kclk("p3_uart2_kclk", "uartclk", 58262306a36Sopenharmony_ci bases[CLKRST3_INDEX], BIT(6), CLK_SET_RATE_GATE); 58362306a36Sopenharmony_ci PRCC_KCLK_STORE(clk, 3, 6); 58462306a36Sopenharmony_ci 58562306a36Sopenharmony_ci clk = clk_reg_prcc_kclk("p3_sdi5_kclk", "sdmmcclk", 58662306a36Sopenharmony_ci bases[CLKRST3_INDEX], BIT(7), CLK_SET_RATE_GATE); 58762306a36Sopenharmony_ci PRCC_KCLK_STORE(clk, 3, 7); 58862306a36Sopenharmony_ci 58962306a36Sopenharmony_ci /* Periph6 */ 59062306a36Sopenharmony_ci clk = clk_reg_prcc_kclk("p3_rng_kclk", "rngclk", 59162306a36Sopenharmony_ci bases[CLKRST6_INDEX], BIT(0), CLK_SET_RATE_GATE); 59262306a36Sopenharmony_ci PRCC_KCLK_STORE(clk, 6, 0); 59362306a36Sopenharmony_ci 59462306a36Sopenharmony_ci for_each_child_of_node(np, child) { 59562306a36Sopenharmony_ci if (of_node_name_eq(child, "prcmu-clock")) 59662306a36Sopenharmony_ci of_clk_add_hw_provider(child, of_clk_hw_onecell_get, 59762306a36Sopenharmony_ci &u8500_prcmu_hw_clks); 59862306a36Sopenharmony_ci 59962306a36Sopenharmony_ci if (of_node_name_eq(child, "clkout-clock")) 60062306a36Sopenharmony_ci of_clk_add_hw_provider(child, ux500_clkout_get, NULL); 60162306a36Sopenharmony_ci 60262306a36Sopenharmony_ci if (of_node_name_eq(child, "prcc-periph-clock")) 60362306a36Sopenharmony_ci of_clk_add_provider(child, ux500_twocell_get, prcc_pclk); 60462306a36Sopenharmony_ci 60562306a36Sopenharmony_ci if (of_node_name_eq(child, "prcc-kernel-clock")) 60662306a36Sopenharmony_ci of_clk_add_provider(child, ux500_twocell_get, prcc_kclk); 60762306a36Sopenharmony_ci 60862306a36Sopenharmony_ci if (of_node_name_eq(child, "rtc32k-clock")) 60962306a36Sopenharmony_ci of_clk_add_provider(child, of_clk_src_simple_get, rtc_clk); 61062306a36Sopenharmony_ci 61162306a36Sopenharmony_ci if (of_node_name_eq(child, "smp-twd-clock")) 61262306a36Sopenharmony_ci of_clk_add_provider(child, of_clk_src_simple_get, twd_clk); 61362306a36Sopenharmony_ci 61462306a36Sopenharmony_ci if (of_node_name_eq(child, "prcc-reset-controller")) 61562306a36Sopenharmony_ci u8500_prcc_reset_init(child, rstc); 61662306a36Sopenharmony_ci } 61762306a36Sopenharmony_ci} 61862306a36Sopenharmony_ciCLK_OF_DECLARE(u8500_clks, "stericsson,u8500-clks", u8500_clk_init); 619