clk.h 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. /*
  3. * Copyright (C) 2014 Google, Inc.
  4. */
  5. #ifndef __PISTACHIO_CLK_H
  6. #define __PISTACHIO_CLK_H
  7. #include <linux/clk-provider.h>
  8. struct pistachio_gate {
  9. unsigned int id;
  10. unsigned long reg;
  11. unsigned int shift;
  12. const char *name;
  13. const char *parent;
  14. };
  15. #define GATE(_id, _name, _pname, _reg, _shift) \
  16. { \
  17. .id = _id, \
  18. .reg = _reg, \
  19. .shift = _shift, \
  20. .name = _name, \
  21. .parent = _pname, \
  22. }
  23. struct pistachio_mux {
  24. unsigned int id;
  25. unsigned long reg;
  26. unsigned int shift;
  27. unsigned int num_parents;
  28. const char *name;
  29. const char *const *parents;
  30. };
  31. #define PNAME(x) static const char *const x[] __initconst
  32. #define MUX(_id, _name, _pnames, _reg, _shift) \
  33. { \
  34. .id = _id, \
  35. .reg = _reg, \
  36. .shift = _shift, \
  37. .name = _name, \
  38. .parents = _pnames, \
  39. .num_parents = ARRAY_SIZE(_pnames) \
  40. }
  41. struct pistachio_div {
  42. unsigned int id;
  43. unsigned long reg;
  44. unsigned int width;
  45. unsigned int div_flags;
  46. const char *name;
  47. const char *parent;
  48. };
  49. #define DIV(_id, _name, _pname, _reg, _width) \
  50. { \
  51. .id = _id, \
  52. .reg = _reg, \
  53. .width = _width, \
  54. .div_flags = 0, \
  55. .name = _name, \
  56. .parent = _pname, \
  57. }
  58. #define DIV_F(_id, _name, _pname, _reg, _width, _div_flags) \
  59. { \
  60. .id = _id, \
  61. .reg = _reg, \
  62. .width = _width, \
  63. .div_flags = _div_flags, \
  64. .name = _name, \
  65. .parent = _pname, \
  66. }
  67. struct pistachio_fixed_factor {
  68. unsigned int id;
  69. unsigned int div;
  70. const char *name;
  71. const char *parent;
  72. };
  73. #define FIXED_FACTOR(_id, _name, _pname, _div) \
  74. { \
  75. .id = _id, \
  76. .div = _div, \
  77. .name = _name, \
  78. .parent = _pname, \
  79. }
  80. struct pistachio_pll_rate_table {
  81. unsigned long long fref;
  82. unsigned long long fout;
  83. unsigned long long refdiv;
  84. unsigned long long fbdiv;
  85. unsigned long long postdiv1;
  86. unsigned long long postdiv2;
  87. unsigned long long frac;
  88. };
  89. enum pistachio_pll_type {
  90. PLL_GF40LP_LAINT,
  91. PLL_GF40LP_FRAC,
  92. };
  93. struct pistachio_pll {
  94. unsigned int id;
  95. unsigned long reg_base;
  96. enum pistachio_pll_type type;
  97. struct pistachio_pll_rate_table *rates;
  98. unsigned int nr_rates;
  99. const char *name;
  100. const char *parent;
  101. };
  102. #define PLL(_id, _name, _pname, _type, _reg, _rates) \
  103. { \
  104. .id = _id, \
  105. .reg_base = _reg, \
  106. .type = _type, \
  107. .rates = _rates, \
  108. .nr_rates = ARRAY_SIZE(_rates), \
  109. .name = _name, \
  110. .parent = _pname, \
  111. }
  112. #define PLL_FIXED(_id, _name, _pname, _type, _reg) \
  113. { \
  114. .id = _id, \
  115. .reg_base = _reg, \
  116. .type = _type, \
  117. .rates = NULL, \
  118. .nr_rates = 0, \
  119. .name = _name, \
  120. .parent = _pname, \
  121. }
  122. struct pistachio_clk_provider {
  123. struct device_node *node;
  124. void __iomem *base;
  125. struct clk_onecell_data clk_data;
  126. };
  127. extern struct pistachio_clk_provider *
  128. pistachio_clk_alloc_provider(struct device_node *node, unsigned int num_clks);
  129. extern void pistachio_clk_register_provider(struct pistachio_clk_provider *p);
  130. extern void pistachio_clk_register_gate(struct pistachio_clk_provider *p,
  131. struct pistachio_gate *gate,
  132. unsigned int num);
  133. extern void pistachio_clk_register_mux(struct pistachio_clk_provider *p,
  134. struct pistachio_mux *mux,
  135. unsigned int num);
  136. extern void pistachio_clk_register_div(struct pistachio_clk_provider *p,
  137. struct pistachio_div *div,
  138. unsigned int num);
  139. extern void
  140. pistachio_clk_register_fixed_factor(struct pistachio_clk_provider *p,
  141. struct pistachio_fixed_factor *ff,
  142. unsigned int num);
  143. extern void pistachio_clk_register_pll(struct pistachio_clk_provider *p,
  144. struct pistachio_pll *pll,
  145. unsigned int num);
  146. extern void pistachio_clk_force_enable(struct pistachio_clk_provider *p,
  147. unsigned int *clk_ids, unsigned int num);
  148. #endif