]> git.sur5r.net Git - u-boot/blob - board/ti/am57xx/board.c
a5f02e6390ac961bf3fff8d1f0ba847dab53d73e
[u-boot] / board / ti / am57xx / board.c
1 /*
2  * Copyright (C) 2014 Texas Instruments Incorporated - http://www.ti.com
3  *
4  * Author: Felipe Balbi <balbi@ti.com>
5  *
6  * Based on board/ti/dra7xx/evm.c
7  *
8  * SPDX-License-Identifier:     GPL-2.0+
9  */
10
11 #include <common.h>
12 #include <palmas.h>
13 #include <sata.h>
14 #include <usb.h>
15 #include <asm/omap_common.h>
16 #include <asm/emif.h>
17 #include <asm/gpio.h>
18 #include <asm/arch/gpio.h>
19 #include <asm/arch/clock.h>
20 #include <asm/arch/dra7xx_iodelay.h>
21 #include <asm/arch/sys_proto.h>
22 #include <asm/arch/mmc_host_def.h>
23 #include <asm/arch/sata.h>
24 #include <asm/arch/gpio.h>
25 #include <asm/arch/omap.h>
26 #include <environment.h>
27 #include <usb.h>
28 #include <linux/usb/gadget.h>
29 #include <dwc3-uboot.h>
30 #include <dwc3-omap-uboot.h>
31 #include <ti-usb-phy-uboot.h>
32
33 #include "../common/board_detect.h"
34 #include "mux_data.h"
35
36 #define board_is_x15()          board_ti_is("BBRDX15_")
37 #define board_is_am572x_evm()   board_ti_is("AM572PM_")
38
39 #ifdef CONFIG_DRIVER_TI_CPSW
40 #include <cpsw.h>
41 #endif
42
43 DECLARE_GLOBAL_DATA_PTR;
44
45 /* GPIO 7_11 */
46 #define GPIO_DDR_VTT_EN 203
47
48 #define SYSINFO_BOARD_NAME_MAX_LEN      45
49
50 const struct omap_sysinfo sysinfo = {
51         "Board: UNKNOWN(BeagleBoard X15?) REV UNKNOWN\n"
52 };
53
54 static const struct dmm_lisa_map_regs beagle_x15_lisa_regs = {
55         .dmm_lisa_map_3 = 0x80740300,
56         .is_ma_present  = 0x1
57 };
58
59 void emif_get_dmm_regs(const struct dmm_lisa_map_regs **dmm_lisa_regs)
60 {
61         *dmm_lisa_regs = &beagle_x15_lisa_regs;
62 }
63
64 static const struct emif_regs beagle_x15_emif1_ddr3_532mhz_emif_regs = {
65         .sdram_config_init      = 0x61851b32,
66         .sdram_config           = 0x61851b32,
67         .sdram_config2          = 0x08000000,
68         .ref_ctrl               = 0x000040F1,
69         .ref_ctrl_final         = 0x00001035,
70         .sdram_tim1             = 0xcccf36ab,
71         .sdram_tim2             = 0x308f7fda,
72         .sdram_tim3             = 0x409f88a8,
73         .read_idle_ctrl         = 0x00050000,
74         .zq_config              = 0x5007190b,
75         .temp_alert_config      = 0x00000000,
76         .emif_ddr_phy_ctlr_1_init = 0x0024400b,
77         .emif_ddr_phy_ctlr_1    = 0x0e24400b,
78         .emif_ddr_ext_phy_ctrl_1 = 0x10040100,
79         .emif_ddr_ext_phy_ctrl_2 = 0x00910091,
80         .emif_ddr_ext_phy_ctrl_3 = 0x00950095,
81         .emif_ddr_ext_phy_ctrl_4 = 0x009b009b,
82         .emif_ddr_ext_phy_ctrl_5 = 0x009e009e,
83         .emif_rd_wr_lvl_rmp_win = 0x00000000,
84         .emif_rd_wr_lvl_rmp_ctl = 0x80000000,
85         .emif_rd_wr_lvl_ctl     = 0x00000000,
86         .emif_rd_wr_exec_thresh = 0x00000305
87 };
88
89 /* Ext phy ctrl regs 1-35 */
90 static const u32 beagle_x15_emif1_ddr3_ext_phy_ctrl_const_regs[] = {
91         0x10040100,
92         0x00910091,
93         0x00950095,
94         0x009B009B,
95         0x009E009E,
96         0x00980098,
97         0x00340034,
98         0x00350035,
99         0x00340034,
100         0x00310031,
101         0x00340034,
102         0x007F007F,
103         0x007F007F,
104         0x007F007F,
105         0x007F007F,
106         0x007F007F,
107         0x00480048,
108         0x004A004A,
109         0x00520052,
110         0x00550055,
111         0x00500050,
112         0x00000000,
113         0x00600020,
114         0x40011080,
115         0x08102040,
116         0x0,
117         0x0,
118         0x0,
119         0x0,
120         0x0,
121         0x0,
122         0x0,
123         0x0,
124         0x0,
125         0x0
126 };
127
128 static const struct emif_regs beagle_x15_emif2_ddr3_532mhz_emif_regs = {
129         .sdram_config_init      = 0x61851b32,
130         .sdram_config           = 0x61851b32,
131         .sdram_config2          = 0x08000000,
132         .ref_ctrl               = 0x000040F1,
133         .ref_ctrl_final         = 0x00001035,
134         .sdram_tim1             = 0xcccf36ab,
135         .sdram_tim2             = 0x308f7fda,
136         .sdram_tim3             = 0x409f88a8,
137         .read_idle_ctrl         = 0x00050000,
138         .zq_config              = 0x5007190b,
139         .temp_alert_config      = 0x00000000,
140         .emif_ddr_phy_ctlr_1_init = 0x0024400b,
141         .emif_ddr_phy_ctlr_1    = 0x0e24400b,
142         .emif_ddr_ext_phy_ctrl_1 = 0x10040100,
143         .emif_ddr_ext_phy_ctrl_2 = 0x00910091,
144         .emif_ddr_ext_phy_ctrl_3 = 0x00950095,
145         .emif_ddr_ext_phy_ctrl_4 = 0x009b009b,
146         .emif_ddr_ext_phy_ctrl_5 = 0x009e009e,
147         .emif_rd_wr_lvl_rmp_win = 0x00000000,
148         .emif_rd_wr_lvl_rmp_ctl = 0x80000000,
149         .emif_rd_wr_lvl_ctl     = 0x00000000,
150         .emif_rd_wr_exec_thresh = 0x00000305
151 };
152
153 static const u32 beagle_x15_emif2_ddr3_ext_phy_ctrl_const_regs[] = {
154         0x10040100,
155         0x00910091,
156         0x00950095,
157         0x009B009B,
158         0x009E009E,
159         0x00980098,
160         0x00340034,
161         0x00350035,
162         0x00340034,
163         0x00310031,
164         0x00340034,
165         0x007F007F,
166         0x007F007F,
167         0x007F007F,
168         0x007F007F,
169         0x007F007F,
170         0x00480048,
171         0x004A004A,
172         0x00520052,
173         0x00550055,
174         0x00500050,
175         0x00000000,
176         0x00600020,
177         0x40011080,
178         0x08102040,
179         0x0,
180         0x0,
181         0x0,
182         0x0,
183         0x0,
184         0x0,
185         0x0,
186         0x0,
187         0x0,
188         0x0
189 };
190
191 void emif_get_reg_dump(u32 emif_nr, const struct emif_regs **regs)
192 {
193         switch (emif_nr) {
194         case 1:
195                 *regs = &beagle_x15_emif1_ddr3_532mhz_emif_regs;
196                 break;
197         case 2:
198                 *regs = &beagle_x15_emif2_ddr3_532mhz_emif_regs;
199                 break;
200         }
201 }
202
203 void emif_get_ext_phy_ctrl_const_regs(u32 emif_nr, const u32 **regs, u32 *size)
204 {
205         switch (emif_nr) {
206         case 1:
207                 *regs = beagle_x15_emif1_ddr3_ext_phy_ctrl_const_regs;
208                 *size = ARRAY_SIZE(beagle_x15_emif1_ddr3_ext_phy_ctrl_const_regs);
209                 break;
210         case 2:
211                 *regs = beagle_x15_emif2_ddr3_ext_phy_ctrl_const_regs;
212                 *size = ARRAY_SIZE(beagle_x15_emif2_ddr3_ext_phy_ctrl_const_regs);
213                 break;
214         }
215 }
216
217 struct vcores_data beagle_x15_volts = {
218         .mpu.value              = VDD_MPU_DRA752,
219         .mpu.efuse.reg          = STD_FUSE_OPP_VMIN_MPU_NOM,
220         .mpu.efuse.reg_bits     = DRA752_EFUSE_REGBITS,
221         .mpu.addr               = TPS659038_REG_ADDR_SMPS12,
222         .mpu.pmic               = &tps659038,
223
224         .eve.value              = VDD_EVE_DRA752,
225         .eve.efuse.reg          = STD_FUSE_OPP_VMIN_DSPEVE_NOM,
226         .eve.efuse.reg_bits     = DRA752_EFUSE_REGBITS,
227         .eve.addr               = TPS659038_REG_ADDR_SMPS45,
228         .eve.pmic               = &tps659038,
229
230         .gpu.value              = VDD_GPU_DRA752,
231         .gpu.efuse.reg          = STD_FUSE_OPP_VMIN_GPU_NOM,
232         .gpu.efuse.reg_bits     = DRA752_EFUSE_REGBITS,
233         .gpu.addr               = TPS659038_REG_ADDR_SMPS45,
234         .gpu.pmic               = &tps659038,
235
236         .core.value             = VDD_CORE_DRA752,
237         .core.efuse.reg         = STD_FUSE_OPP_VMIN_CORE_NOM,
238         .core.efuse.reg_bits    = DRA752_EFUSE_REGBITS,
239         .core.addr              = TPS659038_REG_ADDR_SMPS6,
240         .core.pmic              = &tps659038,
241
242         .iva.value              = VDD_IVA_DRA752,
243         .iva.efuse.reg          = STD_FUSE_OPP_VMIN_IVA_NOM,
244         .iva.efuse.reg_bits     = DRA752_EFUSE_REGBITS,
245         .iva.addr               = TPS659038_REG_ADDR_SMPS45,
246         .iva.pmic               = &tps659038,
247 };
248
249 #ifdef CONFIG_SPL_BUILD
250 /* No env to setup for SPL */
251 static inline void setup_board_eeprom_env(void) { }
252
253 /* Override function to read eeprom information */
254 void do_board_detect(void)
255 {
256         int rc;
257
258         rc = ti_i2c_eeprom_am_get(CONFIG_EEPROM_BUS_ADDRESS,
259                                   CONFIG_EEPROM_CHIP_ADDRESS);
260         if (rc)
261                 printf("ti_i2c_eeprom_init failed %d\n", rc);
262 }
263
264 #else   /* CONFIG_SPL_BUILD */
265
266 /* Override function to read eeprom information: actual i2c read done by SPL*/
267 void do_board_detect(void)
268 {
269         char *bname = NULL;
270         int rc;
271
272         rc = ti_i2c_eeprom_am_get(CONFIG_EEPROM_BUS_ADDRESS,
273                                   CONFIG_EEPROM_CHIP_ADDRESS);
274         if (rc)
275                 printf("ti_i2c_eeprom_init failed %d\n", rc);
276
277         if (board_is_x15())
278                 bname = "BeagleBoard X15";
279         else if (board_is_am572x_evm())
280                 bname = "AM572x EVM";
281
282         if (bname)
283                 snprintf(sysinfo.board_string, SYSINFO_BOARD_NAME_MAX_LEN,
284                          "Board: %s REV %s\n", bname, board_ti_get_rev());
285 }
286
287 static void setup_board_eeprom_env(void)
288 {
289         char *name = "beagle_x15";
290         int rc;
291
292         rc = ti_i2c_eeprom_am_get(CONFIG_EEPROM_BUS_ADDRESS,
293                                   CONFIG_EEPROM_CHIP_ADDRESS);
294         if (rc)
295                 goto invalid_eeprom;
296
297         if (board_is_am572x_evm())
298                 name = "am57xx_evm";
299         else
300                 printf("Unidentified board claims %s in eeprom header\n",
301                        board_ti_get_name());
302
303 invalid_eeprom:
304         set_board_info_env(name);
305 }
306
307 #endif  /* CONFIG_SPL_BUILD */
308
309 void hw_data_init(void)
310 {
311         *prcm = &dra7xx_prcm;
312         *dplls_data = &dra7xx_dplls;
313         *omap_vcores = &beagle_x15_volts;
314         *ctrl = &dra7xx_ctrl;
315 }
316
317 int board_init(void)
318 {
319         gpmc_init();
320         gd->bd->bi_boot_params = (CONFIG_SYS_SDRAM_BASE + 0x100);
321
322         return 0;
323 }
324
325 int board_late_init(void)
326 {
327         setup_board_eeprom_env();
328
329         /*
330          * DEV_CTRL.DEV_ON = 1 please - else palmas switches off in 8 seconds
331          * This is the POWERHOLD-in-Low behavior.
332          */
333         palmas_i2c_write_u8(TPS65903X_CHIP_P1, 0xA0, 0x1);
334         return 0;
335 }
336
337 void set_muxconf_regs(void)
338 {
339         do_set_mux32((*ctrl)->control_padconf_core_base,
340                      early_padconf, ARRAY_SIZE(early_padconf));
341 }
342
343 #ifdef CONFIG_IODELAY_RECALIBRATION
344 void recalibrate_iodelay(void)
345 {
346         __recalibrate_iodelay(core_padconf_array_essential,
347                               ARRAY_SIZE(core_padconf_array_essential),
348                               iodelay_cfg_array, ARRAY_SIZE(iodelay_cfg_array));
349 }
350 #endif
351
352 #if !defined(CONFIG_SPL_BUILD) && defined(CONFIG_GENERIC_MMC)
353 int board_mmc_init(bd_t *bis)
354 {
355         omap_mmc_init(0, 0, 0, -1, -1);
356         omap_mmc_init(1, 0, 0, -1, -1);
357         return 0;
358 }
359 #endif
360
361 #if defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_OS_BOOT)
362 int spl_start_uboot(void)
363 {
364         /* break into full u-boot on 'c' */
365         if (serial_tstc() && serial_getc() == 'c')
366                 return 1;
367
368 #ifdef CONFIG_SPL_ENV_SUPPORT
369         env_init();
370         env_relocate_spec();
371         if (getenv_yesno("boot_os") != 1)
372                 return 1;
373 #endif
374
375         return 0;
376 }
377 #endif
378
379 #ifdef CONFIG_USB_DWC3
380 static struct dwc3_device usb_otg_ss1 = {
381         .maximum_speed = USB_SPEED_SUPER,
382         .base = DRA7_USB_OTG_SS1_BASE,
383         .tx_fifo_resize = false,
384         .index = 0,
385 };
386
387 static struct dwc3_omap_device usb_otg_ss1_glue = {
388         .base = (void *)DRA7_USB_OTG_SS1_GLUE_BASE,
389         .utmi_mode = DWC3_OMAP_UTMI_MODE_SW,
390         .index = 0,
391 };
392
393 static struct ti_usb_phy_device usb_phy1_device = {
394         .pll_ctrl_base = (void *)DRA7_USB3_PHY1_PLL_CTRL,
395         .usb2_phy_power = (void *)DRA7_USB2_PHY1_POWER,
396         .usb3_phy_power = (void *)DRA7_USB3_PHY1_POWER,
397         .index = 0,
398 };
399
400 static struct dwc3_device usb_otg_ss2 = {
401         .maximum_speed = USB_SPEED_HIGH,
402         .base = DRA7_USB_OTG_SS2_BASE,
403         .tx_fifo_resize = false,
404         .index = 1,
405 };
406
407 static struct dwc3_omap_device usb_otg_ss2_glue = {
408         .base = (void *)DRA7_USB_OTG_SS2_GLUE_BASE,
409         .utmi_mode = DWC3_OMAP_UTMI_MODE_SW,
410         .index = 1,
411 };
412
413 static struct ti_usb_phy_device usb_phy2_device = {
414         .usb2_phy_power = (void *)DRA7_USB2_PHY2_POWER,
415         .index = 1,
416 };
417
418 int board_usb_init(int index, enum usb_init_type init)
419 {
420         enable_usb_clocks(index);
421         switch (index) {
422         case 0:
423                 if (init == USB_INIT_DEVICE) {
424                         printf("port %d can't be used as device\n", index);
425                         disable_usb_clocks(index);
426                         return -EINVAL;
427                 } else {
428                         usb_otg_ss1.dr_mode = USB_DR_MODE_HOST;
429                         usb_otg_ss1_glue.vbus_id_status = OMAP_DWC3_ID_GROUND;
430                         setbits_le32((*prcm)->cm_l3init_usb_otg_ss1_clkctrl,
431                                      OTG_SS_CLKCTRL_MODULEMODE_HW |
432                                      OPTFCLKEN_REFCLK960M);
433                 }
434
435                 ti_usb_phy_uboot_init(&usb_phy1_device);
436                 dwc3_omap_uboot_init(&usb_otg_ss1_glue);
437                 dwc3_uboot_init(&usb_otg_ss1);
438                 break;
439         case 1:
440                 if (init == USB_INIT_DEVICE) {
441                         usb_otg_ss2.dr_mode = USB_DR_MODE_PERIPHERAL;
442                         usb_otg_ss2_glue.vbus_id_status = OMAP_DWC3_VBUS_VALID;
443                 } else {
444                         printf("port %d can't be used as host\n", index);
445                         disable_usb_clocks(index);
446                         return -EINVAL;
447                 }
448
449                 ti_usb_phy_uboot_init(&usb_phy2_device);
450                 dwc3_omap_uboot_init(&usb_otg_ss2_glue);
451                 dwc3_uboot_init(&usb_otg_ss2);
452                 break;
453         default:
454                 printf("Invalid Controller Index\n");
455         }
456
457         return 0;
458 }
459
460 int board_usb_cleanup(int index, enum usb_init_type init)
461 {
462         switch (index) {
463         case 0:
464         case 1:
465                 ti_usb_phy_uboot_exit(index);
466                 dwc3_uboot_exit(index);
467                 dwc3_omap_uboot_exit(index);
468                 break;
469         default:
470                 printf("Invalid Controller Index\n");
471         }
472         disable_usb_clocks(index);
473         return 0;
474 }
475
476 int usb_gadget_handle_interrupts(int index)
477 {
478         u32 status;
479
480         status = dwc3_omap_uboot_interrupt_status(index);
481         if (status)
482                 dwc3_uboot_handle_interrupt(index);
483
484         return 0;
485 }
486 #endif
487
488 #ifdef CONFIG_DRIVER_TI_CPSW
489
490 /* Delay value to add to calibrated value */
491 #define RGMII0_TXCTL_DLY_VAL            ((0x3 << 5) + 0x8)
492 #define RGMII0_TXD0_DLY_VAL             ((0x3 << 5) + 0x8)
493 #define RGMII0_TXD1_DLY_VAL             ((0x3 << 5) + 0x2)
494 #define RGMII0_TXD2_DLY_VAL             ((0x4 << 5) + 0x0)
495 #define RGMII0_TXD3_DLY_VAL             ((0x4 << 5) + 0x0)
496 #define VIN2A_D13_DLY_VAL               ((0x3 << 5) + 0x8)
497 #define VIN2A_D17_DLY_VAL               ((0x3 << 5) + 0x8)
498 #define VIN2A_D16_DLY_VAL               ((0x3 << 5) + 0x2)
499 #define VIN2A_D15_DLY_VAL               ((0x4 << 5) + 0x0)
500 #define VIN2A_D14_DLY_VAL               ((0x4 << 5) + 0x0)
501
502 static void cpsw_control(int enabled)
503 {
504         /* VTP can be added here */
505 }
506
507 static struct cpsw_slave_data cpsw_slaves[] = {
508         {
509                 .slave_reg_ofs  = 0x208,
510                 .sliver_reg_ofs = 0xd80,
511                 .phy_addr       = 1,
512         },
513         {
514                 .slave_reg_ofs  = 0x308,
515                 .sliver_reg_ofs = 0xdc0,
516                 .phy_addr       = 2,
517         },
518 };
519
520 static struct cpsw_platform_data cpsw_data = {
521         .mdio_base              = CPSW_MDIO_BASE,
522         .cpsw_base              = CPSW_BASE,
523         .mdio_div               = 0xff,
524         .channels               = 8,
525         .cpdma_reg_ofs          = 0x800,
526         .slaves                 = 1,
527         .slave_data             = cpsw_slaves,
528         .ale_reg_ofs            = 0xd00,
529         .ale_entries            = 1024,
530         .host_port_reg_ofs      = 0x108,
531         .hw_stats_reg_ofs       = 0x900,
532         .bd_ram_ofs             = 0x2000,
533         .mac_control            = (1 << 5),
534         .control                = cpsw_control,
535         .host_port_num          = 0,
536         .version                = CPSW_CTRL_VERSION_2,
537 };
538
539 static u64 mac_to_u64(u8 mac[6])
540 {
541         int i;
542         u64 addr = 0;
543
544         for (i = 0; i < 6; i++) {
545                 addr <<= 8;
546                 addr |= mac[i];
547         }
548
549         return addr;
550 }
551
552 static void u64_to_mac(u64 addr, u8 mac[6])
553 {
554         mac[5] = addr;
555         mac[4] = addr >> 8;
556         mac[3] = addr >> 16;
557         mac[2] = addr >> 24;
558         mac[1] = addr >> 32;
559         mac[0] = addr >> 40;
560 }
561
562 int board_eth_init(bd_t *bis)
563 {
564         int ret;
565         uint8_t mac_addr[6];
566         uint32_t mac_hi, mac_lo;
567         uint32_t ctrl_val;
568         int i;
569         u64 mac1, mac2;
570         u8 mac_addr1[6], mac_addr2[6];
571         int num_macs;
572
573         /* try reading mac address from efuse */
574         mac_lo = readl((*ctrl)->control_core_mac_id_0_lo);
575         mac_hi = readl((*ctrl)->control_core_mac_id_0_hi);
576         mac_addr[0] = (mac_hi & 0xFF0000) >> 16;
577         mac_addr[1] = (mac_hi & 0xFF00) >> 8;
578         mac_addr[2] = mac_hi & 0xFF;
579         mac_addr[3] = (mac_lo & 0xFF0000) >> 16;
580         mac_addr[4] = (mac_lo & 0xFF00) >> 8;
581         mac_addr[5] = mac_lo & 0xFF;
582
583         if (!getenv("ethaddr")) {
584                 printf("<ethaddr> not set. Validating first E-fuse MAC\n");
585
586                 if (is_valid_ethaddr(mac_addr))
587                         eth_setenv_enetaddr("ethaddr", mac_addr);
588         }
589
590         mac_lo = readl((*ctrl)->control_core_mac_id_1_lo);
591         mac_hi = readl((*ctrl)->control_core_mac_id_1_hi);
592         mac_addr[0] = (mac_hi & 0xFF0000) >> 16;
593         mac_addr[1] = (mac_hi & 0xFF00) >> 8;
594         mac_addr[2] = mac_hi & 0xFF;
595         mac_addr[3] = (mac_lo & 0xFF0000) >> 16;
596         mac_addr[4] = (mac_lo & 0xFF00) >> 8;
597         mac_addr[5] = mac_lo & 0xFF;
598
599         if (!getenv("eth1addr")) {
600                 if (is_valid_ethaddr(mac_addr))
601                         eth_setenv_enetaddr("eth1addr", mac_addr);
602         }
603
604         ctrl_val = readl((*ctrl)->control_core_control_io1) & (~0x33);
605         ctrl_val |= 0x22;
606         writel(ctrl_val, (*ctrl)->control_core_control_io1);
607
608         ret = cpsw_register(&cpsw_data);
609         if (ret < 0)
610                 printf("Error %d registering CPSW switch\n", ret);
611
612         /*
613          * Export any Ethernet MAC addresses from EEPROM.
614          * On AM57xx the 2 MAC addresses define the address range
615          */
616         board_ti_get_eth_mac_addr(0, mac_addr1);
617         board_ti_get_eth_mac_addr(1, mac_addr2);
618
619         if (is_valid_ethaddr(mac_addr1) && is_valid_ethaddr(mac_addr2)) {
620                 mac1 = mac_to_u64(mac_addr1);
621                 mac2 = mac_to_u64(mac_addr2);
622
623                 /* must contain an address range */
624                 num_macs = mac2 - mac1 + 1;
625                 /* <= 50 to protect against user programming error */
626                 if (num_macs > 0 && num_macs <= 50) {
627                         for (i = 0; i < num_macs; i++) {
628                                 u64_to_mac(mac1 + i, mac_addr);
629                                 if (is_valid_ethaddr(mac_addr)) {
630                                         eth_setenv_enetaddr_by_index("eth",
631                                                                      i + 2,
632                                                                      mac_addr);
633                                 }
634                         }
635                 }
636         }
637
638         return ret;
639 }
640 #endif
641
642 #ifdef CONFIG_BOARD_EARLY_INIT_F
643 /* VTT regulator enable */
644 static inline void vtt_regulator_enable(void)
645 {
646         if (omap_hw_init_context() == OMAP_INIT_CONTEXT_UBOOT_AFTER_SPL)
647                 return;
648
649         gpio_request(GPIO_DDR_VTT_EN, "ddr_vtt_en");
650         gpio_direction_output(GPIO_DDR_VTT_EN, 1);
651 }
652
653 int board_early_init_f(void)
654 {
655         vtt_regulator_enable();
656         return 0;
657 }
658 #endif