Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 | /* SPDX-License-Identifier: GPL-2.0 */ // // Spreadtrum pll clock driver // // Copyright (C) 2015~2017 Spreadtrum, Inc. // Author: Chunyan Zhang <chunyan.zhang@spreadtrum.com> #ifndef _SPRD_PLL_H_ #define _SPRD_PLL_H_ #include "common.h" struct reg_cfg { u32 val; u32 msk; }; struct clk_bit_field { u8 shift; u8 width; }; enum { PLL_LOCK_DONE, PLL_DIV_S, PLL_MOD_EN, PLL_SDM_EN, PLL_REFIN, PLL_IBIAS, PLL_N, PLL_NINT, PLL_KINT, PLL_PREDIV, PLL_POSTDIV, PLL_FACT_MAX }; /* * struct sprd_pll - definition of adjustable pll clock * * @reg: registers used to set the configuration of pll clock, * reg[0] shows how many registers this pll clock uses. * @itable: pll ibias table, itable[0] means how many items this * table includes * @udelay delay time after setting rate * @factors used to calculate the pll clock rate * @fvco: fvco threshold rate * @fflag: fvco flag */ struct sprd_pll { u32 regs_num; const u64 *itable; const struct clk_bit_field *factors; u16 udelay; u16 k1; u16 k2; u16 fflag; u64 fvco; struct sprd_clk_common common; }; #define SPRD_PLL_HW_INIT_FN(_struct, _name, _parent, _reg, \ _regs_num, _itable, _factors, \ _udelay, _k1, _k2, _fflag, \ _fvco, _fn) \ struct sprd_pll _struct = { \ .regs_num = _regs_num, \ .itable = _itable, \ .factors = _factors, \ .udelay = _udelay, \ .k1 = _k1, \ .k2 = _k2, \ .fflag = _fflag, \ .fvco = _fvco, \ .common = { \ .regmap = NULL, \ .reg = _reg, \ .hw.init = _fn(_name, _parent, \ &sprd_pll_ops, 0),\ }, \ } #define SPRD_PLL_WITH_ITABLE_K_FVCO(_struct, _name, _parent, _reg, \ _regs_num, _itable, _factors, \ _udelay, _k1, _k2, _fflag, _fvco) \ SPRD_PLL_HW_INIT_FN(_struct, _name, _parent, _reg, _regs_num, \ _itable, _factors, _udelay, _k1, _k2, \ _fflag, _fvco, CLK_HW_INIT) #define SPRD_PLL_WITH_ITABLE_K(_struct, _name, _parent, _reg, \ _regs_num, _itable, _factors, \ _udelay, _k1, _k2) \ SPRD_PLL_WITH_ITABLE_K_FVCO(_struct, _name, _parent, _reg, \ _regs_num, _itable, _factors, \ _udelay, _k1, _k2, 0, 0) #define SPRD_PLL_WITH_ITABLE_1K(_struct, _name, _parent, _reg, \ _regs_num, _itable, _factors, _udelay) \ SPRD_PLL_WITH_ITABLE_K_FVCO(_struct, _name, _parent, _reg, \ _regs_num, _itable, _factors, \ _udelay, 1000, 1000, 0, 0) #define SPRD_PLL_FW_NAME(_struct, _name, _parent, _reg, _regs_num, \ _itable, _factors, _udelay, _k1, _k2, \ _fflag, _fvco) \ SPRD_PLL_HW_INIT_FN(_struct, _name, _parent, _reg, _regs_num, \ _itable, _factors, _udelay, _k1, _k2, \ _fflag, _fvco, CLK_HW_INIT_FW_NAME) #define SPRD_PLL_HW(_struct, _name, _parent, _reg, _regs_num, _itable, \ _factors, _udelay, _k1, _k2, _fflag, _fvco) \ SPRD_PLL_HW_INIT_FN(_struct, _name, _parent, _reg, _regs_num, \ _itable, _factors, _udelay, _k1, _k2, \ _fflag, _fvco, CLK_HW_INIT_HW) static inline struct sprd_pll *hw_to_sprd_pll(struct clk_hw *hw) { struct sprd_clk_common *common = hw_to_sprd_clk_common(hw); return container_of(common, struct sprd_pll, common); } extern const struct clk_ops sprd_pll_ops; #endif /* _SPRD_PLL_H_ */ |