1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* 3 * Copyright (c) 2015, 2018, 2021 The Linux Foundation. All rights reserved. 4 * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved. 5 */ 6 7 8 #ifndef __QCOM_CLK_ALPHA_PLL_H__ 9 #define __QCOM_CLK_ALPHA_PLL_H__ 10 11 #include <linux/clk-provider.h> 12 #include "clk-regmap.h" 13 14 /* Alpha PLL types */ 15 enum { 16 CLK_ALPHA_PLL_TYPE_DEFAULT, 17 CLK_ALPHA_PLL_TYPE_HUAYRA, 18 CLK_ALPHA_PLL_TYPE_HUAYRA_APSS, 19 CLK_ALPHA_PLL_TYPE_HUAYRA_2290, 20 CLK_ALPHA_PLL_TYPE_BRAMMO, 21 CLK_ALPHA_PLL_TYPE_FABIA, 22 CLK_ALPHA_PLL_TYPE_TRION, 23 CLK_ALPHA_PLL_TYPE_LUCID = CLK_ALPHA_PLL_TYPE_TRION, 24 CLK_ALPHA_PLL_TYPE_AGERA, 25 CLK_ALPHA_PLL_TYPE_ZONDA, 26 CLK_ALPHA_PLL_TYPE_ZONDA_OLE, 27 CLK_ALPHA_PLL_TYPE_LUCID_EVO, 28 CLK_ALPHA_PLL_TYPE_LUCID_OLE, 29 CLK_ALPHA_PLL_TYPE_RIVIAN_EVO, 30 CLK_ALPHA_PLL_TYPE_DEFAULT_EVO, 31 CLK_ALPHA_PLL_TYPE_BRAMMO_EVO, 32 CLK_ALPHA_PLL_TYPE_STROMER, 33 CLK_ALPHA_PLL_TYPE_STROMER_PLUS, 34 CLK_ALPHA_PLL_TYPE_MAX, 35 }; 36 37 enum { 38 PLL_OFF_L_VAL, 39 PLL_OFF_CAL_L_VAL, 40 PLL_OFF_ALPHA_VAL, 41 PLL_OFF_ALPHA_VAL_U, 42 PLL_OFF_USER_CTL, 43 PLL_OFF_USER_CTL_U, 44 PLL_OFF_USER_CTL_U1, 45 PLL_OFF_CONFIG_CTL, 46 PLL_OFF_CONFIG_CTL_U, 47 PLL_OFF_CONFIG_CTL_U1, 48 PLL_OFF_CONFIG_CTL_U2, 49 PLL_OFF_TEST_CTL, 50 PLL_OFF_TEST_CTL_U, 51 PLL_OFF_TEST_CTL_U1, 52 PLL_OFF_TEST_CTL_U2, 53 PLL_OFF_STATE, 54 PLL_OFF_STATUS, 55 PLL_OFF_OPMODE, 56 PLL_OFF_FRAC, 57 PLL_OFF_CAL_VAL, 58 PLL_OFF_MAX_REGS 59 }; 60 61 extern const u8 clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_MAX][PLL_OFF_MAX_REGS]; 62 63 struct pll_vco { 64 unsigned long min_freq; 65 unsigned long max_freq; 66 u32 val; 67 }; 68 69 #define VCO(a, b, c) { \ 70 .val = a,\ 71 .min_freq = b,\ 72 .max_freq = c,\ 73 } 74 75 /** 76 * struct clk_alpha_pll - phase locked loop (PLL) 77 * @offset: base address of registers 78 * @regs: alpha pll register map (see @clk_alpha_pll_regs) 79 * @vco_table: array of VCO settings 80 * @num_vco: number of VCO settings in @vco_table 81 * @flags: bitmask to indicate features supported by the hardware 82 * @clkr: regmap clock handle 83 */ 84 struct clk_alpha_pll { 85 u32 offset; 86 const u8 *regs; 87 88 const struct pll_vco *vco_table; 89 size_t num_vco; 90 #define SUPPORTS_OFFLINE_REQ BIT(0) 91 #define SUPPORTS_FSM_MODE BIT(2) 92 #define SUPPORTS_DYNAMIC_UPDATE BIT(3) 93 #define SUPPORTS_FSM_LEGACY_MODE BIT(4) 94 u8 flags; 95 96 struct clk_regmap clkr; 97 }; 98 99 /** 100 * struct clk_alpha_pll_postdiv - phase locked loop (PLL) post-divider 101 * @offset: base address of registers 102 * @regs: alpha pll register map (see @clk_alpha_pll_regs) 103 * @width: width of post-divider 104 * @post_div_shift: shift to differentiate between odd & even post-divider 105 * @post_div_table: table with PLL odd and even post-divider settings 106 * @num_post_div: Number of PLL post-divider settings 107 * 108 * @clkr: regmap clock handle 109 */ 110 struct clk_alpha_pll_postdiv { 111 u32 offset; 112 u8 width; 113 const u8 *regs; 114 115 struct clk_regmap clkr; 116 int post_div_shift; 117 const struct clk_div_table *post_div_table; 118 size_t num_post_div; 119 }; 120 121 struct alpha_pll_config { 122 u32 l; 123 u32 alpha; 124 u32 alpha_hi; 125 u32 config_ctl_val; 126 u32 config_ctl_hi_val; 127 u32 config_ctl_hi1_val; 128 u32 config_ctl_hi2_val; 129 u32 user_ctl_val; 130 u32 user_ctl_hi_val; 131 u32 user_ctl_hi1_val; 132 u32 test_ctl_val; 133 u32 test_ctl_mask; 134 u32 test_ctl_hi_val; 135 u32 test_ctl_hi_mask; 136 u32 test_ctl_hi1_val; 137 u32 test_ctl_hi2_val; 138 u32 main_output_mask; 139 u32 aux_output_mask; 140 u32 aux2_output_mask; 141 u32 early_output_mask; 142 u32 alpha_en_mask; 143 u32 alpha_mode_mask; 144 u32 pre_div_val; 145 u32 pre_div_mask; 146 u32 post_div_val; 147 u32 post_div_mask; 148 u32 vco_val; 149 u32 vco_mask; 150 u32 status_val; 151 u32 status_mask; 152 u32 lock_det; 153 }; 154 155 extern const struct clk_ops clk_alpha_pll_ops; 156 extern const struct clk_ops clk_alpha_pll_fixed_ops; 157 extern const struct clk_ops clk_alpha_pll_hwfsm_ops; 158 extern const struct clk_ops clk_alpha_pll_postdiv_ops; 159 extern const struct clk_ops clk_alpha_pll_huayra_ops; 160 extern const struct clk_ops clk_alpha_pll_postdiv_ro_ops; 161 extern const struct clk_ops clk_alpha_pll_stromer_ops; 162 extern const struct clk_ops clk_alpha_pll_stromer_plus_ops; 163 164 extern const struct clk_ops clk_alpha_pll_fabia_ops; 165 extern const struct clk_ops clk_alpha_pll_fixed_fabia_ops; 166 extern const struct clk_ops clk_alpha_pll_postdiv_fabia_ops; 167 168 extern const struct clk_ops clk_alpha_pll_trion_ops; 169 extern const struct clk_ops clk_alpha_pll_fixed_trion_ops; 170 extern const struct clk_ops clk_alpha_pll_postdiv_trion_ops; 171 172 extern const struct clk_ops clk_alpha_pll_lucid_ops; 173 #define clk_alpha_pll_fixed_lucid_ops clk_alpha_pll_fixed_trion_ops 174 extern const struct clk_ops clk_alpha_pll_postdiv_lucid_ops; 175 extern const struct clk_ops clk_alpha_pll_agera_ops; 176 177 extern const struct clk_ops clk_alpha_pll_lucid_5lpe_ops; 178 extern const struct clk_ops clk_alpha_pll_fixed_lucid_5lpe_ops; 179 extern const struct clk_ops clk_alpha_pll_postdiv_lucid_5lpe_ops; 180 181 extern const struct clk_ops clk_alpha_pll_zonda_ops; 182 #define clk_alpha_pll_postdiv_zonda_ops clk_alpha_pll_postdiv_fabia_ops 183 #define clk_alpha_pll_zonda_ole_ops clk_alpha_pll_zonda_ops 184 185 extern const struct clk_ops clk_alpha_pll_lucid_evo_ops; 186 extern const struct clk_ops clk_alpha_pll_reset_lucid_evo_ops; 187 #define clk_alpha_pll_reset_lucid_ole_ops clk_alpha_pll_reset_lucid_evo_ops 188 extern const struct clk_ops clk_alpha_pll_fixed_lucid_evo_ops; 189 #define clk_alpha_pll_fixed_lucid_ole_ops clk_alpha_pll_fixed_lucid_evo_ops 190 extern const struct clk_ops clk_alpha_pll_postdiv_lucid_evo_ops; 191 #define clk_alpha_pll_postdiv_lucid_ole_ops clk_alpha_pll_postdiv_lucid_evo_ops 192 193 extern const struct clk_ops clk_alpha_pll_rivian_evo_ops; 194 #define clk_alpha_pll_postdiv_rivian_evo_ops clk_alpha_pll_postdiv_fabia_ops 195 196 void clk_alpha_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap, 197 const struct alpha_pll_config *config); 198 void clk_huayra_2290_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap, 199 const struct alpha_pll_config *config); 200 void clk_fabia_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap, 201 const struct alpha_pll_config *config); 202 void clk_trion_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap, 203 const struct alpha_pll_config *config); 204 void clk_agera_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap, 205 const struct alpha_pll_config *config); 206 #define clk_lucid_pll_configure(pll, regmap, config) \ 207 clk_trion_pll_configure(pll, regmap, config) 208 209 void clk_zonda_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap, 210 const struct alpha_pll_config *config); 211 void clk_lucid_evo_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap, 212 const struct alpha_pll_config *config); 213 void clk_lucid_ole_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap, 214 const struct alpha_pll_config *config); 215 void clk_rivian_evo_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap, 216 const struct alpha_pll_config *config); 217 void clk_stromer_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap, 218 const struct alpha_pll_config *config); 219 220 #endif 221