clk-starfive-jh7100.h 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. #ifndef __CLK_STARFIVE_JH7100_H
  3. #define __CLK_STARFIVE_JH7100_H
  4. #include <linux/bits.h>
  5. #include <linux/clk-provider.h>
  6. /* register fields */
  7. #define JH7100_CLK_ENABLE BIT(31)
  8. #define JH7100_CLK_INVERT BIT(30)
  9. #define JH7100_CLK_MUX_MASK GENMASK(27, 24)
  10. #define JH7100_CLK_MUX_SHIFT 24
  11. #define JH7100_CLK_DIV_MASK GENMASK(23, 0)
  12. #define JH7100_CLK_FRAC_MASK GENMASK(15, 8)
  13. #define JH7100_CLK_FRAC_SHIFT 8
  14. #define JH7100_CLK_INT_MASK GENMASK(7, 0)
  15. /* fractional divider min/max */
  16. #define JH7100_CLK_FRAC_MIN 100UL
  17. #define JH7100_CLK_FRAC_MAX 25599UL
  18. /* clock data */
  19. struct jh7100_clk_data {
  20. const char *name;
  21. unsigned long flags;
  22. u32 max;
  23. u8 parents[4];
  24. };
  25. #define JH7100_GATE(_idx, _name, _flags, _parent) [_idx] = { \
  26. .name = _name, \
  27. .flags = CLK_SET_RATE_PARENT | (_flags), \
  28. .max = JH7100_CLK_ENABLE, \
  29. .parents = { [0] = _parent }, \
  30. }
  31. #define JH7100__DIV(_idx, _name, _max, _parent) [_idx] = { \
  32. .name = _name, \
  33. .flags = 0, \
  34. .max = _max, \
  35. .parents = { [0] = _parent }, \
  36. }
  37. #define JH7100_GDIV(_idx, _name, _flags, _max, _parent) [_idx] = { \
  38. .name = _name, \
  39. .flags = _flags, \
  40. .max = JH7100_CLK_ENABLE | (_max), \
  41. .parents = { [0] = _parent }, \
  42. }
  43. #define JH7100_FDIV(_idx, _name, _parent) [_idx] = { \
  44. .name = _name, \
  45. .flags = 0, \
  46. .max = JH7100_CLK_FRAC_MAX, \
  47. .parents = { [0] = _parent }, \
  48. }
  49. #define JH7100__MUX(_idx, _name, _nparents, ...) [_idx] = { \
  50. .name = _name, \
  51. .flags = 0, \
  52. .max = ((_nparents) - 1) << JH7100_CLK_MUX_SHIFT, \
  53. .parents = { __VA_ARGS__ }, \
  54. }
  55. #define JH7100_GMUX(_idx, _name, _flags, _nparents, ...) [_idx] = { \
  56. .name = _name, \
  57. .flags = _flags, \
  58. .max = JH7100_CLK_ENABLE | \
  59. (((_nparents) - 1) << JH7100_CLK_MUX_SHIFT), \
  60. .parents = { __VA_ARGS__ }, \
  61. }
  62. #define JH7100_MDIV(_idx, _name, _max, _nparents, ...) [_idx] = { \
  63. .name = _name, \
  64. .flags = 0, \
  65. .max = (((_nparents) - 1) << JH7100_CLK_MUX_SHIFT) | (_max), \
  66. .parents = { __VA_ARGS__ }, \
  67. }
  68. #define JH7100__GMD(_idx, _name, _flags, _max, _nparents, ...) [_idx] = { \
  69. .name = _name, \
  70. .flags = _flags, \
  71. .max = JH7100_CLK_ENABLE | \
  72. (((_nparents) - 1) << JH7100_CLK_MUX_SHIFT) | (_max), \
  73. .parents = { __VA_ARGS__ }, \
  74. }
  75. #define JH7100__INV(_idx, _name, _parent) [_idx] = { \
  76. .name = _name, \
  77. .flags = CLK_SET_RATE_PARENT, \
  78. .max = JH7100_CLK_INVERT, \
  79. .parents = { [0] = _parent }, \
  80. }
  81. struct jh7100_clk {
  82. struct clk_hw hw;
  83. unsigned int idx;
  84. unsigned int max_div;
  85. };
  86. struct jh7100_clk_priv {
  87. /* protect clk enable and set rate/parent from happening at the same time */
  88. spinlock_t rmw_lock;
  89. struct device *dev;
  90. void __iomem *base;
  91. struct clk_hw *pll[3];
  92. struct jh7100_clk reg[];
  93. };
  94. const struct clk_ops *starfive_jh7100_clk_ops(u32 max);
  95. #endif