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