]> git.kernelconcepts.de Git - karo-tx-uboot.git/blob - board/ti/am43xx/board.c
51fa9e04a3fb3220d42b1a035f96a060eb1d65c6
[karo-tx-uboot.git] / board / ti / am43xx / board.c
1 /*
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>
12 #include <i2c.h>
13 #include <asm/errno.h>
14 #include <spl.h>
15 #include <asm/arch/clock.h>
16 #include <asm/arch/sys_proto.h>
17 #include <asm/arch/mux.h>
18 #include <asm/arch/ddr_defs.h>
19 #include <asm/arch/gpio.h>
20 #include <asm/emif.h>
21 #include "board.h"
22 #include <power/pmic.h>
23 #include <power/tps65218.h>
24 #include <miiphy.h>
25 #include <cpsw.h>
26
27 DECLARE_GLOBAL_DATA_PTR;
28
29 static struct ctrl_dev *cdev = (struct ctrl_dev *)CTRL_DEVICE_BASE;
30
31 /*
32  * Read header information from EEPROM into global structure.
33  */
34 static int read_eeprom(struct am43xx_board_id *header)
35 {
36         /* Check if baseboard eeprom is available */
37         if (i2c_probe(CONFIG_SYS_I2C_EEPROM_ADDR)) {
38                 printf("Could not probe the EEPROM at 0x%x\n",
39                        CONFIG_SYS_I2C_EEPROM_ADDR);
40                 return -ENODEV;
41         }
42
43         /* read the eeprom using i2c */
44         if (i2c_read(CONFIG_SYS_I2C_EEPROM_ADDR, 0, 2, (uchar *)header,
45                      sizeof(struct am43xx_board_id))) {
46                 printf("Could not read the EEPROM\n");
47                 return -EIO;
48         }
49
50         if (header->magic != 0xEE3355AA) {
51                 /*
52                  * read the eeprom using i2c again,
53                  * but use only a 1 byte address
54                  */
55                 if (i2c_read(CONFIG_SYS_I2C_EEPROM_ADDR, 0, 1, (uchar *)header,
56                              sizeof(struct am43xx_board_id))) {
57                         printf("Could not read the EEPROM at 0x%x\n",
58                                CONFIG_SYS_I2C_EEPROM_ADDR);
59                         return -EIO;
60                 }
61
62                 if (header->magic != 0xEE3355AA) {
63                         printf("Incorrect magic number (0x%x) in EEPROM\n",
64                                header->magic);
65                         return -EINVAL;
66                 }
67         }
68
69         strncpy(am43xx_board_name, (char *)header->name, sizeof(header->name));
70         am43xx_board_name[sizeof(header->name)] = 0;
71
72         strncpy(am43xx_board_rev, (char *)header->version, sizeof(header->version));
73         am43xx_board_rev[sizeof(header->version)] = 0;
74
75         return 0;
76 }
77
78 #ifndef CONFIG_SKIP_LOWLEVEL_INIT
79
80 #define NUM_OPPS        6
81
82 const struct dpll_params dpll_mpu[NUM_CRYSTAL_FREQ][NUM_OPPS] = {
83         {       /* 19.2 MHz */
84                 {-1, -1, -1, -1, -1, -1, -1},   /* OPP 50 */
85                 {-1, -1, -1, -1, -1, -1, -1},   /* OPP RESERVED */
86                 {-1, -1, -1, -1, -1, -1, -1},   /* OPP 100 */
87                 {-1, -1, -1, -1, -1, -1, -1},   /* OPP 120 */
88                 {-1, -1, -1, -1, -1, -1, -1},   /* OPP TB */
89                 {-1, -1, -1, -1, -1, -1, -1}    /* OPP NT */
90         },
91         {       /* 24 MHz */
92                 {300, 23, 1, -1, -1, -1, -1},   /* OPP 50 */
93                 {-1, -1, -1, -1, -1, -1, -1},   /* OPP RESERVED */
94                 {600, 23, 1, -1, -1, -1, -1},   /* OPP 100 */
95                 {720, 23, 1, -1, -1, -1, -1},   /* OPP 120 */
96                 {800, 23, 1, -1, -1, -1, -1},   /* OPP TB */
97                 {1000, 23, 1, -1, -1, -1, -1}   /* OPP NT */
98         },
99         {       /* 25 MHz */
100                 {300, 24, 1, -1, -1, -1, -1},   /* OPP 50 */
101                 {-1, -1, -1, -1, -1, -1, -1},   /* OPP RESERVED */
102                 {600, 24, 1, -1, -1, -1, -1},   /* OPP 100 */
103                 {720, 24, 1, -1, -1, -1, -1},   /* OPP 120 */
104                 {800, 24, 1, -1, -1, -1, -1},   /* OPP TB */
105                 {1000, 24, 1, -1, -1, -1, -1}   /* OPP NT */
106         },
107         {       /* 26 MHz */
108                 {300, 25, 1, -1, -1, -1, -1},   /* OPP 50 */
109                 {-1, -1, -1, -1, -1, -1, -1},   /* OPP RESERVED */
110                 {600, 25, 1, -1, -1, -1, -1},   /* OPP 100 */
111                 {720, 25, 1, -1, -1, -1, -1},   /* OPP 120 */
112                 {800, 25, 1, -1, -1, -1, -1},   /* OPP TB */
113                 {1000, 25, 1, -1, -1, -1, -1}   /* OPP NT */
114         },
115 };
116
117 const struct dpll_params dpll_core[NUM_CRYSTAL_FREQ] = {
118                 {-1, -1, -1, -1, -1, -1, -1},   /* 19.2 MHz */
119                 {1000, 23, -1, -1, 10, 8, 4},   /* 24 MHz */
120                 {1000, 24, -1, -1, 10, 8, 4},   /* 25 MHz */
121                 {1000, 25, -1, -1, 10, 8, 4}    /* 26 MHz */
122 };
123
124 const struct dpll_params dpll_per[NUM_CRYSTAL_FREQ] = {
125                 {-1, -1, -1, -1, -1, -1, -1},   /* 19.2 MHz */
126                 {960, 23, 5, -1, -1, -1, -1},   /* 24 MHz */
127                 {960, 24, 5, -1, -1, -1, -1},   /* 25 MHz */
128                 {960, 25, 5, -1, -1, -1, -1}    /* 26 MHz */
129 };
130
131 const struct dpll_params epos_evm_dpll_ddr = {
132                 266, 24, 1, -1, 1, -1, -1};
133
134 const struct dpll_params gp_evm_dpll_ddr = {
135                 400, 23, 1, -1, 1, -1, -1};
136
137 const struct ctrl_ioregs ioregs_lpddr2 = {
138         .cm0ioctl               = LPDDR2_ADDRCTRL_IOCTRL_VALUE,
139         .cm1ioctl               = LPDDR2_ADDRCTRL_WD0_IOCTRL_VALUE,
140         .cm2ioctl               = LPDDR2_ADDRCTRL_WD1_IOCTRL_VALUE,
141         .dt0ioctl               = LPDDR2_DATA0_IOCTRL_VALUE,
142         .dt1ioctl               = LPDDR2_DATA0_IOCTRL_VALUE,
143         .dt2ioctrl              = LPDDR2_DATA0_IOCTRL_VALUE,
144         .dt3ioctrl              = LPDDR2_DATA0_IOCTRL_VALUE,
145         .emif_sdram_config_ext  = 0x1,
146 };
147
148 const struct emif_regs emif_regs_lpddr2 = {
149         .sdram_config                   = 0x808012BA,
150         .ref_ctrl                       = 0x0000040D,
151         .sdram_tim1                     = 0xEA86B411,
152         .sdram_tim2                     = 0x103A094A,
153         .sdram_tim3                     = 0x0F6BA37F,
154         .read_idle_ctrl                 = 0x00050000,
155         .zq_config                      = 0x50074BE4,
156         .temp_alert_config              = 0x0,
157         .emif_rd_wr_lvl_rmp_win         = 0x0,
158         .emif_rd_wr_lvl_rmp_ctl         = 0x0,
159         .emif_rd_wr_lvl_ctl             = 0x0,
160         .emif_ddr_phy_ctlr_1            = 0x0E084006,
161         .emif_rd_wr_exec_thresh         = 0x80000405,
162         .emif_ddr_ext_phy_ctrl_1        = 0x04010040,
163         .emif_ddr_ext_phy_ctrl_2        = 0x00500050,
164         .emif_ddr_ext_phy_ctrl_3        = 0x00500050,
165         .emif_ddr_ext_phy_ctrl_4        = 0x00500050,
166         .emif_ddr_ext_phy_ctrl_5        = 0x00500050,
167         .emif_prio_class_serv_map       = 0x80000001,
168         .emif_connect_id_serv_1_map     = 0x80000094,
169         .emif_connect_id_serv_2_map     = 0x00000000,
170         .emif_cos_config                        = 0x000FFFFF
171 };
172
173 const u32 ext_phy_ctrl_const_base_lpddr2[] = {
174         0x00500050,
175         0x00350035,
176         0x00350035,
177         0x00350035,
178         0x00350035,
179         0x00350035,
180         0x00000000,
181         0x00000000,
182         0x00000000,
183         0x00000000,
184         0x00000000,
185         0x00000000,
186         0x00000000,
187         0x00000000,
188         0x00000000,
189         0x00000000,
190         0x00000000,
191         0x00000000,
192         0x40001000,
193         0x08102040
194 };
195
196 const struct ctrl_ioregs ioregs_ddr3 = {
197         .cm0ioctl               = DDR3_ADDRCTRL_IOCTRL_VALUE,
198         .cm1ioctl               = DDR3_ADDRCTRL_WD0_IOCTRL_VALUE,
199         .cm2ioctl               = DDR3_ADDRCTRL_WD1_IOCTRL_VALUE,
200         .dt0ioctl               = DDR3_DATA0_IOCTRL_VALUE,
201         .dt1ioctl               = DDR3_DATA0_IOCTRL_VALUE,
202         .dt2ioctrl              = DDR3_DATA0_IOCTRL_VALUE,
203         .dt3ioctrl              = DDR3_DATA0_IOCTRL_VALUE,
204         .emif_sdram_config_ext  = 0x0143,
205 };
206
207 const struct emif_regs ddr3_emif_regs_400Mhz = {
208         .sdram_config                   = 0x638413B2,
209         .ref_ctrl                       = 0x00000C30,
210         .sdram_tim1                     = 0xEAAAD4DB,
211         .sdram_tim2                     = 0x266B7FDA,
212         .sdram_tim3                     = 0x107F8678,
213         .read_idle_ctrl                 = 0x00050000,
214         .zq_config                      = 0x50074BE4,
215         .temp_alert_config              = 0x0,
216         .emif_ddr_phy_ctlr_1            = 0x0E004008,
217         .emif_ddr_ext_phy_ctrl_1        = 0x08020080,
218         .emif_ddr_ext_phy_ctrl_2        = 0x00400040,
219         .emif_ddr_ext_phy_ctrl_3        = 0x00400040,
220         .emif_ddr_ext_phy_ctrl_4        = 0x00400040,
221         .emif_ddr_ext_phy_ctrl_5        = 0x00400040,
222         .emif_rd_wr_lvl_rmp_win         = 0x0,
223         .emif_rd_wr_lvl_rmp_ctl         = 0x0,
224         .emif_rd_wr_lvl_ctl             = 0x0,
225         .emif_rd_wr_exec_thresh         = 0x80000405,
226         .emif_prio_class_serv_map       = 0x80000001,
227         .emif_connect_id_serv_1_map     = 0x80000094,
228         .emif_connect_id_serv_2_map     = 0x00000000,
229         .emif_cos_config                = 0x000FFFFF
230 };
231
232 /* EMIF DDR3 Configurations are different for beta AM43X GP EVMs */
233 const struct emif_regs ddr3_emif_regs_400Mhz_beta = {
234         .sdram_config                   = 0x638413B2,
235         .ref_ctrl                       = 0x00000C30,
236         .sdram_tim1                     = 0xEAAAD4DB,
237         .sdram_tim2                     = 0x266B7FDA,
238         .sdram_tim3                     = 0x107F8678,
239         .read_idle_ctrl                 = 0x00050000,
240         .zq_config                      = 0x50074BE4,
241         .temp_alert_config              = 0x0,
242         .emif_ddr_phy_ctlr_1            = 0x0E004008,
243         .emif_ddr_ext_phy_ctrl_1        = 0x08020080,
244         .emif_ddr_ext_phy_ctrl_2        = 0x00000065,
245         .emif_ddr_ext_phy_ctrl_3        = 0x00000091,
246         .emif_ddr_ext_phy_ctrl_4        = 0x000000B5,
247         .emif_ddr_ext_phy_ctrl_5        = 0x000000E5,
248         .emif_rd_wr_exec_thresh         = 0x80000405,
249         .emif_prio_class_serv_map       = 0x80000001,
250         .emif_connect_id_serv_1_map     = 0x80000094,
251         .emif_connect_id_serv_2_map     = 0x00000000,
252         .emif_cos_config                = 0x000FFFFF
253 };
254
255 /* EMIF DDR3 Configurations are different for production AM43X GP EVMs */
256 const struct emif_regs ddr3_emif_regs_400Mhz_production = {
257         .sdram_config                   = 0x638413B2,
258         .ref_ctrl                       = 0x00000C30,
259         .sdram_tim1                     = 0xEAAAD4DB,
260         .sdram_tim2                     = 0x266B7FDA,
261         .sdram_tim3                     = 0x107F8678,
262         .read_idle_ctrl                 = 0x00050000,
263         .zq_config                      = 0x50074BE4,
264         .temp_alert_config              = 0x0,
265         .emif_ddr_phy_ctlr_1            = 0x0E004008,
266         .emif_ddr_ext_phy_ctrl_1        = 0x08020080,
267         .emif_ddr_ext_phy_ctrl_2        = 0x00000066,
268         .emif_ddr_ext_phy_ctrl_3        = 0x00000091,
269         .emif_ddr_ext_phy_ctrl_4        = 0x000000B9,
270         .emif_ddr_ext_phy_ctrl_5        = 0x000000E6,
271         .emif_rd_wr_exec_thresh         = 0x80000405,
272         .emif_prio_class_serv_map       = 0x80000001,
273         .emif_connect_id_serv_1_map     = 0x80000094,
274         .emif_connect_id_serv_2_map     = 0x00000000,
275         .emif_cos_config                = 0x000FFFFF
276 };
277
278 static const struct emif_regs ddr3_sk_emif_regs_400Mhz = {
279         .sdram_config                   = 0x638413b2,
280         .sdram_config2                  = 0x00000000,
281         .ref_ctrl                       = 0x00000c30,
282         .sdram_tim1                     = 0xeaaad4db,
283         .sdram_tim2                     = 0x266b7fda,
284         .sdram_tim3                     = 0x107f8678,
285         .read_idle_ctrl                 = 0x00050000,
286         .zq_config                      = 0x50074be4,
287         .temp_alert_config              = 0x0,
288         .emif_ddr_phy_ctlr_1            = 0x0e084008,
289         .emif_ddr_ext_phy_ctrl_1        = 0x08020080,
290         .emif_ddr_ext_phy_ctrl_2        = 0x89,
291         .emif_ddr_ext_phy_ctrl_3        = 0x90,
292         .emif_ddr_ext_phy_ctrl_4        = 0x8e,
293         .emif_ddr_ext_phy_ctrl_5        = 0x8d,
294         .emif_rd_wr_lvl_rmp_win         = 0x0,
295         .emif_rd_wr_lvl_rmp_ctl         = 0x00000000,
296         .emif_rd_wr_lvl_ctl             = 0x00000000,
297         .emif_rd_wr_exec_thresh         = 0x80000000,
298         .emif_prio_class_serv_map       = 0x80000001,
299         .emif_connect_id_serv_1_map     = 0x80000094,
300         .emif_connect_id_serv_2_map     = 0x00000000,
301         .emif_cos_config                = 0x000FFFFF
302 };
303
304 const u32 ext_phy_ctrl_const_base_ddr3[] = {
305         0x00400040,
306         0x00350035,
307         0x00350035,
308         0x00350035,
309         0x00350035,
310         0x00350035,
311         0x00000000,
312         0x00000000,
313         0x00000000,
314         0x00000000,
315         0x00000000,
316         0x00340034,
317         0x00340034,
318         0x00340034,
319         0x00340034,
320         0x00340034,
321         0x0,
322         0x0,
323         0x40000000,
324         0x08102040
325 };
326
327 const u32 ext_phy_ctrl_const_base_ddr3_beta[] = {
328         0x00000000,
329         0x00000045,
330         0x00000046,
331         0x00000048,
332         0x00000047,
333         0x00000000,
334         0x0000004C,
335         0x00000070,
336         0x00000085,
337         0x000000A3,
338         0x00000000,
339         0x0000000C,
340         0x00000030,
341         0x00000045,
342         0x00000063,
343         0x00000000,
344         0x0,
345         0x0,
346         0x40000000,
347         0x08102040
348 };
349
350 const u32 ext_phy_ctrl_const_base_ddr3_production[] = {
351         0x00000000,
352         0x00000044,
353         0x00000044,
354         0x00000046,
355         0x00000046,
356         0x00000000,
357         0x00000059,
358         0x00000077,
359         0x00000093,
360         0x000000A8,
361         0x00000000,
362         0x00000019,
363         0x00000037,
364         0x00000053,
365         0x00000068,
366         0x00000000,
367         0x0,
368         0x0,
369         0x40000000,
370         0x08102040
371 };
372
373 static const u32 ext_phy_ctrl_const_base_ddr3_sk[] = {
374         /* first 5 are taken care by emif_regs */
375         0x00700070,
376
377         0x00350035,
378         0x00350035,
379         0x00350035,
380         0x00350035,
381         0x00350035,
382
383         0x00000000,
384         0x00000000,
385         0x00000000,
386         0x00000000,
387         0x00000000,
388
389         0x00150015,
390         0x00150015,
391         0x00150015,
392         0x00150015,
393         0x00150015,
394
395         0x00800080,
396         0x00800080,
397
398         0x40000000,
399
400         0x08102040,
401
402         0x00000000,
403         0x00000000,
404         0x00000000,
405         0x00000000,
406         0x00000000,
407         0x00000000,
408         0x00000000,
409         0x00000000,
410         0x00000000,
411         0x00000000,
412         0x00000000,
413 };
414
415 void emif_get_ext_phy_ctrl_const_regs(const u32 **regs, u32 *size)
416 {
417         if (board_is_eposevm()) {
418                 *regs = ext_phy_ctrl_const_base_lpddr2;
419                 *size = ARRAY_SIZE(ext_phy_ctrl_const_base_lpddr2);
420         } else if (board_is_evm_14_or_later()) {
421                 *regs = ext_phy_ctrl_const_base_ddr3_production;
422                 *size = ARRAY_SIZE(ext_phy_ctrl_const_base_ddr3_production);
423         } else if (board_is_evm_12_or_later()) {
424                 *regs = ext_phy_ctrl_const_base_ddr3_beta;
425                 *size = ARRAY_SIZE(ext_phy_ctrl_const_base_ddr3_beta);
426         } else if (board_is_gpevm()) {
427                 *regs = ext_phy_ctrl_const_base_ddr3;
428                 *size = ARRAY_SIZE(ext_phy_ctrl_const_base_ddr3);
429         } else if (board_is_sk()) {
430                 *regs = ext_phy_ctrl_const_base_ddr3_sk;
431                 *size = ARRAY_SIZE(ext_phy_ctrl_const_base_ddr3_sk);
432         }
433
434         return;
435 }
436
437 const struct dpll_params *get_dpll_ddr_params(void)
438 {
439         if (board_is_eposevm())
440                 return &epos_evm_dpll_ddr;
441         else if (board_is_gpevm() || board_is_sk())
442                 return &gp_evm_dpll_ddr;
443
444         printf(" Board '%s' not supported\n", am43xx_board_name);
445         return NULL;
446 }
447
448 /*
449  * get_sys_clk_index : returns the index of the sys_clk read from
450  *                      ctrl status register. This value is either
451  *                      read from efuse or sysboot pins.
452  */
453 static u32 get_sys_clk_index(void)
454 {
455         struct ctrl_stat *ctrl = (struct ctrl_stat *)CTRL_BASE;
456         u32 ind = readl(&ctrl->statusreg), src;
457
458         src = (ind & CTRL_CRYSTAL_FREQ_SRC_MASK) >> CTRL_CRYSTAL_FREQ_SRC_SHIFT;
459         if (src == CTRL_CRYSTAL_FREQ_SRC_EFUSE) /* Value read from EFUSE */
460                 return ((ind & CTRL_CRYSTAL_FREQ_SELECTION_MASK) >>
461                         CTRL_CRYSTAL_FREQ_SELECTION_SHIFT);
462         else /* Value read from SYS BOOT pins */
463                 return ((ind & CTRL_SYSBOOT_15_14_MASK) >>
464                         CTRL_SYSBOOT_15_14_SHIFT);
465 }
466
467 /*
468  * get_opp_offset:
469  * Returns the index for safest OPP of the device to boot.
470  * max_off:     Index of the MAX OPP in DEV ATTRIBUTE register.
471  * min_off:     Index of the MIN OPP in DEV ATTRIBUTE register.
472  * This data is read from dev_attribute register which is e-fused.
473  * A'1' in bit indicates OPP disabled and not available, a '0' indicates
474  * OPP available. Lowest OPP starts with min_off. So returning the
475  * bit with rightmost '0'.
476  */
477 static int get_opp_offset(int max_off, int min_off)
478 {
479         struct ctrl_stat *ctrl = (struct ctrl_stat *)CTRL_BASE;
480         int opp, offset, i;
481
482         /* Bits 0:11 are defined to be the MPU_MAX_FREQ */
483         opp = readl(&ctrl->dev_attr) & ~0xFFFFF000;
484
485         for (i = max_off; i >= min_off; i--) {
486                 offset = opp & (1 << i);
487                 if (!offset)
488                         return i;
489         }
490
491         return min_off;
492 }
493
494 const struct dpll_params *get_dpll_mpu_params(void)
495 {
496         int opp = get_opp_offset(DEV_ATTR_MAX_OFFSET, DEV_ATTR_MIN_OFFSET);
497         u32 ind = get_sys_clk_index();
498
499         return &dpll_mpu[ind][opp];
500 }
501
502 const struct dpll_params *get_dpll_core_params(void)
503 {
504         int ind = get_sys_clk_index();
505
506         return &dpll_core[ind];
507 }
508
509 const struct dpll_params *get_dpll_per_params(void)
510 {
511         int ind = get_sys_clk_index();
512
513         return &dpll_per[ind];
514 }
515
516 void scale_vcores(void)
517 {
518         const struct dpll_params *mpu_params;
519         int mpu_vdd;
520         struct am43xx_board_id header;
521
522         enable_i2c0_pin_mux();
523         i2c_init(CONFIG_SYS_OMAP24_I2C_SPEED, CONFIG_SYS_OMAP24_I2C_SLAVE);
524         if (read_eeprom(&header) < 0)
525                 puts("Could not get board ID.\n");
526
527         /* Get the frequency */
528         mpu_params = get_dpll_mpu_params();
529
530         if (i2c_probe(TPS65218_CHIP_PM))
531                 return;
532
533         if (mpu_params->m == 1000) {
534                 mpu_vdd = TPS65218_DCDC_VOLT_SEL_1330MV;
535         } else if (mpu_params->m == 600) {
536                 mpu_vdd = TPS65218_DCDC_VOLT_SEL_1100MV;
537         } else {
538                 puts("Unknown MPU clock, not scaling\n");
539                 return;
540         }
541
542         /* Set DCDC1 (CORE) voltage to 1.1V */
543         if (tps65218_voltage_update(TPS65218_DCDC1,
544                                     TPS65218_DCDC_VOLT_SEL_1100MV)) {
545                 puts("tps65218_voltage_update failure\n");
546                 return;
547         }
548
549         /* Set DCDC2 (MPU) voltage */
550         if (tps65218_voltage_update(TPS65218_DCDC2, mpu_vdd)) {
551                 puts("tps65218_voltage_update failure\n");
552                 return;
553         }
554 }
555
556 void set_uart_mux_conf(void)
557 {
558         enable_uart0_pin_mux();
559 }
560
561 void set_mux_conf_regs(void)
562 {
563         enable_board_pin_mux();
564 }
565
566 static void enable_vtt_regulator(void)
567 {
568         u32 temp;
569
570         /* enable module */
571         writel(GPIO_CTRL_ENABLEMODULE, AM33XX_GPIO5_BASE + OMAP_GPIO_CTRL);
572
573         /* enable output for GPIO5_7 */
574         writel(GPIO_SETDATAOUT(7),
575                AM33XX_GPIO5_BASE + OMAP_GPIO_SETDATAOUT);
576         temp = readl(AM33XX_GPIO5_BASE + OMAP_GPIO_OE);
577         temp = temp & ~(GPIO_OE_ENABLE(7));
578         writel(temp, AM33XX_GPIO5_BASE + OMAP_GPIO_OE);
579 }
580
581 void sdram_init(void)
582 {
583         /*
584          * EPOS EVM has 1GB LPDDR2 connected to EMIF.
585          * GP EMV has 1GB DDR3 connected to EMIF
586          * along with VTT regulator.
587          */
588         if (board_is_eposevm()) {
589                 config_ddr(0, &ioregs_lpddr2, NULL, NULL, &emif_regs_lpddr2, 0);
590         } else if (board_is_evm_14_or_later()) {
591                 enable_vtt_regulator();
592                 config_ddr(0, &ioregs_ddr3, NULL, NULL,
593                            &ddr3_emif_regs_400Mhz_production, 0);
594         } else if (board_is_evm_12_or_later()) {
595                 enable_vtt_regulator();
596                 config_ddr(0, &ioregs_ddr3, NULL, NULL,
597                            &ddr3_emif_regs_400Mhz_beta, 0);
598         } else if (board_is_gpevm()) {
599                 enable_vtt_regulator();
600                 config_ddr(0, &ioregs_ddr3, NULL, NULL,
601                            &ddr3_emif_regs_400Mhz, 0);
602         } else if (board_is_sk()) {
603                 config_ddr(400, &ioregs_ddr3, NULL, NULL,
604                            &ddr3_sk_emif_regs_400Mhz, 0);
605         }
606 }
607 #endif
608
609 /* setup board specific PMIC */
610 int power_init_board(void)
611 {
612         struct pmic *p;
613
614         power_tps65218_init(I2C_PMIC);
615         p = pmic_get("TPS65218_PMIC");
616         if (p && !pmic_probe(p))
617                 puts("PMIC:  TPS65218\n");
618
619         return 0;
620 }
621
622 int board_init(void)
623 {
624         struct l3f_cfg_bwlimiter *bwlimiter = (struct l3f_cfg_bwlimiter *)L3F_CFG_BWLIMITER;
625         u32 mreqprio_0, mreqprio_1, modena_init0_bw_fractional,
626             modena_init0_bw_integer, modena_init0_watermark_0;
627
628         gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100;
629
630         /* Clear all important bits for DSS errata that may need to be tweaked*/
631         mreqprio_0 = readl(&cdev->mreqprio_0) & MREQPRIO_0_SAB_INIT1_MASK &
632                            MREQPRIO_0_SAB_INIT0_MASK;
633
634         mreqprio_1 = readl(&cdev->mreqprio_1) & MREQPRIO_1_DSS_MASK;
635
636         modena_init0_bw_fractional = readl(&bwlimiter->modena_init0_bw_fractional) &
637                                            BW_LIMITER_BW_FRAC_MASK;
638
639         modena_init0_bw_integer = readl(&bwlimiter->modena_init0_bw_integer) &
640                                         BW_LIMITER_BW_INT_MASK;
641
642         modena_init0_watermark_0 = readl(&bwlimiter->modena_init0_watermark_0) &
643                                          BW_LIMITER_BW_WATERMARK_MASK;
644
645         /* Setting MReq Priority of the DSS*/
646         mreqprio_0 |= 0x77;
647
648         /*
649          * Set L3 Fast Configuration Register
650          * Limiting bandwith for ARM core to 700 MBPS
651          */
652         modena_init0_bw_fractional |= 0x10;
653         modena_init0_bw_integer |= 0x3;
654
655         writel(mreqprio_0, &cdev->mreqprio_0);
656         writel(mreqprio_1, &cdev->mreqprio_1);
657
658         writel(modena_init0_bw_fractional, &bwlimiter->modena_init0_bw_fractional);
659         writel(modena_init0_bw_integer, &bwlimiter->modena_init0_bw_integer);
660         writel(modena_init0_watermark_0, &bwlimiter->modena_init0_watermark_0);
661
662         return 0;
663 }
664
665 #ifdef CONFIG_BOARD_LATE_INIT
666 int board_late_init(void)
667 {
668 #ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
669         char safe_string[HDR_NAME_LEN + 1];
670         struct am43xx_board_id header;
671
672         if (read_eeprom(&header) < 0)
673                 puts("Could not get board ID.\n");
674
675         /* Now set variables based on the header. */
676         strncpy(safe_string, (char *)header.name, sizeof(header.name));
677         safe_string[sizeof(header.name)] = 0;
678         setenv("board_name", safe_string);
679
680         strncpy(safe_string, (char *)header.version, sizeof(header.version));
681         safe_string[sizeof(header.version)] = 0;
682         setenv("board_rev", safe_string);
683 #endif
684         return 0;
685 }
686 #endif
687
688 #ifdef CONFIG_DRIVER_TI_CPSW
689
690 static void cpsw_control(int enabled)
691 {
692         /* Additional controls can be added here */
693         return;
694 }
695
696 static struct cpsw_slave_data cpsw_slaves[] = {
697         {
698                 .slave_reg_ofs  = 0x208,
699                 .sliver_reg_ofs = 0xd80,
700                 .phy_addr       = 16,
701         },
702         {
703                 .slave_reg_ofs  = 0x308,
704                 .sliver_reg_ofs = 0xdc0,
705                 .phy_addr       = 1,
706         },
707 };
708
709 static struct cpsw_platform_data cpsw_data = {
710         .mdio_base              = CPSW_MDIO_BASE,
711         .cpsw_base              = CPSW_BASE,
712         .mdio_div               = 0xff,
713         .channels               = 8,
714         .cpdma_reg_ofs          = 0x800,
715         .slaves                 = 1,
716         .slave_data             = cpsw_slaves,
717         .ale_reg_ofs            = 0xd00,
718         .ale_entries            = 1024,
719         .host_port_reg_ofs      = 0x108,
720         .hw_stats_reg_ofs       = 0x900,
721         .bd_ram_ofs             = 0x2000,
722         .mac_control            = (1 << 5),
723         .control                = cpsw_control,
724         .host_port_num          = 0,
725         .version                = CPSW_CTRL_VERSION_2,
726 };
727
728 int board_eth_init(bd_t *bis)
729 {
730         int rv;
731         uint8_t mac_addr[6];
732         uint32_t mac_hi, mac_lo;
733
734         /* try reading mac address from efuse */
735         mac_lo = readl(&cdev->macid0l);
736         mac_hi = readl(&cdev->macid0h);
737         mac_addr[0] = mac_hi & 0xFF;
738         mac_addr[1] = (mac_hi & 0xFF00) >> 8;
739         mac_addr[2] = (mac_hi & 0xFF0000) >> 16;
740         mac_addr[3] = (mac_hi & 0xFF000000) >> 24;
741         mac_addr[4] = mac_lo & 0xFF;
742         mac_addr[5] = (mac_lo & 0xFF00) >> 8;
743
744         if (!getenv("ethaddr")) {
745                 puts("<ethaddr> not set. Validating first E-fuse MAC\n");
746                 if (is_valid_ether_addr(mac_addr))
747                         eth_setenv_enetaddr("ethaddr", mac_addr);
748         }
749
750         mac_lo = readl(&cdev->macid1l);
751         mac_hi = readl(&cdev->macid1h);
752         mac_addr[0] = mac_hi & 0xFF;
753         mac_addr[1] = (mac_hi & 0xFF00) >> 8;
754         mac_addr[2] = (mac_hi & 0xFF0000) >> 16;
755         mac_addr[3] = (mac_hi & 0xFF000000) >> 24;
756         mac_addr[4] = mac_lo & 0xFF;
757         mac_addr[5] = (mac_lo & 0xFF00) >> 8;
758
759         if (!getenv("eth1addr")) {
760                 if (is_valid_ether_addr(mac_addr))
761                         eth_setenv_enetaddr("eth1addr", mac_addr);
762         }
763
764         if (board_is_eposevm()) {
765                 writel(RMII_MODE_ENABLE | RMII_CHIPCKL_ENABLE, &cdev->miisel);
766                 cpsw_slaves[0].phy_if = PHY_INTERFACE_MODE_RMII;
767                 cpsw_slaves[0].phy_addr = 16;
768         } else if (board_is_sk()) {
769                 writel(RGMII_MODE_ENABLE, &cdev->miisel);
770                 cpsw_slaves[0].phy_if = PHY_INTERFACE_MODE_RGMII;
771                 cpsw_slaves[0].phy_addr = 4;
772                 cpsw_slaves[1].phy_addr = 5;
773         } else {
774                 writel(RGMII_MODE_ENABLE, &cdev->miisel);
775                 cpsw_slaves[0].phy_if = PHY_INTERFACE_MODE_RGMII;
776                 cpsw_slaves[0].phy_addr = 0;
777         }
778
779         rv = cpsw_register(&cpsw_data);
780         if (rv < 0)
781                 printf("Error %d registering CPSW switch\n", rv);
782
783         return rv;
784 }
785 #endif