162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (c) 2018-2021, The Linux Foundation. All rights reserved. 462306a36Sopenharmony_ci */ 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci#include <linux/clk-provider.h> 762306a36Sopenharmony_ci#include <linux/err.h> 862306a36Sopenharmony_ci#include <linux/kernel.h> 962306a36Sopenharmony_ci#include <linux/module.h> 1062306a36Sopenharmony_ci#include <linux/of.h> 1162306a36Sopenharmony_ci#include <linux/platform_device.h> 1262306a36Sopenharmony_ci#include <soc/qcom/cmd-db.h> 1362306a36Sopenharmony_ci#include <soc/qcom/rpmh.h> 1462306a36Sopenharmony_ci#include <soc/qcom/tcs.h> 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci#include <dt-bindings/clock/qcom,rpmh.h> 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci#define CLK_RPMH_ARC_EN_OFFSET 0 1962306a36Sopenharmony_ci#define CLK_RPMH_VRM_EN_OFFSET 4 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ci/** 2262306a36Sopenharmony_ci * struct bcm_db - Auxiliary data pertaining to each Bus Clock Manager(BCM) 2362306a36Sopenharmony_ci * @unit: divisor used to convert Hz value to an RPMh msg 2462306a36Sopenharmony_ci * @width: multiplier used to convert Hz value to an RPMh msg 2562306a36Sopenharmony_ci * @vcd: virtual clock domain that this bcm belongs to 2662306a36Sopenharmony_ci * @reserved: reserved to pad the struct 2762306a36Sopenharmony_ci */ 2862306a36Sopenharmony_cistruct bcm_db { 2962306a36Sopenharmony_ci __le32 unit; 3062306a36Sopenharmony_ci __le16 width; 3162306a36Sopenharmony_ci u8 vcd; 3262306a36Sopenharmony_ci u8 reserved; 3362306a36Sopenharmony_ci}; 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci/** 3662306a36Sopenharmony_ci * struct clk_rpmh - individual rpmh clock data structure 3762306a36Sopenharmony_ci * @hw: handle between common and hardware-specific interfaces 3862306a36Sopenharmony_ci * @res_name: resource name for the rpmh clock 3962306a36Sopenharmony_ci * @div: clock divider to compute the clock rate 4062306a36Sopenharmony_ci * @res_addr: base address of the rpmh resource within the RPMh 4162306a36Sopenharmony_ci * @res_on_val: rpmh clock enable value 4262306a36Sopenharmony_ci * @state: rpmh clock requested state 4362306a36Sopenharmony_ci * @aggr_state: rpmh clock aggregated state 4462306a36Sopenharmony_ci * @last_sent_aggr_state: rpmh clock last aggr state sent to RPMh 4562306a36Sopenharmony_ci * @valid_state_mask: mask to determine the state of the rpmh clock 4662306a36Sopenharmony_ci * @unit: divisor to convert rate to rpmh msg in magnitudes of Khz 4762306a36Sopenharmony_ci * @dev: device to which it is attached 4862306a36Sopenharmony_ci * @peer: pointer to the clock rpmh sibling 4962306a36Sopenharmony_ci */ 5062306a36Sopenharmony_cistruct clk_rpmh { 5162306a36Sopenharmony_ci struct clk_hw hw; 5262306a36Sopenharmony_ci const char *res_name; 5362306a36Sopenharmony_ci u8 div; 5462306a36Sopenharmony_ci u32 res_addr; 5562306a36Sopenharmony_ci u32 res_on_val; 5662306a36Sopenharmony_ci u32 state; 5762306a36Sopenharmony_ci u32 aggr_state; 5862306a36Sopenharmony_ci u32 last_sent_aggr_state; 5962306a36Sopenharmony_ci u32 valid_state_mask; 6062306a36Sopenharmony_ci u32 unit; 6162306a36Sopenharmony_ci struct device *dev; 6262306a36Sopenharmony_ci struct clk_rpmh *peer; 6362306a36Sopenharmony_ci}; 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_cistruct clk_rpmh_desc { 6662306a36Sopenharmony_ci struct clk_hw **clks; 6762306a36Sopenharmony_ci size_t num_clks; 6862306a36Sopenharmony_ci}; 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_cistatic DEFINE_MUTEX(rpmh_clk_lock); 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_ci#define __DEFINE_CLK_RPMH(_name, _clk_name, _res_name, \ 7362306a36Sopenharmony_ci _res_en_offset, _res_on, _div) \ 7462306a36Sopenharmony_ci static struct clk_rpmh clk_rpmh_##_clk_name##_ao; \ 7562306a36Sopenharmony_ci static struct clk_rpmh clk_rpmh_##_clk_name = { \ 7662306a36Sopenharmony_ci .res_name = _res_name, \ 7762306a36Sopenharmony_ci .res_addr = _res_en_offset, \ 7862306a36Sopenharmony_ci .res_on_val = _res_on, \ 7962306a36Sopenharmony_ci .div = _div, \ 8062306a36Sopenharmony_ci .peer = &clk_rpmh_##_clk_name##_ao, \ 8162306a36Sopenharmony_ci .valid_state_mask = (BIT(RPMH_WAKE_ONLY_STATE) | \ 8262306a36Sopenharmony_ci BIT(RPMH_ACTIVE_ONLY_STATE) | \ 8362306a36Sopenharmony_ci BIT(RPMH_SLEEP_STATE)), \ 8462306a36Sopenharmony_ci .hw.init = &(struct clk_init_data){ \ 8562306a36Sopenharmony_ci .ops = &clk_rpmh_ops, \ 8662306a36Sopenharmony_ci .name = #_name, \ 8762306a36Sopenharmony_ci .parent_data = &(const struct clk_parent_data){ \ 8862306a36Sopenharmony_ci .fw_name = "xo", \ 8962306a36Sopenharmony_ci .name = "xo_board", \ 9062306a36Sopenharmony_ci }, \ 9162306a36Sopenharmony_ci .num_parents = 1, \ 9262306a36Sopenharmony_ci }, \ 9362306a36Sopenharmony_ci }; \ 9462306a36Sopenharmony_ci static struct clk_rpmh clk_rpmh_##_clk_name##_ao= { \ 9562306a36Sopenharmony_ci .res_name = _res_name, \ 9662306a36Sopenharmony_ci .res_addr = _res_en_offset, \ 9762306a36Sopenharmony_ci .res_on_val = _res_on, \ 9862306a36Sopenharmony_ci .div = _div, \ 9962306a36Sopenharmony_ci .peer = &clk_rpmh_##_clk_name, \ 10062306a36Sopenharmony_ci .valid_state_mask = (BIT(RPMH_WAKE_ONLY_STATE) | \ 10162306a36Sopenharmony_ci BIT(RPMH_ACTIVE_ONLY_STATE)), \ 10262306a36Sopenharmony_ci .hw.init = &(struct clk_init_data){ \ 10362306a36Sopenharmony_ci .ops = &clk_rpmh_ops, \ 10462306a36Sopenharmony_ci .name = #_name "_ao", \ 10562306a36Sopenharmony_ci .parent_data = &(const struct clk_parent_data){ \ 10662306a36Sopenharmony_ci .fw_name = "xo", \ 10762306a36Sopenharmony_ci .name = "xo_board", \ 10862306a36Sopenharmony_ci }, \ 10962306a36Sopenharmony_ci .num_parents = 1, \ 11062306a36Sopenharmony_ci }, \ 11162306a36Sopenharmony_ci } 11262306a36Sopenharmony_ci 11362306a36Sopenharmony_ci#define DEFINE_CLK_RPMH_ARC(_name, _res_name, _res_on, _div) \ 11462306a36Sopenharmony_ci __DEFINE_CLK_RPMH(_name, _name##_##div##_div, _res_name, \ 11562306a36Sopenharmony_ci CLK_RPMH_ARC_EN_OFFSET, _res_on, _div) 11662306a36Sopenharmony_ci 11762306a36Sopenharmony_ci#define DEFINE_CLK_RPMH_VRM(_name, _suffix, _res_name, _div) \ 11862306a36Sopenharmony_ci __DEFINE_CLK_RPMH(_name, _name##_suffix, _res_name, \ 11962306a36Sopenharmony_ci CLK_RPMH_VRM_EN_OFFSET, 1, _div) 12062306a36Sopenharmony_ci 12162306a36Sopenharmony_ci#define DEFINE_CLK_RPMH_BCM(_name, _res_name) \ 12262306a36Sopenharmony_ci static struct clk_rpmh clk_rpmh_##_name = { \ 12362306a36Sopenharmony_ci .res_name = _res_name, \ 12462306a36Sopenharmony_ci .valid_state_mask = BIT(RPMH_ACTIVE_ONLY_STATE), \ 12562306a36Sopenharmony_ci .div = 1, \ 12662306a36Sopenharmony_ci .hw.init = &(struct clk_init_data){ \ 12762306a36Sopenharmony_ci .ops = &clk_rpmh_bcm_ops, \ 12862306a36Sopenharmony_ci .name = #_name, \ 12962306a36Sopenharmony_ci }, \ 13062306a36Sopenharmony_ci } 13162306a36Sopenharmony_ci 13262306a36Sopenharmony_cistatic inline struct clk_rpmh *to_clk_rpmh(struct clk_hw *_hw) 13362306a36Sopenharmony_ci{ 13462306a36Sopenharmony_ci return container_of(_hw, struct clk_rpmh, hw); 13562306a36Sopenharmony_ci} 13662306a36Sopenharmony_ci 13762306a36Sopenharmony_cistatic inline bool has_state_changed(struct clk_rpmh *c, u32 state) 13862306a36Sopenharmony_ci{ 13962306a36Sopenharmony_ci return (c->last_sent_aggr_state & BIT(state)) 14062306a36Sopenharmony_ci != (c->aggr_state & BIT(state)); 14162306a36Sopenharmony_ci} 14262306a36Sopenharmony_ci 14362306a36Sopenharmony_cistatic int clk_rpmh_send(struct clk_rpmh *c, enum rpmh_state state, 14462306a36Sopenharmony_ci struct tcs_cmd *cmd, bool wait) 14562306a36Sopenharmony_ci{ 14662306a36Sopenharmony_ci if (wait) 14762306a36Sopenharmony_ci return rpmh_write(c->dev, state, cmd, 1); 14862306a36Sopenharmony_ci 14962306a36Sopenharmony_ci return rpmh_write_async(c->dev, state, cmd, 1); 15062306a36Sopenharmony_ci} 15162306a36Sopenharmony_ci 15262306a36Sopenharmony_cistatic int clk_rpmh_send_aggregate_command(struct clk_rpmh *c) 15362306a36Sopenharmony_ci{ 15462306a36Sopenharmony_ci struct tcs_cmd cmd = { 0 }; 15562306a36Sopenharmony_ci u32 cmd_state, on_val; 15662306a36Sopenharmony_ci enum rpmh_state state = RPMH_SLEEP_STATE; 15762306a36Sopenharmony_ci int ret; 15862306a36Sopenharmony_ci bool wait; 15962306a36Sopenharmony_ci 16062306a36Sopenharmony_ci cmd.addr = c->res_addr; 16162306a36Sopenharmony_ci cmd_state = c->aggr_state; 16262306a36Sopenharmony_ci on_val = c->res_on_val; 16362306a36Sopenharmony_ci 16462306a36Sopenharmony_ci for (; state <= RPMH_ACTIVE_ONLY_STATE; state++) { 16562306a36Sopenharmony_ci if (has_state_changed(c, state)) { 16662306a36Sopenharmony_ci if (cmd_state & BIT(state)) 16762306a36Sopenharmony_ci cmd.data = on_val; 16862306a36Sopenharmony_ci 16962306a36Sopenharmony_ci wait = cmd_state && state == RPMH_ACTIVE_ONLY_STATE; 17062306a36Sopenharmony_ci ret = clk_rpmh_send(c, state, &cmd, wait); 17162306a36Sopenharmony_ci if (ret) { 17262306a36Sopenharmony_ci dev_err(c->dev, "set %s state of %s failed: (%d)\n", 17362306a36Sopenharmony_ci !state ? "sleep" : 17462306a36Sopenharmony_ci state == RPMH_WAKE_ONLY_STATE ? 17562306a36Sopenharmony_ci "wake" : "active", c->res_name, ret); 17662306a36Sopenharmony_ci return ret; 17762306a36Sopenharmony_ci } 17862306a36Sopenharmony_ci } 17962306a36Sopenharmony_ci } 18062306a36Sopenharmony_ci 18162306a36Sopenharmony_ci c->last_sent_aggr_state = c->aggr_state; 18262306a36Sopenharmony_ci c->peer->last_sent_aggr_state = c->last_sent_aggr_state; 18362306a36Sopenharmony_ci 18462306a36Sopenharmony_ci return 0; 18562306a36Sopenharmony_ci} 18662306a36Sopenharmony_ci 18762306a36Sopenharmony_ci/* 18862306a36Sopenharmony_ci * Update state and aggregate state values based on enable value. 18962306a36Sopenharmony_ci */ 19062306a36Sopenharmony_cistatic int clk_rpmh_aggregate_state_send_command(struct clk_rpmh *c, 19162306a36Sopenharmony_ci bool enable) 19262306a36Sopenharmony_ci{ 19362306a36Sopenharmony_ci int ret; 19462306a36Sopenharmony_ci 19562306a36Sopenharmony_ci c->state = enable ? c->valid_state_mask : 0; 19662306a36Sopenharmony_ci c->aggr_state = c->state | c->peer->state; 19762306a36Sopenharmony_ci c->peer->aggr_state = c->aggr_state; 19862306a36Sopenharmony_ci 19962306a36Sopenharmony_ci ret = clk_rpmh_send_aggregate_command(c); 20062306a36Sopenharmony_ci if (!ret) 20162306a36Sopenharmony_ci return 0; 20262306a36Sopenharmony_ci 20362306a36Sopenharmony_ci if (ret && enable) 20462306a36Sopenharmony_ci c->state = 0; 20562306a36Sopenharmony_ci else if (ret) 20662306a36Sopenharmony_ci c->state = c->valid_state_mask; 20762306a36Sopenharmony_ci 20862306a36Sopenharmony_ci WARN(1, "clk: %s failed to %s\n", c->res_name, 20962306a36Sopenharmony_ci enable ? "enable" : "disable"); 21062306a36Sopenharmony_ci return ret; 21162306a36Sopenharmony_ci} 21262306a36Sopenharmony_ci 21362306a36Sopenharmony_cistatic int clk_rpmh_prepare(struct clk_hw *hw) 21462306a36Sopenharmony_ci{ 21562306a36Sopenharmony_ci struct clk_rpmh *c = to_clk_rpmh(hw); 21662306a36Sopenharmony_ci int ret = 0; 21762306a36Sopenharmony_ci 21862306a36Sopenharmony_ci mutex_lock(&rpmh_clk_lock); 21962306a36Sopenharmony_ci ret = clk_rpmh_aggregate_state_send_command(c, true); 22062306a36Sopenharmony_ci mutex_unlock(&rpmh_clk_lock); 22162306a36Sopenharmony_ci 22262306a36Sopenharmony_ci return ret; 22362306a36Sopenharmony_ci} 22462306a36Sopenharmony_ci 22562306a36Sopenharmony_cistatic void clk_rpmh_unprepare(struct clk_hw *hw) 22662306a36Sopenharmony_ci{ 22762306a36Sopenharmony_ci struct clk_rpmh *c = to_clk_rpmh(hw); 22862306a36Sopenharmony_ci 22962306a36Sopenharmony_ci mutex_lock(&rpmh_clk_lock); 23062306a36Sopenharmony_ci clk_rpmh_aggregate_state_send_command(c, false); 23162306a36Sopenharmony_ci mutex_unlock(&rpmh_clk_lock); 23262306a36Sopenharmony_ci}; 23362306a36Sopenharmony_ci 23462306a36Sopenharmony_cistatic unsigned long clk_rpmh_recalc_rate(struct clk_hw *hw, 23562306a36Sopenharmony_ci unsigned long prate) 23662306a36Sopenharmony_ci{ 23762306a36Sopenharmony_ci struct clk_rpmh *r = to_clk_rpmh(hw); 23862306a36Sopenharmony_ci 23962306a36Sopenharmony_ci /* 24062306a36Sopenharmony_ci * RPMh clocks have a fixed rate. Return static rate. 24162306a36Sopenharmony_ci */ 24262306a36Sopenharmony_ci return prate / r->div; 24362306a36Sopenharmony_ci} 24462306a36Sopenharmony_ci 24562306a36Sopenharmony_cistatic const struct clk_ops clk_rpmh_ops = { 24662306a36Sopenharmony_ci .prepare = clk_rpmh_prepare, 24762306a36Sopenharmony_ci .unprepare = clk_rpmh_unprepare, 24862306a36Sopenharmony_ci .recalc_rate = clk_rpmh_recalc_rate, 24962306a36Sopenharmony_ci}; 25062306a36Sopenharmony_ci 25162306a36Sopenharmony_cistatic int clk_rpmh_bcm_send_cmd(struct clk_rpmh *c, bool enable) 25262306a36Sopenharmony_ci{ 25362306a36Sopenharmony_ci struct tcs_cmd cmd = { 0 }; 25462306a36Sopenharmony_ci u32 cmd_state; 25562306a36Sopenharmony_ci int ret = 0; 25662306a36Sopenharmony_ci 25762306a36Sopenharmony_ci mutex_lock(&rpmh_clk_lock); 25862306a36Sopenharmony_ci if (enable) { 25962306a36Sopenharmony_ci cmd_state = 1; 26062306a36Sopenharmony_ci if (c->aggr_state) 26162306a36Sopenharmony_ci cmd_state = c->aggr_state; 26262306a36Sopenharmony_ci } else { 26362306a36Sopenharmony_ci cmd_state = 0; 26462306a36Sopenharmony_ci } 26562306a36Sopenharmony_ci 26662306a36Sopenharmony_ci if (c->last_sent_aggr_state != cmd_state) { 26762306a36Sopenharmony_ci cmd.addr = c->res_addr; 26862306a36Sopenharmony_ci cmd.data = BCM_TCS_CMD(1, enable, 0, cmd_state); 26962306a36Sopenharmony_ci 27062306a36Sopenharmony_ci /* 27162306a36Sopenharmony_ci * Send only an active only state request. RPMh continues to 27262306a36Sopenharmony_ci * use the active state when we're in sleep/wake state as long 27362306a36Sopenharmony_ci * as the sleep/wake state has never been set. 27462306a36Sopenharmony_ci */ 27562306a36Sopenharmony_ci ret = clk_rpmh_send(c, RPMH_ACTIVE_ONLY_STATE, &cmd, enable); 27662306a36Sopenharmony_ci if (ret) { 27762306a36Sopenharmony_ci dev_err(c->dev, "set active state of %s failed: (%d)\n", 27862306a36Sopenharmony_ci c->res_name, ret); 27962306a36Sopenharmony_ci } else { 28062306a36Sopenharmony_ci c->last_sent_aggr_state = cmd_state; 28162306a36Sopenharmony_ci } 28262306a36Sopenharmony_ci } 28362306a36Sopenharmony_ci 28462306a36Sopenharmony_ci mutex_unlock(&rpmh_clk_lock); 28562306a36Sopenharmony_ci 28662306a36Sopenharmony_ci return ret; 28762306a36Sopenharmony_ci} 28862306a36Sopenharmony_ci 28962306a36Sopenharmony_cistatic int clk_rpmh_bcm_prepare(struct clk_hw *hw) 29062306a36Sopenharmony_ci{ 29162306a36Sopenharmony_ci struct clk_rpmh *c = to_clk_rpmh(hw); 29262306a36Sopenharmony_ci 29362306a36Sopenharmony_ci return clk_rpmh_bcm_send_cmd(c, true); 29462306a36Sopenharmony_ci} 29562306a36Sopenharmony_ci 29662306a36Sopenharmony_cistatic void clk_rpmh_bcm_unprepare(struct clk_hw *hw) 29762306a36Sopenharmony_ci{ 29862306a36Sopenharmony_ci struct clk_rpmh *c = to_clk_rpmh(hw); 29962306a36Sopenharmony_ci 30062306a36Sopenharmony_ci clk_rpmh_bcm_send_cmd(c, false); 30162306a36Sopenharmony_ci} 30262306a36Sopenharmony_ci 30362306a36Sopenharmony_cistatic int clk_rpmh_bcm_set_rate(struct clk_hw *hw, unsigned long rate, 30462306a36Sopenharmony_ci unsigned long parent_rate) 30562306a36Sopenharmony_ci{ 30662306a36Sopenharmony_ci struct clk_rpmh *c = to_clk_rpmh(hw); 30762306a36Sopenharmony_ci 30862306a36Sopenharmony_ci c->aggr_state = rate / c->unit; 30962306a36Sopenharmony_ci /* 31062306a36Sopenharmony_ci * Since any non-zero value sent to hw would result in enabling the 31162306a36Sopenharmony_ci * clock, only send the value if the clock has already been prepared. 31262306a36Sopenharmony_ci */ 31362306a36Sopenharmony_ci if (clk_hw_is_prepared(hw)) 31462306a36Sopenharmony_ci clk_rpmh_bcm_send_cmd(c, true); 31562306a36Sopenharmony_ci 31662306a36Sopenharmony_ci return 0; 31762306a36Sopenharmony_ci} 31862306a36Sopenharmony_ci 31962306a36Sopenharmony_cistatic long clk_rpmh_round_rate(struct clk_hw *hw, unsigned long rate, 32062306a36Sopenharmony_ci unsigned long *parent_rate) 32162306a36Sopenharmony_ci{ 32262306a36Sopenharmony_ci return rate; 32362306a36Sopenharmony_ci} 32462306a36Sopenharmony_ci 32562306a36Sopenharmony_cistatic unsigned long clk_rpmh_bcm_recalc_rate(struct clk_hw *hw, 32662306a36Sopenharmony_ci unsigned long prate) 32762306a36Sopenharmony_ci{ 32862306a36Sopenharmony_ci struct clk_rpmh *c = to_clk_rpmh(hw); 32962306a36Sopenharmony_ci 33062306a36Sopenharmony_ci return c->aggr_state * c->unit; 33162306a36Sopenharmony_ci} 33262306a36Sopenharmony_ci 33362306a36Sopenharmony_cistatic const struct clk_ops clk_rpmh_bcm_ops = { 33462306a36Sopenharmony_ci .prepare = clk_rpmh_bcm_prepare, 33562306a36Sopenharmony_ci .unprepare = clk_rpmh_bcm_unprepare, 33662306a36Sopenharmony_ci .set_rate = clk_rpmh_bcm_set_rate, 33762306a36Sopenharmony_ci .round_rate = clk_rpmh_round_rate, 33862306a36Sopenharmony_ci .recalc_rate = clk_rpmh_bcm_recalc_rate, 33962306a36Sopenharmony_ci}; 34062306a36Sopenharmony_ci 34162306a36Sopenharmony_ci/* Resource name must match resource id present in cmd-db */ 34262306a36Sopenharmony_ciDEFINE_CLK_RPMH_ARC(bi_tcxo, "xo.lvl", 0x3, 1); 34362306a36Sopenharmony_ciDEFINE_CLK_RPMH_ARC(bi_tcxo, "xo.lvl", 0x3, 2); 34462306a36Sopenharmony_ciDEFINE_CLK_RPMH_ARC(bi_tcxo, "xo.lvl", 0x3, 4); 34562306a36Sopenharmony_ciDEFINE_CLK_RPMH_ARC(qlink, "qphy.lvl", 0x1, 4); 34662306a36Sopenharmony_ci 34762306a36Sopenharmony_ciDEFINE_CLK_RPMH_VRM(ln_bb_clk1, _a2, "lnbclka1", 2); 34862306a36Sopenharmony_ciDEFINE_CLK_RPMH_VRM(ln_bb_clk2, _a2, "lnbclka2", 2); 34962306a36Sopenharmony_ciDEFINE_CLK_RPMH_VRM(ln_bb_clk3, _a2, "lnbclka3", 2); 35062306a36Sopenharmony_ci 35162306a36Sopenharmony_ciDEFINE_CLK_RPMH_VRM(ln_bb_clk1, _a4, "lnbclka1", 4); 35262306a36Sopenharmony_ciDEFINE_CLK_RPMH_VRM(ln_bb_clk2, _a4, "lnbclka2", 4); 35362306a36Sopenharmony_ci 35462306a36Sopenharmony_ciDEFINE_CLK_RPMH_VRM(ln_bb_clk2, _g4, "lnbclkg2", 4); 35562306a36Sopenharmony_ciDEFINE_CLK_RPMH_VRM(ln_bb_clk3, _g4, "lnbclkg3", 4); 35662306a36Sopenharmony_ci 35762306a36Sopenharmony_ciDEFINE_CLK_RPMH_VRM(rf_clk1, _a, "rfclka1", 1); 35862306a36Sopenharmony_ciDEFINE_CLK_RPMH_VRM(rf_clk2, _a, "rfclka2", 1); 35962306a36Sopenharmony_ciDEFINE_CLK_RPMH_VRM(rf_clk3, _a, "rfclka3", 1); 36062306a36Sopenharmony_ciDEFINE_CLK_RPMH_VRM(rf_clk4, _a, "rfclka4", 1); 36162306a36Sopenharmony_ciDEFINE_CLK_RPMH_VRM(rf_clk5, _a, "rfclka5", 1); 36262306a36Sopenharmony_ci 36362306a36Sopenharmony_ciDEFINE_CLK_RPMH_VRM(rf_clk1, _d, "rfclkd1", 1); 36462306a36Sopenharmony_ciDEFINE_CLK_RPMH_VRM(rf_clk2, _d, "rfclkd2", 1); 36562306a36Sopenharmony_ciDEFINE_CLK_RPMH_VRM(rf_clk3, _d, "rfclkd3", 1); 36662306a36Sopenharmony_ciDEFINE_CLK_RPMH_VRM(rf_clk4, _d, "rfclkd4", 1); 36762306a36Sopenharmony_ci 36862306a36Sopenharmony_ciDEFINE_CLK_RPMH_VRM(clk1, _a1, "clka1", 1); 36962306a36Sopenharmony_ciDEFINE_CLK_RPMH_VRM(clk2, _a1, "clka2", 1); 37062306a36Sopenharmony_ciDEFINE_CLK_RPMH_VRM(clk3, _a1, "clka3", 1); 37162306a36Sopenharmony_ciDEFINE_CLK_RPMH_VRM(clk4, _a1, "clka4", 1); 37262306a36Sopenharmony_ciDEFINE_CLK_RPMH_VRM(clk5, _a1, "clka5", 1); 37362306a36Sopenharmony_ci 37462306a36Sopenharmony_ciDEFINE_CLK_RPMH_VRM(clk6, _a2, "clka6", 2); 37562306a36Sopenharmony_ciDEFINE_CLK_RPMH_VRM(clk7, _a2, "clka7", 2); 37662306a36Sopenharmony_ciDEFINE_CLK_RPMH_VRM(clk8, _a2, "clka8", 2); 37762306a36Sopenharmony_ci 37862306a36Sopenharmony_ciDEFINE_CLK_RPMH_VRM(div_clk1, _div2, "divclka1", 2); 37962306a36Sopenharmony_ci 38062306a36Sopenharmony_ciDEFINE_CLK_RPMH_BCM(ce, "CE0"); 38162306a36Sopenharmony_ciDEFINE_CLK_RPMH_BCM(hwkm, "HK0"); 38262306a36Sopenharmony_ciDEFINE_CLK_RPMH_BCM(ipa, "IP0"); 38362306a36Sopenharmony_ciDEFINE_CLK_RPMH_BCM(pka, "PKA0"); 38462306a36Sopenharmony_ciDEFINE_CLK_RPMH_BCM(qpic_clk, "QP0"); 38562306a36Sopenharmony_ci 38662306a36Sopenharmony_cistatic struct clk_hw *sdm845_rpmh_clocks[] = { 38762306a36Sopenharmony_ci [RPMH_CXO_CLK] = &clk_rpmh_bi_tcxo_div2.hw, 38862306a36Sopenharmony_ci [RPMH_CXO_CLK_A] = &clk_rpmh_bi_tcxo_div2_ao.hw, 38962306a36Sopenharmony_ci [RPMH_LN_BB_CLK2] = &clk_rpmh_ln_bb_clk2_a2.hw, 39062306a36Sopenharmony_ci [RPMH_LN_BB_CLK2_A] = &clk_rpmh_ln_bb_clk2_a2_ao.hw, 39162306a36Sopenharmony_ci [RPMH_LN_BB_CLK3] = &clk_rpmh_ln_bb_clk3_a2.hw, 39262306a36Sopenharmony_ci [RPMH_LN_BB_CLK3_A] = &clk_rpmh_ln_bb_clk3_a2_ao.hw, 39362306a36Sopenharmony_ci [RPMH_RF_CLK1] = &clk_rpmh_rf_clk1_a.hw, 39462306a36Sopenharmony_ci [RPMH_RF_CLK1_A] = &clk_rpmh_rf_clk1_a_ao.hw, 39562306a36Sopenharmony_ci [RPMH_RF_CLK2] = &clk_rpmh_rf_clk2_a.hw, 39662306a36Sopenharmony_ci [RPMH_RF_CLK2_A] = &clk_rpmh_rf_clk2_a_ao.hw, 39762306a36Sopenharmony_ci [RPMH_RF_CLK3] = &clk_rpmh_rf_clk3_a.hw, 39862306a36Sopenharmony_ci [RPMH_RF_CLK3_A] = &clk_rpmh_rf_clk3_a_ao.hw, 39962306a36Sopenharmony_ci [RPMH_IPA_CLK] = &clk_rpmh_ipa.hw, 40062306a36Sopenharmony_ci [RPMH_CE_CLK] = &clk_rpmh_ce.hw, 40162306a36Sopenharmony_ci}; 40262306a36Sopenharmony_ci 40362306a36Sopenharmony_cistatic const struct clk_rpmh_desc clk_rpmh_sdm845 = { 40462306a36Sopenharmony_ci .clks = sdm845_rpmh_clocks, 40562306a36Sopenharmony_ci .num_clks = ARRAY_SIZE(sdm845_rpmh_clocks), 40662306a36Sopenharmony_ci}; 40762306a36Sopenharmony_ci 40862306a36Sopenharmony_cistatic struct clk_hw *sa8775p_rpmh_clocks[] = { 40962306a36Sopenharmony_ci [RPMH_CXO_CLK] = &clk_rpmh_bi_tcxo_div2.hw, 41062306a36Sopenharmony_ci [RPMH_CXO_CLK_A] = &clk_rpmh_bi_tcxo_div2_ao.hw, 41162306a36Sopenharmony_ci [RPMH_LN_BB_CLK1] = &clk_rpmh_ln_bb_clk1_a2.hw, 41262306a36Sopenharmony_ci [RPMH_LN_BB_CLK2] = &clk_rpmh_ln_bb_clk2_a2.hw, 41362306a36Sopenharmony_ci [RPMH_LN_BB_CLK2_A] = &clk_rpmh_ln_bb_clk2_a4_ao.hw, 41462306a36Sopenharmony_ci [RPMH_IPA_CLK] = &clk_rpmh_ipa.hw, 41562306a36Sopenharmony_ci [RPMH_PKA_CLK] = &clk_rpmh_pka.hw, 41662306a36Sopenharmony_ci [RPMH_HWKM_CLK] = &clk_rpmh_hwkm.hw, 41762306a36Sopenharmony_ci}; 41862306a36Sopenharmony_ci 41962306a36Sopenharmony_cistatic const struct clk_rpmh_desc clk_rpmh_sa8775p = { 42062306a36Sopenharmony_ci .clks = sa8775p_rpmh_clocks, 42162306a36Sopenharmony_ci .num_clks = ARRAY_SIZE(sa8775p_rpmh_clocks), 42262306a36Sopenharmony_ci}; 42362306a36Sopenharmony_ci 42462306a36Sopenharmony_cistatic struct clk_hw *sdm670_rpmh_clocks[] = { 42562306a36Sopenharmony_ci [RPMH_CXO_CLK] = &clk_rpmh_bi_tcxo_div2.hw, 42662306a36Sopenharmony_ci [RPMH_CXO_CLK_A] = &clk_rpmh_bi_tcxo_div2_ao.hw, 42762306a36Sopenharmony_ci [RPMH_LN_BB_CLK2] = &clk_rpmh_ln_bb_clk2_a2.hw, 42862306a36Sopenharmony_ci [RPMH_LN_BB_CLK2_A] = &clk_rpmh_ln_bb_clk2_a2_ao.hw, 42962306a36Sopenharmony_ci [RPMH_LN_BB_CLK3] = &clk_rpmh_ln_bb_clk3_a2.hw, 43062306a36Sopenharmony_ci [RPMH_LN_BB_CLK3_A] = &clk_rpmh_ln_bb_clk3_a2_ao.hw, 43162306a36Sopenharmony_ci [RPMH_RF_CLK1] = &clk_rpmh_rf_clk1_a.hw, 43262306a36Sopenharmony_ci [RPMH_RF_CLK1_A] = &clk_rpmh_rf_clk1_a_ao.hw, 43362306a36Sopenharmony_ci [RPMH_RF_CLK2] = &clk_rpmh_rf_clk2_a.hw, 43462306a36Sopenharmony_ci [RPMH_RF_CLK2_A] = &clk_rpmh_rf_clk2_a_ao.hw, 43562306a36Sopenharmony_ci [RPMH_IPA_CLK] = &clk_rpmh_ipa.hw, 43662306a36Sopenharmony_ci [RPMH_CE_CLK] = &clk_rpmh_ce.hw, 43762306a36Sopenharmony_ci}; 43862306a36Sopenharmony_ci 43962306a36Sopenharmony_cistatic const struct clk_rpmh_desc clk_rpmh_sdm670 = { 44062306a36Sopenharmony_ci .clks = sdm670_rpmh_clocks, 44162306a36Sopenharmony_ci .num_clks = ARRAY_SIZE(sdm670_rpmh_clocks), 44262306a36Sopenharmony_ci}; 44362306a36Sopenharmony_ci 44462306a36Sopenharmony_cistatic struct clk_hw *sdx55_rpmh_clocks[] = { 44562306a36Sopenharmony_ci [RPMH_CXO_CLK] = &clk_rpmh_bi_tcxo_div2.hw, 44662306a36Sopenharmony_ci [RPMH_CXO_CLK_A] = &clk_rpmh_bi_tcxo_div2_ao.hw, 44762306a36Sopenharmony_ci [RPMH_RF_CLK1] = &clk_rpmh_rf_clk1_d.hw, 44862306a36Sopenharmony_ci [RPMH_RF_CLK1_A] = &clk_rpmh_rf_clk1_d_ao.hw, 44962306a36Sopenharmony_ci [RPMH_RF_CLK2] = &clk_rpmh_rf_clk2_d.hw, 45062306a36Sopenharmony_ci [RPMH_RF_CLK2_A] = &clk_rpmh_rf_clk2_d_ao.hw, 45162306a36Sopenharmony_ci [RPMH_QPIC_CLK] = &clk_rpmh_qpic_clk.hw, 45262306a36Sopenharmony_ci [RPMH_IPA_CLK] = &clk_rpmh_ipa.hw, 45362306a36Sopenharmony_ci}; 45462306a36Sopenharmony_ci 45562306a36Sopenharmony_cistatic const struct clk_rpmh_desc clk_rpmh_sdx55 = { 45662306a36Sopenharmony_ci .clks = sdx55_rpmh_clocks, 45762306a36Sopenharmony_ci .num_clks = ARRAY_SIZE(sdx55_rpmh_clocks), 45862306a36Sopenharmony_ci}; 45962306a36Sopenharmony_ci 46062306a36Sopenharmony_cistatic struct clk_hw *sm8150_rpmh_clocks[] = { 46162306a36Sopenharmony_ci [RPMH_CXO_CLK] = &clk_rpmh_bi_tcxo_div2.hw, 46262306a36Sopenharmony_ci [RPMH_CXO_CLK_A] = &clk_rpmh_bi_tcxo_div2_ao.hw, 46362306a36Sopenharmony_ci [RPMH_LN_BB_CLK2] = &clk_rpmh_ln_bb_clk2_a2.hw, 46462306a36Sopenharmony_ci [RPMH_LN_BB_CLK2_A] = &clk_rpmh_ln_bb_clk2_a2_ao.hw, 46562306a36Sopenharmony_ci [RPMH_LN_BB_CLK3] = &clk_rpmh_ln_bb_clk3_a2.hw, 46662306a36Sopenharmony_ci [RPMH_LN_BB_CLK3_A] = &clk_rpmh_ln_bb_clk3_a2_ao.hw, 46762306a36Sopenharmony_ci [RPMH_RF_CLK1] = &clk_rpmh_rf_clk1_a.hw, 46862306a36Sopenharmony_ci [RPMH_RF_CLK1_A] = &clk_rpmh_rf_clk1_a_ao.hw, 46962306a36Sopenharmony_ci [RPMH_RF_CLK2] = &clk_rpmh_rf_clk2_a.hw, 47062306a36Sopenharmony_ci [RPMH_RF_CLK2_A] = &clk_rpmh_rf_clk2_a_ao.hw, 47162306a36Sopenharmony_ci [RPMH_RF_CLK3] = &clk_rpmh_rf_clk3_a.hw, 47262306a36Sopenharmony_ci [RPMH_RF_CLK3_A] = &clk_rpmh_rf_clk3_a_ao.hw, 47362306a36Sopenharmony_ci [RPMH_IPA_CLK] = &clk_rpmh_ipa.hw, 47462306a36Sopenharmony_ci}; 47562306a36Sopenharmony_ci 47662306a36Sopenharmony_cistatic const struct clk_rpmh_desc clk_rpmh_sm8150 = { 47762306a36Sopenharmony_ci .clks = sm8150_rpmh_clocks, 47862306a36Sopenharmony_ci .num_clks = ARRAY_SIZE(sm8150_rpmh_clocks), 47962306a36Sopenharmony_ci}; 48062306a36Sopenharmony_ci 48162306a36Sopenharmony_cistatic struct clk_hw *sc7180_rpmh_clocks[] = { 48262306a36Sopenharmony_ci [RPMH_CXO_CLK] = &clk_rpmh_bi_tcxo_div2.hw, 48362306a36Sopenharmony_ci [RPMH_CXO_CLK_A] = &clk_rpmh_bi_tcxo_div2_ao.hw, 48462306a36Sopenharmony_ci [RPMH_LN_BB_CLK2] = &clk_rpmh_ln_bb_clk2_a2.hw, 48562306a36Sopenharmony_ci [RPMH_LN_BB_CLK2_A] = &clk_rpmh_ln_bb_clk2_a2_ao.hw, 48662306a36Sopenharmony_ci [RPMH_LN_BB_CLK3] = &clk_rpmh_ln_bb_clk3_a2.hw, 48762306a36Sopenharmony_ci [RPMH_LN_BB_CLK3_A] = &clk_rpmh_ln_bb_clk3_a2_ao.hw, 48862306a36Sopenharmony_ci [RPMH_RF_CLK1] = &clk_rpmh_rf_clk1_a.hw, 48962306a36Sopenharmony_ci [RPMH_RF_CLK1_A] = &clk_rpmh_rf_clk1_a_ao.hw, 49062306a36Sopenharmony_ci [RPMH_RF_CLK2] = &clk_rpmh_rf_clk2_a.hw, 49162306a36Sopenharmony_ci [RPMH_RF_CLK2_A] = &clk_rpmh_rf_clk2_a_ao.hw, 49262306a36Sopenharmony_ci [RPMH_IPA_CLK] = &clk_rpmh_ipa.hw, 49362306a36Sopenharmony_ci}; 49462306a36Sopenharmony_ci 49562306a36Sopenharmony_cistatic const struct clk_rpmh_desc clk_rpmh_sc7180 = { 49662306a36Sopenharmony_ci .clks = sc7180_rpmh_clocks, 49762306a36Sopenharmony_ci .num_clks = ARRAY_SIZE(sc7180_rpmh_clocks), 49862306a36Sopenharmony_ci}; 49962306a36Sopenharmony_ci 50062306a36Sopenharmony_cistatic struct clk_hw *sc8180x_rpmh_clocks[] = { 50162306a36Sopenharmony_ci [RPMH_CXO_CLK] = &clk_rpmh_bi_tcxo_div2.hw, 50262306a36Sopenharmony_ci [RPMH_CXO_CLK_A] = &clk_rpmh_bi_tcxo_div2_ao.hw, 50362306a36Sopenharmony_ci [RPMH_LN_BB_CLK2] = &clk_rpmh_ln_bb_clk2_a2.hw, 50462306a36Sopenharmony_ci [RPMH_LN_BB_CLK2_A] = &clk_rpmh_ln_bb_clk2_a2_ao.hw, 50562306a36Sopenharmony_ci [RPMH_LN_BB_CLK3] = &clk_rpmh_ln_bb_clk3_a2.hw, 50662306a36Sopenharmony_ci [RPMH_LN_BB_CLK3_A] = &clk_rpmh_ln_bb_clk3_a2_ao.hw, 50762306a36Sopenharmony_ci [RPMH_RF_CLK1] = &clk_rpmh_rf_clk1_d.hw, 50862306a36Sopenharmony_ci [RPMH_RF_CLK1_A] = &clk_rpmh_rf_clk1_d_ao.hw, 50962306a36Sopenharmony_ci [RPMH_RF_CLK2] = &clk_rpmh_rf_clk2_d.hw, 51062306a36Sopenharmony_ci [RPMH_RF_CLK2_A] = &clk_rpmh_rf_clk2_d_ao.hw, 51162306a36Sopenharmony_ci [RPMH_RF_CLK3] = &clk_rpmh_rf_clk3_d.hw, 51262306a36Sopenharmony_ci [RPMH_RF_CLK3_A] = &clk_rpmh_rf_clk3_d_ao.hw, 51362306a36Sopenharmony_ci [RPMH_IPA_CLK] = &clk_rpmh_ipa.hw, 51462306a36Sopenharmony_ci}; 51562306a36Sopenharmony_ci 51662306a36Sopenharmony_cistatic const struct clk_rpmh_desc clk_rpmh_sc8180x = { 51762306a36Sopenharmony_ci .clks = sc8180x_rpmh_clocks, 51862306a36Sopenharmony_ci .num_clks = ARRAY_SIZE(sc8180x_rpmh_clocks), 51962306a36Sopenharmony_ci}; 52062306a36Sopenharmony_ci 52162306a36Sopenharmony_cistatic struct clk_hw *sm8250_rpmh_clocks[] = { 52262306a36Sopenharmony_ci [RPMH_CXO_CLK] = &clk_rpmh_bi_tcxo_div2.hw, 52362306a36Sopenharmony_ci [RPMH_CXO_CLK_A] = &clk_rpmh_bi_tcxo_div2_ao.hw, 52462306a36Sopenharmony_ci [RPMH_LN_BB_CLK1] = &clk_rpmh_ln_bb_clk1_a2.hw, 52562306a36Sopenharmony_ci [RPMH_LN_BB_CLK1_A] = &clk_rpmh_ln_bb_clk1_a2_ao.hw, 52662306a36Sopenharmony_ci [RPMH_LN_BB_CLK2] = &clk_rpmh_ln_bb_clk2_a2.hw, 52762306a36Sopenharmony_ci [RPMH_LN_BB_CLK2_A] = &clk_rpmh_ln_bb_clk2_a2_ao.hw, 52862306a36Sopenharmony_ci [RPMH_LN_BB_CLK3] = &clk_rpmh_ln_bb_clk3_a2.hw, 52962306a36Sopenharmony_ci [RPMH_LN_BB_CLK3_A] = &clk_rpmh_ln_bb_clk3_a2_ao.hw, 53062306a36Sopenharmony_ci [RPMH_RF_CLK1] = &clk_rpmh_rf_clk1_a.hw, 53162306a36Sopenharmony_ci [RPMH_RF_CLK1_A] = &clk_rpmh_rf_clk1_a_ao.hw, 53262306a36Sopenharmony_ci [RPMH_RF_CLK3] = &clk_rpmh_rf_clk3_a.hw, 53362306a36Sopenharmony_ci [RPMH_RF_CLK3_A] = &clk_rpmh_rf_clk3_a_ao.hw, 53462306a36Sopenharmony_ci [RPMH_IPA_CLK] = &clk_rpmh_ipa.hw, 53562306a36Sopenharmony_ci}; 53662306a36Sopenharmony_ci 53762306a36Sopenharmony_cistatic const struct clk_rpmh_desc clk_rpmh_sm8250 = { 53862306a36Sopenharmony_ci .clks = sm8250_rpmh_clocks, 53962306a36Sopenharmony_ci .num_clks = ARRAY_SIZE(sm8250_rpmh_clocks), 54062306a36Sopenharmony_ci}; 54162306a36Sopenharmony_ci 54262306a36Sopenharmony_cistatic struct clk_hw *sm8350_rpmh_clocks[] = { 54362306a36Sopenharmony_ci [RPMH_CXO_CLK] = &clk_rpmh_bi_tcxo_div2.hw, 54462306a36Sopenharmony_ci [RPMH_CXO_CLK_A] = &clk_rpmh_bi_tcxo_div2_ao.hw, 54562306a36Sopenharmony_ci [RPMH_DIV_CLK1] = &clk_rpmh_div_clk1_div2.hw, 54662306a36Sopenharmony_ci [RPMH_DIV_CLK1_A] = &clk_rpmh_div_clk1_div2_ao.hw, 54762306a36Sopenharmony_ci [RPMH_LN_BB_CLK1] = &clk_rpmh_ln_bb_clk1_a2.hw, 54862306a36Sopenharmony_ci [RPMH_LN_BB_CLK1_A] = &clk_rpmh_ln_bb_clk1_a2_ao.hw, 54962306a36Sopenharmony_ci [RPMH_LN_BB_CLK2] = &clk_rpmh_ln_bb_clk2_a2.hw, 55062306a36Sopenharmony_ci [RPMH_LN_BB_CLK2_A] = &clk_rpmh_ln_bb_clk2_a2_ao.hw, 55162306a36Sopenharmony_ci [RPMH_RF_CLK1] = &clk_rpmh_rf_clk1_a.hw, 55262306a36Sopenharmony_ci [RPMH_RF_CLK1_A] = &clk_rpmh_rf_clk1_a_ao.hw, 55362306a36Sopenharmony_ci [RPMH_RF_CLK3] = &clk_rpmh_rf_clk3_a.hw, 55462306a36Sopenharmony_ci [RPMH_RF_CLK3_A] = &clk_rpmh_rf_clk3_a_ao.hw, 55562306a36Sopenharmony_ci [RPMH_RF_CLK4] = &clk_rpmh_rf_clk4_a.hw, 55662306a36Sopenharmony_ci [RPMH_RF_CLK4_A] = &clk_rpmh_rf_clk4_a_ao.hw, 55762306a36Sopenharmony_ci [RPMH_RF_CLK5] = &clk_rpmh_rf_clk5_a.hw, 55862306a36Sopenharmony_ci [RPMH_RF_CLK5_A] = &clk_rpmh_rf_clk5_a_ao.hw, 55962306a36Sopenharmony_ci [RPMH_IPA_CLK] = &clk_rpmh_ipa.hw, 56062306a36Sopenharmony_ci [RPMH_PKA_CLK] = &clk_rpmh_pka.hw, 56162306a36Sopenharmony_ci [RPMH_HWKM_CLK] = &clk_rpmh_hwkm.hw, 56262306a36Sopenharmony_ci}; 56362306a36Sopenharmony_ci 56462306a36Sopenharmony_cistatic const struct clk_rpmh_desc clk_rpmh_sm8350 = { 56562306a36Sopenharmony_ci .clks = sm8350_rpmh_clocks, 56662306a36Sopenharmony_ci .num_clks = ARRAY_SIZE(sm8350_rpmh_clocks), 56762306a36Sopenharmony_ci}; 56862306a36Sopenharmony_ci 56962306a36Sopenharmony_cistatic struct clk_hw *sc8280xp_rpmh_clocks[] = { 57062306a36Sopenharmony_ci [RPMH_CXO_CLK] = &clk_rpmh_bi_tcxo_div2.hw, 57162306a36Sopenharmony_ci [RPMH_CXO_CLK_A] = &clk_rpmh_bi_tcxo_div2_ao.hw, 57262306a36Sopenharmony_ci [RPMH_LN_BB_CLK3] = &clk_rpmh_ln_bb_clk3_a2.hw, 57362306a36Sopenharmony_ci [RPMH_LN_BB_CLK3_A] = &clk_rpmh_ln_bb_clk3_a2_ao.hw, 57462306a36Sopenharmony_ci [RPMH_IPA_CLK] = &clk_rpmh_ipa.hw, 57562306a36Sopenharmony_ci [RPMH_PKA_CLK] = &clk_rpmh_pka.hw, 57662306a36Sopenharmony_ci [RPMH_HWKM_CLK] = &clk_rpmh_hwkm.hw, 57762306a36Sopenharmony_ci}; 57862306a36Sopenharmony_ci 57962306a36Sopenharmony_cistatic const struct clk_rpmh_desc clk_rpmh_sc8280xp = { 58062306a36Sopenharmony_ci .clks = sc8280xp_rpmh_clocks, 58162306a36Sopenharmony_ci .num_clks = ARRAY_SIZE(sc8280xp_rpmh_clocks), 58262306a36Sopenharmony_ci}; 58362306a36Sopenharmony_ci 58462306a36Sopenharmony_cistatic struct clk_hw *sm8450_rpmh_clocks[] = { 58562306a36Sopenharmony_ci [RPMH_CXO_CLK] = &clk_rpmh_bi_tcxo_div4.hw, 58662306a36Sopenharmony_ci [RPMH_CXO_CLK_A] = &clk_rpmh_bi_tcxo_div4_ao.hw, 58762306a36Sopenharmony_ci [RPMH_LN_BB_CLK1] = &clk_rpmh_ln_bb_clk1_a4.hw, 58862306a36Sopenharmony_ci [RPMH_LN_BB_CLK1_A] = &clk_rpmh_ln_bb_clk1_a4_ao.hw, 58962306a36Sopenharmony_ci [RPMH_LN_BB_CLK2] = &clk_rpmh_ln_bb_clk2_a4.hw, 59062306a36Sopenharmony_ci [RPMH_LN_BB_CLK2_A] = &clk_rpmh_ln_bb_clk2_a4_ao.hw, 59162306a36Sopenharmony_ci [RPMH_RF_CLK1] = &clk_rpmh_rf_clk1_a.hw, 59262306a36Sopenharmony_ci [RPMH_RF_CLK1_A] = &clk_rpmh_rf_clk1_a_ao.hw, 59362306a36Sopenharmony_ci [RPMH_RF_CLK2] = &clk_rpmh_rf_clk2_a.hw, 59462306a36Sopenharmony_ci [RPMH_RF_CLK2_A] = &clk_rpmh_rf_clk2_a_ao.hw, 59562306a36Sopenharmony_ci [RPMH_RF_CLK3] = &clk_rpmh_rf_clk3_a.hw, 59662306a36Sopenharmony_ci [RPMH_RF_CLK3_A] = &clk_rpmh_rf_clk3_a_ao.hw, 59762306a36Sopenharmony_ci [RPMH_RF_CLK4] = &clk_rpmh_rf_clk4_a.hw, 59862306a36Sopenharmony_ci [RPMH_RF_CLK4_A] = &clk_rpmh_rf_clk4_a_ao.hw, 59962306a36Sopenharmony_ci [RPMH_IPA_CLK] = &clk_rpmh_ipa.hw, 60062306a36Sopenharmony_ci}; 60162306a36Sopenharmony_ci 60262306a36Sopenharmony_cistatic const struct clk_rpmh_desc clk_rpmh_sm8450 = { 60362306a36Sopenharmony_ci .clks = sm8450_rpmh_clocks, 60462306a36Sopenharmony_ci .num_clks = ARRAY_SIZE(sm8450_rpmh_clocks), 60562306a36Sopenharmony_ci}; 60662306a36Sopenharmony_ci 60762306a36Sopenharmony_cistatic struct clk_hw *sm8550_rpmh_clocks[] = { 60862306a36Sopenharmony_ci [RPMH_CXO_CLK] = &clk_rpmh_bi_tcxo_div2.hw, 60962306a36Sopenharmony_ci [RPMH_CXO_CLK_A] = &clk_rpmh_bi_tcxo_div2_ao.hw, 61062306a36Sopenharmony_ci [RPMH_LN_BB_CLK1] = &clk_rpmh_clk6_a2.hw, 61162306a36Sopenharmony_ci [RPMH_LN_BB_CLK1_A] = &clk_rpmh_clk6_a2_ao.hw, 61262306a36Sopenharmony_ci [RPMH_LN_BB_CLK2] = &clk_rpmh_clk7_a2.hw, 61362306a36Sopenharmony_ci [RPMH_LN_BB_CLK2_A] = &clk_rpmh_clk7_a2_ao.hw, 61462306a36Sopenharmony_ci [RPMH_LN_BB_CLK3] = &clk_rpmh_clk8_a2.hw, 61562306a36Sopenharmony_ci [RPMH_LN_BB_CLK3_A] = &clk_rpmh_clk8_a2_ao.hw, 61662306a36Sopenharmony_ci [RPMH_RF_CLK1] = &clk_rpmh_clk1_a1.hw, 61762306a36Sopenharmony_ci [RPMH_RF_CLK1_A] = &clk_rpmh_clk1_a1_ao.hw, 61862306a36Sopenharmony_ci [RPMH_RF_CLK2] = &clk_rpmh_clk2_a1.hw, 61962306a36Sopenharmony_ci [RPMH_RF_CLK2_A] = &clk_rpmh_clk2_a1_ao.hw, 62062306a36Sopenharmony_ci [RPMH_RF_CLK3] = &clk_rpmh_clk3_a1.hw, 62162306a36Sopenharmony_ci [RPMH_RF_CLK3_A] = &clk_rpmh_clk3_a1_ao.hw, 62262306a36Sopenharmony_ci [RPMH_RF_CLK4] = &clk_rpmh_clk4_a1.hw, 62362306a36Sopenharmony_ci [RPMH_RF_CLK4_A] = &clk_rpmh_clk4_a1_ao.hw, 62462306a36Sopenharmony_ci [RPMH_IPA_CLK] = &clk_rpmh_ipa.hw, 62562306a36Sopenharmony_ci}; 62662306a36Sopenharmony_ci 62762306a36Sopenharmony_cistatic const struct clk_rpmh_desc clk_rpmh_sm8550 = { 62862306a36Sopenharmony_ci .clks = sm8550_rpmh_clocks, 62962306a36Sopenharmony_ci .num_clks = ARRAY_SIZE(sm8550_rpmh_clocks), 63062306a36Sopenharmony_ci}; 63162306a36Sopenharmony_ci 63262306a36Sopenharmony_cistatic struct clk_hw *sc7280_rpmh_clocks[] = { 63362306a36Sopenharmony_ci [RPMH_CXO_CLK] = &clk_rpmh_bi_tcxo_div4.hw, 63462306a36Sopenharmony_ci [RPMH_CXO_CLK_A] = &clk_rpmh_bi_tcxo_div4_ao.hw, 63562306a36Sopenharmony_ci [RPMH_LN_BB_CLK2] = &clk_rpmh_ln_bb_clk2_a2.hw, 63662306a36Sopenharmony_ci [RPMH_LN_BB_CLK2_A] = &clk_rpmh_ln_bb_clk2_a2_ao.hw, 63762306a36Sopenharmony_ci [RPMH_RF_CLK1] = &clk_rpmh_rf_clk1_a.hw, 63862306a36Sopenharmony_ci [RPMH_RF_CLK1_A] = &clk_rpmh_rf_clk1_a_ao.hw, 63962306a36Sopenharmony_ci [RPMH_RF_CLK3] = &clk_rpmh_rf_clk3_a.hw, 64062306a36Sopenharmony_ci [RPMH_RF_CLK3_A] = &clk_rpmh_rf_clk3_a_ao.hw, 64162306a36Sopenharmony_ci [RPMH_RF_CLK4] = &clk_rpmh_rf_clk4_a.hw, 64262306a36Sopenharmony_ci [RPMH_RF_CLK4_A] = &clk_rpmh_rf_clk4_a_ao.hw, 64362306a36Sopenharmony_ci [RPMH_IPA_CLK] = &clk_rpmh_ipa.hw, 64462306a36Sopenharmony_ci [RPMH_PKA_CLK] = &clk_rpmh_pka.hw, 64562306a36Sopenharmony_ci [RPMH_HWKM_CLK] = &clk_rpmh_hwkm.hw, 64662306a36Sopenharmony_ci}; 64762306a36Sopenharmony_ci 64862306a36Sopenharmony_cistatic const struct clk_rpmh_desc clk_rpmh_sc7280 = { 64962306a36Sopenharmony_ci .clks = sc7280_rpmh_clocks, 65062306a36Sopenharmony_ci .num_clks = ARRAY_SIZE(sc7280_rpmh_clocks), 65162306a36Sopenharmony_ci}; 65262306a36Sopenharmony_ci 65362306a36Sopenharmony_cistatic struct clk_hw *sm6350_rpmh_clocks[] = { 65462306a36Sopenharmony_ci [RPMH_CXO_CLK] = &clk_rpmh_bi_tcxo_div4.hw, 65562306a36Sopenharmony_ci [RPMH_CXO_CLK_A] = &clk_rpmh_bi_tcxo_div4_ao.hw, 65662306a36Sopenharmony_ci [RPMH_LN_BB_CLK2] = &clk_rpmh_ln_bb_clk2_g4.hw, 65762306a36Sopenharmony_ci [RPMH_LN_BB_CLK2_A] = &clk_rpmh_ln_bb_clk2_g4_ao.hw, 65862306a36Sopenharmony_ci [RPMH_LN_BB_CLK3] = &clk_rpmh_ln_bb_clk3_g4.hw, 65962306a36Sopenharmony_ci [RPMH_LN_BB_CLK3_A] = &clk_rpmh_ln_bb_clk3_g4_ao.hw, 66062306a36Sopenharmony_ci [RPMH_QLINK_CLK] = &clk_rpmh_qlink_div4.hw, 66162306a36Sopenharmony_ci [RPMH_QLINK_CLK_A] = &clk_rpmh_qlink_div4_ao.hw, 66262306a36Sopenharmony_ci [RPMH_IPA_CLK] = &clk_rpmh_ipa.hw, 66362306a36Sopenharmony_ci}; 66462306a36Sopenharmony_ci 66562306a36Sopenharmony_cistatic const struct clk_rpmh_desc clk_rpmh_sm6350 = { 66662306a36Sopenharmony_ci .clks = sm6350_rpmh_clocks, 66762306a36Sopenharmony_ci .num_clks = ARRAY_SIZE(sm6350_rpmh_clocks), 66862306a36Sopenharmony_ci}; 66962306a36Sopenharmony_ci 67062306a36Sopenharmony_cistatic struct clk_hw *sdx65_rpmh_clocks[] = { 67162306a36Sopenharmony_ci [RPMH_CXO_CLK] = &clk_rpmh_bi_tcxo_div4.hw, 67262306a36Sopenharmony_ci [RPMH_CXO_CLK_A] = &clk_rpmh_bi_tcxo_div4_ao.hw, 67362306a36Sopenharmony_ci [RPMH_LN_BB_CLK1] = &clk_rpmh_ln_bb_clk1_a4.hw, 67462306a36Sopenharmony_ci [RPMH_LN_BB_CLK1_A] = &clk_rpmh_ln_bb_clk1_a4_ao.hw, 67562306a36Sopenharmony_ci [RPMH_RF_CLK1] = &clk_rpmh_rf_clk1_a.hw, 67662306a36Sopenharmony_ci [RPMH_RF_CLK1_A] = &clk_rpmh_rf_clk1_a_ao.hw, 67762306a36Sopenharmony_ci [RPMH_RF_CLK2] = &clk_rpmh_rf_clk2_a.hw, 67862306a36Sopenharmony_ci [RPMH_RF_CLK2_A] = &clk_rpmh_rf_clk2_a_ao.hw, 67962306a36Sopenharmony_ci [RPMH_RF_CLK3] = &clk_rpmh_rf_clk3_a.hw, 68062306a36Sopenharmony_ci [RPMH_RF_CLK3_A] = &clk_rpmh_rf_clk3_a_ao.hw, 68162306a36Sopenharmony_ci [RPMH_RF_CLK4] = &clk_rpmh_rf_clk4_a.hw, 68262306a36Sopenharmony_ci [RPMH_RF_CLK4_A] = &clk_rpmh_rf_clk4_a_ao.hw, 68362306a36Sopenharmony_ci [RPMH_IPA_CLK] = &clk_rpmh_ipa.hw, 68462306a36Sopenharmony_ci [RPMH_QPIC_CLK] = &clk_rpmh_qpic_clk.hw, 68562306a36Sopenharmony_ci}; 68662306a36Sopenharmony_ci 68762306a36Sopenharmony_cistatic const struct clk_rpmh_desc clk_rpmh_sdx65 = { 68862306a36Sopenharmony_ci .clks = sdx65_rpmh_clocks, 68962306a36Sopenharmony_ci .num_clks = ARRAY_SIZE(sdx65_rpmh_clocks), 69062306a36Sopenharmony_ci}; 69162306a36Sopenharmony_ci 69262306a36Sopenharmony_cistatic struct clk_hw *qdu1000_rpmh_clocks[] = { 69362306a36Sopenharmony_ci [RPMH_CXO_CLK] = &clk_rpmh_bi_tcxo_div1.hw, 69462306a36Sopenharmony_ci [RPMH_CXO_CLK_A] = &clk_rpmh_bi_tcxo_div1_ao.hw, 69562306a36Sopenharmony_ci}; 69662306a36Sopenharmony_ci 69762306a36Sopenharmony_cistatic const struct clk_rpmh_desc clk_rpmh_qdu1000 = { 69862306a36Sopenharmony_ci .clks = qdu1000_rpmh_clocks, 69962306a36Sopenharmony_ci .num_clks = ARRAY_SIZE(qdu1000_rpmh_clocks), 70062306a36Sopenharmony_ci}; 70162306a36Sopenharmony_ci 70262306a36Sopenharmony_cistatic struct clk_hw *sdx75_rpmh_clocks[] = { 70362306a36Sopenharmony_ci [RPMH_CXO_CLK] = &clk_rpmh_bi_tcxo_div4.hw, 70462306a36Sopenharmony_ci [RPMH_CXO_CLK_A] = &clk_rpmh_bi_tcxo_div4_ao.hw, 70562306a36Sopenharmony_ci [RPMH_RF_CLK1] = &clk_rpmh_rf_clk1_a.hw, 70662306a36Sopenharmony_ci [RPMH_RF_CLK1_A] = &clk_rpmh_rf_clk1_a_ao.hw, 70762306a36Sopenharmony_ci [RPMH_RF_CLK2] = &clk_rpmh_rf_clk2_a.hw, 70862306a36Sopenharmony_ci [RPMH_RF_CLK2_A] = &clk_rpmh_rf_clk2_a_ao.hw, 70962306a36Sopenharmony_ci [RPMH_RF_CLK3] = &clk_rpmh_rf_clk3_a.hw, 71062306a36Sopenharmony_ci [RPMH_RF_CLK3_A] = &clk_rpmh_rf_clk3_a_ao.hw, 71162306a36Sopenharmony_ci [RPMH_QPIC_CLK] = &clk_rpmh_qpic_clk.hw, 71262306a36Sopenharmony_ci [RPMH_IPA_CLK] = &clk_rpmh_ipa.hw, 71362306a36Sopenharmony_ci}; 71462306a36Sopenharmony_ci 71562306a36Sopenharmony_cistatic const struct clk_rpmh_desc clk_rpmh_sdx75 = { 71662306a36Sopenharmony_ci .clks = sdx75_rpmh_clocks, 71762306a36Sopenharmony_ci .num_clks = ARRAY_SIZE(sdx75_rpmh_clocks), 71862306a36Sopenharmony_ci}; 71962306a36Sopenharmony_ci 72062306a36Sopenharmony_cistatic struct clk_hw *of_clk_rpmh_hw_get(struct of_phandle_args *clkspec, 72162306a36Sopenharmony_ci void *data) 72262306a36Sopenharmony_ci{ 72362306a36Sopenharmony_ci struct clk_rpmh_desc *rpmh = data; 72462306a36Sopenharmony_ci unsigned int idx = clkspec->args[0]; 72562306a36Sopenharmony_ci 72662306a36Sopenharmony_ci if (idx >= rpmh->num_clks) { 72762306a36Sopenharmony_ci pr_err("%s: invalid index %u\n", __func__, idx); 72862306a36Sopenharmony_ci return ERR_PTR(-EINVAL); 72962306a36Sopenharmony_ci } 73062306a36Sopenharmony_ci 73162306a36Sopenharmony_ci return rpmh->clks[idx]; 73262306a36Sopenharmony_ci} 73362306a36Sopenharmony_ci 73462306a36Sopenharmony_cistatic int clk_rpmh_probe(struct platform_device *pdev) 73562306a36Sopenharmony_ci{ 73662306a36Sopenharmony_ci struct clk_hw **hw_clks; 73762306a36Sopenharmony_ci struct clk_rpmh *rpmh_clk; 73862306a36Sopenharmony_ci const struct clk_rpmh_desc *desc; 73962306a36Sopenharmony_ci int ret, i; 74062306a36Sopenharmony_ci 74162306a36Sopenharmony_ci desc = of_device_get_match_data(&pdev->dev); 74262306a36Sopenharmony_ci if (!desc) 74362306a36Sopenharmony_ci return -ENODEV; 74462306a36Sopenharmony_ci 74562306a36Sopenharmony_ci hw_clks = desc->clks; 74662306a36Sopenharmony_ci 74762306a36Sopenharmony_ci for (i = 0; i < desc->num_clks; i++) { 74862306a36Sopenharmony_ci const char *name; 74962306a36Sopenharmony_ci u32 res_addr; 75062306a36Sopenharmony_ci size_t aux_data_len; 75162306a36Sopenharmony_ci const struct bcm_db *data; 75262306a36Sopenharmony_ci 75362306a36Sopenharmony_ci if (!hw_clks[i]) 75462306a36Sopenharmony_ci continue; 75562306a36Sopenharmony_ci 75662306a36Sopenharmony_ci name = hw_clks[i]->init->name; 75762306a36Sopenharmony_ci 75862306a36Sopenharmony_ci rpmh_clk = to_clk_rpmh(hw_clks[i]); 75962306a36Sopenharmony_ci res_addr = cmd_db_read_addr(rpmh_clk->res_name); 76062306a36Sopenharmony_ci if (!res_addr) { 76162306a36Sopenharmony_ci dev_err(&pdev->dev, "missing RPMh resource address for %s\n", 76262306a36Sopenharmony_ci rpmh_clk->res_name); 76362306a36Sopenharmony_ci return -ENODEV; 76462306a36Sopenharmony_ci } 76562306a36Sopenharmony_ci 76662306a36Sopenharmony_ci data = cmd_db_read_aux_data(rpmh_clk->res_name, &aux_data_len); 76762306a36Sopenharmony_ci if (IS_ERR(data)) { 76862306a36Sopenharmony_ci ret = PTR_ERR(data); 76962306a36Sopenharmony_ci dev_err(&pdev->dev, 77062306a36Sopenharmony_ci "error reading RPMh aux data for %s (%d)\n", 77162306a36Sopenharmony_ci rpmh_clk->res_name, ret); 77262306a36Sopenharmony_ci return ret; 77362306a36Sopenharmony_ci } 77462306a36Sopenharmony_ci 77562306a36Sopenharmony_ci /* Convert unit from Khz to Hz */ 77662306a36Sopenharmony_ci if (aux_data_len == sizeof(*data)) 77762306a36Sopenharmony_ci rpmh_clk->unit = le32_to_cpu(data->unit) * 1000ULL; 77862306a36Sopenharmony_ci 77962306a36Sopenharmony_ci rpmh_clk->res_addr += res_addr; 78062306a36Sopenharmony_ci rpmh_clk->dev = &pdev->dev; 78162306a36Sopenharmony_ci 78262306a36Sopenharmony_ci ret = devm_clk_hw_register(&pdev->dev, hw_clks[i]); 78362306a36Sopenharmony_ci if (ret) { 78462306a36Sopenharmony_ci dev_err(&pdev->dev, "failed to register %s\n", name); 78562306a36Sopenharmony_ci return ret; 78662306a36Sopenharmony_ci } 78762306a36Sopenharmony_ci } 78862306a36Sopenharmony_ci 78962306a36Sopenharmony_ci /* typecast to silence compiler warning */ 79062306a36Sopenharmony_ci ret = devm_of_clk_add_hw_provider(&pdev->dev, of_clk_rpmh_hw_get, 79162306a36Sopenharmony_ci (void *)desc); 79262306a36Sopenharmony_ci if (ret) { 79362306a36Sopenharmony_ci dev_err(&pdev->dev, "Failed to add clock provider\n"); 79462306a36Sopenharmony_ci return ret; 79562306a36Sopenharmony_ci } 79662306a36Sopenharmony_ci 79762306a36Sopenharmony_ci dev_dbg(&pdev->dev, "Registered RPMh clocks\n"); 79862306a36Sopenharmony_ci 79962306a36Sopenharmony_ci return 0; 80062306a36Sopenharmony_ci} 80162306a36Sopenharmony_ci 80262306a36Sopenharmony_cistatic const struct of_device_id clk_rpmh_match_table[] = { 80362306a36Sopenharmony_ci { .compatible = "qcom,qdu1000-rpmh-clk", .data = &clk_rpmh_qdu1000}, 80462306a36Sopenharmony_ci { .compatible = "qcom,sa8775p-rpmh-clk", .data = &clk_rpmh_sa8775p}, 80562306a36Sopenharmony_ci { .compatible = "qcom,sc7180-rpmh-clk", .data = &clk_rpmh_sc7180}, 80662306a36Sopenharmony_ci { .compatible = "qcom,sc8180x-rpmh-clk", .data = &clk_rpmh_sc8180x}, 80762306a36Sopenharmony_ci { .compatible = "qcom,sc8280xp-rpmh-clk", .data = &clk_rpmh_sc8280xp}, 80862306a36Sopenharmony_ci { .compatible = "qcom,sdm845-rpmh-clk", .data = &clk_rpmh_sdm845}, 80962306a36Sopenharmony_ci { .compatible = "qcom,sdm670-rpmh-clk", .data = &clk_rpmh_sdm670}, 81062306a36Sopenharmony_ci { .compatible = "qcom,sdx55-rpmh-clk", .data = &clk_rpmh_sdx55}, 81162306a36Sopenharmony_ci { .compatible = "qcom,sdx65-rpmh-clk", .data = &clk_rpmh_sdx65}, 81262306a36Sopenharmony_ci { .compatible = "qcom,sdx75-rpmh-clk", .data = &clk_rpmh_sdx75}, 81362306a36Sopenharmony_ci { .compatible = "qcom,sm6350-rpmh-clk", .data = &clk_rpmh_sm6350}, 81462306a36Sopenharmony_ci { .compatible = "qcom,sm8150-rpmh-clk", .data = &clk_rpmh_sm8150}, 81562306a36Sopenharmony_ci { .compatible = "qcom,sm8250-rpmh-clk", .data = &clk_rpmh_sm8250}, 81662306a36Sopenharmony_ci { .compatible = "qcom,sm8350-rpmh-clk", .data = &clk_rpmh_sm8350}, 81762306a36Sopenharmony_ci { .compatible = "qcom,sm8450-rpmh-clk", .data = &clk_rpmh_sm8450}, 81862306a36Sopenharmony_ci { .compatible = "qcom,sm8550-rpmh-clk", .data = &clk_rpmh_sm8550}, 81962306a36Sopenharmony_ci { .compatible = "qcom,sc7280-rpmh-clk", .data = &clk_rpmh_sc7280}, 82062306a36Sopenharmony_ci { } 82162306a36Sopenharmony_ci}; 82262306a36Sopenharmony_ciMODULE_DEVICE_TABLE(of, clk_rpmh_match_table); 82362306a36Sopenharmony_ci 82462306a36Sopenharmony_cistatic struct platform_driver clk_rpmh_driver = { 82562306a36Sopenharmony_ci .probe = clk_rpmh_probe, 82662306a36Sopenharmony_ci .driver = { 82762306a36Sopenharmony_ci .name = "clk-rpmh", 82862306a36Sopenharmony_ci .of_match_table = clk_rpmh_match_table, 82962306a36Sopenharmony_ci }, 83062306a36Sopenharmony_ci}; 83162306a36Sopenharmony_ci 83262306a36Sopenharmony_cistatic int __init clk_rpmh_init(void) 83362306a36Sopenharmony_ci{ 83462306a36Sopenharmony_ci return platform_driver_register(&clk_rpmh_driver); 83562306a36Sopenharmony_ci} 83662306a36Sopenharmony_cicore_initcall(clk_rpmh_init); 83762306a36Sopenharmony_ci 83862306a36Sopenharmony_cistatic void __exit clk_rpmh_exit(void) 83962306a36Sopenharmony_ci{ 84062306a36Sopenharmony_ci platform_driver_unregister(&clk_rpmh_driver); 84162306a36Sopenharmony_ci} 84262306a36Sopenharmony_cimodule_exit(clk_rpmh_exit); 84362306a36Sopenharmony_ci 84462306a36Sopenharmony_ciMODULE_DESCRIPTION("QCOM RPMh Clock Driver"); 84562306a36Sopenharmony_ciMODULE_LICENSE("GPL v2"); 846