2018-05-09 11:26:07 +05:30
// SPDX-License-Identifier: GPL-2.0
/*
2021-02-10 22:43:50 +05:30
* Copyright ( c ) 2018 - 2021 , The Linux Foundation . All rights reserved .
2018-05-09 11:26:07 +05:30
*/
# include <linux/clk-provider.h>
# include <linux/err.h>
# include <linux/kernel.h>
# include <linux/module.h>
# include <linux/of.h>
# include <linux/platform_device.h>
# include <soc/qcom/cmd-db.h>
# include <soc/qcom/rpmh.h>
2019-08-05 14:33:46 -06:00
# include <soc/qcom/tcs.h>
2018-05-09 11:26:07 +05:30
# include <dt-bindings/clock/qcom,rpmh.h>
# define CLK_RPMH_ARC_EN_OFFSET 0
# define CLK_RPMH_VRM_EN_OFFSET 4
2019-01-24 16:47:00 -08:00
/**
* struct bcm_db - Auxiliary data pertaining to each Bus Clock Manager ( BCM )
* @ unit : divisor used to convert Hz value to an RPMh msg
* @ width : multiplier used to convert Hz value to an RPMh msg
* @ vcd : virtual clock domain that this bcm belongs to
* @ reserved : reserved to pad the struct
*/
struct bcm_db {
__le32 unit ;
__le16 width ;
u8 vcd ;
u8 reserved ;
} ;
2018-05-09 11:26:07 +05:30
/**
* struct clk_rpmh - individual rpmh clock data structure
* @ hw : handle between common and hardware - specific interfaces
* @ res_name : resource name for the rpmh clock
* @ div : clock divider to compute the clock rate
* @ res_addr : base address of the rpmh resource within the RPMh
* @ res_on_val : rpmh clock enable value
* @ state : rpmh clock requested state
* @ aggr_state : rpmh clock aggregated state
* @ last_sent_aggr_state : rpmh clock last aggr state sent to RPMh
* @ valid_state_mask : mask to determine the state of the rpmh clock
2019-01-24 16:47:00 -08:00
* @ unit : divisor to convert rate to rpmh msg in magnitudes of Khz
2018-05-09 11:26:07 +05:30
* @ dev : device to which it is attached
* @ peer : pointer to the clock rpmh sibling
*/
struct clk_rpmh {
struct clk_hw hw ;
const char * res_name ;
u8 div ;
u32 res_addr ;
u32 res_on_val ;
u32 state ;
u32 aggr_state ;
u32 last_sent_aggr_state ;
u32 valid_state_mask ;
2019-01-24 16:47:00 -08:00
u32 unit ;
2018-05-09 11:26:07 +05:30
struct device * dev ;
struct clk_rpmh * peer ;
} ;
struct clk_rpmh_desc {
struct clk_hw * * clks ;
size_t num_clks ;
} ;
static DEFINE_MUTEX ( rpmh_clk_lock ) ;
2022-12-02 20:58:43 +02:00
# define __DEFINE_CLK_RPMH(_name, _clk_name, _res_name, \
2018-05-09 11:26:07 +05:30
_res_en_offset , _res_on , _div ) \
2022-12-02 20:58:43 +02:00
static struct clk_rpmh clk_rpmh_ # # _clk_name # # _ao ; \
static struct clk_rpmh clk_rpmh_ # # _clk_name = { \
2018-05-09 11:26:07 +05:30
. res_name = _res_name , \
. res_addr = _res_en_offset , \
. res_on_val = _res_on , \
. div = _div , \
2022-12-02 20:58:43 +02:00
. peer = & clk_rpmh_ # # _clk_name # # _ao , \
2018-05-09 11:26:07 +05:30
. valid_state_mask = ( BIT ( RPMH_WAKE_ONLY_STATE ) | \
BIT ( RPMH_ACTIVE_ONLY_STATE ) | \
BIT ( RPMH_SLEEP_STATE ) ) , \
. hw . init = & ( struct clk_init_data ) { \
. ops = & clk_rpmh_ops , \
. name = # _name , \
2019-08-26 23:01:18 +05:30
. parent_data = & ( const struct clk_parent_data ) { \
. fw_name = " xo " , \
. name = " xo_board " , \
} , \
2018-05-09 11:26:07 +05:30
. num_parents = 1 , \
} , \
} ; \
2022-12-02 20:58:43 +02:00
static struct clk_rpmh clk_rpmh_ # # _clk_name # # _ao = { \
2018-05-09 11:26:07 +05:30
. res_name = _res_name , \
. res_addr = _res_en_offset , \
. res_on_val = _res_on , \
. div = _div , \
2022-12-02 20:58:43 +02:00
. peer = & clk_rpmh_ # # _clk_name , \
2018-05-09 11:26:07 +05:30
. valid_state_mask = ( BIT ( RPMH_WAKE_ONLY_STATE ) | \
BIT ( RPMH_ACTIVE_ONLY_STATE ) ) , \
. hw . init = & ( struct clk_init_data ) { \
. ops = & clk_rpmh_ops , \
2022-12-02 20:58:38 +02:00
. name = # _name " _ao " , \
2019-08-26 23:01:18 +05:30
. parent_data = & ( const struct clk_parent_data ) { \
. fw_name = " xo " , \
. name = " xo_board " , \
} , \
2018-05-09 11:26:07 +05:30
. num_parents = 1 , \
} , \
}
2022-12-02 20:58:43 +02:00
# define DEFINE_CLK_RPMH_ARC(_name, _res_name, _res_on, _div) \
__DEFINE_CLK_RPMH ( _name , _name # # _ # # div # # _div , _res_name , \
2018-05-09 11:26:07 +05:30
CLK_RPMH_ARC_EN_OFFSET , _res_on , _div )
2022-12-02 20:58:43 +02:00
# define DEFINE_CLK_RPMH_VRM(_name, _suffix, _res_name, _div) \
__DEFINE_CLK_RPMH ( _name , _name # # _suffix , _res_name , \
2018-05-09 11:26:07 +05:30
CLK_RPMH_VRM_EN_OFFSET , 1 , _div )
2022-12-02 20:58:39 +02:00
# define DEFINE_CLK_RPMH_BCM(_name, _res_name) \
static struct clk_rpmh clk_rpmh_ # # _name = { \
2019-01-24 16:47:00 -08:00
. res_name = _res_name , \
. valid_state_mask = BIT ( RPMH_ACTIVE_ONLY_STATE ) , \
. div = 1 , \
. hw . init = & ( struct clk_init_data ) { \
. ops = & clk_rpmh_bcm_ops , \
. name = # _name , \
} , \
}
2018-05-09 11:26:07 +05:30
static inline struct clk_rpmh * to_clk_rpmh ( struct clk_hw * _hw )
{
return container_of ( _hw , struct clk_rpmh , hw ) ;
}
static inline bool has_state_changed ( struct clk_rpmh * c , u32 state )
{
return ( c - > last_sent_aggr_state & BIT ( state ) )
! = ( c - > aggr_state & BIT ( state ) ) ;
}
2020-02-14 18:12:32 -08:00
static int clk_rpmh_send ( struct clk_rpmh * c , enum rpmh_state state ,
struct tcs_cmd * cmd , bool wait )
{
if ( wait )
return rpmh_write ( c - > dev , state , cmd , 1 ) ;
return rpmh_write_async ( c - > dev , state , cmd , 1 ) ;
}
2018-05-09 11:26:07 +05:30
static int clk_rpmh_send_aggregate_command ( struct clk_rpmh * c )
{
struct tcs_cmd cmd = { 0 } ;
u32 cmd_state , on_val ;
enum rpmh_state state = RPMH_SLEEP_STATE ;
int ret ;
2020-02-14 18:12:32 -08:00
bool wait ;
2018-05-09 11:26:07 +05:30
cmd . addr = c - > res_addr ;
cmd_state = c - > aggr_state ;
on_val = c - > res_on_val ;
for ( ; state < = RPMH_ACTIVE_ONLY_STATE ; state + + ) {
if ( has_state_changed ( c , state ) ) {
if ( cmd_state & BIT ( state ) )
cmd . data = on_val ;
2020-02-14 18:12:32 -08:00
wait = cmd_state & & state = = RPMH_ACTIVE_ONLY_STATE ;
ret = clk_rpmh_send ( c , state , & cmd , wait ) ;
2018-05-09 11:26:07 +05:30
if ( ret ) {
dev_err ( c - > dev , " set %s state of %s failed: (%d) \n " ,
! state ? " sleep " :
state = = RPMH_WAKE_ONLY_STATE ?
" wake " : " active " , c - > res_name , ret ) ;
return ret ;
}
}
}
c - > last_sent_aggr_state = c - > aggr_state ;
c - > peer - > last_sent_aggr_state = c - > last_sent_aggr_state ;
return 0 ;
}
/*
* Update state and aggregate state values based on enable value .
*/
static int clk_rpmh_aggregate_state_send_command ( struct clk_rpmh * c ,
bool enable )
{
int ret ;
c - > state = enable ? c - > valid_state_mask : 0 ;
c - > aggr_state = c - > state | c - > peer - > state ;
c - > peer - > aggr_state = c - > aggr_state ;
ret = clk_rpmh_send_aggregate_command ( c ) ;
if ( ! ret )
return 0 ;
if ( ret & & enable )
c - > state = 0 ;
else if ( ret )
c - > state = c - > valid_state_mask ;
WARN ( 1 , " clk: %s failed to %s \n " , c - > res_name ,
enable ? " enable " : " disable " ) ;
return ret ;
}
static int clk_rpmh_prepare ( struct clk_hw * hw )
{
struct clk_rpmh * c = to_clk_rpmh ( hw ) ;
int ret = 0 ;
mutex_lock ( & rpmh_clk_lock ) ;
ret = clk_rpmh_aggregate_state_send_command ( c , true ) ;
mutex_unlock ( & rpmh_clk_lock ) ;
return ret ;
2020-03-09 15:12:32 -07:00
}
2018-05-09 11:26:07 +05:30
static void clk_rpmh_unprepare ( struct clk_hw * hw )
{
struct clk_rpmh * c = to_clk_rpmh ( hw ) ;
mutex_lock ( & rpmh_clk_lock ) ;
clk_rpmh_aggregate_state_send_command ( c , false ) ;
mutex_unlock ( & rpmh_clk_lock ) ;
} ;
static unsigned long clk_rpmh_recalc_rate ( struct clk_hw * hw ,
unsigned long prate )
{
struct clk_rpmh * r = to_clk_rpmh ( hw ) ;
/*
* RPMh clocks have a fixed rate . Return static rate .
*/
return prate / r - > div ;
}
static const struct clk_ops clk_rpmh_ops = {
. prepare = clk_rpmh_prepare ,
. unprepare = clk_rpmh_unprepare ,
. recalc_rate = clk_rpmh_recalc_rate ,
} ;
2019-01-24 16:47:00 -08:00
static int clk_rpmh_bcm_send_cmd ( struct clk_rpmh * c , bool enable )
{
struct tcs_cmd cmd = { 0 } ;
u32 cmd_state ;
2020-03-09 15:12:31 -07:00
int ret = 0 ;
2019-01-24 16:47:00 -08:00
mutex_lock ( & rpmh_clk_lock ) ;
if ( enable ) {
cmd_state = 1 ;
if ( c - > aggr_state )
cmd_state = c - > aggr_state ;
2020-03-09 15:12:31 -07:00
} else {
cmd_state = 0 ;
2019-01-24 16:47:00 -08:00
}
2020-03-09 15:12:31 -07:00
if ( c - > last_sent_aggr_state ! = cmd_state ) {
cmd . addr = c - > res_addr ;
cmd . data = BCM_TCS_CMD ( 1 , enable , 0 , cmd_state ) ;
2019-01-24 16:47:00 -08:00
2022-05-17 12:09:49 -07:00
/*
* Send only an active only state request . RPMh continues to
* use the active state when we ' re in sleep / wake state as long
* as the sleep / wake state has never been set .
*/
2020-03-09 15:12:31 -07:00
ret = clk_rpmh_send ( c , RPMH_ACTIVE_ONLY_STATE , & cmd , enable ) ;
if ( ret ) {
dev_err ( c - > dev , " set active state of %s failed: (%d) \n " ,
c - > res_name , ret ) ;
} else {
c - > last_sent_aggr_state = cmd_state ;
}
2019-01-24 16:47:00 -08:00
}
mutex_unlock ( & rpmh_clk_lock ) ;
2020-03-09 15:12:31 -07:00
return ret ;
2019-01-24 16:47:00 -08:00
}
static int clk_rpmh_bcm_prepare ( struct clk_hw * hw )
{
struct clk_rpmh * c = to_clk_rpmh ( hw ) ;
return clk_rpmh_bcm_send_cmd ( c , true ) ;
2020-03-09 15:12:32 -07:00
}
2019-01-24 16:47:00 -08:00
static void clk_rpmh_bcm_unprepare ( struct clk_hw * hw )
{
struct clk_rpmh * c = to_clk_rpmh ( hw ) ;
clk_rpmh_bcm_send_cmd ( c , false ) ;
2020-03-09 15:12:32 -07:00
}
2019-01-24 16:47:00 -08:00
static int clk_rpmh_bcm_set_rate ( struct clk_hw * hw , unsigned long rate ,
unsigned long parent_rate )
{
struct clk_rpmh * c = to_clk_rpmh ( hw ) ;
c - > aggr_state = rate / c - > unit ;
/*
* Since any non - zero value sent to hw would result in enabling the
* clock , only send the value if the clock has already been prepared .
*/
if ( clk_hw_is_prepared ( hw ) )
clk_rpmh_bcm_send_cmd ( c , true ) ;
return 0 ;
2020-03-09 15:12:32 -07:00
}
2019-01-24 16:47:00 -08:00
static long clk_rpmh_round_rate ( struct clk_hw * hw , unsigned long rate ,
unsigned long * parent_rate )
{
return rate ;
}
static unsigned long clk_rpmh_bcm_recalc_rate ( struct clk_hw * hw ,
unsigned long prate )
{
struct clk_rpmh * c = to_clk_rpmh ( hw ) ;
return c - > aggr_state * c - > unit ;
}
static const struct clk_ops clk_rpmh_bcm_ops = {
. prepare = clk_rpmh_bcm_prepare ,
. unprepare = clk_rpmh_bcm_unprepare ,
. set_rate = clk_rpmh_bcm_set_rate ,
. round_rate = clk_rpmh_round_rate ,
. recalc_rate = clk_rpmh_bcm_recalc_rate ,
} ;
2019-11-07 13:40:18 -08:00
/* Resource name must match resource id present in cmd-db */
2022-12-02 20:58:43 +02:00
DEFINE_CLK_RPMH_ARC ( bi_tcxo , " xo.lvl " , 0x3 , 1 ) ;
DEFINE_CLK_RPMH_ARC ( bi_tcxo , " xo.lvl " , 0x3 , 2 ) ;
DEFINE_CLK_RPMH_ARC ( bi_tcxo , " xo.lvl " , 0x3 , 4 ) ;
DEFINE_CLK_RPMH_ARC ( qlink , " qphy.lvl " , 0x1 , 4 ) ;
2022-12-02 20:58:36 +02:00
2022-12-02 20:58:43 +02:00
DEFINE_CLK_RPMH_VRM ( ln_bb_clk1 , _a2 , " lnbclka1 " , 2 ) ;
DEFINE_CLK_RPMH_VRM ( ln_bb_clk2 , _a2 , " lnbclka2 " , 2 ) ;
DEFINE_CLK_RPMH_VRM ( ln_bb_clk3 , _a2 , " lnbclka3 " , 2 ) ;
2022-12-02 20:58:36 +02:00
2022-12-02 20:58:43 +02:00
DEFINE_CLK_RPMH_VRM ( ln_bb_clk1 , _a4 , " lnbclka1 " , 4 ) ;
DEFINE_CLK_RPMH_VRM ( ln_bb_clk2 , _a4 , " lnbclka2 " , 4 ) ;
2023-09-09 18:04:29 +05:30
DEFINE_CLK_RPMH_VRM ( ln_bb_clk3 , _a4 , " lnbclka3 " , 4 ) ;
2022-12-02 20:58:36 +02:00
2022-12-02 20:58:43 +02:00
DEFINE_CLK_RPMH_VRM ( ln_bb_clk2 , _g4 , " lnbclkg2 " , 4 ) ;
DEFINE_CLK_RPMH_VRM ( ln_bb_clk3 , _g4 , " lnbclkg3 " , 4 ) ;
2022-12-02 20:58:36 +02:00
2022-12-02 20:58:43 +02:00
DEFINE_CLK_RPMH_VRM ( rf_clk1 , _a , " rfclka1 " , 1 ) ;
DEFINE_CLK_RPMH_VRM ( rf_clk2 , _a , " rfclka2 " , 1 ) ;
DEFINE_CLK_RPMH_VRM ( rf_clk3 , _a , " rfclka3 " , 1 ) ;
DEFINE_CLK_RPMH_VRM ( rf_clk4 , _a , " rfclka4 " , 1 ) ;
DEFINE_CLK_RPMH_VRM ( rf_clk5 , _a , " rfclka5 " , 1 ) ;
2022-12-02 20:58:36 +02:00
2022-12-02 20:58:43 +02:00
DEFINE_CLK_RPMH_VRM ( rf_clk1 , _d , " rfclkd1 " , 1 ) ;
DEFINE_CLK_RPMH_VRM ( rf_clk2 , _d , " rfclkd2 " , 1 ) ;
DEFINE_CLK_RPMH_VRM ( rf_clk3 , _d , " rfclkd3 " , 1 ) ;
DEFINE_CLK_RPMH_VRM ( rf_clk4 , _d , " rfclkd4 " , 1 ) ;
2022-12-02 20:58:36 +02:00
2023-01-04 11:34:49 +02:00
DEFINE_CLK_RPMH_VRM ( clk1 , _a1 , " clka1 " , 1 ) ;
DEFINE_CLK_RPMH_VRM ( clk2 , _a1 , " clka2 " , 1 ) ;
DEFINE_CLK_RPMH_VRM ( clk3 , _a1 , " clka3 " , 1 ) ;
DEFINE_CLK_RPMH_VRM ( clk4 , _a1 , " clka4 " , 1 ) ;
DEFINE_CLK_RPMH_VRM ( clk5 , _a1 , " clka5 " , 1 ) ;
2023-12-05 11:40:02 +05:30
DEFINE_CLK_RPMH_VRM ( clk3 , _a2 , " clka3 " , 2 ) ;
2023-11-06 09:26:04 +01:00
DEFINE_CLK_RPMH_VRM ( clk4 , _a2 , " clka4 " , 2 ) ;
DEFINE_CLK_RPMH_VRM ( clk5 , _a2 , " clka5 " , 2 ) ;
2023-01-04 11:34:49 +02:00
DEFINE_CLK_RPMH_VRM ( clk6 , _a2 , " clka6 " , 2 ) ;
DEFINE_CLK_RPMH_VRM ( clk7 , _a2 , " clka7 " , 2 ) ;
DEFINE_CLK_RPMH_VRM ( clk8 , _a2 , " clka8 " , 2 ) ;
2022-12-02 20:58:43 +02:00
DEFINE_CLK_RPMH_VRM ( div_clk1 , _div2 , " divclka1 " , 2 ) ;
2022-12-02 20:58:36 +02:00
2022-12-02 20:58:39 +02:00
DEFINE_CLK_RPMH_BCM ( ce , " CE0 " ) ;
DEFINE_CLK_RPMH_BCM ( hwkm , " HK0 " ) ;
DEFINE_CLK_RPMH_BCM ( ipa , " IP0 " ) ;
DEFINE_CLK_RPMH_BCM ( pka , " PKA0 " ) ;
DEFINE_CLK_RPMH_BCM ( qpic_clk , " QP0 " ) ;
2018-05-09 11:26:07 +05:30
static struct clk_hw * sdm845_rpmh_clocks [ ] = {
2022-12-02 20:58:43 +02:00
[ RPMH_CXO_CLK ] = & clk_rpmh_bi_tcxo_div2 . hw ,
[ RPMH_CXO_CLK_A ] = & clk_rpmh_bi_tcxo_div2_ao . hw ,
[ RPMH_LN_BB_CLK2 ] = & clk_rpmh_ln_bb_clk2_a2 . hw ,
[ RPMH_LN_BB_CLK2_A ] = & clk_rpmh_ln_bb_clk2_a2_ao . hw ,
[ RPMH_LN_BB_CLK3 ] = & clk_rpmh_ln_bb_clk3_a2 . hw ,
[ RPMH_LN_BB_CLK3_A ] = & clk_rpmh_ln_bb_clk3_a2_ao . hw ,
[ RPMH_RF_CLK1 ] = & clk_rpmh_rf_clk1_a . hw ,
[ RPMH_RF_CLK1_A ] = & clk_rpmh_rf_clk1_a_ao . hw ,
[ RPMH_RF_CLK2 ] = & clk_rpmh_rf_clk2_a . hw ,
[ RPMH_RF_CLK2_A ] = & clk_rpmh_rf_clk2_a_ao . hw ,
[ RPMH_RF_CLK3 ] = & clk_rpmh_rf_clk3_a . hw ,
[ RPMH_RF_CLK3_A ] = & clk_rpmh_rf_clk3_a_ao . hw ,
2022-12-02 20:58:39 +02:00
[ RPMH_IPA_CLK ] = & clk_rpmh_ipa . hw ,
[ RPMH_CE_CLK ] = & clk_rpmh_ce . hw ,
2018-05-09 11:26:07 +05:30
} ;
static const struct clk_rpmh_desc clk_rpmh_sdm845 = {
. clks = sdm845_rpmh_clocks ,
. num_clks = ARRAY_SIZE ( sdm845_rpmh_clocks ) ,
} ;
2023-01-09 18:44:58 +01:00
static struct clk_hw * sa8775p_rpmh_clocks [ ] = {
[ RPMH_CXO_CLK ] = & clk_rpmh_bi_tcxo_div2 . hw ,
[ RPMH_CXO_CLK_A ] = & clk_rpmh_bi_tcxo_div2_ao . hw ,
[ RPMH_LN_BB_CLK1 ] = & clk_rpmh_ln_bb_clk1_a2 . hw ,
[ RPMH_LN_BB_CLK2 ] = & clk_rpmh_ln_bb_clk2_a2 . hw ,
[ RPMH_LN_BB_CLK2_A ] = & clk_rpmh_ln_bb_clk2_a4_ao . hw ,
[ RPMH_IPA_CLK ] = & clk_rpmh_ipa . hw ,
[ RPMH_PKA_CLK ] = & clk_rpmh_pka . hw ,
[ RPMH_HWKM_CLK ] = & clk_rpmh_hwkm . hw ,
} ;
static const struct clk_rpmh_desc clk_rpmh_sa8775p = {
. clks = sa8775p_rpmh_clocks ,
. num_clks = ARRAY_SIZE ( sa8775p_rpmh_clocks ) ,
} ;
2022-09-20 18:37:34 -04:00
static struct clk_hw * sdm670_rpmh_clocks [ ] = {
2022-12-02 20:58:43 +02:00
[ RPMH_CXO_CLK ] = & clk_rpmh_bi_tcxo_div2 . hw ,
[ RPMH_CXO_CLK_A ] = & clk_rpmh_bi_tcxo_div2_ao . hw ,
[ RPMH_LN_BB_CLK2 ] = & clk_rpmh_ln_bb_clk2_a2 . hw ,
[ RPMH_LN_BB_CLK2_A ] = & clk_rpmh_ln_bb_clk2_a2_ao . hw ,
[ RPMH_LN_BB_CLK3 ] = & clk_rpmh_ln_bb_clk3_a2 . hw ,
[ RPMH_LN_BB_CLK3_A ] = & clk_rpmh_ln_bb_clk3_a2_ao . hw ,
[ RPMH_RF_CLK1 ] = & clk_rpmh_rf_clk1_a . hw ,
[ RPMH_RF_CLK1_A ] = & clk_rpmh_rf_clk1_a_ao . hw ,
[ RPMH_RF_CLK2 ] = & clk_rpmh_rf_clk2_a . hw ,
[ RPMH_RF_CLK2_A ] = & clk_rpmh_rf_clk2_a_ao . hw ,
2022-12-02 20:58:39 +02:00
[ RPMH_IPA_CLK ] = & clk_rpmh_ipa . hw ,
[ RPMH_CE_CLK ] = & clk_rpmh_ce . hw ,
2022-09-20 18:37:34 -04:00
} ;
static const struct clk_rpmh_desc clk_rpmh_sdm670 = {
. clks = sdm670_rpmh_clocks ,
. num_clks = ARRAY_SIZE ( sdm670_rpmh_clocks ) ,
} ;
2020-12-08 12:16:59 +05:30
static struct clk_hw * sdx55_rpmh_clocks [ ] = {
2022-12-02 20:58:43 +02:00
[ RPMH_CXO_CLK ] = & clk_rpmh_bi_tcxo_div2 . hw ,
[ RPMH_CXO_CLK_A ] = & clk_rpmh_bi_tcxo_div2_ao . hw ,
[ RPMH_RF_CLK1 ] = & clk_rpmh_rf_clk1_d . hw ,
[ RPMH_RF_CLK1_A ] = & clk_rpmh_rf_clk1_d_ao . hw ,
[ RPMH_RF_CLK2 ] = & clk_rpmh_rf_clk2_d . hw ,
[ RPMH_RF_CLK2_A ] = & clk_rpmh_rf_clk2_d_ao . hw ,
2022-12-02 20:58:39 +02:00
[ RPMH_QPIC_CLK ] = & clk_rpmh_qpic_clk . hw ,
[ RPMH_IPA_CLK ] = & clk_rpmh_ipa . hw ,
2020-12-08 12:16:59 +05:30
} ;
static const struct clk_rpmh_desc clk_rpmh_sdx55 = {
. clks = sdx55_rpmh_clocks ,
. num_clks = ARRAY_SIZE ( sdx55_rpmh_clocks ) ,
} ;
2019-08-26 23:01:20 +05:30
static struct clk_hw * sm8150_rpmh_clocks [ ] = {
2022-12-02 20:58:43 +02:00
[ RPMH_CXO_CLK ] = & clk_rpmh_bi_tcxo_div2 . hw ,
[ RPMH_CXO_CLK_A ] = & clk_rpmh_bi_tcxo_div2_ao . hw ,
[ RPMH_LN_BB_CLK2 ] = & clk_rpmh_ln_bb_clk2_a2 . hw ,
[ RPMH_LN_BB_CLK2_A ] = & clk_rpmh_ln_bb_clk2_a2_ao . hw ,
[ RPMH_LN_BB_CLK3 ] = & clk_rpmh_ln_bb_clk3_a2 . hw ,
[ RPMH_LN_BB_CLK3_A ] = & clk_rpmh_ln_bb_clk3_a2_ao . hw ,
[ RPMH_RF_CLK1 ] = & clk_rpmh_rf_clk1_a . hw ,
[ RPMH_RF_CLK1_A ] = & clk_rpmh_rf_clk1_a_ao . hw ,
[ RPMH_RF_CLK2 ] = & clk_rpmh_rf_clk2_a . hw ,
[ RPMH_RF_CLK2_A ] = & clk_rpmh_rf_clk2_a_ao . hw ,
[ RPMH_RF_CLK3 ] = & clk_rpmh_rf_clk3_a . hw ,
[ RPMH_RF_CLK3_A ] = & clk_rpmh_rf_clk3_a_ao . hw ,
2023-01-09 02:29:33 +02:00
[ RPMH_IPA_CLK ] = & clk_rpmh_ipa . hw ,
2019-08-26 23:01:20 +05:30
} ;
static const struct clk_rpmh_desc clk_rpmh_sm8150 = {
. clks = sm8150_rpmh_clocks ,
. num_clks = ARRAY_SIZE ( sm8150_rpmh_clocks ) ,
} ;
2019-10-29 23:18:19 +05:30
static struct clk_hw * sc7180_rpmh_clocks [ ] = {
2022-12-02 20:58:43 +02:00
[ RPMH_CXO_CLK ] = & clk_rpmh_bi_tcxo_div2 . hw ,
[ RPMH_CXO_CLK_A ] = & clk_rpmh_bi_tcxo_div2_ao . hw ,
[ RPMH_LN_BB_CLK2 ] = & clk_rpmh_ln_bb_clk2_a2 . hw ,
[ RPMH_LN_BB_CLK2_A ] = & clk_rpmh_ln_bb_clk2_a2_ao . hw ,
[ RPMH_LN_BB_CLK3 ] = & clk_rpmh_ln_bb_clk3_a2 . hw ,
[ RPMH_LN_BB_CLK3_A ] = & clk_rpmh_ln_bb_clk3_a2_ao . hw ,
[ RPMH_RF_CLK1 ] = & clk_rpmh_rf_clk1_a . hw ,
[ RPMH_RF_CLK1_A ] = & clk_rpmh_rf_clk1_a_ao . hw ,
[ RPMH_RF_CLK2 ] = & clk_rpmh_rf_clk2_a . hw ,
[ RPMH_RF_CLK2_A ] = & clk_rpmh_rf_clk2_a_ao . hw ,
2022-12-02 20:58:39 +02:00
[ RPMH_IPA_CLK ] = & clk_rpmh_ipa . hw ,
2019-10-29 23:18:19 +05:30
} ;
static const struct clk_rpmh_desc clk_rpmh_sc7180 = {
. clks = sc7180_rpmh_clocks ,
. num_clks = ARRAY_SIZE ( sc7180_rpmh_clocks ) ,
} ;
2021-01-20 14:37:41 -08:00
static struct clk_hw * sc8180x_rpmh_clocks [ ] = {
2022-12-02 20:58:43 +02:00
[ RPMH_CXO_CLK ] = & clk_rpmh_bi_tcxo_div2 . hw ,
[ RPMH_CXO_CLK_A ] = & clk_rpmh_bi_tcxo_div2_ao . hw ,
[ RPMH_LN_BB_CLK2 ] = & clk_rpmh_ln_bb_clk2_a2 . hw ,
[ RPMH_LN_BB_CLK2_A ] = & clk_rpmh_ln_bb_clk2_a2_ao . hw ,
[ RPMH_LN_BB_CLK3 ] = & clk_rpmh_ln_bb_clk3_a2 . hw ,
[ RPMH_LN_BB_CLK3_A ] = & clk_rpmh_ln_bb_clk3_a2_ao . hw ,
[ RPMH_RF_CLK1 ] = & clk_rpmh_rf_clk1_d . hw ,
[ RPMH_RF_CLK1_A ] = & clk_rpmh_rf_clk1_d_ao . hw ,
[ RPMH_RF_CLK2 ] = & clk_rpmh_rf_clk2_d . hw ,
[ RPMH_RF_CLK2_A ] = & clk_rpmh_rf_clk2_d_ao . hw ,
[ RPMH_RF_CLK3 ] = & clk_rpmh_rf_clk3_d . hw ,
[ RPMH_RF_CLK3_A ] = & clk_rpmh_rf_clk3_d_ao . hw ,
2023-01-09 02:29:33 +02:00
[ RPMH_IPA_CLK ] = & clk_rpmh_ipa . hw ,
2021-01-20 14:37:41 -08:00
} ;
static const struct clk_rpmh_desc clk_rpmh_sc8180x = {
. clks = sc8180x_rpmh_clocks ,
. num_clks = ARRAY_SIZE ( sc8180x_rpmh_clocks ) ,
} ;
2020-01-24 14:32:22 -08:00
static struct clk_hw * sm8250_rpmh_clocks [ ] = {
2022-12-02 20:58:43 +02:00
[ RPMH_CXO_CLK ] = & clk_rpmh_bi_tcxo_div2 . hw ,
[ RPMH_CXO_CLK_A ] = & clk_rpmh_bi_tcxo_div2_ao . hw ,
[ RPMH_LN_BB_CLK1 ] = & clk_rpmh_ln_bb_clk1_a2 . hw ,
[ RPMH_LN_BB_CLK1_A ] = & clk_rpmh_ln_bb_clk1_a2_ao . hw ,
[ RPMH_LN_BB_CLK2 ] = & clk_rpmh_ln_bb_clk2_a2 . hw ,
[ RPMH_LN_BB_CLK2_A ] = & clk_rpmh_ln_bb_clk2_a2_ao . hw ,
[ RPMH_LN_BB_CLK3 ] = & clk_rpmh_ln_bb_clk3_a2 . hw ,
[ RPMH_LN_BB_CLK3_A ] = & clk_rpmh_ln_bb_clk3_a2_ao . hw ,
[ RPMH_RF_CLK1 ] = & clk_rpmh_rf_clk1_a . hw ,
[ RPMH_RF_CLK1_A ] = & clk_rpmh_rf_clk1_a_ao . hw ,
[ RPMH_RF_CLK3 ] = & clk_rpmh_rf_clk3_a . hw ,
[ RPMH_RF_CLK3_A ] = & clk_rpmh_rf_clk3_a_ao . hw ,
2023-01-09 02:29:33 +02:00
[ RPMH_IPA_CLK ] = & clk_rpmh_ipa . hw ,
2020-01-24 14:32:22 -08:00
} ;
static const struct clk_rpmh_desc clk_rpmh_sm8250 = {
. clks = sm8250_rpmh_clocks ,
. num_clks = ARRAY_SIZE ( sm8250_rpmh_clocks ) ,
} ;
2020-12-08 12:16:59 +05:30
static struct clk_hw * sm8350_rpmh_clocks [ ] = {
2022-12-02 20:58:43 +02:00
[ RPMH_CXO_CLK ] = & clk_rpmh_bi_tcxo_div2 . hw ,
[ RPMH_CXO_CLK_A ] = & clk_rpmh_bi_tcxo_div2_ao . hw ,
[ RPMH_DIV_CLK1 ] = & clk_rpmh_div_clk1_div2 . hw ,
[ RPMH_DIV_CLK1_A ] = & clk_rpmh_div_clk1_div2_ao . hw ,
[ RPMH_LN_BB_CLK1 ] = & clk_rpmh_ln_bb_clk1_a2 . hw ,
[ RPMH_LN_BB_CLK1_A ] = & clk_rpmh_ln_bb_clk1_a2_ao . hw ,
[ RPMH_LN_BB_CLK2 ] = & clk_rpmh_ln_bb_clk2_a2 . hw ,
[ RPMH_LN_BB_CLK2_A ] = & clk_rpmh_ln_bb_clk2_a2_ao . hw ,
[ RPMH_RF_CLK1 ] = & clk_rpmh_rf_clk1_a . hw ,
[ RPMH_RF_CLK1_A ] = & clk_rpmh_rf_clk1_a_ao . hw ,
[ RPMH_RF_CLK3 ] = & clk_rpmh_rf_clk3_a . hw ,
[ RPMH_RF_CLK3_A ] = & clk_rpmh_rf_clk3_a_ao . hw ,
[ RPMH_RF_CLK4 ] = & clk_rpmh_rf_clk4_a . hw ,
[ RPMH_RF_CLK4_A ] = & clk_rpmh_rf_clk4_a_ao . hw ,
[ RPMH_RF_CLK5 ] = & clk_rpmh_rf_clk5_a . hw ,
[ RPMH_RF_CLK5_A ] = & clk_rpmh_rf_clk5_a_ao . hw ,
2022-12-02 20:58:39 +02:00
[ RPMH_IPA_CLK ] = & clk_rpmh_ipa . hw ,
[ RPMH_PKA_CLK ] = & clk_rpmh_pka . hw ,
[ RPMH_HWKM_CLK ] = & clk_rpmh_hwkm . hw ,
2020-11-26 12:58:42 +05:30
} ;
2020-12-08 12:16:59 +05:30
static const struct clk_rpmh_desc clk_rpmh_sm8350 = {
. clks = sm8350_rpmh_clocks ,
. num_clks = ARRAY_SIZE ( sm8350_rpmh_clocks ) ,
2020-11-26 12:58:42 +05:30
} ;
2022-02-22 20:45:16 -08:00
static struct clk_hw * sc8280xp_rpmh_clocks [ ] = {
2022-12-02 20:58:43 +02:00
[ RPMH_CXO_CLK ] = & clk_rpmh_bi_tcxo_div2 . hw ,
[ RPMH_CXO_CLK_A ] = & clk_rpmh_bi_tcxo_div2_ao . hw ,
[ RPMH_LN_BB_CLK3 ] = & clk_rpmh_ln_bb_clk3_a2 . hw ,
[ RPMH_LN_BB_CLK3_A ] = & clk_rpmh_ln_bb_clk3_a2_ao . hw ,
2022-12-02 20:58:39 +02:00
[ RPMH_IPA_CLK ] = & clk_rpmh_ipa . hw ,
[ RPMH_PKA_CLK ] = & clk_rpmh_pka . hw ,
[ RPMH_HWKM_CLK ] = & clk_rpmh_hwkm . hw ,
2022-02-22 20:45:16 -08:00
} ;
static const struct clk_rpmh_desc clk_rpmh_sc8280xp = {
. clks = sc8280xp_rpmh_clocks ,
. num_clks = ARRAY_SIZE ( sc8280xp_rpmh_clocks ) ,
} ;
2021-12-01 12:53:10 +05:30
static struct clk_hw * sm8450_rpmh_clocks [ ] = {
2022-12-02 20:58:43 +02:00
[ RPMH_CXO_CLK ] = & clk_rpmh_bi_tcxo_div4 . hw ,
[ RPMH_CXO_CLK_A ] = & clk_rpmh_bi_tcxo_div4_ao . hw ,
[ RPMH_LN_BB_CLK1 ] = & clk_rpmh_ln_bb_clk1_a4 . hw ,
[ RPMH_LN_BB_CLK1_A ] = & clk_rpmh_ln_bb_clk1_a4_ao . hw ,
[ RPMH_LN_BB_CLK2 ] = & clk_rpmh_ln_bb_clk2_a4 . hw ,
[ RPMH_LN_BB_CLK2_A ] = & clk_rpmh_ln_bb_clk2_a4_ao . hw ,
[ RPMH_RF_CLK1 ] = & clk_rpmh_rf_clk1_a . hw ,
[ RPMH_RF_CLK1_A ] = & clk_rpmh_rf_clk1_a_ao . hw ,
[ RPMH_RF_CLK2 ] = & clk_rpmh_rf_clk2_a . hw ,
[ RPMH_RF_CLK2_A ] = & clk_rpmh_rf_clk2_a_ao . hw ,
[ RPMH_RF_CLK3 ] = & clk_rpmh_rf_clk3_a . hw ,
[ RPMH_RF_CLK3_A ] = & clk_rpmh_rf_clk3_a_ao . hw ,
[ RPMH_RF_CLK4 ] = & clk_rpmh_rf_clk4_a . hw ,
[ RPMH_RF_CLK4_A ] = & clk_rpmh_rf_clk4_a_ao . hw ,
2022-12-02 20:58:39 +02:00
[ RPMH_IPA_CLK ] = & clk_rpmh_ipa . hw ,
2021-12-01 12:53:10 +05:30
} ;
static const struct clk_rpmh_desc clk_rpmh_sm8450 = {
. clks = sm8450_rpmh_clocks ,
. num_clks = ARRAY_SIZE ( sm8450_rpmh_clocks ) ,
} ;
2023-01-04 11:34:49 +02:00
static struct clk_hw * sm8550_rpmh_clocks [ ] = {
[ RPMH_CXO_CLK ] = & clk_rpmh_bi_tcxo_div2 . hw ,
[ RPMH_CXO_CLK_A ] = & clk_rpmh_bi_tcxo_div2_ao . hw ,
[ RPMH_LN_BB_CLK1 ] = & clk_rpmh_clk6_a2 . hw ,
[ RPMH_LN_BB_CLK1_A ] = & clk_rpmh_clk6_a2_ao . hw ,
[ RPMH_LN_BB_CLK2 ] = & clk_rpmh_clk7_a2 . hw ,
[ RPMH_LN_BB_CLK2_A ] = & clk_rpmh_clk7_a2_ao . hw ,
[ RPMH_LN_BB_CLK3 ] = & clk_rpmh_clk8_a2 . hw ,
[ RPMH_LN_BB_CLK3_A ] = & clk_rpmh_clk8_a2_ao . hw ,
[ RPMH_RF_CLK1 ] = & clk_rpmh_clk1_a1 . hw ,
[ RPMH_RF_CLK1_A ] = & clk_rpmh_clk1_a1_ao . hw ,
[ RPMH_RF_CLK2 ] = & clk_rpmh_clk2_a1 . hw ,
[ RPMH_RF_CLK2_A ] = & clk_rpmh_clk2_a1_ao . hw ,
[ RPMH_RF_CLK3 ] = & clk_rpmh_clk3_a1 . hw ,
[ RPMH_RF_CLK3_A ] = & clk_rpmh_clk3_a1_ao . hw ,
[ RPMH_RF_CLK4 ] = & clk_rpmh_clk4_a1 . hw ,
[ RPMH_RF_CLK4_A ] = & clk_rpmh_clk4_a1_ao . hw ,
[ RPMH_IPA_CLK ] = & clk_rpmh_ipa . hw ,
} ;
static const struct clk_rpmh_desc clk_rpmh_sm8550 = {
. clks = sm8550_rpmh_clocks ,
. num_clks = ARRAY_SIZE ( sm8550_rpmh_clocks ) ,
} ;
2023-11-06 09:26:04 +01:00
static struct clk_hw * sm8650_rpmh_clocks [ ] = {
[ RPMH_CXO_CLK ] = & clk_rpmh_bi_tcxo_div2 . hw ,
[ RPMH_CXO_CLK_A ] = & clk_rpmh_bi_tcxo_div2_ao . hw ,
[ RPMH_LN_BB_CLK1 ] = & clk_rpmh_clk6_a2 . hw ,
[ RPMH_LN_BB_CLK1_A ] = & clk_rpmh_clk6_a2_ao . hw ,
[ RPMH_LN_BB_CLK2 ] = & clk_rpmh_clk7_a2 . hw ,
[ RPMH_LN_BB_CLK2_A ] = & clk_rpmh_clk7_a2_ao . hw ,
[ RPMH_LN_BB_CLK3 ] = & clk_rpmh_clk8_a2 . hw ,
[ RPMH_LN_BB_CLK3_A ] = & clk_rpmh_clk8_a2_ao . hw ,
[ RPMH_RF_CLK1 ] = & clk_rpmh_clk1_a1 . hw ,
[ RPMH_RF_CLK1_A ] = & clk_rpmh_clk1_a1_ao . hw ,
[ RPMH_RF_CLK2 ] = & clk_rpmh_clk2_a1 . hw ,
[ RPMH_RF_CLK2_A ] = & clk_rpmh_clk2_a1_ao . hw ,
/*
* The clka3 RPMh resource is missing in cmd - db
* for current platforms , while the clka3 exists
* on the PMK8550 , the clock is unconnected and
* unused .
*/
[ RPMH_RF_CLK4 ] = & clk_rpmh_clk4_a2 . hw ,
[ RPMH_RF_CLK4_A ] = & clk_rpmh_clk4_a2_ao . hw ,
[ RPMH_RF_CLK5 ] = & clk_rpmh_clk5_a2 . hw ,
[ RPMH_RF_CLK5_A ] = & clk_rpmh_clk5_a2_ao . hw ,
[ RPMH_IPA_CLK ] = & clk_rpmh_ipa . hw ,
} ;
static const struct clk_rpmh_desc clk_rpmh_sm8650 = {
. clks = sm8650_rpmh_clocks ,
. num_clks = ARRAY_SIZE ( sm8650_rpmh_clocks ) ,
} ;
2021-02-10 22:43:50 +05:30
static struct clk_hw * sc7280_rpmh_clocks [ ] = {
2022-12-02 20:58:43 +02:00
[ RPMH_CXO_CLK ] = & clk_rpmh_bi_tcxo_div4 . hw ,
[ RPMH_CXO_CLK_A ] = & clk_rpmh_bi_tcxo_div4_ao . hw ,
[ RPMH_LN_BB_CLK2 ] = & clk_rpmh_ln_bb_clk2_a2 . hw ,
[ RPMH_LN_BB_CLK2_A ] = & clk_rpmh_ln_bb_clk2_a2_ao . hw ,
[ RPMH_RF_CLK1 ] = & clk_rpmh_rf_clk1_a . hw ,
[ RPMH_RF_CLK1_A ] = & clk_rpmh_rf_clk1_a_ao . hw ,
[ RPMH_RF_CLK3 ] = & clk_rpmh_rf_clk3_a . hw ,
[ RPMH_RF_CLK3_A ] = & clk_rpmh_rf_clk3_a_ao . hw ,
[ RPMH_RF_CLK4 ] = & clk_rpmh_rf_clk4_a . hw ,
[ RPMH_RF_CLK4_A ] = & clk_rpmh_rf_clk4_a_ao . hw ,
2022-12-02 20:58:39 +02:00
[ RPMH_IPA_CLK ] = & clk_rpmh_ipa . hw ,
[ RPMH_PKA_CLK ] = & clk_rpmh_pka . hw ,
[ RPMH_HWKM_CLK ] = & clk_rpmh_hwkm . hw ,
2021-02-10 22:43:50 +05:30
} ;
static const struct clk_rpmh_desc clk_rpmh_sc7280 = {
. clks = sc7280_rpmh_clocks ,
. num_clks = ARRAY_SIZE ( sc7280_rpmh_clocks ) ,
} ;
2021-08-20 22:32:43 +02:00
static struct clk_hw * sm6350_rpmh_clocks [ ] = {
2022-12-02 20:58:43 +02:00
[ RPMH_CXO_CLK ] = & clk_rpmh_bi_tcxo_div4 . hw ,
[ RPMH_CXO_CLK_A ] = & clk_rpmh_bi_tcxo_div4_ao . hw ,
[ RPMH_LN_BB_CLK2 ] = & clk_rpmh_ln_bb_clk2_g4 . hw ,
[ RPMH_LN_BB_CLK2_A ] = & clk_rpmh_ln_bb_clk2_g4_ao . hw ,
[ RPMH_LN_BB_CLK3 ] = & clk_rpmh_ln_bb_clk3_g4 . hw ,
[ RPMH_LN_BB_CLK3_A ] = & clk_rpmh_ln_bb_clk3_g4_ao . hw ,
[ RPMH_QLINK_CLK ] = & clk_rpmh_qlink_div4 . hw ,
[ RPMH_QLINK_CLK_A ] = & clk_rpmh_qlink_div4_ao . hw ,
2022-12-02 16:12:40 -06:00
[ RPMH_IPA_CLK ] = & clk_rpmh_ipa . hw ,
2021-08-20 22:32:43 +02:00
} ;
static const struct clk_rpmh_desc clk_rpmh_sm6350 = {
. clks = sm6350_rpmh_clocks ,
. num_clks = ARRAY_SIZE ( sm6350_rpmh_clocks ) ,
} ;
2021-12-01 16:21:35 -08:00
static struct clk_hw * sdx65_rpmh_clocks [ ] = {
2022-12-02 20:58:43 +02:00
[ RPMH_CXO_CLK ] = & clk_rpmh_bi_tcxo_div4 . hw ,
[ RPMH_CXO_CLK_A ] = & clk_rpmh_bi_tcxo_div4_ao . hw ,
[ RPMH_LN_BB_CLK1 ] = & clk_rpmh_ln_bb_clk1_a4 . hw ,
[ RPMH_LN_BB_CLK1_A ] = & clk_rpmh_ln_bb_clk1_a4_ao . hw ,
[ RPMH_RF_CLK1 ] = & clk_rpmh_rf_clk1_a . hw ,
[ RPMH_RF_CLK1_A ] = & clk_rpmh_rf_clk1_a_ao . hw ,
[ RPMH_RF_CLK2 ] = & clk_rpmh_rf_clk2_a . hw ,
[ RPMH_RF_CLK2_A ] = & clk_rpmh_rf_clk2_a_ao . hw ,
[ RPMH_RF_CLK3 ] = & clk_rpmh_rf_clk3_a . hw ,
[ RPMH_RF_CLK3_A ] = & clk_rpmh_rf_clk3_a_ao . hw ,
[ RPMH_RF_CLK4 ] = & clk_rpmh_rf_clk4_a . hw ,
[ RPMH_RF_CLK4_A ] = & clk_rpmh_rf_clk4_a_ao . hw ,
2022-12-02 20:58:39 +02:00
[ RPMH_IPA_CLK ] = & clk_rpmh_ipa . hw ,
[ RPMH_QPIC_CLK ] = & clk_rpmh_qpic_clk . hw ,
2021-12-01 16:21:35 -08:00
} ;
static const struct clk_rpmh_desc clk_rpmh_sdx65 = {
. clks = sdx65_rpmh_clocks ,
. num_clks = ARRAY_SIZE ( sdx65_rpmh_clocks ) ,
} ;
2022-10-26 12:04:40 -07:00
static struct clk_hw * qdu1000_rpmh_clocks [ ] = {
2022-12-02 20:58:43 +02:00
[ RPMH_CXO_CLK ] = & clk_rpmh_bi_tcxo_div1 . hw ,
[ RPMH_CXO_CLK_A ] = & clk_rpmh_bi_tcxo_div1_ao . hw ,
2022-10-26 12:04:40 -07:00
} ;
static const struct clk_rpmh_desc clk_rpmh_qdu1000 = {
. clks = qdu1000_rpmh_clocks ,
. num_clks = ARRAY_SIZE ( qdu1000_rpmh_clocks ) ,
} ;
2023-05-12 17:53:46 +05:30
static struct clk_hw * sdx75_rpmh_clocks [ ] = {
[ RPMH_CXO_CLK ] = & clk_rpmh_bi_tcxo_div4 . hw ,
[ RPMH_CXO_CLK_A ] = & clk_rpmh_bi_tcxo_div4_ao . hw ,
[ RPMH_RF_CLK1 ] = & clk_rpmh_rf_clk1_a . hw ,
[ RPMH_RF_CLK1_A ] = & clk_rpmh_rf_clk1_a_ao . hw ,
[ RPMH_RF_CLK2 ] = & clk_rpmh_rf_clk2_a . hw ,
[ RPMH_RF_CLK2_A ] = & clk_rpmh_rf_clk2_a_ao . hw ,
[ RPMH_RF_CLK3 ] = & clk_rpmh_rf_clk3_a . hw ,
[ RPMH_RF_CLK3_A ] = & clk_rpmh_rf_clk3_a_ao . hw ,
[ RPMH_QPIC_CLK ] = & clk_rpmh_qpic_clk . hw ,
[ RPMH_IPA_CLK ] = & clk_rpmh_ipa . hw ,
} ;
static const struct clk_rpmh_desc clk_rpmh_sdx75 = {
. clks = sdx75_rpmh_clocks ,
. num_clks = ARRAY_SIZE ( sdx75_rpmh_clocks ) ,
} ;
2023-09-09 18:04:29 +05:30
static struct clk_hw * sm4450_rpmh_clocks [ ] = {
[ RPMH_CXO_CLK ] = & clk_rpmh_bi_tcxo_div4 . hw ,
[ RPMH_CXO_CLK_A ] = & clk_rpmh_bi_tcxo_div4_ao . hw ,
[ RPMH_LN_BB_CLK2 ] = & clk_rpmh_ln_bb_clk2_a4 . hw ,
[ RPMH_LN_BB_CLK2_A ] = & clk_rpmh_ln_bb_clk2_a4_ao . hw ,
[ RPMH_LN_BB_CLK3 ] = & clk_rpmh_ln_bb_clk3_a4 . hw ,
[ RPMH_LN_BB_CLK3_A ] = & clk_rpmh_ln_bb_clk3_a4_ao . hw ,
[ RPMH_RF_CLK1 ] = & clk_rpmh_rf_clk1_a . hw ,
[ RPMH_RF_CLK1_A ] = & clk_rpmh_rf_clk1_a_ao . hw ,
[ RPMH_RF_CLK5 ] = & clk_rpmh_rf_clk5_a . hw ,
[ RPMH_RF_CLK5_A ] = & clk_rpmh_rf_clk5_a_ao . hw ,
[ RPMH_IPA_CLK ] = & clk_rpmh_ipa . hw ,
} ;
static const struct clk_rpmh_desc clk_rpmh_sm4450 = {
. clks = sm4450_rpmh_clocks ,
. num_clks = ARRAY_SIZE ( sm4450_rpmh_clocks ) ,
} ;
2023-12-05 11:40:02 +05:30
static struct clk_hw * x1e80100_rpmh_clocks [ ] = {
[ RPMH_CXO_CLK ] = & clk_rpmh_bi_tcxo_div2 . hw ,
[ RPMH_CXO_CLK_A ] = & clk_rpmh_bi_tcxo_div2_ao . hw ,
[ RPMH_LN_BB_CLK1 ] = & clk_rpmh_clk6_a2 . hw ,
[ RPMH_LN_BB_CLK1_A ] = & clk_rpmh_clk6_a2_ao . hw ,
[ RPMH_LN_BB_CLK2 ] = & clk_rpmh_clk7_a2 . hw ,
[ RPMH_LN_BB_CLK2_A ] = & clk_rpmh_clk7_a2_ao . hw ,
[ RPMH_LN_BB_CLK3 ] = & clk_rpmh_clk8_a2 . hw ,
[ RPMH_LN_BB_CLK3_A ] = & clk_rpmh_clk8_a2_ao . hw ,
[ RPMH_RF_CLK3 ] = & clk_rpmh_clk3_a2 . hw ,
[ RPMH_RF_CLK3_A ] = & clk_rpmh_clk3_a2_ao . hw ,
[ RPMH_RF_CLK4 ] = & clk_rpmh_clk4_a2 . hw ,
[ RPMH_RF_CLK4_A ] = & clk_rpmh_clk4_a2_ao . hw ,
[ RPMH_RF_CLK5 ] = & clk_rpmh_clk5_a2 . hw ,
[ RPMH_RF_CLK5_A ] = & clk_rpmh_clk5_a2_ao . hw ,
} ;
static const struct clk_rpmh_desc clk_rpmh_x1e80100 = {
. clks = x1e80100_rpmh_clocks ,
. num_clks = ARRAY_SIZE ( x1e80100_rpmh_clocks ) ,
} ;
2018-05-09 11:26:07 +05:30
static struct clk_hw * of_clk_rpmh_hw_get ( struct of_phandle_args * clkspec ,
void * data )
{
struct clk_rpmh_desc * rpmh = data ;
unsigned int idx = clkspec - > args [ 0 ] ;
if ( idx > = rpmh - > num_clks ) {
pr_err ( " %s: invalid index %u \n " , __func__ , idx ) ;
return ERR_PTR ( - EINVAL ) ;
}
return rpmh - > clks [ idx ] ;
}
static int clk_rpmh_probe ( struct platform_device * pdev )
{
struct clk_hw * * hw_clks ;
struct clk_rpmh * rpmh_clk ;
const struct clk_rpmh_desc * desc ;
int ret , i ;
desc = of_device_get_match_data ( & pdev - > dev ) ;
if ( ! desc )
return - ENODEV ;
hw_clks = desc - > clks ;
for ( i = 0 ; i < desc - > num_clks ; i + + ) {
2020-01-06 15:48:42 +05:30
const char * name ;
2018-05-09 11:26:07 +05:30
u32 res_addr ;
2019-01-24 16:47:00 -08:00
size_t aux_data_len ;
const struct bcm_db * data ;
2018-05-09 11:26:07 +05:30
2020-01-06 15:48:42 +05:30
if ( ! hw_clks [ i ] )
continue ;
name = hw_clks [ i ] - > init - > name ;
2018-05-09 11:26:07 +05:30
rpmh_clk = to_clk_rpmh ( hw_clks [ i ] ) ;
res_addr = cmd_db_read_addr ( rpmh_clk - > res_name ) ;
if ( ! res_addr ) {
dev_err ( & pdev - > dev , " missing RPMh resource address for %s \n " ,
rpmh_clk - > res_name ) ;
return - ENODEV ;
}
2019-01-24 16:47:00 -08:00
data = cmd_db_read_aux_data ( rpmh_clk - > res_name , & aux_data_len ) ;
if ( IS_ERR ( data ) ) {
ret = PTR_ERR ( data ) ;
dev_err ( & pdev - > dev ,
" error reading RPMh aux data for %s (%d) \n " ,
rpmh_clk - > res_name , ret ) ;
return ret ;
}
/* Convert unit from Khz to Hz */
if ( aux_data_len = = sizeof ( * data ) )
rpmh_clk - > unit = le32_to_cpu ( data - > unit ) * 1000ULL ;
2018-05-09 11:26:07 +05:30
rpmh_clk - > res_addr + = res_addr ;
rpmh_clk - > dev = & pdev - > dev ;
ret = devm_clk_hw_register ( & pdev - > dev , hw_clks [ i ] ) ;
if ( ret ) {
2019-07-31 12:35:12 -07:00
dev_err ( & pdev - > dev , " failed to register %s \n " , name ) ;
2018-05-09 11:26:07 +05:30
return ret ;
}
}
/* typecast to silence compiler warning */
ret = devm_of_clk_add_hw_provider ( & pdev - > dev , of_clk_rpmh_hw_get ,
( void * ) desc ) ;
if ( ret ) {
dev_err ( & pdev - > dev , " Failed to add clock provider \n " ) ;
return ret ;
}
dev_dbg ( & pdev - > dev , " Registered RPMh clocks \n " ) ;
return 0 ;
}
static const struct of_device_id clk_rpmh_match_table [ ] = {
2022-10-26 12:04:40 -07:00
{ . compatible = " qcom,qdu1000-rpmh-clk " , . data = & clk_rpmh_qdu1000 } ,
2023-01-09 18:44:58 +01:00
{ . compatible = " qcom,sa8775p-rpmh-clk " , . data = & clk_rpmh_sa8775p } ,
2020-01-24 09:59:34 -08:00
{ . compatible = " qcom,sc7180-rpmh-clk " , . data = & clk_rpmh_sc7180 } ,
2021-01-20 14:37:41 -08:00
{ . compatible = " qcom,sc8180x-rpmh-clk " , . data = & clk_rpmh_sc8180x } ,
2022-02-22 20:45:16 -08:00
{ . compatible = " qcom,sc8280xp-rpmh-clk " , . data = & clk_rpmh_sc8280xp } ,
2018-05-09 11:26:07 +05:30
{ . compatible = " qcom,sdm845-rpmh-clk " , . data = & clk_rpmh_sdm845 } ,
2022-09-20 18:37:34 -04:00
{ . compatible = " qcom,sdm670-rpmh-clk " , . data = & clk_rpmh_sdm670 } ,
2020-11-26 12:58:42 +05:30
{ . compatible = " qcom,sdx55-rpmh-clk " , . data = & clk_rpmh_sdx55 } ,
2021-12-01 16:21:35 -08:00
{ . compatible = " qcom,sdx65-rpmh-clk " , . data = & clk_rpmh_sdx65 } ,
2023-05-12 17:53:46 +05:30
{ . compatible = " qcom,sdx75-rpmh-clk " , . data = & clk_rpmh_sdx75 } ,
2023-09-09 18:04:29 +05:30
{ . compatible = " qcom,sm4450-rpmh-clk " , . data = & clk_rpmh_sm4450 } ,
2021-08-20 22:32:43 +02:00
{ . compatible = " qcom,sm6350-rpmh-clk " , . data = & clk_rpmh_sm6350 } ,
2019-08-26 23:01:20 +05:30
{ . compatible = " qcom,sm8150-rpmh-clk " , . data = & clk_rpmh_sm8150 } ,
2020-01-24 14:32:22 -08:00
{ . compatible = " qcom,sm8250-rpmh-clk " , . data = & clk_rpmh_sm8250 } ,
2020-12-08 12:16:59 +05:30
{ . compatible = " qcom,sm8350-rpmh-clk " , . data = & clk_rpmh_sm8350 } ,
2021-12-01 12:53:10 +05:30
{ . compatible = " qcom,sm8450-rpmh-clk " , . data = & clk_rpmh_sm8450 } ,
2023-01-04 11:34:49 +02:00
{ . compatible = " qcom,sm8550-rpmh-clk " , . data = & clk_rpmh_sm8550 } ,
2023-11-06 09:26:04 +01:00
{ . compatible = " qcom,sm8650-rpmh-clk " , . data = & clk_rpmh_sm8650 } ,
2021-02-10 22:43:50 +05:30
{ . compatible = " qcom,sc7280-rpmh-clk " , . data = & clk_rpmh_sc7280 } ,
2023-12-05 11:40:02 +05:30
{ . compatible = " qcom,x1e80100-rpmh-clk " , . data = & clk_rpmh_x1e80100 } ,
2018-05-09 11:26:07 +05:30
{ }
} ;
MODULE_DEVICE_TABLE ( of , clk_rpmh_match_table ) ;
static struct platform_driver clk_rpmh_driver = {
. probe = clk_rpmh_probe ,
. driver = {
. name = " clk-rpmh " ,
. of_match_table = clk_rpmh_match_table ,
} ,
} ;
static int __init clk_rpmh_init ( void )
{
return platform_driver_register ( & clk_rpmh_driver ) ;
}
2019-10-21 17:45:14 +05:30
core_initcall ( clk_rpmh_init ) ;
2018-05-09 11:26:07 +05:30
static void __exit clk_rpmh_exit ( void )
{
platform_driver_unregister ( & clk_rpmh_driver ) ;
}
module_exit ( clk_rpmh_exit ) ;
MODULE_DESCRIPTION ( " QCOM RPMh Clock Driver " ) ;
MODULE_LICENSE ( " GPL v2 " ) ;