18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Copyright (c) 2016, Linaro Limited 48c2ecf20Sopenharmony_ci * Copyright (c) 2014, The Linux Foundation. All rights reserved. 58c2ecf20Sopenharmony_ci */ 68c2ecf20Sopenharmony_ci 78c2ecf20Sopenharmony_ci#include <linux/clk-provider.h> 88c2ecf20Sopenharmony_ci#include <linux/err.h> 98c2ecf20Sopenharmony_ci#include <linux/export.h> 108c2ecf20Sopenharmony_ci#include <linux/init.h> 118c2ecf20Sopenharmony_ci#include <linux/kernel.h> 128c2ecf20Sopenharmony_ci#include <linux/module.h> 138c2ecf20Sopenharmony_ci#include <linux/mutex.h> 148c2ecf20Sopenharmony_ci#include <linux/of.h> 158c2ecf20Sopenharmony_ci#include <linux/of_device.h> 168c2ecf20Sopenharmony_ci#include <linux/platform_device.h> 178c2ecf20Sopenharmony_ci#include <linux/soc/qcom/smd-rpm.h> 188c2ecf20Sopenharmony_ci 198c2ecf20Sopenharmony_ci#include <dt-bindings/clock/qcom,rpmcc.h> 208c2ecf20Sopenharmony_ci#include <dt-bindings/mfd/qcom-rpm.h> 218c2ecf20Sopenharmony_ci 228c2ecf20Sopenharmony_ci#define QCOM_RPM_KEY_SOFTWARE_ENABLE 0x6e657773 238c2ecf20Sopenharmony_ci#define QCOM_RPM_KEY_PIN_CTRL_CLK_BUFFER_ENABLE_KEY 0x62636370 248c2ecf20Sopenharmony_ci#define QCOM_RPM_SMD_KEY_RATE 0x007a484b 258c2ecf20Sopenharmony_ci#define QCOM_RPM_SMD_KEY_ENABLE 0x62616e45 268c2ecf20Sopenharmony_ci#define QCOM_RPM_SMD_KEY_STATE 0x54415453 278c2ecf20Sopenharmony_ci#define QCOM_RPM_SCALING_ENABLE_ID 0x2 288c2ecf20Sopenharmony_ci 298c2ecf20Sopenharmony_ci#define __DEFINE_CLK_SMD_RPM(_platform, _name, _active, type, r_id, stat_id, \ 308c2ecf20Sopenharmony_ci key) \ 318c2ecf20Sopenharmony_ci static struct clk_smd_rpm _platform##_##_active; \ 328c2ecf20Sopenharmony_ci static struct clk_smd_rpm _platform##_##_name = { \ 338c2ecf20Sopenharmony_ci .rpm_res_type = (type), \ 348c2ecf20Sopenharmony_ci .rpm_clk_id = (r_id), \ 358c2ecf20Sopenharmony_ci .rpm_status_id = (stat_id), \ 368c2ecf20Sopenharmony_ci .rpm_key = (key), \ 378c2ecf20Sopenharmony_ci .peer = &_platform##_##_active, \ 388c2ecf20Sopenharmony_ci .rate = INT_MAX, \ 398c2ecf20Sopenharmony_ci .hw.init = &(struct clk_init_data){ \ 408c2ecf20Sopenharmony_ci .ops = &clk_smd_rpm_ops, \ 418c2ecf20Sopenharmony_ci .name = #_name, \ 428c2ecf20Sopenharmony_ci .parent_names = (const char *[]){ "xo_board" }, \ 438c2ecf20Sopenharmony_ci .num_parents = 1, \ 448c2ecf20Sopenharmony_ci }, \ 458c2ecf20Sopenharmony_ci }; \ 468c2ecf20Sopenharmony_ci static struct clk_smd_rpm _platform##_##_active = { \ 478c2ecf20Sopenharmony_ci .rpm_res_type = (type), \ 488c2ecf20Sopenharmony_ci .rpm_clk_id = (r_id), \ 498c2ecf20Sopenharmony_ci .rpm_status_id = (stat_id), \ 508c2ecf20Sopenharmony_ci .active_only = true, \ 518c2ecf20Sopenharmony_ci .rpm_key = (key), \ 528c2ecf20Sopenharmony_ci .peer = &_platform##_##_name, \ 538c2ecf20Sopenharmony_ci .rate = INT_MAX, \ 548c2ecf20Sopenharmony_ci .hw.init = &(struct clk_init_data){ \ 558c2ecf20Sopenharmony_ci .ops = &clk_smd_rpm_ops, \ 568c2ecf20Sopenharmony_ci .name = #_active, \ 578c2ecf20Sopenharmony_ci .parent_names = (const char *[]){ "xo_board" }, \ 588c2ecf20Sopenharmony_ci .num_parents = 1, \ 598c2ecf20Sopenharmony_ci }, \ 608c2ecf20Sopenharmony_ci } 618c2ecf20Sopenharmony_ci 628c2ecf20Sopenharmony_ci#define __DEFINE_CLK_SMD_RPM_BRANCH(_platform, _name, _active, type, r_id, \ 638c2ecf20Sopenharmony_ci stat_id, r, key) \ 648c2ecf20Sopenharmony_ci static struct clk_smd_rpm _platform##_##_active; \ 658c2ecf20Sopenharmony_ci static struct clk_smd_rpm _platform##_##_name = { \ 668c2ecf20Sopenharmony_ci .rpm_res_type = (type), \ 678c2ecf20Sopenharmony_ci .rpm_clk_id = (r_id), \ 688c2ecf20Sopenharmony_ci .rpm_status_id = (stat_id), \ 698c2ecf20Sopenharmony_ci .rpm_key = (key), \ 708c2ecf20Sopenharmony_ci .branch = true, \ 718c2ecf20Sopenharmony_ci .peer = &_platform##_##_active, \ 728c2ecf20Sopenharmony_ci .rate = (r), \ 738c2ecf20Sopenharmony_ci .hw.init = &(struct clk_init_data){ \ 748c2ecf20Sopenharmony_ci .ops = &clk_smd_rpm_branch_ops, \ 758c2ecf20Sopenharmony_ci .name = #_name, \ 768c2ecf20Sopenharmony_ci .parent_names = (const char *[]){ "xo_board" }, \ 778c2ecf20Sopenharmony_ci .num_parents = 1, \ 788c2ecf20Sopenharmony_ci }, \ 798c2ecf20Sopenharmony_ci }; \ 808c2ecf20Sopenharmony_ci static struct clk_smd_rpm _platform##_##_active = { \ 818c2ecf20Sopenharmony_ci .rpm_res_type = (type), \ 828c2ecf20Sopenharmony_ci .rpm_clk_id = (r_id), \ 838c2ecf20Sopenharmony_ci .rpm_status_id = (stat_id), \ 848c2ecf20Sopenharmony_ci .active_only = true, \ 858c2ecf20Sopenharmony_ci .rpm_key = (key), \ 868c2ecf20Sopenharmony_ci .branch = true, \ 878c2ecf20Sopenharmony_ci .peer = &_platform##_##_name, \ 888c2ecf20Sopenharmony_ci .rate = (r), \ 898c2ecf20Sopenharmony_ci .hw.init = &(struct clk_init_data){ \ 908c2ecf20Sopenharmony_ci .ops = &clk_smd_rpm_branch_ops, \ 918c2ecf20Sopenharmony_ci .name = #_active, \ 928c2ecf20Sopenharmony_ci .parent_names = (const char *[]){ "xo_board" }, \ 938c2ecf20Sopenharmony_ci .num_parents = 1, \ 948c2ecf20Sopenharmony_ci }, \ 958c2ecf20Sopenharmony_ci } 968c2ecf20Sopenharmony_ci 978c2ecf20Sopenharmony_ci#define DEFINE_CLK_SMD_RPM(_platform, _name, _active, type, r_id) \ 988c2ecf20Sopenharmony_ci __DEFINE_CLK_SMD_RPM(_platform, _name, _active, type, r_id, \ 998c2ecf20Sopenharmony_ci 0, QCOM_RPM_SMD_KEY_RATE) 1008c2ecf20Sopenharmony_ci 1018c2ecf20Sopenharmony_ci#define DEFINE_CLK_SMD_RPM_BRANCH(_platform, _name, _active, type, r_id, r) \ 1028c2ecf20Sopenharmony_ci __DEFINE_CLK_SMD_RPM_BRANCH(_platform, _name, _active, type, \ 1038c2ecf20Sopenharmony_ci r_id, 0, r, QCOM_RPM_SMD_KEY_ENABLE) 1048c2ecf20Sopenharmony_ci 1058c2ecf20Sopenharmony_ci#define DEFINE_CLK_SMD_RPM_QDSS(_platform, _name, _active, type, r_id) \ 1068c2ecf20Sopenharmony_ci __DEFINE_CLK_SMD_RPM(_platform, _name, _active, type, r_id, \ 1078c2ecf20Sopenharmony_ci 0, QCOM_RPM_SMD_KEY_STATE) 1088c2ecf20Sopenharmony_ci 1098c2ecf20Sopenharmony_ci#define DEFINE_CLK_SMD_RPM_XO_BUFFER(_platform, _name, _active, r_id) \ 1108c2ecf20Sopenharmony_ci __DEFINE_CLK_SMD_RPM_BRANCH(_platform, _name, _active, \ 1118c2ecf20Sopenharmony_ci QCOM_SMD_RPM_CLK_BUF_A, r_id, 0, 1000, \ 1128c2ecf20Sopenharmony_ci QCOM_RPM_KEY_SOFTWARE_ENABLE) 1138c2ecf20Sopenharmony_ci 1148c2ecf20Sopenharmony_ci#define DEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(_platform, _name, _active, r_id) \ 1158c2ecf20Sopenharmony_ci __DEFINE_CLK_SMD_RPM_BRANCH(_platform, _name, _active, \ 1168c2ecf20Sopenharmony_ci QCOM_SMD_RPM_CLK_BUF_A, r_id, 0, 1000, \ 1178c2ecf20Sopenharmony_ci QCOM_RPM_KEY_PIN_CTRL_CLK_BUFFER_ENABLE_KEY) 1188c2ecf20Sopenharmony_ci 1198c2ecf20Sopenharmony_ci#define to_clk_smd_rpm(_hw) container_of(_hw, struct clk_smd_rpm, hw) 1208c2ecf20Sopenharmony_ci 1218c2ecf20Sopenharmony_cistruct clk_smd_rpm { 1228c2ecf20Sopenharmony_ci const int rpm_res_type; 1238c2ecf20Sopenharmony_ci const int rpm_key; 1248c2ecf20Sopenharmony_ci const int rpm_clk_id; 1258c2ecf20Sopenharmony_ci const int rpm_status_id; 1268c2ecf20Sopenharmony_ci const bool active_only; 1278c2ecf20Sopenharmony_ci bool enabled; 1288c2ecf20Sopenharmony_ci bool branch; 1298c2ecf20Sopenharmony_ci struct clk_smd_rpm *peer; 1308c2ecf20Sopenharmony_ci struct clk_hw hw; 1318c2ecf20Sopenharmony_ci unsigned long rate; 1328c2ecf20Sopenharmony_ci struct qcom_smd_rpm *rpm; 1338c2ecf20Sopenharmony_ci}; 1348c2ecf20Sopenharmony_ci 1358c2ecf20Sopenharmony_cistruct clk_smd_rpm_req { 1368c2ecf20Sopenharmony_ci __le32 key; 1378c2ecf20Sopenharmony_ci __le32 nbytes; 1388c2ecf20Sopenharmony_ci __le32 value; 1398c2ecf20Sopenharmony_ci}; 1408c2ecf20Sopenharmony_ci 1418c2ecf20Sopenharmony_cistruct rpm_cc { 1428c2ecf20Sopenharmony_ci struct qcom_rpm *rpm; 1438c2ecf20Sopenharmony_ci struct clk_smd_rpm **clks; 1448c2ecf20Sopenharmony_ci size_t num_clks; 1458c2ecf20Sopenharmony_ci}; 1468c2ecf20Sopenharmony_ci 1478c2ecf20Sopenharmony_cistruct rpm_smd_clk_desc { 1488c2ecf20Sopenharmony_ci struct clk_smd_rpm **clks; 1498c2ecf20Sopenharmony_ci size_t num_clks; 1508c2ecf20Sopenharmony_ci}; 1518c2ecf20Sopenharmony_ci 1528c2ecf20Sopenharmony_cistatic DEFINE_MUTEX(rpm_smd_clk_lock); 1538c2ecf20Sopenharmony_ci 1548c2ecf20Sopenharmony_cistatic int clk_smd_rpm_handoff(struct clk_smd_rpm *r) 1558c2ecf20Sopenharmony_ci{ 1568c2ecf20Sopenharmony_ci int ret; 1578c2ecf20Sopenharmony_ci struct clk_smd_rpm_req req = { 1588c2ecf20Sopenharmony_ci .key = cpu_to_le32(r->rpm_key), 1598c2ecf20Sopenharmony_ci .nbytes = cpu_to_le32(sizeof(u32)), 1608c2ecf20Sopenharmony_ci .value = cpu_to_le32(r->branch ? 1 : INT_MAX), 1618c2ecf20Sopenharmony_ci }; 1628c2ecf20Sopenharmony_ci 1638c2ecf20Sopenharmony_ci ret = qcom_rpm_smd_write(r->rpm, QCOM_SMD_RPM_ACTIVE_STATE, 1648c2ecf20Sopenharmony_ci r->rpm_res_type, r->rpm_clk_id, &req, 1658c2ecf20Sopenharmony_ci sizeof(req)); 1668c2ecf20Sopenharmony_ci if (ret) 1678c2ecf20Sopenharmony_ci return ret; 1688c2ecf20Sopenharmony_ci ret = qcom_rpm_smd_write(r->rpm, QCOM_SMD_RPM_SLEEP_STATE, 1698c2ecf20Sopenharmony_ci r->rpm_res_type, r->rpm_clk_id, &req, 1708c2ecf20Sopenharmony_ci sizeof(req)); 1718c2ecf20Sopenharmony_ci if (ret) 1728c2ecf20Sopenharmony_ci return ret; 1738c2ecf20Sopenharmony_ci 1748c2ecf20Sopenharmony_ci return 0; 1758c2ecf20Sopenharmony_ci} 1768c2ecf20Sopenharmony_ci 1778c2ecf20Sopenharmony_cistatic int clk_smd_rpm_set_rate_active(struct clk_smd_rpm *r, 1788c2ecf20Sopenharmony_ci unsigned long rate) 1798c2ecf20Sopenharmony_ci{ 1808c2ecf20Sopenharmony_ci struct clk_smd_rpm_req req = { 1818c2ecf20Sopenharmony_ci .key = cpu_to_le32(r->rpm_key), 1828c2ecf20Sopenharmony_ci .nbytes = cpu_to_le32(sizeof(u32)), 1838c2ecf20Sopenharmony_ci .value = cpu_to_le32(DIV_ROUND_UP(rate, 1000)), /* to kHz */ 1848c2ecf20Sopenharmony_ci }; 1858c2ecf20Sopenharmony_ci 1868c2ecf20Sopenharmony_ci return qcom_rpm_smd_write(r->rpm, QCOM_SMD_RPM_ACTIVE_STATE, 1878c2ecf20Sopenharmony_ci r->rpm_res_type, r->rpm_clk_id, &req, 1888c2ecf20Sopenharmony_ci sizeof(req)); 1898c2ecf20Sopenharmony_ci} 1908c2ecf20Sopenharmony_ci 1918c2ecf20Sopenharmony_cistatic int clk_smd_rpm_set_rate_sleep(struct clk_smd_rpm *r, 1928c2ecf20Sopenharmony_ci unsigned long rate) 1938c2ecf20Sopenharmony_ci{ 1948c2ecf20Sopenharmony_ci struct clk_smd_rpm_req req = { 1958c2ecf20Sopenharmony_ci .key = cpu_to_le32(r->rpm_key), 1968c2ecf20Sopenharmony_ci .nbytes = cpu_to_le32(sizeof(u32)), 1978c2ecf20Sopenharmony_ci .value = cpu_to_le32(DIV_ROUND_UP(rate, 1000)), /* to kHz */ 1988c2ecf20Sopenharmony_ci }; 1998c2ecf20Sopenharmony_ci 2008c2ecf20Sopenharmony_ci return qcom_rpm_smd_write(r->rpm, QCOM_SMD_RPM_SLEEP_STATE, 2018c2ecf20Sopenharmony_ci r->rpm_res_type, r->rpm_clk_id, &req, 2028c2ecf20Sopenharmony_ci sizeof(req)); 2038c2ecf20Sopenharmony_ci} 2048c2ecf20Sopenharmony_ci 2058c2ecf20Sopenharmony_cistatic void to_active_sleep(struct clk_smd_rpm *r, unsigned long rate, 2068c2ecf20Sopenharmony_ci unsigned long *active, unsigned long *sleep) 2078c2ecf20Sopenharmony_ci{ 2088c2ecf20Sopenharmony_ci *active = rate; 2098c2ecf20Sopenharmony_ci 2108c2ecf20Sopenharmony_ci /* 2118c2ecf20Sopenharmony_ci * Active-only clocks don't care what the rate is during sleep. So, 2128c2ecf20Sopenharmony_ci * they vote for zero. 2138c2ecf20Sopenharmony_ci */ 2148c2ecf20Sopenharmony_ci if (r->active_only) 2158c2ecf20Sopenharmony_ci *sleep = 0; 2168c2ecf20Sopenharmony_ci else 2178c2ecf20Sopenharmony_ci *sleep = *active; 2188c2ecf20Sopenharmony_ci} 2198c2ecf20Sopenharmony_ci 2208c2ecf20Sopenharmony_cistatic int clk_smd_rpm_prepare(struct clk_hw *hw) 2218c2ecf20Sopenharmony_ci{ 2228c2ecf20Sopenharmony_ci struct clk_smd_rpm *r = to_clk_smd_rpm(hw); 2238c2ecf20Sopenharmony_ci struct clk_smd_rpm *peer = r->peer; 2248c2ecf20Sopenharmony_ci unsigned long this_rate = 0, this_sleep_rate = 0; 2258c2ecf20Sopenharmony_ci unsigned long peer_rate = 0, peer_sleep_rate = 0; 2268c2ecf20Sopenharmony_ci unsigned long active_rate, sleep_rate; 2278c2ecf20Sopenharmony_ci int ret = 0; 2288c2ecf20Sopenharmony_ci 2298c2ecf20Sopenharmony_ci mutex_lock(&rpm_smd_clk_lock); 2308c2ecf20Sopenharmony_ci 2318c2ecf20Sopenharmony_ci /* Don't send requests to the RPM if the rate has not been set. */ 2328c2ecf20Sopenharmony_ci if (!r->rate) 2338c2ecf20Sopenharmony_ci goto out; 2348c2ecf20Sopenharmony_ci 2358c2ecf20Sopenharmony_ci to_active_sleep(r, r->rate, &this_rate, &this_sleep_rate); 2368c2ecf20Sopenharmony_ci 2378c2ecf20Sopenharmony_ci /* Take peer clock's rate into account only if it's enabled. */ 2388c2ecf20Sopenharmony_ci if (peer->enabled) 2398c2ecf20Sopenharmony_ci to_active_sleep(peer, peer->rate, 2408c2ecf20Sopenharmony_ci &peer_rate, &peer_sleep_rate); 2418c2ecf20Sopenharmony_ci 2428c2ecf20Sopenharmony_ci active_rate = max(this_rate, peer_rate); 2438c2ecf20Sopenharmony_ci 2448c2ecf20Sopenharmony_ci if (r->branch) 2458c2ecf20Sopenharmony_ci active_rate = !!active_rate; 2468c2ecf20Sopenharmony_ci 2478c2ecf20Sopenharmony_ci ret = clk_smd_rpm_set_rate_active(r, active_rate); 2488c2ecf20Sopenharmony_ci if (ret) 2498c2ecf20Sopenharmony_ci goto out; 2508c2ecf20Sopenharmony_ci 2518c2ecf20Sopenharmony_ci sleep_rate = max(this_sleep_rate, peer_sleep_rate); 2528c2ecf20Sopenharmony_ci if (r->branch) 2538c2ecf20Sopenharmony_ci sleep_rate = !!sleep_rate; 2548c2ecf20Sopenharmony_ci 2558c2ecf20Sopenharmony_ci ret = clk_smd_rpm_set_rate_sleep(r, sleep_rate); 2568c2ecf20Sopenharmony_ci if (ret) 2578c2ecf20Sopenharmony_ci /* Undo the active set vote and restore it */ 2588c2ecf20Sopenharmony_ci ret = clk_smd_rpm_set_rate_active(r, peer_rate); 2598c2ecf20Sopenharmony_ci 2608c2ecf20Sopenharmony_ciout: 2618c2ecf20Sopenharmony_ci if (!ret) 2628c2ecf20Sopenharmony_ci r->enabled = true; 2638c2ecf20Sopenharmony_ci 2648c2ecf20Sopenharmony_ci mutex_unlock(&rpm_smd_clk_lock); 2658c2ecf20Sopenharmony_ci 2668c2ecf20Sopenharmony_ci return ret; 2678c2ecf20Sopenharmony_ci} 2688c2ecf20Sopenharmony_ci 2698c2ecf20Sopenharmony_cistatic void clk_smd_rpm_unprepare(struct clk_hw *hw) 2708c2ecf20Sopenharmony_ci{ 2718c2ecf20Sopenharmony_ci struct clk_smd_rpm *r = to_clk_smd_rpm(hw); 2728c2ecf20Sopenharmony_ci struct clk_smd_rpm *peer = r->peer; 2738c2ecf20Sopenharmony_ci unsigned long peer_rate = 0, peer_sleep_rate = 0; 2748c2ecf20Sopenharmony_ci unsigned long active_rate, sleep_rate; 2758c2ecf20Sopenharmony_ci int ret; 2768c2ecf20Sopenharmony_ci 2778c2ecf20Sopenharmony_ci mutex_lock(&rpm_smd_clk_lock); 2788c2ecf20Sopenharmony_ci 2798c2ecf20Sopenharmony_ci if (!r->rate) 2808c2ecf20Sopenharmony_ci goto out; 2818c2ecf20Sopenharmony_ci 2828c2ecf20Sopenharmony_ci /* Take peer clock's rate into account only if it's enabled. */ 2838c2ecf20Sopenharmony_ci if (peer->enabled) 2848c2ecf20Sopenharmony_ci to_active_sleep(peer, peer->rate, &peer_rate, 2858c2ecf20Sopenharmony_ci &peer_sleep_rate); 2868c2ecf20Sopenharmony_ci 2878c2ecf20Sopenharmony_ci active_rate = r->branch ? !!peer_rate : peer_rate; 2888c2ecf20Sopenharmony_ci ret = clk_smd_rpm_set_rate_active(r, active_rate); 2898c2ecf20Sopenharmony_ci if (ret) 2908c2ecf20Sopenharmony_ci goto out; 2918c2ecf20Sopenharmony_ci 2928c2ecf20Sopenharmony_ci sleep_rate = r->branch ? !!peer_sleep_rate : peer_sleep_rate; 2938c2ecf20Sopenharmony_ci ret = clk_smd_rpm_set_rate_sleep(r, sleep_rate); 2948c2ecf20Sopenharmony_ci if (ret) 2958c2ecf20Sopenharmony_ci goto out; 2968c2ecf20Sopenharmony_ci 2978c2ecf20Sopenharmony_ci r->enabled = false; 2988c2ecf20Sopenharmony_ci 2998c2ecf20Sopenharmony_ciout: 3008c2ecf20Sopenharmony_ci mutex_unlock(&rpm_smd_clk_lock); 3018c2ecf20Sopenharmony_ci} 3028c2ecf20Sopenharmony_ci 3038c2ecf20Sopenharmony_cistatic int clk_smd_rpm_set_rate(struct clk_hw *hw, unsigned long rate, 3048c2ecf20Sopenharmony_ci unsigned long parent_rate) 3058c2ecf20Sopenharmony_ci{ 3068c2ecf20Sopenharmony_ci struct clk_smd_rpm *r = to_clk_smd_rpm(hw); 3078c2ecf20Sopenharmony_ci struct clk_smd_rpm *peer = r->peer; 3088c2ecf20Sopenharmony_ci unsigned long active_rate, sleep_rate; 3098c2ecf20Sopenharmony_ci unsigned long this_rate = 0, this_sleep_rate = 0; 3108c2ecf20Sopenharmony_ci unsigned long peer_rate = 0, peer_sleep_rate = 0; 3118c2ecf20Sopenharmony_ci int ret = 0; 3128c2ecf20Sopenharmony_ci 3138c2ecf20Sopenharmony_ci mutex_lock(&rpm_smd_clk_lock); 3148c2ecf20Sopenharmony_ci 3158c2ecf20Sopenharmony_ci if (!r->enabled) 3168c2ecf20Sopenharmony_ci goto out; 3178c2ecf20Sopenharmony_ci 3188c2ecf20Sopenharmony_ci to_active_sleep(r, rate, &this_rate, &this_sleep_rate); 3198c2ecf20Sopenharmony_ci 3208c2ecf20Sopenharmony_ci /* Take peer clock's rate into account only if it's enabled. */ 3218c2ecf20Sopenharmony_ci if (peer->enabled) 3228c2ecf20Sopenharmony_ci to_active_sleep(peer, peer->rate, 3238c2ecf20Sopenharmony_ci &peer_rate, &peer_sleep_rate); 3248c2ecf20Sopenharmony_ci 3258c2ecf20Sopenharmony_ci active_rate = max(this_rate, peer_rate); 3268c2ecf20Sopenharmony_ci ret = clk_smd_rpm_set_rate_active(r, active_rate); 3278c2ecf20Sopenharmony_ci if (ret) 3288c2ecf20Sopenharmony_ci goto out; 3298c2ecf20Sopenharmony_ci 3308c2ecf20Sopenharmony_ci sleep_rate = max(this_sleep_rate, peer_sleep_rate); 3318c2ecf20Sopenharmony_ci ret = clk_smd_rpm_set_rate_sleep(r, sleep_rate); 3328c2ecf20Sopenharmony_ci if (ret) 3338c2ecf20Sopenharmony_ci goto out; 3348c2ecf20Sopenharmony_ci 3358c2ecf20Sopenharmony_ci r->rate = rate; 3368c2ecf20Sopenharmony_ci 3378c2ecf20Sopenharmony_ciout: 3388c2ecf20Sopenharmony_ci mutex_unlock(&rpm_smd_clk_lock); 3398c2ecf20Sopenharmony_ci 3408c2ecf20Sopenharmony_ci return ret; 3418c2ecf20Sopenharmony_ci} 3428c2ecf20Sopenharmony_ci 3438c2ecf20Sopenharmony_cistatic long clk_smd_rpm_round_rate(struct clk_hw *hw, unsigned long rate, 3448c2ecf20Sopenharmony_ci unsigned long *parent_rate) 3458c2ecf20Sopenharmony_ci{ 3468c2ecf20Sopenharmony_ci /* 3478c2ecf20Sopenharmony_ci * RPM handles rate rounding and we don't have a way to 3488c2ecf20Sopenharmony_ci * know what the rate will be, so just return whatever 3498c2ecf20Sopenharmony_ci * rate is requested. 3508c2ecf20Sopenharmony_ci */ 3518c2ecf20Sopenharmony_ci return rate; 3528c2ecf20Sopenharmony_ci} 3538c2ecf20Sopenharmony_ci 3548c2ecf20Sopenharmony_cistatic unsigned long clk_smd_rpm_recalc_rate(struct clk_hw *hw, 3558c2ecf20Sopenharmony_ci unsigned long parent_rate) 3568c2ecf20Sopenharmony_ci{ 3578c2ecf20Sopenharmony_ci struct clk_smd_rpm *r = to_clk_smd_rpm(hw); 3588c2ecf20Sopenharmony_ci 3598c2ecf20Sopenharmony_ci /* 3608c2ecf20Sopenharmony_ci * RPM handles rate rounding and we don't have a way to 3618c2ecf20Sopenharmony_ci * know what the rate will be, so just return whatever 3628c2ecf20Sopenharmony_ci * rate was set. 3638c2ecf20Sopenharmony_ci */ 3648c2ecf20Sopenharmony_ci return r->rate; 3658c2ecf20Sopenharmony_ci} 3668c2ecf20Sopenharmony_ci 3678c2ecf20Sopenharmony_cistatic int clk_smd_rpm_enable_scaling(struct qcom_smd_rpm *rpm) 3688c2ecf20Sopenharmony_ci{ 3698c2ecf20Sopenharmony_ci int ret; 3708c2ecf20Sopenharmony_ci struct clk_smd_rpm_req req = { 3718c2ecf20Sopenharmony_ci .key = cpu_to_le32(QCOM_RPM_SMD_KEY_ENABLE), 3728c2ecf20Sopenharmony_ci .nbytes = cpu_to_le32(sizeof(u32)), 3738c2ecf20Sopenharmony_ci .value = cpu_to_le32(1), 3748c2ecf20Sopenharmony_ci }; 3758c2ecf20Sopenharmony_ci 3768c2ecf20Sopenharmony_ci ret = qcom_rpm_smd_write(rpm, QCOM_SMD_RPM_SLEEP_STATE, 3778c2ecf20Sopenharmony_ci QCOM_SMD_RPM_MISC_CLK, 3788c2ecf20Sopenharmony_ci QCOM_RPM_SCALING_ENABLE_ID, &req, sizeof(req)); 3798c2ecf20Sopenharmony_ci if (ret) { 3808c2ecf20Sopenharmony_ci pr_err("RPM clock scaling (sleep set) not enabled!\n"); 3818c2ecf20Sopenharmony_ci return ret; 3828c2ecf20Sopenharmony_ci } 3838c2ecf20Sopenharmony_ci 3848c2ecf20Sopenharmony_ci ret = qcom_rpm_smd_write(rpm, QCOM_SMD_RPM_ACTIVE_STATE, 3858c2ecf20Sopenharmony_ci QCOM_SMD_RPM_MISC_CLK, 3868c2ecf20Sopenharmony_ci QCOM_RPM_SCALING_ENABLE_ID, &req, sizeof(req)); 3878c2ecf20Sopenharmony_ci if (ret) { 3888c2ecf20Sopenharmony_ci pr_err("RPM clock scaling (active set) not enabled!\n"); 3898c2ecf20Sopenharmony_ci return ret; 3908c2ecf20Sopenharmony_ci } 3918c2ecf20Sopenharmony_ci 3928c2ecf20Sopenharmony_ci pr_debug("%s: RPM clock scaling is enabled\n", __func__); 3938c2ecf20Sopenharmony_ci return 0; 3948c2ecf20Sopenharmony_ci} 3958c2ecf20Sopenharmony_ci 3968c2ecf20Sopenharmony_cistatic const struct clk_ops clk_smd_rpm_ops = { 3978c2ecf20Sopenharmony_ci .prepare = clk_smd_rpm_prepare, 3988c2ecf20Sopenharmony_ci .unprepare = clk_smd_rpm_unprepare, 3998c2ecf20Sopenharmony_ci .set_rate = clk_smd_rpm_set_rate, 4008c2ecf20Sopenharmony_ci .round_rate = clk_smd_rpm_round_rate, 4018c2ecf20Sopenharmony_ci .recalc_rate = clk_smd_rpm_recalc_rate, 4028c2ecf20Sopenharmony_ci}; 4038c2ecf20Sopenharmony_ci 4048c2ecf20Sopenharmony_cistatic const struct clk_ops clk_smd_rpm_branch_ops = { 4058c2ecf20Sopenharmony_ci .prepare = clk_smd_rpm_prepare, 4068c2ecf20Sopenharmony_ci .unprepare = clk_smd_rpm_unprepare, 4078c2ecf20Sopenharmony_ci}; 4088c2ecf20Sopenharmony_ci 4098c2ecf20Sopenharmony_ci/* msm8916 */ 4108c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM(msm8916, pcnoc_clk, pcnoc_a_clk, QCOM_SMD_RPM_BUS_CLK, 0); 4118c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM(msm8916, snoc_clk, snoc_a_clk, QCOM_SMD_RPM_BUS_CLK, 1); 4128c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM(msm8916, bimc_clk, bimc_a_clk, QCOM_SMD_RPM_MEM_CLK, 0); 4138c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_QDSS(msm8916, qdss_clk, qdss_a_clk, QCOM_SMD_RPM_MISC_CLK, 1); 4148c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER(msm8916, bb_clk1, bb_clk1_a, 1); 4158c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER(msm8916, bb_clk2, bb_clk2_a, 2); 4168c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER(msm8916, rf_clk1, rf_clk1_a, 4); 4178c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER(msm8916, rf_clk2, rf_clk2_a, 5); 4188c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(msm8916, bb_clk1_pin, bb_clk1_a_pin, 1); 4198c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(msm8916, bb_clk2_pin, bb_clk2_a_pin, 2); 4208c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(msm8916, rf_clk1_pin, rf_clk1_a_pin, 4); 4218c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(msm8916, rf_clk2_pin, rf_clk2_a_pin, 5); 4228c2ecf20Sopenharmony_ci 4238c2ecf20Sopenharmony_cistatic struct clk_smd_rpm *msm8916_clks[] = { 4248c2ecf20Sopenharmony_ci [RPM_SMD_PCNOC_CLK] = &msm8916_pcnoc_clk, 4258c2ecf20Sopenharmony_ci [RPM_SMD_PCNOC_A_CLK] = &msm8916_pcnoc_a_clk, 4268c2ecf20Sopenharmony_ci [RPM_SMD_SNOC_CLK] = &msm8916_snoc_clk, 4278c2ecf20Sopenharmony_ci [RPM_SMD_SNOC_A_CLK] = &msm8916_snoc_a_clk, 4288c2ecf20Sopenharmony_ci [RPM_SMD_BIMC_CLK] = &msm8916_bimc_clk, 4298c2ecf20Sopenharmony_ci [RPM_SMD_BIMC_A_CLK] = &msm8916_bimc_a_clk, 4308c2ecf20Sopenharmony_ci [RPM_SMD_QDSS_CLK] = &msm8916_qdss_clk, 4318c2ecf20Sopenharmony_ci [RPM_SMD_QDSS_A_CLK] = &msm8916_qdss_a_clk, 4328c2ecf20Sopenharmony_ci [RPM_SMD_BB_CLK1] = &msm8916_bb_clk1, 4338c2ecf20Sopenharmony_ci [RPM_SMD_BB_CLK1_A] = &msm8916_bb_clk1_a, 4348c2ecf20Sopenharmony_ci [RPM_SMD_BB_CLK2] = &msm8916_bb_clk2, 4358c2ecf20Sopenharmony_ci [RPM_SMD_BB_CLK2_A] = &msm8916_bb_clk2_a, 4368c2ecf20Sopenharmony_ci [RPM_SMD_RF_CLK1] = &msm8916_rf_clk1, 4378c2ecf20Sopenharmony_ci [RPM_SMD_RF_CLK1_A] = &msm8916_rf_clk1_a, 4388c2ecf20Sopenharmony_ci [RPM_SMD_RF_CLK2] = &msm8916_rf_clk2, 4398c2ecf20Sopenharmony_ci [RPM_SMD_RF_CLK2_A] = &msm8916_rf_clk2_a, 4408c2ecf20Sopenharmony_ci [RPM_SMD_BB_CLK1_PIN] = &msm8916_bb_clk1_pin, 4418c2ecf20Sopenharmony_ci [RPM_SMD_BB_CLK1_A_PIN] = &msm8916_bb_clk1_a_pin, 4428c2ecf20Sopenharmony_ci [RPM_SMD_BB_CLK2_PIN] = &msm8916_bb_clk2_pin, 4438c2ecf20Sopenharmony_ci [RPM_SMD_BB_CLK2_A_PIN] = &msm8916_bb_clk2_a_pin, 4448c2ecf20Sopenharmony_ci [RPM_SMD_RF_CLK1_PIN] = &msm8916_rf_clk1_pin, 4458c2ecf20Sopenharmony_ci [RPM_SMD_RF_CLK1_A_PIN] = &msm8916_rf_clk1_a_pin, 4468c2ecf20Sopenharmony_ci [RPM_SMD_RF_CLK2_PIN] = &msm8916_rf_clk2_pin, 4478c2ecf20Sopenharmony_ci [RPM_SMD_RF_CLK2_A_PIN] = &msm8916_rf_clk2_a_pin, 4488c2ecf20Sopenharmony_ci}; 4498c2ecf20Sopenharmony_ci 4508c2ecf20Sopenharmony_cistatic const struct rpm_smd_clk_desc rpm_clk_msm8916 = { 4518c2ecf20Sopenharmony_ci .clks = msm8916_clks, 4528c2ecf20Sopenharmony_ci .num_clks = ARRAY_SIZE(msm8916_clks), 4538c2ecf20Sopenharmony_ci}; 4548c2ecf20Sopenharmony_ci 4558c2ecf20Sopenharmony_ci/* msm8936 */ 4568c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM(msm8936, pcnoc_clk, pcnoc_a_clk, QCOM_SMD_RPM_BUS_CLK, 0); 4578c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM(msm8936, snoc_clk, snoc_a_clk, QCOM_SMD_RPM_BUS_CLK, 1); 4588c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM(msm8936, bimc_clk, bimc_a_clk, QCOM_SMD_RPM_MEM_CLK, 0); 4598c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM(msm8936, sysmmnoc_clk, sysmmnoc_a_clk, QCOM_SMD_RPM_BUS_CLK, 2); 4608c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_QDSS(msm8936, qdss_clk, qdss_a_clk, QCOM_SMD_RPM_MISC_CLK, 1); 4618c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER(msm8936, bb_clk1, bb_clk1_a, 1); 4628c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER(msm8936, bb_clk2, bb_clk2_a, 2); 4638c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER(msm8936, rf_clk1, rf_clk1_a, 4); 4648c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER(msm8936, rf_clk2, rf_clk2_a, 5); 4658c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(msm8936, bb_clk1_pin, bb_clk1_a_pin, 1); 4668c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(msm8936, bb_clk2_pin, bb_clk2_a_pin, 2); 4678c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(msm8936, rf_clk1_pin, rf_clk1_a_pin, 4); 4688c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(msm8936, rf_clk2_pin, rf_clk2_a_pin, 5); 4698c2ecf20Sopenharmony_ci 4708c2ecf20Sopenharmony_cistatic struct clk_smd_rpm *msm8936_clks[] = { 4718c2ecf20Sopenharmony_ci [RPM_SMD_PCNOC_CLK] = &msm8936_pcnoc_clk, 4728c2ecf20Sopenharmony_ci [RPM_SMD_PCNOC_A_CLK] = &msm8936_pcnoc_a_clk, 4738c2ecf20Sopenharmony_ci [RPM_SMD_SNOC_CLK] = &msm8936_snoc_clk, 4748c2ecf20Sopenharmony_ci [RPM_SMD_SNOC_A_CLK] = &msm8936_snoc_a_clk, 4758c2ecf20Sopenharmony_ci [RPM_SMD_BIMC_CLK] = &msm8936_bimc_clk, 4768c2ecf20Sopenharmony_ci [RPM_SMD_BIMC_A_CLK] = &msm8936_bimc_a_clk, 4778c2ecf20Sopenharmony_ci [RPM_SMD_SYSMMNOC_CLK] = &msm8936_sysmmnoc_clk, 4788c2ecf20Sopenharmony_ci [RPM_SMD_SYSMMNOC_A_CLK] = &msm8936_sysmmnoc_a_clk, 4798c2ecf20Sopenharmony_ci [RPM_SMD_QDSS_CLK] = &msm8936_qdss_clk, 4808c2ecf20Sopenharmony_ci [RPM_SMD_QDSS_A_CLK] = &msm8936_qdss_a_clk, 4818c2ecf20Sopenharmony_ci [RPM_SMD_BB_CLK1] = &msm8936_bb_clk1, 4828c2ecf20Sopenharmony_ci [RPM_SMD_BB_CLK1_A] = &msm8936_bb_clk1_a, 4838c2ecf20Sopenharmony_ci [RPM_SMD_BB_CLK2] = &msm8936_bb_clk2, 4848c2ecf20Sopenharmony_ci [RPM_SMD_BB_CLK2_A] = &msm8936_bb_clk2_a, 4858c2ecf20Sopenharmony_ci [RPM_SMD_RF_CLK1] = &msm8936_rf_clk1, 4868c2ecf20Sopenharmony_ci [RPM_SMD_RF_CLK1_A] = &msm8936_rf_clk1_a, 4878c2ecf20Sopenharmony_ci [RPM_SMD_RF_CLK2] = &msm8936_rf_clk2, 4888c2ecf20Sopenharmony_ci [RPM_SMD_RF_CLK2_A] = &msm8936_rf_clk2_a, 4898c2ecf20Sopenharmony_ci [RPM_SMD_BB_CLK1_PIN] = &msm8936_bb_clk1_pin, 4908c2ecf20Sopenharmony_ci [RPM_SMD_BB_CLK1_A_PIN] = &msm8936_bb_clk1_a_pin, 4918c2ecf20Sopenharmony_ci [RPM_SMD_BB_CLK2_PIN] = &msm8936_bb_clk2_pin, 4928c2ecf20Sopenharmony_ci [RPM_SMD_BB_CLK2_A_PIN] = &msm8936_bb_clk2_a_pin, 4938c2ecf20Sopenharmony_ci [RPM_SMD_RF_CLK1_PIN] = &msm8936_rf_clk1_pin, 4948c2ecf20Sopenharmony_ci [RPM_SMD_RF_CLK1_A_PIN] = &msm8936_rf_clk1_a_pin, 4958c2ecf20Sopenharmony_ci [RPM_SMD_RF_CLK2_PIN] = &msm8936_rf_clk2_pin, 4968c2ecf20Sopenharmony_ci [RPM_SMD_RF_CLK2_A_PIN] = &msm8936_rf_clk2_a_pin, 4978c2ecf20Sopenharmony_ci}; 4988c2ecf20Sopenharmony_ci 4998c2ecf20Sopenharmony_cistatic const struct rpm_smd_clk_desc rpm_clk_msm8936 = { 5008c2ecf20Sopenharmony_ci .clks = msm8936_clks, 5018c2ecf20Sopenharmony_ci .num_clks = ARRAY_SIZE(msm8936_clks), 5028c2ecf20Sopenharmony_ci}; 5038c2ecf20Sopenharmony_ci 5048c2ecf20Sopenharmony_ci/* msm8974 */ 5058c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM(msm8974, pnoc_clk, pnoc_a_clk, QCOM_SMD_RPM_BUS_CLK, 0); 5068c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM(msm8974, snoc_clk, snoc_a_clk, QCOM_SMD_RPM_BUS_CLK, 1); 5078c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM(msm8974, cnoc_clk, cnoc_a_clk, QCOM_SMD_RPM_BUS_CLK, 2); 5088c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM(msm8974, mmssnoc_ahb_clk, mmssnoc_ahb_a_clk, QCOM_SMD_RPM_BUS_CLK, 3); 5098c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM(msm8974, bimc_clk, bimc_a_clk, QCOM_SMD_RPM_MEM_CLK, 0); 5108c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM(msm8974, gfx3d_clk_src, gfx3d_a_clk_src, QCOM_SMD_RPM_MEM_CLK, 1); 5118c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM(msm8974, ocmemgx_clk, ocmemgx_a_clk, QCOM_SMD_RPM_MEM_CLK, 2); 5128c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_QDSS(msm8974, qdss_clk, qdss_a_clk, QCOM_SMD_RPM_MISC_CLK, 1); 5138c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER(msm8974, cxo_d0, cxo_d0_a, 1); 5148c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER(msm8974, cxo_d1, cxo_d1_a, 2); 5158c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER(msm8974, cxo_a0, cxo_a0_a, 4); 5168c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER(msm8974, cxo_a1, cxo_a1_a, 5); 5178c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER(msm8974, cxo_a2, cxo_a2_a, 6); 5188c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER(msm8974, diff_clk, diff_a_clk, 7); 5198c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER(msm8974, div_clk1, div_a_clk1, 11); 5208c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER(msm8974, div_clk2, div_a_clk2, 12); 5218c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(msm8974, cxo_d0_pin, cxo_d0_a_pin, 1); 5228c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(msm8974, cxo_d1_pin, cxo_d1_a_pin, 2); 5238c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(msm8974, cxo_a0_pin, cxo_a0_a_pin, 4); 5248c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(msm8974, cxo_a1_pin, cxo_a1_a_pin, 5); 5258c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(msm8974, cxo_a2_pin, cxo_a2_a_pin, 6); 5268c2ecf20Sopenharmony_ci 5278c2ecf20Sopenharmony_cistatic struct clk_smd_rpm *msm8974_clks[] = { 5288c2ecf20Sopenharmony_ci [RPM_SMD_PNOC_CLK] = &msm8974_pnoc_clk, 5298c2ecf20Sopenharmony_ci [RPM_SMD_PNOC_A_CLK] = &msm8974_pnoc_a_clk, 5308c2ecf20Sopenharmony_ci [RPM_SMD_SNOC_CLK] = &msm8974_snoc_clk, 5318c2ecf20Sopenharmony_ci [RPM_SMD_SNOC_A_CLK] = &msm8974_snoc_a_clk, 5328c2ecf20Sopenharmony_ci [RPM_SMD_CNOC_CLK] = &msm8974_cnoc_clk, 5338c2ecf20Sopenharmony_ci [RPM_SMD_CNOC_A_CLK] = &msm8974_cnoc_a_clk, 5348c2ecf20Sopenharmony_ci [RPM_SMD_MMSSNOC_AHB_CLK] = &msm8974_mmssnoc_ahb_clk, 5358c2ecf20Sopenharmony_ci [RPM_SMD_MMSSNOC_AHB_A_CLK] = &msm8974_mmssnoc_ahb_a_clk, 5368c2ecf20Sopenharmony_ci [RPM_SMD_BIMC_CLK] = &msm8974_bimc_clk, 5378c2ecf20Sopenharmony_ci [RPM_SMD_GFX3D_CLK_SRC] = &msm8974_gfx3d_clk_src, 5388c2ecf20Sopenharmony_ci [RPM_SMD_GFX3D_A_CLK_SRC] = &msm8974_gfx3d_a_clk_src, 5398c2ecf20Sopenharmony_ci [RPM_SMD_BIMC_A_CLK] = &msm8974_bimc_a_clk, 5408c2ecf20Sopenharmony_ci [RPM_SMD_OCMEMGX_CLK] = &msm8974_ocmemgx_clk, 5418c2ecf20Sopenharmony_ci [RPM_SMD_OCMEMGX_A_CLK] = &msm8974_ocmemgx_a_clk, 5428c2ecf20Sopenharmony_ci [RPM_SMD_QDSS_CLK] = &msm8974_qdss_clk, 5438c2ecf20Sopenharmony_ci [RPM_SMD_QDSS_A_CLK] = &msm8974_qdss_a_clk, 5448c2ecf20Sopenharmony_ci [RPM_SMD_CXO_D0] = &msm8974_cxo_d0, 5458c2ecf20Sopenharmony_ci [RPM_SMD_CXO_D0_A] = &msm8974_cxo_d0_a, 5468c2ecf20Sopenharmony_ci [RPM_SMD_CXO_D1] = &msm8974_cxo_d1, 5478c2ecf20Sopenharmony_ci [RPM_SMD_CXO_D1_A] = &msm8974_cxo_d1_a, 5488c2ecf20Sopenharmony_ci [RPM_SMD_CXO_A0] = &msm8974_cxo_a0, 5498c2ecf20Sopenharmony_ci [RPM_SMD_CXO_A0_A] = &msm8974_cxo_a0_a, 5508c2ecf20Sopenharmony_ci [RPM_SMD_CXO_A1] = &msm8974_cxo_a1, 5518c2ecf20Sopenharmony_ci [RPM_SMD_CXO_A1_A] = &msm8974_cxo_a1_a, 5528c2ecf20Sopenharmony_ci [RPM_SMD_CXO_A2] = &msm8974_cxo_a2, 5538c2ecf20Sopenharmony_ci [RPM_SMD_CXO_A2_A] = &msm8974_cxo_a2_a, 5548c2ecf20Sopenharmony_ci [RPM_SMD_DIFF_CLK] = &msm8974_diff_clk, 5558c2ecf20Sopenharmony_ci [RPM_SMD_DIFF_A_CLK] = &msm8974_diff_a_clk, 5568c2ecf20Sopenharmony_ci [RPM_SMD_DIV_CLK1] = &msm8974_div_clk1, 5578c2ecf20Sopenharmony_ci [RPM_SMD_DIV_A_CLK1] = &msm8974_div_a_clk1, 5588c2ecf20Sopenharmony_ci [RPM_SMD_DIV_CLK2] = &msm8974_div_clk2, 5598c2ecf20Sopenharmony_ci [RPM_SMD_DIV_A_CLK2] = &msm8974_div_a_clk2, 5608c2ecf20Sopenharmony_ci [RPM_SMD_CXO_D0_PIN] = &msm8974_cxo_d0_pin, 5618c2ecf20Sopenharmony_ci [RPM_SMD_CXO_D0_A_PIN] = &msm8974_cxo_d0_a_pin, 5628c2ecf20Sopenharmony_ci [RPM_SMD_CXO_D1_PIN] = &msm8974_cxo_d1_pin, 5638c2ecf20Sopenharmony_ci [RPM_SMD_CXO_D1_A_PIN] = &msm8974_cxo_d1_a_pin, 5648c2ecf20Sopenharmony_ci [RPM_SMD_CXO_A0_PIN] = &msm8974_cxo_a0_pin, 5658c2ecf20Sopenharmony_ci [RPM_SMD_CXO_A0_A_PIN] = &msm8974_cxo_a0_a_pin, 5668c2ecf20Sopenharmony_ci [RPM_SMD_CXO_A1_PIN] = &msm8974_cxo_a1_pin, 5678c2ecf20Sopenharmony_ci [RPM_SMD_CXO_A1_A_PIN] = &msm8974_cxo_a1_a_pin, 5688c2ecf20Sopenharmony_ci [RPM_SMD_CXO_A2_PIN] = &msm8974_cxo_a2_pin, 5698c2ecf20Sopenharmony_ci [RPM_SMD_CXO_A2_A_PIN] = &msm8974_cxo_a2_a_pin, 5708c2ecf20Sopenharmony_ci}; 5718c2ecf20Sopenharmony_ci 5728c2ecf20Sopenharmony_cistatic const struct rpm_smd_clk_desc rpm_clk_msm8974 = { 5738c2ecf20Sopenharmony_ci .clks = msm8974_clks, 5748c2ecf20Sopenharmony_ci .num_clks = ARRAY_SIZE(msm8974_clks), 5758c2ecf20Sopenharmony_ci}; 5768c2ecf20Sopenharmony_ci 5778c2ecf20Sopenharmony_ci 5788c2ecf20Sopenharmony_ci/* msm8976 */ 5798c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM(msm8976, pcnoc_clk, pcnoc_a_clk, QCOM_SMD_RPM_BUS_CLK, 0); 5808c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM(msm8976, snoc_clk, snoc_a_clk, QCOM_SMD_RPM_BUS_CLK, 1); 5818c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM(msm8976, mmssnoc_ahb_clk, mmssnoc_ahb_a_clk, 5828c2ecf20Sopenharmony_ci QCOM_SMD_RPM_BUS_CLK, 2); 5838c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM(msm8976, bimc_clk, bimc_a_clk, QCOM_SMD_RPM_MEM_CLK, 0); 5848c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM(msm8976, ipa_clk, ipa_a_clk, QCOM_SMD_RPM_IPA_CLK, 0); 5858c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_QDSS(msm8976, qdss_clk, qdss_a_clk, 5868c2ecf20Sopenharmony_ci QCOM_SMD_RPM_MISC_CLK, 1); 5878c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER(msm8976, bb_clk1, bb_clk1_a, 1); 5888c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER(msm8976, bb_clk2, bb_clk2_a, 2); 5898c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER(msm8976, rf_clk2, rf_clk2_a, 5); 5908c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER(msm8976, div_clk2, div_clk2_a, 12); 5918c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(msm8976, bb_clk1_pin, bb_clk1_a_pin, 1); 5928c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(msm8976, bb_clk2_pin, bb_clk2_a_pin, 2); 5938c2ecf20Sopenharmony_ci 5948c2ecf20Sopenharmony_cistatic struct clk_smd_rpm *msm8976_clks[] = { 5958c2ecf20Sopenharmony_ci [RPM_SMD_PCNOC_CLK] = &msm8976_pcnoc_clk, 5968c2ecf20Sopenharmony_ci [RPM_SMD_PCNOC_A_CLK] = &msm8976_pcnoc_a_clk, 5978c2ecf20Sopenharmony_ci [RPM_SMD_SNOC_CLK] = &msm8976_snoc_clk, 5988c2ecf20Sopenharmony_ci [RPM_SMD_SNOC_A_CLK] = &msm8976_snoc_a_clk, 5998c2ecf20Sopenharmony_ci [RPM_SMD_BIMC_CLK] = &msm8976_bimc_clk, 6008c2ecf20Sopenharmony_ci [RPM_SMD_BIMC_A_CLK] = &msm8976_bimc_a_clk, 6018c2ecf20Sopenharmony_ci [RPM_SMD_QDSS_CLK] = &msm8976_qdss_clk, 6028c2ecf20Sopenharmony_ci [RPM_SMD_QDSS_A_CLK] = &msm8976_qdss_a_clk, 6038c2ecf20Sopenharmony_ci [RPM_SMD_BB_CLK1] = &msm8976_bb_clk1, 6048c2ecf20Sopenharmony_ci [RPM_SMD_BB_CLK1_A] = &msm8976_bb_clk1_a, 6058c2ecf20Sopenharmony_ci [RPM_SMD_BB_CLK2] = &msm8976_bb_clk2, 6068c2ecf20Sopenharmony_ci [RPM_SMD_BB_CLK2_A] = &msm8976_bb_clk2_a, 6078c2ecf20Sopenharmony_ci [RPM_SMD_RF_CLK2] = &msm8976_rf_clk2, 6088c2ecf20Sopenharmony_ci [RPM_SMD_RF_CLK2_A] = &msm8976_rf_clk2_a, 6098c2ecf20Sopenharmony_ci [RPM_SMD_BB_CLK1_PIN] = &msm8976_bb_clk1_pin, 6108c2ecf20Sopenharmony_ci [RPM_SMD_BB_CLK1_A_PIN] = &msm8976_bb_clk1_a_pin, 6118c2ecf20Sopenharmony_ci [RPM_SMD_BB_CLK2_PIN] = &msm8976_bb_clk2_pin, 6128c2ecf20Sopenharmony_ci [RPM_SMD_BB_CLK2_A_PIN] = &msm8976_bb_clk2_a_pin, 6138c2ecf20Sopenharmony_ci [RPM_SMD_MMSSNOC_AHB_CLK] = &msm8976_mmssnoc_ahb_clk, 6148c2ecf20Sopenharmony_ci [RPM_SMD_MMSSNOC_AHB_A_CLK] = &msm8976_mmssnoc_ahb_a_clk, 6158c2ecf20Sopenharmony_ci [RPM_SMD_DIV_CLK2] = &msm8976_div_clk2, 6168c2ecf20Sopenharmony_ci [RPM_SMD_DIV_A_CLK2] = &msm8976_div_clk2_a, 6178c2ecf20Sopenharmony_ci [RPM_SMD_IPA_CLK] = &msm8976_ipa_clk, 6188c2ecf20Sopenharmony_ci [RPM_SMD_IPA_A_CLK] = &msm8976_ipa_a_clk, 6198c2ecf20Sopenharmony_ci}; 6208c2ecf20Sopenharmony_ci 6218c2ecf20Sopenharmony_cistatic const struct rpm_smd_clk_desc rpm_clk_msm8976 = { 6228c2ecf20Sopenharmony_ci .clks = msm8976_clks, 6238c2ecf20Sopenharmony_ci .num_clks = ARRAY_SIZE(msm8976_clks), 6248c2ecf20Sopenharmony_ci}; 6258c2ecf20Sopenharmony_ci 6268c2ecf20Sopenharmony_ci/* msm8992 */ 6278c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM(msm8992, pnoc_clk, pnoc_a_clk, QCOM_SMD_RPM_BUS_CLK, 0); 6288c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM(msm8992, ocmemgx_clk, ocmemgx_a_clk, QCOM_SMD_RPM_MEM_CLK, 2); 6298c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM(msm8992, bimc_clk, bimc_a_clk, QCOM_SMD_RPM_MEM_CLK, 0); 6308c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM(msm8992, cnoc_clk, cnoc_a_clk, QCOM_SMD_RPM_BUS_CLK, 2); 6318c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM(msm8992, gfx3d_clk_src, gfx3d_a_clk_src, QCOM_SMD_RPM_MEM_CLK, 1); 6328c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM(msm8992, snoc_clk, snoc_a_clk, QCOM_SMD_RPM_BUS_CLK, 1); 6338c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER(msm8992, bb_clk1, bb_clk1_a, 1); 6348c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(msm8992, bb_clk1_pin, bb_clk1_a_pin, 1); 6358c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER(msm8992, bb_clk2, bb_clk2_a, 2); 6368c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(msm8992, bb_clk2_pin, bb_clk2_a_pin, 2); 6378c2ecf20Sopenharmony_ci 6388c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER(msm8992, div_clk1, div_clk1_a, 11); 6398c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER(msm8992, div_clk2, div_clk2_a, 12); 6408c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER(msm8992, div_clk3, div_clk3_a, 13); 6418c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM(msm8992, ipa_clk, ipa_a_clk, QCOM_SMD_RPM_IPA_CLK, 0); 6428c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER(msm8992, ln_bb_clk, ln_bb_a_clk, 8); 6438c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM(msm8992, mmssnoc_ahb_clk, mmssnoc_ahb_a_clk, 6448c2ecf20Sopenharmony_ci QCOM_SMD_RPM_BUS_CLK, 3); 6458c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_QDSS(msm8992, qdss_clk, qdss_a_clk, 6468c2ecf20Sopenharmony_ci QCOM_SMD_RPM_MISC_CLK, 1); 6478c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER(msm8992, rf_clk1, rf_clk1_a, 4); 6488c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER(msm8992, rf_clk2, rf_clk2_a, 5); 6498c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(msm8992, rf_clk1_pin, rf_clk1_a_pin, 4); 6508c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(msm8992, rf_clk2_pin, rf_clk2_a_pin, 5); 6518c2ecf20Sopenharmony_ci 6528c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM(msm8992, ce1_clk, ce1_a_clk, QCOM_SMD_RPM_CE_CLK, 0); 6538c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM(msm8992, ce2_clk, ce2_a_clk, QCOM_SMD_RPM_CE_CLK, 1); 6548c2ecf20Sopenharmony_ci 6558c2ecf20Sopenharmony_cistatic struct clk_smd_rpm *msm8992_clks[] = { 6568c2ecf20Sopenharmony_ci [RPM_SMD_PNOC_CLK] = &msm8992_pnoc_clk, 6578c2ecf20Sopenharmony_ci [RPM_SMD_PNOC_A_CLK] = &msm8992_pnoc_a_clk, 6588c2ecf20Sopenharmony_ci [RPM_SMD_OCMEMGX_CLK] = &msm8992_ocmemgx_clk, 6598c2ecf20Sopenharmony_ci [RPM_SMD_OCMEMGX_A_CLK] = &msm8992_ocmemgx_a_clk, 6608c2ecf20Sopenharmony_ci [RPM_SMD_BIMC_CLK] = &msm8992_bimc_clk, 6618c2ecf20Sopenharmony_ci [RPM_SMD_BIMC_A_CLK] = &msm8992_bimc_a_clk, 6628c2ecf20Sopenharmony_ci [RPM_SMD_CNOC_CLK] = &msm8992_cnoc_clk, 6638c2ecf20Sopenharmony_ci [RPM_SMD_CNOC_A_CLK] = &msm8992_cnoc_a_clk, 6648c2ecf20Sopenharmony_ci [RPM_SMD_GFX3D_CLK_SRC] = &msm8992_gfx3d_clk_src, 6658c2ecf20Sopenharmony_ci [RPM_SMD_GFX3D_A_CLK_SRC] = &msm8992_gfx3d_a_clk_src, 6668c2ecf20Sopenharmony_ci [RPM_SMD_SNOC_CLK] = &msm8992_snoc_clk, 6678c2ecf20Sopenharmony_ci [RPM_SMD_SNOC_A_CLK] = &msm8992_snoc_a_clk, 6688c2ecf20Sopenharmony_ci [RPM_SMD_BB_CLK1] = &msm8992_bb_clk1, 6698c2ecf20Sopenharmony_ci [RPM_SMD_BB_CLK1_A] = &msm8992_bb_clk1_a, 6708c2ecf20Sopenharmony_ci [RPM_SMD_BB_CLK1_PIN] = &msm8992_bb_clk1_pin, 6718c2ecf20Sopenharmony_ci [RPM_SMD_BB_CLK1_A_PIN] = &msm8992_bb_clk1_a_pin, 6728c2ecf20Sopenharmony_ci [RPM_SMD_BB_CLK2] = &msm8992_bb_clk2, 6738c2ecf20Sopenharmony_ci [RPM_SMD_BB_CLK2_A] = &msm8992_bb_clk2_a, 6748c2ecf20Sopenharmony_ci [RPM_SMD_BB_CLK2_PIN] = &msm8992_bb_clk2_pin, 6758c2ecf20Sopenharmony_ci [RPM_SMD_BB_CLK2_A_PIN] = &msm8992_bb_clk2_a_pin, 6768c2ecf20Sopenharmony_ci [RPM_SMD_DIV_CLK1] = &msm8992_div_clk1, 6778c2ecf20Sopenharmony_ci [RPM_SMD_DIV_A_CLK1] = &msm8992_div_clk1_a, 6788c2ecf20Sopenharmony_ci [RPM_SMD_DIV_CLK2] = &msm8992_div_clk2, 6798c2ecf20Sopenharmony_ci [RPM_SMD_DIV_A_CLK2] = &msm8992_div_clk2_a, 6808c2ecf20Sopenharmony_ci [RPM_SMD_DIV_CLK3] = &msm8992_div_clk3, 6818c2ecf20Sopenharmony_ci [RPM_SMD_DIV_A_CLK3] = &msm8992_div_clk3_a, 6828c2ecf20Sopenharmony_ci [RPM_SMD_IPA_CLK] = &msm8992_ipa_clk, 6838c2ecf20Sopenharmony_ci [RPM_SMD_IPA_A_CLK] = &msm8992_ipa_a_clk, 6848c2ecf20Sopenharmony_ci [RPM_SMD_LN_BB_CLK] = &msm8992_ln_bb_clk, 6858c2ecf20Sopenharmony_ci [RPM_SMD_LN_BB_A_CLK] = &msm8992_ln_bb_a_clk, 6868c2ecf20Sopenharmony_ci [RPM_SMD_MMSSNOC_AHB_CLK] = &msm8992_mmssnoc_ahb_clk, 6878c2ecf20Sopenharmony_ci [RPM_SMD_MMSSNOC_AHB_A_CLK] = &msm8992_mmssnoc_ahb_a_clk, 6888c2ecf20Sopenharmony_ci [RPM_SMD_QDSS_CLK] = &msm8992_qdss_clk, 6898c2ecf20Sopenharmony_ci [RPM_SMD_QDSS_A_CLK] = &msm8992_qdss_a_clk, 6908c2ecf20Sopenharmony_ci [RPM_SMD_RF_CLK1] = &msm8992_rf_clk1, 6918c2ecf20Sopenharmony_ci [RPM_SMD_RF_CLK1_A] = &msm8992_rf_clk1_a, 6928c2ecf20Sopenharmony_ci [RPM_SMD_RF_CLK2] = &msm8992_rf_clk2, 6938c2ecf20Sopenharmony_ci [RPM_SMD_RF_CLK2_A] = &msm8992_rf_clk2_a, 6948c2ecf20Sopenharmony_ci [RPM_SMD_RF_CLK1_PIN] = &msm8992_rf_clk1_pin, 6958c2ecf20Sopenharmony_ci [RPM_SMD_RF_CLK1_A_PIN] = &msm8992_rf_clk1_a_pin, 6968c2ecf20Sopenharmony_ci [RPM_SMD_RF_CLK2_PIN] = &msm8992_rf_clk2_pin, 6978c2ecf20Sopenharmony_ci [RPM_SMD_RF_CLK2_A_PIN] = &msm8992_rf_clk2_a_pin, 6988c2ecf20Sopenharmony_ci [RPM_SMD_CE1_CLK] = &msm8992_ce1_clk, 6998c2ecf20Sopenharmony_ci [RPM_SMD_CE1_A_CLK] = &msm8992_ce1_a_clk, 7008c2ecf20Sopenharmony_ci [RPM_SMD_CE2_CLK] = &msm8992_ce2_clk, 7018c2ecf20Sopenharmony_ci [RPM_SMD_CE2_A_CLK] = &msm8992_ce2_a_clk, 7028c2ecf20Sopenharmony_ci}; 7038c2ecf20Sopenharmony_ci 7048c2ecf20Sopenharmony_cistatic const struct rpm_smd_clk_desc rpm_clk_msm8992 = { 7058c2ecf20Sopenharmony_ci .clks = msm8992_clks, 7068c2ecf20Sopenharmony_ci .num_clks = ARRAY_SIZE(msm8992_clks), 7078c2ecf20Sopenharmony_ci}; 7088c2ecf20Sopenharmony_ci 7098c2ecf20Sopenharmony_ci/* msm8994 */ 7108c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM(msm8994, pnoc_clk, pnoc_a_clk, QCOM_SMD_RPM_BUS_CLK, 0); 7118c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM(msm8994, ocmemgx_clk, ocmemgx_a_clk, QCOM_SMD_RPM_MEM_CLK, 2); 7128c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM(msm8994, bimc_clk, bimc_a_clk, QCOM_SMD_RPM_MEM_CLK, 0); 7138c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM(msm8994, cnoc_clk, cnoc_a_clk, QCOM_SMD_RPM_BUS_CLK, 2); 7148c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM(msm8994, gfx3d_clk_src, gfx3d_a_clk_src, QCOM_SMD_RPM_MEM_CLK, 1); 7158c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM(msm8994, snoc_clk, snoc_a_clk, QCOM_SMD_RPM_BUS_CLK, 1); 7168c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER(msm8994, bb_clk1, bb_clk1_a, 1); 7178c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(msm8994, bb_clk1_pin, bb_clk1_a_pin, 1); 7188c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER(msm8994, bb_clk2, bb_clk2_a, 2); 7198c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(msm8994, bb_clk2_pin, bb_clk2_a_pin, 2); 7208c2ecf20Sopenharmony_ci 7218c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER(msm8994, div_clk1, div_clk1_a, 11); 7228c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER(msm8994, div_clk2, div_clk2_a, 12); 7238c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER(msm8994, div_clk3, div_clk3_a, 13); 7248c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM(msm8994, ipa_clk, ipa_a_clk, QCOM_SMD_RPM_IPA_CLK, 0); 7258c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER(msm8994, ln_bb_clk, ln_bb_a_clk, 8); 7268c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM(msm8994, mmssnoc_ahb_clk, mmssnoc_ahb_a_clk, 7278c2ecf20Sopenharmony_ci QCOM_SMD_RPM_BUS_CLK, 3); 7288c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_QDSS(msm8994, qdss_clk, qdss_a_clk, 7298c2ecf20Sopenharmony_ci QCOM_SMD_RPM_MISC_CLK, 1); 7308c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER(msm8994, rf_clk1, rf_clk1_a, 4); 7318c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER(msm8994, rf_clk2, rf_clk2_a, 5); 7328c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(msm8994, rf_clk1_pin, rf_clk1_a_pin, 4); 7338c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(msm8994, rf_clk2_pin, rf_clk2_a_pin, 5); 7348c2ecf20Sopenharmony_ci 7358c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM(msm8994, ce1_clk, ce1_a_clk, QCOM_SMD_RPM_CE_CLK, 0); 7368c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM(msm8994, ce2_clk, ce2_a_clk, QCOM_SMD_RPM_CE_CLK, 1); 7378c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM(msm8994, ce3_clk, ce3_a_clk, QCOM_SMD_RPM_CE_CLK, 2); 7388c2ecf20Sopenharmony_ci 7398c2ecf20Sopenharmony_cistatic struct clk_smd_rpm *msm8994_clks[] = { 7408c2ecf20Sopenharmony_ci [RPM_SMD_PNOC_CLK] = &msm8994_pnoc_clk, 7418c2ecf20Sopenharmony_ci [RPM_SMD_PNOC_A_CLK] = &msm8994_pnoc_a_clk, 7428c2ecf20Sopenharmony_ci [RPM_SMD_OCMEMGX_CLK] = &msm8994_ocmemgx_clk, 7438c2ecf20Sopenharmony_ci [RPM_SMD_OCMEMGX_A_CLK] = &msm8994_ocmemgx_a_clk, 7448c2ecf20Sopenharmony_ci [RPM_SMD_BIMC_CLK] = &msm8994_bimc_clk, 7458c2ecf20Sopenharmony_ci [RPM_SMD_BIMC_A_CLK] = &msm8994_bimc_a_clk, 7468c2ecf20Sopenharmony_ci [RPM_SMD_CNOC_CLK] = &msm8994_cnoc_clk, 7478c2ecf20Sopenharmony_ci [RPM_SMD_CNOC_A_CLK] = &msm8994_cnoc_a_clk, 7488c2ecf20Sopenharmony_ci [RPM_SMD_GFX3D_CLK_SRC] = &msm8994_gfx3d_clk_src, 7498c2ecf20Sopenharmony_ci [RPM_SMD_GFX3D_A_CLK_SRC] = &msm8994_gfx3d_a_clk_src, 7508c2ecf20Sopenharmony_ci [RPM_SMD_SNOC_CLK] = &msm8994_snoc_clk, 7518c2ecf20Sopenharmony_ci [RPM_SMD_SNOC_A_CLK] = &msm8994_snoc_a_clk, 7528c2ecf20Sopenharmony_ci [RPM_SMD_BB_CLK1] = &msm8994_bb_clk1, 7538c2ecf20Sopenharmony_ci [RPM_SMD_BB_CLK1_A] = &msm8994_bb_clk1_a, 7548c2ecf20Sopenharmony_ci [RPM_SMD_BB_CLK1_PIN] = &msm8994_bb_clk1_pin, 7558c2ecf20Sopenharmony_ci [RPM_SMD_BB_CLK1_A_PIN] = &msm8994_bb_clk1_a_pin, 7568c2ecf20Sopenharmony_ci [RPM_SMD_BB_CLK2] = &msm8994_bb_clk2, 7578c2ecf20Sopenharmony_ci [RPM_SMD_BB_CLK2_A] = &msm8994_bb_clk2_a, 7588c2ecf20Sopenharmony_ci [RPM_SMD_BB_CLK2_PIN] = &msm8994_bb_clk2_pin, 7598c2ecf20Sopenharmony_ci [RPM_SMD_BB_CLK2_A_PIN] = &msm8994_bb_clk2_a_pin, 7608c2ecf20Sopenharmony_ci [RPM_SMD_DIV_CLK1] = &msm8994_div_clk1, 7618c2ecf20Sopenharmony_ci [RPM_SMD_DIV_A_CLK1] = &msm8994_div_clk1_a, 7628c2ecf20Sopenharmony_ci [RPM_SMD_DIV_CLK2] = &msm8994_div_clk2, 7638c2ecf20Sopenharmony_ci [RPM_SMD_DIV_A_CLK2] = &msm8994_div_clk2_a, 7648c2ecf20Sopenharmony_ci [RPM_SMD_DIV_CLK3] = &msm8994_div_clk3, 7658c2ecf20Sopenharmony_ci [RPM_SMD_DIV_A_CLK3] = &msm8994_div_clk3_a, 7668c2ecf20Sopenharmony_ci [RPM_SMD_IPA_CLK] = &msm8994_ipa_clk, 7678c2ecf20Sopenharmony_ci [RPM_SMD_IPA_A_CLK] = &msm8994_ipa_a_clk, 7688c2ecf20Sopenharmony_ci [RPM_SMD_LN_BB_CLK] = &msm8994_ln_bb_clk, 7698c2ecf20Sopenharmony_ci [RPM_SMD_LN_BB_A_CLK] = &msm8994_ln_bb_a_clk, 7708c2ecf20Sopenharmony_ci [RPM_SMD_MMSSNOC_AHB_CLK] = &msm8994_mmssnoc_ahb_clk, 7718c2ecf20Sopenharmony_ci [RPM_SMD_MMSSNOC_AHB_A_CLK] = &msm8994_mmssnoc_ahb_a_clk, 7728c2ecf20Sopenharmony_ci [RPM_SMD_QDSS_CLK] = &msm8994_qdss_clk, 7738c2ecf20Sopenharmony_ci [RPM_SMD_QDSS_A_CLK] = &msm8994_qdss_a_clk, 7748c2ecf20Sopenharmony_ci [RPM_SMD_RF_CLK1] = &msm8994_rf_clk1, 7758c2ecf20Sopenharmony_ci [RPM_SMD_RF_CLK1_A] = &msm8994_rf_clk1_a, 7768c2ecf20Sopenharmony_ci [RPM_SMD_RF_CLK2] = &msm8994_rf_clk2, 7778c2ecf20Sopenharmony_ci [RPM_SMD_RF_CLK2_A] = &msm8994_rf_clk2_a, 7788c2ecf20Sopenharmony_ci [RPM_SMD_RF_CLK1_PIN] = &msm8994_rf_clk1_pin, 7798c2ecf20Sopenharmony_ci [RPM_SMD_RF_CLK1_A_PIN] = &msm8994_rf_clk1_a_pin, 7808c2ecf20Sopenharmony_ci [RPM_SMD_RF_CLK2_PIN] = &msm8994_rf_clk2_pin, 7818c2ecf20Sopenharmony_ci [RPM_SMD_RF_CLK2_A_PIN] = &msm8994_rf_clk2_a_pin, 7828c2ecf20Sopenharmony_ci [RPM_SMD_CE1_CLK] = &msm8994_ce1_clk, 7838c2ecf20Sopenharmony_ci [RPM_SMD_CE1_A_CLK] = &msm8994_ce1_a_clk, 7848c2ecf20Sopenharmony_ci [RPM_SMD_CE2_CLK] = &msm8994_ce2_clk, 7858c2ecf20Sopenharmony_ci [RPM_SMD_CE2_A_CLK] = &msm8994_ce2_a_clk, 7868c2ecf20Sopenharmony_ci [RPM_SMD_CE3_CLK] = &msm8994_ce3_clk, 7878c2ecf20Sopenharmony_ci [RPM_SMD_CE3_A_CLK] = &msm8994_ce3_a_clk, 7888c2ecf20Sopenharmony_ci}; 7898c2ecf20Sopenharmony_ci 7908c2ecf20Sopenharmony_cistatic const struct rpm_smd_clk_desc rpm_clk_msm8994 = { 7918c2ecf20Sopenharmony_ci .clks = msm8994_clks, 7928c2ecf20Sopenharmony_ci .num_clks = ARRAY_SIZE(msm8994_clks), 7938c2ecf20Sopenharmony_ci}; 7948c2ecf20Sopenharmony_ci 7958c2ecf20Sopenharmony_ci/* msm8996 */ 7968c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM(msm8996, pcnoc_clk, pcnoc_a_clk, QCOM_SMD_RPM_BUS_CLK, 0); 7978c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM(msm8996, snoc_clk, snoc_a_clk, QCOM_SMD_RPM_BUS_CLK, 1); 7988c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM(msm8996, cnoc_clk, cnoc_a_clk, QCOM_SMD_RPM_BUS_CLK, 2); 7998c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM(msm8996, bimc_clk, bimc_a_clk, QCOM_SMD_RPM_MEM_CLK, 0); 8008c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM(msm8996, mmssnoc_axi_rpm_clk, mmssnoc_axi_rpm_a_clk, 8018c2ecf20Sopenharmony_ci QCOM_SMD_RPM_MMAXI_CLK, 0); 8028c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM(msm8996, ipa_clk, ipa_a_clk, QCOM_SMD_RPM_IPA_CLK, 0); 8038c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM(msm8996, ce1_clk, ce1_a_clk, QCOM_SMD_RPM_CE_CLK, 0); 8048c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_BRANCH(msm8996, aggre1_noc_clk, aggre1_noc_a_clk, 8058c2ecf20Sopenharmony_ci QCOM_SMD_RPM_AGGR_CLK, 1, 1000); 8068c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_BRANCH(msm8996, aggre2_noc_clk, aggre2_noc_a_clk, 8078c2ecf20Sopenharmony_ci QCOM_SMD_RPM_AGGR_CLK, 2, 1000); 8088c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_QDSS(msm8996, qdss_clk, qdss_a_clk, 8098c2ecf20Sopenharmony_ci QCOM_SMD_RPM_MISC_CLK, 1); 8108c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER(msm8996, bb_clk1, bb_clk1_a, 1); 8118c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER(msm8996, bb_clk2, bb_clk2_a, 2); 8128c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER(msm8996, rf_clk1, rf_clk1_a, 4); 8138c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER(msm8996, rf_clk2, rf_clk2_a, 5); 8148c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER(msm8996, ln_bb_clk, ln_bb_a_clk, 8); 8158c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER(msm8996, div_clk1, div_clk1_a, 0xb); 8168c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER(msm8996, div_clk2, div_clk2_a, 0xc); 8178c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER(msm8996, div_clk3, div_clk3_a, 0xd); 8188c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(msm8996, bb_clk1_pin, bb_clk1_a_pin, 1); 8198c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(msm8996, bb_clk2_pin, bb_clk2_a_pin, 2); 8208c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(msm8996, rf_clk1_pin, rf_clk1_a_pin, 4); 8218c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(msm8996, rf_clk2_pin, rf_clk2_a_pin, 5); 8228c2ecf20Sopenharmony_ci 8238c2ecf20Sopenharmony_cistatic struct clk_smd_rpm *msm8996_clks[] = { 8248c2ecf20Sopenharmony_ci [RPM_SMD_PCNOC_CLK] = &msm8996_pcnoc_clk, 8258c2ecf20Sopenharmony_ci [RPM_SMD_PCNOC_A_CLK] = &msm8996_pcnoc_a_clk, 8268c2ecf20Sopenharmony_ci [RPM_SMD_SNOC_CLK] = &msm8996_snoc_clk, 8278c2ecf20Sopenharmony_ci [RPM_SMD_SNOC_A_CLK] = &msm8996_snoc_a_clk, 8288c2ecf20Sopenharmony_ci [RPM_SMD_CNOC_CLK] = &msm8996_cnoc_clk, 8298c2ecf20Sopenharmony_ci [RPM_SMD_CNOC_A_CLK] = &msm8996_cnoc_a_clk, 8308c2ecf20Sopenharmony_ci [RPM_SMD_BIMC_CLK] = &msm8996_bimc_clk, 8318c2ecf20Sopenharmony_ci [RPM_SMD_BIMC_A_CLK] = &msm8996_bimc_a_clk, 8328c2ecf20Sopenharmony_ci [RPM_SMD_MMAXI_CLK] = &msm8996_mmssnoc_axi_rpm_clk, 8338c2ecf20Sopenharmony_ci [RPM_SMD_MMAXI_A_CLK] = &msm8996_mmssnoc_axi_rpm_a_clk, 8348c2ecf20Sopenharmony_ci [RPM_SMD_IPA_CLK] = &msm8996_ipa_clk, 8358c2ecf20Sopenharmony_ci [RPM_SMD_IPA_A_CLK] = &msm8996_ipa_a_clk, 8368c2ecf20Sopenharmony_ci [RPM_SMD_CE1_CLK] = &msm8996_ce1_clk, 8378c2ecf20Sopenharmony_ci [RPM_SMD_CE1_A_CLK] = &msm8996_ce1_a_clk, 8388c2ecf20Sopenharmony_ci [RPM_SMD_AGGR1_NOC_CLK] = &msm8996_aggre1_noc_clk, 8398c2ecf20Sopenharmony_ci [RPM_SMD_AGGR1_NOC_A_CLK] = &msm8996_aggre1_noc_a_clk, 8408c2ecf20Sopenharmony_ci [RPM_SMD_AGGR2_NOC_CLK] = &msm8996_aggre2_noc_clk, 8418c2ecf20Sopenharmony_ci [RPM_SMD_AGGR2_NOC_A_CLK] = &msm8996_aggre2_noc_a_clk, 8428c2ecf20Sopenharmony_ci [RPM_SMD_QDSS_CLK] = &msm8996_qdss_clk, 8438c2ecf20Sopenharmony_ci [RPM_SMD_QDSS_A_CLK] = &msm8996_qdss_a_clk, 8448c2ecf20Sopenharmony_ci [RPM_SMD_BB_CLK1] = &msm8996_bb_clk1, 8458c2ecf20Sopenharmony_ci [RPM_SMD_BB_CLK1_A] = &msm8996_bb_clk1_a, 8468c2ecf20Sopenharmony_ci [RPM_SMD_BB_CLK2] = &msm8996_bb_clk2, 8478c2ecf20Sopenharmony_ci [RPM_SMD_BB_CLK2_A] = &msm8996_bb_clk2_a, 8488c2ecf20Sopenharmony_ci [RPM_SMD_RF_CLK1] = &msm8996_rf_clk1, 8498c2ecf20Sopenharmony_ci [RPM_SMD_RF_CLK1_A] = &msm8996_rf_clk1_a, 8508c2ecf20Sopenharmony_ci [RPM_SMD_RF_CLK2] = &msm8996_rf_clk2, 8518c2ecf20Sopenharmony_ci [RPM_SMD_RF_CLK2_A] = &msm8996_rf_clk2_a, 8528c2ecf20Sopenharmony_ci [RPM_SMD_LN_BB_CLK] = &msm8996_ln_bb_clk, 8538c2ecf20Sopenharmony_ci [RPM_SMD_LN_BB_A_CLK] = &msm8996_ln_bb_a_clk, 8548c2ecf20Sopenharmony_ci [RPM_SMD_DIV_CLK1] = &msm8996_div_clk1, 8558c2ecf20Sopenharmony_ci [RPM_SMD_DIV_A_CLK1] = &msm8996_div_clk1_a, 8568c2ecf20Sopenharmony_ci [RPM_SMD_DIV_CLK2] = &msm8996_div_clk2, 8578c2ecf20Sopenharmony_ci [RPM_SMD_DIV_A_CLK2] = &msm8996_div_clk2_a, 8588c2ecf20Sopenharmony_ci [RPM_SMD_DIV_CLK3] = &msm8996_div_clk3, 8598c2ecf20Sopenharmony_ci [RPM_SMD_DIV_A_CLK3] = &msm8996_div_clk3_a, 8608c2ecf20Sopenharmony_ci [RPM_SMD_BB_CLK1_PIN] = &msm8996_bb_clk1_pin, 8618c2ecf20Sopenharmony_ci [RPM_SMD_BB_CLK1_A_PIN] = &msm8996_bb_clk1_a_pin, 8628c2ecf20Sopenharmony_ci [RPM_SMD_BB_CLK2_PIN] = &msm8996_bb_clk2_pin, 8638c2ecf20Sopenharmony_ci [RPM_SMD_BB_CLK2_A_PIN] = &msm8996_bb_clk2_a_pin, 8648c2ecf20Sopenharmony_ci [RPM_SMD_RF_CLK1_PIN] = &msm8996_rf_clk1_pin, 8658c2ecf20Sopenharmony_ci [RPM_SMD_RF_CLK1_A_PIN] = &msm8996_rf_clk1_a_pin, 8668c2ecf20Sopenharmony_ci [RPM_SMD_RF_CLK2_PIN] = &msm8996_rf_clk2_pin, 8678c2ecf20Sopenharmony_ci [RPM_SMD_RF_CLK2_A_PIN] = &msm8996_rf_clk2_a_pin, 8688c2ecf20Sopenharmony_ci}; 8698c2ecf20Sopenharmony_ci 8708c2ecf20Sopenharmony_cistatic const struct rpm_smd_clk_desc rpm_clk_msm8996 = { 8718c2ecf20Sopenharmony_ci .clks = msm8996_clks, 8728c2ecf20Sopenharmony_ci .num_clks = ARRAY_SIZE(msm8996_clks), 8738c2ecf20Sopenharmony_ci}; 8748c2ecf20Sopenharmony_ci 8758c2ecf20Sopenharmony_ci/* QCS404 */ 8768c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_QDSS(qcs404, qdss_clk, qdss_a_clk, QCOM_SMD_RPM_MISC_CLK, 1); 8778c2ecf20Sopenharmony_ci 8788c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM(qcs404, pnoc_clk, pnoc_a_clk, QCOM_SMD_RPM_BUS_CLK, 0); 8798c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM(qcs404, snoc_clk, snoc_a_clk, QCOM_SMD_RPM_BUS_CLK, 1); 8808c2ecf20Sopenharmony_ci 8818c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM(qcs404, bimc_clk, bimc_a_clk, QCOM_SMD_RPM_MEM_CLK, 0); 8828c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM(qcs404, bimc_gpu_clk, bimc_gpu_a_clk, QCOM_SMD_RPM_MEM_CLK, 2); 8838c2ecf20Sopenharmony_ci 8848c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM(qcs404, qpic_clk, qpic_a_clk, QCOM_SMD_RPM_QPIC_CLK, 0); 8858c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM(qcs404, ce1_clk, ce1_a_clk, QCOM_SMD_RPM_CE_CLK, 0); 8868c2ecf20Sopenharmony_ci 8878c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER(qcs404, rf_clk1, rf_clk1_a, 4); 8888c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(qcs404, rf_clk1_pin, rf_clk1_a_pin, 4); 8898c2ecf20Sopenharmony_ci 8908c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER(qcs404, ln_bb_clk, ln_bb_a_clk, 8); 8918c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(qcs404, ln_bb_clk_pin, ln_bb_clk_a_pin, 8); 8928c2ecf20Sopenharmony_ci 8938c2ecf20Sopenharmony_cistatic struct clk_smd_rpm *qcs404_clks[] = { 8948c2ecf20Sopenharmony_ci [RPM_SMD_QDSS_CLK] = &qcs404_qdss_clk, 8958c2ecf20Sopenharmony_ci [RPM_SMD_QDSS_A_CLK] = &qcs404_qdss_a_clk, 8968c2ecf20Sopenharmony_ci [RPM_SMD_PNOC_CLK] = &qcs404_pnoc_clk, 8978c2ecf20Sopenharmony_ci [RPM_SMD_PNOC_A_CLK] = &qcs404_pnoc_a_clk, 8988c2ecf20Sopenharmony_ci [RPM_SMD_SNOC_CLK] = &qcs404_snoc_clk, 8998c2ecf20Sopenharmony_ci [RPM_SMD_SNOC_A_CLK] = &qcs404_snoc_a_clk, 9008c2ecf20Sopenharmony_ci [RPM_SMD_BIMC_CLK] = &qcs404_bimc_clk, 9018c2ecf20Sopenharmony_ci [RPM_SMD_BIMC_A_CLK] = &qcs404_bimc_a_clk, 9028c2ecf20Sopenharmony_ci [RPM_SMD_BIMC_GPU_CLK] = &qcs404_bimc_gpu_clk, 9038c2ecf20Sopenharmony_ci [RPM_SMD_BIMC_GPU_A_CLK] = &qcs404_bimc_gpu_a_clk, 9048c2ecf20Sopenharmony_ci [RPM_SMD_QPIC_CLK] = &qcs404_qpic_clk, 9058c2ecf20Sopenharmony_ci [RPM_SMD_QPIC_CLK_A] = &qcs404_qpic_a_clk, 9068c2ecf20Sopenharmony_ci [RPM_SMD_CE1_CLK] = &qcs404_ce1_clk, 9078c2ecf20Sopenharmony_ci [RPM_SMD_CE1_A_CLK] = &qcs404_ce1_a_clk, 9088c2ecf20Sopenharmony_ci [RPM_SMD_RF_CLK1] = &qcs404_rf_clk1, 9098c2ecf20Sopenharmony_ci [RPM_SMD_RF_CLK1_A] = &qcs404_rf_clk1_a, 9108c2ecf20Sopenharmony_ci [RPM_SMD_LN_BB_CLK] = &qcs404_ln_bb_clk, 9118c2ecf20Sopenharmony_ci [RPM_SMD_LN_BB_A_CLK] = &qcs404_ln_bb_a_clk, 9128c2ecf20Sopenharmony_ci}; 9138c2ecf20Sopenharmony_ci 9148c2ecf20Sopenharmony_cistatic const struct rpm_smd_clk_desc rpm_clk_qcs404 = { 9158c2ecf20Sopenharmony_ci .clks = qcs404_clks, 9168c2ecf20Sopenharmony_ci .num_clks = ARRAY_SIZE(qcs404_clks), 9178c2ecf20Sopenharmony_ci}; 9188c2ecf20Sopenharmony_ci 9198c2ecf20Sopenharmony_ci/* msm8998 */ 9208c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM(msm8998, bimc_clk, bimc_a_clk, QCOM_SMD_RPM_MEM_CLK, 0); 9218c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM(msm8998, pcnoc_clk, pcnoc_a_clk, QCOM_SMD_RPM_BUS_CLK, 0); 9228c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM(msm8998, snoc_clk, snoc_a_clk, QCOM_SMD_RPM_BUS_CLK, 1); 9238c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM(msm8998, cnoc_clk, cnoc_a_clk, QCOM_SMD_RPM_BUS_CLK, 2); 9248c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM(msm8998, ce1_clk, ce1_a_clk, QCOM_SMD_RPM_CE_CLK, 0); 9258c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER(msm8998, div_clk1, div_clk1_a, 0xb); 9268c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM(msm8998, ipa_clk, ipa_a_clk, QCOM_SMD_RPM_IPA_CLK, 0); 9278c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER(msm8998, ln_bb_clk1, ln_bb_clk1_a, 1); 9288c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER(msm8998, ln_bb_clk2, ln_bb_clk2_a, 2); 9298c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(msm8998, ln_bb_clk3_pin, ln_bb_clk3_a_pin, 9308c2ecf20Sopenharmony_ci 3); 9318c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM(msm8998, mmssnoc_axi_rpm_clk, mmssnoc_axi_rpm_a_clk, 9328c2ecf20Sopenharmony_ci QCOM_SMD_RPM_MMAXI_CLK, 0); 9338c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM(msm8998, aggre1_noc_clk, aggre1_noc_a_clk, 9348c2ecf20Sopenharmony_ci QCOM_SMD_RPM_AGGR_CLK, 1); 9358c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM(msm8998, aggre2_noc_clk, aggre2_noc_a_clk, 9368c2ecf20Sopenharmony_ci QCOM_SMD_RPM_AGGR_CLK, 2); 9378c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_QDSS(msm8998, qdss_clk, qdss_a_clk, 9388c2ecf20Sopenharmony_ci QCOM_SMD_RPM_MISC_CLK, 1); 9398c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER(msm8998, rf_clk1, rf_clk1_a, 4); 9408c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(msm8998, rf_clk2_pin, rf_clk2_a_pin, 5); 9418c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER(msm8998, rf_clk3, rf_clk3_a, 6); 9428c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(msm8998, rf_clk3_pin, rf_clk3_a_pin, 6); 9438c2ecf20Sopenharmony_cistatic struct clk_smd_rpm *msm8998_clks[] = { 9448c2ecf20Sopenharmony_ci [RPM_SMD_BIMC_CLK] = &msm8998_bimc_clk, 9458c2ecf20Sopenharmony_ci [RPM_SMD_BIMC_A_CLK] = &msm8998_bimc_a_clk, 9468c2ecf20Sopenharmony_ci [RPM_SMD_PCNOC_CLK] = &msm8998_pcnoc_clk, 9478c2ecf20Sopenharmony_ci [RPM_SMD_PCNOC_A_CLK] = &msm8998_pcnoc_a_clk, 9488c2ecf20Sopenharmony_ci [RPM_SMD_SNOC_CLK] = &msm8998_snoc_clk, 9498c2ecf20Sopenharmony_ci [RPM_SMD_SNOC_A_CLK] = &msm8998_snoc_a_clk, 9508c2ecf20Sopenharmony_ci [RPM_SMD_CNOC_CLK] = &msm8998_cnoc_clk, 9518c2ecf20Sopenharmony_ci [RPM_SMD_CNOC_A_CLK] = &msm8998_cnoc_a_clk, 9528c2ecf20Sopenharmony_ci [RPM_SMD_CE1_CLK] = &msm8998_ce1_clk, 9538c2ecf20Sopenharmony_ci [RPM_SMD_CE1_A_CLK] = &msm8998_ce1_a_clk, 9548c2ecf20Sopenharmony_ci [RPM_SMD_DIV_CLK1] = &msm8998_div_clk1, 9558c2ecf20Sopenharmony_ci [RPM_SMD_DIV_A_CLK1] = &msm8998_div_clk1_a, 9568c2ecf20Sopenharmony_ci [RPM_SMD_IPA_CLK] = &msm8998_ipa_clk, 9578c2ecf20Sopenharmony_ci [RPM_SMD_IPA_A_CLK] = &msm8998_ipa_a_clk, 9588c2ecf20Sopenharmony_ci [RPM_SMD_LN_BB_CLK1] = &msm8998_ln_bb_clk1, 9598c2ecf20Sopenharmony_ci [RPM_SMD_LN_BB_CLK1_A] = &msm8998_ln_bb_clk1_a, 9608c2ecf20Sopenharmony_ci [RPM_SMD_LN_BB_CLK2] = &msm8998_ln_bb_clk2, 9618c2ecf20Sopenharmony_ci [RPM_SMD_LN_BB_CLK2_A] = &msm8998_ln_bb_clk2_a, 9628c2ecf20Sopenharmony_ci [RPM_SMD_LN_BB_CLK3_PIN] = &msm8998_ln_bb_clk3_pin, 9638c2ecf20Sopenharmony_ci [RPM_SMD_LN_BB_CLK3_A_PIN] = &msm8998_ln_bb_clk3_a_pin, 9648c2ecf20Sopenharmony_ci [RPM_SMD_MMAXI_CLK] = &msm8998_mmssnoc_axi_rpm_clk, 9658c2ecf20Sopenharmony_ci [RPM_SMD_MMAXI_A_CLK] = &msm8998_mmssnoc_axi_rpm_a_clk, 9668c2ecf20Sopenharmony_ci [RPM_SMD_AGGR1_NOC_CLK] = &msm8998_aggre1_noc_clk, 9678c2ecf20Sopenharmony_ci [RPM_SMD_AGGR1_NOC_A_CLK] = &msm8998_aggre1_noc_a_clk, 9688c2ecf20Sopenharmony_ci [RPM_SMD_AGGR2_NOC_CLK] = &msm8998_aggre2_noc_clk, 9698c2ecf20Sopenharmony_ci [RPM_SMD_AGGR2_NOC_A_CLK] = &msm8998_aggre2_noc_a_clk, 9708c2ecf20Sopenharmony_ci [RPM_SMD_QDSS_CLK] = &msm8998_qdss_clk, 9718c2ecf20Sopenharmony_ci [RPM_SMD_QDSS_A_CLK] = &msm8998_qdss_a_clk, 9728c2ecf20Sopenharmony_ci [RPM_SMD_RF_CLK1] = &msm8998_rf_clk1, 9738c2ecf20Sopenharmony_ci [RPM_SMD_RF_CLK1_A] = &msm8998_rf_clk1_a, 9748c2ecf20Sopenharmony_ci [RPM_SMD_RF_CLK2_PIN] = &msm8998_rf_clk2_pin, 9758c2ecf20Sopenharmony_ci [RPM_SMD_RF_CLK2_A_PIN] = &msm8998_rf_clk2_a_pin, 9768c2ecf20Sopenharmony_ci [RPM_SMD_RF_CLK3] = &msm8998_rf_clk3, 9778c2ecf20Sopenharmony_ci [RPM_SMD_RF_CLK3_A] = &msm8998_rf_clk3_a, 9788c2ecf20Sopenharmony_ci [RPM_SMD_RF_CLK3_PIN] = &msm8998_rf_clk3_pin, 9798c2ecf20Sopenharmony_ci [RPM_SMD_RF_CLK3_A_PIN] = &msm8998_rf_clk3_a_pin, 9808c2ecf20Sopenharmony_ci}; 9818c2ecf20Sopenharmony_ci 9828c2ecf20Sopenharmony_cistatic const struct rpm_smd_clk_desc rpm_clk_msm8998 = { 9838c2ecf20Sopenharmony_ci .clks = msm8998_clks, 9848c2ecf20Sopenharmony_ci .num_clks = ARRAY_SIZE(msm8998_clks), 9858c2ecf20Sopenharmony_ci}; 9868c2ecf20Sopenharmony_ci 9878c2ecf20Sopenharmony_ci/* sdm660 */ 9888c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_BRANCH(sdm660, bi_tcxo, bi_tcxo_a, QCOM_SMD_RPM_MISC_CLK, 0, 9898c2ecf20Sopenharmony_ci 19200000); 9908c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM(sdm660, snoc_clk, snoc_a_clk, QCOM_SMD_RPM_BUS_CLK, 1); 9918c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM(sdm660, cnoc_clk, cnoc_a_clk, QCOM_SMD_RPM_BUS_CLK, 2); 9928c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM(sdm660, cnoc_periph_clk, cnoc_periph_a_clk, 9938c2ecf20Sopenharmony_ci QCOM_SMD_RPM_BUS_CLK, 0); 9948c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM(sdm660, bimc_clk, bimc_a_clk, QCOM_SMD_RPM_MEM_CLK, 0); 9958c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM(sdm660, mmssnoc_axi_clk, mmssnoc_axi_a_clk, 9968c2ecf20Sopenharmony_ci QCOM_SMD_RPM_MMAXI_CLK, 0); 9978c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM(sdm660, ipa_clk, ipa_a_clk, QCOM_SMD_RPM_IPA_CLK, 0); 9988c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM(sdm660, ce1_clk, ce1_a_clk, QCOM_SMD_RPM_CE_CLK, 0); 9998c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM(sdm660, aggre2_noc_clk, aggre2_noc_a_clk, 10008c2ecf20Sopenharmony_ci QCOM_SMD_RPM_AGGR_CLK, 2); 10018c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_QDSS(sdm660, qdss_clk, qdss_a_clk, 10028c2ecf20Sopenharmony_ci QCOM_SMD_RPM_MISC_CLK, 1); 10038c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER(sdm660, rf_clk1, rf_clk1_a, 4); 10048c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER(sdm660, div_clk1, div_clk1_a, 11); 10058c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER(sdm660, ln_bb_clk1, ln_bb_clk1_a, 1); 10068c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER(sdm660, ln_bb_clk2, ln_bb_clk2_a, 2); 10078c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER(sdm660, ln_bb_clk3, ln_bb_clk3_a, 3); 10088c2ecf20Sopenharmony_ci 10098c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(sdm660, rf_clk1_pin, rf_clk1_a_pin, 4); 10108c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(sdm660, ln_bb_clk1_pin, 10118c2ecf20Sopenharmony_ci ln_bb_clk1_pin_a, 1); 10128c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(sdm660, ln_bb_clk2_pin, 10138c2ecf20Sopenharmony_ci ln_bb_clk2_pin_a, 2); 10148c2ecf20Sopenharmony_ciDEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(sdm660, ln_bb_clk3_pin, 10158c2ecf20Sopenharmony_ci ln_bb_clk3_pin_a, 3); 10168c2ecf20Sopenharmony_cistatic struct clk_smd_rpm *sdm660_clks[] = { 10178c2ecf20Sopenharmony_ci [RPM_SMD_XO_CLK_SRC] = &sdm660_bi_tcxo, 10188c2ecf20Sopenharmony_ci [RPM_SMD_XO_A_CLK_SRC] = &sdm660_bi_tcxo_a, 10198c2ecf20Sopenharmony_ci [RPM_SMD_SNOC_CLK] = &sdm660_snoc_clk, 10208c2ecf20Sopenharmony_ci [RPM_SMD_SNOC_A_CLK] = &sdm660_snoc_a_clk, 10218c2ecf20Sopenharmony_ci [RPM_SMD_CNOC_CLK] = &sdm660_cnoc_clk, 10228c2ecf20Sopenharmony_ci [RPM_SMD_CNOC_A_CLK] = &sdm660_cnoc_a_clk, 10238c2ecf20Sopenharmony_ci [RPM_SMD_CNOC_PERIPH_CLK] = &sdm660_cnoc_periph_clk, 10248c2ecf20Sopenharmony_ci [RPM_SMD_CNOC_PERIPH_A_CLK] = &sdm660_cnoc_periph_a_clk, 10258c2ecf20Sopenharmony_ci [RPM_SMD_BIMC_CLK] = &sdm660_bimc_clk, 10268c2ecf20Sopenharmony_ci [RPM_SMD_BIMC_A_CLK] = &sdm660_bimc_a_clk, 10278c2ecf20Sopenharmony_ci [RPM_SMD_MMSSNOC_AXI_CLK] = &sdm660_mmssnoc_axi_clk, 10288c2ecf20Sopenharmony_ci [RPM_SMD_MMSSNOC_AXI_CLK_A] = &sdm660_mmssnoc_axi_a_clk, 10298c2ecf20Sopenharmony_ci [RPM_SMD_IPA_CLK] = &sdm660_ipa_clk, 10308c2ecf20Sopenharmony_ci [RPM_SMD_IPA_A_CLK] = &sdm660_ipa_a_clk, 10318c2ecf20Sopenharmony_ci [RPM_SMD_CE1_CLK] = &sdm660_ce1_clk, 10328c2ecf20Sopenharmony_ci [RPM_SMD_CE1_A_CLK] = &sdm660_ce1_a_clk, 10338c2ecf20Sopenharmony_ci [RPM_SMD_AGGR2_NOC_CLK] = &sdm660_aggre2_noc_clk, 10348c2ecf20Sopenharmony_ci [RPM_SMD_AGGR2_NOC_A_CLK] = &sdm660_aggre2_noc_a_clk, 10358c2ecf20Sopenharmony_ci [RPM_SMD_QDSS_CLK] = &sdm660_qdss_clk, 10368c2ecf20Sopenharmony_ci [RPM_SMD_QDSS_A_CLK] = &sdm660_qdss_a_clk, 10378c2ecf20Sopenharmony_ci [RPM_SMD_RF_CLK1] = &sdm660_rf_clk1, 10388c2ecf20Sopenharmony_ci [RPM_SMD_RF_CLK1_A] = &sdm660_rf_clk1_a, 10398c2ecf20Sopenharmony_ci [RPM_SMD_DIV_CLK1] = &sdm660_div_clk1, 10408c2ecf20Sopenharmony_ci [RPM_SMD_DIV_A_CLK1] = &sdm660_div_clk1_a, 10418c2ecf20Sopenharmony_ci [RPM_SMD_LN_BB_CLK] = &sdm660_ln_bb_clk1, 10428c2ecf20Sopenharmony_ci [RPM_SMD_LN_BB_A_CLK] = &sdm660_ln_bb_clk1_a, 10438c2ecf20Sopenharmony_ci [RPM_SMD_LN_BB_CLK2] = &sdm660_ln_bb_clk2, 10448c2ecf20Sopenharmony_ci [RPM_SMD_LN_BB_CLK2_A] = &sdm660_ln_bb_clk2_a, 10458c2ecf20Sopenharmony_ci [RPM_SMD_LN_BB_CLK3] = &sdm660_ln_bb_clk3, 10468c2ecf20Sopenharmony_ci [RPM_SMD_LN_BB_CLK3_A] = &sdm660_ln_bb_clk3_a, 10478c2ecf20Sopenharmony_ci [RPM_SMD_RF_CLK1_PIN] = &sdm660_rf_clk1_pin, 10488c2ecf20Sopenharmony_ci [RPM_SMD_RF_CLK1_A_PIN] = &sdm660_rf_clk1_a_pin, 10498c2ecf20Sopenharmony_ci [RPM_SMD_LN_BB_CLK1_PIN] = &sdm660_ln_bb_clk1_pin, 10508c2ecf20Sopenharmony_ci [RPM_SMD_LN_BB_CLK1_A_PIN] = &sdm660_ln_bb_clk1_pin_a, 10518c2ecf20Sopenharmony_ci [RPM_SMD_LN_BB_CLK2_PIN] = &sdm660_ln_bb_clk2_pin, 10528c2ecf20Sopenharmony_ci [RPM_SMD_LN_BB_CLK2_A_PIN] = &sdm660_ln_bb_clk2_pin_a, 10538c2ecf20Sopenharmony_ci [RPM_SMD_LN_BB_CLK3_PIN] = &sdm660_ln_bb_clk3_pin, 10548c2ecf20Sopenharmony_ci [RPM_SMD_LN_BB_CLK3_A_PIN] = &sdm660_ln_bb_clk3_pin_a, 10558c2ecf20Sopenharmony_ci}; 10568c2ecf20Sopenharmony_ci 10578c2ecf20Sopenharmony_cistatic const struct rpm_smd_clk_desc rpm_clk_sdm660 = { 10588c2ecf20Sopenharmony_ci .clks = sdm660_clks, 10598c2ecf20Sopenharmony_ci .num_clks = ARRAY_SIZE(sdm660_clks), 10608c2ecf20Sopenharmony_ci}; 10618c2ecf20Sopenharmony_ci 10628c2ecf20Sopenharmony_cistatic const struct of_device_id rpm_smd_clk_match_table[] = { 10638c2ecf20Sopenharmony_ci { .compatible = "qcom,rpmcc-msm8916", .data = &rpm_clk_msm8916 }, 10648c2ecf20Sopenharmony_ci { .compatible = "qcom,rpmcc-msm8936", .data = &rpm_clk_msm8936 }, 10658c2ecf20Sopenharmony_ci { .compatible = "qcom,rpmcc-msm8974", .data = &rpm_clk_msm8974 }, 10668c2ecf20Sopenharmony_ci { .compatible = "qcom,rpmcc-msm8976", .data = &rpm_clk_msm8976 }, 10678c2ecf20Sopenharmony_ci { .compatible = "qcom,rpmcc-msm8992", .data = &rpm_clk_msm8992 }, 10688c2ecf20Sopenharmony_ci { .compatible = "qcom,rpmcc-msm8994", .data = &rpm_clk_msm8994 }, 10698c2ecf20Sopenharmony_ci { .compatible = "qcom,rpmcc-msm8996", .data = &rpm_clk_msm8996 }, 10708c2ecf20Sopenharmony_ci { .compatible = "qcom,rpmcc-msm8998", .data = &rpm_clk_msm8998 }, 10718c2ecf20Sopenharmony_ci { .compatible = "qcom,rpmcc-qcs404", .data = &rpm_clk_qcs404 }, 10728c2ecf20Sopenharmony_ci { .compatible = "qcom,rpmcc-sdm660", .data = &rpm_clk_sdm660 }, 10738c2ecf20Sopenharmony_ci { } 10748c2ecf20Sopenharmony_ci}; 10758c2ecf20Sopenharmony_ciMODULE_DEVICE_TABLE(of, rpm_smd_clk_match_table); 10768c2ecf20Sopenharmony_ci 10778c2ecf20Sopenharmony_cistatic struct clk_hw *qcom_smdrpm_clk_hw_get(struct of_phandle_args *clkspec, 10788c2ecf20Sopenharmony_ci void *data) 10798c2ecf20Sopenharmony_ci{ 10808c2ecf20Sopenharmony_ci struct rpm_cc *rcc = data; 10818c2ecf20Sopenharmony_ci unsigned int idx = clkspec->args[0]; 10828c2ecf20Sopenharmony_ci 10838c2ecf20Sopenharmony_ci if (idx >= rcc->num_clks) { 10848c2ecf20Sopenharmony_ci pr_err("%s: invalid index %u\n", __func__, idx); 10858c2ecf20Sopenharmony_ci return ERR_PTR(-EINVAL); 10868c2ecf20Sopenharmony_ci } 10878c2ecf20Sopenharmony_ci 10888c2ecf20Sopenharmony_ci return rcc->clks[idx] ? &rcc->clks[idx]->hw : ERR_PTR(-ENOENT); 10898c2ecf20Sopenharmony_ci} 10908c2ecf20Sopenharmony_ci 10918c2ecf20Sopenharmony_cistatic int rpm_smd_clk_probe(struct platform_device *pdev) 10928c2ecf20Sopenharmony_ci{ 10938c2ecf20Sopenharmony_ci struct rpm_cc *rcc; 10948c2ecf20Sopenharmony_ci int ret; 10958c2ecf20Sopenharmony_ci size_t num_clks, i; 10968c2ecf20Sopenharmony_ci struct qcom_smd_rpm *rpm; 10978c2ecf20Sopenharmony_ci struct clk_smd_rpm **rpm_smd_clks; 10988c2ecf20Sopenharmony_ci const struct rpm_smd_clk_desc *desc; 10998c2ecf20Sopenharmony_ci 11008c2ecf20Sopenharmony_ci rpm = dev_get_drvdata(pdev->dev.parent); 11018c2ecf20Sopenharmony_ci if (!rpm) { 11028c2ecf20Sopenharmony_ci dev_err(&pdev->dev, "Unable to retrieve handle to RPM\n"); 11038c2ecf20Sopenharmony_ci return -ENODEV; 11048c2ecf20Sopenharmony_ci } 11058c2ecf20Sopenharmony_ci 11068c2ecf20Sopenharmony_ci desc = of_device_get_match_data(&pdev->dev); 11078c2ecf20Sopenharmony_ci if (!desc) 11088c2ecf20Sopenharmony_ci return -EINVAL; 11098c2ecf20Sopenharmony_ci 11108c2ecf20Sopenharmony_ci rpm_smd_clks = desc->clks; 11118c2ecf20Sopenharmony_ci num_clks = desc->num_clks; 11128c2ecf20Sopenharmony_ci 11138c2ecf20Sopenharmony_ci rcc = devm_kzalloc(&pdev->dev, sizeof(*rcc), GFP_KERNEL); 11148c2ecf20Sopenharmony_ci if (!rcc) 11158c2ecf20Sopenharmony_ci return -ENOMEM; 11168c2ecf20Sopenharmony_ci 11178c2ecf20Sopenharmony_ci rcc->clks = rpm_smd_clks; 11188c2ecf20Sopenharmony_ci rcc->num_clks = num_clks; 11198c2ecf20Sopenharmony_ci 11208c2ecf20Sopenharmony_ci for (i = 0; i < num_clks; i++) { 11218c2ecf20Sopenharmony_ci if (!rpm_smd_clks[i]) 11228c2ecf20Sopenharmony_ci continue; 11238c2ecf20Sopenharmony_ci 11248c2ecf20Sopenharmony_ci rpm_smd_clks[i]->rpm = rpm; 11258c2ecf20Sopenharmony_ci 11268c2ecf20Sopenharmony_ci ret = clk_smd_rpm_handoff(rpm_smd_clks[i]); 11278c2ecf20Sopenharmony_ci if (ret) 11288c2ecf20Sopenharmony_ci goto err; 11298c2ecf20Sopenharmony_ci } 11308c2ecf20Sopenharmony_ci 11318c2ecf20Sopenharmony_ci ret = clk_smd_rpm_enable_scaling(rpm); 11328c2ecf20Sopenharmony_ci if (ret) 11338c2ecf20Sopenharmony_ci goto err; 11348c2ecf20Sopenharmony_ci 11358c2ecf20Sopenharmony_ci for (i = 0; i < num_clks; i++) { 11368c2ecf20Sopenharmony_ci if (!rpm_smd_clks[i]) 11378c2ecf20Sopenharmony_ci continue; 11388c2ecf20Sopenharmony_ci 11398c2ecf20Sopenharmony_ci ret = devm_clk_hw_register(&pdev->dev, &rpm_smd_clks[i]->hw); 11408c2ecf20Sopenharmony_ci if (ret) 11418c2ecf20Sopenharmony_ci goto err; 11428c2ecf20Sopenharmony_ci } 11438c2ecf20Sopenharmony_ci 11448c2ecf20Sopenharmony_ci ret = devm_of_clk_add_hw_provider(&pdev->dev, qcom_smdrpm_clk_hw_get, 11458c2ecf20Sopenharmony_ci rcc); 11468c2ecf20Sopenharmony_ci if (ret) 11478c2ecf20Sopenharmony_ci goto err; 11488c2ecf20Sopenharmony_ci 11498c2ecf20Sopenharmony_ci return 0; 11508c2ecf20Sopenharmony_cierr: 11518c2ecf20Sopenharmony_ci dev_err(&pdev->dev, "Error registering SMD clock driver (%d)\n", ret); 11528c2ecf20Sopenharmony_ci return ret; 11538c2ecf20Sopenharmony_ci} 11548c2ecf20Sopenharmony_ci 11558c2ecf20Sopenharmony_cistatic struct platform_driver rpm_smd_clk_driver = { 11568c2ecf20Sopenharmony_ci .driver = { 11578c2ecf20Sopenharmony_ci .name = "qcom-clk-smd-rpm", 11588c2ecf20Sopenharmony_ci .of_match_table = rpm_smd_clk_match_table, 11598c2ecf20Sopenharmony_ci }, 11608c2ecf20Sopenharmony_ci .probe = rpm_smd_clk_probe, 11618c2ecf20Sopenharmony_ci}; 11628c2ecf20Sopenharmony_ci 11638c2ecf20Sopenharmony_cistatic int __init rpm_smd_clk_init(void) 11648c2ecf20Sopenharmony_ci{ 11658c2ecf20Sopenharmony_ci return platform_driver_register(&rpm_smd_clk_driver); 11668c2ecf20Sopenharmony_ci} 11678c2ecf20Sopenharmony_cicore_initcall(rpm_smd_clk_init); 11688c2ecf20Sopenharmony_ci 11698c2ecf20Sopenharmony_cistatic void __exit rpm_smd_clk_exit(void) 11708c2ecf20Sopenharmony_ci{ 11718c2ecf20Sopenharmony_ci platform_driver_unregister(&rpm_smd_clk_driver); 11728c2ecf20Sopenharmony_ci} 11738c2ecf20Sopenharmony_cimodule_exit(rpm_smd_clk_exit); 11748c2ecf20Sopenharmony_ci 11758c2ecf20Sopenharmony_ciMODULE_DESCRIPTION("Qualcomm RPM over SMD Clock Controller Driver"); 11768c2ecf20Sopenharmony_ciMODULE_LICENSE("GPL v2"); 11778c2ecf20Sopenharmony_ciMODULE_ALIAS("platform:qcom-clk-smd-rpm"); 1178