pll-ld4.c 3.5 KB

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