162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (c) 2016, Linaro Limited 462306a36Sopenharmony_ci * Copyright (c) 2014, The Linux Foundation. All rights reserved. 562306a36Sopenharmony_ci */ 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#include <linux/clk-provider.h> 862306a36Sopenharmony_ci#include <linux/err.h> 962306a36Sopenharmony_ci#include <linux/export.h> 1062306a36Sopenharmony_ci#include <linux/init.h> 1162306a36Sopenharmony_ci#include <linux/kernel.h> 1262306a36Sopenharmony_ci#include <linux/module.h> 1362306a36Sopenharmony_ci#include <linux/mutex.h> 1462306a36Sopenharmony_ci#include <linux/of.h> 1562306a36Sopenharmony_ci#include <linux/platform_device.h> 1662306a36Sopenharmony_ci#include <linux/soc/qcom/smd-rpm.h> 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci#include <dt-bindings/clock/qcom,rpmcc.h> 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci#define __DEFINE_CLK_SMD_RPM_PREFIX(_prefix, _name, _active, \ 2162306a36Sopenharmony_ci type, r_id, key, ao_rate, ao_flags) \ 2262306a36Sopenharmony_ci static struct clk_smd_rpm clk_smd_rpm_##_prefix##_active; \ 2362306a36Sopenharmony_ci static struct clk_smd_rpm clk_smd_rpm_##_prefix##_name = { \ 2462306a36Sopenharmony_ci .rpm_res_type = (type), \ 2562306a36Sopenharmony_ci .rpm_clk_id = (r_id), \ 2662306a36Sopenharmony_ci .rpm_key = (key), \ 2762306a36Sopenharmony_ci .peer = &clk_smd_rpm_##_prefix##_active, \ 2862306a36Sopenharmony_ci .rate = INT_MAX, \ 2962306a36Sopenharmony_ci .hw.init = &(struct clk_init_data){ \ 3062306a36Sopenharmony_ci .ops = &clk_smd_rpm_ops, \ 3162306a36Sopenharmony_ci .name = #_name, \ 3262306a36Sopenharmony_ci .parent_data = &(const struct clk_parent_data){ \ 3362306a36Sopenharmony_ci .fw_name = "xo", \ 3462306a36Sopenharmony_ci .name = "xo_board", \ 3562306a36Sopenharmony_ci }, \ 3662306a36Sopenharmony_ci .num_parents = 1, \ 3762306a36Sopenharmony_ci }, \ 3862306a36Sopenharmony_ci }; \ 3962306a36Sopenharmony_ci static struct clk_smd_rpm clk_smd_rpm_##_prefix##_active = { \ 4062306a36Sopenharmony_ci .rpm_res_type = (type), \ 4162306a36Sopenharmony_ci .rpm_clk_id = (r_id), \ 4262306a36Sopenharmony_ci .active_only = true, \ 4362306a36Sopenharmony_ci .rpm_key = (key), \ 4462306a36Sopenharmony_ci .peer = &clk_smd_rpm_##_prefix##_name, \ 4562306a36Sopenharmony_ci .rate = (ao_rate), \ 4662306a36Sopenharmony_ci .hw.init = &(struct clk_init_data){ \ 4762306a36Sopenharmony_ci .ops = &clk_smd_rpm_ops, \ 4862306a36Sopenharmony_ci .name = #_active, \ 4962306a36Sopenharmony_ci .parent_data = &(const struct clk_parent_data){ \ 5062306a36Sopenharmony_ci .fw_name = "xo", \ 5162306a36Sopenharmony_ci .name = "xo_board", \ 5262306a36Sopenharmony_ci }, \ 5362306a36Sopenharmony_ci .num_parents = 1, \ 5462306a36Sopenharmony_ci .flags = (ao_flags), \ 5562306a36Sopenharmony_ci }, \ 5662306a36Sopenharmony_ci } 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_ci#define __DEFINE_CLK_SMD_RPM(_name, _active, type, r_id, key,\ 5962306a36Sopenharmony_ci ao_rate, ao_flags) \ 6062306a36Sopenharmony_ci __DEFINE_CLK_SMD_RPM_PREFIX(/* empty */, _name, _active, \ 6162306a36Sopenharmony_ci type, r_id, key, ao_rate, ao_flags) 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_ci#define __DEFINE_CLK_SMD_RPM_BRANCH_PREFIX(_prefix, _name, _active,\ 6462306a36Sopenharmony_ci type, r_id, r, key, ao_flags) \ 6562306a36Sopenharmony_ci static struct clk_smd_rpm clk_smd_rpm_##_prefix##_active; \ 6662306a36Sopenharmony_ci static struct clk_smd_rpm clk_smd_rpm_##_prefix##_name = { \ 6762306a36Sopenharmony_ci .rpm_res_type = (type), \ 6862306a36Sopenharmony_ci .rpm_clk_id = (r_id), \ 6962306a36Sopenharmony_ci .rpm_key = (key), \ 7062306a36Sopenharmony_ci .branch = true, \ 7162306a36Sopenharmony_ci .peer = &clk_smd_rpm_##_prefix##_active, \ 7262306a36Sopenharmony_ci .rate = (r), \ 7362306a36Sopenharmony_ci .hw.init = &(struct clk_init_data){ \ 7462306a36Sopenharmony_ci .ops = &clk_smd_rpm_branch_ops, \ 7562306a36Sopenharmony_ci .name = #_name, \ 7662306a36Sopenharmony_ci .parent_data = &(const struct clk_parent_data){ \ 7762306a36Sopenharmony_ci .fw_name = "xo", \ 7862306a36Sopenharmony_ci .name = "xo_board", \ 7962306a36Sopenharmony_ci }, \ 8062306a36Sopenharmony_ci .num_parents = 1, \ 8162306a36Sopenharmony_ci }, \ 8262306a36Sopenharmony_ci }; \ 8362306a36Sopenharmony_ci static struct clk_smd_rpm clk_smd_rpm_##_prefix##_active = { \ 8462306a36Sopenharmony_ci .rpm_res_type = (type), \ 8562306a36Sopenharmony_ci .rpm_clk_id = (r_id), \ 8662306a36Sopenharmony_ci .active_only = true, \ 8762306a36Sopenharmony_ci .rpm_key = (key), \ 8862306a36Sopenharmony_ci .branch = true, \ 8962306a36Sopenharmony_ci .peer = &clk_smd_rpm_##_prefix##_name, \ 9062306a36Sopenharmony_ci .rate = (r), \ 9162306a36Sopenharmony_ci .hw.init = &(struct clk_init_data){ \ 9262306a36Sopenharmony_ci .ops = &clk_smd_rpm_branch_ops, \ 9362306a36Sopenharmony_ci .name = #_active, \ 9462306a36Sopenharmony_ci .parent_data = &(const struct clk_parent_data){ \ 9562306a36Sopenharmony_ci .fw_name = "xo", \ 9662306a36Sopenharmony_ci .name = "xo_board", \ 9762306a36Sopenharmony_ci }, \ 9862306a36Sopenharmony_ci .num_parents = 1, \ 9962306a36Sopenharmony_ci .flags = (ao_flags), \ 10062306a36Sopenharmony_ci }, \ 10162306a36Sopenharmony_ci } 10262306a36Sopenharmony_ci 10362306a36Sopenharmony_ci#define __DEFINE_CLK_SMD_RPM_BRANCH(_name, _active, type, r_id, r, key) \ 10462306a36Sopenharmony_ci __DEFINE_CLK_SMD_RPM_BRANCH_PREFIX(/* empty */, \ 10562306a36Sopenharmony_ci _name, _active, type, r_id, r, key, 0) 10662306a36Sopenharmony_ci 10762306a36Sopenharmony_ci#define DEFINE_CLK_SMD_RPM(_name, type, r_id) \ 10862306a36Sopenharmony_ci __DEFINE_CLK_SMD_RPM(_name##_clk, _name##_a_clk, \ 10962306a36Sopenharmony_ci type, r_id, QCOM_RPM_SMD_KEY_RATE, INT_MAX, 0) 11062306a36Sopenharmony_ci 11162306a36Sopenharmony_ci#define DEFINE_CLK_SMD_RPM_BUS(_name, r_id) \ 11262306a36Sopenharmony_ci __DEFINE_CLK_SMD_RPM_PREFIX(bus_##r_id##_, \ 11362306a36Sopenharmony_ci _name##_clk, _name##_a_clk, QCOM_SMD_RPM_BUS_CLK, r_id, \ 11462306a36Sopenharmony_ci QCOM_RPM_SMD_KEY_RATE, INT_MAX, 0) 11562306a36Sopenharmony_ci 11662306a36Sopenharmony_ci#define DEFINE_CLK_SMD_RPM_BUS_A(_name, r_id, ao_rate, ao_flags) \ 11762306a36Sopenharmony_ci __DEFINE_CLK_SMD_RPM_PREFIX(bus_##r_id##_, \ 11862306a36Sopenharmony_ci _name##_clk, _name##_a_clk, QCOM_SMD_RPM_BUS_CLK, r_id, \ 11962306a36Sopenharmony_ci QCOM_RPM_SMD_KEY_RATE, ao_rate, ao_flags) 12062306a36Sopenharmony_ci 12162306a36Sopenharmony_ci#define DEFINE_CLK_SMD_RPM_CLK_SRC(_name, type, r_id) \ 12262306a36Sopenharmony_ci __DEFINE_CLK_SMD_RPM( \ 12362306a36Sopenharmony_ci _name##_clk_src, _name##_a_clk_src, \ 12462306a36Sopenharmony_ci type, r_id, QCOM_RPM_SMD_KEY_RATE, INT_MAX, 0) 12562306a36Sopenharmony_ci 12662306a36Sopenharmony_ci#define DEFINE_CLK_SMD_RPM_BRANCH(_name, type, r_id, r) \ 12762306a36Sopenharmony_ci __DEFINE_CLK_SMD_RPM_BRANCH_PREFIX(branch_, \ 12862306a36Sopenharmony_ci _name##_clk, _name##_a_clk, \ 12962306a36Sopenharmony_ci type, r_id, r, QCOM_RPM_SMD_KEY_ENABLE, 0) 13062306a36Sopenharmony_ci 13162306a36Sopenharmony_ci#define DEFINE_CLK_SMD_RPM_BRANCH_A(_name, type, r_id, r, ao_flags) \ 13262306a36Sopenharmony_ci __DEFINE_CLK_SMD_RPM_BRANCH_PREFIX(branch_, \ 13362306a36Sopenharmony_ci _name, _name##_a, type, \ 13462306a36Sopenharmony_ci r_id, r, QCOM_RPM_SMD_KEY_ENABLE, ao_flags) 13562306a36Sopenharmony_ci 13662306a36Sopenharmony_ci#define DEFINE_CLK_SMD_RPM_QDSS(_name, type, r_id) \ 13762306a36Sopenharmony_ci __DEFINE_CLK_SMD_RPM(_name##_clk, _name##_a_clk, \ 13862306a36Sopenharmony_ci type, r_id, QCOM_RPM_SMD_KEY_STATE, INT_MAX, 0) 13962306a36Sopenharmony_ci 14062306a36Sopenharmony_ci#define DEFINE_CLK_SMD_RPM_XO_BUFFER(_name, r_id, r) \ 14162306a36Sopenharmony_ci __DEFINE_CLK_SMD_RPM_BRANCH(_name, _name##_a, \ 14262306a36Sopenharmony_ci QCOM_SMD_RPM_CLK_BUF_A, r_id, r, \ 14362306a36Sopenharmony_ci QCOM_RPM_KEY_SOFTWARE_ENABLE) 14462306a36Sopenharmony_ci 14562306a36Sopenharmony_ci#define DEFINE_CLK_SMD_RPM_XO_BUFFER_PREFIX(_prefix, _name, r_id, r) \ 14662306a36Sopenharmony_ci __DEFINE_CLK_SMD_RPM_BRANCH_PREFIX(_prefix, \ 14762306a36Sopenharmony_ci _name, _name##_a, \ 14862306a36Sopenharmony_ci QCOM_SMD_RPM_CLK_BUF_A, r_id, r, \ 14962306a36Sopenharmony_ci QCOM_RPM_KEY_SOFTWARE_ENABLE, 0) 15062306a36Sopenharmony_ci 15162306a36Sopenharmony_ci#define DEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(_name, r_id, r) \ 15262306a36Sopenharmony_ci DEFINE_CLK_SMD_RPM_XO_BUFFER(_name, r_id, r); \ 15362306a36Sopenharmony_ci __DEFINE_CLK_SMD_RPM_BRANCH(_name##_pin, _name##_a##_pin, \ 15462306a36Sopenharmony_ci QCOM_SMD_RPM_CLK_BUF_A, r_id, r, \ 15562306a36Sopenharmony_ci QCOM_RPM_KEY_PIN_CTRL_CLK_BUFFER_ENABLE_KEY) 15662306a36Sopenharmony_ci 15762306a36Sopenharmony_ci#define to_clk_smd_rpm(_hw) container_of(_hw, struct clk_smd_rpm, hw) 15862306a36Sopenharmony_ci 15962306a36Sopenharmony_cistatic struct qcom_smd_rpm *rpmcc_smd_rpm; 16062306a36Sopenharmony_ci 16162306a36Sopenharmony_cistruct clk_smd_rpm { 16262306a36Sopenharmony_ci const int rpm_res_type; 16362306a36Sopenharmony_ci const int rpm_key; 16462306a36Sopenharmony_ci const int rpm_clk_id; 16562306a36Sopenharmony_ci const bool active_only; 16662306a36Sopenharmony_ci bool enabled; 16762306a36Sopenharmony_ci bool branch; 16862306a36Sopenharmony_ci struct clk_smd_rpm *peer; 16962306a36Sopenharmony_ci struct clk_hw hw; 17062306a36Sopenharmony_ci unsigned long rate; 17162306a36Sopenharmony_ci}; 17262306a36Sopenharmony_ci 17362306a36Sopenharmony_cistruct rpm_smd_clk_desc { 17462306a36Sopenharmony_ci struct clk_smd_rpm **clks; 17562306a36Sopenharmony_ci size_t num_clks; 17662306a36Sopenharmony_ci 17762306a36Sopenharmony_ci /* 17862306a36Sopenharmony_ci * Interconnect clocks are managed by the icc framework, this driver 17962306a36Sopenharmony_ci * only kickstarts them so that they don't get gated between 18062306a36Sopenharmony_ci * clk_smd_rpm_enable_scaling() and interconnect driver initialization. 18162306a36Sopenharmony_ci */ 18262306a36Sopenharmony_ci const struct clk_smd_rpm ** const icc_clks; 18362306a36Sopenharmony_ci size_t num_icc_clks; 18462306a36Sopenharmony_ci bool scaling_before_handover; 18562306a36Sopenharmony_ci}; 18662306a36Sopenharmony_ci 18762306a36Sopenharmony_cistatic DEFINE_MUTEX(rpm_smd_clk_lock); 18862306a36Sopenharmony_ci 18962306a36Sopenharmony_cistatic int clk_smd_rpm_handoff(const struct clk_smd_rpm *r) 19062306a36Sopenharmony_ci{ 19162306a36Sopenharmony_ci int ret; 19262306a36Sopenharmony_ci struct clk_smd_rpm_req req = { 19362306a36Sopenharmony_ci .key = cpu_to_le32(r->rpm_key), 19462306a36Sopenharmony_ci .nbytes = cpu_to_le32(sizeof(u32)), 19562306a36Sopenharmony_ci .value = cpu_to_le32(r->branch ? 1 : INT_MAX), 19662306a36Sopenharmony_ci }; 19762306a36Sopenharmony_ci 19862306a36Sopenharmony_ci ret = qcom_rpm_smd_write(rpmcc_smd_rpm, QCOM_SMD_RPM_ACTIVE_STATE, 19962306a36Sopenharmony_ci r->rpm_res_type, r->rpm_clk_id, &req, 20062306a36Sopenharmony_ci sizeof(req)); 20162306a36Sopenharmony_ci if (ret) 20262306a36Sopenharmony_ci return ret; 20362306a36Sopenharmony_ci ret = qcom_rpm_smd_write(rpmcc_smd_rpm, QCOM_SMD_RPM_SLEEP_STATE, 20462306a36Sopenharmony_ci r->rpm_res_type, r->rpm_clk_id, &req, 20562306a36Sopenharmony_ci sizeof(req)); 20662306a36Sopenharmony_ci if (ret) 20762306a36Sopenharmony_ci return ret; 20862306a36Sopenharmony_ci 20962306a36Sopenharmony_ci return 0; 21062306a36Sopenharmony_ci} 21162306a36Sopenharmony_ci 21262306a36Sopenharmony_cistatic int clk_smd_rpm_set_rate_active(struct clk_smd_rpm *r, 21362306a36Sopenharmony_ci unsigned long rate) 21462306a36Sopenharmony_ci{ 21562306a36Sopenharmony_ci struct clk_smd_rpm_req req = { 21662306a36Sopenharmony_ci .key = cpu_to_le32(r->rpm_key), 21762306a36Sopenharmony_ci .nbytes = cpu_to_le32(sizeof(u32)), 21862306a36Sopenharmony_ci .value = cpu_to_le32(DIV_ROUND_UP(rate, 1000)), /* to kHz */ 21962306a36Sopenharmony_ci }; 22062306a36Sopenharmony_ci 22162306a36Sopenharmony_ci return qcom_rpm_smd_write(rpmcc_smd_rpm, QCOM_SMD_RPM_ACTIVE_STATE, 22262306a36Sopenharmony_ci r->rpm_res_type, r->rpm_clk_id, &req, 22362306a36Sopenharmony_ci sizeof(req)); 22462306a36Sopenharmony_ci} 22562306a36Sopenharmony_ci 22662306a36Sopenharmony_cistatic int clk_smd_rpm_set_rate_sleep(struct clk_smd_rpm *r, 22762306a36Sopenharmony_ci unsigned long rate) 22862306a36Sopenharmony_ci{ 22962306a36Sopenharmony_ci struct clk_smd_rpm_req req = { 23062306a36Sopenharmony_ci .key = cpu_to_le32(r->rpm_key), 23162306a36Sopenharmony_ci .nbytes = cpu_to_le32(sizeof(u32)), 23262306a36Sopenharmony_ci .value = cpu_to_le32(DIV_ROUND_UP(rate, 1000)), /* to kHz */ 23362306a36Sopenharmony_ci }; 23462306a36Sopenharmony_ci 23562306a36Sopenharmony_ci return qcom_rpm_smd_write(rpmcc_smd_rpm, QCOM_SMD_RPM_SLEEP_STATE, 23662306a36Sopenharmony_ci r->rpm_res_type, r->rpm_clk_id, &req, 23762306a36Sopenharmony_ci sizeof(req)); 23862306a36Sopenharmony_ci} 23962306a36Sopenharmony_ci 24062306a36Sopenharmony_cistatic void to_active_sleep(struct clk_smd_rpm *r, unsigned long rate, 24162306a36Sopenharmony_ci unsigned long *active, unsigned long *sleep) 24262306a36Sopenharmony_ci{ 24362306a36Sopenharmony_ci *active = rate; 24462306a36Sopenharmony_ci 24562306a36Sopenharmony_ci /* 24662306a36Sopenharmony_ci * Active-only clocks don't care what the rate is during sleep. So, 24762306a36Sopenharmony_ci * they vote for zero. 24862306a36Sopenharmony_ci */ 24962306a36Sopenharmony_ci if (r->active_only) 25062306a36Sopenharmony_ci *sleep = 0; 25162306a36Sopenharmony_ci else 25262306a36Sopenharmony_ci *sleep = *active; 25362306a36Sopenharmony_ci} 25462306a36Sopenharmony_ci 25562306a36Sopenharmony_cistatic int clk_smd_rpm_prepare(struct clk_hw *hw) 25662306a36Sopenharmony_ci{ 25762306a36Sopenharmony_ci struct clk_smd_rpm *r = to_clk_smd_rpm(hw); 25862306a36Sopenharmony_ci struct clk_smd_rpm *peer = r->peer; 25962306a36Sopenharmony_ci unsigned long this_rate = 0, this_sleep_rate = 0; 26062306a36Sopenharmony_ci unsigned long peer_rate = 0, peer_sleep_rate = 0; 26162306a36Sopenharmony_ci unsigned long active_rate, sleep_rate; 26262306a36Sopenharmony_ci int ret = 0; 26362306a36Sopenharmony_ci 26462306a36Sopenharmony_ci mutex_lock(&rpm_smd_clk_lock); 26562306a36Sopenharmony_ci 26662306a36Sopenharmony_ci /* Don't send requests to the RPM if the rate has not been set. */ 26762306a36Sopenharmony_ci if (!r->rate) 26862306a36Sopenharmony_ci goto out; 26962306a36Sopenharmony_ci 27062306a36Sopenharmony_ci to_active_sleep(r, r->rate, &this_rate, &this_sleep_rate); 27162306a36Sopenharmony_ci 27262306a36Sopenharmony_ci /* Take peer clock's rate into account only if it's enabled. */ 27362306a36Sopenharmony_ci if (peer->enabled) 27462306a36Sopenharmony_ci to_active_sleep(peer, peer->rate, 27562306a36Sopenharmony_ci &peer_rate, &peer_sleep_rate); 27662306a36Sopenharmony_ci 27762306a36Sopenharmony_ci active_rate = max(this_rate, peer_rate); 27862306a36Sopenharmony_ci 27962306a36Sopenharmony_ci if (r->branch) 28062306a36Sopenharmony_ci active_rate = !!active_rate; 28162306a36Sopenharmony_ci 28262306a36Sopenharmony_ci ret = clk_smd_rpm_set_rate_active(r, active_rate); 28362306a36Sopenharmony_ci if (ret) 28462306a36Sopenharmony_ci goto out; 28562306a36Sopenharmony_ci 28662306a36Sopenharmony_ci sleep_rate = max(this_sleep_rate, peer_sleep_rate); 28762306a36Sopenharmony_ci if (r->branch) 28862306a36Sopenharmony_ci sleep_rate = !!sleep_rate; 28962306a36Sopenharmony_ci 29062306a36Sopenharmony_ci ret = clk_smd_rpm_set_rate_sleep(r, sleep_rate); 29162306a36Sopenharmony_ci if (ret) 29262306a36Sopenharmony_ci /* Undo the active set vote and restore it */ 29362306a36Sopenharmony_ci ret = clk_smd_rpm_set_rate_active(r, peer_rate); 29462306a36Sopenharmony_ci 29562306a36Sopenharmony_ciout: 29662306a36Sopenharmony_ci if (!ret) 29762306a36Sopenharmony_ci r->enabled = true; 29862306a36Sopenharmony_ci 29962306a36Sopenharmony_ci mutex_unlock(&rpm_smd_clk_lock); 30062306a36Sopenharmony_ci 30162306a36Sopenharmony_ci return ret; 30262306a36Sopenharmony_ci} 30362306a36Sopenharmony_ci 30462306a36Sopenharmony_cistatic void clk_smd_rpm_unprepare(struct clk_hw *hw) 30562306a36Sopenharmony_ci{ 30662306a36Sopenharmony_ci struct clk_smd_rpm *r = to_clk_smd_rpm(hw); 30762306a36Sopenharmony_ci struct clk_smd_rpm *peer = r->peer; 30862306a36Sopenharmony_ci unsigned long peer_rate = 0, peer_sleep_rate = 0; 30962306a36Sopenharmony_ci unsigned long active_rate, sleep_rate; 31062306a36Sopenharmony_ci int ret; 31162306a36Sopenharmony_ci 31262306a36Sopenharmony_ci mutex_lock(&rpm_smd_clk_lock); 31362306a36Sopenharmony_ci 31462306a36Sopenharmony_ci if (!r->rate) 31562306a36Sopenharmony_ci goto out; 31662306a36Sopenharmony_ci 31762306a36Sopenharmony_ci /* Take peer clock's rate into account only if it's enabled. */ 31862306a36Sopenharmony_ci if (peer->enabled) 31962306a36Sopenharmony_ci to_active_sleep(peer, peer->rate, &peer_rate, 32062306a36Sopenharmony_ci &peer_sleep_rate); 32162306a36Sopenharmony_ci 32262306a36Sopenharmony_ci active_rate = r->branch ? !!peer_rate : peer_rate; 32362306a36Sopenharmony_ci ret = clk_smd_rpm_set_rate_active(r, active_rate); 32462306a36Sopenharmony_ci if (ret) 32562306a36Sopenharmony_ci goto out; 32662306a36Sopenharmony_ci 32762306a36Sopenharmony_ci sleep_rate = r->branch ? !!peer_sleep_rate : peer_sleep_rate; 32862306a36Sopenharmony_ci ret = clk_smd_rpm_set_rate_sleep(r, sleep_rate); 32962306a36Sopenharmony_ci if (ret) 33062306a36Sopenharmony_ci goto out; 33162306a36Sopenharmony_ci 33262306a36Sopenharmony_ci r->enabled = false; 33362306a36Sopenharmony_ci 33462306a36Sopenharmony_ciout: 33562306a36Sopenharmony_ci mutex_unlock(&rpm_smd_clk_lock); 33662306a36Sopenharmony_ci} 33762306a36Sopenharmony_ci 33862306a36Sopenharmony_cistatic int clk_smd_rpm_set_rate(struct clk_hw *hw, unsigned long rate, 33962306a36Sopenharmony_ci unsigned long parent_rate) 34062306a36Sopenharmony_ci{ 34162306a36Sopenharmony_ci struct clk_smd_rpm *r = to_clk_smd_rpm(hw); 34262306a36Sopenharmony_ci struct clk_smd_rpm *peer = r->peer; 34362306a36Sopenharmony_ci unsigned long active_rate, sleep_rate; 34462306a36Sopenharmony_ci unsigned long this_rate = 0, this_sleep_rate = 0; 34562306a36Sopenharmony_ci unsigned long peer_rate = 0, peer_sleep_rate = 0; 34662306a36Sopenharmony_ci int ret = 0; 34762306a36Sopenharmony_ci 34862306a36Sopenharmony_ci mutex_lock(&rpm_smd_clk_lock); 34962306a36Sopenharmony_ci 35062306a36Sopenharmony_ci if (!r->enabled) 35162306a36Sopenharmony_ci goto out; 35262306a36Sopenharmony_ci 35362306a36Sopenharmony_ci to_active_sleep(r, rate, &this_rate, &this_sleep_rate); 35462306a36Sopenharmony_ci 35562306a36Sopenharmony_ci /* Take peer clock's rate into account only if it's enabled. */ 35662306a36Sopenharmony_ci if (peer->enabled) 35762306a36Sopenharmony_ci to_active_sleep(peer, peer->rate, 35862306a36Sopenharmony_ci &peer_rate, &peer_sleep_rate); 35962306a36Sopenharmony_ci 36062306a36Sopenharmony_ci active_rate = max(this_rate, peer_rate); 36162306a36Sopenharmony_ci ret = clk_smd_rpm_set_rate_active(r, active_rate); 36262306a36Sopenharmony_ci if (ret) 36362306a36Sopenharmony_ci goto out; 36462306a36Sopenharmony_ci 36562306a36Sopenharmony_ci sleep_rate = max(this_sleep_rate, peer_sleep_rate); 36662306a36Sopenharmony_ci ret = clk_smd_rpm_set_rate_sleep(r, sleep_rate); 36762306a36Sopenharmony_ci if (ret) 36862306a36Sopenharmony_ci goto out; 36962306a36Sopenharmony_ci 37062306a36Sopenharmony_ci r->rate = rate; 37162306a36Sopenharmony_ci 37262306a36Sopenharmony_ciout: 37362306a36Sopenharmony_ci mutex_unlock(&rpm_smd_clk_lock); 37462306a36Sopenharmony_ci 37562306a36Sopenharmony_ci return ret; 37662306a36Sopenharmony_ci} 37762306a36Sopenharmony_ci 37862306a36Sopenharmony_cistatic long clk_smd_rpm_round_rate(struct clk_hw *hw, unsigned long rate, 37962306a36Sopenharmony_ci unsigned long *parent_rate) 38062306a36Sopenharmony_ci{ 38162306a36Sopenharmony_ci /* 38262306a36Sopenharmony_ci * RPM handles rate rounding and we don't have a way to 38362306a36Sopenharmony_ci * know what the rate will be, so just return whatever 38462306a36Sopenharmony_ci * rate is requested. 38562306a36Sopenharmony_ci */ 38662306a36Sopenharmony_ci return rate; 38762306a36Sopenharmony_ci} 38862306a36Sopenharmony_ci 38962306a36Sopenharmony_cistatic unsigned long clk_smd_rpm_recalc_rate(struct clk_hw *hw, 39062306a36Sopenharmony_ci unsigned long parent_rate) 39162306a36Sopenharmony_ci{ 39262306a36Sopenharmony_ci struct clk_smd_rpm *r = to_clk_smd_rpm(hw); 39362306a36Sopenharmony_ci 39462306a36Sopenharmony_ci /* 39562306a36Sopenharmony_ci * RPM handles rate rounding and we don't have a way to 39662306a36Sopenharmony_ci * know what the rate will be, so just return whatever 39762306a36Sopenharmony_ci * rate was set. 39862306a36Sopenharmony_ci */ 39962306a36Sopenharmony_ci return r->rate; 40062306a36Sopenharmony_ci} 40162306a36Sopenharmony_ci 40262306a36Sopenharmony_cistatic int clk_smd_rpm_enable_scaling(void) 40362306a36Sopenharmony_ci{ 40462306a36Sopenharmony_ci int ret; 40562306a36Sopenharmony_ci struct clk_smd_rpm_req req = { 40662306a36Sopenharmony_ci .key = cpu_to_le32(QCOM_RPM_SMD_KEY_ENABLE), 40762306a36Sopenharmony_ci .nbytes = cpu_to_le32(sizeof(u32)), 40862306a36Sopenharmony_ci .value = cpu_to_le32(1), 40962306a36Sopenharmony_ci }; 41062306a36Sopenharmony_ci 41162306a36Sopenharmony_ci ret = qcom_rpm_smd_write(rpmcc_smd_rpm, QCOM_SMD_RPM_SLEEP_STATE, 41262306a36Sopenharmony_ci QCOM_SMD_RPM_MISC_CLK, 41362306a36Sopenharmony_ci QCOM_RPM_SCALING_ENABLE_ID, &req, sizeof(req)); 41462306a36Sopenharmony_ci if (ret) { 41562306a36Sopenharmony_ci pr_err("RPM clock scaling (sleep set) not enabled!\n"); 41662306a36Sopenharmony_ci return ret; 41762306a36Sopenharmony_ci } 41862306a36Sopenharmony_ci 41962306a36Sopenharmony_ci ret = qcom_rpm_smd_write(rpmcc_smd_rpm, QCOM_SMD_RPM_ACTIVE_STATE, 42062306a36Sopenharmony_ci QCOM_SMD_RPM_MISC_CLK, 42162306a36Sopenharmony_ci QCOM_RPM_SCALING_ENABLE_ID, &req, sizeof(req)); 42262306a36Sopenharmony_ci if (ret) { 42362306a36Sopenharmony_ci pr_err("RPM clock scaling (active set) not enabled!\n"); 42462306a36Sopenharmony_ci return ret; 42562306a36Sopenharmony_ci } 42662306a36Sopenharmony_ci 42762306a36Sopenharmony_ci pr_debug("%s: RPM clock scaling is enabled\n", __func__); 42862306a36Sopenharmony_ci return 0; 42962306a36Sopenharmony_ci} 43062306a36Sopenharmony_ci 43162306a36Sopenharmony_cistatic const struct clk_ops clk_smd_rpm_ops = { 43262306a36Sopenharmony_ci .prepare = clk_smd_rpm_prepare, 43362306a36Sopenharmony_ci .unprepare = clk_smd_rpm_unprepare, 43462306a36Sopenharmony_ci .set_rate = clk_smd_rpm_set_rate, 43562306a36Sopenharmony_ci .round_rate = clk_smd_rpm_round_rate, 43662306a36Sopenharmony_ci .recalc_rate = clk_smd_rpm_recalc_rate, 43762306a36Sopenharmony_ci}; 43862306a36Sopenharmony_ci 43962306a36Sopenharmony_cistatic const struct clk_ops clk_smd_rpm_branch_ops = { 44062306a36Sopenharmony_ci .prepare = clk_smd_rpm_prepare, 44162306a36Sopenharmony_ci .unprepare = clk_smd_rpm_unprepare, 44262306a36Sopenharmony_ci .recalc_rate = clk_smd_rpm_recalc_rate, 44362306a36Sopenharmony_ci}; 44462306a36Sopenharmony_ci 44562306a36Sopenharmony_ci/* Disabling BI_TCXO_AO could gate the root clock source of the entire system. */ 44662306a36Sopenharmony_ciDEFINE_CLK_SMD_RPM_BRANCH_A(bi_tcxo, QCOM_SMD_RPM_MISC_CLK, 0, 19200000, CLK_IS_CRITICAL); 44762306a36Sopenharmony_ciDEFINE_CLK_SMD_RPM_BRANCH(qdss, QCOM_SMD_RPM_MISC_CLK, 1, 19200000); 44862306a36Sopenharmony_ciDEFINE_CLK_SMD_RPM_QDSS(qdss, QCOM_SMD_RPM_MISC_CLK, 1); 44962306a36Sopenharmony_ciDEFINE_CLK_SMD_RPM_BRANCH_A(bimc_freq_log, QCOM_SMD_RPM_MISC_CLK, 4, 1, 0); 45062306a36Sopenharmony_ci 45162306a36Sopenharmony_ciDEFINE_CLK_SMD_RPM_BRANCH(mss_cfg_ahb, QCOM_SMD_RPM_MCFG_CLK, 0, 19200000); 45262306a36Sopenharmony_ci 45362306a36Sopenharmony_ciDEFINE_CLK_SMD_RPM_BRANCH(aggre1_noc, QCOM_SMD_RPM_AGGR_CLK, 1, 1000); 45462306a36Sopenharmony_ciDEFINE_CLK_SMD_RPM_BRANCH(aggre2_noc, QCOM_SMD_RPM_AGGR_CLK, 2, 1000); 45562306a36Sopenharmony_ciDEFINE_CLK_SMD_RPM(aggre1_noc, QCOM_SMD_RPM_AGGR_CLK, 1); 45662306a36Sopenharmony_ciDEFINE_CLK_SMD_RPM(aggre2_noc, QCOM_SMD_RPM_AGGR_CLK, 2); 45762306a36Sopenharmony_ci 45862306a36Sopenharmony_ciDEFINE_CLK_SMD_RPM_BUS_A(pcnoc, 0, 19200000, CLK_IS_CRITICAL); 45962306a36Sopenharmony_ciDEFINE_CLK_SMD_RPM_BUS(snoc, 1); 46062306a36Sopenharmony_ciDEFINE_CLK_SMD_RPM_BUS(sysmmnoc, 2); 46162306a36Sopenharmony_ciDEFINE_CLK_SMD_RPM_BUS(cnoc, 2); 46262306a36Sopenharmony_ciDEFINE_CLK_SMD_RPM_BUS(mmssnoc_ahb, 3); 46362306a36Sopenharmony_ciDEFINE_CLK_SMD_RPM_BUS(snoc_periph, 0); 46462306a36Sopenharmony_ciDEFINE_CLK_SMD_RPM_BUS(cnoc, 1); 46562306a36Sopenharmony_ciDEFINE_CLK_SMD_RPM_BUS(snoc, 2); 46662306a36Sopenharmony_ciDEFINE_CLK_SMD_RPM_BUS(snoc_lpass, 5); 46762306a36Sopenharmony_ci 46862306a36Sopenharmony_ciDEFINE_CLK_SMD_RPM(bimc, QCOM_SMD_RPM_MEM_CLK, 0); 46962306a36Sopenharmony_ciDEFINE_CLK_SMD_RPM(cpuss_gnoc, QCOM_SMD_RPM_MEM_CLK, 1); 47062306a36Sopenharmony_ciDEFINE_CLK_SMD_RPM_CLK_SRC(gfx3d, QCOM_SMD_RPM_MEM_CLK, 1); 47162306a36Sopenharmony_ciDEFINE_CLK_SMD_RPM(ocmemgx, QCOM_SMD_RPM_MEM_CLK, 2); 47262306a36Sopenharmony_ciDEFINE_CLK_SMD_RPM(bimc_gpu, QCOM_SMD_RPM_MEM_CLK, 2); 47362306a36Sopenharmony_ci 47462306a36Sopenharmony_ciDEFINE_CLK_SMD_RPM(ce1, QCOM_SMD_RPM_CE_CLK, 0); 47562306a36Sopenharmony_ciDEFINE_CLK_SMD_RPM(ce2, QCOM_SMD_RPM_CE_CLK, 1); 47662306a36Sopenharmony_ciDEFINE_CLK_SMD_RPM(ce3, QCOM_SMD_RPM_CE_CLK, 2); 47762306a36Sopenharmony_ci 47862306a36Sopenharmony_ciDEFINE_CLK_SMD_RPM(ipa, QCOM_SMD_RPM_IPA_CLK, 0); 47962306a36Sopenharmony_ci 48062306a36Sopenharmony_ciDEFINE_CLK_SMD_RPM(hwkm, QCOM_SMD_RPM_HWKM_CLK, 0); 48162306a36Sopenharmony_ci 48262306a36Sopenharmony_ciDEFINE_CLK_SMD_RPM(mmssnoc_axi_rpm, QCOM_SMD_RPM_MMAXI_CLK, 0); 48362306a36Sopenharmony_ciDEFINE_CLK_SMD_RPM(mmnrt, QCOM_SMD_RPM_MMAXI_CLK, 0); 48462306a36Sopenharmony_ciDEFINE_CLK_SMD_RPM(mmrt, QCOM_SMD_RPM_MMAXI_CLK, 1); 48562306a36Sopenharmony_ci 48662306a36Sopenharmony_ciDEFINE_CLK_SMD_RPM(pka, QCOM_SMD_RPM_PKA_CLK, 0); 48762306a36Sopenharmony_ci 48862306a36Sopenharmony_ciDEFINE_CLK_SMD_RPM(qpic, QCOM_SMD_RPM_QPIC_CLK, 0); 48962306a36Sopenharmony_ci 49062306a36Sopenharmony_ciDEFINE_CLK_SMD_RPM(qup, QCOM_SMD_RPM_QUP_CLK, 0); 49162306a36Sopenharmony_ci 49262306a36Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(bb_clk1, 1, 19200000); 49362306a36Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(bb_clk2, 2, 19200000); 49462306a36Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(ln_bb_clk1, 1, 19200000); 49562306a36Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(ln_bb_clk2, 2, 19200000); 49662306a36Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(ln_bb_clk3, 3, 19200000); 49762306a36Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(rf_clk1, 4, 19200000); 49862306a36Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(rf_clk2, 5, 19200000); 49962306a36Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(rf_clk3, 6, 19200000); 50062306a36Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(ln_bb_clk, 8, 19200000); 50162306a36Sopenharmony_ci 50262306a36Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER_PREFIX(38m4_, rf_clk3, 6, 38400000); 50362306a36Sopenharmony_ci 50462306a36Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(cxo_d0, 1, 19200000); 50562306a36Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(cxo_d1, 2, 19200000); 50662306a36Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(cxo_a0, 4, 19200000); 50762306a36Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(cxo_a1, 5, 19200000); 50862306a36Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(cxo_a2, 6, 19200000); 50962306a36Sopenharmony_ci 51062306a36Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER(diff_clk, 7, 19200000); 51162306a36Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER(div_clk1, 11, 19200000); 51262306a36Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER(div_clk2, 12, 19200000); 51362306a36Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER(div_clk3, 13, 19200000); 51462306a36Sopenharmony_ci 51562306a36Sopenharmony_cistatic const struct clk_smd_rpm *bimc_pcnoc_icc_clks[] = { 51662306a36Sopenharmony_ci &clk_smd_rpm_bimc_clk, 51762306a36Sopenharmony_ci &clk_smd_rpm_bus_0_pcnoc_clk, 51862306a36Sopenharmony_ci}; 51962306a36Sopenharmony_ci 52062306a36Sopenharmony_cistatic const struct clk_smd_rpm *bimc_pcnoc_snoc_icc_clks[] = { 52162306a36Sopenharmony_ci &clk_smd_rpm_bimc_clk, 52262306a36Sopenharmony_ci &clk_smd_rpm_bus_0_pcnoc_clk, 52362306a36Sopenharmony_ci &clk_smd_rpm_bus_1_snoc_clk, 52462306a36Sopenharmony_ci}; 52562306a36Sopenharmony_ci 52662306a36Sopenharmony_cistatic const struct clk_smd_rpm *bimc_pcnoc_snoc_smmnoc_icc_clks[] = { 52762306a36Sopenharmony_ci &clk_smd_rpm_bimc_clk, 52862306a36Sopenharmony_ci &clk_smd_rpm_bus_0_pcnoc_clk, 52962306a36Sopenharmony_ci &clk_smd_rpm_bus_1_snoc_clk, 53062306a36Sopenharmony_ci &clk_smd_rpm_bus_2_sysmmnoc_clk, 53162306a36Sopenharmony_ci}; 53262306a36Sopenharmony_ci 53362306a36Sopenharmony_cistatic const struct clk_smd_rpm *bimc_pcnoc_snoc_cnoc_ocmem_icc_clks[] = { 53462306a36Sopenharmony_ci &clk_smd_rpm_bimc_clk, 53562306a36Sopenharmony_ci &clk_smd_rpm_bus_0_pcnoc_clk, 53662306a36Sopenharmony_ci &clk_smd_rpm_bus_1_snoc_clk, 53762306a36Sopenharmony_ci &clk_smd_rpm_bus_2_cnoc_clk, 53862306a36Sopenharmony_ci &clk_smd_rpm_ocmemgx_clk, 53962306a36Sopenharmony_ci}; 54062306a36Sopenharmony_ci 54162306a36Sopenharmony_cistatic const struct clk_smd_rpm *msm8996_icc_clks[] = { 54262306a36Sopenharmony_ci &clk_smd_rpm_bimc_clk, 54362306a36Sopenharmony_ci &clk_smd_rpm_branch_aggre1_noc_clk, 54462306a36Sopenharmony_ci &clk_smd_rpm_branch_aggre2_noc_clk, 54562306a36Sopenharmony_ci &clk_smd_rpm_bus_0_pcnoc_clk, 54662306a36Sopenharmony_ci &clk_smd_rpm_bus_1_snoc_clk, 54762306a36Sopenharmony_ci &clk_smd_rpm_bus_2_cnoc_clk, 54862306a36Sopenharmony_ci &clk_smd_rpm_mmssnoc_axi_rpm_clk, 54962306a36Sopenharmony_ci}; 55062306a36Sopenharmony_ci 55162306a36Sopenharmony_cistatic const struct clk_smd_rpm *msm8998_icc_clks[] = { 55262306a36Sopenharmony_ci &clk_smd_rpm_aggre1_noc_clk, 55362306a36Sopenharmony_ci &clk_smd_rpm_aggre2_noc_clk, 55462306a36Sopenharmony_ci &clk_smd_rpm_bimc_clk, 55562306a36Sopenharmony_ci &clk_smd_rpm_bus_1_snoc_clk, 55662306a36Sopenharmony_ci &clk_smd_rpm_bus_2_cnoc_clk, 55762306a36Sopenharmony_ci &clk_smd_rpm_mmssnoc_axi_rpm_clk, 55862306a36Sopenharmony_ci}; 55962306a36Sopenharmony_ci 56062306a36Sopenharmony_cistatic const struct clk_smd_rpm *sdm660_icc_clks[] = { 56162306a36Sopenharmony_ci &clk_smd_rpm_aggre2_noc_clk, 56262306a36Sopenharmony_ci &clk_smd_rpm_bimc_clk, 56362306a36Sopenharmony_ci &clk_smd_rpm_bus_1_snoc_clk, 56462306a36Sopenharmony_ci &clk_smd_rpm_bus_2_cnoc_clk, 56562306a36Sopenharmony_ci &clk_smd_rpm_mmssnoc_axi_rpm_clk, 56662306a36Sopenharmony_ci}; 56762306a36Sopenharmony_ci 56862306a36Sopenharmony_cistatic const struct clk_smd_rpm *sm_qnoc_icc_clks[] = { 56962306a36Sopenharmony_ci &clk_smd_rpm_bimc_clk, 57062306a36Sopenharmony_ci &clk_smd_rpm_bus_1_cnoc_clk, 57162306a36Sopenharmony_ci &clk_smd_rpm_mmnrt_clk, 57262306a36Sopenharmony_ci &clk_smd_rpm_mmrt_clk, 57362306a36Sopenharmony_ci &clk_smd_rpm_qup_clk, 57462306a36Sopenharmony_ci &clk_smd_rpm_bus_2_snoc_clk, 57562306a36Sopenharmony_ci}; 57662306a36Sopenharmony_ci 57762306a36Sopenharmony_cistatic struct clk_smd_rpm *msm8909_clks[] = { 57862306a36Sopenharmony_ci [RPM_SMD_QPIC_CLK] = &clk_smd_rpm_qpic_clk, 57962306a36Sopenharmony_ci [RPM_SMD_QPIC_CLK_A] = &clk_smd_rpm_qpic_a_clk, 58062306a36Sopenharmony_ci [RPM_SMD_QDSS_CLK] = &clk_smd_rpm_qdss_clk, 58162306a36Sopenharmony_ci [RPM_SMD_QDSS_A_CLK] = &clk_smd_rpm_qdss_a_clk, 58262306a36Sopenharmony_ci [RPM_SMD_BB_CLK1] = &clk_smd_rpm_bb_clk1, 58362306a36Sopenharmony_ci [RPM_SMD_BB_CLK1_A] = &clk_smd_rpm_bb_clk1_a, 58462306a36Sopenharmony_ci [RPM_SMD_BB_CLK2] = &clk_smd_rpm_bb_clk2, 58562306a36Sopenharmony_ci [RPM_SMD_BB_CLK2_A] = &clk_smd_rpm_bb_clk2_a, 58662306a36Sopenharmony_ci [RPM_SMD_RF_CLK1] = &clk_smd_rpm_rf_clk1, 58762306a36Sopenharmony_ci [RPM_SMD_RF_CLK1_A] = &clk_smd_rpm_rf_clk1_a, 58862306a36Sopenharmony_ci [RPM_SMD_RF_CLK2] = &clk_smd_rpm_rf_clk2, 58962306a36Sopenharmony_ci [RPM_SMD_RF_CLK2_A] = &clk_smd_rpm_rf_clk2_a, 59062306a36Sopenharmony_ci [RPM_SMD_BB_CLK1_PIN] = &clk_smd_rpm_bb_clk1_pin, 59162306a36Sopenharmony_ci [RPM_SMD_BB_CLK1_A_PIN] = &clk_smd_rpm_bb_clk1_a_pin, 59262306a36Sopenharmony_ci [RPM_SMD_BB_CLK2_PIN] = &clk_smd_rpm_bb_clk2_pin, 59362306a36Sopenharmony_ci [RPM_SMD_BB_CLK2_A_PIN] = &clk_smd_rpm_bb_clk2_a_pin, 59462306a36Sopenharmony_ci [RPM_SMD_RF_CLK1_PIN] = &clk_smd_rpm_rf_clk1_pin, 59562306a36Sopenharmony_ci [RPM_SMD_RF_CLK1_A_PIN] = &clk_smd_rpm_rf_clk1_a_pin, 59662306a36Sopenharmony_ci [RPM_SMD_RF_CLK2_PIN] = &clk_smd_rpm_rf_clk2_pin, 59762306a36Sopenharmony_ci [RPM_SMD_RF_CLK2_A_PIN] = &clk_smd_rpm_rf_clk2_a_pin, 59862306a36Sopenharmony_ci}; 59962306a36Sopenharmony_ci 60062306a36Sopenharmony_cistatic const struct rpm_smd_clk_desc rpm_clk_msm8909 = { 60162306a36Sopenharmony_ci .clks = msm8909_clks, 60262306a36Sopenharmony_ci .num_clks = ARRAY_SIZE(msm8909_clks), 60362306a36Sopenharmony_ci .icc_clks = bimc_pcnoc_snoc_icc_clks, 60462306a36Sopenharmony_ci .num_icc_clks = ARRAY_SIZE(bimc_pcnoc_snoc_icc_clks), 60562306a36Sopenharmony_ci}; 60662306a36Sopenharmony_ci 60762306a36Sopenharmony_cistatic struct clk_smd_rpm *msm8916_clks[] = { 60862306a36Sopenharmony_ci [RPM_SMD_QDSS_CLK] = &clk_smd_rpm_qdss_clk, 60962306a36Sopenharmony_ci [RPM_SMD_QDSS_A_CLK] = &clk_smd_rpm_qdss_a_clk, 61062306a36Sopenharmony_ci [RPM_SMD_BB_CLK1] = &clk_smd_rpm_bb_clk1, 61162306a36Sopenharmony_ci [RPM_SMD_BB_CLK1_A] = &clk_smd_rpm_bb_clk1_a, 61262306a36Sopenharmony_ci [RPM_SMD_BB_CLK2] = &clk_smd_rpm_bb_clk2, 61362306a36Sopenharmony_ci [RPM_SMD_BB_CLK2_A] = &clk_smd_rpm_bb_clk2_a, 61462306a36Sopenharmony_ci [RPM_SMD_RF_CLK1] = &clk_smd_rpm_rf_clk1, 61562306a36Sopenharmony_ci [RPM_SMD_RF_CLK1_A] = &clk_smd_rpm_rf_clk1_a, 61662306a36Sopenharmony_ci [RPM_SMD_RF_CLK2] = &clk_smd_rpm_rf_clk2, 61762306a36Sopenharmony_ci [RPM_SMD_RF_CLK2_A] = &clk_smd_rpm_rf_clk2_a, 61862306a36Sopenharmony_ci [RPM_SMD_BB_CLK1_PIN] = &clk_smd_rpm_bb_clk1_pin, 61962306a36Sopenharmony_ci [RPM_SMD_BB_CLK1_A_PIN] = &clk_smd_rpm_bb_clk1_a_pin, 62062306a36Sopenharmony_ci [RPM_SMD_BB_CLK2_PIN] = &clk_smd_rpm_bb_clk2_pin, 62162306a36Sopenharmony_ci [RPM_SMD_BB_CLK2_A_PIN] = &clk_smd_rpm_bb_clk2_a_pin, 62262306a36Sopenharmony_ci [RPM_SMD_RF_CLK1_PIN] = &clk_smd_rpm_rf_clk1_pin, 62362306a36Sopenharmony_ci [RPM_SMD_RF_CLK1_A_PIN] = &clk_smd_rpm_rf_clk1_a_pin, 62462306a36Sopenharmony_ci [RPM_SMD_RF_CLK2_PIN] = &clk_smd_rpm_rf_clk2_pin, 62562306a36Sopenharmony_ci [RPM_SMD_RF_CLK2_A_PIN] = &clk_smd_rpm_rf_clk2_a_pin, 62662306a36Sopenharmony_ci}; 62762306a36Sopenharmony_ci 62862306a36Sopenharmony_cistatic const struct rpm_smd_clk_desc rpm_clk_msm8916 = { 62962306a36Sopenharmony_ci .clks = msm8916_clks, 63062306a36Sopenharmony_ci .num_clks = ARRAY_SIZE(msm8916_clks), 63162306a36Sopenharmony_ci .icc_clks = bimc_pcnoc_snoc_icc_clks, 63262306a36Sopenharmony_ci .num_icc_clks = ARRAY_SIZE(bimc_pcnoc_snoc_icc_clks), 63362306a36Sopenharmony_ci}; 63462306a36Sopenharmony_ci 63562306a36Sopenharmony_cistatic struct clk_smd_rpm *msm8917_clks[] = { 63662306a36Sopenharmony_ci [RPM_SMD_XO_CLK_SRC] = &clk_smd_rpm_branch_bi_tcxo, 63762306a36Sopenharmony_ci [RPM_SMD_XO_A_CLK_SRC] = &clk_smd_rpm_branch_bi_tcxo_a, 63862306a36Sopenharmony_ci [RPM_SMD_BIMC_GPU_CLK] = &clk_smd_rpm_bimc_gpu_clk, 63962306a36Sopenharmony_ci [RPM_SMD_BIMC_GPU_A_CLK] = &clk_smd_rpm_bimc_gpu_a_clk, 64062306a36Sopenharmony_ci [RPM_SMD_QDSS_CLK] = &clk_smd_rpm_qdss_clk, 64162306a36Sopenharmony_ci [RPM_SMD_QDSS_A_CLK] = &clk_smd_rpm_qdss_a_clk, 64262306a36Sopenharmony_ci [RPM_SMD_BB_CLK1] = &clk_smd_rpm_bb_clk1, 64362306a36Sopenharmony_ci [RPM_SMD_BB_CLK1_A] = &clk_smd_rpm_bb_clk1_a, 64462306a36Sopenharmony_ci [RPM_SMD_BB_CLK2] = &clk_smd_rpm_bb_clk2, 64562306a36Sopenharmony_ci [RPM_SMD_BB_CLK2_A] = &clk_smd_rpm_bb_clk2_a, 64662306a36Sopenharmony_ci [RPM_SMD_RF_CLK2] = &clk_smd_rpm_rf_clk2, 64762306a36Sopenharmony_ci [RPM_SMD_RF_CLK2_A] = &clk_smd_rpm_rf_clk2_a, 64862306a36Sopenharmony_ci [RPM_SMD_DIV_CLK2] = &clk_smd_rpm_div_clk2, 64962306a36Sopenharmony_ci [RPM_SMD_DIV_A_CLK2] = &clk_smd_rpm_div_clk2_a, 65062306a36Sopenharmony_ci [RPM_SMD_BB_CLK1_PIN] = &clk_smd_rpm_bb_clk1_pin, 65162306a36Sopenharmony_ci [RPM_SMD_BB_CLK1_A_PIN] = &clk_smd_rpm_bb_clk1_a_pin, 65262306a36Sopenharmony_ci [RPM_SMD_BB_CLK2_PIN] = &clk_smd_rpm_bb_clk2_pin, 65362306a36Sopenharmony_ci [RPM_SMD_BB_CLK2_A_PIN] = &clk_smd_rpm_bb_clk2_a_pin, 65462306a36Sopenharmony_ci}; 65562306a36Sopenharmony_ci 65662306a36Sopenharmony_cistatic const struct rpm_smd_clk_desc rpm_clk_msm8917 = { 65762306a36Sopenharmony_ci .clks = msm8917_clks, 65862306a36Sopenharmony_ci .num_clks = ARRAY_SIZE(msm8917_clks), 65962306a36Sopenharmony_ci .icc_clks = bimc_pcnoc_snoc_smmnoc_icc_clks, 66062306a36Sopenharmony_ci .num_icc_clks = ARRAY_SIZE(bimc_pcnoc_snoc_smmnoc_icc_clks), 66162306a36Sopenharmony_ci}; 66262306a36Sopenharmony_ci 66362306a36Sopenharmony_cistatic struct clk_smd_rpm *msm8936_clks[] = { 66462306a36Sopenharmony_ci [RPM_SMD_XO_CLK_SRC] = &clk_smd_rpm_branch_bi_tcxo, 66562306a36Sopenharmony_ci [RPM_SMD_XO_A_CLK_SRC] = &clk_smd_rpm_branch_bi_tcxo_a, 66662306a36Sopenharmony_ci [RPM_SMD_QDSS_CLK] = &clk_smd_rpm_qdss_clk, 66762306a36Sopenharmony_ci [RPM_SMD_QDSS_A_CLK] = &clk_smd_rpm_qdss_a_clk, 66862306a36Sopenharmony_ci [RPM_SMD_BB_CLK1] = &clk_smd_rpm_bb_clk1, 66962306a36Sopenharmony_ci [RPM_SMD_BB_CLK1_A] = &clk_smd_rpm_bb_clk1_a, 67062306a36Sopenharmony_ci [RPM_SMD_BB_CLK2] = &clk_smd_rpm_bb_clk2, 67162306a36Sopenharmony_ci [RPM_SMD_BB_CLK2_A] = &clk_smd_rpm_bb_clk2_a, 67262306a36Sopenharmony_ci [RPM_SMD_RF_CLK1] = &clk_smd_rpm_rf_clk1, 67362306a36Sopenharmony_ci [RPM_SMD_RF_CLK1_A] = &clk_smd_rpm_rf_clk1_a, 67462306a36Sopenharmony_ci [RPM_SMD_RF_CLK2] = &clk_smd_rpm_rf_clk2, 67562306a36Sopenharmony_ci [RPM_SMD_RF_CLK2_A] = &clk_smd_rpm_rf_clk2_a, 67662306a36Sopenharmony_ci [RPM_SMD_BB_CLK1_PIN] = &clk_smd_rpm_bb_clk1_pin, 67762306a36Sopenharmony_ci [RPM_SMD_BB_CLK1_A_PIN] = &clk_smd_rpm_bb_clk1_a_pin, 67862306a36Sopenharmony_ci [RPM_SMD_BB_CLK2_PIN] = &clk_smd_rpm_bb_clk2_pin, 67962306a36Sopenharmony_ci [RPM_SMD_BB_CLK2_A_PIN] = &clk_smd_rpm_bb_clk2_a_pin, 68062306a36Sopenharmony_ci [RPM_SMD_RF_CLK1_PIN] = &clk_smd_rpm_rf_clk1_pin, 68162306a36Sopenharmony_ci [RPM_SMD_RF_CLK1_A_PIN] = &clk_smd_rpm_rf_clk1_a_pin, 68262306a36Sopenharmony_ci [RPM_SMD_RF_CLK2_PIN] = &clk_smd_rpm_rf_clk2_pin, 68362306a36Sopenharmony_ci [RPM_SMD_RF_CLK2_A_PIN] = &clk_smd_rpm_rf_clk2_a_pin, 68462306a36Sopenharmony_ci}; 68562306a36Sopenharmony_ci 68662306a36Sopenharmony_cistatic const struct rpm_smd_clk_desc rpm_clk_msm8936 = { 68762306a36Sopenharmony_ci .clks = msm8936_clks, 68862306a36Sopenharmony_ci .num_clks = ARRAY_SIZE(msm8936_clks), 68962306a36Sopenharmony_ci .icc_clks = bimc_pcnoc_snoc_smmnoc_icc_clks, 69062306a36Sopenharmony_ci .num_icc_clks = ARRAY_SIZE(bimc_pcnoc_snoc_smmnoc_icc_clks), 69162306a36Sopenharmony_ci}; 69262306a36Sopenharmony_ci 69362306a36Sopenharmony_cistatic struct clk_smd_rpm *msm8974_clks[] = { 69462306a36Sopenharmony_ci [RPM_SMD_XO_CLK_SRC] = &clk_smd_rpm_branch_bi_tcxo, 69562306a36Sopenharmony_ci [RPM_SMD_XO_A_CLK_SRC] = &clk_smd_rpm_branch_bi_tcxo_a, 69662306a36Sopenharmony_ci [RPM_SMD_MMSSNOC_AHB_CLK] = &clk_smd_rpm_bus_3_mmssnoc_ahb_clk, 69762306a36Sopenharmony_ci [RPM_SMD_MMSSNOC_AHB_A_CLK] = &clk_smd_rpm_bus_3_mmssnoc_ahb_a_clk, 69862306a36Sopenharmony_ci [RPM_SMD_GFX3D_CLK_SRC] = &clk_smd_rpm_gfx3d_clk_src, 69962306a36Sopenharmony_ci [RPM_SMD_GFX3D_A_CLK_SRC] = &clk_smd_rpm_gfx3d_a_clk_src, 70062306a36Sopenharmony_ci [RPM_SMD_QDSS_CLK] = &clk_smd_rpm_qdss_clk, 70162306a36Sopenharmony_ci [RPM_SMD_QDSS_A_CLK] = &clk_smd_rpm_qdss_a_clk, 70262306a36Sopenharmony_ci [RPM_SMD_CXO_D0] = &clk_smd_rpm_cxo_d0, 70362306a36Sopenharmony_ci [RPM_SMD_CXO_D0_A] = &clk_smd_rpm_cxo_d0_a, 70462306a36Sopenharmony_ci [RPM_SMD_CXO_D1] = &clk_smd_rpm_cxo_d1, 70562306a36Sopenharmony_ci [RPM_SMD_CXO_D1_A] = &clk_smd_rpm_cxo_d1_a, 70662306a36Sopenharmony_ci [RPM_SMD_CXO_A0] = &clk_smd_rpm_cxo_a0, 70762306a36Sopenharmony_ci [RPM_SMD_CXO_A0_A] = &clk_smd_rpm_cxo_a0_a, 70862306a36Sopenharmony_ci [RPM_SMD_CXO_A1] = &clk_smd_rpm_cxo_a1, 70962306a36Sopenharmony_ci [RPM_SMD_CXO_A1_A] = &clk_smd_rpm_cxo_a1_a, 71062306a36Sopenharmony_ci [RPM_SMD_CXO_A2] = &clk_smd_rpm_cxo_a2, 71162306a36Sopenharmony_ci [RPM_SMD_CXO_A2_A] = &clk_smd_rpm_cxo_a2_a, 71262306a36Sopenharmony_ci [RPM_SMD_DIFF_CLK] = &clk_smd_rpm_diff_clk, 71362306a36Sopenharmony_ci [RPM_SMD_DIFF_A_CLK] = &clk_smd_rpm_diff_clk_a, 71462306a36Sopenharmony_ci [RPM_SMD_DIV_CLK1] = &clk_smd_rpm_div_clk1, 71562306a36Sopenharmony_ci [RPM_SMD_DIV_A_CLK1] = &clk_smd_rpm_div_clk1_a, 71662306a36Sopenharmony_ci [RPM_SMD_DIV_CLK2] = &clk_smd_rpm_div_clk2, 71762306a36Sopenharmony_ci [RPM_SMD_DIV_A_CLK2] = &clk_smd_rpm_div_clk2_a, 71862306a36Sopenharmony_ci [RPM_SMD_CXO_D0_PIN] = &clk_smd_rpm_cxo_d0_pin, 71962306a36Sopenharmony_ci [RPM_SMD_CXO_D0_A_PIN] = &clk_smd_rpm_cxo_d0_a_pin, 72062306a36Sopenharmony_ci [RPM_SMD_CXO_D1_PIN] = &clk_smd_rpm_cxo_d1_pin, 72162306a36Sopenharmony_ci [RPM_SMD_CXO_D1_A_PIN] = &clk_smd_rpm_cxo_d1_a_pin, 72262306a36Sopenharmony_ci [RPM_SMD_CXO_A0_PIN] = &clk_smd_rpm_cxo_a0_pin, 72362306a36Sopenharmony_ci [RPM_SMD_CXO_A0_A_PIN] = &clk_smd_rpm_cxo_a0_a_pin, 72462306a36Sopenharmony_ci [RPM_SMD_CXO_A1_PIN] = &clk_smd_rpm_cxo_a1_pin, 72562306a36Sopenharmony_ci [RPM_SMD_CXO_A1_A_PIN] = &clk_smd_rpm_cxo_a1_a_pin, 72662306a36Sopenharmony_ci [RPM_SMD_CXO_A2_PIN] = &clk_smd_rpm_cxo_a2_pin, 72762306a36Sopenharmony_ci [RPM_SMD_CXO_A2_A_PIN] = &clk_smd_rpm_cxo_a2_a_pin, 72862306a36Sopenharmony_ci}; 72962306a36Sopenharmony_ci 73062306a36Sopenharmony_cistatic const struct rpm_smd_clk_desc rpm_clk_msm8974 = { 73162306a36Sopenharmony_ci .clks = msm8974_clks, 73262306a36Sopenharmony_ci .num_clks = ARRAY_SIZE(msm8974_clks), 73362306a36Sopenharmony_ci .icc_clks = bimc_pcnoc_snoc_cnoc_ocmem_icc_clks, 73462306a36Sopenharmony_ci .num_icc_clks = ARRAY_SIZE(bimc_pcnoc_snoc_cnoc_ocmem_icc_clks), 73562306a36Sopenharmony_ci .scaling_before_handover = true, 73662306a36Sopenharmony_ci}; 73762306a36Sopenharmony_ci 73862306a36Sopenharmony_cistatic struct clk_smd_rpm *msm8976_clks[] = { 73962306a36Sopenharmony_ci [RPM_SMD_XO_CLK_SRC] = &clk_smd_rpm_branch_bi_tcxo, 74062306a36Sopenharmony_ci [RPM_SMD_XO_A_CLK_SRC] = &clk_smd_rpm_branch_bi_tcxo_a, 74162306a36Sopenharmony_ci [RPM_SMD_QDSS_CLK] = &clk_smd_rpm_qdss_clk, 74262306a36Sopenharmony_ci [RPM_SMD_QDSS_A_CLK] = &clk_smd_rpm_qdss_a_clk, 74362306a36Sopenharmony_ci [RPM_SMD_BB_CLK1] = &clk_smd_rpm_bb_clk1, 74462306a36Sopenharmony_ci [RPM_SMD_BB_CLK1_A] = &clk_smd_rpm_bb_clk1_a, 74562306a36Sopenharmony_ci [RPM_SMD_BB_CLK2] = &clk_smd_rpm_bb_clk2, 74662306a36Sopenharmony_ci [RPM_SMD_BB_CLK2_A] = &clk_smd_rpm_bb_clk2_a, 74762306a36Sopenharmony_ci [RPM_SMD_RF_CLK2] = &clk_smd_rpm_rf_clk2, 74862306a36Sopenharmony_ci [RPM_SMD_RF_CLK2_A] = &clk_smd_rpm_rf_clk2_a, 74962306a36Sopenharmony_ci [RPM_SMD_BB_CLK1_PIN] = &clk_smd_rpm_bb_clk1_pin, 75062306a36Sopenharmony_ci [RPM_SMD_BB_CLK1_A_PIN] = &clk_smd_rpm_bb_clk1_a_pin, 75162306a36Sopenharmony_ci [RPM_SMD_BB_CLK2_PIN] = &clk_smd_rpm_bb_clk2_pin, 75262306a36Sopenharmony_ci [RPM_SMD_BB_CLK2_A_PIN] = &clk_smd_rpm_bb_clk2_a_pin, 75362306a36Sopenharmony_ci [RPM_SMD_DIV_CLK2] = &clk_smd_rpm_div_clk2, 75462306a36Sopenharmony_ci [RPM_SMD_DIV_A_CLK2] = &clk_smd_rpm_div_clk2_a, 75562306a36Sopenharmony_ci [RPM_SMD_IPA_CLK] = &clk_smd_rpm_ipa_clk, 75662306a36Sopenharmony_ci [RPM_SMD_IPA_A_CLK] = &clk_smd_rpm_ipa_a_clk, 75762306a36Sopenharmony_ci}; 75862306a36Sopenharmony_ci 75962306a36Sopenharmony_cistatic const struct rpm_smd_clk_desc rpm_clk_msm8976 = { 76062306a36Sopenharmony_ci .clks = msm8976_clks, 76162306a36Sopenharmony_ci .icc_clks = bimc_pcnoc_snoc_smmnoc_icc_clks, 76262306a36Sopenharmony_ci .num_icc_clks = ARRAY_SIZE(bimc_pcnoc_snoc_smmnoc_icc_clks), 76362306a36Sopenharmony_ci}; 76462306a36Sopenharmony_ci 76562306a36Sopenharmony_cistatic struct clk_smd_rpm *msm8992_clks[] = { 76662306a36Sopenharmony_ci [RPM_SMD_XO_CLK_SRC] = &clk_smd_rpm_branch_bi_tcxo, 76762306a36Sopenharmony_ci [RPM_SMD_XO_A_CLK_SRC] = &clk_smd_rpm_branch_bi_tcxo_a, 76862306a36Sopenharmony_ci [RPM_SMD_GFX3D_CLK_SRC] = &clk_smd_rpm_gfx3d_clk_src, 76962306a36Sopenharmony_ci [RPM_SMD_GFX3D_A_CLK_SRC] = &clk_smd_rpm_gfx3d_a_clk_src, 77062306a36Sopenharmony_ci [RPM_SMD_BB_CLK1] = &clk_smd_rpm_bb_clk1, 77162306a36Sopenharmony_ci [RPM_SMD_BB_CLK1_A] = &clk_smd_rpm_bb_clk1_a, 77262306a36Sopenharmony_ci [RPM_SMD_BB_CLK1_PIN] = &clk_smd_rpm_bb_clk1_pin, 77362306a36Sopenharmony_ci [RPM_SMD_BB_CLK1_A_PIN] = &clk_smd_rpm_bb_clk1_a_pin, 77462306a36Sopenharmony_ci [RPM_SMD_BB_CLK2] = &clk_smd_rpm_bb_clk2, 77562306a36Sopenharmony_ci [RPM_SMD_BB_CLK2_A] = &clk_smd_rpm_bb_clk2_a, 77662306a36Sopenharmony_ci [RPM_SMD_BB_CLK2_PIN] = &clk_smd_rpm_bb_clk2_pin, 77762306a36Sopenharmony_ci [RPM_SMD_BB_CLK2_A_PIN] = &clk_smd_rpm_bb_clk2_a_pin, 77862306a36Sopenharmony_ci [RPM_SMD_DIV_CLK1] = &clk_smd_rpm_div_clk1, 77962306a36Sopenharmony_ci [RPM_SMD_DIV_A_CLK1] = &clk_smd_rpm_div_clk1_a, 78062306a36Sopenharmony_ci [RPM_SMD_DIV_CLK2] = &clk_smd_rpm_div_clk2, 78162306a36Sopenharmony_ci [RPM_SMD_DIV_A_CLK2] = &clk_smd_rpm_div_clk2_a, 78262306a36Sopenharmony_ci [RPM_SMD_DIV_CLK3] = &clk_smd_rpm_div_clk3, 78362306a36Sopenharmony_ci [RPM_SMD_DIV_A_CLK3] = &clk_smd_rpm_div_clk3_a, 78462306a36Sopenharmony_ci [RPM_SMD_IPA_CLK] = &clk_smd_rpm_ipa_clk, 78562306a36Sopenharmony_ci [RPM_SMD_IPA_A_CLK] = &clk_smd_rpm_ipa_a_clk, 78662306a36Sopenharmony_ci [RPM_SMD_LN_BB_CLK] = &clk_smd_rpm_ln_bb_clk, 78762306a36Sopenharmony_ci [RPM_SMD_LN_BB_A_CLK] = &clk_smd_rpm_ln_bb_clk_a, 78862306a36Sopenharmony_ci [RPM_SMD_MMSSNOC_AHB_CLK] = &clk_smd_rpm_bus_3_mmssnoc_ahb_clk, 78962306a36Sopenharmony_ci [RPM_SMD_MMSSNOC_AHB_A_CLK] = &clk_smd_rpm_bus_3_mmssnoc_ahb_a_clk, 79062306a36Sopenharmony_ci [RPM_SMD_MSS_CFG_AHB_CLK] = &clk_smd_rpm_branch_mss_cfg_ahb_clk, 79162306a36Sopenharmony_ci [RPM_SMD_MSS_CFG_AHB_A_CLK] = &clk_smd_rpm_branch_mss_cfg_ahb_a_clk, 79262306a36Sopenharmony_ci [RPM_SMD_QDSS_CLK] = &clk_smd_rpm_qdss_clk, 79362306a36Sopenharmony_ci [RPM_SMD_QDSS_A_CLK] = &clk_smd_rpm_qdss_a_clk, 79462306a36Sopenharmony_ci [RPM_SMD_RF_CLK1] = &clk_smd_rpm_rf_clk1, 79562306a36Sopenharmony_ci [RPM_SMD_RF_CLK1_A] = &clk_smd_rpm_rf_clk1_a, 79662306a36Sopenharmony_ci [RPM_SMD_RF_CLK2] = &clk_smd_rpm_rf_clk2, 79762306a36Sopenharmony_ci [RPM_SMD_RF_CLK2_A] = &clk_smd_rpm_rf_clk2_a, 79862306a36Sopenharmony_ci [RPM_SMD_RF_CLK1_PIN] = &clk_smd_rpm_rf_clk1_pin, 79962306a36Sopenharmony_ci [RPM_SMD_RF_CLK1_A_PIN] = &clk_smd_rpm_rf_clk1_a_pin, 80062306a36Sopenharmony_ci [RPM_SMD_RF_CLK2_PIN] = &clk_smd_rpm_rf_clk2_pin, 80162306a36Sopenharmony_ci [RPM_SMD_RF_CLK2_A_PIN] = &clk_smd_rpm_rf_clk2_a_pin, 80262306a36Sopenharmony_ci [RPM_SMD_CE1_CLK] = &clk_smd_rpm_ce1_clk, 80362306a36Sopenharmony_ci [RPM_SMD_CE1_A_CLK] = &clk_smd_rpm_ce1_a_clk, 80462306a36Sopenharmony_ci [RPM_SMD_CE2_CLK] = &clk_smd_rpm_ce2_clk, 80562306a36Sopenharmony_ci [RPM_SMD_CE2_A_CLK] = &clk_smd_rpm_ce2_a_clk, 80662306a36Sopenharmony_ci}; 80762306a36Sopenharmony_ci 80862306a36Sopenharmony_cistatic const struct rpm_smd_clk_desc rpm_clk_msm8992 = { 80962306a36Sopenharmony_ci .clks = msm8992_clks, 81062306a36Sopenharmony_ci .num_clks = ARRAY_SIZE(msm8992_clks), 81162306a36Sopenharmony_ci .icc_clks = bimc_pcnoc_snoc_cnoc_ocmem_icc_clks, 81262306a36Sopenharmony_ci .num_icc_clks = ARRAY_SIZE(bimc_pcnoc_snoc_cnoc_ocmem_icc_clks), 81362306a36Sopenharmony_ci}; 81462306a36Sopenharmony_ci 81562306a36Sopenharmony_cistatic struct clk_smd_rpm *msm8994_clks[] = { 81662306a36Sopenharmony_ci [RPM_SMD_XO_CLK_SRC] = &clk_smd_rpm_branch_bi_tcxo, 81762306a36Sopenharmony_ci [RPM_SMD_XO_A_CLK_SRC] = &clk_smd_rpm_branch_bi_tcxo_a, 81862306a36Sopenharmony_ci [RPM_SMD_GFX3D_CLK_SRC] = &clk_smd_rpm_gfx3d_clk_src, 81962306a36Sopenharmony_ci [RPM_SMD_GFX3D_A_CLK_SRC] = &clk_smd_rpm_gfx3d_a_clk_src, 82062306a36Sopenharmony_ci [RPM_SMD_BB_CLK1] = &clk_smd_rpm_bb_clk1, 82162306a36Sopenharmony_ci [RPM_SMD_BB_CLK1_A] = &clk_smd_rpm_bb_clk1_a, 82262306a36Sopenharmony_ci [RPM_SMD_BB_CLK1_PIN] = &clk_smd_rpm_bb_clk1_pin, 82362306a36Sopenharmony_ci [RPM_SMD_BB_CLK1_A_PIN] = &clk_smd_rpm_bb_clk1_a_pin, 82462306a36Sopenharmony_ci [RPM_SMD_BB_CLK2] = &clk_smd_rpm_bb_clk2, 82562306a36Sopenharmony_ci [RPM_SMD_BB_CLK2_A] = &clk_smd_rpm_bb_clk2_a, 82662306a36Sopenharmony_ci [RPM_SMD_BB_CLK2_PIN] = &clk_smd_rpm_bb_clk2_pin, 82762306a36Sopenharmony_ci [RPM_SMD_BB_CLK2_A_PIN] = &clk_smd_rpm_bb_clk2_a_pin, 82862306a36Sopenharmony_ci [RPM_SMD_DIV_CLK1] = &clk_smd_rpm_div_clk1, 82962306a36Sopenharmony_ci [RPM_SMD_DIV_A_CLK1] = &clk_smd_rpm_div_clk1_a, 83062306a36Sopenharmony_ci [RPM_SMD_DIV_CLK2] = &clk_smd_rpm_div_clk2, 83162306a36Sopenharmony_ci [RPM_SMD_DIV_A_CLK2] = &clk_smd_rpm_div_clk2_a, 83262306a36Sopenharmony_ci [RPM_SMD_DIV_CLK3] = &clk_smd_rpm_div_clk3, 83362306a36Sopenharmony_ci [RPM_SMD_DIV_A_CLK3] = &clk_smd_rpm_div_clk3_a, 83462306a36Sopenharmony_ci [RPM_SMD_IPA_CLK] = &clk_smd_rpm_ipa_clk, 83562306a36Sopenharmony_ci [RPM_SMD_IPA_A_CLK] = &clk_smd_rpm_ipa_a_clk, 83662306a36Sopenharmony_ci [RPM_SMD_LN_BB_CLK] = &clk_smd_rpm_ln_bb_clk, 83762306a36Sopenharmony_ci [RPM_SMD_LN_BB_A_CLK] = &clk_smd_rpm_ln_bb_clk_a, 83862306a36Sopenharmony_ci [RPM_SMD_MMSSNOC_AHB_CLK] = &clk_smd_rpm_bus_3_mmssnoc_ahb_clk, 83962306a36Sopenharmony_ci [RPM_SMD_MMSSNOC_AHB_A_CLK] = &clk_smd_rpm_bus_3_mmssnoc_ahb_a_clk, 84062306a36Sopenharmony_ci [RPM_SMD_MSS_CFG_AHB_CLK] = &clk_smd_rpm_branch_mss_cfg_ahb_clk, 84162306a36Sopenharmony_ci [RPM_SMD_MSS_CFG_AHB_A_CLK] = &clk_smd_rpm_branch_mss_cfg_ahb_a_clk, 84262306a36Sopenharmony_ci [RPM_SMD_QDSS_CLK] = &clk_smd_rpm_qdss_clk, 84362306a36Sopenharmony_ci [RPM_SMD_QDSS_A_CLK] = &clk_smd_rpm_qdss_a_clk, 84462306a36Sopenharmony_ci [RPM_SMD_RF_CLK1] = &clk_smd_rpm_rf_clk1, 84562306a36Sopenharmony_ci [RPM_SMD_RF_CLK1_A] = &clk_smd_rpm_rf_clk1_a, 84662306a36Sopenharmony_ci [RPM_SMD_RF_CLK2] = &clk_smd_rpm_rf_clk2, 84762306a36Sopenharmony_ci [RPM_SMD_RF_CLK2_A] = &clk_smd_rpm_rf_clk2_a, 84862306a36Sopenharmony_ci [RPM_SMD_RF_CLK1_PIN] = &clk_smd_rpm_rf_clk1_pin, 84962306a36Sopenharmony_ci [RPM_SMD_RF_CLK1_A_PIN] = &clk_smd_rpm_rf_clk1_a_pin, 85062306a36Sopenharmony_ci [RPM_SMD_RF_CLK2_PIN] = &clk_smd_rpm_rf_clk2_pin, 85162306a36Sopenharmony_ci [RPM_SMD_RF_CLK2_A_PIN] = &clk_smd_rpm_rf_clk2_a_pin, 85262306a36Sopenharmony_ci [RPM_SMD_CE1_CLK] = &clk_smd_rpm_ce1_clk, 85362306a36Sopenharmony_ci [RPM_SMD_CE1_A_CLK] = &clk_smd_rpm_ce1_a_clk, 85462306a36Sopenharmony_ci [RPM_SMD_CE2_CLK] = &clk_smd_rpm_ce2_clk, 85562306a36Sopenharmony_ci [RPM_SMD_CE2_A_CLK] = &clk_smd_rpm_ce2_a_clk, 85662306a36Sopenharmony_ci [RPM_SMD_CE3_CLK] = &clk_smd_rpm_ce3_clk, 85762306a36Sopenharmony_ci [RPM_SMD_CE3_A_CLK] = &clk_smd_rpm_ce3_a_clk, 85862306a36Sopenharmony_ci}; 85962306a36Sopenharmony_ci 86062306a36Sopenharmony_cistatic const struct rpm_smd_clk_desc rpm_clk_msm8994 = { 86162306a36Sopenharmony_ci .clks = msm8994_clks, 86262306a36Sopenharmony_ci .num_clks = ARRAY_SIZE(msm8994_clks), 86362306a36Sopenharmony_ci .icc_clks = bimc_pcnoc_snoc_cnoc_ocmem_icc_clks, 86462306a36Sopenharmony_ci .num_icc_clks = ARRAY_SIZE(bimc_pcnoc_snoc_cnoc_ocmem_icc_clks), 86562306a36Sopenharmony_ci}; 86662306a36Sopenharmony_ci 86762306a36Sopenharmony_cistatic struct clk_smd_rpm *msm8996_clks[] = { 86862306a36Sopenharmony_ci [RPM_SMD_XO_CLK_SRC] = &clk_smd_rpm_branch_bi_tcxo, 86962306a36Sopenharmony_ci [RPM_SMD_XO_A_CLK_SRC] = &clk_smd_rpm_branch_bi_tcxo_a, 87062306a36Sopenharmony_ci [RPM_SMD_IPA_CLK] = &clk_smd_rpm_ipa_clk, 87162306a36Sopenharmony_ci [RPM_SMD_IPA_A_CLK] = &clk_smd_rpm_ipa_a_clk, 87262306a36Sopenharmony_ci [RPM_SMD_CE1_CLK] = &clk_smd_rpm_ce1_clk, 87362306a36Sopenharmony_ci [RPM_SMD_CE1_A_CLK] = &clk_smd_rpm_ce1_a_clk, 87462306a36Sopenharmony_ci [RPM_SMD_QDSS_CLK] = &clk_smd_rpm_qdss_clk, 87562306a36Sopenharmony_ci [RPM_SMD_QDSS_A_CLK] = &clk_smd_rpm_qdss_a_clk, 87662306a36Sopenharmony_ci [RPM_SMD_BB_CLK1] = &clk_smd_rpm_bb_clk1, 87762306a36Sopenharmony_ci [RPM_SMD_BB_CLK1_A] = &clk_smd_rpm_bb_clk1_a, 87862306a36Sopenharmony_ci [RPM_SMD_BB_CLK2] = &clk_smd_rpm_bb_clk2, 87962306a36Sopenharmony_ci [RPM_SMD_BB_CLK2_A] = &clk_smd_rpm_bb_clk2_a, 88062306a36Sopenharmony_ci [RPM_SMD_RF_CLK1] = &clk_smd_rpm_rf_clk1, 88162306a36Sopenharmony_ci [RPM_SMD_RF_CLK1_A] = &clk_smd_rpm_rf_clk1_a, 88262306a36Sopenharmony_ci [RPM_SMD_RF_CLK2] = &clk_smd_rpm_rf_clk2, 88362306a36Sopenharmony_ci [RPM_SMD_RF_CLK2_A] = &clk_smd_rpm_rf_clk2_a, 88462306a36Sopenharmony_ci [RPM_SMD_LN_BB_CLK] = &clk_smd_rpm_ln_bb_clk, 88562306a36Sopenharmony_ci [RPM_SMD_LN_BB_A_CLK] = &clk_smd_rpm_ln_bb_clk_a, 88662306a36Sopenharmony_ci [RPM_SMD_DIV_CLK1] = &clk_smd_rpm_div_clk1, 88762306a36Sopenharmony_ci [RPM_SMD_DIV_A_CLK1] = &clk_smd_rpm_div_clk1_a, 88862306a36Sopenharmony_ci [RPM_SMD_DIV_CLK2] = &clk_smd_rpm_div_clk2, 88962306a36Sopenharmony_ci [RPM_SMD_DIV_A_CLK2] = &clk_smd_rpm_div_clk2_a, 89062306a36Sopenharmony_ci [RPM_SMD_DIV_CLK3] = &clk_smd_rpm_div_clk3, 89162306a36Sopenharmony_ci [RPM_SMD_DIV_A_CLK3] = &clk_smd_rpm_div_clk3_a, 89262306a36Sopenharmony_ci [RPM_SMD_BB_CLK1_PIN] = &clk_smd_rpm_bb_clk1_pin, 89362306a36Sopenharmony_ci [RPM_SMD_BB_CLK1_A_PIN] = &clk_smd_rpm_bb_clk1_a_pin, 89462306a36Sopenharmony_ci [RPM_SMD_BB_CLK2_PIN] = &clk_smd_rpm_bb_clk2_pin, 89562306a36Sopenharmony_ci [RPM_SMD_BB_CLK2_A_PIN] = &clk_smd_rpm_bb_clk2_a_pin, 89662306a36Sopenharmony_ci [RPM_SMD_RF_CLK1_PIN] = &clk_smd_rpm_rf_clk1_pin, 89762306a36Sopenharmony_ci [RPM_SMD_RF_CLK1_A_PIN] = &clk_smd_rpm_rf_clk1_a_pin, 89862306a36Sopenharmony_ci [RPM_SMD_RF_CLK2_PIN] = &clk_smd_rpm_rf_clk2_pin, 89962306a36Sopenharmony_ci [RPM_SMD_RF_CLK2_A_PIN] = &clk_smd_rpm_rf_clk2_a_pin, 90062306a36Sopenharmony_ci}; 90162306a36Sopenharmony_ci 90262306a36Sopenharmony_cistatic const struct rpm_smd_clk_desc rpm_clk_msm8996 = { 90362306a36Sopenharmony_ci .clks = msm8996_clks, 90462306a36Sopenharmony_ci .num_clks = ARRAY_SIZE(msm8996_clks), 90562306a36Sopenharmony_ci .icc_clks = msm8996_icc_clks, 90662306a36Sopenharmony_ci .num_icc_clks = ARRAY_SIZE(msm8996_icc_clks), 90762306a36Sopenharmony_ci}; 90862306a36Sopenharmony_ci 90962306a36Sopenharmony_cistatic struct clk_smd_rpm *qcs404_clks[] = { 91062306a36Sopenharmony_ci [RPM_SMD_QDSS_CLK] = &clk_smd_rpm_qdss_clk, 91162306a36Sopenharmony_ci [RPM_SMD_QDSS_A_CLK] = &clk_smd_rpm_qdss_a_clk, 91262306a36Sopenharmony_ci [RPM_SMD_PNOC_CLK] = &clk_smd_rpm_bus_0_pcnoc_clk, 91362306a36Sopenharmony_ci [RPM_SMD_PNOC_A_CLK] = &clk_smd_rpm_bus_0_pcnoc_a_clk, 91462306a36Sopenharmony_ci [RPM_SMD_SNOC_CLK] = &clk_smd_rpm_bus_1_snoc_clk, 91562306a36Sopenharmony_ci [RPM_SMD_SNOC_A_CLK] = &clk_smd_rpm_bus_1_snoc_a_clk, 91662306a36Sopenharmony_ci [RPM_SMD_BIMC_CLK] = &clk_smd_rpm_bimc_clk, 91762306a36Sopenharmony_ci [RPM_SMD_BIMC_A_CLK] = &clk_smd_rpm_bimc_a_clk, 91862306a36Sopenharmony_ci [RPM_SMD_BIMC_GPU_CLK] = &clk_smd_rpm_bimc_gpu_clk, 91962306a36Sopenharmony_ci [RPM_SMD_BIMC_GPU_A_CLK] = &clk_smd_rpm_bimc_gpu_a_clk, 92062306a36Sopenharmony_ci [RPM_SMD_QPIC_CLK] = &clk_smd_rpm_qpic_clk, 92162306a36Sopenharmony_ci [RPM_SMD_QPIC_CLK_A] = &clk_smd_rpm_qpic_a_clk, 92262306a36Sopenharmony_ci [RPM_SMD_CE1_CLK] = &clk_smd_rpm_ce1_clk, 92362306a36Sopenharmony_ci [RPM_SMD_CE1_A_CLK] = &clk_smd_rpm_ce1_a_clk, 92462306a36Sopenharmony_ci [RPM_SMD_RF_CLK1] = &clk_smd_rpm_rf_clk1, 92562306a36Sopenharmony_ci [RPM_SMD_RF_CLK1_A] = &clk_smd_rpm_rf_clk1_a, 92662306a36Sopenharmony_ci [RPM_SMD_LN_BB_CLK] = &clk_smd_rpm_ln_bb_clk, 92762306a36Sopenharmony_ci [RPM_SMD_LN_BB_A_CLK] = &clk_smd_rpm_ln_bb_clk_a, 92862306a36Sopenharmony_ci [RPM_SMD_LN_BB_CLK_PIN] = &clk_smd_rpm_ln_bb_clk_pin, 92962306a36Sopenharmony_ci [RPM_SMD_LN_BB_A_CLK_PIN] = &clk_smd_rpm_ln_bb_clk_a_pin, 93062306a36Sopenharmony_ci}; 93162306a36Sopenharmony_ci 93262306a36Sopenharmony_cistatic const struct rpm_smd_clk_desc rpm_clk_qcs404 = { 93362306a36Sopenharmony_ci .clks = qcs404_clks, 93462306a36Sopenharmony_ci .num_clks = ARRAY_SIZE(qcs404_clks), 93562306a36Sopenharmony_ci .icc_clks = bimc_pcnoc_snoc_icc_clks, 93662306a36Sopenharmony_ci .num_icc_clks = ARRAY_SIZE(bimc_pcnoc_snoc_icc_clks), 93762306a36Sopenharmony_ci}; 93862306a36Sopenharmony_ci 93962306a36Sopenharmony_cistatic struct clk_smd_rpm *msm8998_clks[] = { 94062306a36Sopenharmony_ci [RPM_SMD_XO_CLK_SRC] = &clk_smd_rpm_branch_bi_tcxo, 94162306a36Sopenharmony_ci [RPM_SMD_XO_A_CLK_SRC] = &clk_smd_rpm_branch_bi_tcxo_a, 94262306a36Sopenharmony_ci [RPM_SMD_PCNOC_CLK] = &clk_smd_rpm_bus_0_pcnoc_clk, 94362306a36Sopenharmony_ci [RPM_SMD_PCNOC_A_CLK] = &clk_smd_rpm_bus_0_pcnoc_a_clk, 94462306a36Sopenharmony_ci [RPM_SMD_CE1_CLK] = &clk_smd_rpm_ce1_clk, 94562306a36Sopenharmony_ci [RPM_SMD_CE1_A_CLK] = &clk_smd_rpm_ce1_a_clk, 94662306a36Sopenharmony_ci [RPM_SMD_DIV_CLK1] = &clk_smd_rpm_div_clk1, 94762306a36Sopenharmony_ci [RPM_SMD_DIV_A_CLK1] = &clk_smd_rpm_div_clk1_a, 94862306a36Sopenharmony_ci [RPM_SMD_DIV_CLK2] = &clk_smd_rpm_div_clk2, 94962306a36Sopenharmony_ci [RPM_SMD_DIV_A_CLK2] = &clk_smd_rpm_div_clk2_a, 95062306a36Sopenharmony_ci [RPM_SMD_DIV_CLK3] = &clk_smd_rpm_div_clk3, 95162306a36Sopenharmony_ci [RPM_SMD_DIV_A_CLK3] = &clk_smd_rpm_div_clk3_a, 95262306a36Sopenharmony_ci [RPM_SMD_IPA_CLK] = &clk_smd_rpm_ipa_clk, 95362306a36Sopenharmony_ci [RPM_SMD_IPA_A_CLK] = &clk_smd_rpm_ipa_a_clk, 95462306a36Sopenharmony_ci [RPM_SMD_LN_BB_CLK1] = &clk_smd_rpm_ln_bb_clk1, 95562306a36Sopenharmony_ci [RPM_SMD_LN_BB_CLK1_A] = &clk_smd_rpm_ln_bb_clk1_a, 95662306a36Sopenharmony_ci [RPM_SMD_LN_BB_CLK2] = &clk_smd_rpm_ln_bb_clk2, 95762306a36Sopenharmony_ci [RPM_SMD_LN_BB_CLK2_A] = &clk_smd_rpm_ln_bb_clk2_a, 95862306a36Sopenharmony_ci [RPM_SMD_LN_BB_CLK3] = &clk_smd_rpm_ln_bb_clk3, 95962306a36Sopenharmony_ci [RPM_SMD_LN_BB_CLK3_A] = &clk_smd_rpm_ln_bb_clk3_a, 96062306a36Sopenharmony_ci [RPM_SMD_LN_BB_CLK1_PIN] = &clk_smd_rpm_ln_bb_clk1_pin, 96162306a36Sopenharmony_ci [RPM_SMD_LN_BB_CLK1_A_PIN] = &clk_smd_rpm_ln_bb_clk1_a_pin, 96262306a36Sopenharmony_ci [RPM_SMD_LN_BB_CLK2_PIN] = &clk_smd_rpm_ln_bb_clk2_pin, 96362306a36Sopenharmony_ci [RPM_SMD_LN_BB_CLK2_A_PIN] = &clk_smd_rpm_ln_bb_clk2_a_pin, 96462306a36Sopenharmony_ci [RPM_SMD_LN_BB_CLK3_PIN] = &clk_smd_rpm_ln_bb_clk3_pin, 96562306a36Sopenharmony_ci [RPM_SMD_LN_BB_CLK3_A_PIN] = &clk_smd_rpm_ln_bb_clk3_a_pin, 96662306a36Sopenharmony_ci [RPM_SMD_QDSS_CLK] = &clk_smd_rpm_qdss_clk, 96762306a36Sopenharmony_ci [RPM_SMD_QDSS_A_CLK] = &clk_smd_rpm_qdss_a_clk, 96862306a36Sopenharmony_ci [RPM_SMD_RF_CLK1] = &clk_smd_rpm_rf_clk1, 96962306a36Sopenharmony_ci [RPM_SMD_RF_CLK1_A] = &clk_smd_rpm_rf_clk1_a, 97062306a36Sopenharmony_ci [RPM_SMD_RF_CLK2] = &clk_smd_rpm_rf_clk2, 97162306a36Sopenharmony_ci [RPM_SMD_RF_CLK2_A] = &clk_smd_rpm_rf_clk2_a, 97262306a36Sopenharmony_ci [RPM_SMD_RF_CLK3] = &clk_smd_rpm_rf_clk3, 97362306a36Sopenharmony_ci [RPM_SMD_RF_CLK3_A] = &clk_smd_rpm_rf_clk3_a, 97462306a36Sopenharmony_ci [RPM_SMD_RF_CLK1_PIN] = &clk_smd_rpm_rf_clk1_pin, 97562306a36Sopenharmony_ci [RPM_SMD_RF_CLK1_A_PIN] = &clk_smd_rpm_rf_clk1_a_pin, 97662306a36Sopenharmony_ci [RPM_SMD_RF_CLK2_PIN] = &clk_smd_rpm_rf_clk2_pin, 97762306a36Sopenharmony_ci [RPM_SMD_RF_CLK2_A_PIN] = &clk_smd_rpm_rf_clk2_a_pin, 97862306a36Sopenharmony_ci [RPM_SMD_RF_CLK3_PIN] = &clk_smd_rpm_rf_clk3_pin, 97962306a36Sopenharmony_ci [RPM_SMD_RF_CLK3_A_PIN] = &clk_smd_rpm_rf_clk3_a_pin, 98062306a36Sopenharmony_ci}; 98162306a36Sopenharmony_ci 98262306a36Sopenharmony_cistatic const struct rpm_smd_clk_desc rpm_clk_msm8998 = { 98362306a36Sopenharmony_ci .clks = msm8998_clks, 98462306a36Sopenharmony_ci .num_clks = ARRAY_SIZE(msm8998_clks), 98562306a36Sopenharmony_ci .icc_clks = msm8998_icc_clks, 98662306a36Sopenharmony_ci .num_icc_clks = ARRAY_SIZE(msm8998_icc_clks), 98762306a36Sopenharmony_ci}; 98862306a36Sopenharmony_ci 98962306a36Sopenharmony_cistatic struct clk_smd_rpm *sdm660_clks[] = { 99062306a36Sopenharmony_ci [RPM_SMD_XO_CLK_SRC] = &clk_smd_rpm_branch_bi_tcxo, 99162306a36Sopenharmony_ci [RPM_SMD_XO_A_CLK_SRC] = &clk_smd_rpm_branch_bi_tcxo_a, 99262306a36Sopenharmony_ci [RPM_SMD_CNOC_PERIPH_CLK] = &clk_smd_rpm_bus_0_pcnoc_clk, 99362306a36Sopenharmony_ci [RPM_SMD_CNOC_PERIPH_A_CLK] = &clk_smd_rpm_bus_0_pcnoc_a_clk, 99462306a36Sopenharmony_ci [RPM_SMD_IPA_CLK] = &clk_smd_rpm_ipa_clk, 99562306a36Sopenharmony_ci [RPM_SMD_IPA_A_CLK] = &clk_smd_rpm_ipa_a_clk, 99662306a36Sopenharmony_ci [RPM_SMD_CE1_CLK] = &clk_smd_rpm_ce1_clk, 99762306a36Sopenharmony_ci [RPM_SMD_CE1_A_CLK] = &clk_smd_rpm_ce1_a_clk, 99862306a36Sopenharmony_ci [RPM_SMD_QDSS_CLK] = &clk_smd_rpm_qdss_clk, 99962306a36Sopenharmony_ci [RPM_SMD_QDSS_A_CLK] = &clk_smd_rpm_qdss_a_clk, 100062306a36Sopenharmony_ci [RPM_SMD_RF_CLK1] = &clk_smd_rpm_rf_clk1, 100162306a36Sopenharmony_ci [RPM_SMD_RF_CLK1_A] = &clk_smd_rpm_rf_clk1_a, 100262306a36Sopenharmony_ci [RPM_SMD_DIV_CLK1] = &clk_smd_rpm_div_clk1, 100362306a36Sopenharmony_ci [RPM_SMD_DIV_A_CLK1] = &clk_smd_rpm_div_clk1_a, 100462306a36Sopenharmony_ci [RPM_SMD_LN_BB_CLK] = &clk_smd_rpm_ln_bb_clk1, 100562306a36Sopenharmony_ci [RPM_SMD_LN_BB_A_CLK] = &clk_smd_rpm_ln_bb_clk1_a, 100662306a36Sopenharmony_ci [RPM_SMD_LN_BB_CLK2] = &clk_smd_rpm_ln_bb_clk2, 100762306a36Sopenharmony_ci [RPM_SMD_LN_BB_CLK2_A] = &clk_smd_rpm_ln_bb_clk2_a, 100862306a36Sopenharmony_ci [RPM_SMD_LN_BB_CLK3] = &clk_smd_rpm_ln_bb_clk3, 100962306a36Sopenharmony_ci [RPM_SMD_LN_BB_CLK3_A] = &clk_smd_rpm_ln_bb_clk3_a, 101062306a36Sopenharmony_ci [RPM_SMD_RF_CLK1_PIN] = &clk_smd_rpm_rf_clk1_pin, 101162306a36Sopenharmony_ci [RPM_SMD_RF_CLK1_A_PIN] = &clk_smd_rpm_rf_clk1_a_pin, 101262306a36Sopenharmony_ci [RPM_SMD_LN_BB_CLK1_PIN] = &clk_smd_rpm_ln_bb_clk1_pin, 101362306a36Sopenharmony_ci [RPM_SMD_LN_BB_CLK1_A_PIN] = &clk_smd_rpm_ln_bb_clk1_a_pin, 101462306a36Sopenharmony_ci [RPM_SMD_LN_BB_CLK2_PIN] = &clk_smd_rpm_ln_bb_clk2_pin, 101562306a36Sopenharmony_ci [RPM_SMD_LN_BB_CLK2_A_PIN] = &clk_smd_rpm_ln_bb_clk2_a_pin, 101662306a36Sopenharmony_ci [RPM_SMD_LN_BB_CLK3_PIN] = &clk_smd_rpm_ln_bb_clk3_pin, 101762306a36Sopenharmony_ci [RPM_SMD_LN_BB_CLK3_A_PIN] = &clk_smd_rpm_ln_bb_clk3_a_pin, 101862306a36Sopenharmony_ci}; 101962306a36Sopenharmony_ci 102062306a36Sopenharmony_cistatic const struct rpm_smd_clk_desc rpm_clk_sdm660 = { 102162306a36Sopenharmony_ci .clks = sdm660_clks, 102262306a36Sopenharmony_ci .num_clks = ARRAY_SIZE(sdm660_clks), 102362306a36Sopenharmony_ci .icc_clks = sdm660_icc_clks, 102462306a36Sopenharmony_ci .num_icc_clks = ARRAY_SIZE(sdm660_icc_clks), 102562306a36Sopenharmony_ci}; 102662306a36Sopenharmony_ci 102762306a36Sopenharmony_cistatic struct clk_smd_rpm *mdm9607_clks[] = { 102862306a36Sopenharmony_ci [RPM_SMD_XO_CLK_SRC] = &clk_smd_rpm_branch_bi_tcxo, 102962306a36Sopenharmony_ci [RPM_SMD_XO_A_CLK_SRC] = &clk_smd_rpm_branch_bi_tcxo_a, 103062306a36Sopenharmony_ci [RPM_SMD_QPIC_CLK] = &clk_smd_rpm_qpic_clk, 103162306a36Sopenharmony_ci [RPM_SMD_QPIC_CLK_A] = &clk_smd_rpm_qpic_a_clk, 103262306a36Sopenharmony_ci [RPM_SMD_QDSS_CLK] = &clk_smd_rpm_qdss_clk, 103362306a36Sopenharmony_ci [RPM_SMD_QDSS_A_CLK] = &clk_smd_rpm_qdss_a_clk, 103462306a36Sopenharmony_ci [RPM_SMD_BB_CLK1] = &clk_smd_rpm_bb_clk1, 103562306a36Sopenharmony_ci [RPM_SMD_BB_CLK1_A] = &clk_smd_rpm_bb_clk1_a, 103662306a36Sopenharmony_ci [RPM_SMD_BB_CLK1_PIN] = &clk_smd_rpm_bb_clk1_pin, 103762306a36Sopenharmony_ci [RPM_SMD_BB_CLK1_A_PIN] = &clk_smd_rpm_bb_clk1_a_pin, 103862306a36Sopenharmony_ci}; 103962306a36Sopenharmony_ci 104062306a36Sopenharmony_cistatic const struct rpm_smd_clk_desc rpm_clk_mdm9607 = { 104162306a36Sopenharmony_ci .clks = mdm9607_clks, 104262306a36Sopenharmony_ci .num_clks = ARRAY_SIZE(mdm9607_clks), 104362306a36Sopenharmony_ci .icc_clks = bimc_pcnoc_icc_clks, 104462306a36Sopenharmony_ci .num_icc_clks = ARRAY_SIZE(bimc_pcnoc_icc_clks), 104562306a36Sopenharmony_ci}; 104662306a36Sopenharmony_ci 104762306a36Sopenharmony_cistatic struct clk_smd_rpm *msm8953_clks[] = { 104862306a36Sopenharmony_ci [RPM_SMD_XO_CLK_SRC] = &clk_smd_rpm_branch_bi_tcxo, 104962306a36Sopenharmony_ci [RPM_SMD_XO_A_CLK_SRC] = &clk_smd_rpm_branch_bi_tcxo_a, 105062306a36Sopenharmony_ci [RPM_SMD_IPA_CLK] = &clk_smd_rpm_ipa_clk, 105162306a36Sopenharmony_ci [RPM_SMD_IPA_A_CLK] = &clk_smd_rpm_ipa_a_clk, 105262306a36Sopenharmony_ci [RPM_SMD_QDSS_CLK] = &clk_smd_rpm_qdss_clk, 105362306a36Sopenharmony_ci [RPM_SMD_QDSS_A_CLK] = &clk_smd_rpm_qdss_a_clk, 105462306a36Sopenharmony_ci [RPM_SMD_BB_CLK1] = &clk_smd_rpm_bb_clk1, 105562306a36Sopenharmony_ci [RPM_SMD_BB_CLK1_A] = &clk_smd_rpm_bb_clk1_a, 105662306a36Sopenharmony_ci [RPM_SMD_BB_CLK2] = &clk_smd_rpm_bb_clk2, 105762306a36Sopenharmony_ci [RPM_SMD_BB_CLK2_A] = &clk_smd_rpm_bb_clk2_a, 105862306a36Sopenharmony_ci [RPM_SMD_RF_CLK2] = &clk_smd_rpm_rf_clk2, 105962306a36Sopenharmony_ci [RPM_SMD_RF_CLK2_A] = &clk_smd_rpm_rf_clk2_a, 106062306a36Sopenharmony_ci [RPM_SMD_RF_CLK3] = &clk_smd_rpm_ln_bb_clk, 106162306a36Sopenharmony_ci [RPM_SMD_RF_CLK3_A] = &clk_smd_rpm_ln_bb_clk_a, 106262306a36Sopenharmony_ci [RPM_SMD_DIV_CLK2] = &clk_smd_rpm_div_clk2, 106362306a36Sopenharmony_ci [RPM_SMD_DIV_A_CLK2] = &clk_smd_rpm_div_clk2_a, 106462306a36Sopenharmony_ci [RPM_SMD_BB_CLK1_PIN] = &clk_smd_rpm_bb_clk1_pin, 106562306a36Sopenharmony_ci [RPM_SMD_BB_CLK1_A_PIN] = &clk_smd_rpm_bb_clk1_a_pin, 106662306a36Sopenharmony_ci [RPM_SMD_BB_CLK2_PIN] = &clk_smd_rpm_bb_clk2_pin, 106762306a36Sopenharmony_ci [RPM_SMD_BB_CLK2_A_PIN] = &clk_smd_rpm_bb_clk2_a_pin, 106862306a36Sopenharmony_ci}; 106962306a36Sopenharmony_ci 107062306a36Sopenharmony_cistatic const struct rpm_smd_clk_desc rpm_clk_msm8953 = { 107162306a36Sopenharmony_ci .clks = msm8953_clks, 107262306a36Sopenharmony_ci .num_clks = ARRAY_SIZE(msm8953_clks), 107362306a36Sopenharmony_ci .icc_clks = bimc_pcnoc_snoc_smmnoc_icc_clks, 107462306a36Sopenharmony_ci .num_icc_clks = ARRAY_SIZE(bimc_pcnoc_snoc_smmnoc_icc_clks), 107562306a36Sopenharmony_ci}; 107662306a36Sopenharmony_ci 107762306a36Sopenharmony_cistatic struct clk_smd_rpm *sm6125_clks[] = { 107862306a36Sopenharmony_ci [RPM_SMD_XO_CLK_SRC] = &clk_smd_rpm_branch_bi_tcxo, 107962306a36Sopenharmony_ci [RPM_SMD_XO_A_CLK_SRC] = &clk_smd_rpm_branch_bi_tcxo_a, 108062306a36Sopenharmony_ci [RPM_SMD_QDSS_CLK] = &clk_smd_rpm_branch_qdss_clk, 108162306a36Sopenharmony_ci [RPM_SMD_QDSS_A_CLK] = &clk_smd_rpm_branch_qdss_a_clk, 108262306a36Sopenharmony_ci [RPM_SMD_RF_CLK1] = &clk_smd_rpm_rf_clk1, 108362306a36Sopenharmony_ci [RPM_SMD_RF_CLK1_A] = &clk_smd_rpm_rf_clk1_a, 108462306a36Sopenharmony_ci [RPM_SMD_RF_CLK2] = &clk_smd_rpm_rf_clk2, 108562306a36Sopenharmony_ci [RPM_SMD_RF_CLK2_A] = &clk_smd_rpm_rf_clk2_a, 108662306a36Sopenharmony_ci [RPM_SMD_IPA_CLK] = &clk_smd_rpm_ipa_clk, 108762306a36Sopenharmony_ci [RPM_SMD_IPA_A_CLK] = &clk_smd_rpm_ipa_a_clk, 108862306a36Sopenharmony_ci [RPM_SMD_CE1_CLK] = &clk_smd_rpm_ce1_clk, 108962306a36Sopenharmony_ci [RPM_SMD_CE1_A_CLK] = &clk_smd_rpm_ce1_a_clk, 109062306a36Sopenharmony_ci [RPM_SMD_LN_BB_CLK1] = &clk_smd_rpm_ln_bb_clk1, 109162306a36Sopenharmony_ci [RPM_SMD_LN_BB_CLK1_A] = &clk_smd_rpm_ln_bb_clk1_a, 109262306a36Sopenharmony_ci [RPM_SMD_LN_BB_CLK2] = &clk_smd_rpm_ln_bb_clk2, 109362306a36Sopenharmony_ci [RPM_SMD_LN_BB_CLK2_A] = &clk_smd_rpm_ln_bb_clk2_a, 109462306a36Sopenharmony_ci [RPM_SMD_LN_BB_CLK3] = &clk_smd_rpm_ln_bb_clk3, 109562306a36Sopenharmony_ci [RPM_SMD_LN_BB_CLK3_A] = &clk_smd_rpm_ln_bb_clk3_a, 109662306a36Sopenharmony_ci [RPM_SMD_SNOC_PERIPH_CLK] = &clk_smd_rpm_bus_0_snoc_periph_clk, 109762306a36Sopenharmony_ci [RPM_SMD_SNOC_PERIPH_A_CLK] = &clk_smd_rpm_bus_0_snoc_periph_a_clk, 109862306a36Sopenharmony_ci [RPM_SMD_SNOC_LPASS_CLK] = &clk_smd_rpm_bus_5_snoc_lpass_clk, 109962306a36Sopenharmony_ci [RPM_SMD_SNOC_LPASS_A_CLK] = &clk_smd_rpm_bus_5_snoc_lpass_a_clk, 110062306a36Sopenharmony_ci}; 110162306a36Sopenharmony_ci 110262306a36Sopenharmony_cistatic const struct rpm_smd_clk_desc rpm_clk_sm6125 = { 110362306a36Sopenharmony_ci .clks = sm6125_clks, 110462306a36Sopenharmony_ci .num_clks = ARRAY_SIZE(sm6125_clks), 110562306a36Sopenharmony_ci .icc_clks = sm_qnoc_icc_clks, 110662306a36Sopenharmony_ci .num_icc_clks = ARRAY_SIZE(sm_qnoc_icc_clks) 110762306a36Sopenharmony_ci}; 110862306a36Sopenharmony_ci 110962306a36Sopenharmony_ci/* SM6115 */ 111062306a36Sopenharmony_cistatic struct clk_smd_rpm *sm6115_clks[] = { 111162306a36Sopenharmony_ci [RPM_SMD_XO_CLK_SRC] = &clk_smd_rpm_branch_bi_tcxo, 111262306a36Sopenharmony_ci [RPM_SMD_XO_A_CLK_SRC] = &clk_smd_rpm_branch_bi_tcxo_a, 111362306a36Sopenharmony_ci [RPM_SMD_QDSS_CLK] = &clk_smd_rpm_branch_qdss_clk, 111462306a36Sopenharmony_ci [RPM_SMD_QDSS_A_CLK] = &clk_smd_rpm_branch_qdss_a_clk, 111562306a36Sopenharmony_ci [RPM_SMD_RF_CLK1] = &clk_smd_rpm_rf_clk1, 111662306a36Sopenharmony_ci [RPM_SMD_RF_CLK1_A] = &clk_smd_rpm_rf_clk1_a, 111762306a36Sopenharmony_ci [RPM_SMD_RF_CLK2] = &clk_smd_rpm_rf_clk2, 111862306a36Sopenharmony_ci [RPM_SMD_RF_CLK2_A] = &clk_smd_rpm_rf_clk2_a, 111962306a36Sopenharmony_ci [RPM_SMD_IPA_CLK] = &clk_smd_rpm_ipa_clk, 112062306a36Sopenharmony_ci [RPM_SMD_IPA_A_CLK] = &clk_smd_rpm_ipa_a_clk, 112162306a36Sopenharmony_ci [RPM_SMD_CE1_CLK] = &clk_smd_rpm_ce1_clk, 112262306a36Sopenharmony_ci [RPM_SMD_CE1_A_CLK] = &clk_smd_rpm_ce1_a_clk, 112362306a36Sopenharmony_ci [RPM_SMD_SNOC_PERIPH_CLK] = &clk_smd_rpm_bus_0_snoc_periph_clk, 112462306a36Sopenharmony_ci [RPM_SMD_SNOC_PERIPH_A_CLK] = &clk_smd_rpm_bus_0_snoc_periph_a_clk, 112562306a36Sopenharmony_ci [RPM_SMD_SNOC_LPASS_CLK] = &clk_smd_rpm_bus_5_snoc_lpass_clk, 112662306a36Sopenharmony_ci [RPM_SMD_SNOC_LPASS_A_CLK] = &clk_smd_rpm_bus_5_snoc_lpass_a_clk, 112762306a36Sopenharmony_ci [RPM_SMD_RF_CLK1_PIN] = &clk_smd_rpm_rf_clk1_pin, 112862306a36Sopenharmony_ci [RPM_SMD_RF_CLK1_A_PIN] = &clk_smd_rpm_rf_clk1_a_pin, 112962306a36Sopenharmony_ci [RPM_SMD_RF_CLK2_PIN] = &clk_smd_rpm_rf_clk2_pin, 113062306a36Sopenharmony_ci [RPM_SMD_RF_CLK2_A_PIN] = &clk_smd_rpm_rf_clk2_a_pin, 113162306a36Sopenharmony_ci}; 113262306a36Sopenharmony_ci 113362306a36Sopenharmony_cistatic const struct rpm_smd_clk_desc rpm_clk_sm6115 = { 113462306a36Sopenharmony_ci .clks = sm6115_clks, 113562306a36Sopenharmony_ci .num_clks = ARRAY_SIZE(sm6115_clks), 113662306a36Sopenharmony_ci .icc_clks = sm_qnoc_icc_clks, 113762306a36Sopenharmony_ci .num_icc_clks = ARRAY_SIZE(sm_qnoc_icc_clks) 113862306a36Sopenharmony_ci}; 113962306a36Sopenharmony_ci 114062306a36Sopenharmony_cistatic struct clk_smd_rpm *sm6375_clks[] = { 114162306a36Sopenharmony_ci [RPM_SMD_XO_CLK_SRC] = &clk_smd_rpm_branch_bi_tcxo, 114262306a36Sopenharmony_ci [RPM_SMD_XO_A_CLK_SRC] = &clk_smd_rpm_branch_bi_tcxo_a, 114362306a36Sopenharmony_ci [RPM_SMD_QDSS_CLK] = &clk_smd_rpm_branch_qdss_clk, 114462306a36Sopenharmony_ci [RPM_SMD_QDSS_A_CLK] = &clk_smd_rpm_branch_qdss_a_clk, 114562306a36Sopenharmony_ci [RPM_SMD_IPA_CLK] = &clk_smd_rpm_ipa_clk, 114662306a36Sopenharmony_ci [RPM_SMD_IPA_A_CLK] = &clk_smd_rpm_ipa_a_clk, 114762306a36Sopenharmony_ci [RPM_SMD_SNOC_PERIPH_CLK] = &clk_smd_rpm_bus_0_snoc_periph_clk, 114862306a36Sopenharmony_ci [RPM_SMD_SNOC_PERIPH_A_CLK] = &clk_smd_rpm_bus_0_snoc_periph_a_clk, 114962306a36Sopenharmony_ci [RPM_SMD_SNOC_LPASS_CLK] = &clk_smd_rpm_bus_5_snoc_lpass_clk, 115062306a36Sopenharmony_ci [RPM_SMD_SNOC_LPASS_A_CLK] = &clk_smd_rpm_bus_5_snoc_lpass_a_clk, 115162306a36Sopenharmony_ci [RPM_SMD_CE1_CLK] = &clk_smd_rpm_ce1_clk, 115262306a36Sopenharmony_ci [RPM_SMD_CE1_A_CLK] = &clk_smd_rpm_ce1_a_clk, 115362306a36Sopenharmony_ci [RPM_SMD_HWKM_CLK] = &clk_smd_rpm_hwkm_clk, 115462306a36Sopenharmony_ci [RPM_SMD_HWKM_A_CLK] = &clk_smd_rpm_hwkm_a_clk, 115562306a36Sopenharmony_ci [RPM_SMD_PKA_CLK] = &clk_smd_rpm_pka_clk, 115662306a36Sopenharmony_ci [RPM_SMD_PKA_A_CLK] = &clk_smd_rpm_pka_a_clk, 115762306a36Sopenharmony_ci [RPM_SMD_BIMC_FREQ_LOG] = &clk_smd_rpm_branch_bimc_freq_log, 115862306a36Sopenharmony_ci}; 115962306a36Sopenharmony_ci 116062306a36Sopenharmony_cistatic const struct rpm_smd_clk_desc rpm_clk_sm6375 = { 116162306a36Sopenharmony_ci .clks = sm6375_clks, 116262306a36Sopenharmony_ci .num_clks = ARRAY_SIZE(sm6375_clks), 116362306a36Sopenharmony_ci .icc_clks = sm_qnoc_icc_clks, 116462306a36Sopenharmony_ci .num_icc_clks = ARRAY_SIZE(sm_qnoc_icc_clks) 116562306a36Sopenharmony_ci}; 116662306a36Sopenharmony_ci 116762306a36Sopenharmony_cistatic struct clk_smd_rpm *qcm2290_clks[] = { 116862306a36Sopenharmony_ci [RPM_SMD_XO_CLK_SRC] = &clk_smd_rpm_branch_bi_tcxo, 116962306a36Sopenharmony_ci [RPM_SMD_XO_A_CLK_SRC] = &clk_smd_rpm_branch_bi_tcxo_a, 117062306a36Sopenharmony_ci [RPM_SMD_QDSS_CLK] = &clk_smd_rpm_branch_qdss_clk, 117162306a36Sopenharmony_ci [RPM_SMD_QDSS_A_CLK] = &clk_smd_rpm_branch_qdss_a_clk, 117262306a36Sopenharmony_ci [RPM_SMD_LN_BB_CLK2] = &clk_smd_rpm_ln_bb_clk2, 117362306a36Sopenharmony_ci [RPM_SMD_LN_BB_CLK2_A] = &clk_smd_rpm_ln_bb_clk2_a, 117462306a36Sopenharmony_ci [RPM_SMD_RF_CLK3] = &clk_smd_rpm_38m4_rf_clk3, 117562306a36Sopenharmony_ci [RPM_SMD_RF_CLK3_A] = &clk_smd_rpm_38m4_rf_clk3_a, 117662306a36Sopenharmony_ci [RPM_SMD_IPA_CLK] = &clk_smd_rpm_ipa_clk, 117762306a36Sopenharmony_ci [RPM_SMD_IPA_A_CLK] = &clk_smd_rpm_ipa_a_clk, 117862306a36Sopenharmony_ci [RPM_SMD_SNOC_PERIPH_CLK] = &clk_smd_rpm_bus_0_snoc_periph_clk, 117962306a36Sopenharmony_ci [RPM_SMD_SNOC_PERIPH_A_CLK] = &clk_smd_rpm_bus_0_snoc_periph_a_clk, 118062306a36Sopenharmony_ci [RPM_SMD_SNOC_LPASS_CLK] = &clk_smd_rpm_bus_5_snoc_lpass_clk, 118162306a36Sopenharmony_ci [RPM_SMD_SNOC_LPASS_A_CLK] = &clk_smd_rpm_bus_5_snoc_lpass_a_clk, 118262306a36Sopenharmony_ci [RPM_SMD_CE1_CLK] = &clk_smd_rpm_ce1_clk, 118362306a36Sopenharmony_ci [RPM_SMD_CE1_A_CLK] = &clk_smd_rpm_ce1_a_clk, 118462306a36Sopenharmony_ci [RPM_SMD_QPIC_CLK] = &clk_smd_rpm_qpic_clk, 118562306a36Sopenharmony_ci [RPM_SMD_QPIC_CLK_A] = &clk_smd_rpm_qpic_a_clk, 118662306a36Sopenharmony_ci [RPM_SMD_HWKM_CLK] = &clk_smd_rpm_hwkm_clk, 118762306a36Sopenharmony_ci [RPM_SMD_HWKM_A_CLK] = &clk_smd_rpm_hwkm_a_clk, 118862306a36Sopenharmony_ci [RPM_SMD_PKA_CLK] = &clk_smd_rpm_pka_clk, 118962306a36Sopenharmony_ci [RPM_SMD_PKA_A_CLK] = &clk_smd_rpm_pka_a_clk, 119062306a36Sopenharmony_ci [RPM_SMD_BIMC_GPU_CLK] = &clk_smd_rpm_bimc_gpu_clk, 119162306a36Sopenharmony_ci [RPM_SMD_BIMC_GPU_A_CLK] = &clk_smd_rpm_bimc_gpu_a_clk, 119262306a36Sopenharmony_ci [RPM_SMD_CPUSS_GNOC_CLK] = &clk_smd_rpm_cpuss_gnoc_clk, 119362306a36Sopenharmony_ci [RPM_SMD_CPUSS_GNOC_A_CLK] = &clk_smd_rpm_cpuss_gnoc_a_clk, 119462306a36Sopenharmony_ci}; 119562306a36Sopenharmony_ci 119662306a36Sopenharmony_cistatic const struct rpm_smd_clk_desc rpm_clk_qcm2290 = { 119762306a36Sopenharmony_ci .clks = qcm2290_clks, 119862306a36Sopenharmony_ci .num_clks = ARRAY_SIZE(qcm2290_clks), 119962306a36Sopenharmony_ci .icc_clks = sm_qnoc_icc_clks, 120062306a36Sopenharmony_ci .num_icc_clks = ARRAY_SIZE(sm_qnoc_icc_clks) 120162306a36Sopenharmony_ci}; 120262306a36Sopenharmony_ci 120362306a36Sopenharmony_cistatic const struct of_device_id rpm_smd_clk_match_table[] = { 120462306a36Sopenharmony_ci { .compatible = "qcom,rpmcc-mdm9607", .data = &rpm_clk_mdm9607 }, 120562306a36Sopenharmony_ci { .compatible = "qcom,rpmcc-msm8226", .data = &rpm_clk_msm8974 }, 120662306a36Sopenharmony_ci { .compatible = "qcom,rpmcc-msm8909", .data = &rpm_clk_msm8909 }, 120762306a36Sopenharmony_ci { .compatible = "qcom,rpmcc-msm8916", .data = &rpm_clk_msm8916 }, 120862306a36Sopenharmony_ci { .compatible = "qcom,rpmcc-msm8917", .data = &rpm_clk_msm8917 }, 120962306a36Sopenharmony_ci { .compatible = "qcom,rpmcc-msm8936", .data = &rpm_clk_msm8936 }, 121062306a36Sopenharmony_ci { .compatible = "qcom,rpmcc-msm8953", .data = &rpm_clk_msm8953 }, 121162306a36Sopenharmony_ci { .compatible = "qcom,rpmcc-msm8974", .data = &rpm_clk_msm8974 }, 121262306a36Sopenharmony_ci { .compatible = "qcom,rpmcc-msm8976", .data = &rpm_clk_msm8976 }, 121362306a36Sopenharmony_ci { .compatible = "qcom,rpmcc-msm8992", .data = &rpm_clk_msm8992 }, 121462306a36Sopenharmony_ci { .compatible = "qcom,rpmcc-msm8994", .data = &rpm_clk_msm8994 }, 121562306a36Sopenharmony_ci { .compatible = "qcom,rpmcc-msm8996", .data = &rpm_clk_msm8996 }, 121662306a36Sopenharmony_ci { .compatible = "qcom,rpmcc-msm8998", .data = &rpm_clk_msm8998 }, 121762306a36Sopenharmony_ci { .compatible = "qcom,rpmcc-qcm2290", .data = &rpm_clk_qcm2290 }, 121862306a36Sopenharmony_ci { .compatible = "qcom,rpmcc-qcs404", .data = &rpm_clk_qcs404 }, 121962306a36Sopenharmony_ci { .compatible = "qcom,rpmcc-sdm660", .data = &rpm_clk_sdm660 }, 122062306a36Sopenharmony_ci { .compatible = "qcom,rpmcc-sm6115", .data = &rpm_clk_sm6115 }, 122162306a36Sopenharmony_ci { .compatible = "qcom,rpmcc-sm6125", .data = &rpm_clk_sm6125 }, 122262306a36Sopenharmony_ci { .compatible = "qcom,rpmcc-sm6375", .data = &rpm_clk_sm6375 }, 122362306a36Sopenharmony_ci { } 122462306a36Sopenharmony_ci}; 122562306a36Sopenharmony_ciMODULE_DEVICE_TABLE(of, rpm_smd_clk_match_table); 122662306a36Sopenharmony_ci 122762306a36Sopenharmony_cistatic struct clk_hw *qcom_smdrpm_clk_hw_get(struct of_phandle_args *clkspec, 122862306a36Sopenharmony_ci void *data) 122962306a36Sopenharmony_ci{ 123062306a36Sopenharmony_ci const struct rpm_smd_clk_desc *desc = data; 123162306a36Sopenharmony_ci unsigned int idx = clkspec->args[0]; 123262306a36Sopenharmony_ci 123362306a36Sopenharmony_ci if (idx >= desc->num_clks) { 123462306a36Sopenharmony_ci pr_err("%s: invalid index %u\n", __func__, idx); 123562306a36Sopenharmony_ci return ERR_PTR(-EINVAL); 123662306a36Sopenharmony_ci } 123762306a36Sopenharmony_ci 123862306a36Sopenharmony_ci return desc->clks[idx] ? &desc->clks[idx]->hw : ERR_PTR(-ENOENT); 123962306a36Sopenharmony_ci} 124062306a36Sopenharmony_ci 124162306a36Sopenharmony_cistatic void rpm_smd_unregister_icc(void *data) 124262306a36Sopenharmony_ci{ 124362306a36Sopenharmony_ci struct platform_device *icc_pdev = data; 124462306a36Sopenharmony_ci 124562306a36Sopenharmony_ci platform_device_unregister(icc_pdev); 124662306a36Sopenharmony_ci} 124762306a36Sopenharmony_ci 124862306a36Sopenharmony_cistatic int rpm_smd_clk_probe(struct platform_device *pdev) 124962306a36Sopenharmony_ci{ 125062306a36Sopenharmony_ci int ret; 125162306a36Sopenharmony_ci size_t num_clks, i; 125262306a36Sopenharmony_ci struct clk_smd_rpm **rpm_smd_clks; 125362306a36Sopenharmony_ci const struct rpm_smd_clk_desc *desc; 125462306a36Sopenharmony_ci struct platform_device *icc_pdev; 125562306a36Sopenharmony_ci 125662306a36Sopenharmony_ci rpmcc_smd_rpm = dev_get_drvdata(pdev->dev.parent); 125762306a36Sopenharmony_ci if (!rpmcc_smd_rpm) { 125862306a36Sopenharmony_ci dev_err(&pdev->dev, "Unable to retrieve handle to RPM\n"); 125962306a36Sopenharmony_ci return -ENODEV; 126062306a36Sopenharmony_ci } 126162306a36Sopenharmony_ci 126262306a36Sopenharmony_ci desc = of_device_get_match_data(&pdev->dev); 126362306a36Sopenharmony_ci if (!desc) 126462306a36Sopenharmony_ci return -EINVAL; 126562306a36Sopenharmony_ci 126662306a36Sopenharmony_ci rpm_smd_clks = desc->clks; 126762306a36Sopenharmony_ci num_clks = desc->num_clks; 126862306a36Sopenharmony_ci 126962306a36Sopenharmony_ci if (desc->scaling_before_handover) { 127062306a36Sopenharmony_ci ret = clk_smd_rpm_enable_scaling(); 127162306a36Sopenharmony_ci if (ret) 127262306a36Sopenharmony_ci goto err; 127362306a36Sopenharmony_ci } 127462306a36Sopenharmony_ci 127562306a36Sopenharmony_ci for (i = 0; i < num_clks; i++) { 127662306a36Sopenharmony_ci if (!rpm_smd_clks[i]) 127762306a36Sopenharmony_ci continue; 127862306a36Sopenharmony_ci 127962306a36Sopenharmony_ci ret = clk_smd_rpm_handoff(rpm_smd_clks[i]); 128062306a36Sopenharmony_ci if (ret) 128162306a36Sopenharmony_ci goto err; 128262306a36Sopenharmony_ci } 128362306a36Sopenharmony_ci 128462306a36Sopenharmony_ci for (i = 0; i < desc->num_icc_clks; i++) { 128562306a36Sopenharmony_ci if (!desc->icc_clks[i]) 128662306a36Sopenharmony_ci continue; 128762306a36Sopenharmony_ci 128862306a36Sopenharmony_ci ret = clk_smd_rpm_handoff(desc->icc_clks[i]); 128962306a36Sopenharmony_ci if (ret) 129062306a36Sopenharmony_ci goto err; 129162306a36Sopenharmony_ci } 129262306a36Sopenharmony_ci 129362306a36Sopenharmony_ci if (!desc->scaling_before_handover) { 129462306a36Sopenharmony_ci ret = clk_smd_rpm_enable_scaling(); 129562306a36Sopenharmony_ci if (ret) 129662306a36Sopenharmony_ci goto err; 129762306a36Sopenharmony_ci } 129862306a36Sopenharmony_ci 129962306a36Sopenharmony_ci for (i = 0; i < num_clks; i++) { 130062306a36Sopenharmony_ci if (!rpm_smd_clks[i]) 130162306a36Sopenharmony_ci continue; 130262306a36Sopenharmony_ci 130362306a36Sopenharmony_ci ret = devm_clk_hw_register(&pdev->dev, &rpm_smd_clks[i]->hw); 130462306a36Sopenharmony_ci if (ret) 130562306a36Sopenharmony_ci goto err; 130662306a36Sopenharmony_ci } 130762306a36Sopenharmony_ci 130862306a36Sopenharmony_ci ret = devm_of_clk_add_hw_provider(&pdev->dev, qcom_smdrpm_clk_hw_get, 130962306a36Sopenharmony_ci (void *)desc); 131062306a36Sopenharmony_ci if (ret) 131162306a36Sopenharmony_ci goto err; 131262306a36Sopenharmony_ci 131362306a36Sopenharmony_ci icc_pdev = platform_device_register_data(pdev->dev.parent, 131462306a36Sopenharmony_ci "icc_smd_rpm", -1, NULL, 0); 131562306a36Sopenharmony_ci if (IS_ERR(icc_pdev)) { 131662306a36Sopenharmony_ci dev_err(&pdev->dev, "Failed to register icc_smd_rpm device: %pE\n", 131762306a36Sopenharmony_ci icc_pdev); 131862306a36Sopenharmony_ci /* No need to unregister clocks because of this */ 131962306a36Sopenharmony_ci } else { 132062306a36Sopenharmony_ci ret = devm_add_action_or_reset(&pdev->dev, rpm_smd_unregister_icc, 132162306a36Sopenharmony_ci icc_pdev); 132262306a36Sopenharmony_ci if (ret) 132362306a36Sopenharmony_ci goto err; 132462306a36Sopenharmony_ci } 132562306a36Sopenharmony_ci 132662306a36Sopenharmony_ci return 0; 132762306a36Sopenharmony_cierr: 132862306a36Sopenharmony_ci dev_err(&pdev->dev, "Error registering SMD clock driver (%d)\n", ret); 132962306a36Sopenharmony_ci return ret; 133062306a36Sopenharmony_ci} 133162306a36Sopenharmony_ci 133262306a36Sopenharmony_cistatic struct platform_driver rpm_smd_clk_driver = { 133362306a36Sopenharmony_ci .driver = { 133462306a36Sopenharmony_ci .name = "qcom-clk-smd-rpm", 133562306a36Sopenharmony_ci .of_match_table = rpm_smd_clk_match_table, 133662306a36Sopenharmony_ci }, 133762306a36Sopenharmony_ci .probe = rpm_smd_clk_probe, 133862306a36Sopenharmony_ci}; 133962306a36Sopenharmony_ci 134062306a36Sopenharmony_cistatic int __init rpm_smd_clk_init(void) 134162306a36Sopenharmony_ci{ 134262306a36Sopenharmony_ci return platform_driver_register(&rpm_smd_clk_driver); 134362306a36Sopenharmony_ci} 134462306a36Sopenharmony_cicore_initcall(rpm_smd_clk_init); 134562306a36Sopenharmony_ci 134662306a36Sopenharmony_cistatic void __exit rpm_smd_clk_exit(void) 134762306a36Sopenharmony_ci{ 134862306a36Sopenharmony_ci platform_driver_unregister(&rpm_smd_clk_driver); 134962306a36Sopenharmony_ci} 135062306a36Sopenharmony_cimodule_exit(rpm_smd_clk_exit); 135162306a36Sopenharmony_ci 135262306a36Sopenharmony_ciMODULE_DESCRIPTION("Qualcomm RPM over SMD Clock Controller Driver"); 135362306a36Sopenharmony_ciMODULE_LICENSE("GPL v2"); 135462306a36Sopenharmony_ciMODULE_ALIAS("platform:qcom-clk-smd-rpm"); 1355