109-clk-at91-sama7g5-do-not-allow-cpu-pll-to-go-higher-t.patch 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. From 943ed75a2a5ab08582d3bc8025e8111903698763 Mon Sep 17 00:00:00 2001
  2. From: Claudiu Beznea <[email protected]>
  3. Date: Thu, 19 Nov 2020 17:43:15 +0200
  4. Subject: [PATCH 109/247] clk: at91: sama7g5: do not allow cpu pll to go higher
  5. than 1GHz
  6. Since CPU PLL feeds both CPU clock and MCK0, MCK0 cannot go higher
  7. than 200MHz and MCK0 maximum prescaller is 5 limit the CPU PLL at
  8. 1GHz to avoid MCK0 overclocking while CPU PLL is changed by DVFS.
  9. Signed-off-by: Claudiu Beznea <[email protected]>
  10. Link: https://lore.kernel.org/r/[email protected]
  11. Signed-off-by: Stephen Boyd <[email protected]>
  12. ---
  13. drivers/clk/at91/sama7g5.c | 61 +++++++++++++++++++++++++++++---------
  14. 1 file changed, 47 insertions(+), 14 deletions(-)
  15. --- a/drivers/clk/at91/sama7g5.c
  16. +++ b/drivers/clk/at91/sama7g5.c
  17. @@ -89,11 +89,40 @@ static const struct clk_pll_layout pll_l
  18. .endiv_shift = 30,
  19. };
  20. +/*
  21. + * CPU PLL output range.
  22. + * Notice: The upper limit has been setup to 1000000002 due to hardware
  23. + * block which cannot output exactly 1GHz.
  24. + */
  25. +static const struct clk_range cpu_pll_outputs[] = {
  26. + { .min = 2343750, .max = 1000000002 },
  27. +};
  28. +
  29. +/* PLL output range. */
  30. +static const struct clk_range pll_outputs[] = {
  31. + { .min = 2343750, .max = 1200000000 },
  32. +};
  33. +
  34. +/* CPU PLL characteristics. */
  35. +static const struct clk_pll_characteristics cpu_pll_characteristics = {
  36. + .input = { .min = 12000000, .max = 50000000 },
  37. + .num_output = ARRAY_SIZE(cpu_pll_outputs),
  38. + .output = cpu_pll_outputs,
  39. +};
  40. +
  41. +/* PLL characteristics. */
  42. +static const struct clk_pll_characteristics pll_characteristics = {
  43. + .input = { .min = 12000000, .max = 50000000 },
  44. + .num_output = ARRAY_SIZE(pll_outputs),
  45. + .output = pll_outputs,
  46. +};
  47. +
  48. /**
  49. * PLL clocks description
  50. * @n: clock name
  51. * @p: clock parent
  52. * @l: clock layout
  53. + * @c: clock characteristics
  54. * @t: clock type
  55. * @f: clock flags
  56. * @eid: export index in sama7g5->chws[] array
  57. @@ -102,6 +131,7 @@ static const struct {
  58. const char *n;
  59. const char *p;
  60. const struct clk_pll_layout *l;
  61. + const struct clk_pll_characteristics *c;
  62. unsigned long f;
  63. u8 t;
  64. u8 eid;
  65. @@ -110,6 +140,7 @@ static const struct {
  66. { .n = "cpupll_fracck",
  67. .p = "mainck",
  68. .l = &pll_layout_frac,
  69. + .c = &cpu_pll_characteristics,
  70. .t = PLL_TYPE_FRAC,
  71. /*
  72. * This feeds cpupll_divpmcck which feeds CPU. It should
  73. @@ -120,6 +151,7 @@ static const struct {
  74. { .n = "cpupll_divpmcck",
  75. .p = "cpupll_fracck",
  76. .l = &pll_layout_divpmc,
  77. + .c = &cpu_pll_characteristics,
  78. .t = PLL_TYPE_DIV,
  79. /* This feeds CPU. It should not be disabled. */
  80. .f = CLK_IS_CRITICAL | CLK_SET_RATE_PARENT,
  81. @@ -130,6 +162,7 @@ static const struct {
  82. { .n = "syspll_fracck",
  83. .p = "mainck",
  84. .l = &pll_layout_frac,
  85. + .c = &pll_characteristics,
  86. .t = PLL_TYPE_FRAC,
  87. /*
  88. * This feeds syspll_divpmcck which may feed critial parts
  89. @@ -141,6 +174,7 @@ static const struct {
  90. { .n = "syspll_divpmcck",
  91. .p = "syspll_fracck",
  92. .l = &pll_layout_divpmc,
  93. + .c = &pll_characteristics,
  94. .t = PLL_TYPE_DIV,
  95. /*
  96. * This may feed critial parts of the systems like timers.
  97. @@ -154,6 +188,7 @@ static const struct {
  98. { .n = "ddrpll_fracck",
  99. .p = "mainck",
  100. .l = &pll_layout_frac,
  101. + .c = &pll_characteristics,
  102. .t = PLL_TYPE_FRAC,
  103. /*
  104. * This feeds ddrpll_divpmcck which feeds DDR. It should not
  105. @@ -164,6 +199,7 @@ static const struct {
  106. { .n = "ddrpll_divpmcck",
  107. .p = "ddrpll_fracck",
  108. .l = &pll_layout_divpmc,
  109. + .c = &pll_characteristics,
  110. .t = PLL_TYPE_DIV,
  111. /* This feeds DDR. It should not be disabled. */
  112. .f = CLK_IS_CRITICAL | CLK_SET_RATE_GATE, },
  113. @@ -173,12 +209,14 @@ static const struct {
  114. { .n = "imgpll_fracck",
  115. .p = "mainck",
  116. .l = &pll_layout_frac,
  117. + .c = &pll_characteristics,
  118. .t = PLL_TYPE_FRAC,
  119. .f = CLK_SET_RATE_GATE, },
  120. { .n = "imgpll_divpmcck",
  121. .p = "imgpll_fracck",
  122. .l = &pll_layout_divpmc,
  123. + .c = &pll_characteristics,
  124. .t = PLL_TYPE_DIV,
  125. .f = CLK_SET_RATE_GATE | CLK_SET_PARENT_GATE |
  126. CLK_SET_RATE_PARENT, },
  127. @@ -188,12 +226,14 @@ static const struct {
  128. { .n = "baudpll_fracck",
  129. .p = "mainck",
  130. .l = &pll_layout_frac,
  131. + .c = &pll_characteristics,
  132. .t = PLL_TYPE_FRAC,
  133. .f = CLK_SET_RATE_GATE, },
  134. { .n = "baudpll_divpmcck",
  135. .p = "baudpll_fracck",
  136. .l = &pll_layout_divpmc,
  137. + .c = &pll_characteristics,
  138. .t = PLL_TYPE_DIV,
  139. .f = CLK_SET_RATE_GATE | CLK_SET_PARENT_GATE |
  140. CLK_SET_RATE_PARENT, },
  141. @@ -203,12 +243,14 @@ static const struct {
  142. { .n = "audiopll_fracck",
  143. .p = "main_xtal",
  144. .l = &pll_layout_frac,
  145. + .c = &pll_characteristics,
  146. .t = PLL_TYPE_FRAC,
  147. .f = CLK_SET_RATE_GATE, },
  148. { .n = "audiopll_divpmcck",
  149. .p = "audiopll_fracck",
  150. .l = &pll_layout_divpmc,
  151. + .c = &pll_characteristics,
  152. .t = PLL_TYPE_DIV,
  153. .f = CLK_SET_RATE_GATE | CLK_SET_PARENT_GATE |
  154. CLK_SET_RATE_PARENT,
  155. @@ -217,6 +259,7 @@ static const struct {
  156. { .n = "audiopll_diviock",
  157. .p = "audiopll_fracck",
  158. .l = &pll_layout_divio,
  159. + .c = &pll_characteristics,
  160. .t = PLL_TYPE_DIV,
  161. .f = CLK_SET_RATE_GATE | CLK_SET_PARENT_GATE |
  162. CLK_SET_RATE_PARENT,
  163. @@ -227,12 +270,14 @@ static const struct {
  164. { .n = "ethpll_fracck",
  165. .p = "main_xtal",
  166. .l = &pll_layout_frac,
  167. + .c = &pll_characteristics,
  168. .t = PLL_TYPE_FRAC,
  169. .f = CLK_SET_RATE_GATE, },
  170. { .n = "ethpll_divpmcck",
  171. .p = "ethpll_fracck",
  172. .l = &pll_layout_divpmc,
  173. + .c = &pll_characteristics,
  174. .t = PLL_TYPE_DIV,
  175. .f = CLK_SET_RATE_GATE | CLK_SET_PARENT_GATE |
  176. CLK_SET_RATE_PARENT, },
  177. @@ -793,18 +838,6 @@ static const struct {
  178. .pp_chg_id = INT_MIN, },
  179. };
  180. -/* PLL output range. */
  181. -static const struct clk_range pll_outputs[] = {
  182. - { .min = 2343750, .max = 1200000000 },
  183. -};
  184. -
  185. -/* PLL characteristics. */
  186. -static const struct clk_pll_characteristics pll_characteristics = {
  187. - .input = { .min = 12000000, .max = 50000000 },
  188. - .num_output = ARRAY_SIZE(pll_outputs),
  189. - .output = pll_outputs,
  190. -};
  191. -
  192. /* MCK0 characteristics. */
  193. static const struct clk_master_characteristics mck0_characteristics = {
  194. .output = { .min = 50000000, .max = 200000000 },
  195. @@ -921,7 +954,7 @@ static void __init sama7g5_pmc_setup(str
  196. hw = sam9x60_clk_register_frac_pll(regmap,
  197. &pmc_pll_lock, sama7g5_plls[i][j].n,
  198. sama7g5_plls[i][j].p, parent_hw, i,
  199. - &pll_characteristics,
  200. + sama7g5_plls[i][j].c,
  201. sama7g5_plls[i][j].l,
  202. sama7g5_plls[i][j].f);
  203. break;
  204. @@ -930,7 +963,7 @@ static void __init sama7g5_pmc_setup(str
  205. hw = sam9x60_clk_register_div_pll(regmap,
  206. &pmc_pll_lock, sama7g5_plls[i][j].n,
  207. sama7g5_plls[i][j].p, i,
  208. - &pll_characteristics,
  209. + sama7g5_plls[i][j].c,
  210. sama7g5_plls[i][j].l,
  211. sama7g5_plls[i][j].f);
  212. break;