]> git.sur5r.net Git - u-boot/blob - board/ti/am43xx/board.c
Merge branch 'u-boot-imx/master' into 'u-boot-arm/master'
[u-boot] / 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/tps65218.h>
23 #include <miiphy.h>
24 #include <cpsw.h>
25
26 DECLARE_GLOBAL_DATA_PTR;
27
28 static struct ctrl_dev *cdev = (struct ctrl_dev *)CTRL_DEVICE_BASE;
29
30 /*
31  * Read header information from EEPROM into global structure.
32  */
33 static 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
74 #ifndef CONFIG_SKIP_LOWLEVEL_INIT
75
76 #define NUM_OPPS        6
77
78 const 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
113 const 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
120 const 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
127 const struct dpll_params epos_evm_dpll_ddr = {
128                 266, 24, 1, -1, 1, -1, -1};
129
130 const struct dpll_params gp_evm_dpll_ddr = {
131                 400, 23, 1, -1, 1, -1, -1};
132
133 const 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
144 const 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
165 const 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
188 const 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,
196         .emif_sdram_config_ext  = 0x0143,
197 };
198
199 const 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,
208         .emif_ddr_phy_ctlr_1            = 0x0E004008,
209         .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
220 const 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
243 void emif_get_ext_phy_ctrl_const_regs(const u32 **regs, u32 *size)
244 {
245         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         }
252
253         return;
254 }
255
256 const struct dpll_params *get_dpll_ddr_params(void)
257 {
258         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  */
272 static 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  */
296 static int get_opp_offset(int max_off, int min_off)
297 {
298         struct ctrl_stat *ctrl = (struct ctrl_stat *)CTRL_BASE;
299         int opp, offset, i;
300
301         /* Bits 0:11 are defined to be the MPU_MAX_FREQ */
302         opp = readl(&ctrl->dev_attr) & ~0xFFFFF000;
303
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
313 const 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
321 const struct dpll_params *get_dpll_core_params(void)
322 {
323         int ind = get_sys_clk_index();
324
325         return &dpll_core[ind];
326 }
327
328 const struct dpll_params *get_dpll_per_params(void)
329 {
330         int ind = get_sys_clk_index();
331
332         return &dpll_per[ind];
333 }
334
335 void 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
375 void set_uart_mux_conf(void)
376 {
377         enable_uart0_pin_mux();
378 }
379
380 void set_mux_conf_regs(void)
381 {
382         enable_board_pin_mux();
383 }
384
385 static void enable_vtt_regulator(void)
386 {
387         u32 temp;
388
389         /* enable module */
390         writel(GPIO_CTRL_ENABLEMODULE, AM33XX_GPIO5_BASE + OMAP_GPIO_CTRL);
391
392         /* 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);
398 }
399
400 void sdram_init(void)
401 {
402         /*
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         }
414 }
415 #endif
416
417 int board_init(void)
418 {
419         gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100;
420
421         return 0;
422 }
423
424 #ifdef CONFIG_BOARD_LATE_INIT
425 int board_late_init(void)
426 {
427 #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
443         return 0;
444 }
445 #endif
446
447 #ifdef CONFIG_DRIVER_TI_CPSW
448
449 static void cpsw_control(int enabled)
450 {
451         /* Additional controls can be added here */
452         return;
453 }
454
455 static 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
468 static 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
487 int 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