blob: 054a452eac353e79f11a40fa686bf30a20fa1b60 [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
Felipe Balbi9cb9f332014-06-10 15:01:20 -0500220static const struct emif_regs ddr3_sk_emif_regs_400Mhz = {
221 .sdram_config = 0x638413b2,
222 .sdram_config2 = 0x00000000,
223 .ref_ctrl = 0x00000c30,
224 .sdram_tim1 = 0xeaaad4db,
225 .sdram_tim2 = 0x266b7fda,
226 .sdram_tim3 = 0x107f8678,
227 .read_idle_ctrl = 0x00050000,
228 .zq_config = 0x50074be4,
229 .temp_alert_config = 0x0,
230 .emif_ddr_phy_ctlr_1 = 0x0e084008,
231 .emif_ddr_ext_phy_ctrl_1 = 0x08020080,
232 .emif_ddr_ext_phy_ctrl_2 = 0x89,
233 .emif_ddr_ext_phy_ctrl_3 = 0x90,
234 .emif_ddr_ext_phy_ctrl_4 = 0x8e,
235 .emif_ddr_ext_phy_ctrl_5 = 0x8d,
236 .emif_rd_wr_lvl_rmp_win = 0x0,
237 .emif_rd_wr_lvl_rmp_ctl = 0x00000000,
238 .emif_rd_wr_lvl_ctl = 0x00000000,
239 .emif_rd_wr_exec_thresh = 0x00000000,
240};
241
Lokesh Vutlab5e01ee2013-12-10 15:02:23 +0530242const u32 ext_phy_ctrl_const_base_ddr3[] = {
243 0x00400040,
244 0x00350035,
245 0x00350035,
246 0x00350035,
247 0x00350035,
248 0x00350035,
249 0x00000000,
250 0x00000000,
251 0x00000000,
252 0x00000000,
253 0x00000000,
254 0x00340034,
255 0x00340034,
256 0x00340034,
257 0x00340034,
258 0x00340034,
259 0x0,
260 0x0,
261 0x40000000,
262 0x08102040
263};
264
Felipe Balbi9cb9f332014-06-10 15:01:20 -0500265static const u32 ext_phy_ctrl_const_base_ddr3_sk[] = {
266 /* first 5 are taken care by emif_regs */
267 0x00700070,
268
269 0x00350035,
270 0x00350035,
271 0x00350035,
272 0x00350035,
273 0x00350035,
274
275 0x00000000,
276 0x00000000,
277 0x00000000,
278 0x00000000,
279 0x00000000,
280
281 0x00150015,
282 0x00150015,
283 0x00150015,
284 0x00150015,
285 0x00150015,
286
287 0x00800080,
288 0x00800080,
289
290 0x40000000,
291
292 0x08102040,
293
294 0x00000000,
295 0x00000000,
296 0x00000000,
297 0x00000000,
298 0x00000000,
299 0x00000000,
300 0x00000000,
301 0x00000000,
302 0x00000000,
303 0x00000000,
304 0x00000000,
305};
306
Lokesh Vutlad3daba12013-12-10 15:02:22 +0530307void emif_get_ext_phy_ctrl_const_regs(const u32 **regs, u32 *size)
308{
Lokesh Vutlab5e01ee2013-12-10 15:02:23 +0530309 if (board_is_eposevm()) {
310 *regs = ext_phy_ctrl_const_base_lpddr2;
311 *size = ARRAY_SIZE(ext_phy_ctrl_const_base_lpddr2);
312 } else if (board_is_gpevm()) {
313 *regs = ext_phy_ctrl_const_base_ddr3;
314 *size = ARRAY_SIZE(ext_phy_ctrl_const_base_ddr3);
Felipe Balbi9cb9f332014-06-10 15:01:20 -0500315 } else if (board_is_sk()) {
316 *regs = ext_phy_ctrl_const_base_ddr3_sk;
317 *size = ARRAY_SIZE(ext_phy_ctrl_const_base_ddr3_sk);
Lokesh Vutlab5e01ee2013-12-10 15:02:23 +0530318 }
Lokesh Vutlad3daba12013-12-10 15:02:22 +0530319
320 return;
321}
322
Lokesh Vutlafbf27282013-07-30 11:36:27 +0530323const struct dpll_params *get_dpll_ddr_params(void)
324{
Lokesh Vutlacf04d032013-12-10 15:02:20 +0530325 if (board_is_eposevm())
326 return &epos_evm_dpll_ddr;
Felipe Balbi9cb9f332014-06-10 15:01:20 -0500327 else if (board_is_gpevm() || board_is_sk())
Lokesh Vutlacf04d032013-12-10 15:02:20 +0530328 return &gp_evm_dpll_ddr;
329
Felipe Balbid51e5ae2014-06-10 15:01:18 -0500330 printf(" Board '%s' not supported\n", am43xx_board_name);
Lokesh Vutlacf04d032013-12-10 15:02:20 +0530331 return NULL;
332}
333
334/*
335 * get_sys_clk_index : returns the index of the sys_clk read from
336 * ctrl status register. This value is either
337 * read from efuse or sysboot pins.
338 */
339static u32 get_sys_clk_index(void)
340{
341 struct ctrl_stat *ctrl = (struct ctrl_stat *)CTRL_BASE;
342 u32 ind = readl(&ctrl->statusreg), src;
343
344 src = (ind & CTRL_CRYSTAL_FREQ_SRC_MASK) >> CTRL_CRYSTAL_FREQ_SRC_SHIFT;
345 if (src == CTRL_CRYSTAL_FREQ_SRC_EFUSE) /* Value read from EFUSE */
346 return ((ind & CTRL_CRYSTAL_FREQ_SELECTION_MASK) >>
347 CTRL_CRYSTAL_FREQ_SELECTION_SHIFT);
348 else /* Value read from SYS BOOT pins */
349 return ((ind & CTRL_SYSBOOT_15_14_MASK) >>
350 CTRL_SYSBOOT_15_14_SHIFT);
351}
352
353/*
354 * get_opp_offset:
355 * Returns the index for safest OPP of the device to boot.
356 * max_off: Index of the MAX OPP in DEV ATTRIBUTE register.
357 * min_off: Index of the MIN OPP in DEV ATTRIBUTE register.
358 * This data is read from dev_attribute register which is e-fused.
359 * A'1' in bit indicates OPP disabled and not available, a '0' indicates
360 * OPP available. Lowest OPP starts with min_off. So returning the
361 * bit with rightmost '0'.
362 */
363static int get_opp_offset(int max_off, int min_off)
364{
365 struct ctrl_stat *ctrl = (struct ctrl_stat *)CTRL_BASE;
Tom Rinifeca6e62014-06-05 11:15:27 -0400366 int opp, offset, i;
367
368 /* Bits 0:11 are defined to be the MPU_MAX_FREQ */
369 opp = readl(&ctrl->dev_attr) & ~0xFFFFF000;
Lokesh Vutlacf04d032013-12-10 15:02:20 +0530370
371 for (i = max_off; i >= min_off; i--) {
372 offset = opp & (1 << i);
373 if (!offset)
374 return i;
375 }
376
377 return min_off;
378}
379
380const struct dpll_params *get_dpll_mpu_params(void)
381{
382 int opp = get_opp_offset(DEV_ATTR_MAX_OFFSET, DEV_ATTR_MIN_OFFSET);
383 u32 ind = get_sys_clk_index();
384
385 return &dpll_mpu[ind][opp];
386}
387
388const struct dpll_params *get_dpll_core_params(void)
389{
390 int ind = get_sys_clk_index();
391
392 return &dpll_core[ind];
393}
394
395const struct dpll_params *get_dpll_per_params(void)
396{
397 int ind = get_sys_clk_index();
398
399 return &dpll_per[ind];
Lokesh Vutlafbf27282013-07-30 11:36:27 +0530400}
401
Tom Rini83bad102014-06-05 11:15:30 -0400402void scale_vcores(void)
403{
404 const struct dpll_params *mpu_params;
405 int mpu_vdd;
406 struct am43xx_board_id header;
407
408 enable_i2c0_pin_mux();
409 i2c_init(CONFIG_SYS_OMAP24_I2C_SPEED, CONFIG_SYS_OMAP24_I2C_SLAVE);
410 if (read_eeprom(&header) < 0)
411 puts("Could not get board ID.\n");
412
413 /* Get the frequency */
414 mpu_params = get_dpll_mpu_params();
415
416 if (i2c_probe(TPS65218_CHIP_PM))
417 return;
418
419 if (mpu_params->m == 1000) {
420 mpu_vdd = TPS65218_DCDC_VOLT_SEL_1330MV;
421 } else if (mpu_params->m == 600) {
422 mpu_vdd = TPS65218_DCDC_VOLT_SEL_1100MV;
423 } else {
424 puts("Unknown MPU clock, not scaling\n");
425 return;
426 }
427
428 /* Set DCDC1 (CORE) voltage to 1.1V */
429 if (tps65218_voltage_update(TPS65218_DCDC1,
430 TPS65218_DCDC_VOLT_SEL_1100MV)) {
431 puts("tps65218_voltage_update failure\n");
432 return;
433 }
434
435 /* Set DCDC2 (MPU) voltage */
436 if (tps65218_voltage_update(TPS65218_DCDC2, mpu_vdd)) {
437 puts("tps65218_voltage_update failure\n");
438 return;
439 }
440}
441
Lokesh Vutlafbf27282013-07-30 11:36:27 +0530442void set_uart_mux_conf(void)
443{
444 enable_uart0_pin_mux();
445}
446
447void set_mux_conf_regs(void)
448{
449 enable_board_pin_mux();
450}
451
Lokesh Vutlab5e01ee2013-12-10 15:02:23 +0530452static void enable_vtt_regulator(void)
453{
454 u32 temp;
455
456 /* enable module */
Dave Gerlachcd8341b2014-02-10 11:41:49 -0500457 writel(GPIO_CTRL_ENABLEMODULE, AM33XX_GPIO5_BASE + OMAP_GPIO_CTRL);
Lokesh Vutlab5e01ee2013-12-10 15:02:23 +0530458
Dave Gerlachcd8341b2014-02-10 11:41:49 -0500459 /* enable output for GPIO5_7 */
460 writel(GPIO_SETDATAOUT(7),
461 AM33XX_GPIO5_BASE + OMAP_GPIO_SETDATAOUT);
462 temp = readl(AM33XX_GPIO5_BASE + OMAP_GPIO_OE);
463 temp = temp & ~(GPIO_OE_ENABLE(7));
464 writel(temp, AM33XX_GPIO5_BASE + OMAP_GPIO_OE);
Lokesh Vutlab5e01ee2013-12-10 15:02:23 +0530465}
466
Lokesh Vutlafbf27282013-07-30 11:36:27 +0530467void sdram_init(void)
468{
Lokesh Vutlab5e01ee2013-12-10 15:02:23 +0530469 /*
470 * EPOS EVM has 1GB LPDDR2 connected to EMIF.
471 * GP EMV has 1GB DDR3 connected to EMIF
472 * along with VTT regulator.
473 */
474 if (board_is_eposevm()) {
475 config_ddr(0, &ioregs_lpddr2, NULL, NULL, &emif_regs_lpddr2, 0);
476 } else if (board_is_gpevm()) {
477 enable_vtt_regulator();
478 config_ddr(0, &ioregs_ddr3, NULL, NULL,
479 &ddr3_emif_regs_400Mhz, 0);
Felipe Balbi9cb9f332014-06-10 15:01:20 -0500480 } else if (board_is_sk()) {
481 config_ddr(400, &ioregs_ddr3, NULL, NULL,
482 &ddr3_sk_emif_regs_400Mhz, 0);
Lokesh Vutlab5e01ee2013-12-10 15:02:23 +0530483 }
Lokesh Vutlafbf27282013-07-30 11:36:27 +0530484}
485#endif
486
487int board_init(void)
488{
Lokesh Vutla369cbe12013-12-10 15:02:12 +0530489 gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100;
Lokesh Vutlafbf27282013-07-30 11:36:27 +0530490
491 return 0;
492}
493
494#ifdef CONFIG_BOARD_LATE_INIT
495int board_late_init(void)
496{
Sekhar Norif4af1632013-12-10 15:02:16 +0530497#ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
498 char safe_string[HDR_NAME_LEN + 1];
499 struct am43xx_board_id header;
500
501 if (read_eeprom(&header) < 0)
502 puts("Could not get board ID.\n");
503
504 /* Now set variables based on the header. */
505 strncpy(safe_string, (char *)header.name, sizeof(header.name));
506 safe_string[sizeof(header.name)] = 0;
507 setenv("board_name", safe_string);
508
509 strncpy(safe_string, (char *)header.version, sizeof(header.version));
510 safe_string[sizeof(header.version)] = 0;
511 setenv("board_rev", safe_string);
512#endif
Lokesh Vutlafbf27282013-07-30 11:36:27 +0530513 return 0;
514}
515#endif
Mugunthan V N4cdd7fd2014-02-18 07:31:54 -0500516
517#ifdef CONFIG_DRIVER_TI_CPSW
518
519static void cpsw_control(int enabled)
520{
521 /* Additional controls can be added here */
522 return;
523}
524
525static struct cpsw_slave_data cpsw_slaves[] = {
526 {
527 .slave_reg_ofs = 0x208,
528 .sliver_reg_ofs = 0xd80,
529 .phy_addr = 16,
530 },
531 {
532 .slave_reg_ofs = 0x308,
533 .sliver_reg_ofs = 0xdc0,
534 .phy_addr = 1,
535 },
536};
537
538static struct cpsw_platform_data cpsw_data = {
539 .mdio_base = CPSW_MDIO_BASE,
540 .cpsw_base = CPSW_BASE,
541 .mdio_div = 0xff,
542 .channels = 8,
543 .cpdma_reg_ofs = 0x800,
544 .slaves = 1,
545 .slave_data = cpsw_slaves,
546 .ale_reg_ofs = 0xd00,
547 .ale_entries = 1024,
548 .host_port_reg_ofs = 0x108,
549 .hw_stats_reg_ofs = 0x900,
550 .bd_ram_ofs = 0x2000,
551 .mac_control = (1 << 5),
552 .control = cpsw_control,
553 .host_port_num = 0,
554 .version = CPSW_CTRL_VERSION_2,
555};
556
557int board_eth_init(bd_t *bis)
558{
559 int rv;
560 uint8_t mac_addr[6];
561 uint32_t mac_hi, mac_lo;
562
563 /* try reading mac address from efuse */
564 mac_lo = readl(&cdev->macid0l);
565 mac_hi = readl(&cdev->macid0h);
566 mac_addr[0] = mac_hi & 0xFF;
567 mac_addr[1] = (mac_hi & 0xFF00) >> 8;
568 mac_addr[2] = (mac_hi & 0xFF0000) >> 16;
569 mac_addr[3] = (mac_hi & 0xFF000000) >> 24;
570 mac_addr[4] = mac_lo & 0xFF;
571 mac_addr[5] = (mac_lo & 0xFF00) >> 8;
572
573 if (!getenv("ethaddr")) {
574 puts("<ethaddr> not set. Validating first E-fuse MAC\n");
575 if (is_valid_ether_addr(mac_addr))
576 eth_setenv_enetaddr("ethaddr", mac_addr);
577 }
578
579 mac_lo = readl(&cdev->macid1l);
580 mac_hi = readl(&cdev->macid1h);
581 mac_addr[0] = mac_hi & 0xFF;
582 mac_addr[1] = (mac_hi & 0xFF00) >> 8;
583 mac_addr[2] = (mac_hi & 0xFF0000) >> 16;
584 mac_addr[3] = (mac_hi & 0xFF000000) >> 24;
585 mac_addr[4] = mac_lo & 0xFF;
586 mac_addr[5] = (mac_lo & 0xFF00) >> 8;
587
588 if (!getenv("eth1addr")) {
589 if (is_valid_ether_addr(mac_addr))
590 eth_setenv_enetaddr("eth1addr", mac_addr);
591 }
592
593 if (board_is_eposevm()) {
594 writel(RMII_MODE_ENABLE | RMII_CHIPCKL_ENABLE, &cdev->miisel);
595 cpsw_slaves[0].phy_if = PHY_INTERFACE_MODE_RMII;
596 cpsw_slaves[0].phy_addr = 16;
Felipe Balbi619ce622014-06-10 15:01:21 -0500597 } else if (board_is_sk()) {
598 writel(RGMII_MODE_ENABLE, &cdev->miisel);
599 cpsw_slaves[0].phy_if = PHY_INTERFACE_MODE_RGMII;
600 cpsw_slaves[0].phy_addr = 4;
601 cpsw_slaves[1].phy_addr = 5;
Mugunthan V N4cdd7fd2014-02-18 07:31:54 -0500602 } else {
603 writel(RGMII_MODE_ENABLE, &cdev->miisel);
604 cpsw_slaves[0].phy_if = PHY_INTERFACE_MODE_RGMII;
605 cpsw_slaves[0].phy_addr = 0;
606 }
607
608 rv = cpsw_register(&cpsw_data);
609 if (rv < 0)
610 printf("Error %d registering CPSW switch\n", rv);
611
612 return rv;
613}
614#endif