board.c 32 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174
  1. /*
  2. * board.c
  3. *
  4. * Board functions for TI AM335X based boards
  5. *
  6. * Copyright (C) 2011, Texas Instruments, Incorporated - http://www.ti.com/
  7. *
  8. * SPDX-License-Identifier: GPL-2.0+
  9. */
  10. #include <common.h>
  11. #include <errno.h>
  12. #include <spl.h>
  13. #include <serial.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/clk_synthesizer.h>
  20. #include <asm/arch/gpio.h>
  21. #include <asm/arch/mmc_host_def.h>
  22. #include <asm/arch/sys_proto.h>
  23. #include <asm/arch/mem.h>
  24. #include <asm/io.h>
  25. #include <asm/emif.h>
  26. #include <asm/gpio.h>
  27. #include <asm/omap_sec_common.h>
  28. #include <i2c.h>
  29. #include <miiphy.h>
  30. #include <cpsw.h>
  31. #include <power/tps65217.h>
  32. #include <power/tps65910.h>
  33. #include <environment.h>
  34. #include <watchdog.h>
  35. #include <environment.h>
  36. #include <libfdt.h>
  37. #include <fdt_support.h>
  38. #include "../common/board_detect.h"
  39. #include "board.h"
  40. DECLARE_GLOBAL_DATA_PTR;
  41. /* GPIO that controls power to DDR on EVM-SK */
  42. #define GPIO_TO_PIN(bank, gpio) (32 * (bank) + (gpio))
  43. #define GPIO_DDR_VTT_EN GPIO_TO_PIN(0, 7)
  44. #define ICE_GPIO_DDR_VTT_EN GPIO_TO_PIN(0, 18)
  45. #define GPIO_PR1_MII_CTRL GPIO_TO_PIN(3, 4)
  46. #define GPIO_MUX_MII_CTRL GPIO_TO_PIN(3, 10)
  47. #define GPIO_FET_SWITCH_CTRL GPIO_TO_PIN(0, 7)
  48. #define GPIO_PHY_RESET GPIO_TO_PIN(2, 5)
  49. #define GPIO_ETH0_MODE GPIO_TO_PIN(0, 11)
  50. #define GPIO_ETH1_MODE GPIO_TO_PIN(1, 26)
  51. static struct ctrl_dev *cdev = (struct ctrl_dev *)CTRL_DEVICE_BASE;
  52. #define GPIO0_RISINGDETECT (AM33XX_GPIO0_BASE + OMAP_GPIO_RISINGDETECT)
  53. #define GPIO1_RISINGDETECT (AM33XX_GPIO1_BASE + OMAP_GPIO_RISINGDETECT)
  54. #define GPIO0_IRQSTATUS1 (AM33XX_GPIO0_BASE + OMAP_GPIO_IRQSTATUS1)
  55. #define GPIO1_IRQSTATUS1 (AM33XX_GPIO1_BASE + OMAP_GPIO_IRQSTATUS1)
  56. #define GPIO0_IRQSTATUSRAW (AM33XX_GPIO0_BASE + 0x024)
  57. #define GPIO1_IRQSTATUSRAW (AM33XX_GPIO1_BASE + 0x024)
  58. /*
  59. * Read header information from EEPROM into global structure.
  60. */
  61. #ifdef CONFIG_TI_I2C_BOARD_DETECT
  62. void do_board_detect(void)
  63. {
  64. enable_i2c0_pin_mux();
  65. i2c_init(CONFIG_SYS_OMAP24_I2C_SPEED, CONFIG_SYS_OMAP24_I2C_SLAVE);
  66. if (ti_i2c_eeprom_am_get(-1, CONFIG_SYS_I2C_EEPROM_ADDR))
  67. printf("ti_i2c_eeprom_init failed\n");
  68. }
  69. #endif
  70. #ifndef CONFIG_DM_SERIAL
  71. struct serial_device *default_serial_console(void)
  72. {
  73. if (board_is_icev2())
  74. return &eserial4_device;
  75. else
  76. return &eserial1_device;
  77. }
  78. #endif
  79. #ifndef CONFIG_SKIP_LOWLEVEL_INIT
  80. static const struct ddr_data ddr2_data = {
  81. .datardsratio0 = MT47H128M16RT25E_RD_DQS,
  82. .datafwsratio0 = MT47H128M16RT25E_PHY_FIFO_WE,
  83. .datawrsratio0 = MT47H128M16RT25E_PHY_WR_DATA,
  84. };
  85. static const struct cmd_control ddr2_cmd_ctrl_data = {
  86. .cmd0csratio = MT47H128M16RT25E_RATIO,
  87. .cmd1csratio = MT47H128M16RT25E_RATIO,
  88. .cmd2csratio = MT47H128M16RT25E_RATIO,
  89. };
  90. static const struct emif_regs ddr2_emif_reg_data = {
  91. .sdram_config = MT47H128M16RT25E_EMIF_SDCFG,
  92. .ref_ctrl = MT47H128M16RT25E_EMIF_SDREF,
  93. .sdram_tim1 = MT47H128M16RT25E_EMIF_TIM1,
  94. .sdram_tim2 = MT47H128M16RT25E_EMIF_TIM2,
  95. .sdram_tim3 = MT47H128M16RT25E_EMIF_TIM3,
  96. .emif_ddr_phy_ctlr_1 = MT47H128M16RT25E_EMIF_READ_LATENCY,
  97. };
  98. static const struct emif_regs ddr2_evm_emif_reg_data = {
  99. .sdram_config = MT47H128M16RT25E_EMIF_SDCFG,
  100. .ref_ctrl = MT47H128M16RT25E_EMIF_SDREF,
  101. .sdram_tim1 = MT47H128M16RT25E_EMIF_TIM1,
  102. .sdram_tim2 = MT47H128M16RT25E_EMIF_TIM2,
  103. .sdram_tim3 = MT47H128M16RT25E_EMIF_TIM3,
  104. .ocp_config = EMIF_OCP_CONFIG_AM335X_EVM,
  105. .emif_ddr_phy_ctlr_1 = MT47H128M16RT25E_EMIF_READ_LATENCY,
  106. };
  107. static const struct ddr_data ddr3_data = {
  108. /*+++ vern,20161126, for 512 DDR+++*/
  109. /*.datardsratio0 = MT41J128MJT125_RD_DQS,
  110. .datawdsratio0 = MT41J128MJT125_WR_DQS,
  111. .datafwsratio0 = MT41J128MJT125_PHY_FIFO_WE,
  112. .datawrsratio0 = MT41J128MJT125_PHY_WR_DATA,*/
  113. .datardsratio0 = MT41K256M16HA125E_RD_DQS,
  114. .datawdsratio0 = MT41K256M16HA125E_WR_DQS,
  115. .datafwsratio0 = MT41K256M16HA125E_PHY_FIFO_WE,
  116. .datawrsratio0 = MT41K256M16HA125E_PHY_WR_DATA,
  117. /*--- vern,20161126, for 512 DDR---*/
  118. };
  119. static const struct ddr_data ddr3_beagleblack_data = {
  120. .datardsratio0 = MT41K256M16HA125E_RD_DQS,
  121. .datawdsratio0 = MT41K256M16HA125E_WR_DQS,
  122. .datafwsratio0 = MT41K256M16HA125E_PHY_FIFO_WE,
  123. .datawrsratio0 = MT41K256M16HA125E_PHY_WR_DATA,
  124. };
  125. static const struct ddr_data ddr3_evm_data = {
  126. /*+++ vern,20161126, for 512 DDR+++*/
  127. /* .datardsratio0 = MT41J512M8RH125_RD_DQS,
  128. .datawdsratio0 = MT41J512M8RH125_WR_DQS,
  129. .datafwsratio0 = MT41J512M8RH125_PHY_FIFO_WE,
  130. .datawrsratio0 = MT41J512M8RH125_PHY_WR_DATA,*/
  131. .datardsratio0 = MT41K256M16HA125E_RD_DQS,
  132. .datawdsratio0 = MT41K256M16HA125E_WR_DQS,
  133. .datafwsratio0 = MT41K256M16HA125E_PHY_FIFO_WE,
  134. .datawrsratio0 = MT41K256M16HA125E_PHY_WR_DATA,
  135. /*--- vern,20161126, for 512 DDR---*/
  136. };
  137. static const struct ddr_data ddr3_icev2_data = {
  138. .datardsratio0 = MT41J128MJT125_RD_DQS_400MHz,
  139. .datawdsratio0 = MT41J128MJT125_WR_DQS_400MHz,
  140. .datafwsratio0 = MT41J128MJT125_PHY_FIFO_WE_400MHz,
  141. .datawrsratio0 = MT41J128MJT125_PHY_WR_DATA_400MHz,
  142. };
  143. static const struct cmd_control ddr3_cmd_ctrl_data = {
  144. /*+++ vern,20161126, for 512 DDR+++*/
  145. /*.cmd0csratio = MT41J128MJT125_RATIO,
  146. .cmd0iclkout = MT41J128MJT125_INVERT_CLKOUT,
  147. .cmd1csratio = MT41J128MJT125_RATIO,
  148. .cmd1iclkout = MT41J128MJT125_INVERT_CLKOUT,
  149. .cmd2csratio = MT41J128MJT125_RATIO,
  150. .cmd2iclkout = MT41J128MJT125_INVERT_CLKOUT,*/
  151. .cmd0csratio = MT41K256M16HA125E_RATIO,
  152. .cmd0iclkout = MT41K256M16HA125E_INVERT_CLKOUT,
  153. .cmd1csratio = MT41K256M16HA125E_RATIO,
  154. .cmd1iclkout = MT41K256M16HA125E_INVERT_CLKOUT,
  155. .cmd2csratio = MT41K256M16HA125E_RATIO,
  156. .cmd2iclkout = MT41K256M16HA125E_INVERT_CLKOUT,
  157. /*--- vern,20161126, for 512 DDR---*/
  158. };
  159. static const struct cmd_control ddr3_beagleblack_cmd_ctrl_data = {
  160. .cmd0csratio = MT41K256M16HA125E_RATIO,
  161. .cmd0iclkout = MT41K256M16HA125E_INVERT_CLKOUT,
  162. .cmd1csratio = MT41K256M16HA125E_RATIO,
  163. .cmd1iclkout = MT41K256M16HA125E_INVERT_CLKOUT,
  164. .cmd2csratio = MT41K256M16HA125E_RATIO,
  165. .cmd2iclkout = MT41K256M16HA125E_INVERT_CLKOUT,
  166. };
  167. static const struct cmd_control ddr3_evm_cmd_ctrl_data = {
  168. /*+++ vern,20161126, for 512 DDR+++*/
  169. /*.cmd0csratio = MT41J512M8RH125_RATIO,
  170. .cmd0iclkout = MT41J512M8RH125_INVERT_CLKOUT,
  171. .cmd1csratio = MT41J512M8RH125_RATIO,
  172. .cmd1iclkout = MT41J512M8RH125_INVERT_CLKOUT,
  173. .cmd2csratio = MT41J512M8RH125_RATIO,
  174. .cmd2iclkout = MT41J512M8RH125_INVERT_CLKOUT,*/
  175. .cmd0csratio = MT41K256M16HA125E_RATIO,
  176. .cmd0iclkout = MT41K256M16HA125E_INVERT_CLKOUT,
  177. .cmd1csratio = MT41K256M16HA125E_RATIO,
  178. .cmd1iclkout = MT41K256M16HA125E_INVERT_CLKOUT,
  179. .cmd2csratio = MT41K256M16HA125E_RATIO,
  180. .cmd2iclkout = MT41K256M16HA125E_INVERT_CLKOUT,
  181. /*--- vern,20161126, for 512 DDR---*/
  182. };
  183. static const struct cmd_control ddr3_icev2_cmd_ctrl_data = {
  184. .cmd0csratio = MT41J128MJT125_RATIO_400MHz,
  185. .cmd0iclkout = MT41J128MJT125_INVERT_CLKOUT_400MHz,
  186. .cmd1csratio = MT41J128MJT125_RATIO_400MHz,
  187. .cmd1iclkout = MT41J128MJT125_INVERT_CLKOUT_400MHz,
  188. .cmd2csratio = MT41J128MJT125_RATIO_400MHz,
  189. .cmd2iclkout = MT41J128MJT125_INVERT_CLKOUT_400MHz,
  190. };
  191. static struct emif_regs ddr3_emif_reg_data = {
  192. /*+++ vern,20161126, for 512 DDR+++*/
  193. /*.sdram_config = MT41J128MJT125_EMIF_SDCFG,
  194. .ref_ctrl = MT41J128MJT125_EMIF_SDREF,
  195. .sdram_tim1 = MT41J128MJT125_EMIF_TIM1,
  196. .sdram_tim2 = MT41J128MJT125_EMIF_TIM2,
  197. .sdram_tim3 = MT41J128MJT125_EMIF_TIM3,
  198. .zq_config = MT41J128MJT125_ZQ_CFG,
  199. .emif_ddr_phy_ctlr_1 = MT41J128MJT125_EMIF_READ_LATENCY |
  200. PHY_EN_DYN_PWRDN,*/
  201. .sdram_config = MT41K256M16HA125E_EMIF_SDCFG,
  202. .ref_ctrl = MT41K256M16HA125E_EMIF_SDREF,
  203. .sdram_tim1 = MT41K256M16HA125E_EMIF_TIM1,
  204. .sdram_tim2 = MT41K256M16HA125E_EMIF_TIM2,
  205. .sdram_tim3 = MT41K256M16HA125E_EMIF_TIM3,
  206. .zq_config = MT41K256M16HA125E_ZQ_CFG,
  207. .emif_ddr_phy_ctlr_1 = MT41K256M16HA125E_EMIF_READ_LATENCY,
  208. /*--- vern,20161126, for 512 DDR---*/
  209. };
  210. static struct emif_regs ddr3_beagleblack_emif_reg_data = {
  211. .sdram_config = MT41K256M16HA125E_EMIF_SDCFG,
  212. .ref_ctrl = MT41K256M16HA125E_EMIF_SDREF,
  213. .sdram_tim1 = MT41K256M16HA125E_EMIF_TIM1,
  214. .sdram_tim2 = MT41K256M16HA125E_EMIF_TIM2,
  215. .sdram_tim3 = MT41K256M16HA125E_EMIF_TIM3,
  216. .ocp_config = EMIF_OCP_CONFIG_BEAGLEBONE_BLACK,
  217. .zq_config = MT41K256M16HA125E_ZQ_CFG,
  218. .emif_ddr_phy_ctlr_1 = MT41K256M16HA125E_EMIF_READ_LATENCY,
  219. };
  220. static struct emif_regs ddr3_evm_emif_reg_data = {
  221. /*+++ vern,20161126, for 512 DDR+++*/
  222. /*.sdram_config = MT41J512M8RH125_EMIF_SDCFG,
  223. .ref_ctrl = MT41J512M8RH125_EMIF_SDREF,
  224. .sdram_tim1 = MT41J512M8RH125_EMIF_TIM1,
  225. .sdram_tim2 = MT41J512M8RH125_EMIF_TIM2,
  226. .sdram_tim3 = MT41J512M8RH125_EMIF_TIM3,
  227. .zq_config = MT41J512M8RH125_ZQ_CFG,
  228. .emif_ddr_phy_ctlr_1 = MT41J512M8RH125_EMIF_READ_LATENCY |
  229. PHY_EN_DYN_PWRDN,*/
  230. .sdram_config = MT41K256M16HA125E_EMIF_SDCFG,
  231. .ref_ctrl = MT41K256M16HA125E_EMIF_SDREF,
  232. .sdram_tim1 = MT41K256M16HA125E_EMIF_TIM1,
  233. .sdram_tim2 = MT41K256M16HA125E_EMIF_TIM2,
  234. .sdram_tim3 = MT41K256M16HA125E_EMIF_TIM3,
  235. .zq_config = MT41K256M16HA125E_ZQ_CFG,
  236. .emif_ddr_phy_ctlr_1 = MT41K256M16HA125E_EMIF_READ_LATENCY,
  237. /*--- vern,20161126, for 512 DDR---*/
  238. };
  239. static struct emif_regs ddr3_icev2_emif_reg_data = {
  240. .sdram_config = MT41J128MJT125_EMIF_SDCFG_400MHz,
  241. .ref_ctrl = MT41J128MJT125_EMIF_SDREF_400MHz,
  242. .sdram_tim1 = MT41J128MJT125_EMIF_TIM1_400MHz,
  243. .sdram_tim2 = MT41J128MJT125_EMIF_TIM2_400MHz,
  244. .sdram_tim3 = MT41J128MJT125_EMIF_TIM3_400MHz,
  245. .zq_config = MT41J128MJT125_ZQ_CFG_400MHz,
  246. .emif_ddr_phy_ctlr_1 = MT41J128MJT125_EMIF_READ_LATENCY_400MHz |
  247. PHY_EN_DYN_PWRDN,
  248. };
  249. #ifdef CONFIG_SPL_OS_BOOT
  250. int spl_start_uboot(void)
  251. {
  252. /* break into full u-boot on 'c' */
  253. if (serial_tstc() && serial_getc() == 'c')
  254. return 1;
  255. #ifdef CONFIG_SPL_ENV_SUPPORT
  256. env_init();
  257. env_relocate_spec();
  258. if (getenv_yesno("boot_os") != 1)
  259. return 1;
  260. #endif
  261. return 0;
  262. }
  263. #endif
  264. const struct dpll_params *get_dpll_ddr_params(void)
  265. {
  266. int ind = get_sys_clk_index();
  267. if (board_is_evm_sk())
  268. return &dpll_ddr3_303MHz[ind];
  269. else if (board_is_bone_lt() || board_is_icev2())
  270. return &dpll_ddr3_400MHz[ind];
  271. else if (board_is_evm_15_or_later())
  272. return &dpll_ddr3_303MHz[ind];
  273. else
  274. {
  275. /*+++ vern,20161126, for 512 DDR+++*/
  276. #if defined(MT41K256M16HA125E_303)
  277. return &dpll_ddr3_303MHz[ind];
  278. #elif defined(MT41K256M16HA125E_400)
  279. return &dpll_ddr3_400MHz[ind];
  280. #else
  281. return &dpll_ddr3_303MHz[ind];
  282. #endif
  283. /*--- vern,20161126, for 512 DDR ---*/
  284. }
  285. }
  286. static u8 bone_not_connected_to_ac_power(void)
  287. {
  288. if (board_is_bone()) {
  289. uchar pmic_status_reg;
  290. if (tps65217_reg_read(TPS65217_STATUS,
  291. &pmic_status_reg))
  292. return 1;
  293. if (!(pmic_status_reg & TPS65217_PWR_SRC_AC_BITMASK)) {
  294. puts("No AC power, switching to default OPP\n");
  295. return 1;
  296. }
  297. }
  298. return 0;
  299. }
  300. const struct dpll_params *get_dpll_mpu_params(void)
  301. {
  302. int ind = get_sys_clk_index();
  303. int freq = am335x_get_efuse_mpu_max_freq(cdev);
  304. if (bone_not_connected_to_ac_power())
  305. freq = MPUPLL_M_600;
  306. if (board_is_bone_lt())
  307. freq = MPUPLL_M_1000;
  308. switch (freq) {
  309. case MPUPLL_M_1000:
  310. return &dpll_mpu_opp[ind][5];
  311. case MPUPLL_M_800:
  312. return &dpll_mpu_opp[ind][4];
  313. case MPUPLL_M_720:
  314. return &dpll_mpu_opp[ind][3];
  315. case MPUPLL_M_600:
  316. return &dpll_mpu_opp[ind][2];
  317. case MPUPLL_M_500:
  318. return &dpll_mpu_opp100;
  319. case MPUPLL_M_300:
  320. return &dpll_mpu_opp[ind][0];
  321. }
  322. return &dpll_mpu_opp[ind][0];
  323. }
  324. static void scale_vcores_bone(int freq)
  325. {
  326. int usb_cur_lim, mpu_vdd;
  327. /*
  328. * Only perform PMIC configurations if board rev > A1
  329. * on Beaglebone White
  330. */
  331. if (board_is_bone() && !strncmp(board_ti_get_rev(), "00A1", 4))
  332. return;
  333. if (i2c_probe(TPS65217_CHIP_PM))
  334. return;
  335. /*
  336. * On Beaglebone White we need to ensure we have AC power
  337. * before increasing the frequency.
  338. */
  339. if (bone_not_connected_to_ac_power())
  340. freq = MPUPLL_M_600;
  341. /*
  342. * Override what we have detected since we know if we have
  343. * a Beaglebone Black it supports 1GHz.
  344. */
  345. if (board_is_bone_lt())
  346. freq = MPUPLL_M_1000;
  347. switch (freq) {
  348. case MPUPLL_M_1000:
  349. mpu_vdd = TPS65217_DCDC_VOLT_SEL_1325MV;
  350. usb_cur_lim = TPS65217_USB_INPUT_CUR_LIMIT_1800MA;
  351. break;
  352. case MPUPLL_M_800:
  353. mpu_vdd = TPS65217_DCDC_VOLT_SEL_1275MV;
  354. usb_cur_lim = TPS65217_USB_INPUT_CUR_LIMIT_1300MA;
  355. break;
  356. case MPUPLL_M_720:
  357. mpu_vdd = TPS65217_DCDC_VOLT_SEL_1200MV;
  358. usb_cur_lim = TPS65217_USB_INPUT_CUR_LIMIT_1300MA;
  359. break;
  360. case MPUPLL_M_600:
  361. case MPUPLL_M_500:
  362. case MPUPLL_M_300:
  363. default:
  364. mpu_vdd = TPS65217_DCDC_VOLT_SEL_1100MV;
  365. usb_cur_lim = TPS65217_USB_INPUT_CUR_LIMIT_1300MA;
  366. break;
  367. }
  368. if (tps65217_reg_write(TPS65217_PROT_LEVEL_NONE,
  369. TPS65217_POWER_PATH,
  370. usb_cur_lim,
  371. TPS65217_USB_INPUT_CUR_LIMIT_MASK))
  372. puts("tps65217_reg_write failure\n");
  373. /* Set DCDC3 (CORE) voltage to 1.10V */
  374. if (tps65217_voltage_update(TPS65217_DEFDCDC3,
  375. TPS65217_DCDC_VOLT_SEL_1100MV)) {
  376. puts("tps65217_voltage_update failure\n");
  377. return;
  378. }
  379. /* Set DCDC2 (MPU) voltage */
  380. if (tps65217_voltage_update(TPS65217_DEFDCDC2, mpu_vdd)) {
  381. puts("tps65217_voltage_update failure\n");
  382. return;
  383. }
  384. /*
  385. * Set LDO3, LDO4 output voltage to 3.3V for Beaglebone.
  386. * Set LDO3 to 1.8V and LDO4 to 3.3V for Beaglebone Black.
  387. */
  388. if (board_is_bone()) {
  389. if (tps65217_reg_write(TPS65217_PROT_LEVEL_2,
  390. TPS65217_DEFLS1,
  391. TPS65217_LDO_VOLTAGE_OUT_3_3,
  392. TPS65217_LDO_MASK))
  393. puts("tps65217_reg_write failure\n");
  394. } else {
  395. if (tps65217_reg_write(TPS65217_PROT_LEVEL_2,
  396. TPS65217_DEFLS1,
  397. TPS65217_LDO_VOLTAGE_OUT_1_8,
  398. TPS65217_LDO_MASK))
  399. puts("tps65217_reg_write failure\n");
  400. }
  401. if (tps65217_reg_write(TPS65217_PROT_LEVEL_2,
  402. TPS65217_DEFLS2,
  403. TPS65217_LDO_VOLTAGE_OUT_3_3,
  404. TPS65217_LDO_MASK))
  405. puts("tps65217_reg_write failure\n");
  406. }
  407. void scale_vcores_generic(int freq)
  408. {
  409. int sil_rev, mpu_vdd;
  410. /*
  411. * The GP EVM, IDK and EVM SK use a TPS65910 PMIC. For all
  412. * MPU frequencies we support we use a CORE voltage of
  413. * 1.10V. For MPU voltage we need to switch based on
  414. * the frequency we are running at.
  415. */
  416. if (i2c_probe(TPS65910_CTRL_I2C_ADDR))
  417. return;
  418. /*
  419. * Depending on MPU clock and PG we will need a different
  420. * VDD to drive at that speed.
  421. */
  422. sil_rev = readl(&cdev->deviceid) >> 28;
  423. mpu_vdd = am335x_get_tps65910_mpu_vdd(sil_rev, freq);
  424. /* Tell the TPS65910 to use i2c */
  425. tps65910_set_i2c_control();
  426. /* First update MPU voltage. */
  427. if (tps65910_voltage_update(MPU, mpu_vdd))
  428. return;
  429. /* Second, update the CORE voltage. */
  430. if (tps65910_voltage_update(CORE, TPS65910_OP_REG_SEL_1_1_0))
  431. return;
  432. }
  433. void gpi2c_init(void)
  434. {
  435. /* When needed to be invoked prior to BSS initialization */
  436. static bool first_time = true;
  437. if (first_time) {
  438. enable_i2c0_pin_mux();
  439. i2c_init(CONFIG_SYS_OMAP24_I2C_SPEED,
  440. CONFIG_SYS_OMAP24_I2C_SLAVE);
  441. first_time = false;
  442. }
  443. }
  444. void scale_vcores(void)
  445. {
  446. int freq;
  447. gpi2c_init();
  448. freq = am335x_get_efuse_mpu_max_freq(cdev);
  449. if (board_is_beaglebonex())
  450. scale_vcores_bone(freq);
  451. else
  452. #if defined(TPS65217)
  453. scale_vcores_bone(freq);
  454. #else
  455. scale_vcores_generic(freq);
  456. #endif
  457. }
  458. void set_uart_mux_conf(void)
  459. {
  460. #if CONFIG_CONS_INDEX == 1
  461. enable_uart0_pin_mux();
  462. #elif CONFIG_CONS_INDEX == 2
  463. enable_uart1_pin_mux();
  464. #elif CONFIG_CONS_INDEX == 3
  465. enable_uart2_pin_mux();
  466. #elif CONFIG_CONS_INDEX == 4
  467. enable_uart3_pin_mux();
  468. #elif CONFIG_CONS_INDEX == 5
  469. enable_uart4_pin_mux();
  470. #elif CONFIG_CONS_INDEX == 6
  471. enable_uart5_pin_mux();
  472. #endif
  473. }
  474. void set_mux_conf_regs(void)
  475. {
  476. enable_board_pin_mux();
  477. }
  478. const struct ctrl_ioregs ioregs_evmsk = {
  479. /*+++ vern,20161126, for 512 DDR+++*/
  480. /*.cm0ioctl = MT41J128MJT125_IOCTRL_VALUE,
  481. .cm1ioctl = MT41J128MJT125_IOCTRL_VALUE,
  482. .cm2ioctl = MT41J128MJT125_IOCTRL_VALUE,
  483. .dt0ioctl = MT41J128MJT125_IOCTRL_VALUE,
  484. .dt1ioctl = MT41J128MJT125_IOCTRL_VALUE,*/
  485. .cm0ioctl = MT41K256M16HA125E_IOCTRL_VALUE,
  486. .cm1ioctl = MT41K256M16HA125E_IOCTRL_VALUE,
  487. .cm2ioctl = MT41K256M16HA125E_IOCTRL_VALUE,
  488. .dt0ioctl = MT41K256M16HA125E_IOCTRL_VALUE,
  489. .dt1ioctl = MT41K256M16HA125E_IOCTRL_VALUE,
  490. /*--- vern,20161126, for 512 DDR---*/
  491. };
  492. const struct ctrl_ioregs ioregs_bonelt = {
  493. .cm0ioctl = MT41K256M16HA125E_IOCTRL_VALUE,
  494. .cm1ioctl = MT41K256M16HA125E_IOCTRL_VALUE,
  495. .cm2ioctl = MT41K256M16HA125E_IOCTRL_VALUE,
  496. .dt0ioctl = MT41K256M16HA125E_IOCTRL_VALUE,
  497. .dt1ioctl = MT41K256M16HA125E_IOCTRL_VALUE,
  498. };
  499. const struct ctrl_ioregs ioregs_evm15 = {
  500. /*+++ vern,20161126, for 512 DDR+++*/
  501. /*.cm0ioctl = MT41J512M8RH125_IOCTRL_VALUE,
  502. .cm1ioctl = MT41J512M8RH125_IOCTRL_VALUE,
  503. .cm2ioctl = MT41J512M8RH125_IOCTRL_VALUE,
  504. .dt0ioctl = MT41J512M8RH125_IOCTRL_VALUE,
  505. .dt1ioctl = MT41J512M8RH125_IOCTRL_VALUE,*/
  506. .cm0ioctl = MT41K256M16HA125E_IOCTRL_VALUE,
  507. .cm1ioctl = MT41K256M16HA125E_IOCTRL_VALUE,
  508. .cm2ioctl = MT41K256M16HA125E_IOCTRL_VALUE,
  509. .dt0ioctl = MT41K256M16HA125E_IOCTRL_VALUE,
  510. .dt1ioctl = MT41K256M16HA125E_IOCTRL_VALUE,
  511. /*--- vern,20161126, for 512 DDR---*/
  512. };
  513. const struct ctrl_ioregs ioregs = {
  514. /*+++ vern,20161126, for 512 DDR+++*/
  515. /*.cm0ioctl = MT47H128M16RT25E_IOCTRL_VALUE,
  516. .cm1ioctl = MT47H128M16RT25E_IOCTRL_VALUE,
  517. .cm2ioctl = MT47H128M16RT25E_IOCTRL_VALUE,
  518. .dt0ioctl = MT47H128M16RT25E_IOCTRL_VALUE,
  519. .dt1ioctl = MT47H128M16RT25E_IOCTRL_VALUE,*/
  520. .cm0ioctl = MT41K256M16HA125E_IOCTRL_VALUE,
  521. .cm1ioctl = MT41K256M16HA125E_IOCTRL_VALUE,
  522. .cm2ioctl = MT41K256M16HA125E_IOCTRL_VALUE,
  523. .dt0ioctl = MT41K256M16HA125E_IOCTRL_VALUE,
  524. .dt1ioctl = MT41K256M16HA125E_IOCTRL_VALUE,
  525. /*--- vern,20161126, for 512 DDR---*/
  526. };
  527. void sdram_init(void)
  528. {
  529. if (board_is_evm_sk()) {
  530. /*
  531. * EVM SK 1.2A and later use gpio0_7 to enable DDR3.
  532. * This is safe enough to do on older revs.
  533. */
  534. gpio_request(GPIO_DDR_VTT_EN, "ddr_vtt_en");
  535. gpio_direction_output(GPIO_DDR_VTT_EN, 1);
  536. }
  537. if (board_is_icev2()) {
  538. gpio_request(ICE_GPIO_DDR_VTT_EN, "ddr_vtt_en");
  539. gpio_direction_output(ICE_GPIO_DDR_VTT_EN, 1);
  540. }
  541. if (board_is_evm_sk())
  542. config_ddr(303, &ioregs_evmsk, &ddr3_data,
  543. &ddr3_cmd_ctrl_data, &ddr3_emif_reg_data, 0);
  544. else if (board_is_bone_lt())
  545. config_ddr(400, &ioregs_bonelt,
  546. &ddr3_beagleblack_data,
  547. &ddr3_beagleblack_cmd_ctrl_data,
  548. &ddr3_beagleblack_emif_reg_data, 0);
  549. else if (board_is_evm_15_or_later())
  550. config_ddr(303, &ioregs_evm15, &ddr3_evm_data,
  551. &ddr3_evm_cmd_ctrl_data, &ddr3_evm_emif_reg_data, 0);
  552. else if (board_is_icev2())
  553. config_ddr(400, &ioregs_evmsk, &ddr3_icev2_data,
  554. &ddr3_icev2_cmd_ctrl_data, &ddr3_icev2_emif_reg_data,
  555. 0);
  556. /*+++ vern,20161126, for 512 DDR+++*/
  557. else
  558. #if defined(MT41K256M16HA125E_303)
  559. config_ddr(303, &ioregs_evm15, &ddr3_evm_data,
  560. &ddr3_evm_cmd_ctrl_data, &ddr3_evm_emif_reg_data, 0);
  561. #elif defined(MT41K256M16HA125E_400)
  562. config_ddr(400, &ioregs_evm15, &ddr3_evm_data,
  563. &ddr3_evm_cmd_ctrl_data, &ddr3_evm_emif_reg_data, 0);
  564. #else
  565. config_ddr(303, &ioregs_evm15, &ddr3_evm_data,
  566. &ddr3_evm_cmd_ctrl_data, &ddr3_evm_emif_reg_data, 0);
  567. #endif
  568. /*--- vern,20161126, for 512 DDR ---*/
  569. }
  570. #endif
  571. #if !defined(CONFIG_SPL_BUILD) || \
  572. (defined(CONFIG_SPL_ETH_SUPPORT) && defined(CONFIG_SPL_BUILD))
  573. static void request_and_set_gpio(int gpio, char *name, int val)
  574. {
  575. int ret;
  576. ret = gpio_request(gpio, name);
  577. if (ret < 0) {
  578. printf("%s: Unable to request %s\n", __func__, name);
  579. return;
  580. }
  581. ret = gpio_direction_output(gpio, 0);
  582. if (ret < 0) {
  583. printf("%s: Unable to set %s as output\n", __func__, name);
  584. goto err_free_gpio;
  585. }
  586. gpio_set_value(gpio, val);
  587. return;
  588. err_free_gpio:
  589. gpio_free(gpio);
  590. }
  591. #define REQUEST_AND_SET_GPIO(N) request_and_set_gpio(N, #N, 1);
  592. #define REQUEST_AND_CLR_GPIO(N) request_and_set_gpio(N, #N, 0);
  593. /**
  594. * RMII mode on ICEv2 board needs 50MHz clock. Given the clock
  595. * synthesizer With a capacitor of 18pF, and 25MHz input clock cycle
  596. * PLL1 gives an output of 100MHz. So, configuring the div2/3 as 2 to
  597. * give 50MHz output for Eth0 and 1.
  598. */
  599. static struct clk_synth cdce913_data = {
  600. .id = 0x81,
  601. .capacitor = 0x90,
  602. .mux = 0x6d,
  603. .pdiv2 = 0x2,
  604. .pdiv3 = 0x2,
  605. };
  606. #endif
  607. #if !defined(CONFIG_SPL_BUILD) || \
  608. (defined(CONFIG_SPL_ETH_SUPPORT) && defined(CONFIG_SPL_BUILD)) || \
  609. (defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP))
  610. static bool eth0_is_mii;
  611. static bool eth1_is_mii;
  612. #endif
  613. /*
  614. * Basic board specific setup. Pinmux has been handled already.
  615. */
  616. int board_init(void)
  617. {
  618. #if defined(CONFIG_HW_WATCHDOG)
  619. hw_watchdog_init();
  620. #endif
  621. gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100;
  622. #if defined(CONFIG_NOR) || defined(CONFIG_NAND)
  623. gpmc_init();
  624. #endif
  625. #if !defined(CONFIG_SPL_BUILD) || \
  626. (defined(CONFIG_SPL_ETH_SUPPORT) && defined(CONFIG_SPL_BUILD))
  627. if (board_is_icev2()) {
  628. int rv;
  629. u32 reg;
  630. /* factory default configuration */
  631. eth0_is_mii = true;
  632. eth1_is_mii = true;
  633. REQUEST_AND_SET_GPIO(GPIO_PR1_MII_CTRL);
  634. /* Make J19 status available on GPIO1_26 */
  635. REQUEST_AND_CLR_GPIO(GPIO_MUX_MII_CTRL);
  636. REQUEST_AND_SET_GPIO(GPIO_FET_SWITCH_CTRL);
  637. /*
  638. * Both ports can be set as RMII-CPSW or MII-PRU-ETH using
  639. * jumpers near the port. Read the jumper value and set
  640. * the pinmux, external mux and PHY clock accordingly.
  641. * As jumper line is overridden by PHY RX_DV pin immediately
  642. * after bootstrap (power-up/reset), we need to sample
  643. * it during PHY reset using GPIO rising edge detection.
  644. */
  645. REQUEST_AND_SET_GPIO(GPIO_PHY_RESET);
  646. /* Enable rising edge IRQ on GPIO0_11 and GPIO 1_26 */
  647. reg = readl(GPIO0_RISINGDETECT) | BIT(11);
  648. writel(reg, GPIO0_RISINGDETECT);
  649. reg = readl(GPIO1_RISINGDETECT) | BIT(26);
  650. writel(reg, GPIO1_RISINGDETECT);
  651. /* Reset PHYs to capture the Jumper setting */
  652. gpio_set_value(GPIO_PHY_RESET, 0);
  653. udelay(2); /* PHY datasheet states 1uS min. */
  654. gpio_set_value(GPIO_PHY_RESET, 1);
  655. reg = readl(GPIO0_IRQSTATUSRAW) & BIT(11);
  656. if (reg) {
  657. writel(reg, GPIO0_IRQSTATUS1); /* clear irq */
  658. /* RMII mode */
  659. printf("ETH0, CPSW\n");
  660. eth0_is_mii = false;
  661. } else {
  662. /* MII mode */
  663. printf("ETH0, PRU\n");
  664. cdce913_data.pdiv3 = 4; /* 25MHz PHY clk */
  665. }
  666. reg = readl(GPIO1_IRQSTATUSRAW) & BIT(26);
  667. if (reg) {
  668. writel(reg, GPIO1_IRQSTATUS1); /* clear irq */
  669. /* RMII mode */
  670. printf("ETH1, CPSW\n");
  671. gpio_set_value(GPIO_MUX_MII_CTRL, 1);
  672. eth1_is_mii = false;
  673. } else {
  674. /* MII mode */
  675. printf("ETH1, PRU\n");
  676. cdce913_data.pdiv2 = 4; /* 25MHz PHY clk */
  677. }
  678. /* disable rising edge IRQs */
  679. reg = readl(GPIO0_RISINGDETECT) & ~BIT(11);
  680. writel(reg, GPIO0_RISINGDETECT);
  681. reg = readl(GPIO1_RISINGDETECT) & ~BIT(26);
  682. writel(reg, GPIO1_RISINGDETECT);
  683. rv = setup_clock_synthesizer(&cdce913_data);
  684. if (rv) {
  685. printf("Clock synthesizer setup failed %d\n", rv);
  686. return rv;
  687. }
  688. /* reset PHYs */
  689. gpio_set_value(GPIO_PHY_RESET, 0);
  690. udelay(2); /* PHY datasheet states 1uS min. */
  691. gpio_set_value(GPIO_PHY_RESET, 1);
  692. }
  693. #endif
  694. return 0;
  695. }
  696. #ifdef CONFIG_BOARD_LATE_INIT
  697. int board_late_init(void)
  698. {
  699. #if !defined(CONFIG_SPL_BUILD)
  700. uint8_t mac_addr[6];
  701. uint32_t mac_hi, mac_lo;
  702. #endif
  703. #ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
  704. char *name = NULL;
  705. if (board_is_bbg1())
  706. name = "BBG1";
  707. set_board_info_env(name);
  708. /*
  709. * Default FIT boot on HS devices. Non FIT images are not allowed
  710. * on HS devices.
  711. */
  712. if (get_device_type() == HS_DEVICE)
  713. setenv("boot_fit", "1");
  714. #endif
  715. #if !defined(CONFIG_SPL_BUILD)
  716. /* try reading mac address from efuse */
  717. mac_lo = readl(&cdev->macid0l);
  718. mac_hi = readl(&cdev->macid0h);
  719. mac_addr[0] = mac_hi & 0xFF;
  720. mac_addr[1] = (mac_hi & 0xFF00) >> 8;
  721. mac_addr[2] = (mac_hi & 0xFF0000) >> 16;
  722. mac_addr[3] = (mac_hi & 0xFF000000) >> 24;
  723. mac_addr[4] = mac_lo & 0xFF;
  724. mac_addr[5] = (mac_lo & 0xFF00) >> 8;
  725. if (!getenv("ethaddr")) {
  726. printf("<ethaddr> not set. Validating first E-fuse MAC\n");
  727. if (is_valid_ethaddr(mac_addr))
  728. eth_setenv_enetaddr("ethaddr", mac_addr);
  729. }
  730. mac_lo = readl(&cdev->macid1l);
  731. mac_hi = readl(&cdev->macid1h);
  732. mac_addr[0] = mac_hi & 0xFF;
  733. mac_addr[1] = (mac_hi & 0xFF00) >> 8;
  734. mac_addr[2] = (mac_hi & 0xFF0000) >> 16;
  735. mac_addr[3] = (mac_hi & 0xFF000000) >> 24;
  736. mac_addr[4] = mac_lo & 0xFF;
  737. mac_addr[5] = (mac_lo & 0xFF00) >> 8;
  738. if (!getenv("eth1addr")) {
  739. if (is_valid_ethaddr(mac_addr))
  740. eth_setenv_enetaddr("eth1addr", mac_addr);
  741. }
  742. #endif
  743. return 0;
  744. }
  745. #endif
  746. #ifndef CONFIG_DM_ETH
  747. #if (defined(CONFIG_DRIVER_TI_CPSW) && !defined(CONFIG_SPL_BUILD)) || \
  748. (defined(CONFIG_SPL_ETH_SUPPORT) && defined(CONFIG_SPL_BUILD))
  749. static void cpsw_control(int enabled)
  750. {
  751. /* VTP can be added here */
  752. return;
  753. }
  754. static struct cpsw_slave_data cpsw_slaves[] = {
  755. {
  756. .slave_reg_ofs = 0x208,
  757. .sliver_reg_ofs = 0xd80,
  758. .phy_addr = 1,/*+++ vern, for gmii+++*/
  759. },
  760. {
  761. .slave_reg_ofs = 0x308,
  762. .sliver_reg_ofs = 0xdc0,
  763. .phy_addr = 2,/*+++ vern, for gmii+++*/
  764. },
  765. };
  766. static struct cpsw_platform_data cpsw_data = {
  767. .mdio_base = CPSW_MDIO_BASE,
  768. .cpsw_base = CPSW_BASE,
  769. .mdio_div = 0xff,
  770. .channels = 8,
  771. .cpdma_reg_ofs = 0x800,
  772. .slaves = 1,/*+++ vern, for gmii+++*/
  773. .slave_data = cpsw_slaves,
  774. .ale_reg_ofs = 0xd00,
  775. .ale_entries = 1024,
  776. .host_port_reg_ofs = 0x108,
  777. .hw_stats_reg_ofs = 0x900,
  778. .bd_ram_ofs = 0x2000,
  779. .mac_control = (1 << 5),
  780. .control = cpsw_control,
  781. .host_port_num = 0,
  782. .version = CPSW_CTRL_VERSION_2,
  783. };
  784. #endif
  785. #if ((defined(CONFIG_SPL_ETH_SUPPORT) || defined(CONFIG_SPL_USBETH_SUPPORT)) &&\
  786. defined(CONFIG_SPL_BUILD)) || \
  787. ((defined(CONFIG_DRIVER_TI_CPSW) || \
  788. defined(CONFIG_USB_ETHER) && defined(CONFIG_MUSB_GADGET)) && \
  789. !defined(CONFIG_SPL_BUILD))
  790. /*
  791. * This function will:
  792. * Read the eFuse for MAC addresses, and set ethaddr/eth1addr/usbnet_devaddr
  793. * in the environment
  794. * Perform fixups to the PHY present on certain boards. We only need this
  795. * function in:
  796. * - SPL with either CPSW or USB ethernet support
  797. * - Full U-Boot, with either CPSW or USB ethernet
  798. * Build in only these cases to avoid warnings about unused variables
  799. * when we build an SPL that has neither option but full U-Boot will.
  800. */
  801. int board_eth_init(bd_t *bis)
  802. {
  803. int rv, n = 0;
  804. #if defined(CONFIG_USB_ETHER) && \
  805. (!defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_USBETH_SUPPORT))
  806. uint8_t mac_addr[6];
  807. uint32_t mac_hi, mac_lo;
  808. /*
  809. * use efuse mac address for USB ethernet as we know that
  810. * both CPSW and USB ethernet will never be active at the same time
  811. */
  812. mac_lo = readl(&cdev->macid0l);
  813. mac_hi = readl(&cdev->macid0h);
  814. mac_addr[0] = mac_hi & 0xFF;
  815. mac_addr[1] = (mac_hi & 0xFF00) >> 8;
  816. mac_addr[2] = (mac_hi & 0xFF0000) >> 16;
  817. mac_addr[3] = (mac_hi & 0xFF000000) >> 24;
  818. mac_addr[4] = mac_lo & 0xFF;
  819. mac_addr[5] = (mac_lo & 0xFF00) >> 8;
  820. #endif
  821. #if (defined(CONFIG_DRIVER_TI_CPSW) && !defined(CONFIG_SPL_BUILD)) || \
  822. (defined(CONFIG_SPL_ETH_SUPPORT) && defined(CONFIG_SPL_BUILD))
  823. if (!getenv("ethaddr")) {
  824. puts("<ethaddr> not set. Validating first E-fuse MAC\n");
  825. if (is_valid_ethaddr(mac_addr))
  826. eth_setenv_enetaddr("ethaddr", mac_addr);
  827. }
  828. #ifdef CONFIG_DRIVER_TI_CPSW
  829. if (board_is_bone() || board_is_bone_lt() ||
  830. board_is_idk()) {
  831. writel(MII_MODE_ENABLE, &cdev->miisel);
  832. cpsw_slaves[0].phy_if = cpsw_slaves[1].phy_if =
  833. PHY_INTERFACE_MODE_MII;
  834. } else if (board_is_icev2()) {
  835. writel(RMII_MODE_ENABLE | RMII_CHIPCKL_ENABLE, &cdev->miisel);
  836. cpsw_slaves[0].phy_if = PHY_INTERFACE_MODE_RMII;
  837. cpsw_slaves[1].phy_if = PHY_INTERFACE_MODE_RMII;
  838. cpsw_slaves[0].phy_addr = 1;
  839. cpsw_slaves[1].phy_addr = 3;
  840. } else {
  841. /*+++ vern, for gmii+++*/
  842. writel((MII_MODE_ENABLE), &cdev->miisel);
  843. cpsw_slaves[0].phy_if = cpsw_slaves[1].phy_if = PHY_INTERFACE_MODE_MII;
  844. /*+++ vern, for gmii+++*/
  845. }
  846. rv = cpsw_register(&cpsw_data);
  847. if (rv < 0)
  848. printf("Error %d registering CPSW switch\n", rv);
  849. else
  850. n += rv;
  851. #endif
  852. /*
  853. *
  854. * CPSW RGMII Internal Delay Mode is not supported in all PVT
  855. * operating points. So we must set the TX clock delay feature
  856. * in the AR8051 PHY. Since we only support a single ethernet
  857. * device in U-Boot, we only do this for the first instance.
  858. */
  859. #define AR8051_PHY_DEBUG_ADDR_REG 0x1d
  860. #define AR8051_PHY_DEBUG_DATA_REG 0x1e
  861. #define AR8051_DEBUG_RGMII_CLK_DLY_REG 0x5
  862. #define AR8051_RGMII_TX_CLK_DLY 0x100
  863. if (board_is_evm_sk() /*|| board_is_gp_evm()*/) {
  864. const char *devname;
  865. devname = miiphy_get_current_dev();
  866. miiphy_write(devname, 0x0, AR8051_PHY_DEBUG_ADDR_REG,
  867. AR8051_DEBUG_RGMII_CLK_DLY_REG);
  868. miiphy_write(devname, 0x0, AR8051_PHY_DEBUG_DATA_REG,
  869. AR8051_RGMII_TX_CLK_DLY);
  870. }
  871. #endif
  872. #if defined(CONFIG_USB_ETHER) && \
  873. (!defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_USBETH_SUPPORT))
  874. if (is_valid_ethaddr(mac_addr))
  875. eth_setenv_enetaddr("usbnet_devaddr", mac_addr);
  876. rv = usb_eth_initialize(bis);
  877. if (rv < 0)
  878. printf("Error %d registering USB_ETHER\n", rv);
  879. else
  880. n += rv;
  881. #endif
  882. return n;
  883. }
  884. #endif
  885. #endif /* CONFIG_DM_ETH */
  886. #ifdef CONFIG_SPL_LOAD_FIT
  887. int board_fit_config_name_match(const char *name)
  888. {
  889. if (board_is_gp_evm() && !strcmp(name, "am335x-evm"))
  890. return 0;
  891. else if (board_is_bone() && !strcmp(name, "am335x-bone"))
  892. return 0;
  893. else if (board_is_bone_lt() && !strcmp(name, "am335x-boneblack"))
  894. return 0;
  895. else if (board_is_evm_sk() && !strcmp(name, "am335x-evmsk"))
  896. return 0;
  897. else if (board_is_bbg1() && !strcmp(name, "am335x-bonegreen"))
  898. return 0;
  899. else if (board_is_icev2() && !strcmp(name, "am335x-icev2"))
  900. return 0;
  901. else
  902. return -1;
  903. }
  904. #endif
  905. #ifdef CONFIG_TI_SECURE_DEVICE
  906. void board_fit_image_post_process(void **p_image, size_t *p_size)
  907. {
  908. secure_boot_verify_image(p_image, p_size);
  909. }
  910. #endif
  911. #if defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP)
  912. static const char pruss_eth0_alias[] = "/pruss_eth/ethernet-mii0";
  913. static const char pruss_eth1_alias[] = "/pruss_eth/ethernet-mii1";
  914. int ft_board_setup(void *fdt, bd_t *bd)
  915. {
  916. const char *path;
  917. int offs;
  918. int ret;
  919. if (!board_is_icev2())
  920. return 0;
  921. /* Board DT default is both ports are RMII */
  922. if (!eth0_is_mii && !eth1_is_mii)
  923. return 0;
  924. if (eth0_is_mii != eth1_is_mii) {
  925. printf("Unsupported Ethernet port configuration\n");
  926. printf("Both ports must be set as RMII or MII\n");
  927. return 0;
  928. }
  929. printf("Fixing up ETH0 & ETH1 to PRUSS Ethernet\n");
  930. /* Enable PRUSS-MDIO */
  931. path = "/ocp/pruss_soc_bus@4a326000/pruss@4a300000/mdio@4a332400";
  932. offs = fdt_path_offset(fdt, path);
  933. if (offs < 0)
  934. goto no_node;
  935. ret = fdt_status_okay(fdt, offs);
  936. if (ret < 0)
  937. goto enable_failed;
  938. /* Enable PRU-ICSS Ethernet */
  939. path = "/pruss_eth";
  940. offs = fdt_path_offset(fdt, path);
  941. if (offs < 0)
  942. goto no_node;
  943. ret = fdt_status_okay(fdt, offs);
  944. if (ret < 0)
  945. goto enable_failed;
  946. /* Disable CPSW Ethernet */
  947. path = "/ocp/ethernet@4a100000";
  948. offs = fdt_path_offset(fdt, path);
  949. if (offs < 0)
  950. goto no_node;
  951. ret = fdt_status_disabled(fdt, offs);
  952. if (ret < 0)
  953. goto disable_failed;
  954. /* Disable CPSW-MDIO */
  955. path = "/ocp/ethernet@4a100000/mdio@4a101000";
  956. offs = fdt_path_offset(fdt, path);
  957. if (offs < 0)
  958. goto no_node;
  959. ret = fdt_status_disabled(fdt, offs);
  960. if (ret < 0)
  961. goto disable_failed;
  962. /* Set MUX_MII_CTL1 pin low */
  963. path = "/ocp/gpio@481ae000/p10";
  964. offs = fdt_path_offset(fdt, path);
  965. if (offs < 0) {
  966. printf("Node %s not found.\n", path);
  967. return offs;
  968. }
  969. ret = fdt_delprop(fdt, offs, "output-high");
  970. if (ret < 0) {
  971. printf("Could not delete output-high property from node %s: %s\n",
  972. path, fdt_strerror(ret));
  973. return ret;
  974. }
  975. ret = fdt_setprop(fdt, offs, "output-low", NULL, 0);
  976. if (ret < 0) {
  977. printf("Could not add output-low property to node %s: %s\n",
  978. path, fdt_strerror(ret));
  979. return ret;
  980. }
  981. /* Fixup ethernet aliases */
  982. path = "/aliases";
  983. offs = fdt_path_offset(fdt, path);
  984. if (offs < 0)
  985. goto no_node;
  986. ret = fdt_setprop(fdt, offs, "ethernet0", pruss_eth0_alias,
  987. strlen(pruss_eth0_alias) + 1);
  988. if (ret < 0) {
  989. printf("Could not change ethernet0 alias: %s\n",
  990. fdt_strerror(ret));
  991. return ret;
  992. }
  993. ret = fdt_setprop(fdt, offs, "ethernet1", pruss_eth1_alias,
  994. strlen(pruss_eth0_alias) + 1);
  995. if (ret < 0) {
  996. printf("Could not change ethernet0 alias: %s\n",
  997. fdt_strerror(ret));
  998. return ret;
  999. }
  1000. return 0;
  1001. no_node:
  1002. printf("Node %s not found. Please update DTB.\n", path);
  1003. /* Return 0 as we don't want to prevent booting with older DTBs */
  1004. return 0;
  1005. disable_failed:
  1006. printf("Could not disable node %s: %s\n",
  1007. path, fdt_strerror(ret));
  1008. return ret;
  1009. enable_failed:
  1010. printf("Could not enable node %s: %s\n",
  1011. path, fdt_strerror(ret));
  1012. return ret;
  1013. }
  1014. #endif