r9a09g011-cpg.c 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * RZ/V2M Clock Pulse Generator / Module Standby and Software Reset
  4. *
  5. * Copyright (C) 2022 Renesas Electronics Corp.
  6. *
  7. * Based on r9a07g044-cpg.c
  8. */
  9. #include <linux/clk-provider.h>
  10. #include <linux/device.h>
  11. #include <linux/init.h>
  12. #include <linux/kernel.h>
  13. #include <dt-bindings/clock/r9a09g011-cpg.h>
  14. #include "rzg2l-cpg.h"
  15. #define RZV2M_SAMPLL4_CLK1 0x104
  16. #define RZV2M_SAMPLL4_CLK2 0x108
  17. #define PLL4_CONF (RZV2M_SAMPLL4_CLK1 << 22 | RZV2M_SAMPLL4_CLK2 << 12)
  18. #define DIV_A DDIV_PACK(0x200, 0, 3)
  19. #define DIV_B DDIV_PACK(0x204, 0, 2)
  20. #define DIV_E DDIV_PACK(0x204, 8, 1)
  21. #define DIV_W DDIV_PACK(0x328, 0, 3)
  22. #define SEL_B SEL_PLL_PACK(0x214, 0, 1)
  23. #define SEL_E SEL_PLL_PACK(0x214, 2, 1)
  24. #define SEL_W0 SEL_PLL_PACK(0x32C, 0, 1)
  25. enum clk_ids {
  26. /* Core Clock Outputs exported to DT */
  27. LAST_DT_CORE_CLK = 0,
  28. /* External Input Clocks */
  29. CLK_EXTAL,
  30. /* Internal Core Clocks */
  31. CLK_MAIN,
  32. CLK_MAIN_24,
  33. CLK_MAIN_2,
  34. CLK_PLL1,
  35. CLK_PLL2,
  36. CLK_PLL2_800,
  37. CLK_PLL2_400,
  38. CLK_PLL2_200,
  39. CLK_PLL2_100,
  40. CLK_PLL4,
  41. CLK_DIV_A,
  42. CLK_DIV_B,
  43. CLK_DIV_E,
  44. CLK_DIV_W,
  45. CLK_SEL_B,
  46. CLK_SEL_B_D2,
  47. CLK_SEL_E,
  48. CLK_SEL_W0,
  49. /* Module Clocks */
  50. MOD_CLK_BASE
  51. };
  52. /* Divider tables */
  53. static const struct clk_div_table dtable_diva[] = {
  54. {0, 1},
  55. {1, 2},
  56. {2, 3},
  57. {3, 4},
  58. {4, 6},
  59. {5, 12},
  60. {6, 24},
  61. {0, 0},
  62. };
  63. static const struct clk_div_table dtable_divb[] = {
  64. {0, 1},
  65. {1, 2},
  66. {2, 4},
  67. {3, 8},
  68. {0, 0},
  69. };
  70. static const struct clk_div_table dtable_divw[] = {
  71. {0, 6},
  72. {1, 7},
  73. {2, 8},
  74. {3, 9},
  75. {4, 10},
  76. {5, 11},
  77. {6, 12},
  78. {0, 0},
  79. };
  80. /* Mux clock tables */
  81. static const char * const sel_b[] = { ".main", ".divb" };
  82. static const char * const sel_e[] = { ".main", ".dive" };
  83. static const char * const sel_w[] = { ".main", ".divw" };
  84. static const struct cpg_core_clk r9a09g011_core_clks[] __initconst = {
  85. /* External Clock Inputs */
  86. DEF_INPUT("extal", CLK_EXTAL),
  87. /* Internal Core Clocks */
  88. DEF_FIXED(".main", CLK_MAIN, CLK_EXTAL, 1, 1),
  89. DEF_FIXED(".main_24", CLK_MAIN_24, CLK_MAIN, 1, 2),
  90. DEF_FIXED(".main_2", CLK_MAIN_2, CLK_MAIN, 1, 24),
  91. DEF_FIXED(".pll1", CLK_PLL1, CLK_MAIN_2, 498, 1),
  92. DEF_FIXED(".pll2", CLK_PLL2, CLK_MAIN_2, 800, 1),
  93. DEF_FIXED(".pll2_800", CLK_PLL2_800, CLK_PLL2, 1, 2),
  94. DEF_FIXED(".pll2_400", CLK_PLL2_400, CLK_PLL2_800, 1, 2),
  95. DEF_FIXED(".pll2_200", CLK_PLL2_200, CLK_PLL2_800, 1, 4),
  96. DEF_FIXED(".pll2_100", CLK_PLL2_100, CLK_PLL2_800, 1, 8),
  97. DEF_SAMPLL(".pll4", CLK_PLL4, CLK_MAIN_2, PLL4_CONF),
  98. DEF_DIV_RO(".diva", CLK_DIV_A, CLK_PLL1, DIV_A, dtable_diva),
  99. DEF_DIV_RO(".divb", CLK_DIV_B, CLK_PLL2_400, DIV_B, dtable_divb),
  100. DEF_DIV_RO(".dive", CLK_DIV_E, CLK_PLL2_100, DIV_E, NULL),
  101. DEF_DIV_RO(".divw", CLK_DIV_W, CLK_PLL4, DIV_W, dtable_divw),
  102. DEF_MUX_RO(".selb", CLK_SEL_B, SEL_B, sel_b),
  103. DEF_MUX_RO(".sele", CLK_SEL_E, SEL_E, sel_e),
  104. DEF_MUX(".selw0", CLK_SEL_W0, SEL_W0, sel_w),
  105. DEF_FIXED(".selb_d2", CLK_SEL_B_D2, CLK_SEL_B, 1, 2),
  106. };
  107. static const struct rzg2l_mod_clk r9a09g011_mod_clks[] __initconst = {
  108. DEF_MOD("pfc", R9A09G011_PFC_PCLK, CLK_MAIN, 0x400, 2),
  109. DEF_MOD("gic", R9A09G011_GIC_CLK, CLK_SEL_B_D2, 0x400, 5),
  110. DEF_COUPLED("eth_axi", R9A09G011_ETH0_CLK_AXI, CLK_PLL2_200, 0x40c, 8),
  111. DEF_COUPLED("eth_chi", R9A09G011_ETH0_CLK_CHI, CLK_PLL2_100, 0x40c, 8),
  112. DEF_MOD("eth_clk_gptp", R9A09G011_ETH0_GPTP_EXT, CLK_PLL2_100, 0x40c, 9),
  113. DEF_MOD("syc_cnt_clk", R9A09G011_SYC_CNT_CLK, CLK_MAIN_24, 0x41c, 12),
  114. DEF_MOD("iic_pclk0", R9A09G011_IIC_PCLK0, CLK_SEL_E, 0x420, 12),
  115. DEF_MOD("iic_pclk1", R9A09G011_IIC_PCLK1, CLK_SEL_E, 0x424, 12),
  116. DEF_MOD("wdt0_pclk", R9A09G011_WDT0_PCLK, CLK_SEL_E, 0x428, 12),
  117. DEF_MOD("wdt0_clk", R9A09G011_WDT0_CLK, CLK_MAIN, 0x428, 13),
  118. DEF_MOD("urt_pclk", R9A09G011_URT_PCLK, CLK_SEL_E, 0x438, 4),
  119. DEF_MOD("urt0_clk", R9A09G011_URT0_CLK, CLK_SEL_W0, 0x438, 5),
  120. DEF_MOD("ca53", R9A09G011_CA53_CLK, CLK_DIV_A, 0x448, 0),
  121. };
  122. static const struct rzg2l_reset r9a09g011_resets[] = {
  123. DEF_RST(R9A09G011_PFC_PRESETN, 0x600, 2),
  124. DEF_RST_MON(R9A09G011_ETH0_RST_HW_N, 0x608, 11, 11),
  125. DEF_RST_MON(R9A09G011_SYC_RST_N, 0x610, 9, 13),
  126. DEF_RST(R9A09G011_IIC_GPA_PRESETN, 0x614, 8),
  127. DEF_RST(R9A09G011_IIC_GPB_PRESETN, 0x614, 9),
  128. DEF_RST_MON(R9A09G011_WDT0_PRESETN, 0x614, 12, 19),
  129. };
  130. static const unsigned int r9a09g011_crit_mod_clks[] __initconst = {
  131. MOD_CLK_BASE + R9A09G011_CA53_CLK,
  132. MOD_CLK_BASE + R9A09G011_GIC_CLK,
  133. MOD_CLK_BASE + R9A09G011_SYC_CNT_CLK,
  134. MOD_CLK_BASE + R9A09G011_URT_PCLK,
  135. };
  136. const struct rzg2l_cpg_info r9a09g011_cpg_info = {
  137. /* Core Clocks */
  138. .core_clks = r9a09g011_core_clks,
  139. .num_core_clks = ARRAY_SIZE(r9a09g011_core_clks),
  140. .last_dt_core_clk = LAST_DT_CORE_CLK,
  141. .num_total_core_clks = MOD_CLK_BASE,
  142. /* Critical Module Clocks */
  143. .crit_mod_clks = r9a09g011_crit_mod_clks,
  144. .num_crit_mod_clks = ARRAY_SIZE(r9a09g011_crit_mod_clks),
  145. /* Module Clocks */
  146. .mod_clks = r9a09g011_mod_clks,
  147. .num_mod_clks = ARRAY_SIZE(r9a09g011_mod_clks),
  148. .num_hw_mod_clks = R9A09G011_CA53_CLK + 1,
  149. /* Resets */
  150. .resets = r9a09g011_resets,
  151. .num_resets = ARRAY_SIZE(r9a09g011_resets),
  152. .has_clk_mon_regs = false,
  153. };