sama5d27_som1_ek.c 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Copyright (C) 2017 Microchip Corporation
  4. * Wenyou.Yang <wenyou.yang@microchip.com>
  5. */
  6. #include <common.h>
  7. #include <debug_uart.h>
  8. #include <asm/io.h>
  9. #include <asm/arch/at91_common.h>
  10. #include <asm/arch/atmel_pio4.h>
  11. #include <asm/arch/atmel_mpddrc.h>
  12. #include <asm/arch/atmel_sdhci.h>
  13. #include <asm/arch/clk.h>
  14. #include <asm/arch/gpio.h>
  15. #include <asm/arch/sama5d2.h>
  16. extern void at91_pda_detect(void);
  17. DECLARE_GLOBAL_DATA_PTR;
  18. static void board_usb_hw_init(void)
  19. {
  20. atmel_pio4_set_pio_output(AT91_PIO_PORTA, 27, 1);
  21. }
  22. #ifdef CONFIG_BOARD_LATE_INIT
  23. int board_late_init(void)
  24. {
  25. #ifdef CONFIG_DM_VIDEO
  26. at91_video_show_board_info();
  27. #endif
  28. at91_pda_detect();
  29. return 0;
  30. }
  31. #endif
  32. #ifdef CONFIG_DEBUG_UART_BOARD_INIT
  33. static void board_uart1_hw_init(void)
  34. {
  35. atmel_pio4_set_a_periph(AT91_PIO_PORTD, 2, ATMEL_PIO_PUEN_MASK); /* URXD1 */
  36. atmel_pio4_set_a_periph(AT91_PIO_PORTD, 3, 0); /* UTXD1 */
  37. at91_periph_clk_enable(ATMEL_ID_UART1);
  38. }
  39. void board_debug_uart_init(void)
  40. {
  41. board_uart1_hw_init();
  42. }
  43. #endif
  44. #ifdef CONFIG_BOARD_EARLY_INIT_F
  45. int board_early_init_f(void)
  46. {
  47. #ifdef CONFIG_DEBUG_UART
  48. debug_uart_init();
  49. #endif
  50. return 0;
  51. }
  52. #endif
  53. int board_init(void)
  54. {
  55. /* address of boot parameters */
  56. gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100;
  57. #ifdef CONFIG_CMD_USB
  58. board_usb_hw_init();
  59. #endif
  60. return 0;
  61. }
  62. int dram_init(void)
  63. {
  64. gd->ram_size = get_ram_size((void *)CONFIG_SYS_SDRAM_BASE,
  65. CONFIG_SYS_SDRAM_SIZE);
  66. return 0;
  67. }
  68. #define MAC24AA_MAC_OFFSET 0xfa
  69. #ifdef CONFIG_MISC_INIT_R
  70. int misc_init_r(void)
  71. {
  72. #ifdef CONFIG_I2C_EEPROM
  73. at91_set_ethaddr(MAC24AA_MAC_OFFSET);
  74. #endif
  75. return 0;
  76. }
  77. #endif
  78. /* SPL */
  79. #ifdef CONFIG_SPL_BUILD
  80. void spl_board_init(void)
  81. {
  82. }
  83. static void ddrc_conf(struct atmel_mpddrc_config *ddrc)
  84. {
  85. ddrc->md = (ATMEL_MPDDRC_MD_DBW_16_BITS | ATMEL_MPDDRC_MD_DDR2_SDRAM);
  86. ddrc->cr = (ATMEL_MPDDRC_CR_NC_COL_10 |
  87. ATMEL_MPDDRC_CR_NR_ROW_13 |
  88. ATMEL_MPDDRC_CR_CAS_DDR_CAS3 |
  89. ATMEL_MPDDRC_CR_DIC_DS |
  90. ATMEL_MPDDRC_CR_ZQ_LONG |
  91. ATMEL_MPDDRC_CR_NB_8BANKS |
  92. ATMEL_MPDDRC_CR_DECOD_INTERLEAVED |
  93. ATMEL_MPDDRC_CR_UNAL_SUPPORTED);
  94. ddrc->rtr = 0x511;
  95. ddrc->tpr0 = ((7 << ATMEL_MPDDRC_TPR0_TRAS_OFFSET) |
  96. (3 << ATMEL_MPDDRC_TPR0_TRCD_OFFSET) |
  97. (3 << ATMEL_MPDDRC_TPR0_TWR_OFFSET) |
  98. (9 << ATMEL_MPDDRC_TPR0_TRC_OFFSET) |
  99. (3 << ATMEL_MPDDRC_TPR0_TRP_OFFSET) |
  100. (4 << ATMEL_MPDDRC_TPR0_TRRD_OFFSET) |
  101. (4 << ATMEL_MPDDRC_TPR0_TWTR_OFFSET) |
  102. (2 << ATMEL_MPDDRC_TPR0_TMRD_OFFSET));
  103. ddrc->tpr1 = ((22 << ATMEL_MPDDRC_TPR1_TRFC_OFFSET) |
  104. (23 << ATMEL_MPDDRC_TPR1_TXSNR_OFFSET) |
  105. (200 << ATMEL_MPDDRC_TPR1_TXSRD_OFFSET) |
  106. (3 << ATMEL_MPDDRC_TPR1_TXP_OFFSET));
  107. ddrc->tpr2 = ((2 << ATMEL_MPDDRC_TPR2_TXARD_OFFSET) |
  108. (8 << ATMEL_MPDDRC_TPR2_TXARDS_OFFSET) |
  109. (4 << ATMEL_MPDDRC_TPR2_TRPA_OFFSET) |
  110. (4 << ATMEL_MPDDRC_TPR2_TRTP_OFFSET) |
  111. (8 << ATMEL_MPDDRC_TPR2_TFAW_OFFSET));
  112. }
  113. void mem_init(void)
  114. {
  115. struct at91_pmc *pmc = (struct at91_pmc *)ATMEL_BASE_PMC;
  116. struct atmel_mpddr *mpddrc = (struct atmel_mpddr *)ATMEL_BASE_MPDDRC;
  117. struct atmel_mpddrc_config ddrc_config;
  118. u32 reg;
  119. ddrc_conf(&ddrc_config);
  120. at91_periph_clk_enable(ATMEL_ID_MPDDRC);
  121. writel(AT91_PMC_DDR, &pmc->scer);
  122. reg = readl(&mpddrc->io_calibr);
  123. reg &= ~ATMEL_MPDDRC_IO_CALIBR_RDIV;
  124. reg |= ATMEL_MPDDRC_IO_CALIBR_DDR3_RZQ_55;
  125. reg &= ~ATMEL_MPDDRC_IO_CALIBR_TZQIO;
  126. reg |= ATMEL_MPDDRC_IO_CALIBR_TZQIO_(101);
  127. writel(reg, &mpddrc->io_calibr);
  128. writel(ATMEL_MPDDRC_RD_DATA_PATH_SHIFT_ONE_CYCLE,
  129. &mpddrc->rd_data_path);
  130. ddr3_init(ATMEL_BASE_MPDDRC, ATMEL_BASE_DDRCS, &ddrc_config);
  131. writel(0x3, &mpddrc->cal_mr4);
  132. writel(64, &mpddrc->tim_cal);
  133. }
  134. void at91_pmc_init(void)
  135. {
  136. u32 tmp;
  137. /*
  138. * while coming from the ROM code, we run on PLLA @ 492 MHz / 164 MHz
  139. * so we need to slow down and configure MCKR accordingly.
  140. * This is why we have a special flavor of the switching function.
  141. */
  142. tmp = AT91_PMC_MCKR_PLLADIV_2 |
  143. AT91_PMC_MCKR_MDIV_3 |
  144. AT91_PMC_MCKR_CSS_MAIN;
  145. at91_mck_init_down(tmp);
  146. tmp = AT91_PMC_PLLAR_29 |
  147. AT91_PMC_PLLXR_PLLCOUNT(0x3f) |
  148. AT91_PMC_PLLXR_MUL(40) |
  149. AT91_PMC_PLLXR_DIV(1);
  150. at91_plla_init(tmp);
  151. tmp = AT91_PMC_MCKR_H32MXDIV |
  152. AT91_PMC_MCKR_PLLADIV_2 |
  153. AT91_PMC_MCKR_MDIV_3 |
  154. AT91_PMC_MCKR_CSS_PLLA;
  155. at91_mck_init(tmp);
  156. }
  157. #endif