1a868e443SPeter Howard /*
2a868e443SPeter Howard * Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.com/
3a868e443SPeter Howard *
4a868e443SPeter Howard * Based on da850evm.c. Original Copyrights follow:
5a868e443SPeter Howard *
6a868e443SPeter Howard * Copyright (C) 2009 Nick Thompson, GE Fanuc, Ltd. <nick.thompson@gefanuc.com>
7a868e443SPeter Howard * Copyright (C) 2007 Sergey Kubushyn <ksi@koi8.net>
8a868e443SPeter Howard *
95b8031ccSTom Rini * SPDX-License-Identifier: GPL-2.0+
10a868e443SPeter Howard */
11a868e443SPeter Howard
12a868e443SPeter Howard #include <common.h>
13a868e443SPeter Howard #include <i2c.h>
14a868e443SPeter Howard #include <net.h>
15a868e443SPeter Howard #include <netdev.h>
16a868e443SPeter Howard #include <spi.h>
17a868e443SPeter Howard #include <spi_flash.h>
18a868e443SPeter Howard #include <asm/arch/hardware.h>
19a868e443SPeter Howard #include <asm/ti-common/davinci_nand.h>
20a868e443SPeter Howard #include <asm/io.h>
211221ce45SMasahiro Yamada #include <linux/errno.h>
22c62db35dSSimon Glass #include <asm/mach-types.h>
23a868e443SPeter Howard #include <asm/arch/davinci_misc.h>
241d2c0506SMasahiro Yamada #ifdef CONFIG_MMC_DAVINCI
25a868e443SPeter Howard #include <mmc.h>
26a868e443SPeter Howard #include <asm/arch/sdmmc_defs.h>
27a868e443SPeter Howard #endif
28a868e443SPeter Howard
29a868e443SPeter Howard DECLARE_GLOBAL_DATA_PTR;
30a868e443SPeter Howard
31a868e443SPeter Howard #define pinmux(x) (&davinci_syscfg_regs->pinmux[x])
32a868e443SPeter Howard
331d2c0506SMasahiro Yamada #ifdef CONFIG_MMC_DAVINCI
34a868e443SPeter Howard /* MMC0 pin muxer settings */
35a868e443SPeter Howard const struct pinmux_config mmc0_pins[] = {
36a868e443SPeter Howard /* GP0[11] is required for SD to work on Rev 3 EVMs */
37a868e443SPeter Howard { pinmux(0), 8, 4 }, /* GP0[11] */
38a868e443SPeter Howard { pinmux(10), 2, 0 }, /* MMCSD0_CLK */
39a868e443SPeter Howard { pinmux(10), 2, 1 }, /* MMCSD0_CMD */
40a868e443SPeter Howard { pinmux(10), 2, 2 }, /* MMCSD0_DAT_0 */
41a868e443SPeter Howard { pinmux(10), 2, 3 }, /* MMCSD0_DAT_1 */
42a868e443SPeter Howard { pinmux(10), 2, 4 }, /* MMCSD0_DAT_2 */
43a868e443SPeter Howard { pinmux(10), 2, 5 }, /* MMCSD0_DAT_3 */
44a868e443SPeter Howard /* LCDK supports only 4-bit mode, remaining pins are not configured */
45a868e443SPeter Howard };
46a868e443SPeter Howard #endif
47a868e443SPeter Howard
48a868e443SPeter Howard /* UART pin muxer settings */
49a868e443SPeter Howard static const struct pinmux_config uart_pins[] = {
50a868e443SPeter Howard { pinmux(0), 4, 6 },
51a868e443SPeter Howard { pinmux(0), 4, 7 },
52a868e443SPeter Howard { pinmux(4), 2, 4 },
53a868e443SPeter Howard { pinmux(4), 2, 5 }
54a868e443SPeter Howard };
55a868e443SPeter Howard
56a868e443SPeter Howard #ifdef CONFIG_DRIVER_TI_EMAC
57a868e443SPeter Howard static const struct pinmux_config emac_pins[] = {
58a868e443SPeter Howard { pinmux(2), 8, 1 },
59a868e443SPeter Howard { pinmux(2), 8, 2 },
60a868e443SPeter Howard { pinmux(2), 8, 3 },
61a868e443SPeter Howard { pinmux(2), 8, 4 },
62a868e443SPeter Howard { pinmux(2), 8, 5 },
63a868e443SPeter Howard { pinmux(2), 8, 6 },
64a868e443SPeter Howard { pinmux(2), 8, 7 },
65a868e443SPeter Howard { pinmux(3), 8, 0 },
66a868e443SPeter Howard { pinmux(3), 8, 1 },
67a868e443SPeter Howard { pinmux(3), 8, 2 },
68a868e443SPeter Howard { pinmux(3), 8, 3 },
69a868e443SPeter Howard { pinmux(3), 8, 4 },
70a868e443SPeter Howard { pinmux(3), 8, 5 },
71a868e443SPeter Howard { pinmux(3), 8, 6 },
72a868e443SPeter Howard { pinmux(3), 8, 7 },
73a868e443SPeter Howard { pinmux(4), 8, 0 },
74a868e443SPeter Howard { pinmux(4), 8, 1 }
75a868e443SPeter Howard };
76a868e443SPeter Howard #endif /* CONFIG_DRIVER_TI_EMAC */
77a868e443SPeter Howard
78a868e443SPeter Howard /* I2C pin muxer settings */
79a868e443SPeter Howard static const struct pinmux_config i2c_pins[] = {
80a868e443SPeter Howard { pinmux(4), 2, 2 },
81a868e443SPeter Howard { pinmux(4), 2, 3 }
82a868e443SPeter Howard };
83a868e443SPeter Howard
84a868e443SPeter Howard #ifdef CONFIG_NAND_DAVINCI
85a868e443SPeter Howard const struct pinmux_config nand_pins[] = {
86a868e443SPeter Howard { pinmux(7), 1, 1 },
87a868e443SPeter Howard { pinmux(7), 1, 2 },
88a868e443SPeter Howard { pinmux(7), 1, 4 },
89a868e443SPeter Howard { pinmux(7), 1, 5 },
90a868e443SPeter Howard { pinmux(8), 1, 0 },
91a868e443SPeter Howard { pinmux(8), 1, 1 },
92a868e443SPeter Howard { pinmux(8), 1, 2 },
93a868e443SPeter Howard { pinmux(8), 1, 3 },
94a868e443SPeter Howard { pinmux(8), 1, 4 },
95a868e443SPeter Howard { pinmux(8), 1, 5 },
96a868e443SPeter Howard { pinmux(8), 1, 6 },
97a868e443SPeter Howard { pinmux(8), 1, 7 },
98a868e443SPeter Howard { pinmux(9), 1, 0 },
99a868e443SPeter Howard { pinmux(9), 1, 1 },
100a868e443SPeter Howard { pinmux(9), 1, 2 },
101a868e443SPeter Howard { pinmux(9), 1, 3 },
102a868e443SPeter Howard { pinmux(9), 1, 4 },
103a868e443SPeter Howard { pinmux(9), 1, 5 },
104a868e443SPeter Howard { pinmux(9), 1, 6 },
105a868e443SPeter Howard { pinmux(9), 1, 7 },
106a868e443SPeter Howard { pinmux(12), 1, 5 },
107a868e443SPeter Howard { pinmux(12), 1, 6 }
108a868e443SPeter Howard };
109a868e443SPeter Howard
110a868e443SPeter Howard #endif
111a868e443SPeter Howard
112a868e443SPeter Howard #ifdef CONFIG_DRIVER_TI_EMAC_USE_RMII
113a868e443SPeter Howard #define HAS_RMII 1
114a868e443SPeter Howard #else
115a868e443SPeter Howard #define HAS_RMII 0
116a868e443SPeter Howard #endif
117a868e443SPeter Howard
118a868e443SPeter Howard const struct pinmux_resource pinmuxes[] = {
119a868e443SPeter Howard PINMUX_ITEM(uart_pins),
120a868e443SPeter Howard PINMUX_ITEM(i2c_pins),
121a868e443SPeter Howard #ifdef CONFIG_NAND_DAVINCI
122a868e443SPeter Howard PINMUX_ITEM(nand_pins),
123a868e443SPeter Howard #endif
124a868e443SPeter Howard };
125a868e443SPeter Howard
126a868e443SPeter Howard const int pinmuxes_size = ARRAY_SIZE(pinmuxes);
127a868e443SPeter Howard
128a868e443SPeter Howard const struct lpsc_resource lpsc[] = {
129a868e443SPeter Howard { DAVINCI_LPSC_AEMIF }, /* NAND, NOR */
130a868e443SPeter Howard { DAVINCI_LPSC_SPI1 }, /* Serial Flash */
131a868e443SPeter Howard { DAVINCI_LPSC_EMAC }, /* image download */
132a868e443SPeter Howard { DAVINCI_LPSC_UART2 }, /* console */
133a868e443SPeter Howard { DAVINCI_LPSC_GPIO },
1341d2c0506SMasahiro Yamada #ifdef CONFIG_MMC_DAVINCI
135a868e443SPeter Howard { DAVINCI_LPSC_MMC_SD },
136a868e443SPeter Howard #endif
137a868e443SPeter Howard };
138a868e443SPeter Howard
139a868e443SPeter Howard const int lpsc_size = ARRAY_SIZE(lpsc);
140a868e443SPeter Howard
141a868e443SPeter Howard #ifndef CONFIG_DA850_EVM_MAX_CPU_CLK
142a868e443SPeter Howard #define CONFIG_DA850_EVM_MAX_CPU_CLK 456000000
143a868e443SPeter Howard #endif
144a868e443SPeter Howard
145a868e443SPeter Howard /*
146a868e443SPeter Howard * get_board_rev() - setup to pass kernel board revision information
147a868e443SPeter Howard * Returns:
148a868e443SPeter Howard * bit[0-3] Maximum cpu clock rate supported by onboard SoC
149a868e443SPeter Howard * 0000b - 300 MHz
150a868e443SPeter Howard * 0001b - 372 MHz
151a868e443SPeter Howard * 0010b - 408 MHz
152a868e443SPeter Howard * 0011b - 456 MHz
153a868e443SPeter Howard */
get_board_rev(void)154a868e443SPeter Howard u32 get_board_rev(void)
155a868e443SPeter Howard {
156a868e443SPeter Howard return 0;
157a868e443SPeter Howard }
158a868e443SPeter Howard
board_early_init_f(void)159a868e443SPeter Howard int board_early_init_f(void)
160a868e443SPeter Howard {
161a868e443SPeter Howard /*
162a868e443SPeter Howard * Power on required peripherals
163a868e443SPeter Howard * ARM does not have access by default to PSC0 and PSC1
164a868e443SPeter Howard * assuming here that the DSP bootloader has set the IOPU
165a868e443SPeter Howard * such that PSC access is available to ARM
166a868e443SPeter Howard */
167a868e443SPeter Howard if (da8xx_configure_lpsc_items(lpsc, ARRAY_SIZE(lpsc)))
168a868e443SPeter Howard return 1;
169a868e443SPeter Howard
170a868e443SPeter Howard return 0;
171a868e443SPeter Howard }
172a868e443SPeter Howard
board_init(void)173a868e443SPeter Howard int board_init(void)
174a868e443SPeter Howard {
175a868e443SPeter Howard irq_init();
176a868e443SPeter Howard
17794ba26f2STom Rini /* arch number of the board */
17894ba26f2STom Rini gd->bd->bi_arch_number = MACH_TYPE_OMAPL138_LCDK;
17994ba26f2STom Rini
180a868e443SPeter Howard /* address of boot parameters */
181a868e443SPeter Howard gd->bd->bi_boot_params = LINUX_BOOT_PARAM_ADDR;
182a868e443SPeter Howard
183a868e443SPeter Howard
184a868e443SPeter Howard /* setup the SUSPSRC for ARM to control emulation suspend */
185a868e443SPeter Howard writel(readl(&davinci_syscfg_regs->suspsrc) &
186a868e443SPeter Howard ~(DAVINCI_SYSCFG_SUSPSRC_EMAC | DAVINCI_SYSCFG_SUSPSRC_I2C |
187a868e443SPeter Howard DAVINCI_SYSCFG_SUSPSRC_SPI1 | DAVINCI_SYSCFG_SUSPSRC_TIMER0 |
188a868e443SPeter Howard DAVINCI_SYSCFG_SUSPSRC_UART2),
189a868e443SPeter Howard &davinci_syscfg_regs->suspsrc);
190a868e443SPeter Howard
191a868e443SPeter Howard /* configure pinmux settings */
192a868e443SPeter Howard if (davinci_configure_pin_mux_items(pinmuxes, ARRAY_SIZE(pinmuxes)))
193a868e443SPeter Howard return 1;
194a868e443SPeter Howard
195a868e443SPeter Howard #ifdef CONFIG_NAND_DAVINCI
196a868e443SPeter Howard /*
197a868e443SPeter Howard * NAND CS setup - cycle counts based on da850evm NAND timings in the
198a868e443SPeter Howard * Linux kernel @ 25MHz EMIFA
199a868e443SPeter Howard */
200a868e443SPeter Howard writel((DAVINCI_ABCR_WSETUP(15) |
201a868e443SPeter Howard DAVINCI_ABCR_WSTROBE(63) |
202a868e443SPeter Howard DAVINCI_ABCR_WHOLD(7) |
203a868e443SPeter Howard DAVINCI_ABCR_RSETUP(15) |
204a868e443SPeter Howard DAVINCI_ABCR_RSTROBE(63) |
205a868e443SPeter Howard DAVINCI_ABCR_RHOLD(7) |
206a868e443SPeter Howard DAVINCI_ABCR_TA(3) |
207a868e443SPeter Howard DAVINCI_ABCR_ASIZE_16BIT),
208a868e443SPeter Howard &davinci_emif_regs->ab2cr); /* CS3 */
209a868e443SPeter Howard #endif
210a868e443SPeter Howard
211a868e443SPeter Howard
2121d2c0506SMasahiro Yamada #ifdef CONFIG_MMC_DAVINCI
213a868e443SPeter Howard if (davinci_configure_pin_mux(mmc0_pins, ARRAY_SIZE(mmc0_pins)) != 0)
214a868e443SPeter Howard return 1;
215a868e443SPeter Howard #endif
216a868e443SPeter Howard
217a868e443SPeter Howard #ifdef CONFIG_DRIVER_TI_EMAC
218a868e443SPeter Howard if (davinci_configure_pin_mux(emac_pins, ARRAY_SIZE(emac_pins)) != 0)
219a868e443SPeter Howard return 1;
220a868e443SPeter Howard davinci_emac_mii_mode_sel(HAS_RMII);
221a868e443SPeter Howard #endif /* CONFIG_DRIVER_TI_EMAC */
222a868e443SPeter Howard
223a868e443SPeter Howard /* enable the console UART */
224a868e443SPeter Howard writel((DAVINCI_UART_PWREMU_MGMT_FREE | DAVINCI_UART_PWREMU_MGMT_URRST |
225a868e443SPeter Howard DAVINCI_UART_PWREMU_MGMT_UTRST),
226a868e443SPeter Howard &davinci_uart2_ctrl_regs->pwremu_mgmt);
227a868e443SPeter Howard
228a868e443SPeter Howard return 0;
229a868e443SPeter Howard }
230a868e443SPeter Howard
231a868e443SPeter Howard #ifdef CONFIG_DRIVER_TI_EMAC
232a868e443SPeter Howard
233a868e443SPeter Howard /*
234a868e443SPeter Howard * Initializes on-board ethernet controllers.
235a868e443SPeter Howard */
board_eth_init(bd_t * bis)236a868e443SPeter Howard int board_eth_init(bd_t *bis)
237a868e443SPeter Howard {
238a868e443SPeter Howard if (!davinci_emac_initialize()) {
239a868e443SPeter Howard printf("Error: Ethernet init failed!\n");
240a868e443SPeter Howard return -1;
241a868e443SPeter Howard }
242a868e443SPeter Howard
243a868e443SPeter Howard return 0;
244a868e443SPeter Howard }
245a868e443SPeter Howard
246a868e443SPeter Howard #endif /* CONFIG_DRIVER_TI_EMAC */
247a868e443SPeter Howard
248a868e443SPeter Howard #define CFG_MAC_ADDR_SPI_BUS 0
249a868e443SPeter Howard #define CFG_MAC_ADDR_SPI_CS 0
250a868e443SPeter Howard #define CFG_MAC_ADDR_SPI_MAX_HZ CONFIG_SF_DEFAULT_SPEED
251a868e443SPeter Howard #define CFG_MAC_ADDR_SPI_MODE SPI_MODE_3
252a868e443SPeter Howard
253a868e443SPeter Howard #define CFG_MAC_ADDR_OFFSET (flash->size - SZ_64K)
254a868e443SPeter Howard
get_mac_addr(u8 * addr)255a868e443SPeter Howard static int get_mac_addr(u8 *addr)
256a868e443SPeter Howard {
257a868e443SPeter Howard /* Need to find a way to get MAC ADDRESS */
258a868e443SPeter Howard return 0;
259a868e443SPeter Howard }
260a868e443SPeter Howard
dsp_lpsc_on(unsigned domain,unsigned int id)261a868e443SPeter Howard void dsp_lpsc_on(unsigned domain, unsigned int id)
262a868e443SPeter Howard {
263a868e443SPeter Howard dv_reg_p mdstat, mdctl, ptstat, ptcmd;
264a868e443SPeter Howard struct davinci_psc_regs *psc_regs;
265a868e443SPeter Howard
266a868e443SPeter Howard psc_regs = davinci_psc0_regs;
267a868e443SPeter Howard mdstat = &psc_regs->psc0.mdstat[id];
268a868e443SPeter Howard mdctl = &psc_regs->psc0.mdctl[id];
269a868e443SPeter Howard ptstat = &psc_regs->ptstat;
270a868e443SPeter Howard ptcmd = &psc_regs->ptcmd;
271a868e443SPeter Howard
272a868e443SPeter Howard while (*ptstat & (0x1 << domain))
273a868e443SPeter Howard ;
274a868e443SPeter Howard
275a868e443SPeter Howard if ((*mdstat & 0x1f) == 0x03)
276a868e443SPeter Howard return; /* Already on and enabled */
277a868e443SPeter Howard
278a868e443SPeter Howard *mdctl |= 0x03;
279a868e443SPeter Howard
280a868e443SPeter Howard *ptcmd = 0x1 << domain;
281a868e443SPeter Howard
282a868e443SPeter Howard while (*ptstat & (0x1 << domain))
283a868e443SPeter Howard ;
284a868e443SPeter Howard while ((*mdstat & 0x1f) != 0x03)
285a868e443SPeter Howard ; /* Probably an overkill... */
286a868e443SPeter Howard }
287a868e443SPeter Howard
dspwake(void)288a868e443SPeter Howard static void dspwake(void)
289a868e443SPeter Howard {
290a868e443SPeter Howard unsigned *resetvect = (unsigned *)DAVINCI_L3CBARAM_BASE;
291a868e443SPeter Howard
292a868e443SPeter Howard /* if the device is ARM only, return */
293a868e443SPeter Howard if ((REG(CHIP_REV_ID_REG) & 0x3f) == 0x10)
294a868e443SPeter Howard return;
295a868e443SPeter Howard
296*00caae6dSSimon Glass if (!strcmp(env_get("dspwake"), "no"))
297a868e443SPeter Howard return;
298a868e443SPeter Howard
299a868e443SPeter Howard *resetvect++ = 0x1E000; /* DSP Idle */
300a868e443SPeter Howard /* clear out the next 10 words as NOP */
301a868e443SPeter Howard memset(resetvect, 0, sizeof(unsigned) * 10);
302a868e443SPeter Howard
303a868e443SPeter Howard /* setup the DSP reset vector */
304a868e443SPeter Howard REG(HOST1CFG) = DAVINCI_L3CBARAM_BASE;
305a868e443SPeter Howard
306a868e443SPeter Howard dsp_lpsc_on(1, DAVINCI_LPSC_GEM);
307a868e443SPeter Howard REG(PSC0_MDCTL + (15 * 4)) |= 0x100;
308a868e443SPeter Howard }
309a868e443SPeter Howard
310a868e443SPeter Howard #ifdef CONFIG_DRIVER_TI_EMAC_USE_RMII
311a868e443SPeter Howard /**
312a868e443SPeter Howard * rmii_hw_init
313a868e443SPeter Howard *
314a868e443SPeter Howard */
rmii_hw_init(void)315a868e443SPeter Howard int rmii_hw_init(void)
316a868e443SPeter Howard {
317a868e443SPeter Howard return 0;
318a868e443SPeter Howard }
319a868e443SPeter Howard #endif /* CONFIG_DRIVER_TI_EMAC_USE_RMII */
320a868e443SPeter Howard
misc_init_r(void)321a868e443SPeter Howard int misc_init_r(void)
322a868e443SPeter Howard {
323a868e443SPeter Howard uint8_t tmp[20], addr[10];
324a868e443SPeter Howard
325a868e443SPeter Howard
326*00caae6dSSimon Glass if (env_get("ethaddr") == NULL) {
327a868e443SPeter Howard /* Read Ethernet MAC address from EEPROM */
328a868e443SPeter Howard if (dvevm_read_mac_address(addr)) {
329a868e443SPeter Howard /* Set Ethernet MAC address from EEPROM */
330a868e443SPeter Howard davinci_sync_env_enetaddr(addr);
331a868e443SPeter Howard } else {
332a868e443SPeter Howard get_mac_addr(addr);
333a868e443SPeter Howard }
334a868e443SPeter Howard
33502c2de6eSFabien Parent if (!is_multicast_ethaddr(addr) && !is_zero_ethaddr(addr)) {
33602c2de6eSFabien Parent sprintf((char *)tmp, "%02x:%02x:%02x:%02x:%02x:%02x",
33702c2de6eSFabien Parent addr[0], addr[1], addr[2], addr[3], addr[4],
33802c2de6eSFabien Parent addr[5]);
339a868e443SPeter Howard
340382bee57SSimon Glass env_set("ethaddr", (char *)tmp);
34102c2de6eSFabien Parent } else {
34202c2de6eSFabien Parent printf("Invalid MAC address read.\n");
343a868e443SPeter Howard }
34402c2de6eSFabien Parent }
34502c2de6eSFabien Parent
346a868e443SPeter Howard #ifdef CONFIG_DRIVER_TI_EMAC_USE_RMII
347a868e443SPeter Howard /* Select RMII fucntion through the expander */
348a868e443SPeter Howard if (rmii_hw_init())
349a868e443SPeter Howard printf("RMII hardware init failed!!!\n");
350a868e443SPeter Howard #endif
351a868e443SPeter Howard
352a868e443SPeter Howard dspwake();
353a868e443SPeter Howard
354a868e443SPeter Howard return 0;
355a868e443SPeter Howard }
356a868e443SPeter Howard
3571d2c0506SMasahiro Yamada #ifdef CONFIG_MMC_DAVINCI
358a868e443SPeter Howard static struct davinci_mmc mmc_sd0 = {
359a868e443SPeter Howard .reg_base = (struct davinci_mmc_regs *)DAVINCI_MMC_SD0_BASE,
360a868e443SPeter Howard .host_caps = MMC_MODE_4BIT, /* DA850 supports only 4-bit SD/MMC */
361a868e443SPeter Howard .voltages = MMC_VDD_32_33 | MMC_VDD_33_34,
362a868e443SPeter Howard .version = MMC_CTLR_VERSION_2,
363a868e443SPeter Howard };
364a868e443SPeter Howard
board_mmc_init(bd_t * bis)365a868e443SPeter Howard int board_mmc_init(bd_t *bis)
366a868e443SPeter Howard {
367a868e443SPeter Howard mmc_sd0.input_clk = clk_get(DAVINCI_MMCSD_CLKID);
368a868e443SPeter Howard
369a868e443SPeter Howard /* Add slot-0 to mmc subsystem */
370a868e443SPeter Howard return davinci_mmc_init(bis, &mmc_sd0);
371a868e443SPeter Howard }
372a868e443SPeter Howard #endif
373