pll-pro4.c 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  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 vpll_init(void)
  13. {
  14. u32 tmp, clk_mode_axosel;
  15. /* Set VPLL27A & VPLL27B */
  16. tmp = readl(SG_PINMON0);
  17. clk_mode_axosel = tmp & SG_PINMON0_CLK_MODE_AXOSEL_MASK;
  18. /* 25MHz or 6.25MHz is default for Pro4R, no need to set VPLLA/B */
  19. if (clk_mode_axosel == SG_PINMON0_CLK_MODE_AXOSEL_25000KHZ ||
  20. clk_mode_axosel == SG_PINMON0_CLK_MODE_AXOSEL_6250KHZ)
  21. return;
  22. /* Disable write protect of VPLL27ACTRL[2-7]*, VPLL27BCTRL[2-8] */
  23. tmp = readl(SC_VPLL27ACTRL);
  24. tmp |= 0x00000001;
  25. writel(tmp, SC_VPLL27ACTRL);
  26. tmp = readl(SC_VPLL27BCTRL);
  27. tmp |= 0x00000001;
  28. writel(tmp, SC_VPLL27BCTRL);
  29. /* Unset VPLA_K_LD and VPLB_K_LD bit */
  30. tmp = readl(SC_VPLL27ACTRL3);
  31. tmp &= ~0x10000000;
  32. writel(tmp, SC_VPLL27ACTRL3);
  33. tmp = readl(SC_VPLL27BCTRL3);
  34. tmp &= ~0x10000000;
  35. writel(tmp, SC_VPLL27BCTRL3);
  36. /* Set VPLA_M and VPLB_M to 0x20 */
  37. tmp = readl(SC_VPLL27ACTRL2);
  38. tmp &= ~0x0000007f;
  39. tmp |= 0x00000020;
  40. writel(tmp, SC_VPLL27ACTRL2);
  41. tmp = readl(SC_VPLL27BCTRL2);
  42. tmp &= ~0x0000007f;
  43. tmp |= 0x00000020;
  44. writel(tmp, SC_VPLL27BCTRL2);
  45. if (clk_mode_axosel == SG_PINMON0_CLK_MODE_AXOSEL_25000KHZ ||
  46. clk_mode_axosel == SG_PINMON0_CLK_MODE_AXOSEL_6250KHZ) {
  47. /* Set VPLA_K and VPLB_K for AXO: 25MHz */
  48. tmp = readl(SC_VPLL27ACTRL3);
  49. tmp &= ~0x000fffff;
  50. tmp |= 0x00066666;
  51. writel(tmp, SC_VPLL27ACTRL3);
  52. tmp = readl(SC_VPLL27BCTRL3);
  53. tmp &= ~0x000fffff;
  54. tmp |= 0x00066666;
  55. writel(tmp, SC_VPLL27BCTRL3);
  56. } else {
  57. /* Set VPLA_K and VPLB_K for AXO: 24.576 MHz */
  58. tmp = readl(SC_VPLL27ACTRL3);
  59. tmp &= ~0x000fffff;
  60. tmp |= 0x000f5800;
  61. writel(tmp, SC_VPLL27ACTRL3);
  62. tmp = readl(SC_VPLL27BCTRL3);
  63. tmp &= ~0x000fffff;
  64. tmp |= 0x000f5800;
  65. writel(tmp, SC_VPLL27BCTRL3);
  66. }
  67. /* wait 1 usec */
  68. udelay(1);
  69. /* Set VPLA_K_LD and VPLB_K_LD to load K parameters */
  70. tmp = readl(SC_VPLL27ACTRL3);
  71. tmp |= 0x10000000;
  72. writel(tmp, SC_VPLL27ACTRL3);
  73. tmp = readl(SC_VPLL27BCTRL3);
  74. tmp |= 0x10000000;
  75. writel(tmp, SC_VPLL27BCTRL3);
  76. /* Unset VPLA_SNRST and VPLB_SNRST bit */
  77. tmp = readl(SC_VPLL27ACTRL2);
  78. tmp |= 0x10000000;
  79. writel(tmp, SC_VPLL27ACTRL2);
  80. tmp = readl(SC_VPLL27BCTRL2);
  81. tmp |= 0x10000000;
  82. writel(tmp, SC_VPLL27BCTRL2);
  83. /* Enable write protect of VPLL27ACTRL[2-7]*, VPLL27BCTRL[2-8] */
  84. tmp = readl(SC_VPLL27ACTRL);
  85. tmp &= ~0x00000001;
  86. writel(tmp, SC_VPLL27ACTRL);
  87. tmp = readl(SC_VPLL27BCTRL);
  88. tmp &= ~0x00000001;
  89. writel(tmp, SC_VPLL27BCTRL);
  90. }
  91. void uniphier_pro4_pll_init(void)
  92. {
  93. vpll_init();
  94. uniphier_ld4_dpll_ssc_en();
  95. }