pll.h 3.2 KB

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