162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (c) 2022 MediaTek Inc. 462306a36Sopenharmony_ci * Author: Edward-JW Yang <edward-jw.yang@mediatek.com> 562306a36Sopenharmony_ci */ 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#ifndef __CLK_PLLFH_H 862306a36Sopenharmony_ci#define __CLK_PLLFH_H 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#include "clk-pll.h" 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_cistruct fh_pll_state { 1362306a36Sopenharmony_ci void __iomem *base; 1462306a36Sopenharmony_ci u32 fh_enable; 1562306a36Sopenharmony_ci u32 ssc_rate; 1662306a36Sopenharmony_ci}; 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_cistruct fh_pll_data { 1962306a36Sopenharmony_ci int pll_id; 2062306a36Sopenharmony_ci int fh_id; 2162306a36Sopenharmony_ci int fh_ver; 2262306a36Sopenharmony_ci u32 fhx_offset; 2362306a36Sopenharmony_ci u32 dds_mask; 2462306a36Sopenharmony_ci u32 slope0_value; 2562306a36Sopenharmony_ci u32 slope1_value; 2662306a36Sopenharmony_ci u32 sfstrx_en; 2762306a36Sopenharmony_ci u32 frddsx_en; 2862306a36Sopenharmony_ci u32 fhctlx_en; 2962306a36Sopenharmony_ci u32 tgl_org; 3062306a36Sopenharmony_ci u32 dvfs_tri; 3162306a36Sopenharmony_ci u32 pcwchg; 3262306a36Sopenharmony_ci u32 dt_val; 3362306a36Sopenharmony_ci u32 df_val; 3462306a36Sopenharmony_ci u32 updnlmt_shft; 3562306a36Sopenharmony_ci u32 msk_frddsx_dys; 3662306a36Sopenharmony_ci u32 msk_frddsx_dts; 3762306a36Sopenharmony_ci}; 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_cistruct mtk_pllfh_data { 4062306a36Sopenharmony_ci struct fh_pll_state state; 4162306a36Sopenharmony_ci const struct fh_pll_data data; 4262306a36Sopenharmony_ci}; 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_cistruct fh_pll_regs { 4562306a36Sopenharmony_ci void __iomem *reg_hp_en; 4662306a36Sopenharmony_ci void __iomem *reg_clk_con; 4762306a36Sopenharmony_ci void __iomem *reg_rst_con; 4862306a36Sopenharmony_ci void __iomem *reg_slope0; 4962306a36Sopenharmony_ci void __iomem *reg_slope1; 5062306a36Sopenharmony_ci void __iomem *reg_cfg; 5162306a36Sopenharmony_ci void __iomem *reg_updnlmt; 5262306a36Sopenharmony_ci void __iomem *reg_dds; 5362306a36Sopenharmony_ci void __iomem *reg_dvfs; 5462306a36Sopenharmony_ci void __iomem *reg_mon; 5562306a36Sopenharmony_ci}; 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_cistruct mtk_fh { 5862306a36Sopenharmony_ci struct mtk_clk_pll clk_pll; 5962306a36Sopenharmony_ci struct fh_pll_regs regs; 6062306a36Sopenharmony_ci struct mtk_pllfh_data *pllfh_data; 6162306a36Sopenharmony_ci const struct fh_operation *ops; 6262306a36Sopenharmony_ci spinlock_t *lock; 6362306a36Sopenharmony_ci}; 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_cistruct fh_operation { 6662306a36Sopenharmony_ci int (*hopping)(struct mtk_fh *fh, unsigned int new_dds, 6762306a36Sopenharmony_ci unsigned int postdiv); 6862306a36Sopenharmony_ci int (*ssc_enable)(struct mtk_fh *fh, u32 rate); 6962306a36Sopenharmony_ci}; 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_ciint mtk_clk_register_pllfhs(struct device_node *node, 7262306a36Sopenharmony_ci const struct mtk_pll_data *plls, int num_plls, 7362306a36Sopenharmony_ci struct mtk_pllfh_data *pllfhs, int num_pllfhs, 7462306a36Sopenharmony_ci struct clk_hw_onecell_data *clk_data); 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_civoid mtk_clk_unregister_pllfhs(const struct mtk_pll_data *plls, int num_plls, 7762306a36Sopenharmony_ci struct mtk_pllfh_data *pllfhs, int num_fhs, 7862306a36Sopenharmony_ci struct clk_hw_onecell_data *clk_data); 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_civoid fhctl_parse_dt(const u8 *compatible_node, struct mtk_pllfh_data *pllfhs, 8162306a36Sopenharmony_ci int num_pllfhs); 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_ci#endif /* __CLK_PLLFH_H */ 84