clk.c 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  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. {
  17. rt_uint64_t PLL_SYS_0;
  18. rt_uint64_t PLL_SYS_1;
  19. rt_uint64_t PLL_DDR_0;
  20. rt_uint64_t PLL_DDR_1;
  21. rt_uint64_t PLL_DC_0;
  22. rt_uint64_t PLL_DC_1;
  23. rt_uint64_t PLL_PIX0_0;
  24. rt_uint64_t PLL_PIX0_1;
  25. rt_uint64_t PLL_PIX1_0;
  26. rt_uint64_t PLL_PIX1_1;
  27. rt_uint64_t FREQSCALE;
  28. };
  29. /* See the Schematic */
  30. #define SYS_CLKSEL1 1
  31. #define SYS_CLKSEL0 0
  32. /* bit field helpers. */
  33. #define __M(n) (~(~0<<(n)))
  34. #define __RBF(number, n) ((number)&__M(n))
  35. #define __BF(number, n, m) __RBF((number>>m), (n-m+1))
  36. #define BF(number, n, m) (m<n ? __BF(number, n, m) : __BF(number, m, n))
  37. int refclk = 100;
  38. int gmac_clock = 125;
  39. volatile struct loongson_pll *pll = (void *)PLL_SYS_BASE;
  40. unsigned long clk_get_pll_rate(void)
  41. {
  42. return -RT_ENOSYS;
  43. }
  44. unsigned long clk_get_cpu_rate(void)
  45. {
  46. unsigned long node_clock;
  47. int l1_div_ref;
  48. int l1_div_loopc;
  49. int l2_div_out_node;
  50. l1_div_ref = BF(pll->PLL_SYS_0, 26, 31);
  51. l1_div_loopc = BF(pll->PLL_SYS_0, 32, 41);
  52. l2_div_out_node = BF(pll->PLL_SYS_1, 5, 0);
  53. node_clock = refclk / l1_div_ref * l1_div_loopc / l2_div_out_node;
  54. return node_clock;
  55. }
  56. unsigned long clk_get_ddr_rate(void)
  57. {
  58. unsigned long ddr_clock;
  59. int l1_div_ref;
  60. int l1_div_loopc;
  61. int l2_div_out_ddr;
  62. l1_div_ref = BF(pll->PLL_DDR_0, 26, 31);
  63. l1_div_loopc = BF(pll->PLL_DDR_0, 32, 41);
  64. l2_div_out_ddr = BF(pll->PLL_DDR_1, 0, 5);
  65. ddr_clock = refclk / l1_div_ref * l1_div_loopc / l2_div_out_ddr;
  66. return ddr_clock;
  67. }
  68. unsigned long clk_get_apb_rate(void)
  69. {
  70. unsigned long apb_clock;
  71. int apb_freqscale;
  72. apb_freqscale = BF(pll->FREQSCALE, 22, 20);
  73. /* gmac clock is fixed 125MHz */
  74. apb_clock = gmac_clock * (apb_freqscale + 1) / 8;
  75. return apb_clock;
  76. }
  77. unsigned long clk_get_dc_rate(void)
  78. {
  79. return -RT_ENOSYS;
  80. }