blob: 4f5c780e549cb13923eb7dbb064e0096d54f4ea9 [file] [log] [blame]
Sekhar Noribdc9c6c2009-11-12 11:08:39 -05001/*
2 * Copyright (C) 2009 Nick Thompson, GE Fanuc, Ltd. <nick.thompson@gefanuc.com>
3 *
4 * Base on code from TI. Original Notices follow:
5 *
6 * (C) Copyright 2008, Texas Instruments, Inc. http://www.ti.com/
7 *
8 * Modified for DA8xx EVM.
9 *
10 * Copyright (C) 2007 Sergey Kubushyn <ksi@koi8.net>
11 *
12 * Parts are shamelessly stolen from various TI sources, original copyright
13 * follows:
14 * -----------------------------------------------------------------
15 *
16 * Copyright (C) 2004 Texas Instruments.
17 *
18 * ----------------------------------------------------------------------------
Wolfgang Denk1a459662013-07-08 09:37:19 +020019 * SPDX-License-Identifier: GPL-2.0+
Sekhar Noribdc9c6c2009-11-12 11:08:39 -050020 * ----------------------------------------------------------------------------
21 */
22
23#include <common.h>
24#include <i2c.h>
Nick Thompson37cffda2010-02-17 20:37:24 -050025#include <net.h>
26#include <netdev.h>
Sekhar Noribdc9c6c2009-11-12 11:08:39 -050027#include <asm/arch/hardware.h>
Nick Thompson3a4e4392010-02-08 11:36:16 -050028#include <asm/arch/emif_defs.h>
Nick Thompson37cffda2010-02-17 20:37:24 -050029#include <asm/arch/emac_defs.h>
Vishwanathrao Badarkhe, Manish68cd4a42013-05-29 21:55:11 +000030#include <asm/arch/pinmux_defs.h>
Sekhar Noribdc9c6c2009-11-12 11:08:39 -050031#include <asm/io.h>
Manjunath Hadli28375eb2011-10-07 23:38:39 +000032#include <nand.h>
33#include <asm/arch/nand_defs.h>
Sughosh Ganud7f9b502010-11-28 20:21:27 -050034#include <asm/arch/davinci_misc.h>
Sekhar Noribdc9c6c2009-11-12 11:08:39 -050035
Vishwanathrao Badarkhe, Manish03e08d72013-05-22 03:38:48 +000036#ifdef CONFIG_DAVINCI_MMC
37#include <mmc.h>
38#include <asm/arch/sdmmc_defs.h>
39#endif
40
Sekhar Noribdc9c6c2009-11-12 11:08:39 -050041DECLARE_GLOBAL_DATA_PTR;
42
Nick Thompson63a47df2010-01-27 11:11:28 -050043static const struct pinmux_resource pinmuxes[] = {
44#ifdef CONFIG_SPI_FLASH
Vishwanathrao Badarkhe, Manish68cd4a42013-05-29 21:55:11 +000045 PINMUX_ITEM(spi0_pins_base),
46 PINMUX_ITEM(spi0_pins_scs0),
47 PINMUX_ITEM(spi0_pins_ena),
Nick Thompson63a47df2010-01-27 11:11:28 -050048#endif
Vishwanathrao Badarkhe, Manish68cd4a42013-05-29 21:55:11 +000049 PINMUX_ITEM(uart2_pins_txrx),
50 PINMUX_ITEM(i2c0_pins),
Nick Thompson63a47df2010-01-27 11:11:28 -050051#ifdef CONFIG_USB_DA8XX
52 PINMUX_ITEM(usb_pins),
53#endif
Nick Thompson3a4e4392010-02-08 11:36:16 -050054#ifdef CONFIG_USE_NAND
Vishwanathrao Badarkhe, Manish68cd4a42013-05-29 21:55:11 +000055 PINMUX_ITEM(emifa_pins),
56 PINMUX_ITEM(emifa_pins_cs0),
57 PINMUX_ITEM(emifa_pins_cs2),
58 PINMUX_ITEM(emifa_pins_cs3),
Nick Thompson3a4e4392010-02-08 11:36:16 -050059#endif
Nick Thompson37cffda2010-02-17 20:37:24 -050060#if defined(CONFIG_DRIVER_TI_EMAC)
Vishwanathrao Badarkhe, Manish68cd4a42013-05-29 21:55:11 +000061 PINMUX_ITEM(emac_pins_rmii),
62 PINMUX_ITEM(emac_pins_mdio),
63 PINMUX_ITEM(emac_pins_rmii_clk_source),
Nick Thompson37cffda2010-02-17 20:37:24 -050064#endif
Vishwanathrao Badarkhe, Manish03e08d72013-05-22 03:38:48 +000065#ifdef CONFIG_DAVINCI_MMC
Vishwanathrao Badarkhe, Manish68cd4a42013-05-29 21:55:11 +000066 PINMUX_ITEM(mmc0_pins_8bit)
Vishwanathrao Badarkhe, Manish03e08d72013-05-22 03:38:48 +000067#endif
Nick Thompson63a47df2010-01-27 11:11:28 -050068};
69
Sudhakar Rajashekhara9d799562010-06-07 12:39:59 +053070static const struct lpsc_resource lpsc[] = {
71 { DAVINCI_LPSC_AEMIF }, /* NAND, NOR */
72 { DAVINCI_LPSC_SPI0 }, /* Serial Flash */
73 { DAVINCI_LPSC_EMAC }, /* image download */
74 { DAVINCI_LPSC_UART2 }, /* console */
75 { DAVINCI_LPSC_GPIO },
Vishwanathrao Badarkhe, Manish03e08d72013-05-22 03:38:48 +000076#ifdef CONFIG_DAVINCI_MMC
77 { DAVINCI_LPSC_MMC_SD },
78#endif
79
Sudhakar Rajashekhara9d799562010-06-07 12:39:59 +053080};
81
Vishwanathrao Badarkhe, Manish03e08d72013-05-22 03:38:48 +000082#ifdef CONFIG_DAVINCI_MMC
83static struct davinci_mmc mmc_sd0 = {
84 .reg_base = (struct davinci_mmc_regs *)DAVINCI_MMC_SD0_BASE,
85 .host_caps = MMC_MODE_8BIT,
86 .voltages = MMC_VDD_32_33 | MMC_VDD_33_34,
87 .version = MMC_CTLR_VERSION_2,
88};
89
90int board_mmc_init(bd_t *bis)
91{
92 mmc_sd0.input_clk = clk_get(DAVINCI_MMCSD_CLKID);
93
94 printf("%x\n", mmc_sd0.input_clk);
95
96 /* Add slot-0 to mmc subsystem */
97 return davinci_mmc_init(bis, &mmc_sd0);
98}
99#endif
100
Sekhar Noribdc9c6c2009-11-12 11:08:39 -0500101int board_init(void)
102{
103#ifndef CONFIG_USE_IRQ
Sudhakar Rajashekhara9d799562010-06-07 12:39:59 +0530104 irq_init();
Sekhar Noribdc9c6c2009-11-12 11:08:39 -0500105#endif
106
Nick Thompson3a4e4392010-02-08 11:36:16 -0500107#ifdef CONFIG_NAND_DAVINCI
108 /* EMIFA 100MHz clock select */
109 writel(readl(&davinci_syscfg_regs->cfgchip3) & ~2,
110 &davinci_syscfg_regs->cfgchip3);
111 /* NAND CS setup */
112 writel((DAVINCI_ABCR_WSETUP(0) |
113 DAVINCI_ABCR_WSTROBE(2) |
114 DAVINCI_ABCR_WHOLD(0) |
115 DAVINCI_ABCR_RSETUP(0) |
116 DAVINCI_ABCR_RSTROBE(2) |
117 DAVINCI_ABCR_RHOLD(0) |
118 DAVINCI_ABCR_TA(2) |
119 DAVINCI_ABCR_ASIZE_8BIT),
Cyril Chemparathycc41a592010-03-17 10:03:10 -0400120 &davinci_emif_regs->ab2cr);
Nick Thompson3a4e4392010-02-08 11:36:16 -0500121#endif
122
Sekhar Noribdc9c6c2009-11-12 11:08:39 -0500123 /* arch number of the board */
124 gd->bd->bi_arch_number = MACH_TYPE_DAVINCI_DA830_EVM;
125
126 /* address of boot parameters */
127 gd->bd->bi_boot_params = LINUX_BOOT_PARAM_ADDR;
128
129 /*
130 * Power on required peripherals
131 * ARM does not have access by default to PSC0 and PSC1
132 * assuming here that the DSP bootloader has set the IOPU
133 * such that PSC access is available to ARM
134 */
Sudhakar Rajashekhara9d799562010-06-07 12:39:59 +0530135 if (da8xx_configure_lpsc_items(lpsc, ARRAY_SIZE(lpsc)))
136 return 1;
Sekhar Noribdc9c6c2009-11-12 11:08:39 -0500137
138 /* setup the SUSPSRC for ARM to control emulation suspend */
139 writel(readl(&davinci_syscfg_regs->suspsrc) &
140 ~(DAVINCI_SYSCFG_SUSPSRC_EMAC | DAVINCI_SYSCFG_SUSPSRC_I2C |
141 DAVINCI_SYSCFG_SUSPSRC_SPI0 | DAVINCI_SYSCFG_SUSPSRC_TIMER0 |
142 DAVINCI_SYSCFG_SUSPSRC_UART2),
143 &davinci_syscfg_regs->suspsrc);
144
Nick Thompson63a47df2010-01-27 11:11:28 -0500145 /* configure pinmux settings */
146 if (davinci_configure_pin_mux_items(pinmuxes, ARRAY_SIZE(pinmuxes)))
Ajay Kumar Gupta82a821f2009-12-22 10:56:11 +0530147 return 1;
148
Sekhar Noribdc9c6c2009-11-12 11:08:39 -0500149 /* enable the console UART */
150 writel((DAVINCI_UART_PWREMU_MGMT_FREE | DAVINCI_UART_PWREMU_MGMT_URRST |
151 DAVINCI_UART_PWREMU_MGMT_UTRST),
152 &davinci_uart2_ctrl_regs->pwremu_mgmt);
153
154 return(0);
155}
Nick Thompson37cffda2010-02-17 20:37:24 -0500156
Manjunath Hadli28375eb2011-10-07 23:38:39 +0000157
158#ifdef CONFIG_NAND_DAVINCI
159int board_nand_init(struct nand_chip *nand)
160{
161 davinci_nand_init(nand);
162
163 return 0;
164}
165#endif
166
Nick Thompson37cffda2010-02-17 20:37:24 -0500167#if defined(CONFIG_DRIVER_TI_EMAC)
168
169#define PHY_SW_I2C_ADDR 0x5f /* Address of PHY on i2c bus */
170
171/*
172 * Initializes on-board ethernet controllers.
173 */
174int board_eth_init(bd_t *bis)
175{
176 u_int8_t mac_addr[6];
177 u_int8_t switch_start_cmd[2] = { 0x01, 0x23 };
Ben Gardiner7b37a272010-09-23 09:58:43 -0400178 struct eth_device *dev;
Nick Thompson37cffda2010-02-17 20:37:24 -0500179
180 /* Read Ethernet MAC address from EEPROM */
181 if (dvevm_read_mac_address(mac_addr))
182 /* set address env if not already set */
Ben Gardiner7b37a272010-09-23 09:58:43 -0400183 davinci_sync_env_enetaddr(mac_addr);
Nick Thompson37cffda2010-02-17 20:37:24 -0500184
185 /* read the address back from env */
186 if (!eth_getenv_enetaddr("ethaddr", mac_addr))
187 return -1;
188
Nick Thompson37cffda2010-02-17 20:37:24 -0500189 /* enable the Ethernet switch in the 3 port PHY */
190 if (i2c_write(PHY_SW_I2C_ADDR, 0, 0,
191 switch_start_cmd, sizeof(switch_start_cmd))) {
192 printf("Ethernet switch start failed!\n");
193 return -1;
194 }
195
196 /* finally, initialise the driver */
197 if (!davinci_emac_initialize()) {
198 printf("Error: Ethernet init failed!\n");
199 return -1;
200 }
201
Ben Gardiner7b37a272010-09-23 09:58:43 -0400202 dev = eth_get_dev();
203
204 /* provide the resulting addr to the driver */
205 memcpy(dev->enetaddr, mac_addr, 6);
206 dev->write_hwaddr(dev);
207
Nick Thompson37cffda2010-02-17 20:37:24 -0500208 return 0;
209}
210#endif /* CONFIG_DRIVER_TI_EMAC */