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