cpu.c 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  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 clk_get_cpu_rate(void)
  22. {
  23. int ret;
  24. struct udevice *dev;
  25. ret = uclass_get_device(UCLASS_CLK, 0, &dev);
  26. if (ret) {
  27. panic("uclass-clk: device not found\n");
  28. return 0;
  29. }
  30. return clk_get_rate(dev);
  31. }
  32. /* initialize prefetch module related to cpu_clk */
  33. static void prefetch_init(void)
  34. {
  35. struct pic32_reg_atomic *regs;
  36. const void __iomem *base;
  37. int v, nr_waits;
  38. ulong rate;
  39. /* cpu frequency in MHZ */
  40. rate = clk_get_cpu_rate() / 1000000;
  41. /* get flash ECC type */
  42. base = pic32_get_syscfg_base();
  43. v = (readl(base + CFGCON) >> ECC_SHIFT) & ECC_MASK;
  44. if (v < 2) {
  45. if (rate < 66)
  46. nr_waits = 0;
  47. else if (rate < 133)
  48. nr_waits = 1;
  49. else
  50. nr_waits = 2;
  51. } else {
  52. if (rate <= 83)
  53. nr_waits = 0;
  54. else if (rate <= 166)
  55. nr_waits = 1;
  56. else
  57. nr_waits = 2;
  58. }
  59. regs = ioremap(PREFETCH_BASE + PRECON, sizeof(*regs));
  60. writel(nr_waits, &regs->raw);
  61. /* Enable prefetch for all */
  62. writel(0x30, &regs->set);
  63. iounmap(regs);
  64. }
  65. /* arch specific CPU init after DM */
  66. int arch_cpu_init_dm(void)
  67. {
  68. /* flash prefetch */
  69. prefetch_init();
  70. return 0;
  71. }
  72. /* Un-gate DDR2 modules (gated by default) */
  73. static void ddr2_pmd_ungate(void)
  74. {
  75. void __iomem *regs;
  76. regs = pic32_get_syscfg_base();
  77. writel(0, regs + PMD7);
  78. }
  79. /* initialize the DDR2 Controller and DDR2 PHY */
  80. phys_size_t initdram(int board_type)
  81. {
  82. ddr2_pmd_ungate();
  83. ddr2_phy_init();
  84. ddr2_ctrl_init();
  85. return ddr2_calculate_size();
  86. }
  87. int misc_init_r(void)
  88. {
  89. set_io_port_base(0);
  90. return 0;
  91. }
  92. #ifdef CONFIG_DISPLAY_BOARDINFO
  93. const char *get_core_name(void)
  94. {
  95. u32 proc_id;
  96. const char *str;
  97. proc_id = read_c0_prid();
  98. switch (proc_id) {
  99. case 0x19e28:
  100. str = "PIC32MZ[DA]";
  101. break;
  102. default:
  103. str = "UNKNOWN";
  104. }
  105. return str;
  106. }
  107. #endif
  108. #ifdef CONFIG_CMD_CLK
  109. int soc_clk_dump(void)
  110. {
  111. int i, ret;
  112. struct udevice *dev;
  113. ret = uclass_get_device(UCLASS_CLK, 0, &dev);
  114. if (ret) {
  115. printf("clk-uclass not found\n");
  116. return ret;
  117. }
  118. printf("PLL Speed: %lu MHz\n",
  119. CLK_MHZ(clk_get_periph_rate(dev, PLLCLK)));
  120. printf("CPU Speed: %lu MHz\n", CLK_MHZ(clk_get_rate(dev)));
  121. printf("MPLL Speed: %lu MHz\n",
  122. CLK_MHZ(clk_get_periph_rate(dev, MPLL)));
  123. for (i = PB1CLK; i <= PB7CLK; i++)
  124. printf("PB%d Clock Speed: %lu MHz\n", i - PB1CLK + 1,
  125. CLK_MHZ(clk_get_periph_rate(dev, i)));
  126. for (i = REF1CLK; i <= REF5CLK; i++)
  127. printf("REFO%d Clock Speed: %lu MHz\n", i - REF1CLK + 1,
  128. CLK_MHZ(clk_get_periph_rate(dev, i)));
  129. return 0;
  130. }
  131. #endif