pll-ld4.c 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Copyright (C) 2013-2014 Panasonic Corporation
  4. * Copyright (C) 2015-2016 Socionext Inc.
  5. */
  6. #include <linux/delay.h>
  7. #include <linux/io.h>
  8. #include "../init.h"
  9. #include "../sc-regs.h"
  10. #include "../sg-regs.h"
  11. #include "pll.h"
  12. static void upll_init(void)
  13. {
  14. u32 tmp, clk_mode_upll, clk_mode_axosel;
  15. tmp = readl(SG_PINMON0);
  16. clk_mode_upll = tmp & SG_PINMON0_CLK_MODE_UPLLSRC_MASK;
  17. clk_mode_axosel = tmp & SG_PINMON0_CLK_MODE_AXOSEL_MASK;
  18. /* set 0 to SNRT(UPLLCTRL.bit28) and K_LD(UPLLCTRL.bit[27]) */
  19. tmp = readl(SC_UPLLCTRL);
  20. tmp &= ~0x18000000;
  21. writel(tmp, SC_UPLLCTRL);
  22. if (clk_mode_upll == SG_PINMON0_CLK_MODE_UPLLSRC_DEFAULT) {
  23. if (clk_mode_axosel == SG_PINMON0_CLK_MODE_AXOSEL_25000KHZ_U ||
  24. clk_mode_axosel == SG_PINMON0_CLK_MODE_AXOSEL_25000KHZ_A) {
  25. /* AXO: 25MHz */
  26. tmp &= ~0x07ffffff;
  27. tmp |= 0x0228f5c0;
  28. } else {
  29. /* AXO: default 24.576MHz */
  30. tmp &= ~0x07ffffff;
  31. tmp |= 0x02328000;
  32. }
  33. }
  34. writel(tmp, SC_UPLLCTRL);
  35. /* set 1 to K_LD(UPLLCTRL.bit[27]) */
  36. tmp |= 0x08000000;
  37. writel(tmp, SC_UPLLCTRL);
  38. /* wait 10 usec */
  39. udelay(10);
  40. /* set 1 to SNRT(UPLLCTRL.bit[28]) */
  41. tmp |= 0x10000000;
  42. writel(tmp, SC_UPLLCTRL);
  43. }
  44. static void vpll_init(void)
  45. {
  46. u32 tmp, clk_mode_axosel;
  47. tmp = readl(SG_PINMON0);
  48. clk_mode_axosel = tmp & SG_PINMON0_CLK_MODE_AXOSEL_MASK;
  49. /* set 1 to VPLA27WP and VPLA27WP */
  50. tmp = readl(SC_VPLL27ACTRL);
  51. tmp |= 0x00000001;
  52. writel(tmp, SC_VPLL27ACTRL);
  53. tmp = readl(SC_VPLL27BCTRL);
  54. tmp |= 0x00000001;
  55. writel(tmp, SC_VPLL27BCTRL);
  56. /* Set 0 to VPLA_K_LD and VPLB_K_LD */
  57. tmp = readl(SC_VPLL27ACTRL3);
  58. tmp &= ~0x10000000;
  59. writel(tmp, SC_VPLL27ACTRL3);
  60. tmp = readl(SC_VPLL27BCTRL3);
  61. tmp &= ~0x10000000;
  62. writel(tmp, SC_VPLL27BCTRL3);
  63. /* Set 0 to VPLA_SNRST and VPLB_SNRST */
  64. tmp = readl(SC_VPLL27ACTRL2);
  65. tmp &= ~0x10000000;
  66. writel(tmp, SC_VPLL27ACTRL2);
  67. tmp = readl(SC_VPLL27BCTRL2);
  68. tmp &= ~0x10000000;
  69. writel(tmp, SC_VPLL27BCTRL2);
  70. /* Set 0x20 to VPLA_SNRST and VPLB_SNRST */
  71. tmp = readl(SC_VPLL27ACTRL2);
  72. tmp &= ~0x0000007f;
  73. tmp |= 0x00000020;
  74. writel(tmp, SC_VPLL27ACTRL2);
  75. tmp = readl(SC_VPLL27BCTRL2);
  76. tmp &= ~0x0000007f;
  77. tmp |= 0x00000020;
  78. writel(tmp, SC_VPLL27BCTRL2);
  79. if (clk_mode_axosel == SG_PINMON0_CLK_MODE_AXOSEL_25000KHZ_U ||
  80. clk_mode_axosel == SG_PINMON0_CLK_MODE_AXOSEL_25000KHZ_A) {
  81. /* AXO: 25MHz */
  82. tmp = readl(SC_VPLL27ACTRL3);
  83. tmp &= ~0x000fffff;
  84. tmp |= 0x00066664;
  85. writel(tmp, SC_VPLL27ACTRL3);
  86. tmp = readl(SC_VPLL27BCTRL3);
  87. tmp &= ~0x000fffff;
  88. tmp |= 0x00066664;
  89. writel(tmp, SC_VPLL27BCTRL3);
  90. } else {
  91. /* AXO: default 24.576MHz */
  92. tmp = readl(SC_VPLL27ACTRL3);
  93. tmp &= ~0x000fffff;
  94. tmp |= 0x000f5800;
  95. writel(tmp, SC_VPLL27ACTRL3);
  96. tmp = readl(SC_VPLL27BCTRL3);
  97. tmp &= ~0x000fffff;
  98. tmp |= 0x000f5800;
  99. writel(tmp, SC_VPLL27BCTRL3);
  100. }
  101. /* Set 1 to VPLA_K_LD and VPLB_K_LD */
  102. tmp = readl(SC_VPLL27ACTRL3);
  103. tmp |= 0x10000000;
  104. writel(tmp, SC_VPLL27ACTRL3);
  105. tmp = readl(SC_VPLL27BCTRL3);
  106. tmp |= 0x10000000;
  107. writel(tmp, SC_VPLL27BCTRL3);
  108. /* wait 10 usec */
  109. udelay(10);
  110. /* Set 0 to VPLA_SNRST and VPLB_SNRST */
  111. tmp = readl(SC_VPLL27ACTRL2);
  112. tmp |= 0x10000000;
  113. writel(tmp, SC_VPLL27ACTRL2);
  114. tmp = readl(SC_VPLL27BCTRL2);
  115. tmp |= 0x10000000;
  116. writel(tmp, SC_VPLL27BCTRL2);
  117. /* set 0 to VPLA27WP and VPLA27WP */
  118. tmp = readl(SC_VPLL27ACTRL);
  119. tmp &= ~0x00000001;
  120. writel(tmp, SC_VPLL27ACTRL);
  121. tmp = readl(SC_VPLL27BCTRL);
  122. tmp |= ~0x00000001;
  123. writel(tmp, SC_VPLL27BCTRL);
  124. }
  125. void uniphier_ld4_pll_init(void)
  126. {
  127. upll_init();
  128. vpll_init();
  129. uniphier_ld4_dpll_ssc_en();
  130. }