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