17a12f838SNishad Kamdar /* SPDX-License-Identifier: GPL-2.0 */
23e37b005SChunyan Zhang //
33e37b005SChunyan Zhang // Spreadtrum pll clock driver
43e37b005SChunyan Zhang //
53e37b005SChunyan Zhang // Copyright (C) 2015~2017 Spreadtrum, Inc.
63e37b005SChunyan Zhang // Author: Chunyan Zhang <chunyan.zhang@spreadtrum.com>
73e37b005SChunyan Zhang
83e37b005SChunyan Zhang #ifndef _SPRD_PLL_H_
93e37b005SChunyan Zhang #define _SPRD_PLL_H_
103e37b005SChunyan Zhang
113e37b005SChunyan Zhang #include "common.h"
123e37b005SChunyan Zhang
133e37b005SChunyan Zhang struct reg_cfg {
143e37b005SChunyan Zhang u32 val;
153e37b005SChunyan Zhang u32 msk;
163e37b005SChunyan Zhang };
173e37b005SChunyan Zhang
183e37b005SChunyan Zhang struct clk_bit_field {
193e37b005SChunyan Zhang u8 shift;
203e37b005SChunyan Zhang u8 width;
213e37b005SChunyan Zhang };
223e37b005SChunyan Zhang
233e37b005SChunyan Zhang enum {
243e37b005SChunyan Zhang PLL_LOCK_DONE,
253e37b005SChunyan Zhang PLL_DIV_S,
263e37b005SChunyan Zhang PLL_MOD_EN,
273e37b005SChunyan Zhang PLL_SDM_EN,
283e37b005SChunyan Zhang PLL_REFIN,
293e37b005SChunyan Zhang PLL_IBIAS,
303e37b005SChunyan Zhang PLL_N,
313e37b005SChunyan Zhang PLL_NINT,
323e37b005SChunyan Zhang PLL_KINT,
333e37b005SChunyan Zhang PLL_PREDIV,
343e37b005SChunyan Zhang PLL_POSTDIV,
353e37b005SChunyan Zhang
363e37b005SChunyan Zhang PLL_FACT_MAX
373e37b005SChunyan Zhang };
383e37b005SChunyan Zhang
393e37b005SChunyan Zhang /*
403e37b005SChunyan Zhang * struct sprd_pll - definition of adjustable pll clock
413e37b005SChunyan Zhang *
423e37b005SChunyan Zhang * @reg: registers used to set the configuration of pll clock,
433e37b005SChunyan Zhang * reg[0] shows how many registers this pll clock uses.
443e37b005SChunyan Zhang * @itable: pll ibias table, itable[0] means how many items this
453e37b005SChunyan Zhang * table includes
463e37b005SChunyan Zhang * @udelay delay time after setting rate
473e37b005SChunyan Zhang * @factors used to calculate the pll clock rate
483e37b005SChunyan Zhang * @fvco: fvco threshold rate
493e37b005SChunyan Zhang * @fflag: fvco flag
503e37b005SChunyan Zhang */
513e37b005SChunyan Zhang struct sprd_pll {
523e37b005SChunyan Zhang u32 regs_num;
533e37b005SChunyan Zhang const u64 *itable;
543e37b005SChunyan Zhang const struct clk_bit_field *factors;
553e37b005SChunyan Zhang u16 udelay;
563e37b005SChunyan Zhang u16 k1;
573e37b005SChunyan Zhang u16 k2;
583e37b005SChunyan Zhang u16 fflag;
593e37b005SChunyan Zhang u64 fvco;
603e37b005SChunyan Zhang
613e37b005SChunyan Zhang struct sprd_clk_common common;
623e37b005SChunyan Zhang };
633e37b005SChunyan Zhang
64*ea8ca310SChunyan Zhang #define SPRD_PLL_HW_INIT_FN(_struct, _name, _parent, _reg, \
653e37b005SChunyan Zhang _regs_num, _itable, _factors, \
66*ea8ca310SChunyan Zhang _udelay, _k1, _k2, _fflag, \
67*ea8ca310SChunyan Zhang _fvco, _fn) \
683e37b005SChunyan Zhang struct sprd_pll _struct = { \
693e37b005SChunyan Zhang .regs_num = _regs_num, \
703e37b005SChunyan Zhang .itable = _itable, \
713e37b005SChunyan Zhang .factors = _factors, \
723e37b005SChunyan Zhang .udelay = _udelay, \
733e37b005SChunyan Zhang .k1 = _k1, \
743e37b005SChunyan Zhang .k2 = _k2, \
753e37b005SChunyan Zhang .fflag = _fflag, \
763e37b005SChunyan Zhang .fvco = _fvco, \
773e37b005SChunyan Zhang .common = { \
783e37b005SChunyan Zhang .regmap = NULL, \
793e37b005SChunyan Zhang .reg = _reg, \
80*ea8ca310SChunyan Zhang .hw.init = _fn(_name, _parent, \
81*ea8ca310SChunyan Zhang &sprd_pll_ops, 0),\
823e37b005SChunyan Zhang }, \
833e37b005SChunyan Zhang }
843e37b005SChunyan Zhang
85*ea8ca310SChunyan Zhang #define SPRD_PLL_WITH_ITABLE_K_FVCO(_struct, _name, _parent, _reg, \
86*ea8ca310SChunyan Zhang _regs_num, _itable, _factors, \
87*ea8ca310SChunyan Zhang _udelay, _k1, _k2, _fflag, _fvco) \
88*ea8ca310SChunyan Zhang SPRD_PLL_HW_INIT_FN(_struct, _name, _parent, _reg, _regs_num, \
89*ea8ca310SChunyan Zhang _itable, _factors, _udelay, _k1, _k2, \
90*ea8ca310SChunyan Zhang _fflag, _fvco, CLK_HW_INIT)
91*ea8ca310SChunyan Zhang
923e37b005SChunyan Zhang #define SPRD_PLL_WITH_ITABLE_K(_struct, _name, _parent, _reg, \
933e37b005SChunyan Zhang _regs_num, _itable, _factors, \
943e37b005SChunyan Zhang _udelay, _k1, _k2) \
953e37b005SChunyan Zhang SPRD_PLL_WITH_ITABLE_K_FVCO(_struct, _name, _parent, _reg, \
963e37b005SChunyan Zhang _regs_num, _itable, _factors, \
973e37b005SChunyan Zhang _udelay, _k1, _k2, 0, 0)
983e37b005SChunyan Zhang
993e37b005SChunyan Zhang #define SPRD_PLL_WITH_ITABLE_1K(_struct, _name, _parent, _reg, \
1003e37b005SChunyan Zhang _regs_num, _itable, _factors, _udelay) \
1013e37b005SChunyan Zhang SPRD_PLL_WITH_ITABLE_K_FVCO(_struct, _name, _parent, _reg, \
1023e37b005SChunyan Zhang _regs_num, _itable, _factors, \
1033e37b005SChunyan Zhang _udelay, 1000, 1000, 0, 0)
1043e37b005SChunyan Zhang
105*ea8ca310SChunyan Zhang #define SPRD_PLL_FW_NAME(_struct, _name, _parent, _reg, _regs_num, \
106*ea8ca310SChunyan Zhang _itable, _factors, _udelay, _k1, _k2, \
107*ea8ca310SChunyan Zhang _fflag, _fvco) \
108*ea8ca310SChunyan Zhang SPRD_PLL_HW_INIT_FN(_struct, _name, _parent, _reg, _regs_num, \
109*ea8ca310SChunyan Zhang _itable, _factors, _udelay, _k1, _k2, \
110*ea8ca310SChunyan Zhang _fflag, _fvco, CLK_HW_INIT_FW_NAME)
111*ea8ca310SChunyan Zhang
112*ea8ca310SChunyan Zhang #define SPRD_PLL_HW(_struct, _name, _parent, _reg, _regs_num, _itable, \
113*ea8ca310SChunyan Zhang _factors, _udelay, _k1, _k2, _fflag, _fvco) \
114*ea8ca310SChunyan Zhang SPRD_PLL_HW_INIT_FN(_struct, _name, _parent, _reg, _regs_num, \
115*ea8ca310SChunyan Zhang _itable, _factors, _udelay, _k1, _k2, \
116*ea8ca310SChunyan Zhang _fflag, _fvco, CLK_HW_INIT_HW)
117*ea8ca310SChunyan Zhang
hw_to_sprd_pll(struct clk_hw * hw)1183e37b005SChunyan Zhang static inline struct sprd_pll *hw_to_sprd_pll(struct clk_hw *hw)
1193e37b005SChunyan Zhang {
1203e37b005SChunyan Zhang struct sprd_clk_common *common = hw_to_sprd_clk_common(hw);
1213e37b005SChunyan Zhang
1223e37b005SChunyan Zhang return container_of(common, struct sprd_pll, common);
1233e37b005SChunyan Zhang }
1243e37b005SChunyan Zhang
1253e37b005SChunyan Zhang extern const struct clk_ops sprd_pll_ops;
1263e37b005SChunyan Zhang
1273e37b005SChunyan Zhang #endif /* _SPRD_PLL_H_ */
128