fsl_lsch2_speed.c 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. /*
  2. * Copyright 2015 Freescale Semiconductor, Inc.
  3. *
  4. * SPDX-License-Identifier: GPL-2.0+
  5. */
  6. #include <common.h>
  7. #include <linux/compiler.h>
  8. #include <asm/io.h>
  9. #include <asm/processor.h>
  10. #include <asm/arch/clock.h>
  11. #include <asm/arch/soc.h>
  12. #include <fsl_ifc.h>
  13. #include "cpu.h"
  14. DECLARE_GLOBAL_DATA_PTR;
  15. #ifndef CONFIG_SYS_FSL_NUM_CC_PLLS
  16. #define CONFIG_SYS_FSL_NUM_CC_PLLS 2
  17. #endif
  18. void get_sys_info(struct sys_info *sys_info)
  19. {
  20. struct ccsr_gur __iomem *gur = (void *)(CONFIG_SYS_FSL_GUTS_ADDR);
  21. #ifdef CONFIG_FSL_IFC
  22. struct fsl_ifc ifc_regs = {(void *)CONFIG_SYS_IFC_ADDR, (void *)NULL};
  23. u32 ccr;
  24. #endif
  25. #if (defined(CONFIG_FSL_ESDHC) &&\
  26. defined(CONFIG_FSL_ESDHC_USE_PERIPHERAL_CLK)) ||\
  27. defined(CONFIG_SYS_DPAA_FMAN)
  28. u32 rcw_tmp;
  29. #endif
  30. struct ccsr_clk *clk = (void *)(CONFIG_SYS_FSL_CLK_ADDR);
  31. unsigned int cpu;
  32. const u8 core_cplx_pll[8] = {
  33. [0] = 0, /* CC1 PPL / 1 */
  34. [1] = 0, /* CC1 PPL / 2 */
  35. [4] = 1, /* CC2 PPL / 1 */
  36. [5] = 1, /* CC2 PPL / 2 */
  37. };
  38. const u8 core_cplx_pll_div[8] = {
  39. [0] = 1, /* CC1 PPL / 1 */
  40. [1] = 2, /* CC1 PPL / 2 */
  41. [4] = 1, /* CC2 PPL / 1 */
  42. [5] = 2, /* CC2 PPL / 2 */
  43. };
  44. uint i, cluster;
  45. uint freq_c_pll[CONFIG_SYS_FSL_NUM_CC_PLLS];
  46. uint ratio[CONFIG_SYS_FSL_NUM_CC_PLLS];
  47. unsigned long sysclk = CONFIG_SYS_CLK_FREQ;
  48. sys_info->freq_systembus = sysclk;
  49. #ifdef CONFIG_DDR_CLK_FREQ
  50. sys_info->freq_ddrbus = CONFIG_DDR_CLK_FREQ;
  51. #else
  52. sys_info->freq_ddrbus = sysclk;
  53. #endif
  54. #ifdef CONFIG_ARCH_LS1012A
  55. sys_info->freq_ddrbus *= (gur_in32(&gur->rcwsr[0]) >>
  56. FSL_CHASSIS2_RCWSR0_SYS_PLL_RAT_SHIFT) &
  57. FSL_CHASSIS2_RCWSR0_SYS_PLL_RAT_MASK;
  58. #else
  59. sys_info->freq_systembus *= (gur_in32(&gur->rcwsr[0]) >>
  60. FSL_CHASSIS2_RCWSR0_SYS_PLL_RAT_SHIFT) &
  61. FSL_CHASSIS2_RCWSR0_SYS_PLL_RAT_MASK;
  62. sys_info->freq_ddrbus *= (gur_in32(&gur->rcwsr[0]) >>
  63. FSL_CHASSIS2_RCWSR0_MEM_PLL_RAT_SHIFT) &
  64. FSL_CHASSIS2_RCWSR0_MEM_PLL_RAT_MASK;
  65. #endif
  66. for (i = 0; i < CONFIG_SYS_FSL_NUM_CC_PLLS; i++) {
  67. ratio[i] = (in_be32(&clk->pllcgsr[i].pllcngsr) >> 1) & 0xff;
  68. if (ratio[i] > 4)
  69. freq_c_pll[i] = sysclk * ratio[i];
  70. else
  71. freq_c_pll[i] = sys_info->freq_systembus * ratio[i];
  72. }
  73. for_each_cpu(i, cpu, cpu_numcores(), cpu_mask()) {
  74. cluster = fsl_qoriq_core_to_cluster(cpu);
  75. u32 c_pll_sel = (in_be32(&clk->clkcsr[cluster].clkcncsr) >> 27)
  76. & 0xf;
  77. u32 cplx_pll = core_cplx_pll[c_pll_sel];
  78. sys_info->freq_processor[cpu] =
  79. freq_c_pll[cplx_pll] / core_cplx_pll_div[c_pll_sel];
  80. }
  81. #ifdef CONFIG_ARCH_LS1012A
  82. sys_info->freq_systembus = sys_info->freq_ddrbus / 2;
  83. sys_info->freq_ddrbus *= 2;
  84. #endif
  85. #define HWA_CGA_M1_CLK_SEL 0xe0000000
  86. #define HWA_CGA_M1_CLK_SHIFT 29
  87. #ifdef CONFIG_SYS_DPAA_FMAN
  88. rcw_tmp = in_be32(&gur->rcwsr[7]);
  89. switch ((rcw_tmp & HWA_CGA_M1_CLK_SEL) >> HWA_CGA_M1_CLK_SHIFT) {
  90. case 2:
  91. sys_info->freq_fman[0] = freq_c_pll[0] / 2;
  92. break;
  93. case 3:
  94. sys_info->freq_fman[0] = freq_c_pll[0] / 3;
  95. break;
  96. case 4:
  97. sys_info->freq_fman[0] = freq_c_pll[0] / 4;
  98. break;
  99. case 5:
  100. sys_info->freq_fman[0] = sys_info->freq_systembus;
  101. break;
  102. case 6:
  103. sys_info->freq_fman[0] = freq_c_pll[1] / 2;
  104. break;
  105. case 7:
  106. sys_info->freq_fman[0] = freq_c_pll[1] / 3;
  107. break;
  108. default:
  109. printf("Error: Unknown FMan1 clock select!\n");
  110. break;
  111. }
  112. #endif
  113. #define HWA_CGA_M2_CLK_SEL 0x00000007
  114. #define HWA_CGA_M2_CLK_SHIFT 0
  115. #ifdef CONFIG_FSL_ESDHC
  116. #ifdef CONFIG_FSL_ESDHC_USE_PERIPHERAL_CLK
  117. rcw_tmp = in_be32(&gur->rcwsr[15]);
  118. switch ((rcw_tmp & HWA_CGA_M2_CLK_SEL) >> HWA_CGA_M2_CLK_SHIFT) {
  119. case 1:
  120. sys_info->freq_sdhc = freq_c_pll[1];
  121. break;
  122. case 2:
  123. sys_info->freq_sdhc = freq_c_pll[1] / 2;
  124. break;
  125. case 3:
  126. sys_info->freq_sdhc = freq_c_pll[1] / 3;
  127. break;
  128. case 6:
  129. sys_info->freq_sdhc = freq_c_pll[0] / 2;
  130. break;
  131. default:
  132. printf("Error: Unknown ESDHC clock select!\n");
  133. break;
  134. }
  135. #else
  136. sys_info->freq_sdhc = sys_info->freq_systembus;
  137. #endif
  138. #endif
  139. #if defined(CONFIG_FSL_IFC)
  140. ccr = ifc_in32(&ifc_regs.gregs->ifc_ccr);
  141. ccr = ((ccr & IFC_CCR_CLK_DIV_MASK) >> IFC_CCR_CLK_DIV_SHIFT) + 1;
  142. sys_info->freq_localbus = sys_info->freq_systembus / ccr;
  143. #endif
  144. }
  145. int get_clocks(void)
  146. {
  147. struct sys_info sys_info;
  148. get_sys_info(&sys_info);
  149. gd->cpu_clk = sys_info.freq_processor[0];
  150. gd->bus_clk = sys_info.freq_systembus;
  151. gd->mem_clk = sys_info.freq_ddrbus;
  152. #ifdef CONFIG_FSL_ESDHC
  153. gd->arch.sdhc_clk = sys_info.freq_sdhc;
  154. #endif
  155. if (gd->cpu_clk != 0)
  156. return 0;
  157. else
  158. return 1;
  159. }
  160. ulong get_bus_freq(ulong dummy)
  161. {
  162. return gd->bus_clk;
  163. }
  164. ulong get_ddr_freq(ulong dummy)
  165. {
  166. return gd->mem_clk;
  167. }
  168. #ifdef CONFIG_FSL_ESDHC
  169. int get_sdhc_freq(ulong dummy)
  170. {
  171. return gd->arch.sdhc_clk;
  172. }
  173. #endif
  174. int get_serial_clock(void)
  175. {
  176. return gd->bus_clk;
  177. }
  178. unsigned int mxc_get_clock(enum mxc_clock clk)
  179. {
  180. switch (clk) {
  181. case MXC_I2C_CLK:
  182. return get_bus_freq(0);
  183. #if defined(CONFIG_FSL_ESDHC)
  184. case MXC_ESDHC_CLK:
  185. return get_sdhc_freq(0);
  186. #endif
  187. case MXC_DSPI_CLK:
  188. return get_bus_freq(0);
  189. case MXC_UART_CLK:
  190. return get_bus_freq(0);
  191. default:
  192. printf("Unsupported clock\n");
  193. }
  194. return 0;
  195. }