2018-07-16 08:54:32 +03:00
/* SPDX-License-Identifier: GPL-2.0 */
/* Copyright (c) 2015, 2018, The Linux Foundation. All rights reserved. */
2015-12-01 04:31:39 +03:00
# ifndef __QCOM_CLK_ALPHA_PLL_H__
# define __QCOM_CLK_ALPHA_PLL_H__
# include <linux/clk-provider.h>
# include "clk-regmap.h"
2017-09-28 20:50:40 +03:00
/* Alpha PLL types */
enum {
CLK_ALPHA_PLL_TYPE_DEFAULT ,
2017-09-28 20:50:46 +03:00
CLK_ALPHA_PLL_TYPE_HUAYRA ,
2017-09-28 20:50:48 +03:00
CLK_ALPHA_PLL_TYPE_BRAMMO ,
2018-03-08 10:18:14 +03:00
CLK_ALPHA_PLL_TYPE_FABIA ,
2019-07-22 10:43:46 +03:00
CLK_ALPHA_PLL_TYPE_TRION ,
2020-07-09 16:52:34 +03:00
CLK_ALPHA_PLL_TYPE_LUCID = CLK_ALPHA_PLL_TYPE_TRION ,
2020-10-16 21:43:33 +03:00
CLK_ALPHA_PLL_TYPE_AGERA ,
2021-06-09 05:20:46 +03:00
CLK_ALPHA_PLL_TYPE_ZONDA ,
2021-12-07 10:32:50 +03:00
CLK_ALPHA_PLL_TYPE_LUCID_EVO ,
2022-11-30 14:28:47 +03:00
CLK_ALPHA_PLL_TYPE_LUCID_OLE ,
2022-07-01 09:27:39 +03:00
CLK_ALPHA_PLL_TYPE_RIVIAN_EVO ,
2022-08-30 10:56:20 +03:00
CLK_ALPHA_PLL_TYPE_DEFAULT_EVO ,
CLK_ALPHA_PLL_TYPE_BRAMMO_EVO ,
2017-09-28 20:50:40 +03:00
CLK_ALPHA_PLL_TYPE_MAX ,
} ;
enum {
PLL_OFF_L_VAL ,
2019-07-22 10:43:46 +03:00
PLL_OFF_CAL_L_VAL ,
2017-09-28 20:50:40 +03:00
PLL_OFF_ALPHA_VAL ,
PLL_OFF_ALPHA_VAL_U ,
PLL_OFF_USER_CTL ,
PLL_OFF_USER_CTL_U ,
2019-07-22 10:43:46 +03:00
PLL_OFF_USER_CTL_U1 ,
2017-09-28 20:50:40 +03:00
PLL_OFF_CONFIG_CTL ,
PLL_OFF_CONFIG_CTL_U ,
2019-07-22 10:43:46 +03:00
PLL_OFF_CONFIG_CTL_U1 ,
2017-09-28 20:50:40 +03:00
PLL_OFF_TEST_CTL ,
PLL_OFF_TEST_CTL_U ,
2020-02-24 07:50:01 +03:00
PLL_OFF_TEST_CTL_U1 ,
2022-11-30 14:28:47 +03:00
PLL_OFF_TEST_CTL_U2 ,
PLL_OFF_STATE ,
2017-09-28 20:50:40 +03:00
PLL_OFF_STATUS ,
2018-03-08 10:18:14 +03:00
PLL_OFF_OPMODE ,
PLL_OFF_FRAC ,
2019-07-22 10:43:46 +03:00
PLL_OFF_CAL_VAL ,
2017-09-28 20:50:40 +03:00
PLL_OFF_MAX_REGS
} ;
extern const u8 clk_alpha_pll_regs [ CLK_ALPHA_PLL_TYPE_MAX ] [ PLL_OFF_MAX_REGS ] ;
2015-12-01 04:31:39 +03:00
struct pll_vco {
unsigned long min_freq ;
unsigned long max_freq ;
u32 val ;
} ;
2020-07-03 11:49:42 +03:00
# define VCO(a, b, c) { \
. val = a , \
. min_freq = b , \
. max_freq = c , \
}
2015-12-01 04:31:39 +03:00
/**
* struct clk_alpha_pll - phase locked loop ( PLL )
* @ offset : base address of registers
* @ vco_table : array of VCO settings
2017-09-28 20:50:40 +03:00
* @ regs : alpha pll register map ( see @ clk_alpha_pll_regs )
2015-12-01 04:31:39 +03:00
* @ clkr : regmap clock handle
*/
struct clk_alpha_pll {
u32 offset ;
2017-09-28 20:50:40 +03:00
const u8 * regs ;
2015-12-01 04:31:39 +03:00
const struct pll_vco * vco_table ;
size_t num_vco ;
2022-09-21 03:13:01 +03:00
# define SUPPORTS_OFFLINE_REQ BIT(0)
# define SUPPORTS_FSM_MODE BIT(2)
2017-09-28 20:50:45 +03:00
# define SUPPORTS_DYNAMIC_UPDATE BIT(3)
2022-09-21 03:13:01 +03:00
# define SUPPORTS_FSM_LEGACY_MODE BIT(4)
2016-09-29 11:35:42 +03:00
u8 flags ;
2015-12-01 04:31:39 +03:00
struct clk_regmap clkr ;
} ;
/**
* struct clk_alpha_pll_postdiv - phase locked loop ( PLL ) post - divider
* @ offset : base address of registers
2017-09-28 20:50:40 +03:00
* @ regs : alpha pll register map ( see @ clk_alpha_pll_regs )
2015-12-01 04:31:39 +03:00
* @ width : width of post - divider
2018-03-08 10:18:14 +03:00
* @ post_div_shift : shift to differentiate between odd & even post - divider
* @ post_div_table : table with PLL odd and even post - divider settings
* @ num_post_div : Number of PLL post - divider settings
*
2015-12-01 04:31:39 +03:00
* @ clkr : regmap clock handle
*/
struct clk_alpha_pll_postdiv {
u32 offset ;
u8 width ;
2017-09-28 20:50:40 +03:00
const u8 * regs ;
2015-12-01 04:31:39 +03:00
struct clk_regmap clkr ;
2018-03-08 10:18:14 +03:00
int post_div_shift ;
const struct clk_div_table * post_div_table ;
size_t num_post_div ;
2015-12-01 04:31:39 +03:00
} ;
2016-09-29 11:35:43 +03:00
struct alpha_pll_config {
u32 l ;
u32 alpha ;
2017-09-28 20:50:44 +03:00
u32 alpha_hi ;
2016-09-29 11:35:43 +03:00
u32 config_ctl_val ;
u32 config_ctl_hi_val ;
2020-02-24 07:50:01 +03:00
u32 config_ctl_hi1_val ;
2019-11-15 13:04:58 +03:00
u32 user_ctl_val ;
u32 user_ctl_hi_val ;
2020-02-24 07:50:01 +03:00
u32 user_ctl_hi1_val ;
2019-11-15 13:04:58 +03:00
u32 test_ctl_val ;
u32 test_ctl_hi_val ;
2020-02-24 07:50:01 +03:00
u32 test_ctl_hi1_val ;
2016-09-29 11:35:43 +03:00
u32 main_output_mask ;
u32 aux_output_mask ;
u32 aux2_output_mask ;
u32 early_output_mask ;
2017-09-28 20:50:44 +03:00
u32 alpha_en_mask ;
u32 alpha_mode_mask ;
2016-09-29 11:35:43 +03:00
u32 pre_div_val ;
u32 pre_div_mask ;
u32 post_div_val ;
u32 post_div_mask ;
u32 vco_val ;
u32 vco_mask ;
} ;
2015-12-01 04:31:39 +03:00
extern const struct clk_ops clk_alpha_pll_ops ;
2019-11-25 16:59:04 +03:00
extern const struct clk_ops clk_alpha_pll_fixed_ops ;
2016-09-29 11:35:42 +03:00
extern const struct clk_ops clk_alpha_pll_hwfsm_ops ;
2015-12-01 04:31:39 +03:00
extern const struct clk_ops clk_alpha_pll_postdiv_ops ;
2017-09-28 20:50:46 +03:00
extern const struct clk_ops clk_alpha_pll_huayra_ops ;
2017-09-28 20:50:50 +03:00
extern const struct clk_ops clk_alpha_pll_postdiv_ro_ops ;
2015-12-01 04:31:39 +03:00
2018-03-08 10:18:14 +03:00
extern const struct clk_ops clk_alpha_pll_fabia_ops ;
extern const struct clk_ops clk_alpha_pll_fixed_fabia_ops ;
extern const struct clk_ops clk_alpha_pll_postdiv_fabia_ops ;
2020-07-09 16:52:34 +03:00
extern const struct clk_ops clk_alpha_pll_trion_ops ;
extern const struct clk_ops clk_alpha_pll_fixed_trion_ops ;
extern const struct clk_ops clk_alpha_pll_postdiv_trion_ops ;
2020-07-09 16:52:35 +03:00
extern const struct clk_ops clk_alpha_pll_lucid_ops ;
2020-07-09 16:52:34 +03:00
# define clk_alpha_pll_fixed_lucid_ops clk_alpha_pll_fixed_trion_ops
2020-02-24 07:50:01 +03:00
extern const struct clk_ops clk_alpha_pll_postdiv_lucid_ops ;
2020-10-16 21:43:33 +03:00
extern const struct clk_ops clk_alpha_pll_agera_ops ;
2020-02-24 07:50:01 +03:00
2021-01-27 10:08:09 +03:00
extern const struct clk_ops clk_alpha_pll_lucid_5lpe_ops ;
extern const struct clk_ops clk_alpha_pll_fixed_lucid_5lpe_ops ;
extern const struct clk_ops clk_alpha_pll_postdiv_lucid_5lpe_ops ;
2021-06-09 05:20:46 +03:00
extern const struct clk_ops clk_alpha_pll_zonda_ops ;
# define clk_alpha_pll_postdiv_zonda_ops clk_alpha_pll_postdiv_fabia_ops
2022-07-01 09:27:29 +03:00
extern const struct clk_ops clk_alpha_pll_lucid_evo_ops ;
2022-09-09 01:28:48 +03:00
extern const struct clk_ops clk_alpha_pll_reset_lucid_evo_ops ;
2023-01-09 18:47:22 +03:00
# define clk_alpha_pll_reset_lucid_ole_ops clk_alpha_pll_reset_lucid_evo_ops
2021-12-07 10:32:50 +03:00
extern const struct clk_ops clk_alpha_pll_fixed_lucid_evo_ops ;
2022-11-30 14:28:47 +03:00
# define clk_alpha_pll_fixed_lucid_ole_ops clk_alpha_pll_fixed_lucid_evo_ops
2021-12-07 10:32:50 +03:00
extern const struct clk_ops clk_alpha_pll_postdiv_lucid_evo_ops ;
2022-11-30 14:28:47 +03:00
# define clk_alpha_pll_postdiv_lucid_ole_ops clk_alpha_pll_postdiv_lucid_evo_ops
2021-06-09 05:20:46 +03:00
2022-07-01 09:27:39 +03:00
extern const struct clk_ops clk_alpha_pll_rivian_evo_ops ;
# define clk_alpha_pll_postdiv_rivian_evo_ops clk_alpha_pll_postdiv_fabia_ops
2016-09-29 11:35:43 +03:00
void clk_alpha_pll_configure ( struct clk_alpha_pll * pll , struct regmap * regmap ,
const struct alpha_pll_config * config ) ;
2018-03-08 10:18:14 +03:00
void clk_fabia_pll_configure ( struct clk_alpha_pll * pll , struct regmap * regmap ,
const struct alpha_pll_config * config ) ;
2020-07-09 16:52:34 +03:00
void clk_trion_pll_configure ( struct clk_alpha_pll * pll , struct regmap * regmap ,
2020-02-24 07:50:01 +03:00
const struct alpha_pll_config * config ) ;
2020-10-16 21:43:33 +03:00
void clk_agera_pll_configure ( struct clk_alpha_pll * pll , struct regmap * regmap ,
const struct alpha_pll_config * config ) ;
2020-07-09 16:52:34 +03:00
# define clk_lucid_pll_configure(pll, regmap, config) \
clk_trion_pll_configure ( pll , regmap , config )
2021-06-09 05:20:46 +03:00
void clk_zonda_pll_configure ( struct clk_alpha_pll * pll , struct regmap * regmap ,
const struct alpha_pll_config * config ) ;
2022-07-01 09:27:29 +03:00
void clk_lucid_evo_pll_configure ( struct clk_alpha_pll * pll , struct regmap * regmap ,
const struct alpha_pll_config * config ) ;
2022-07-01 09:27:39 +03:00
void clk_rivian_evo_pll_configure ( struct clk_alpha_pll * pll , struct regmap * regmap ,
const struct alpha_pll_config * config ) ;
2016-09-29 11:35:43 +03:00
2015-12-01 04:31:39 +03:00
# endif