cpu.c 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. /*
  2. * Copyright (C) 2015
  3. * Purna Chandra Mandal <purna.mandal@microchip.com>
  4. *
  5. * SPDX-License-Identifier: GPL-2.0+
  6. *
  7. */
  8. #include <common.h>
  9. #include <clk.h>
  10. #include <dm.h>
  11. #include <mach/pic32.h>
  12. #include <mach/ddr.h>
  13. #include <dt-bindings/clock/microchip,clock.h>
  14. /* Flash prefetch */
  15. #define PRECON 0x00
  16. /* Flash ECCCON */
  17. #define ECC_MASK 0x03
  18. #define ECC_SHIFT 4
  19. #define CLK_MHZ(x) ((x) / 1000000)
  20. DECLARE_GLOBAL_DATA_PTR;
  21. static ulong rate(int id)
  22. {
  23. int ret;
  24. struct udevice *dev;
  25. struct clk clk;
  26. ulong rate;
  27. ret = uclass_get_device(UCLASS_CLK, 0, &dev);
  28. if (ret) {
  29. printf("clk-uclass not found\n");
  30. return 0;
  31. }
  32. clk.id = id;
  33. ret = clk_request(dev, &clk);
  34. if (ret < 0)
  35. return ret;
  36. rate = clk_get_rate(&clk);
  37. clk_free(&clk);
  38. return rate;
  39. }
  40. static ulong clk_get_cpu_rate(void)
  41. {
  42. return rate(PB7CLK);
  43. }
  44. /* initialize prefetch module related to cpu_clk */
  45. static void prefetch_init(void)
  46. {
  47. struct pic32_reg_atomic *regs;
  48. const void __iomem *base;
  49. int v, nr_waits;
  50. ulong rate;
  51. /* cpu frequency in MHZ */
  52. rate = clk_get_cpu_rate() / 1000000;
  53. /* get flash ECC type */
  54. base = pic32_get_syscfg_base();
  55. v = (readl(base + CFGCON) >> ECC_SHIFT) & ECC_MASK;
  56. if (v < 2) {
  57. if (rate < 66)
  58. nr_waits = 0;
  59. else if (rate < 133)
  60. nr_waits = 1;
  61. else
  62. nr_waits = 2;
  63. } else {
  64. if (rate <= 83)
  65. nr_waits = 0;
  66. else if (rate <= 166)
  67. nr_waits = 1;
  68. else
  69. nr_waits = 2;
  70. }
  71. regs = ioremap(PREFETCH_BASE + PRECON, sizeof(*regs));
  72. writel(nr_waits, &regs->raw);
  73. /* Enable prefetch for all */
  74. writel(0x30, &regs->set);
  75. iounmap(regs);
  76. }
  77. /* arch specific CPU init after DM */
  78. int arch_cpu_init_dm(void)
  79. {
  80. /* flash prefetch */
  81. prefetch_init();
  82. return 0;
  83. }
  84. /* Un-gate DDR2 modules (gated by default) */
  85. static void ddr2_pmd_ungate(void)
  86. {
  87. void __iomem *regs;
  88. regs = pic32_get_syscfg_base();
  89. writel(0, regs + PMD7);
  90. }
  91. /* initialize the DDR2 Controller and DDR2 PHY */
  92. phys_size_t initdram(int board_type)
  93. {
  94. ddr2_pmd_ungate();
  95. ddr2_phy_init();
  96. ddr2_ctrl_init();
  97. return ddr2_calculate_size();
  98. }
  99. int misc_init_r(void)
  100. {
  101. set_io_port_base(0);
  102. return 0;
  103. }
  104. #ifdef CONFIG_DISPLAY_BOARDINFO
  105. const char *get_core_name(void)
  106. {
  107. u32 proc_id;
  108. const char *str;
  109. proc_id = read_c0_prid();
  110. switch (proc_id) {
  111. case 0x19e28:
  112. str = "PIC32MZ[DA]";
  113. break;
  114. default:
  115. str = "UNKNOWN";
  116. }
  117. return str;
  118. }
  119. #endif
  120. #ifdef CONFIG_CMD_CLK
  121. int soc_clk_dump(void)
  122. {
  123. int i;
  124. printf("PLL Speed: %lu MHz\n",
  125. CLK_MHZ(rate(PLLCLK)));
  126. printf("CPU Speed: %lu MHz\n", CLK_MHZ(rate(PB7CLK)));
  127. printf("MPLL Speed: %lu MHz\n", CLK_MHZ(rate(MPLL)));
  128. for (i = PB1CLK; i <= PB7CLK; i++)
  129. printf("PB%d Clock Speed: %lu MHz\n", i - PB1CLK + 1,
  130. CLK_MHZ(rate(i)));
  131. for (i = REF1CLK; i <= REF5CLK; i++)
  132. printf("REFO%d Clock Speed: %lu MHz\n", i - REF1CLK + 1,
  133. CLK_MHZ(rate(i)));
  134. return 0;
  135. }
  136. #endif