]>
Commit | Line | Data |
---|---|---|
83d290c5 | 1 | // SPDX-License-Identifier: GPL-2.0+ |
2ac07f75 DL |
2 | /* |
3 | * Copyright (C) 2016 David Lechner <[email protected]> | |
4 | * | |
5 | * Based on da850evm.c | |
6 | * | |
7 | * Copyright (C) 2010 Texas Instruments Incorporated - http://www.ti.com/ | |
8 | * | |
9 | * Based on da830evm.c. Original Copyrights follow: | |
10 | * | |
11 | * Copyright (C) 2009 Nick Thompson, GE Fanuc, Ltd. <[email protected]> | |
12 | * Copyright (C) 2007 Sergey Kubushyn <[email protected]> | |
2ac07f75 DL |
13 | */ |
14 | ||
15 | #include <common.h> | |
16 | #include <i2c.h> | |
2ac07f75 DL |
17 | #include <spi.h> |
18 | #include <spi_flash.h> | |
19 | #include <asm/arch/hardware.h> | |
20 | #include <asm/arch/pinmux_defs.h> | |
21 | #include <asm/io.h> | |
22 | #include <asm/arch/davinci_misc.h> | |
1221ce45 | 23 | #include <linux/errno.h> |
2ac07f75 | 24 | #include <hwconfig.h> |
c62db35d | 25 | #include <asm/mach-types.h> |
5d982856 | 26 | #include <asm/setup.h> |
2ac07f75 | 27 | |
2ac07f75 DL |
28 | DECLARE_GLOBAL_DATA_PTR; |
29 | ||
30 | u8 board_rev; | |
31 | ||
32 | #define EEPROM_I2C_ADDR 0x50 | |
33 | #define EEPROM_REV_OFFSET 0x3F00 | |
34 | #define EEPROM_MAC_OFFSET 0x3F06 | |
35 | ||
2ac07f75 DL |
36 | const struct pinmux_resource pinmuxes[] = { |
37 | PINMUX_ITEM(spi0_pins_base), | |
38 | PINMUX_ITEM(spi0_pins_scs0), | |
39 | PINMUX_ITEM(uart1_pins_txrx), | |
40 | PINMUX_ITEM(i2c0_pins), | |
41 | PINMUX_ITEM(mmc0_pins), | |
42 | }; | |
43 | ||
44 | const int pinmuxes_size = ARRAY_SIZE(pinmuxes); | |
45 | ||
46 | const struct lpsc_resource lpsc[] = { | |
47 | { DAVINCI_LPSC_SPI0 }, /* Serial Flash */ | |
48 | { DAVINCI_LPSC_UART1 }, /* console */ | |
49 | { DAVINCI_LPSC_MMC_SD }, | |
50 | }; | |
51 | ||
52 | const int lpsc_size = ARRAY_SIZE(lpsc); | |
53 | ||
54 | u32 get_board_rev(void) | |
55 | { | |
56 | u8 buf[2]; | |
57 | ||
58 | if (!board_rev) { | |
59 | if (i2c_read(EEPROM_I2C_ADDR, EEPROM_REV_OFFSET, 2, buf, 2)) { | |
60 | printf("\nBoard revision read failed!\n"); | |
61 | } else { | |
62 | /* | |
63 | * Board rev 3 has MAC address at EEPROM_REV_OFFSET. | |
64 | * Other revisions have checksum at EEPROM_REV_OFFSET+1 | |
65 | * to detect this. | |
66 | */ | |
67 | if ((buf[0] ^ buf[1]) == 0xFF) | |
68 | board_rev = buf[0]; | |
69 | else | |
70 | board_rev = 3; | |
71 | } | |
72 | } | |
73 | ||
74 | return board_rev; | |
75 | } | |
76 | ||
77 | /* | |
78 | * The Bluetooth MAC address serves as the board serial number. | |
79 | */ | |
80 | void get_board_serial(struct tag_serialnr *serialnr) | |
81 | { | |
82 | u32 offset; | |
83 | u8 buf[6]; | |
84 | ||
85 | if (!board_rev) | |
86 | board_rev = get_board_rev(); | |
87 | ||
88 | /* Board rev 3 has MAC address where rev should be */ | |
89 | offset = (board_rev == 3) ? EEPROM_REV_OFFSET : EEPROM_MAC_OFFSET; | |
90 | ||
91 | if (i2c_read(EEPROM_I2C_ADDR, offset, 2, buf, 6)) { | |
92 | printf("\nBoard serial read failed!\n"); | |
93 | } else { | |
94 | u8 *nr; | |
95 | ||
96 | nr = (u8 *)&serialnr->low; | |
97 | nr[0] = buf[5]; | |
98 | nr[1] = buf[4]; | |
99 | nr[2] = buf[3]; | |
100 | nr[3] = buf[2]; | |
101 | nr = (u8 *)&serialnr->high; | |
102 | nr[0] = buf[1]; | |
103 | nr[1] = buf[0]; | |
104 | nr[2] = 0; | |
105 | nr[3] = 0; | |
106 | } | |
107 | } | |
108 | ||
109 | int board_early_init_f(void) | |
110 | { | |
648e87a1 DL |
111 | /* enable the console UART */ |
112 | writel((DAVINCI_UART_PWREMU_MGMT_FREE | DAVINCI_UART_PWREMU_MGMT_URRST | | |
113 | DAVINCI_UART_PWREMU_MGMT_UTRST), | |
114 | &davinci_uart1_ctrl_regs->pwremu_mgmt); | |
115 | ||
2ac07f75 DL |
116 | /* |
117 | * Power on required peripherals | |
118 | * ARM does not have access by default to PSC0 and PSC1 | |
119 | * assuming here that the DSP bootloader has set the IOPU | |
120 | * such that PSC access is available to ARM | |
121 | */ | |
122 | if (da8xx_configure_lpsc_items(lpsc, ARRAY_SIZE(lpsc))) | |
123 | return 1; | |
124 | ||
125 | return 0; | |
126 | } | |
127 | ||
128 | int board_init(void) | |
129 | { | |
2ac07f75 | 130 | irq_init(); |
2ac07f75 DL |
131 | |
132 | /* arch number of the board */ | |
133 | /* LEGO didn't register for a unique number and uses da850evm */ | |
134 | gd->bd->bi_arch_number = MACH_TYPE_DAVINCI_DA850_EVM; | |
135 | ||
136 | /* address of boot parameters */ | |
137 | gd->bd->bi_boot_params = LINUX_BOOT_PARAM_ADDR; | |
138 | ||
139 | /* setup the SUSPSRC for ARM to control emulation suspend */ | |
140 | writel(readl(&davinci_syscfg_regs->suspsrc) & | |
98ada4b3 | 141 | ~(DAVINCI_SYSCFG_SUSPSRC_I2C | |
2ac07f75 DL |
142 | DAVINCI_SYSCFG_SUSPSRC_SPI0 | DAVINCI_SYSCFG_SUSPSRC_TIMER0 | |
143 | DAVINCI_SYSCFG_SUSPSRC_UART1), | |
144 | &davinci_syscfg_regs->suspsrc); | |
145 | ||
146 | /* configure pinmux settings */ | |
147 | if (davinci_configure_pin_mux_items(pinmuxes, ARRAY_SIZE(pinmuxes))) | |
148 | return 1; | |
149 | ||
2ac07f75 DL |
150 | return 0; |
151 | } |