blob: 71af1ae7c8998b781e32f58b4770f950c89bc3d1 [file] [log] [blame]
Lokesh Vutlafbf27282013-07-30 11:36:27 +05301/*
2 * board.c
3 *
4 * Board functions for TI AM43XX based boards
5 *
6 * Copyright (C) 2013, Texas Instruments, Incorporated - http://www.ti.com/
7 *
8 * SPDX-License-Identifier: GPL-2.0+
9 */
10
11#include <common.h>
Sekhar Nori9f1a8cd2013-12-10 15:02:15 +053012#include <i2c.h>
13#include <asm/errno.h>
Lokesh Vutlafbf27282013-07-30 11:36:27 +053014#include <spl.h>
Lokesh Vutla3b34ac12013-07-30 11:36:29 +053015#include <asm/arch/clock.h>
Lokesh Vutlafbf27282013-07-30 11:36:27 +053016#include <asm/arch/sys_proto.h>
17#include <asm/arch/mux.h>
Lokesh Vutlad3daba12013-12-10 15:02:22 +053018#include <asm/arch/ddr_defs.h>
Lokesh Vutlab5e01ee2013-12-10 15:02:23 +053019#include <asm/arch/gpio.h>
Lokesh Vutlad3daba12013-12-10 15:02:22 +053020#include <asm/emif.h>
Lokesh Vutlafbf27282013-07-30 11:36:27 +053021#include "board.h"
Tom Rini83bad102014-06-05 11:15:30 -040022#include <power/tps65218.h>
Mugunthan V N4cdd7fd2014-02-18 07:31:54 -050023#include <miiphy.h>
24#include <cpsw.h>
Lokesh Vutlafbf27282013-07-30 11:36:27 +053025
26DECLARE_GLOBAL_DATA_PTR;
27
Mugunthan V N4cdd7fd2014-02-18 07:31:54 -050028static struct ctrl_dev *cdev = (struct ctrl_dev *)CTRL_DEVICE_BASE;
Mugunthan V N4cdd7fd2014-02-18 07:31:54 -050029
Sekhar Nori9f1a8cd2013-12-10 15:02:15 +053030/*
31 * Read header information from EEPROM into global structure.
32 */
33static int read_eeprom(struct am43xx_board_id *header)
34{
35 /* Check if baseboard eeprom is available */
36 if (i2c_probe(CONFIG_SYS_I2C_EEPROM_ADDR)) {
37 printf("Could not probe the EEPROM at 0x%x\n",
38 CONFIG_SYS_I2C_EEPROM_ADDR);
39 return -ENODEV;
40 }
41
42 /* read the eeprom using i2c */
43 if (i2c_read(CONFIG_SYS_I2C_EEPROM_ADDR, 0, 2, (uchar *)header,
44 sizeof(struct am43xx_board_id))) {
45 printf("Could not read the EEPROM\n");
46 return -EIO;
47 }
48
49 if (header->magic != 0xEE3355AA) {
50 /*
51 * read the eeprom using i2c again,
52 * but use only a 1 byte address
53 */
54 if (i2c_read(CONFIG_SYS_I2C_EEPROM_ADDR, 0, 1, (uchar *)header,
55 sizeof(struct am43xx_board_id))) {
56 printf("Could not read the EEPROM at 0x%x\n",
57 CONFIG_SYS_I2C_EEPROM_ADDR);
58 return -EIO;
59 }
60
61 if (header->magic != 0xEE3355AA) {
62 printf("Incorrect magic number (0x%x) in EEPROM\n",
63 header->magic);
64 return -EINVAL;
65 }
66 }
67
68 strncpy(am43xx_board_name, (char *)header->name, sizeof(header->name));
69 am43xx_board_name[sizeof(header->name)] = 0;
70
71 return 0;
72}
73
Sourav Poddar7a5f71b2014-05-19 16:53:37 -040074#ifndef CONFIG_SKIP_LOWLEVEL_INIT
Lokesh Vutlafbf27282013-07-30 11:36:27 +053075
Lokesh Vutlacf04d032013-12-10 15:02:20 +053076#define NUM_OPPS 6
77
78const struct dpll_params dpll_mpu[NUM_CRYSTAL_FREQ][NUM_OPPS] = {
79 { /* 19.2 MHz */
80 {-1, -1, -1, -1, -1, -1, -1}, /* OPP 50 */
81 {-1, -1, -1, -1, -1, -1, -1}, /* OPP RESERVED */
82 {-1, -1, -1, -1, -1, -1, -1}, /* OPP 100 */
83 {-1, -1, -1, -1, -1, -1, -1}, /* OPP 120 */
84 {-1, -1, -1, -1, -1, -1, -1}, /* OPP TB */
85 {-1, -1, -1, -1, -1, -1, -1} /* OPP NT */
86 },
87 { /* 24 MHz */
88 {300, 23, 1, -1, -1, -1, -1}, /* OPP 50 */
89 {-1, -1, -1, -1, -1, -1, -1}, /* OPP RESERVED */
90 {600, 23, 1, -1, -1, -1, -1}, /* OPP 100 */
91 {720, 23, 1, -1, -1, -1, -1}, /* OPP 120 */
92 {800, 23, 1, -1, -1, -1, -1}, /* OPP TB */
93 {1000, 23, 1, -1, -1, -1, -1} /* OPP NT */
94 },
95 { /* 25 MHz */
96 {300, 24, 1, -1, -1, -1, -1}, /* OPP 50 */
97 {-1, -1, -1, -1, -1, -1, -1}, /* OPP RESERVED */
98 {600, 24, 1, -1, -1, -1, -1}, /* OPP 100 */
99 {720, 24, 1, -1, -1, -1, -1}, /* OPP 120 */
100 {800, 24, 1, -1, -1, -1, -1}, /* OPP TB */
101 {1000, 24, 1, -1, -1, -1, -1} /* OPP NT */
102 },
103 { /* 26 MHz */
104 {300, 25, 1, -1, -1, -1, -1}, /* OPP 50 */
105 {-1, -1, -1, -1, -1, -1, -1}, /* OPP RESERVED */
106 {600, 25, 1, -1, -1, -1, -1}, /* OPP 100 */
107 {720, 25, 1, -1, -1, -1, -1}, /* OPP 120 */
108 {800, 25, 1, -1, -1, -1, -1}, /* OPP TB */
109 {1000, 25, 1, -1, -1, -1, -1} /* OPP NT */
110 },
111};
112
113const struct dpll_params dpll_core[NUM_CRYSTAL_FREQ] = {
114 {-1, -1, -1, -1, -1, -1, -1}, /* 19.2 MHz */
115 {1000, 23, -1, -1, 10, 8, 4}, /* 24 MHz */
116 {1000, 24, -1, -1, 10, 8, 4}, /* 25 MHz */
117 {1000, 25, -1, -1, 10, 8, 4} /* 26 MHz */
118};
119
120const struct dpll_params dpll_per[NUM_CRYSTAL_FREQ] = {
121 {-1, -1, -1, -1, -1, -1, -1}, /* 19.2 MHz */
122 {960, 23, 5, -1, -1, -1, -1}, /* 24 MHz */
123 {960, 24, 5, -1, -1, -1, -1}, /* 25 MHz */
124 {960, 25, 5, -1, -1, -1, -1} /* 26 MHz */
125};
126
127const struct dpll_params epos_evm_dpll_ddr = {
128 266, 24, 1, -1, 1, -1, -1};
129
130const struct dpll_params gp_evm_dpll_ddr = {
131 400, 23, 1, -1, 1, -1, -1};
Lokesh Vutlafbf27282013-07-30 11:36:27 +0530132
Lokesh Vutlad3daba12013-12-10 15:02:22 +0530133const struct ctrl_ioregs ioregs_lpddr2 = {
134 .cm0ioctl = LPDDR2_ADDRCTRL_IOCTRL_VALUE,
135 .cm1ioctl = LPDDR2_ADDRCTRL_WD0_IOCTRL_VALUE,
136 .cm2ioctl = LPDDR2_ADDRCTRL_WD1_IOCTRL_VALUE,
137 .dt0ioctl = LPDDR2_DATA0_IOCTRL_VALUE,
138 .dt1ioctl = LPDDR2_DATA0_IOCTRL_VALUE,
139 .dt2ioctrl = LPDDR2_DATA0_IOCTRL_VALUE,
140 .dt3ioctrl = LPDDR2_DATA0_IOCTRL_VALUE,
141 .emif_sdram_config_ext = 0x1,
142};
143
144const struct emif_regs emif_regs_lpddr2 = {
145 .sdram_config = 0x808012BA,
146 .ref_ctrl = 0x0000040D,
147 .sdram_tim1 = 0xEA86B411,
148 .sdram_tim2 = 0x103A094A,
149 .sdram_tim3 = 0x0F6BA37F,
150 .read_idle_ctrl = 0x00050000,
151 .zq_config = 0x50074BE4,
152 .temp_alert_config = 0x0,
153 .emif_rd_wr_lvl_rmp_win = 0x0,
154 .emif_rd_wr_lvl_rmp_ctl = 0x0,
155 .emif_rd_wr_lvl_ctl = 0x0,
156 .emif_ddr_phy_ctlr_1 = 0x0E084006,
157 .emif_rd_wr_exec_thresh = 0x00000405,
158 .emif_ddr_ext_phy_ctrl_1 = 0x04010040,
159 .emif_ddr_ext_phy_ctrl_2 = 0x00500050,
160 .emif_ddr_ext_phy_ctrl_3 = 0x00500050,
161 .emif_ddr_ext_phy_ctrl_4 = 0x00500050,
162 .emif_ddr_ext_phy_ctrl_5 = 0x00500050
163};
164
165const u32 ext_phy_ctrl_const_base_lpddr2[] = {
166 0x00500050,
167 0x00350035,
168 0x00350035,
169 0x00350035,
170 0x00350035,
171 0x00350035,
172 0x00000000,
173 0x00000000,
174 0x00000000,
175 0x00000000,
176 0x00000000,
177 0x00000000,
178 0x00000000,
179 0x00000000,
180 0x00000000,
181 0x00000000,
182 0x00000000,
183 0x00000000,
184 0x40001000,
185 0x08102040
186};
187
Lokesh Vutlab5e01ee2013-12-10 15:02:23 +0530188const struct ctrl_ioregs ioregs_ddr3 = {
189 .cm0ioctl = DDR3_ADDRCTRL_IOCTRL_VALUE,
190 .cm1ioctl = DDR3_ADDRCTRL_WD0_IOCTRL_VALUE,
191 .cm2ioctl = DDR3_ADDRCTRL_WD1_IOCTRL_VALUE,
192 .dt0ioctl = DDR3_DATA0_IOCTRL_VALUE,
193 .dt1ioctl = DDR3_DATA0_IOCTRL_VALUE,
194 .dt2ioctrl = DDR3_DATA0_IOCTRL_VALUE,
195 .dt3ioctrl = DDR3_DATA0_IOCTRL_VALUE,
Lokesh Vutla0df8afd2013-12-19 10:00:28 +0530196 .emif_sdram_config_ext = 0x0143,
Lokesh Vutlab5e01ee2013-12-10 15:02:23 +0530197};
198
199const struct emif_regs ddr3_emif_regs_400Mhz = {
200 .sdram_config = 0x638413B2,
201 .ref_ctrl = 0x00000C30,
202 .sdram_tim1 = 0xEAAAD4DB,
203 .sdram_tim2 = 0x266B7FDA,
204 .sdram_tim3 = 0x107F8678,
205 .read_idle_ctrl = 0x00050000,
206 .zq_config = 0x50074BE4,
207 .temp_alert_config = 0x0,
Lokesh Vutlae27f2dd2014-02-18 07:31:57 -0500208 .emif_ddr_phy_ctlr_1 = 0x0E004008,
Lokesh Vutlab5e01ee2013-12-10 15:02:23 +0530209 .emif_ddr_ext_phy_ctrl_1 = 0x08020080,
210 .emif_ddr_ext_phy_ctrl_2 = 0x00400040,
211 .emif_ddr_ext_phy_ctrl_3 = 0x00400040,
212 .emif_ddr_ext_phy_ctrl_4 = 0x00400040,
213 .emif_ddr_ext_phy_ctrl_5 = 0x00400040,
214 .emif_rd_wr_lvl_rmp_win = 0x0,
215 .emif_rd_wr_lvl_rmp_ctl = 0x0,
216 .emif_rd_wr_lvl_ctl = 0x0,
217 .emif_rd_wr_exec_thresh = 0x00000405
218};
219
220const u32 ext_phy_ctrl_const_base_ddr3[] = {
221 0x00400040,
222 0x00350035,
223 0x00350035,
224 0x00350035,
225 0x00350035,
226 0x00350035,
227 0x00000000,
228 0x00000000,
229 0x00000000,
230 0x00000000,
231 0x00000000,
232 0x00340034,
233 0x00340034,
234 0x00340034,
235 0x00340034,
236 0x00340034,
237 0x0,
238 0x0,
239 0x40000000,
240 0x08102040
241};
242
Lokesh Vutlad3daba12013-12-10 15:02:22 +0530243void emif_get_ext_phy_ctrl_const_regs(const u32 **regs, u32 *size)
244{
Lokesh Vutlab5e01ee2013-12-10 15:02:23 +0530245 if (board_is_eposevm()) {
246 *regs = ext_phy_ctrl_const_base_lpddr2;
247 *size = ARRAY_SIZE(ext_phy_ctrl_const_base_lpddr2);
248 } else if (board_is_gpevm()) {
249 *regs = ext_phy_ctrl_const_base_ddr3;
250 *size = ARRAY_SIZE(ext_phy_ctrl_const_base_ddr3);
251 }
Lokesh Vutlad3daba12013-12-10 15:02:22 +0530252
253 return;
254}
255
Lokesh Vutlafbf27282013-07-30 11:36:27 +0530256const struct dpll_params *get_dpll_ddr_params(void)
257{
Lokesh Vutlacf04d032013-12-10 15:02:20 +0530258 if (board_is_eposevm())
259 return &epos_evm_dpll_ddr;
260 else if (board_is_gpevm())
261 return &gp_evm_dpll_ddr;
262
263 puts(" Board not supported\n");
264 return NULL;
265}
266
267/*
268 * get_sys_clk_index : returns the index of the sys_clk read from
269 * ctrl status register. This value is either
270 * read from efuse or sysboot pins.
271 */
272static u32 get_sys_clk_index(void)
273{
274 struct ctrl_stat *ctrl = (struct ctrl_stat *)CTRL_BASE;
275 u32 ind = readl(&ctrl->statusreg), src;
276
277 src = (ind & CTRL_CRYSTAL_FREQ_SRC_MASK) >> CTRL_CRYSTAL_FREQ_SRC_SHIFT;
278 if (src == CTRL_CRYSTAL_FREQ_SRC_EFUSE) /* Value read from EFUSE */
279 return ((ind & CTRL_CRYSTAL_FREQ_SELECTION_MASK) >>
280 CTRL_CRYSTAL_FREQ_SELECTION_SHIFT);
281 else /* Value read from SYS BOOT pins */
282 return ((ind & CTRL_SYSBOOT_15_14_MASK) >>
283 CTRL_SYSBOOT_15_14_SHIFT);
284}
285
286/*
287 * get_opp_offset:
288 * Returns the index for safest OPP of the device to boot.
289 * max_off: Index of the MAX OPP in DEV ATTRIBUTE register.
290 * min_off: Index of the MIN OPP in DEV ATTRIBUTE register.
291 * This data is read from dev_attribute register which is e-fused.
292 * A'1' in bit indicates OPP disabled and not available, a '0' indicates
293 * OPP available. Lowest OPP starts with min_off. So returning the
294 * bit with rightmost '0'.
295 */
296static int get_opp_offset(int max_off, int min_off)
297{
298 struct ctrl_stat *ctrl = (struct ctrl_stat *)CTRL_BASE;
Tom Rinifeca6e62014-06-05 11:15:27 -0400299 int opp, offset, i;
300
301 /* Bits 0:11 are defined to be the MPU_MAX_FREQ */
302 opp = readl(&ctrl->dev_attr) & ~0xFFFFF000;
Lokesh Vutlacf04d032013-12-10 15:02:20 +0530303
304 for (i = max_off; i >= min_off; i--) {
305 offset = opp & (1 << i);
306 if (!offset)
307 return i;
308 }
309
310 return min_off;
311}
312
313const struct dpll_params *get_dpll_mpu_params(void)
314{
315 int opp = get_opp_offset(DEV_ATTR_MAX_OFFSET, DEV_ATTR_MIN_OFFSET);
316 u32 ind = get_sys_clk_index();
317
318 return &dpll_mpu[ind][opp];
319}
320
321const struct dpll_params *get_dpll_core_params(void)
322{
323 int ind = get_sys_clk_index();
324
325 return &dpll_core[ind];
326}
327
328const struct dpll_params *get_dpll_per_params(void)
329{
330 int ind = get_sys_clk_index();
331
332 return &dpll_per[ind];
Lokesh Vutlafbf27282013-07-30 11:36:27 +0530333}
334
Tom Rini83bad102014-06-05 11:15:30 -0400335void scale_vcores(void)
336{
337 const struct dpll_params *mpu_params;
338 int mpu_vdd;
339 struct am43xx_board_id header;
340
341 enable_i2c0_pin_mux();
342 i2c_init(CONFIG_SYS_OMAP24_I2C_SPEED, CONFIG_SYS_OMAP24_I2C_SLAVE);
343 if (read_eeprom(&header) < 0)
344 puts("Could not get board ID.\n");
345
346 /* Get the frequency */
347 mpu_params = get_dpll_mpu_params();
348
349 if (i2c_probe(TPS65218_CHIP_PM))
350 return;
351
352 if (mpu_params->m == 1000) {
353 mpu_vdd = TPS65218_DCDC_VOLT_SEL_1330MV;
354 } else if (mpu_params->m == 600) {
355 mpu_vdd = TPS65218_DCDC_VOLT_SEL_1100MV;
356 } else {
357 puts("Unknown MPU clock, not scaling\n");
358 return;
359 }
360
361 /* Set DCDC1 (CORE) voltage to 1.1V */
362 if (tps65218_voltage_update(TPS65218_DCDC1,
363 TPS65218_DCDC_VOLT_SEL_1100MV)) {
364 puts("tps65218_voltage_update failure\n");
365 return;
366 }
367
368 /* Set DCDC2 (MPU) voltage */
369 if (tps65218_voltage_update(TPS65218_DCDC2, mpu_vdd)) {
370 puts("tps65218_voltage_update failure\n");
371 return;
372 }
373}
374
Lokesh Vutlafbf27282013-07-30 11:36:27 +0530375void set_uart_mux_conf(void)
376{
377 enable_uart0_pin_mux();
378}
379
380void set_mux_conf_regs(void)
381{
382 enable_board_pin_mux();
383}
384
Lokesh Vutlab5e01ee2013-12-10 15:02:23 +0530385static void enable_vtt_regulator(void)
386{
387 u32 temp;
388
389 /* enable module */
Dave Gerlachcd8341b2014-02-10 11:41:49 -0500390 writel(GPIO_CTRL_ENABLEMODULE, AM33XX_GPIO5_BASE + OMAP_GPIO_CTRL);
Lokesh Vutlab5e01ee2013-12-10 15:02:23 +0530391
Dave Gerlachcd8341b2014-02-10 11:41:49 -0500392 /* enable output for GPIO5_7 */
393 writel(GPIO_SETDATAOUT(7),
394 AM33XX_GPIO5_BASE + OMAP_GPIO_SETDATAOUT);
395 temp = readl(AM33XX_GPIO5_BASE + OMAP_GPIO_OE);
396 temp = temp & ~(GPIO_OE_ENABLE(7));
397 writel(temp, AM33XX_GPIO5_BASE + OMAP_GPIO_OE);
Lokesh Vutlab5e01ee2013-12-10 15:02:23 +0530398}
399
Lokesh Vutlafbf27282013-07-30 11:36:27 +0530400void sdram_init(void)
401{
Lokesh Vutlab5e01ee2013-12-10 15:02:23 +0530402 /*
403 * EPOS EVM has 1GB LPDDR2 connected to EMIF.
404 * GP EMV has 1GB DDR3 connected to EMIF
405 * along with VTT regulator.
406 */
407 if (board_is_eposevm()) {
408 config_ddr(0, &ioregs_lpddr2, NULL, NULL, &emif_regs_lpddr2, 0);
409 } else if (board_is_gpevm()) {
410 enable_vtt_regulator();
411 config_ddr(0, &ioregs_ddr3, NULL, NULL,
412 &ddr3_emif_regs_400Mhz, 0);
413 }
Lokesh Vutlafbf27282013-07-30 11:36:27 +0530414}
415#endif
416
417int board_init(void)
418{
Lokesh Vutla369cbe12013-12-10 15:02:12 +0530419 gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100;
Lokesh Vutlafbf27282013-07-30 11:36:27 +0530420
421 return 0;
422}
423
424#ifdef CONFIG_BOARD_LATE_INIT
425int board_late_init(void)
426{
Sekhar Norif4af1632013-12-10 15:02:16 +0530427#ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
428 char safe_string[HDR_NAME_LEN + 1];
429 struct am43xx_board_id header;
430
431 if (read_eeprom(&header) < 0)
432 puts("Could not get board ID.\n");
433
434 /* Now set variables based on the header. */
435 strncpy(safe_string, (char *)header.name, sizeof(header.name));
436 safe_string[sizeof(header.name)] = 0;
437 setenv("board_name", safe_string);
438
439 strncpy(safe_string, (char *)header.version, sizeof(header.version));
440 safe_string[sizeof(header.version)] = 0;
441 setenv("board_rev", safe_string);
442#endif
Lokesh Vutlafbf27282013-07-30 11:36:27 +0530443 return 0;
444}
445#endif
Mugunthan V N4cdd7fd2014-02-18 07:31:54 -0500446
447#ifdef CONFIG_DRIVER_TI_CPSW
448
449static void cpsw_control(int enabled)
450{
451 /* Additional controls can be added here */
452 return;
453}
454
455static struct cpsw_slave_data cpsw_slaves[] = {
456 {
457 .slave_reg_ofs = 0x208,
458 .sliver_reg_ofs = 0xd80,
459 .phy_addr = 16,
460 },
461 {
462 .slave_reg_ofs = 0x308,
463 .sliver_reg_ofs = 0xdc0,
464 .phy_addr = 1,
465 },
466};
467
468static struct cpsw_platform_data cpsw_data = {
469 .mdio_base = CPSW_MDIO_BASE,
470 .cpsw_base = CPSW_BASE,
471 .mdio_div = 0xff,
472 .channels = 8,
473 .cpdma_reg_ofs = 0x800,
474 .slaves = 1,
475 .slave_data = cpsw_slaves,
476 .ale_reg_ofs = 0xd00,
477 .ale_entries = 1024,
478 .host_port_reg_ofs = 0x108,
479 .hw_stats_reg_ofs = 0x900,
480 .bd_ram_ofs = 0x2000,
481 .mac_control = (1 << 5),
482 .control = cpsw_control,
483 .host_port_num = 0,
484 .version = CPSW_CTRL_VERSION_2,
485};
486
487int board_eth_init(bd_t *bis)
488{
489 int rv;
490 uint8_t mac_addr[6];
491 uint32_t mac_hi, mac_lo;
492
493 /* try reading mac address from efuse */
494 mac_lo = readl(&cdev->macid0l);
495 mac_hi = readl(&cdev->macid0h);
496 mac_addr[0] = mac_hi & 0xFF;
497 mac_addr[1] = (mac_hi & 0xFF00) >> 8;
498 mac_addr[2] = (mac_hi & 0xFF0000) >> 16;
499 mac_addr[3] = (mac_hi & 0xFF000000) >> 24;
500 mac_addr[4] = mac_lo & 0xFF;
501 mac_addr[5] = (mac_lo & 0xFF00) >> 8;
502
503 if (!getenv("ethaddr")) {
504 puts("<ethaddr> not set. Validating first E-fuse MAC\n");
505 if (is_valid_ether_addr(mac_addr))
506 eth_setenv_enetaddr("ethaddr", mac_addr);
507 }
508
509 mac_lo = readl(&cdev->macid1l);
510 mac_hi = readl(&cdev->macid1h);
511 mac_addr[0] = mac_hi & 0xFF;
512 mac_addr[1] = (mac_hi & 0xFF00) >> 8;
513 mac_addr[2] = (mac_hi & 0xFF0000) >> 16;
514 mac_addr[3] = (mac_hi & 0xFF000000) >> 24;
515 mac_addr[4] = mac_lo & 0xFF;
516 mac_addr[5] = (mac_lo & 0xFF00) >> 8;
517
518 if (!getenv("eth1addr")) {
519 if (is_valid_ether_addr(mac_addr))
520 eth_setenv_enetaddr("eth1addr", mac_addr);
521 }
522
523 if (board_is_eposevm()) {
524 writel(RMII_MODE_ENABLE | RMII_CHIPCKL_ENABLE, &cdev->miisel);
525 cpsw_slaves[0].phy_if = PHY_INTERFACE_MODE_RMII;
526 cpsw_slaves[0].phy_addr = 16;
527 } else {
528 writel(RGMII_MODE_ENABLE, &cdev->miisel);
529 cpsw_slaves[0].phy_if = PHY_INTERFACE_MODE_RGMII;
530 cpsw_slaves[0].phy_addr = 0;
531 }
532
533 rv = cpsw_register(&cpsw_data);
534 if (rv < 0)
535 printf("Error %d registering CPSW switch\n", rv);
536
537 return rv;
538}
539#endif