board.c 31 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165
  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. return &dpll_ddr3_303MHz[ind];
  277. //return &dpll_ddr2_266MHz[ind];
  278. /*--- vern,20161126, for 512 DDR ---*/
  279. }
  280. }
  281. static u8 bone_not_connected_to_ac_power(void)
  282. {
  283. if (board_is_bone()) {
  284. uchar pmic_status_reg;
  285. if (tps65217_reg_read(TPS65217_STATUS,
  286. &pmic_status_reg))
  287. return 1;
  288. if (!(pmic_status_reg & TPS65217_PWR_SRC_AC_BITMASK)) {
  289. puts("No AC power, switching to default OPP\n");
  290. return 1;
  291. }
  292. }
  293. return 0;
  294. }
  295. const struct dpll_params *get_dpll_mpu_params(void)
  296. {
  297. int ind = get_sys_clk_index();
  298. int freq = am335x_get_efuse_mpu_max_freq(cdev);
  299. if (bone_not_connected_to_ac_power())
  300. freq = MPUPLL_M_600;
  301. if (board_is_bone_lt())
  302. freq = MPUPLL_M_1000;
  303. switch (freq) {
  304. case MPUPLL_M_1000:
  305. return &dpll_mpu_opp[ind][5];
  306. case MPUPLL_M_800:
  307. return &dpll_mpu_opp[ind][4];
  308. case MPUPLL_M_720:
  309. return &dpll_mpu_opp[ind][3];
  310. case MPUPLL_M_600:
  311. return &dpll_mpu_opp[ind][2];
  312. case MPUPLL_M_500:
  313. return &dpll_mpu_opp100;
  314. case MPUPLL_M_300:
  315. return &dpll_mpu_opp[ind][0];
  316. }
  317. return &dpll_mpu_opp[ind][0];
  318. }
  319. static void scale_vcores_bone(int freq)
  320. {
  321. int usb_cur_lim, mpu_vdd;
  322. /*
  323. * Only perform PMIC configurations if board rev > A1
  324. * on Beaglebone White
  325. */
  326. if (board_is_bone() && !strncmp(board_ti_get_rev(), "00A1", 4))
  327. return;
  328. if (i2c_probe(TPS65217_CHIP_PM))
  329. return;
  330. /*
  331. * On Beaglebone White we need to ensure we have AC power
  332. * before increasing the frequency.
  333. */
  334. if (bone_not_connected_to_ac_power())
  335. freq = MPUPLL_M_600;
  336. /*
  337. * Override what we have detected since we know if we have
  338. * a Beaglebone Black it supports 1GHz.
  339. */
  340. if (board_is_bone_lt())
  341. freq = MPUPLL_M_1000;
  342. switch (freq) {
  343. case MPUPLL_M_1000:
  344. mpu_vdd = TPS65217_DCDC_VOLT_SEL_1325MV;
  345. usb_cur_lim = TPS65217_USB_INPUT_CUR_LIMIT_1800MA;
  346. break;
  347. case MPUPLL_M_800:
  348. mpu_vdd = TPS65217_DCDC_VOLT_SEL_1275MV;
  349. usb_cur_lim = TPS65217_USB_INPUT_CUR_LIMIT_1300MA;
  350. break;
  351. case MPUPLL_M_720:
  352. mpu_vdd = TPS65217_DCDC_VOLT_SEL_1200MV;
  353. usb_cur_lim = TPS65217_USB_INPUT_CUR_LIMIT_1300MA;
  354. break;
  355. case MPUPLL_M_600:
  356. case MPUPLL_M_500:
  357. case MPUPLL_M_300:
  358. default:
  359. mpu_vdd = TPS65217_DCDC_VOLT_SEL_1100MV;
  360. usb_cur_lim = TPS65217_USB_INPUT_CUR_LIMIT_1300MA;
  361. break;
  362. }
  363. if (tps65217_reg_write(TPS65217_PROT_LEVEL_NONE,
  364. TPS65217_POWER_PATH,
  365. usb_cur_lim,
  366. TPS65217_USB_INPUT_CUR_LIMIT_MASK))
  367. puts("tps65217_reg_write failure\n");
  368. /* Set DCDC3 (CORE) voltage to 1.10V */
  369. if (tps65217_voltage_update(TPS65217_DEFDCDC3,
  370. TPS65217_DCDC_VOLT_SEL_1100MV)) {
  371. puts("tps65217_voltage_update failure\n");
  372. return;
  373. }
  374. /* Set DCDC2 (MPU) voltage */
  375. if (tps65217_voltage_update(TPS65217_DEFDCDC2, mpu_vdd)) {
  376. puts("tps65217_voltage_update failure\n");
  377. return;
  378. }
  379. /*
  380. * Set LDO3, LDO4 output voltage to 3.3V for Beaglebone.
  381. * Set LDO3 to 1.8V and LDO4 to 3.3V for Beaglebone Black.
  382. */
  383. if (board_is_bone()) {
  384. if (tps65217_reg_write(TPS65217_PROT_LEVEL_2,
  385. TPS65217_DEFLS1,
  386. TPS65217_LDO_VOLTAGE_OUT_3_3,
  387. TPS65217_LDO_MASK))
  388. puts("tps65217_reg_write failure\n");
  389. } else {
  390. if (tps65217_reg_write(TPS65217_PROT_LEVEL_2,
  391. TPS65217_DEFLS1,
  392. TPS65217_LDO_VOLTAGE_OUT_1_8,
  393. TPS65217_LDO_MASK))
  394. puts("tps65217_reg_write failure\n");
  395. }
  396. if (tps65217_reg_write(TPS65217_PROT_LEVEL_2,
  397. TPS65217_DEFLS2,
  398. TPS65217_LDO_VOLTAGE_OUT_3_3,
  399. TPS65217_LDO_MASK))
  400. puts("tps65217_reg_write failure\n");
  401. }
  402. void scale_vcores_generic(int freq)
  403. {
  404. int sil_rev, mpu_vdd;
  405. /*
  406. * The GP EVM, IDK and EVM SK use a TPS65910 PMIC. For all
  407. * MPU frequencies we support we use a CORE voltage of
  408. * 1.10V. For MPU voltage we need to switch based on
  409. * the frequency we are running at.
  410. */
  411. if (i2c_probe(TPS65910_CTRL_I2C_ADDR))
  412. return;
  413. /*
  414. * Depending on MPU clock and PG we will need a different
  415. * VDD to drive at that speed.
  416. */
  417. sil_rev = readl(&cdev->deviceid) >> 28;
  418. mpu_vdd = am335x_get_tps65910_mpu_vdd(sil_rev, freq);
  419. /* Tell the TPS65910 to use i2c */
  420. tps65910_set_i2c_control();
  421. /* First update MPU voltage. */
  422. if (tps65910_voltage_update(MPU, mpu_vdd))
  423. return;
  424. /* Second, update the CORE voltage. */
  425. if (tps65910_voltage_update(CORE, TPS65910_OP_REG_SEL_1_1_0))
  426. return;
  427. }
  428. void gpi2c_init(void)
  429. {
  430. /* When needed to be invoked prior to BSS initialization */
  431. static bool first_time = true;
  432. if (first_time) {
  433. enable_i2c0_pin_mux();
  434. i2c_init(CONFIG_SYS_OMAP24_I2C_SPEED,
  435. CONFIG_SYS_OMAP24_I2C_SLAVE);
  436. first_time = false;
  437. }
  438. }
  439. void scale_vcores(void)
  440. {
  441. int freq;
  442. gpi2c_init();
  443. freq = am335x_get_efuse_mpu_max_freq(cdev);
  444. if (board_is_beaglebonex())
  445. scale_vcores_bone(freq);
  446. else
  447. scale_vcores_generic(freq);
  448. }
  449. void set_uart_mux_conf(void)
  450. {
  451. #if CONFIG_CONS_INDEX == 1
  452. enable_uart0_pin_mux();
  453. #elif CONFIG_CONS_INDEX == 2
  454. enable_uart1_pin_mux();
  455. #elif CONFIG_CONS_INDEX == 3
  456. enable_uart2_pin_mux();
  457. #elif CONFIG_CONS_INDEX == 4
  458. enable_uart3_pin_mux();
  459. #elif CONFIG_CONS_INDEX == 5
  460. enable_uart4_pin_mux();
  461. #elif CONFIG_CONS_INDEX == 6
  462. enable_uart5_pin_mux();
  463. #endif
  464. }
  465. void set_mux_conf_regs(void)
  466. {
  467. enable_board_pin_mux();
  468. }
  469. const struct ctrl_ioregs ioregs_evmsk = {
  470. /*+++ vern,20161126, for 512 DDR+++*/
  471. /*.cm0ioctl = MT41J128MJT125_IOCTRL_VALUE,
  472. .cm1ioctl = MT41J128MJT125_IOCTRL_VALUE,
  473. .cm2ioctl = MT41J128MJT125_IOCTRL_VALUE,
  474. .dt0ioctl = MT41J128MJT125_IOCTRL_VALUE,
  475. .dt1ioctl = MT41J128MJT125_IOCTRL_VALUE,*/
  476. .cm0ioctl = MT41K256M16HA125E_IOCTRL_VALUE,
  477. .cm1ioctl = MT41K256M16HA125E_IOCTRL_VALUE,
  478. .cm2ioctl = MT41K256M16HA125E_IOCTRL_VALUE,
  479. .dt0ioctl = MT41K256M16HA125E_IOCTRL_VALUE,
  480. .dt1ioctl = MT41K256M16HA125E_IOCTRL_VALUE,
  481. /*--- vern,20161126, for 512 DDR---*/
  482. };
  483. const struct ctrl_ioregs ioregs_bonelt = {
  484. .cm0ioctl = MT41K256M16HA125E_IOCTRL_VALUE,
  485. .cm1ioctl = MT41K256M16HA125E_IOCTRL_VALUE,
  486. .cm2ioctl = MT41K256M16HA125E_IOCTRL_VALUE,
  487. .dt0ioctl = MT41K256M16HA125E_IOCTRL_VALUE,
  488. .dt1ioctl = MT41K256M16HA125E_IOCTRL_VALUE,
  489. };
  490. const struct ctrl_ioregs ioregs_evm15 = {
  491. /*+++ vern,20161126, for 512 DDR+++*/
  492. /*.cm0ioctl = MT41J512M8RH125_IOCTRL_VALUE,
  493. .cm1ioctl = MT41J512M8RH125_IOCTRL_VALUE,
  494. .cm2ioctl = MT41J512M8RH125_IOCTRL_VALUE,
  495. .dt0ioctl = MT41J512M8RH125_IOCTRL_VALUE,
  496. .dt1ioctl = MT41J512M8RH125_IOCTRL_VALUE,*/
  497. .cm0ioctl = MT41K256M16HA125E_IOCTRL_VALUE,
  498. .cm1ioctl = MT41K256M16HA125E_IOCTRL_VALUE,
  499. .cm2ioctl = MT41K256M16HA125E_IOCTRL_VALUE,
  500. .dt0ioctl = MT41K256M16HA125E_IOCTRL_VALUE,
  501. .dt1ioctl = MT41K256M16HA125E_IOCTRL_VALUE,
  502. /*--- vern,20161126, for 512 DDR---*/
  503. };
  504. const struct ctrl_ioregs ioregs = {
  505. /*+++ vern,20161126, for 512 DDR+++*/
  506. /*.cm0ioctl = MT47H128M16RT25E_IOCTRL_VALUE,
  507. .cm1ioctl = MT47H128M16RT25E_IOCTRL_VALUE,
  508. .cm2ioctl = MT47H128M16RT25E_IOCTRL_VALUE,
  509. .dt0ioctl = MT47H128M16RT25E_IOCTRL_VALUE,
  510. .dt1ioctl = MT47H128M16RT25E_IOCTRL_VALUE,*/
  511. .cm0ioctl = MT41K256M16HA125E_IOCTRL_VALUE,
  512. .cm1ioctl = MT41K256M16HA125E_IOCTRL_VALUE,
  513. .cm2ioctl = MT41K256M16HA125E_IOCTRL_VALUE,
  514. .dt0ioctl = MT41K256M16HA125E_IOCTRL_VALUE,
  515. .dt1ioctl = MT41K256M16HA125E_IOCTRL_VALUE,
  516. /*--- vern,20161126, for 512 DDR---*/
  517. };
  518. void sdram_init(void)
  519. {
  520. if (board_is_evm_sk()) {
  521. /*
  522. * EVM SK 1.2A and later use gpio0_7 to enable DDR3.
  523. * This is safe enough to do on older revs.
  524. */
  525. gpio_request(GPIO_DDR_VTT_EN, "ddr_vtt_en");
  526. gpio_direction_output(GPIO_DDR_VTT_EN, 1);
  527. }
  528. if (board_is_icev2()) {
  529. gpio_request(ICE_GPIO_DDR_VTT_EN, "ddr_vtt_en");
  530. gpio_direction_output(ICE_GPIO_DDR_VTT_EN, 1);
  531. }
  532. if (board_is_evm_sk())
  533. config_ddr(303, &ioregs_evmsk, &ddr3_data,
  534. &ddr3_cmd_ctrl_data, &ddr3_emif_reg_data, 0);
  535. else if (board_is_bone_lt())
  536. config_ddr(400, &ioregs_bonelt,
  537. &ddr3_beagleblack_data,
  538. &ddr3_beagleblack_cmd_ctrl_data,
  539. &ddr3_beagleblack_emif_reg_data, 0);
  540. else if (board_is_evm_15_or_later())
  541. config_ddr(303, &ioregs_evm15, &ddr3_evm_data,
  542. &ddr3_evm_cmd_ctrl_data, &ddr3_evm_emif_reg_data, 0);
  543. else if (board_is_icev2())
  544. config_ddr(400, &ioregs_evmsk, &ddr3_icev2_data,
  545. &ddr3_icev2_cmd_ctrl_data, &ddr3_icev2_emif_reg_data,
  546. 0);
  547. /*+++ vern,20161126, for 512 DDR+++*/
  548. /*
  549. else if (board_is_gp_evm())
  550. config_ddr(266, &ioregs, &ddr2_data,
  551. &ddr2_cmd_ctrl_data, &ddr2_evm_emif_reg_data, 0);
  552. else
  553. config_ddr(266, &ioregs, &ddr2_data,
  554. &ddr2_cmd_ctrl_data, &ddr2_emif_reg_data, 0);
  555. */
  556. else
  557. config_ddr(303, &ioregs_evm15, &ddr3_evm_data,
  558. &ddr3_evm_cmd_ctrl_data, &ddr3_evm_emif_reg_data, 0);
  559. /*--- vern,20161126, for 512 DDR ---*/
  560. }
  561. #endif
  562. #if !defined(CONFIG_SPL_BUILD) || \
  563. (defined(CONFIG_SPL_ETH_SUPPORT) && defined(CONFIG_SPL_BUILD))
  564. static void request_and_set_gpio(int gpio, char *name, int val)
  565. {
  566. int ret;
  567. ret = gpio_request(gpio, name);
  568. if (ret < 0) {
  569. printf("%s: Unable to request %s\n", __func__, name);
  570. return;
  571. }
  572. ret = gpio_direction_output(gpio, 0);
  573. if (ret < 0) {
  574. printf("%s: Unable to set %s as output\n", __func__, name);
  575. goto err_free_gpio;
  576. }
  577. gpio_set_value(gpio, val);
  578. return;
  579. err_free_gpio:
  580. gpio_free(gpio);
  581. }
  582. #define REQUEST_AND_SET_GPIO(N) request_and_set_gpio(N, #N, 1);
  583. #define REQUEST_AND_CLR_GPIO(N) request_and_set_gpio(N, #N, 0);
  584. /**
  585. * RMII mode on ICEv2 board needs 50MHz clock. Given the clock
  586. * synthesizer With a capacitor of 18pF, and 25MHz input clock cycle
  587. * PLL1 gives an output of 100MHz. So, configuring the div2/3 as 2 to
  588. * give 50MHz output for Eth0 and 1.
  589. */
  590. static struct clk_synth cdce913_data = {
  591. .id = 0x81,
  592. .capacitor = 0x90,
  593. .mux = 0x6d,
  594. .pdiv2 = 0x2,
  595. .pdiv3 = 0x2,
  596. };
  597. #endif
  598. #if !defined(CONFIG_SPL_BUILD) || \
  599. (defined(CONFIG_SPL_ETH_SUPPORT) && defined(CONFIG_SPL_BUILD)) || \
  600. (defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP))
  601. static bool eth0_is_mii;
  602. static bool eth1_is_mii;
  603. #endif
  604. /*
  605. * Basic board specific setup. Pinmux has been handled already.
  606. */
  607. int board_init(void)
  608. {
  609. #if defined(CONFIG_HW_WATCHDOG)
  610. hw_watchdog_init();
  611. #endif
  612. gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100;
  613. #if defined(CONFIG_NOR) || defined(CONFIG_NAND)
  614. gpmc_init();
  615. #endif
  616. #if !defined(CONFIG_SPL_BUILD) || \
  617. (defined(CONFIG_SPL_ETH_SUPPORT) && defined(CONFIG_SPL_BUILD))
  618. if (board_is_icev2()) {
  619. int rv;
  620. u32 reg;
  621. /* factory default configuration */
  622. eth0_is_mii = true;
  623. eth1_is_mii = true;
  624. REQUEST_AND_SET_GPIO(GPIO_PR1_MII_CTRL);
  625. /* Make J19 status available on GPIO1_26 */
  626. REQUEST_AND_CLR_GPIO(GPIO_MUX_MII_CTRL);
  627. REQUEST_AND_SET_GPIO(GPIO_FET_SWITCH_CTRL);
  628. /*
  629. * Both ports can be set as RMII-CPSW or MII-PRU-ETH using
  630. * jumpers near the port. Read the jumper value and set
  631. * the pinmux, external mux and PHY clock accordingly.
  632. * As jumper line is overridden by PHY RX_DV pin immediately
  633. * after bootstrap (power-up/reset), we need to sample
  634. * it during PHY reset using GPIO rising edge detection.
  635. */
  636. REQUEST_AND_SET_GPIO(GPIO_PHY_RESET);
  637. /* Enable rising edge IRQ on GPIO0_11 and GPIO 1_26 */
  638. reg = readl(GPIO0_RISINGDETECT) | BIT(11);
  639. writel(reg, GPIO0_RISINGDETECT);
  640. reg = readl(GPIO1_RISINGDETECT) | BIT(26);
  641. writel(reg, GPIO1_RISINGDETECT);
  642. /* Reset PHYs to capture the Jumper setting */
  643. gpio_set_value(GPIO_PHY_RESET, 0);
  644. udelay(2); /* PHY datasheet states 1uS min. */
  645. gpio_set_value(GPIO_PHY_RESET, 1);
  646. reg = readl(GPIO0_IRQSTATUSRAW) & BIT(11);
  647. if (reg) {
  648. writel(reg, GPIO0_IRQSTATUS1); /* clear irq */
  649. /* RMII mode */
  650. printf("ETH0, CPSW\n");
  651. eth0_is_mii = false;
  652. } else {
  653. /* MII mode */
  654. printf("ETH0, PRU\n");
  655. cdce913_data.pdiv3 = 4; /* 25MHz PHY clk */
  656. }
  657. reg = readl(GPIO1_IRQSTATUSRAW) & BIT(26);
  658. if (reg) {
  659. writel(reg, GPIO1_IRQSTATUS1); /* clear irq */
  660. /* RMII mode */
  661. printf("ETH1, CPSW\n");
  662. gpio_set_value(GPIO_MUX_MII_CTRL, 1);
  663. eth1_is_mii = false;
  664. } else {
  665. /* MII mode */
  666. printf("ETH1, PRU\n");
  667. cdce913_data.pdiv2 = 4; /* 25MHz PHY clk */
  668. }
  669. /* disable rising edge IRQs */
  670. reg = readl(GPIO0_RISINGDETECT) & ~BIT(11);
  671. writel(reg, GPIO0_RISINGDETECT);
  672. reg = readl(GPIO1_RISINGDETECT) & ~BIT(26);
  673. writel(reg, GPIO1_RISINGDETECT);
  674. rv = setup_clock_synthesizer(&cdce913_data);
  675. if (rv) {
  676. printf("Clock synthesizer setup failed %d\n", rv);
  677. return rv;
  678. }
  679. /* reset PHYs */
  680. gpio_set_value(GPIO_PHY_RESET, 0);
  681. udelay(2); /* PHY datasheet states 1uS min. */
  682. gpio_set_value(GPIO_PHY_RESET, 1);
  683. }
  684. #endif
  685. return 0;
  686. }
  687. #ifdef CONFIG_BOARD_LATE_INIT
  688. int board_late_init(void)
  689. {
  690. #if !defined(CONFIG_SPL_BUILD)
  691. uint8_t mac_addr[6];
  692. uint32_t mac_hi, mac_lo;
  693. #endif
  694. #ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
  695. char *name = NULL;
  696. if (board_is_bbg1())
  697. name = "BBG1";
  698. set_board_info_env(name);
  699. /*
  700. * Default FIT boot on HS devices. Non FIT images are not allowed
  701. * on HS devices.
  702. */
  703. if (get_device_type() == HS_DEVICE)
  704. setenv("boot_fit", "1");
  705. #endif
  706. #if !defined(CONFIG_SPL_BUILD)
  707. /* try reading mac address from efuse */
  708. mac_lo = readl(&cdev->macid0l);
  709. mac_hi = readl(&cdev->macid0h);
  710. mac_addr[0] = mac_hi & 0xFF;
  711. mac_addr[1] = (mac_hi & 0xFF00) >> 8;
  712. mac_addr[2] = (mac_hi & 0xFF0000) >> 16;
  713. mac_addr[3] = (mac_hi & 0xFF000000) >> 24;
  714. mac_addr[4] = mac_lo & 0xFF;
  715. mac_addr[5] = (mac_lo & 0xFF00) >> 8;
  716. if (!getenv("ethaddr")) {
  717. printf("<ethaddr> not set. Validating first E-fuse MAC\n");
  718. if (is_valid_ethaddr(mac_addr))
  719. eth_setenv_enetaddr("ethaddr", mac_addr);
  720. }
  721. mac_lo = readl(&cdev->macid1l);
  722. mac_hi = readl(&cdev->macid1h);
  723. mac_addr[0] = mac_hi & 0xFF;
  724. mac_addr[1] = (mac_hi & 0xFF00) >> 8;
  725. mac_addr[2] = (mac_hi & 0xFF0000) >> 16;
  726. mac_addr[3] = (mac_hi & 0xFF000000) >> 24;
  727. mac_addr[4] = mac_lo & 0xFF;
  728. mac_addr[5] = (mac_lo & 0xFF00) >> 8;
  729. if (!getenv("eth1addr")) {
  730. if (is_valid_ethaddr(mac_addr))
  731. eth_setenv_enetaddr("eth1addr", mac_addr);
  732. }
  733. #endif
  734. return 0;
  735. }
  736. #endif
  737. #ifndef CONFIG_DM_ETH
  738. #if (defined(CONFIG_DRIVER_TI_CPSW) && !defined(CONFIG_SPL_BUILD)) || \
  739. (defined(CONFIG_SPL_ETH_SUPPORT) && defined(CONFIG_SPL_BUILD))
  740. static void cpsw_control(int enabled)
  741. {
  742. /* VTP can be added here */
  743. return;
  744. }
  745. static struct cpsw_slave_data cpsw_slaves[] = {
  746. {
  747. .slave_reg_ofs = 0x208,
  748. .sliver_reg_ofs = 0xd80,
  749. .phy_addr = 1,/*+++ vern, for gmii+++*/
  750. },
  751. {
  752. .slave_reg_ofs = 0x308,
  753. .sliver_reg_ofs = 0xdc0,
  754. .phy_addr = 2,/*+++ vern, for gmii+++*/
  755. },
  756. };
  757. static struct cpsw_platform_data cpsw_data = {
  758. .mdio_base = CPSW_MDIO_BASE,
  759. .cpsw_base = CPSW_BASE,
  760. .mdio_div = 0xff,
  761. .channels = 8,
  762. .cpdma_reg_ofs = 0x800,
  763. .slaves = 1,/*+++ vern, for gmii+++*/
  764. .slave_data = cpsw_slaves,
  765. .ale_reg_ofs = 0xd00,
  766. .ale_entries = 1024,
  767. .host_port_reg_ofs = 0x108,
  768. .hw_stats_reg_ofs = 0x900,
  769. .bd_ram_ofs = 0x2000,
  770. .mac_control = (1 << 5),
  771. .control = cpsw_control,
  772. .host_port_num = 0,
  773. .version = CPSW_CTRL_VERSION_2,
  774. };
  775. #endif
  776. #if ((defined(CONFIG_SPL_ETH_SUPPORT) || defined(CONFIG_SPL_USBETH_SUPPORT)) &&\
  777. defined(CONFIG_SPL_BUILD)) || \
  778. ((defined(CONFIG_DRIVER_TI_CPSW) || \
  779. defined(CONFIG_USB_ETHER) && defined(CONFIG_MUSB_GADGET)) && \
  780. !defined(CONFIG_SPL_BUILD))
  781. /*
  782. * This function will:
  783. * Read the eFuse for MAC addresses, and set ethaddr/eth1addr/usbnet_devaddr
  784. * in the environment
  785. * Perform fixups to the PHY present on certain boards. We only need this
  786. * function in:
  787. * - SPL with either CPSW or USB ethernet support
  788. * - Full U-Boot, with either CPSW or USB ethernet
  789. * Build in only these cases to avoid warnings about unused variables
  790. * when we build an SPL that has neither option but full U-Boot will.
  791. */
  792. int board_eth_init(bd_t *bis)
  793. {
  794. int rv, n = 0;
  795. #if defined(CONFIG_USB_ETHER) && \
  796. (!defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_USBETH_SUPPORT))
  797. uint8_t mac_addr[6];
  798. uint32_t mac_hi, mac_lo;
  799. /*
  800. * use efuse mac address for USB ethernet as we know that
  801. * both CPSW and USB ethernet will never be active at the same time
  802. */
  803. mac_lo = readl(&cdev->macid0l);
  804. mac_hi = readl(&cdev->macid0h);
  805. mac_addr[0] = mac_hi & 0xFF;
  806. mac_addr[1] = (mac_hi & 0xFF00) >> 8;
  807. mac_addr[2] = (mac_hi & 0xFF0000) >> 16;
  808. mac_addr[3] = (mac_hi & 0xFF000000) >> 24;
  809. mac_addr[4] = mac_lo & 0xFF;
  810. mac_addr[5] = (mac_lo & 0xFF00) >> 8;
  811. #endif
  812. #if (defined(CONFIG_DRIVER_TI_CPSW) && !defined(CONFIG_SPL_BUILD)) || \
  813. (defined(CONFIG_SPL_ETH_SUPPORT) && defined(CONFIG_SPL_BUILD))
  814. if (!getenv("ethaddr")) {
  815. puts("<ethaddr> not set. Validating first E-fuse MAC\n");
  816. if (is_valid_ethaddr(mac_addr))
  817. eth_setenv_enetaddr("ethaddr", mac_addr);
  818. }
  819. #ifdef CONFIG_DRIVER_TI_CPSW
  820. if (board_is_bone() || board_is_bone_lt() ||
  821. board_is_idk()) {
  822. writel(MII_MODE_ENABLE, &cdev->miisel);
  823. cpsw_slaves[0].phy_if = cpsw_slaves[1].phy_if =
  824. PHY_INTERFACE_MODE_MII;
  825. } else if (board_is_icev2()) {
  826. writel(RMII_MODE_ENABLE | RMII_CHIPCKL_ENABLE, &cdev->miisel);
  827. cpsw_slaves[0].phy_if = PHY_INTERFACE_MODE_RMII;
  828. cpsw_slaves[1].phy_if = PHY_INTERFACE_MODE_RMII;
  829. cpsw_slaves[0].phy_addr = 1;
  830. cpsw_slaves[1].phy_addr = 3;
  831. } else {
  832. /*+++ vern, for gmii+++*/
  833. writel((MII_MODE_ENABLE), &cdev->miisel);
  834. cpsw_slaves[0].phy_if = cpsw_slaves[1].phy_if = PHY_INTERFACE_MODE_MII;
  835. /*+++ vern, for gmii+++*/
  836. }
  837. rv = cpsw_register(&cpsw_data);
  838. if (rv < 0)
  839. printf("Error %d registering CPSW switch\n", rv);
  840. else
  841. n += rv;
  842. #endif
  843. /*
  844. *
  845. * CPSW RGMII Internal Delay Mode is not supported in all PVT
  846. * operating points. So we must set the TX clock delay feature
  847. * in the AR8051 PHY. Since we only support a single ethernet
  848. * device in U-Boot, we only do this for the first instance.
  849. */
  850. #define AR8051_PHY_DEBUG_ADDR_REG 0x1d
  851. #define AR8051_PHY_DEBUG_DATA_REG 0x1e
  852. #define AR8051_DEBUG_RGMII_CLK_DLY_REG 0x5
  853. #define AR8051_RGMII_TX_CLK_DLY 0x100
  854. if (board_is_evm_sk() /*|| board_is_gp_evm()*/) {
  855. const char *devname;
  856. devname = miiphy_get_current_dev();
  857. miiphy_write(devname, 0x0, AR8051_PHY_DEBUG_ADDR_REG,
  858. AR8051_DEBUG_RGMII_CLK_DLY_REG);
  859. miiphy_write(devname, 0x0, AR8051_PHY_DEBUG_DATA_REG,
  860. AR8051_RGMII_TX_CLK_DLY);
  861. }
  862. #endif
  863. #if defined(CONFIG_USB_ETHER) && \
  864. (!defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_USBETH_SUPPORT))
  865. if (is_valid_ethaddr(mac_addr))
  866. eth_setenv_enetaddr("usbnet_devaddr", mac_addr);
  867. rv = usb_eth_initialize(bis);
  868. if (rv < 0)
  869. printf("Error %d registering USB_ETHER\n", rv);
  870. else
  871. n += rv;
  872. #endif
  873. return n;
  874. }
  875. #endif
  876. #endif /* CONFIG_DM_ETH */
  877. #ifdef CONFIG_SPL_LOAD_FIT
  878. int board_fit_config_name_match(const char *name)
  879. {
  880. if (board_is_gp_evm() && !strcmp(name, "am335x-evm"))
  881. return 0;
  882. else if (board_is_bone() && !strcmp(name, "am335x-bone"))
  883. return 0;
  884. else if (board_is_bone_lt() && !strcmp(name, "am335x-boneblack"))
  885. return 0;
  886. else if (board_is_evm_sk() && !strcmp(name, "am335x-evmsk"))
  887. return 0;
  888. else if (board_is_bbg1() && !strcmp(name, "am335x-bonegreen"))
  889. return 0;
  890. else if (board_is_icev2() && !strcmp(name, "am335x-icev2"))
  891. return 0;
  892. else
  893. return -1;
  894. }
  895. #endif
  896. #ifdef CONFIG_TI_SECURE_DEVICE
  897. void board_fit_image_post_process(void **p_image, size_t *p_size)
  898. {
  899. secure_boot_verify_image(p_image, p_size);
  900. }
  901. #endif
  902. #if defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP)
  903. static const char pruss_eth0_alias[] = "/pruss_eth/ethernet-mii0";
  904. static const char pruss_eth1_alias[] = "/pruss_eth/ethernet-mii1";
  905. int ft_board_setup(void *fdt, bd_t *bd)
  906. {
  907. const char *path;
  908. int offs;
  909. int ret;
  910. if (!board_is_icev2())
  911. return 0;
  912. /* Board DT default is both ports are RMII */
  913. if (!eth0_is_mii && !eth1_is_mii)
  914. return 0;
  915. if (eth0_is_mii != eth1_is_mii) {
  916. printf("Unsupported Ethernet port configuration\n");
  917. printf("Both ports must be set as RMII or MII\n");
  918. return 0;
  919. }
  920. printf("Fixing up ETH0 & ETH1 to PRUSS Ethernet\n");
  921. /* Enable PRUSS-MDIO */
  922. path = "/ocp/pruss_soc_bus@4a326000/pruss@4a300000/mdio@4a332400";
  923. offs = fdt_path_offset(fdt, path);
  924. if (offs < 0)
  925. goto no_node;
  926. ret = fdt_status_okay(fdt, offs);
  927. if (ret < 0)
  928. goto enable_failed;
  929. /* Enable PRU-ICSS Ethernet */
  930. path = "/pruss_eth";
  931. offs = fdt_path_offset(fdt, path);
  932. if (offs < 0)
  933. goto no_node;
  934. ret = fdt_status_okay(fdt, offs);
  935. if (ret < 0)
  936. goto enable_failed;
  937. /* Disable CPSW Ethernet */
  938. path = "/ocp/ethernet@4a100000";
  939. offs = fdt_path_offset(fdt, path);
  940. if (offs < 0)
  941. goto no_node;
  942. ret = fdt_status_disabled(fdt, offs);
  943. if (ret < 0)
  944. goto disable_failed;
  945. /* Disable CPSW-MDIO */
  946. path = "/ocp/ethernet@4a100000/mdio@4a101000";
  947. offs = fdt_path_offset(fdt, path);
  948. if (offs < 0)
  949. goto no_node;
  950. ret = fdt_status_disabled(fdt, offs);
  951. if (ret < 0)
  952. goto disable_failed;
  953. /* Set MUX_MII_CTL1 pin low */
  954. path = "/ocp/gpio@481ae000/p10";
  955. offs = fdt_path_offset(fdt, path);
  956. if (offs < 0) {
  957. printf("Node %s not found.\n", path);
  958. return offs;
  959. }
  960. ret = fdt_delprop(fdt, offs, "output-high");
  961. if (ret < 0) {
  962. printf("Could not delete output-high property from node %s: %s\n",
  963. path, fdt_strerror(ret));
  964. return ret;
  965. }
  966. ret = fdt_setprop(fdt, offs, "output-low", NULL, 0);
  967. if (ret < 0) {
  968. printf("Could not add output-low property to node %s: %s\n",
  969. path, fdt_strerror(ret));
  970. return ret;
  971. }
  972. /* Fixup ethernet aliases */
  973. path = "/aliases";
  974. offs = fdt_path_offset(fdt, path);
  975. if (offs < 0)
  976. goto no_node;
  977. ret = fdt_setprop(fdt, offs, "ethernet0", pruss_eth0_alias,
  978. strlen(pruss_eth0_alias) + 1);
  979. if (ret < 0) {
  980. printf("Could not change ethernet0 alias: %s\n",
  981. fdt_strerror(ret));
  982. return ret;
  983. }
  984. ret = fdt_setprop(fdt, offs, "ethernet1", pruss_eth1_alias,
  985. strlen(pruss_eth0_alias) + 1);
  986. if (ret < 0) {
  987. printf("Could not change ethernet0 alias: %s\n",
  988. fdt_strerror(ret));
  989. return ret;
  990. }
  991. return 0;
  992. no_node:
  993. printf("Node %s not found. Please update DTB.\n", path);
  994. /* Return 0 as we don't want to prevent booting with older DTBs */
  995. return 0;
  996. disable_failed:
  997. printf("Could not disable node %s: %s\n",
  998. path, fdt_strerror(ret));
  999. return ret;
  1000. enable_failed:
  1001. printf("Could not enable node %s: %s\n",
  1002. path, fdt_strerror(ret));
  1003. return ret;
  1004. }
  1005. #endif