clk.c 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. /*
  2. * Copyright (c) 2006-2018, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2017-09-06 勤为本 first version
  9. *
  10. * Copyright (c) 2020, duhuanpeng<548708880@qq.com>
  11. * legacy driver APIs from loongson 1C BSP.
  12. */
  13. #include <rtthread.h>
  14. #include "ls2k1000.h"
  15. struct loongson_pll {
  16. rt_uint64_t PLL_SYS_0;
  17. rt_uint64_t PLL_SYS_1;
  18. rt_uint64_t PLL_DDR_0;
  19. rt_uint64_t PLL_DDR_1;
  20. rt_uint64_t PLL_DC_0;
  21. rt_uint64_t PLL_DC_1;
  22. rt_uint64_t PLL_PIX0_0;
  23. rt_uint64_t PLL_PIX0_1;
  24. rt_uint64_t PLL_PIX1_0;
  25. rt_uint64_t PLL_PIX1_1;
  26. rt_uint64_t FREQSCALE;
  27. };
  28. /* See the Schematic */
  29. #define SYS_CLKSEL1 1
  30. #define SYS_CLKSEL0 0
  31. /* bit field helpers. */
  32. #define __M(n) (~(~0<<(n)))
  33. #define __RBF(number, n) ((number)&__M(n))
  34. #define __BF(number, n, m) __RBF((number>>m), (n-m+1))
  35. #define BF(number, n, m) (m<n ? __BF(number, n, m) : __BF(number, m, n))
  36. int refclk = 100;
  37. int gmac_clock = 125;
  38. volatile struct loongson_pll *pll = (void *)PLL_SYS_BASE;
  39. unsigned long clk_get_pll_rate(void)
  40. {
  41. return -RT_ENOSYS;
  42. }
  43. unsigned long clk_get_cpu_rate(void)
  44. {
  45. unsigned long node_clock;
  46. int l1_div_ref;
  47. int l1_div_loopc;
  48. int l2_div_out_node;
  49. l1_div_ref = BF(pll->PLL_SYS_0, 26, 31);
  50. l1_div_loopc = BF(pll->PLL_SYS_0, 32, 41);
  51. l2_div_out_node = BF(pll->PLL_SYS_1, 5, 0);
  52. node_clock = refclk / l1_div_ref * l1_div_loopc / l2_div_out_node;
  53. return node_clock;
  54. }
  55. unsigned long clk_get_ddr_rate(void)
  56. {
  57. unsigned long ddr_clock;
  58. int l1_div_ref;
  59. int l1_div_loopc;
  60. int l2_div_out_ddr;
  61. l1_div_ref = BF(pll->PLL_DDR_0, 26, 31);
  62. l1_div_loopc = BF(pll->PLL_DDR_0, 32, 41);
  63. l2_div_out_ddr = BF(pll->PLL_DDR_1, 0, 5);
  64. ddr_clock = refclk / l1_div_ref * l1_div_loopc / l2_div_out_ddr;
  65. return ddr_clock;
  66. }
  67. unsigned long clk_get_apb_rate(void)
  68. {
  69. unsigned long apb_clock;
  70. int apb_freqscale;
  71. apb_freqscale = BF(pll->FREQSCALE, 22, 20);
  72. /* gmac clock is fixed 125MHz */
  73. apb_clock = gmac_clock * (apb_freqscale + 1) / 8;
  74. return apb_clock;
  75. }
  76. unsigned long clk_get_dc_rate(void)
  77. {
  78. return -RT_ENOSYS;
  79. }