162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (c) 2015, 2018, 2021 The Linux Foundation. All rights reserved. 462306a36Sopenharmony_ci * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved. 562306a36Sopenharmony_ci */ 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#ifndef __QCOM_CLK_ALPHA_PLL_H__ 962306a36Sopenharmony_ci#define __QCOM_CLK_ALPHA_PLL_H__ 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#include <linux/clk-provider.h> 1262306a36Sopenharmony_ci#include "clk-regmap.h" 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci/* Alpha PLL types */ 1562306a36Sopenharmony_cienum { 1662306a36Sopenharmony_ci CLK_ALPHA_PLL_TYPE_DEFAULT, 1762306a36Sopenharmony_ci CLK_ALPHA_PLL_TYPE_HUAYRA, 1862306a36Sopenharmony_ci CLK_ALPHA_PLL_TYPE_BRAMMO, 1962306a36Sopenharmony_ci CLK_ALPHA_PLL_TYPE_FABIA, 2062306a36Sopenharmony_ci CLK_ALPHA_PLL_TYPE_TRION, 2162306a36Sopenharmony_ci CLK_ALPHA_PLL_TYPE_LUCID = CLK_ALPHA_PLL_TYPE_TRION, 2262306a36Sopenharmony_ci CLK_ALPHA_PLL_TYPE_AGERA, 2362306a36Sopenharmony_ci CLK_ALPHA_PLL_TYPE_ZONDA, 2462306a36Sopenharmony_ci CLK_ALPHA_PLL_TYPE_LUCID_EVO, 2562306a36Sopenharmony_ci CLK_ALPHA_PLL_TYPE_LUCID_OLE, 2662306a36Sopenharmony_ci CLK_ALPHA_PLL_TYPE_RIVIAN_EVO, 2762306a36Sopenharmony_ci CLK_ALPHA_PLL_TYPE_DEFAULT_EVO, 2862306a36Sopenharmony_ci CLK_ALPHA_PLL_TYPE_BRAMMO_EVO, 2962306a36Sopenharmony_ci CLK_ALPHA_PLL_TYPE_STROMER, 3062306a36Sopenharmony_ci CLK_ALPHA_PLL_TYPE_STROMER_PLUS, 3162306a36Sopenharmony_ci CLK_ALPHA_PLL_TYPE_MAX, 3262306a36Sopenharmony_ci}; 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_cienum { 3562306a36Sopenharmony_ci PLL_OFF_L_VAL, 3662306a36Sopenharmony_ci PLL_OFF_CAL_L_VAL, 3762306a36Sopenharmony_ci PLL_OFF_ALPHA_VAL, 3862306a36Sopenharmony_ci PLL_OFF_ALPHA_VAL_U, 3962306a36Sopenharmony_ci PLL_OFF_USER_CTL, 4062306a36Sopenharmony_ci PLL_OFF_USER_CTL_U, 4162306a36Sopenharmony_ci PLL_OFF_USER_CTL_U1, 4262306a36Sopenharmony_ci PLL_OFF_CONFIG_CTL, 4362306a36Sopenharmony_ci PLL_OFF_CONFIG_CTL_U, 4462306a36Sopenharmony_ci PLL_OFF_CONFIG_CTL_U1, 4562306a36Sopenharmony_ci PLL_OFF_TEST_CTL, 4662306a36Sopenharmony_ci PLL_OFF_TEST_CTL_U, 4762306a36Sopenharmony_ci PLL_OFF_TEST_CTL_U1, 4862306a36Sopenharmony_ci PLL_OFF_TEST_CTL_U2, 4962306a36Sopenharmony_ci PLL_OFF_STATE, 5062306a36Sopenharmony_ci PLL_OFF_STATUS, 5162306a36Sopenharmony_ci PLL_OFF_OPMODE, 5262306a36Sopenharmony_ci PLL_OFF_FRAC, 5362306a36Sopenharmony_ci PLL_OFF_CAL_VAL, 5462306a36Sopenharmony_ci PLL_OFF_MAX_REGS 5562306a36Sopenharmony_ci}; 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_ciextern const u8 clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_MAX][PLL_OFF_MAX_REGS]; 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_cistruct pll_vco { 6062306a36Sopenharmony_ci unsigned long min_freq; 6162306a36Sopenharmony_ci unsigned long max_freq; 6262306a36Sopenharmony_ci u32 val; 6362306a36Sopenharmony_ci}; 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_ci#define VCO(a, b, c) { \ 6662306a36Sopenharmony_ci .val = a,\ 6762306a36Sopenharmony_ci .min_freq = b,\ 6862306a36Sopenharmony_ci .max_freq = c,\ 6962306a36Sopenharmony_ci} 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_ci/** 7262306a36Sopenharmony_ci * struct clk_alpha_pll - phase locked loop (PLL) 7362306a36Sopenharmony_ci * @offset: base address of registers 7462306a36Sopenharmony_ci * @vco_table: array of VCO settings 7562306a36Sopenharmony_ci * @regs: alpha pll register map (see @clk_alpha_pll_regs) 7662306a36Sopenharmony_ci * @clkr: regmap clock handle 7762306a36Sopenharmony_ci */ 7862306a36Sopenharmony_cistruct clk_alpha_pll { 7962306a36Sopenharmony_ci u32 offset; 8062306a36Sopenharmony_ci const u8 *regs; 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_ci const struct pll_vco *vco_table; 8362306a36Sopenharmony_ci size_t num_vco; 8462306a36Sopenharmony_ci#define SUPPORTS_OFFLINE_REQ BIT(0) 8562306a36Sopenharmony_ci#define SUPPORTS_FSM_MODE BIT(2) 8662306a36Sopenharmony_ci#define SUPPORTS_DYNAMIC_UPDATE BIT(3) 8762306a36Sopenharmony_ci#define SUPPORTS_FSM_LEGACY_MODE BIT(4) 8862306a36Sopenharmony_ci u8 flags; 8962306a36Sopenharmony_ci 9062306a36Sopenharmony_ci struct clk_regmap clkr; 9162306a36Sopenharmony_ci}; 9262306a36Sopenharmony_ci 9362306a36Sopenharmony_ci/** 9462306a36Sopenharmony_ci * struct clk_alpha_pll_postdiv - phase locked loop (PLL) post-divider 9562306a36Sopenharmony_ci * @offset: base address of registers 9662306a36Sopenharmony_ci * @regs: alpha pll register map (see @clk_alpha_pll_regs) 9762306a36Sopenharmony_ci * @width: width of post-divider 9862306a36Sopenharmony_ci * @post_div_shift: shift to differentiate between odd & even post-divider 9962306a36Sopenharmony_ci * @post_div_table: table with PLL odd and even post-divider settings 10062306a36Sopenharmony_ci * @num_post_div: Number of PLL post-divider settings 10162306a36Sopenharmony_ci * 10262306a36Sopenharmony_ci * @clkr: regmap clock handle 10362306a36Sopenharmony_ci */ 10462306a36Sopenharmony_cistruct clk_alpha_pll_postdiv { 10562306a36Sopenharmony_ci u32 offset; 10662306a36Sopenharmony_ci u8 width; 10762306a36Sopenharmony_ci const u8 *regs; 10862306a36Sopenharmony_ci 10962306a36Sopenharmony_ci struct clk_regmap clkr; 11062306a36Sopenharmony_ci int post_div_shift; 11162306a36Sopenharmony_ci const struct clk_div_table *post_div_table; 11262306a36Sopenharmony_ci size_t num_post_div; 11362306a36Sopenharmony_ci}; 11462306a36Sopenharmony_ci 11562306a36Sopenharmony_cistruct alpha_pll_config { 11662306a36Sopenharmony_ci u32 l; 11762306a36Sopenharmony_ci u32 alpha; 11862306a36Sopenharmony_ci u32 alpha_hi; 11962306a36Sopenharmony_ci u32 config_ctl_val; 12062306a36Sopenharmony_ci u32 config_ctl_hi_val; 12162306a36Sopenharmony_ci u32 config_ctl_hi1_val; 12262306a36Sopenharmony_ci u32 user_ctl_val; 12362306a36Sopenharmony_ci u32 user_ctl_hi_val; 12462306a36Sopenharmony_ci u32 user_ctl_hi1_val; 12562306a36Sopenharmony_ci u32 test_ctl_val; 12662306a36Sopenharmony_ci u32 test_ctl_mask; 12762306a36Sopenharmony_ci u32 test_ctl_hi_val; 12862306a36Sopenharmony_ci u32 test_ctl_hi_mask; 12962306a36Sopenharmony_ci u32 test_ctl_hi1_val; 13062306a36Sopenharmony_ci u32 test_ctl_hi2_val; 13162306a36Sopenharmony_ci u32 main_output_mask; 13262306a36Sopenharmony_ci u32 aux_output_mask; 13362306a36Sopenharmony_ci u32 aux2_output_mask; 13462306a36Sopenharmony_ci u32 early_output_mask; 13562306a36Sopenharmony_ci u32 alpha_en_mask; 13662306a36Sopenharmony_ci u32 alpha_mode_mask; 13762306a36Sopenharmony_ci u32 pre_div_val; 13862306a36Sopenharmony_ci u32 pre_div_mask; 13962306a36Sopenharmony_ci u32 post_div_val; 14062306a36Sopenharmony_ci u32 post_div_mask; 14162306a36Sopenharmony_ci u32 vco_val; 14262306a36Sopenharmony_ci u32 vco_mask; 14362306a36Sopenharmony_ci u32 status_val; 14462306a36Sopenharmony_ci u32 status_mask; 14562306a36Sopenharmony_ci u32 lock_det; 14662306a36Sopenharmony_ci}; 14762306a36Sopenharmony_ci 14862306a36Sopenharmony_ciextern const struct clk_ops clk_alpha_pll_ops; 14962306a36Sopenharmony_ciextern const struct clk_ops clk_alpha_pll_fixed_ops; 15062306a36Sopenharmony_ciextern const struct clk_ops clk_alpha_pll_hwfsm_ops; 15162306a36Sopenharmony_ciextern const struct clk_ops clk_alpha_pll_postdiv_ops; 15262306a36Sopenharmony_ciextern const struct clk_ops clk_alpha_pll_huayra_ops; 15362306a36Sopenharmony_ciextern const struct clk_ops clk_alpha_pll_postdiv_ro_ops; 15462306a36Sopenharmony_ciextern const struct clk_ops clk_alpha_pll_stromer_ops; 15562306a36Sopenharmony_ciextern const struct clk_ops clk_alpha_pll_stromer_plus_ops; 15662306a36Sopenharmony_ci 15762306a36Sopenharmony_ciextern const struct clk_ops clk_alpha_pll_fabia_ops; 15862306a36Sopenharmony_ciextern const struct clk_ops clk_alpha_pll_fixed_fabia_ops; 15962306a36Sopenharmony_ciextern const struct clk_ops clk_alpha_pll_postdiv_fabia_ops; 16062306a36Sopenharmony_ci 16162306a36Sopenharmony_ciextern const struct clk_ops clk_alpha_pll_trion_ops; 16262306a36Sopenharmony_ciextern const struct clk_ops clk_alpha_pll_fixed_trion_ops; 16362306a36Sopenharmony_ciextern const struct clk_ops clk_alpha_pll_postdiv_trion_ops; 16462306a36Sopenharmony_ci 16562306a36Sopenharmony_ciextern const struct clk_ops clk_alpha_pll_lucid_ops; 16662306a36Sopenharmony_ci#define clk_alpha_pll_fixed_lucid_ops clk_alpha_pll_fixed_trion_ops 16762306a36Sopenharmony_ciextern const struct clk_ops clk_alpha_pll_postdiv_lucid_ops; 16862306a36Sopenharmony_ciextern const struct clk_ops clk_alpha_pll_agera_ops; 16962306a36Sopenharmony_ci 17062306a36Sopenharmony_ciextern const struct clk_ops clk_alpha_pll_lucid_5lpe_ops; 17162306a36Sopenharmony_ciextern const struct clk_ops clk_alpha_pll_fixed_lucid_5lpe_ops; 17262306a36Sopenharmony_ciextern const struct clk_ops clk_alpha_pll_postdiv_lucid_5lpe_ops; 17362306a36Sopenharmony_ci 17462306a36Sopenharmony_ciextern const struct clk_ops clk_alpha_pll_zonda_ops; 17562306a36Sopenharmony_ci#define clk_alpha_pll_postdiv_zonda_ops clk_alpha_pll_postdiv_fabia_ops 17662306a36Sopenharmony_ci 17762306a36Sopenharmony_ciextern const struct clk_ops clk_alpha_pll_lucid_evo_ops; 17862306a36Sopenharmony_ciextern const struct clk_ops clk_alpha_pll_reset_lucid_evo_ops; 17962306a36Sopenharmony_ci#define clk_alpha_pll_reset_lucid_ole_ops clk_alpha_pll_reset_lucid_evo_ops 18062306a36Sopenharmony_ciextern const struct clk_ops clk_alpha_pll_fixed_lucid_evo_ops; 18162306a36Sopenharmony_ci#define clk_alpha_pll_fixed_lucid_ole_ops clk_alpha_pll_fixed_lucid_evo_ops 18262306a36Sopenharmony_ciextern const struct clk_ops clk_alpha_pll_postdiv_lucid_evo_ops; 18362306a36Sopenharmony_ci#define clk_alpha_pll_postdiv_lucid_ole_ops clk_alpha_pll_postdiv_lucid_evo_ops 18462306a36Sopenharmony_ci 18562306a36Sopenharmony_ciextern const struct clk_ops clk_alpha_pll_rivian_evo_ops; 18662306a36Sopenharmony_ci#define clk_alpha_pll_postdiv_rivian_evo_ops clk_alpha_pll_postdiv_fabia_ops 18762306a36Sopenharmony_ci 18862306a36Sopenharmony_civoid clk_alpha_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap, 18962306a36Sopenharmony_ci const struct alpha_pll_config *config); 19062306a36Sopenharmony_civoid clk_fabia_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap, 19162306a36Sopenharmony_ci const struct alpha_pll_config *config); 19262306a36Sopenharmony_civoid clk_trion_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap, 19362306a36Sopenharmony_ci const struct alpha_pll_config *config); 19462306a36Sopenharmony_civoid clk_agera_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap, 19562306a36Sopenharmony_ci const struct alpha_pll_config *config); 19662306a36Sopenharmony_ci#define clk_lucid_pll_configure(pll, regmap, config) \ 19762306a36Sopenharmony_ci clk_trion_pll_configure(pll, regmap, config) 19862306a36Sopenharmony_ci 19962306a36Sopenharmony_civoid clk_zonda_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap, 20062306a36Sopenharmony_ci const struct alpha_pll_config *config); 20162306a36Sopenharmony_civoid clk_lucid_evo_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap, 20262306a36Sopenharmony_ci const struct alpha_pll_config *config); 20362306a36Sopenharmony_civoid clk_rivian_evo_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap, 20462306a36Sopenharmony_ci const struct alpha_pll_config *config); 20562306a36Sopenharmony_civoid clk_stromer_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap, 20662306a36Sopenharmony_ci const struct alpha_pll_config *config); 20762306a36Sopenharmony_ci 20862306a36Sopenharmony_ci#endif 209