board.c 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. /*
  2. * board.c
  3. *
  4. * Board functions for Phytec phyCORE-AM335x (pcm051) based boards
  5. *
  6. * Copyright (C) 2013 Lemonage Software GmbH
  7. * Author Lars Poeschel <poeschel@lemonage.de>
  8. *
  9. * SPDX-License-Identifier: GPL-2.0+
  10. */
  11. #include <common.h>
  12. #include <errno.h>
  13. #include <spl.h>
  14. #include <asm/arch/cpu.h>
  15. #include <asm/arch/hardware.h>
  16. #include <asm/arch/omap.h>
  17. #include <asm/arch/ddr_defs.h>
  18. #include <asm/arch/clock.h>
  19. #include <asm/arch/gpio.h>
  20. #include <asm/arch/mmc_host_def.h>
  21. #include <asm/arch/sys_proto.h>
  22. #include <asm/io.h>
  23. #include <asm/emif.h>
  24. #include <asm/gpio.h>
  25. #include <i2c.h>
  26. #include <miiphy.h>
  27. #include <cpsw.h>
  28. #include "board.h"
  29. DECLARE_GLOBAL_DATA_PTR;
  30. /* MII mode defines */
  31. #define MII_MODE_ENABLE 0x0
  32. #define RGMII_MODE_ENABLE 0xA
  33. #define RMII_RGMII2_MODE_ENABLE 0x49
  34. static struct ctrl_dev *cdev = (struct ctrl_dev *)CTRL_DEVICE_BASE;
  35. #ifdef CONFIG_SPL_BUILD
  36. /* DDR RAM defines */
  37. #define DDR_CLK_MHZ 303 /* DDR_DPLL_MULT value */
  38. #define OSC (V_OSCK/1000000)
  39. const struct dpll_params dpll_ddr = {
  40. DDR_CLK_MHZ, OSC-1, 1, -1, -1, -1, -1};
  41. const struct dpll_params *get_dpll_ddr_params(void)
  42. {
  43. return &dpll_ddr;
  44. }
  45. static const struct ddr_data ddr3_data = {
  46. .datardsratio0 = MT41J256M8HX15E_RD_DQS,
  47. .datawdsratio0 = MT41J256M8HX15E_WR_DQS,
  48. .datafwsratio0 = MT41J256M8HX15E_PHY_FIFO_WE,
  49. .datawrsratio0 = MT41J256M8HX15E_PHY_WR_DATA,
  50. .datadldiff0 = PHY_DLL_LOCK_DIFF,
  51. };
  52. static const struct cmd_control ddr3_cmd_ctrl_data = {
  53. .cmd0csratio = MT41J256M8HX15E_RATIO,
  54. .cmd0dldiff = MT41J256M8HX15E_DLL_LOCK_DIFF,
  55. .cmd0iclkout = MT41J256M8HX15E_INVERT_CLKOUT,
  56. .cmd1csratio = MT41J256M8HX15E_RATIO,
  57. .cmd1dldiff = MT41J256M8HX15E_DLL_LOCK_DIFF,
  58. .cmd1iclkout = MT41J256M8HX15E_INVERT_CLKOUT,
  59. .cmd2csratio = MT41J256M8HX15E_RATIO,
  60. .cmd2dldiff = MT41J256M8HX15E_DLL_LOCK_DIFF,
  61. .cmd2iclkout = MT41J256M8HX15E_INVERT_CLKOUT,
  62. };
  63. static struct emif_regs ddr3_emif_reg_data = {
  64. .sdram_config = MT41J256M8HX15E_EMIF_SDCFG,
  65. .ref_ctrl = MT41J256M8HX15E_EMIF_SDREF,
  66. .sdram_tim1 = MT41J256M8HX15E_EMIF_TIM1,
  67. .sdram_tim2 = MT41J256M8HX15E_EMIF_TIM2,
  68. .sdram_tim3 = MT41J256M8HX15E_EMIF_TIM3,
  69. .zq_config = MT41J256M8HX15E_ZQ_CFG,
  70. .emif_ddr_phy_ctlr_1 = MT41J256M8HX15E_EMIF_READ_LATENCY |
  71. PHY_EN_DYN_PWRDN,
  72. };
  73. void set_uart_mux_conf(void)
  74. {
  75. enable_uart0_pin_mux();
  76. }
  77. void set_mux_conf_regs(void)
  78. {
  79. /* Initalize the board header */
  80. enable_i2c0_pin_mux();
  81. i2c_init(CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE);
  82. enable_board_pin_mux();
  83. }
  84. void sdram_init(void)
  85. {
  86. config_ddr(DDR_CLK_MHZ, MT41J256M8HX15E_IOCTRL_VALUE, &ddr3_data,
  87. &ddr3_cmd_ctrl_data, &ddr3_emif_reg_data, 0);
  88. }
  89. #endif
  90. /*
  91. * Basic board specific setup. Pinmux has been handled already.
  92. */
  93. int board_init(void)
  94. {
  95. i2c_init(CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE);
  96. gd->bd->bi_boot_params = PHYS_DRAM_1 + 0x100;
  97. return 0;
  98. }
  99. #ifdef CONFIG_DRIVER_TI_CPSW
  100. static void cpsw_control(int enabled)
  101. {
  102. /* VTP can be added here */
  103. return;
  104. }
  105. static struct cpsw_slave_data cpsw_slaves[] = {
  106. {
  107. .slave_reg_ofs = 0x208,
  108. .sliver_reg_ofs = 0xd80,
  109. .phy_id = 0,
  110. .phy_if = PHY_INTERFACE_MODE_RGMII,
  111. },
  112. {
  113. .slave_reg_ofs = 0x308,
  114. .sliver_reg_ofs = 0xdc0,
  115. .phy_id = 1,
  116. .phy_if = PHY_INTERFACE_MODE_RGMII,
  117. },
  118. };
  119. static struct cpsw_platform_data cpsw_data = {
  120. .mdio_base = CPSW_MDIO_BASE,
  121. .cpsw_base = CPSW_BASE,
  122. .mdio_div = 0xff,
  123. .channels = 8,
  124. .cpdma_reg_ofs = 0x800,
  125. .slaves = 1,
  126. .slave_data = cpsw_slaves,
  127. .ale_reg_ofs = 0xd00,
  128. .ale_entries = 1024,
  129. .host_port_reg_ofs = 0x108,
  130. .hw_stats_reg_ofs = 0x900,
  131. .mac_control = (1 << 5),
  132. .control = cpsw_control,
  133. .host_port_num = 0,
  134. .version = CPSW_CTRL_VERSION_2,
  135. };
  136. #endif
  137. #if defined(CONFIG_DRIVER_TI_CPSW) || \
  138. (defined(CONFIG_USB_ETHER) && defined(CONFIG_MUSB_GADGET))
  139. int board_eth_init(bd_t *bis)
  140. {
  141. int rv, n = 0;
  142. #ifdef CONFIG_DRIVER_TI_CPSW
  143. uint8_t mac_addr[6];
  144. uint32_t mac_hi, mac_lo;
  145. if (!eth_getenv_enetaddr("ethaddr", mac_addr)) {
  146. printf("<ethaddr> not set. Reading from E-fuse\n");
  147. /* try reading mac address from efuse */
  148. mac_lo = readl(&cdev->macid0l);
  149. mac_hi = readl(&cdev->macid0h);
  150. mac_addr[0] = mac_hi & 0xFF;
  151. mac_addr[1] = (mac_hi & 0xFF00) >> 8;
  152. mac_addr[2] = (mac_hi & 0xFF0000) >> 16;
  153. mac_addr[3] = (mac_hi & 0xFF000000) >> 24;
  154. mac_addr[4] = mac_lo & 0xFF;
  155. mac_addr[5] = (mac_lo & 0xFF00) >> 8;
  156. if (is_valid_ether_addr(mac_addr))
  157. eth_setenv_enetaddr("ethaddr", mac_addr);
  158. else
  159. goto try_usbether;
  160. }
  161. writel(RMII_RGMII2_MODE_ENABLE, &cdev->miisel);
  162. rv = cpsw_register(&cpsw_data);
  163. if (rv < 0)
  164. printf("Error %d registering CPSW switch\n", rv);
  165. else
  166. n += rv;
  167. try_usbether:
  168. #endif
  169. #if defined(CONFIG_USB_ETHER) && !defined(CONFIG_SPL_BUILD)
  170. rv = usb_eth_initialize(bis);
  171. if (rv < 0)
  172. printf("Error %d registering USB_ETHER\n", rv);
  173. else
  174. n += rv;
  175. #endif
  176. return n;
  177. }
  178. #endif