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