162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (C) 2014 Broadcom Corporation 462306a36Sopenharmony_ci * Copyright 2014 Linaro Limited 562306a36Sopenharmony_ci */ 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#include "clk-kona.h" 862306a36Sopenharmony_ci#include "dt-bindings/clock/bcm21664.h" 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#define BCM21664_CCU_COMMON(_name, _capname) \ 1162306a36Sopenharmony_ci KONA_CCU_COMMON(BCM21664, _name, _capname) 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci/* Root CCU */ 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_cistatic struct peri_clk_data frac_1m_data = { 1662306a36Sopenharmony_ci .gate = HW_SW_GATE(0x214, 16, 0, 1), 1762306a36Sopenharmony_ci .clocks = CLOCKS("ref_crystal"), 1862306a36Sopenharmony_ci}; 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_cistatic struct ccu_data root_ccu_data = { 2162306a36Sopenharmony_ci BCM21664_CCU_COMMON(root, ROOT), 2262306a36Sopenharmony_ci /* no policy control */ 2362306a36Sopenharmony_ci .kona_clks = { 2462306a36Sopenharmony_ci [BCM21664_ROOT_CCU_FRAC_1M] = 2562306a36Sopenharmony_ci KONA_CLK(root, frac_1m, peri), 2662306a36Sopenharmony_ci [BCM21664_ROOT_CCU_CLOCK_COUNT] = LAST_KONA_CLK, 2762306a36Sopenharmony_ci }, 2862306a36Sopenharmony_ci}; 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ci/* AON CCU */ 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_cistatic struct peri_clk_data hub_timer_data = { 3362306a36Sopenharmony_ci .gate = HW_SW_GATE(0x0414, 16, 0, 1), 3462306a36Sopenharmony_ci .hyst = HYST(0x0414, 8, 9), 3562306a36Sopenharmony_ci .clocks = CLOCKS("bbl_32k", 3662306a36Sopenharmony_ci "frac_1m", 3762306a36Sopenharmony_ci "dft_19_5m"), 3862306a36Sopenharmony_ci .sel = SELECTOR(0x0a10, 0, 2), 3962306a36Sopenharmony_ci .trig = TRIGGER(0x0a40, 4), 4062306a36Sopenharmony_ci}; 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_cistatic struct ccu_data aon_ccu_data = { 4362306a36Sopenharmony_ci BCM21664_CCU_COMMON(aon, AON), 4462306a36Sopenharmony_ci .policy = { 4562306a36Sopenharmony_ci .enable = CCU_LVM_EN(0x0034, 0), 4662306a36Sopenharmony_ci .control = CCU_POLICY_CTL(0x000c, 0, 1, 2), 4762306a36Sopenharmony_ci }, 4862306a36Sopenharmony_ci .kona_clks = { 4962306a36Sopenharmony_ci [BCM21664_AON_CCU_HUB_TIMER] = 5062306a36Sopenharmony_ci KONA_CLK(aon, hub_timer, peri), 5162306a36Sopenharmony_ci [BCM21664_AON_CCU_CLOCK_COUNT] = LAST_KONA_CLK, 5262306a36Sopenharmony_ci }, 5362306a36Sopenharmony_ci}; 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_ci/* Master CCU */ 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_cistatic struct peri_clk_data sdio1_data = { 5862306a36Sopenharmony_ci .gate = HW_SW_GATE(0x0358, 18, 2, 3), 5962306a36Sopenharmony_ci .clocks = CLOCKS("ref_crystal", 6062306a36Sopenharmony_ci "var_52m", 6162306a36Sopenharmony_ci "ref_52m", 6262306a36Sopenharmony_ci "var_96m", 6362306a36Sopenharmony_ci "ref_96m"), 6462306a36Sopenharmony_ci .sel = SELECTOR(0x0a28, 0, 3), 6562306a36Sopenharmony_ci .div = DIVIDER(0x0a28, 4, 14), 6662306a36Sopenharmony_ci .trig = TRIGGER(0x0afc, 9), 6762306a36Sopenharmony_ci}; 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_cistatic struct peri_clk_data sdio2_data = { 7062306a36Sopenharmony_ci .gate = HW_SW_GATE(0x035c, 18, 2, 3), 7162306a36Sopenharmony_ci .clocks = CLOCKS("ref_crystal", 7262306a36Sopenharmony_ci "var_52m", 7362306a36Sopenharmony_ci "ref_52m", 7462306a36Sopenharmony_ci "var_96m", 7562306a36Sopenharmony_ci "ref_96m"), 7662306a36Sopenharmony_ci .sel = SELECTOR(0x0a2c, 0, 3), 7762306a36Sopenharmony_ci .div = DIVIDER(0x0a2c, 4, 14), 7862306a36Sopenharmony_ci .trig = TRIGGER(0x0afc, 10), 7962306a36Sopenharmony_ci}; 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_cistatic struct peri_clk_data sdio3_data = { 8262306a36Sopenharmony_ci .gate = HW_SW_GATE(0x0364, 18, 2, 3), 8362306a36Sopenharmony_ci .clocks = CLOCKS("ref_crystal", 8462306a36Sopenharmony_ci "var_52m", 8562306a36Sopenharmony_ci "ref_52m", 8662306a36Sopenharmony_ci "var_96m", 8762306a36Sopenharmony_ci "ref_96m"), 8862306a36Sopenharmony_ci .sel = SELECTOR(0x0a34, 0, 3), 8962306a36Sopenharmony_ci .div = DIVIDER(0x0a34, 4, 14), 9062306a36Sopenharmony_ci .trig = TRIGGER(0x0afc, 12), 9162306a36Sopenharmony_ci}; 9262306a36Sopenharmony_ci 9362306a36Sopenharmony_cistatic struct peri_clk_data sdio4_data = { 9462306a36Sopenharmony_ci .gate = HW_SW_GATE(0x0360, 18, 2, 3), 9562306a36Sopenharmony_ci .clocks = CLOCKS("ref_crystal", 9662306a36Sopenharmony_ci "var_52m", 9762306a36Sopenharmony_ci "ref_52m", 9862306a36Sopenharmony_ci "var_96m", 9962306a36Sopenharmony_ci "ref_96m"), 10062306a36Sopenharmony_ci .sel = SELECTOR(0x0a30, 0, 3), 10162306a36Sopenharmony_ci .div = DIVIDER(0x0a30, 4, 14), 10262306a36Sopenharmony_ci .trig = TRIGGER(0x0afc, 11), 10362306a36Sopenharmony_ci}; 10462306a36Sopenharmony_ci 10562306a36Sopenharmony_cistatic struct peri_clk_data sdio1_sleep_data = { 10662306a36Sopenharmony_ci .clocks = CLOCKS("ref_32k"), /* Verify */ 10762306a36Sopenharmony_ci .gate = HW_SW_GATE(0x0358, 18, 2, 3), 10862306a36Sopenharmony_ci}; 10962306a36Sopenharmony_ci 11062306a36Sopenharmony_cistatic struct peri_clk_data sdio2_sleep_data = { 11162306a36Sopenharmony_ci .clocks = CLOCKS("ref_32k"), /* Verify */ 11262306a36Sopenharmony_ci .gate = HW_SW_GATE(0x035c, 18, 2, 3), 11362306a36Sopenharmony_ci}; 11462306a36Sopenharmony_ci 11562306a36Sopenharmony_cistatic struct peri_clk_data sdio3_sleep_data = { 11662306a36Sopenharmony_ci .clocks = CLOCKS("ref_32k"), /* Verify */ 11762306a36Sopenharmony_ci .gate = HW_SW_GATE(0x0364, 18, 2, 3), 11862306a36Sopenharmony_ci}; 11962306a36Sopenharmony_ci 12062306a36Sopenharmony_cistatic struct peri_clk_data sdio4_sleep_data = { 12162306a36Sopenharmony_ci .clocks = CLOCKS("ref_32k"), /* Verify */ 12262306a36Sopenharmony_ci .gate = HW_SW_GATE(0x0360, 18, 2, 3), 12362306a36Sopenharmony_ci}; 12462306a36Sopenharmony_ci 12562306a36Sopenharmony_cistatic struct ccu_data master_ccu_data = { 12662306a36Sopenharmony_ci BCM21664_CCU_COMMON(master, MASTER), 12762306a36Sopenharmony_ci .policy = { 12862306a36Sopenharmony_ci .enable = CCU_LVM_EN(0x0034, 0), 12962306a36Sopenharmony_ci .control = CCU_POLICY_CTL(0x000c, 0, 1, 2), 13062306a36Sopenharmony_ci }, 13162306a36Sopenharmony_ci .kona_clks = { 13262306a36Sopenharmony_ci [BCM21664_MASTER_CCU_SDIO1] = 13362306a36Sopenharmony_ci KONA_CLK(master, sdio1, peri), 13462306a36Sopenharmony_ci [BCM21664_MASTER_CCU_SDIO2] = 13562306a36Sopenharmony_ci KONA_CLK(master, sdio2, peri), 13662306a36Sopenharmony_ci [BCM21664_MASTER_CCU_SDIO3] = 13762306a36Sopenharmony_ci KONA_CLK(master, sdio3, peri), 13862306a36Sopenharmony_ci [BCM21664_MASTER_CCU_SDIO4] = 13962306a36Sopenharmony_ci KONA_CLK(master, sdio4, peri), 14062306a36Sopenharmony_ci [BCM21664_MASTER_CCU_SDIO1_SLEEP] = 14162306a36Sopenharmony_ci KONA_CLK(master, sdio1_sleep, peri), 14262306a36Sopenharmony_ci [BCM21664_MASTER_CCU_SDIO2_SLEEP] = 14362306a36Sopenharmony_ci KONA_CLK(master, sdio2_sleep, peri), 14462306a36Sopenharmony_ci [BCM21664_MASTER_CCU_SDIO3_SLEEP] = 14562306a36Sopenharmony_ci KONA_CLK(master, sdio3_sleep, peri), 14662306a36Sopenharmony_ci [BCM21664_MASTER_CCU_SDIO4_SLEEP] = 14762306a36Sopenharmony_ci KONA_CLK(master, sdio4_sleep, peri), 14862306a36Sopenharmony_ci [BCM21664_MASTER_CCU_CLOCK_COUNT] = LAST_KONA_CLK, 14962306a36Sopenharmony_ci }, 15062306a36Sopenharmony_ci}; 15162306a36Sopenharmony_ci 15262306a36Sopenharmony_ci/* Slave CCU */ 15362306a36Sopenharmony_ci 15462306a36Sopenharmony_cistatic struct peri_clk_data uartb_data = { 15562306a36Sopenharmony_ci .gate = HW_SW_GATE(0x0400, 18, 2, 3), 15662306a36Sopenharmony_ci .clocks = CLOCKS("ref_crystal", 15762306a36Sopenharmony_ci "var_156m", 15862306a36Sopenharmony_ci "ref_156m"), 15962306a36Sopenharmony_ci .sel = SELECTOR(0x0a10, 0, 2), 16062306a36Sopenharmony_ci .div = FRAC_DIVIDER(0x0a10, 4, 12, 8), 16162306a36Sopenharmony_ci .trig = TRIGGER(0x0afc, 2), 16262306a36Sopenharmony_ci}; 16362306a36Sopenharmony_ci 16462306a36Sopenharmony_cistatic struct peri_clk_data uartb2_data = { 16562306a36Sopenharmony_ci .gate = HW_SW_GATE(0x0404, 18, 2, 3), 16662306a36Sopenharmony_ci .clocks = CLOCKS("ref_crystal", 16762306a36Sopenharmony_ci "var_156m", 16862306a36Sopenharmony_ci "ref_156m"), 16962306a36Sopenharmony_ci .sel = SELECTOR(0x0a14, 0, 2), 17062306a36Sopenharmony_ci .div = FRAC_DIVIDER(0x0a14, 4, 12, 8), 17162306a36Sopenharmony_ci .trig = TRIGGER(0x0afc, 3), 17262306a36Sopenharmony_ci}; 17362306a36Sopenharmony_ci 17462306a36Sopenharmony_cistatic struct peri_clk_data uartb3_data = { 17562306a36Sopenharmony_ci .gate = HW_SW_GATE(0x0408, 18, 2, 3), 17662306a36Sopenharmony_ci .clocks = CLOCKS("ref_crystal", 17762306a36Sopenharmony_ci "var_156m", 17862306a36Sopenharmony_ci "ref_156m"), 17962306a36Sopenharmony_ci .sel = SELECTOR(0x0a18, 0, 2), 18062306a36Sopenharmony_ci .div = FRAC_DIVIDER(0x0a18, 4, 12, 8), 18162306a36Sopenharmony_ci .trig = TRIGGER(0x0afc, 4), 18262306a36Sopenharmony_ci}; 18362306a36Sopenharmony_ci 18462306a36Sopenharmony_cistatic struct peri_clk_data bsc1_data = { 18562306a36Sopenharmony_ci .gate = HW_SW_GATE(0x0458, 18, 2, 3), 18662306a36Sopenharmony_ci .clocks = CLOCKS("ref_crystal", 18762306a36Sopenharmony_ci "var_104m", 18862306a36Sopenharmony_ci "ref_104m", 18962306a36Sopenharmony_ci "var_13m", 19062306a36Sopenharmony_ci "ref_13m"), 19162306a36Sopenharmony_ci .sel = SELECTOR(0x0a64, 0, 3), 19262306a36Sopenharmony_ci .trig = TRIGGER(0x0afc, 23), 19362306a36Sopenharmony_ci}; 19462306a36Sopenharmony_ci 19562306a36Sopenharmony_cistatic struct peri_clk_data bsc2_data = { 19662306a36Sopenharmony_ci .gate = HW_SW_GATE(0x045c, 18, 2, 3), 19762306a36Sopenharmony_ci .clocks = CLOCKS("ref_crystal", 19862306a36Sopenharmony_ci "var_104m", 19962306a36Sopenharmony_ci "ref_104m", 20062306a36Sopenharmony_ci "var_13m", 20162306a36Sopenharmony_ci "ref_13m"), 20262306a36Sopenharmony_ci .sel = SELECTOR(0x0a68, 0, 3), 20362306a36Sopenharmony_ci .trig = TRIGGER(0x0afc, 24), 20462306a36Sopenharmony_ci}; 20562306a36Sopenharmony_ci 20662306a36Sopenharmony_cistatic struct peri_clk_data bsc3_data = { 20762306a36Sopenharmony_ci .gate = HW_SW_GATE(0x0470, 18, 2, 3), 20862306a36Sopenharmony_ci .clocks = CLOCKS("ref_crystal", 20962306a36Sopenharmony_ci "var_104m", 21062306a36Sopenharmony_ci "ref_104m", 21162306a36Sopenharmony_ci "var_13m", 21262306a36Sopenharmony_ci "ref_13m"), 21362306a36Sopenharmony_ci .sel = SELECTOR(0x0a7c, 0, 3), 21462306a36Sopenharmony_ci .trig = TRIGGER(0x0afc, 18), 21562306a36Sopenharmony_ci}; 21662306a36Sopenharmony_ci 21762306a36Sopenharmony_cistatic struct peri_clk_data bsc4_data = { 21862306a36Sopenharmony_ci .gate = HW_SW_GATE(0x0474, 18, 2, 3), 21962306a36Sopenharmony_ci .clocks = CLOCKS("ref_crystal", 22062306a36Sopenharmony_ci "var_104m", 22162306a36Sopenharmony_ci "ref_104m", 22262306a36Sopenharmony_ci "var_13m", 22362306a36Sopenharmony_ci "ref_13m"), 22462306a36Sopenharmony_ci .sel = SELECTOR(0x0a80, 0, 3), 22562306a36Sopenharmony_ci .trig = TRIGGER(0x0afc, 19), 22662306a36Sopenharmony_ci}; 22762306a36Sopenharmony_ci 22862306a36Sopenharmony_cistatic struct ccu_data slave_ccu_data = { 22962306a36Sopenharmony_ci BCM21664_CCU_COMMON(slave, SLAVE), 23062306a36Sopenharmony_ci .policy = { 23162306a36Sopenharmony_ci .enable = CCU_LVM_EN(0x0034, 0), 23262306a36Sopenharmony_ci .control = CCU_POLICY_CTL(0x000c, 0, 1, 2), 23362306a36Sopenharmony_ci }, 23462306a36Sopenharmony_ci .kona_clks = { 23562306a36Sopenharmony_ci [BCM21664_SLAVE_CCU_UARTB] = 23662306a36Sopenharmony_ci KONA_CLK(slave, uartb, peri), 23762306a36Sopenharmony_ci [BCM21664_SLAVE_CCU_UARTB2] = 23862306a36Sopenharmony_ci KONA_CLK(slave, uartb2, peri), 23962306a36Sopenharmony_ci [BCM21664_SLAVE_CCU_UARTB3] = 24062306a36Sopenharmony_ci KONA_CLK(slave, uartb3, peri), 24162306a36Sopenharmony_ci [BCM21664_SLAVE_CCU_BSC1] = 24262306a36Sopenharmony_ci KONA_CLK(slave, bsc1, peri), 24362306a36Sopenharmony_ci [BCM21664_SLAVE_CCU_BSC2] = 24462306a36Sopenharmony_ci KONA_CLK(slave, bsc2, peri), 24562306a36Sopenharmony_ci [BCM21664_SLAVE_CCU_BSC3] = 24662306a36Sopenharmony_ci KONA_CLK(slave, bsc3, peri), 24762306a36Sopenharmony_ci [BCM21664_SLAVE_CCU_BSC4] = 24862306a36Sopenharmony_ci KONA_CLK(slave, bsc4, peri), 24962306a36Sopenharmony_ci [BCM21664_SLAVE_CCU_CLOCK_COUNT] = LAST_KONA_CLK, 25062306a36Sopenharmony_ci }, 25162306a36Sopenharmony_ci}; 25262306a36Sopenharmony_ci 25362306a36Sopenharmony_ci/* Device tree match table callback functions */ 25462306a36Sopenharmony_ci 25562306a36Sopenharmony_cistatic void __init kona_dt_root_ccu_setup(struct device_node *node) 25662306a36Sopenharmony_ci{ 25762306a36Sopenharmony_ci kona_dt_ccu_setup(&root_ccu_data, node); 25862306a36Sopenharmony_ci} 25962306a36Sopenharmony_ci 26062306a36Sopenharmony_cistatic void __init kona_dt_aon_ccu_setup(struct device_node *node) 26162306a36Sopenharmony_ci{ 26262306a36Sopenharmony_ci kona_dt_ccu_setup(&aon_ccu_data, node); 26362306a36Sopenharmony_ci} 26462306a36Sopenharmony_ci 26562306a36Sopenharmony_cistatic void __init kona_dt_master_ccu_setup(struct device_node *node) 26662306a36Sopenharmony_ci{ 26762306a36Sopenharmony_ci kona_dt_ccu_setup(&master_ccu_data, node); 26862306a36Sopenharmony_ci} 26962306a36Sopenharmony_ci 27062306a36Sopenharmony_cistatic void __init kona_dt_slave_ccu_setup(struct device_node *node) 27162306a36Sopenharmony_ci{ 27262306a36Sopenharmony_ci kona_dt_ccu_setup(&slave_ccu_data, node); 27362306a36Sopenharmony_ci} 27462306a36Sopenharmony_ci 27562306a36Sopenharmony_ciCLK_OF_DECLARE(bcm21664_root_ccu, BCM21664_DT_ROOT_CCU_COMPAT, 27662306a36Sopenharmony_ci kona_dt_root_ccu_setup); 27762306a36Sopenharmony_ciCLK_OF_DECLARE(bcm21664_aon_ccu, BCM21664_DT_AON_CCU_COMPAT, 27862306a36Sopenharmony_ci kona_dt_aon_ccu_setup); 27962306a36Sopenharmony_ciCLK_OF_DECLARE(bcm21664_master_ccu, BCM21664_DT_MASTER_CCU_COMPAT, 28062306a36Sopenharmony_ci kona_dt_master_ccu_setup); 28162306a36Sopenharmony_ciCLK_OF_DECLARE(bcm21664_slave_ccu, BCM21664_DT_SLAVE_CCU_COMPAT, 28262306a36Sopenharmony_ci kona_dt_slave_ccu_setup); 283