spl.c 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. /*
  2. * SPL specific code for Compulab CM-T335 board
  3. *
  4. * Board functions for Compulab CM-T335 board
  5. *
  6. * Copyright (C) 2013, Compulab Ltd - http://compulab.co.il/
  7. *
  8. * Author: Ilya Ledvich <ilya@compulab.co.il>
  9. *
  10. * SPDX-License-Identifier: GPL-2.0+
  11. */
  12. #include <common.h>
  13. #include <errno.h>
  14. #include <asm/arch/ddr_defs.h>
  15. #include <asm/arch/clock.h>
  16. #include <asm/arch/clocks_am33xx.h>
  17. #include <asm/arch/sys_proto.h>
  18. #include <asm/arch/hardware_am33xx.h>
  19. #include <linux/sizes.h>
  20. const struct ctrl_ioregs ioregs = {
  21. .cm0ioctl = MT41J128MJT125_IOCTRL_VALUE,
  22. .cm1ioctl = MT41J128MJT125_IOCTRL_VALUE,
  23. .cm2ioctl = MT41J128MJT125_IOCTRL_VALUE,
  24. .dt0ioctl = MT41J128MJT125_IOCTRL_VALUE,
  25. .dt1ioctl = MT41J128MJT125_IOCTRL_VALUE,
  26. };
  27. static const struct ddr_data ddr3_data = {
  28. .datardsratio0 = MT41J128MJT125_RD_DQS,
  29. .datawdsratio0 = MT41J128MJT125_WR_DQS,
  30. .datafwsratio0 = MT41J128MJT125_PHY_FIFO_WE,
  31. .datawrsratio0 = MT41J128MJT125_PHY_WR_DATA,
  32. };
  33. static const struct cmd_control ddr3_cmd_ctrl_data = {
  34. .cmd0csratio = MT41J128MJT125_RATIO,
  35. .cmd0iclkout = MT41J128MJT125_INVERT_CLKOUT,
  36. .cmd1csratio = MT41J128MJT125_RATIO,
  37. .cmd1iclkout = MT41J128MJT125_INVERT_CLKOUT,
  38. .cmd2csratio = MT41J128MJT125_RATIO,
  39. .cmd2iclkout = MT41J128MJT125_INVERT_CLKOUT,
  40. };
  41. static struct emif_regs ddr3_emif_reg_data = {
  42. .sdram_config = MT41J128MJT125_EMIF_SDCFG,
  43. .ref_ctrl = MT41J128MJT125_EMIF_SDREF,
  44. .sdram_tim1 = MT41J128MJT125_EMIF_TIM1,
  45. .sdram_tim2 = MT41J128MJT125_EMIF_TIM2,
  46. .sdram_tim3 = MT41J128MJT125_EMIF_TIM3,
  47. .zq_config = MT41J128MJT125_ZQ_CFG,
  48. .emif_ddr_phy_ctlr_1 = MT41J128MJT125_EMIF_READ_LATENCY |
  49. PHY_EN_DYN_PWRDN,
  50. };
  51. const struct dpll_params dpll_ddr = {
  52. /* M N M2 M3 M4 M5 M6 */
  53. 303, (V_OSCK/1000000) - 1, 1, -1, -1, -1, -1};
  54. void am33xx_spl_board_init(void)
  55. {
  56. struct ctrl_dev *cdev = (struct ctrl_dev *)CTRL_DEVICE_BASE;
  57. /* Get the frequency */
  58. dpll_mpu_opp100.m = am335x_get_efuse_mpu_max_freq(cdev);
  59. /* Set CORE Frequencies to OPP100 */
  60. do_setup_dpll(&dpll_core_regs, &dpll_core_opp100);
  61. /* Set MPU Frequency to what we detected now that voltages are set */
  62. do_setup_dpll(&dpll_mpu_regs, &dpll_mpu_opp100);
  63. }
  64. const struct dpll_params *get_dpll_ddr_params(void)
  65. {
  66. return &dpll_ddr;
  67. }
  68. static void probe_sdram_size(long size)
  69. {
  70. switch (size) {
  71. case SZ_512M:
  72. ddr3_emif_reg_data.sdram_config = MT41J256MJT125_EMIF_SDCFG;
  73. break;
  74. case SZ_256M:
  75. ddr3_emif_reg_data.sdram_config = MT41J128MJT125_EMIF_SDCFG;
  76. break;
  77. case SZ_128M:
  78. ddr3_emif_reg_data.sdram_config = MT41J64MJT125_EMIF_SDCFG;
  79. break;
  80. default:
  81. puts("Failed configuring DRAM, resetting...\n\n");
  82. reset_cpu(0);
  83. }
  84. debug("%s: setting DRAM size to %ldM\n", __func__, size >> 20);
  85. config_ddr(303, &ioregs, &ddr3_data,
  86. &ddr3_cmd_ctrl_data, &ddr3_emif_reg_data, 0);
  87. }
  88. void sdram_init(void)
  89. {
  90. long size = SZ_1G;
  91. do {
  92. size = size / 2;
  93. probe_sdram_size(size);
  94. } while (get_ram_size((void *)CONFIG_SYS_SDRAM_BASE, size) < size);
  95. return;
  96. }