spl_ark1668_dongle_sim.c 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. // SPDX-License-Identifier: GPL-2.0+
  2. #include <common.h>
  3. #include <spl.h>
  4. #include <asm/arch/timer.h>
  5. #include <asm/arch/ark1668-sysreg.h>
  6. #include <asm/arch/ark-common.h>
  7. #include <asm-generic/gpio.h>
  8. #define CPUPLL_CLK 500
  9. #if defined(CONFIG_TARGET_ARK1668_FT)
  10. #define AUDPLL_CLK 300
  11. #define SYSPLL_CLK 300
  12. #else
  13. #define AUDPLL_CLK 426
  14. #define SYSPLL_CLK 330
  15. #endif
  16. static void switch_to_main_crystal_osc(void)
  17. {
  18. unsigned int val;
  19. /* set syspll */
  20. write_sys_reg(read_sys_reg(SYS_SYSPLL_CFG) & ~(1 << 14), SYS_SYSPLL_CFG);
  21. timer_delay_us(10);
  22. write_sys_reg(read_sys_reg(SYS_PLLRFCK_CTL) | (1 << 3), SYS_PLLRFCK_CTL);
  23. val = (SYSPLL_CLK / 6) | (0x1C << 8) | (1 << 14) | (1 << 15);
  24. write_sys_reg(val, SYS_SYSPLL_CFG);
  25. /* set audpll */
  26. write_sys_reg(read_sys_reg(SYS_AUDPLL_CFG) & ~(1 << 14), SYS_AUDPLL_CFG);
  27. timer_delay_us(10);
  28. write_sys_reg(read_sys_reg(SYS_PLLRFCK_CTL) | (1 << 6), SYS_PLLRFCK_CTL);
  29. val = (AUDPLL_CLK / 6) | (0x1C << 8) | (1 << 14) | (1 << 15);
  30. write_sys_reg(val, SYS_AUDPLL_CFG);
  31. /* set cpupll */
  32. write_sys_reg(read_sys_reg(SYS_CPUPLL_CFG) & ~(1 << 14), SYS_CPUPLL_CFG);
  33. timer_delay_us(10);
  34. write_sys_reg(read_sys_reg(SYS_PLLRFCK_CTL) | (1 << 0), SYS_PLLRFCK_CTL);
  35. val = (CPUPLL_CLK / 6) | (0x1C << 8) | (1 << 14) | (1 << 15);
  36. write_sys_reg(val, SYS_CPUPLL_CFG);
  37. timer_delay_us(6000);
  38. /* set system clock */
  39. val = read_sys_reg(SYS_CLK_SEL);
  40. val &= ~0x7ffff;
  41. val |= (1 << 18) | (0 << 16) | (1 << 13) | (1 << 9) | (2 << 6) | (1 << 2) | 1;
  42. write_sys_reg(val, SYS_CLK_SEL);
  43. timer_delay_us(10);
  44. /* set ddr3 clock */
  45. val = read_sys_reg(SYS_DEVICE_CLK_CFG3);
  46. val &= ~(0x7f << 18);
  47. val |= (2 << 18); //select audpll
  48. write_sys_reg(val, SYS_DEVICE_CLK_CFG3);
  49. timer_delay_us(10);
  50. /* cpu clock switch to cpupll */
  51. val = read_sys_reg(SYS_CLK_SEL);;
  52. val &= ~(0x7 << 19);
  53. write_sys_reg(val, SYS_CLK_SEL);
  54. timer_delay_us(10);
  55. }
  56. void board_init_f(ulong dummy)
  57. {
  58. write_sys_reg(0, SYS_IO_DRIVER01);
  59. write_sys_reg(0, SYS_IO_DRIVER02);
  60. timer_init_24M();
  61. write_sys_reg(read_sys_reg(SYS_DDR_IO_CFG) & ~7, SYS_DDR_IO_CFG);
  62. gpio_direction_output(8, 0);
  63. udelay(1);
  64. switch_to_main_crystal_osc();
  65. timer_init();
  66. board_early_init_f();
  67. preloader_console_init();
  68. mem_init();
  69. }