1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 /* 3 * Copyright (c) 2022 MediaTek Inc. 4 * Author: Edward-JW Yang <edward-jw.yang@mediatek.com> 5 */ 6 7 #ifndef __CLK_PLLFH_H 8 #define __CLK_PLLFH_H 9 10 #include "clk-pll.h" 11 12 struct fh_pll_state { 13 void __iomem *base; 14 u32 fh_enable; 15 u32 ssc_rate; 16 }; 17 18 struct fh_pll_data { 19 int pll_id; 20 int fh_id; 21 int fh_ver; 22 u32 fhx_offset; 23 u32 dds_mask; 24 u32 slope0_value; 25 u32 slope1_value; 26 u32 sfstrx_en; 27 u32 frddsx_en; 28 u32 fhctlx_en; 29 u32 tgl_org; 30 u32 dvfs_tri; 31 u32 pcwchg; 32 u32 dt_val; 33 u32 df_val; 34 u32 updnlmt_shft; 35 u32 msk_frddsx_dys; 36 u32 msk_frddsx_dts; 37 }; 38 39 struct mtk_pllfh_data { 40 struct fh_pll_state state; 41 const struct fh_pll_data data; 42 }; 43 44 struct fh_pll_regs { 45 void __iomem *reg_hp_en; 46 void __iomem *reg_clk_con; 47 void __iomem *reg_rst_con; 48 void __iomem *reg_slope0; 49 void __iomem *reg_slope1; 50 void __iomem *reg_cfg; 51 void __iomem *reg_updnlmt; 52 void __iomem *reg_dds; 53 void __iomem *reg_dvfs; 54 void __iomem *reg_mon; 55 }; 56 57 struct mtk_fh { 58 struct mtk_clk_pll clk_pll; 59 struct fh_pll_regs regs; 60 struct mtk_pllfh_data *pllfh_data; 61 const struct fh_operation *ops; 62 spinlock_t *lock; 63 }; 64 65 struct fh_operation { 66 int (*hopping)(struct mtk_fh *fh, unsigned int new_dds, 67 unsigned int postdiv); 68 int (*ssc_enable)(struct mtk_fh *fh, u32 rate); 69 }; 70 71 int mtk_clk_register_pllfhs(struct device_node *node, 72 const struct mtk_pll_data *plls, int num_plls, 73 struct mtk_pllfh_data *pllfhs, int num_pllfhs, 74 struct clk_hw_onecell_data *clk_data); 75 76 void mtk_clk_unregister_pllfhs(const struct mtk_pll_data *plls, int num_plls, 77 struct mtk_pllfh_data *pllfhs, int num_fhs, 78 struct clk_hw_onecell_data *clk_data); 79 80 void fhctl_parse_dt(const u8 *compatible_node, struct mtk_pllfh_data *pllfhs, 81 int num_pllfhs); 82 83 #endif /* __CLK_PLLFH_H */ 84