mtd: nand: davinci: add header file for driver definitions
[platform/kernel/u-boot.git] / board / davinci / da8xxevm / da830evm.c
1 /*
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  * ----------------------------------------------------------------------------
19  * SPDX-License-Identifier:     GPL-2.0+
20  * ----------------------------------------------------------------------------
21  */
22
23 #include <common.h>
24 #include <i2c.h>
25 #include <net.h>
26 #include <netdev.h>
27 #include <asm/arch/hardware.h>
28 #include <asm/arch/emac_defs.h>
29 #include <asm/arch/pinmux_defs.h>
30 #include <asm/io.h>
31 #include <nand.h>
32 #include <asm/ti-common/davinci_nand.h>
33 #include <asm/arch/davinci_misc.h>
34
35 #ifdef CONFIG_DAVINCI_MMC
36 #include <mmc.h>
37 #include <asm/arch/sdmmc_defs.h>
38 #endif
39
40 DECLARE_GLOBAL_DATA_PTR;
41
42 static const struct pinmux_resource pinmuxes[] = {
43 #ifdef CONFIG_SPI_FLASH
44         PINMUX_ITEM(spi0_pins_base),
45         PINMUX_ITEM(spi0_pins_scs0),
46         PINMUX_ITEM(spi0_pins_ena),
47 #endif
48         PINMUX_ITEM(uart2_pins_txrx),
49         PINMUX_ITEM(i2c0_pins),
50 #ifdef CONFIG_USB_DA8XX
51         PINMUX_ITEM(usb_pins),
52 #endif
53 #ifdef CONFIG_USE_NAND
54         PINMUX_ITEM(emifa_pins),
55         PINMUX_ITEM(emifa_pins_cs0),
56         PINMUX_ITEM(emifa_pins_cs2),
57         PINMUX_ITEM(emifa_pins_cs3),
58 #endif
59 #if defined(CONFIG_DRIVER_TI_EMAC)
60         PINMUX_ITEM(emac_pins_rmii),
61         PINMUX_ITEM(emac_pins_mdio),
62         PINMUX_ITEM(emac_pins_rmii_clk_source),
63 #endif
64 #ifdef CONFIG_DAVINCI_MMC
65         PINMUX_ITEM(mmc0_pins_8bit)
66 #endif
67 };
68
69 static const struct lpsc_resource lpsc[] = {
70         { DAVINCI_LPSC_AEMIF }, /* NAND, NOR */
71         { DAVINCI_LPSC_SPI0 },  /* Serial Flash */
72         { DAVINCI_LPSC_EMAC },  /* image download */
73         { DAVINCI_LPSC_UART2 }, /* console */
74         { DAVINCI_LPSC_GPIO },
75 #ifdef CONFIG_DAVINCI_MMC
76         { DAVINCI_LPSC_MMC_SD },
77 #endif
78
79 };
80
81 #ifdef CONFIG_DAVINCI_MMC
82 static struct davinci_mmc mmc_sd0 = {
83         .reg_base = (struct davinci_mmc_regs *)DAVINCI_MMC_SD0_BASE,
84         .host_caps = MMC_MODE_8BIT,
85         .voltages = MMC_VDD_32_33 | MMC_VDD_33_34,
86         .version = MMC_CTLR_VERSION_2,
87 };
88
89 int board_mmc_init(bd_t *bis)
90 {
91         mmc_sd0.input_clk = clk_get(DAVINCI_MMCSD_CLKID);
92
93         printf("%x\n", mmc_sd0.input_clk);
94
95         /* Add slot-0 to mmc subsystem */
96         return davinci_mmc_init(bis, &mmc_sd0);
97 }
98 #endif
99
100 int board_init(void)
101 {
102 #ifndef CONFIG_USE_IRQ
103         irq_init();
104 #endif
105
106 #ifdef CONFIG_NAND_DAVINCI
107         /* EMIFA 100MHz clock select */
108         writel(readl(&davinci_syscfg_regs->cfgchip3) & ~2,
109                &davinci_syscfg_regs->cfgchip3);
110         /* NAND CS setup */
111         writel((DAVINCI_ABCR_WSETUP(0) |
112                 DAVINCI_ABCR_WSTROBE(2) |
113                 DAVINCI_ABCR_WHOLD(0) |
114                 DAVINCI_ABCR_RSETUP(0) |
115                 DAVINCI_ABCR_RSTROBE(2) |
116                 DAVINCI_ABCR_RHOLD(0) |
117                 DAVINCI_ABCR_TA(2) |
118                 DAVINCI_ABCR_ASIZE_8BIT),
119                &davinci_emif_regs->ab2cr);
120 #endif
121
122         /* arch number of the board */
123         gd->bd->bi_arch_number = MACH_TYPE_DAVINCI_DA830_EVM;
124
125         /* address of boot parameters */
126         gd->bd->bi_boot_params = LINUX_BOOT_PARAM_ADDR;
127
128         /*
129          * Power on required peripherals
130          * ARM does not have access by default to PSC0 and PSC1
131          * assuming here that the DSP bootloader has set the IOPU
132          * such that PSC access is available to ARM
133          */
134         if (da8xx_configure_lpsc_items(lpsc, ARRAY_SIZE(lpsc)))
135                 return 1;
136
137         /* setup the SUSPSRC for ARM to control emulation suspend */
138         writel(readl(&davinci_syscfg_regs->suspsrc) &
139                ~(DAVINCI_SYSCFG_SUSPSRC_EMAC | DAVINCI_SYSCFG_SUSPSRC_I2C |
140                  DAVINCI_SYSCFG_SUSPSRC_SPI0 | DAVINCI_SYSCFG_SUSPSRC_TIMER0 |
141                  DAVINCI_SYSCFG_SUSPSRC_UART2),
142                &davinci_syscfg_regs->suspsrc);
143
144         /* configure pinmux settings */
145         if (davinci_configure_pin_mux_items(pinmuxes, ARRAY_SIZE(pinmuxes)))
146                 return 1;
147
148         /* enable the console UART */
149         writel((DAVINCI_UART_PWREMU_MGMT_FREE | DAVINCI_UART_PWREMU_MGMT_URRST |
150                 DAVINCI_UART_PWREMU_MGMT_UTRST),
151                &davinci_uart2_ctrl_regs->pwremu_mgmt);
152
153         return(0);
154 }
155
156
157 #ifdef CONFIG_NAND_DAVINCI
158 int board_nand_init(struct nand_chip *nand)
159 {
160         davinci_nand_init(nand);
161
162         return 0;
163 }
164 #endif
165
166 #if defined(CONFIG_DRIVER_TI_EMAC)
167
168 #define PHY_SW_I2C_ADDR 0x5f /* Address of PHY on i2c bus */
169
170 /*
171  * Initializes on-board ethernet controllers.
172  */
173 int board_eth_init(bd_t *bis)
174 {
175         u_int8_t mac_addr[6];
176         u_int8_t switch_start_cmd[2] = { 0x01, 0x23 };
177         struct eth_device *dev;
178
179         /* Read Ethernet MAC address from EEPROM */
180         if (dvevm_read_mac_address(mac_addr))
181                 /* set address env if not already set */
182                 davinci_sync_env_enetaddr(mac_addr);
183
184         /* read the address back from env */
185         if (!eth_getenv_enetaddr("ethaddr", mac_addr))
186                 return -1;
187
188         /* enable the Ethernet switch in the 3 port PHY */
189         if (i2c_write(PHY_SW_I2C_ADDR, 0, 0,
190                         switch_start_cmd, sizeof(switch_start_cmd))) {
191                 printf("Ethernet switch start failed!\n");
192                 return -1;
193         }
194
195         /* finally, initialise the driver */
196         if (!davinci_emac_initialize()) {
197                 printf("Error: Ethernet init failed!\n");
198                 return -1;
199         }
200
201         dev = eth_get_dev();
202
203         /* provide the resulting addr to the driver */
204         memcpy(dev->enetaddr, mac_addr, 6);
205         dev->write_hwaddr(dev);
206
207         return 0;
208 }
209 #endif /* CONFIG_DRIVER_TI_EMAC */