xref: /openbmc/linux/drivers/clk/sprd/pll.h (revision ea8ca310)
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 
64ea8ca310SChunyan Zhang #define SPRD_PLL_HW_INIT_FN(_struct, _name, _parent, _reg,	\
653e37b005SChunyan Zhang 			    _regs_num, _itable, _factors,	\
66ea8ca310SChunyan Zhang 			    _udelay, _k1, _k2, _fflag,		\
67ea8ca310SChunyan 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,			\
80ea8ca310SChunyan Zhang 			.hw.init	= _fn(_name, _parent,	\
81ea8ca310SChunyan Zhang 					      &sprd_pll_ops, 0),\
823e37b005SChunyan Zhang 		},						\
833e37b005SChunyan Zhang 	}
843e37b005SChunyan Zhang 
85ea8ca310SChunyan Zhang #define SPRD_PLL_WITH_ITABLE_K_FVCO(_struct, _name, _parent, _reg,	\
86ea8ca310SChunyan Zhang 				    _regs_num, _itable, _factors,	\
87ea8ca310SChunyan Zhang 				    _udelay, _k1, _k2, _fflag, _fvco)	\
88ea8ca310SChunyan Zhang 	SPRD_PLL_HW_INIT_FN(_struct, _name, _parent, _reg, _regs_num,	\
89ea8ca310SChunyan Zhang 			    _itable, _factors, _udelay, _k1, _k2,	\
90ea8ca310SChunyan Zhang 			    _fflag, _fvco, CLK_HW_INIT)
91ea8ca310SChunyan 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 
105ea8ca310SChunyan Zhang #define SPRD_PLL_FW_NAME(_struct, _name, _parent, _reg, _regs_num,	\
106ea8ca310SChunyan Zhang 			 _itable, _factors, _udelay, _k1, _k2,		\
107ea8ca310SChunyan Zhang 			 _fflag, _fvco)					\
108ea8ca310SChunyan Zhang 	SPRD_PLL_HW_INIT_FN(_struct, _name, _parent, _reg, _regs_num,	\
109ea8ca310SChunyan Zhang 			    _itable, _factors, _udelay, _k1, _k2,	\
110ea8ca310SChunyan Zhang 			    _fflag, _fvco, CLK_HW_INIT_FW_NAME)
111ea8ca310SChunyan Zhang 
112ea8ca310SChunyan Zhang #define SPRD_PLL_HW(_struct, _name, _parent, _reg, _regs_num, _itable,	\
113ea8ca310SChunyan Zhang 		    _factors, _udelay, _k1, _k2, _fflag, _fvco)		\
114ea8ca310SChunyan Zhang 	SPRD_PLL_HW_INIT_FN(_struct, _name, _parent, _reg, _regs_num,	\
115ea8ca310SChunyan Zhang 			    _itable, _factors, _udelay, _k1, _k2,	\
116ea8ca310SChunyan Zhang 			    _fflag, _fvco, CLK_HW_INIT_HW)
117ea8ca310SChunyan 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