aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mach-davinci/board-dm355-leopard.c
diff options
context:
space:
mode:
authorKevin Hilman <khilman@deeprootsystems.com>2009-04-29 15:10:55 -0400
committerKevin Hilman <khilman@deeprootsystems.com>2009-05-26 10:18:15 -0400
commit95a3477fe57e0669dcb531516f2930fe1cf27e6b (patch)
tree06399584903f64f3c71e8773bb7dce30ef2215c9 /arch/arm/mach-davinci/board-dm355-leopard.c
parentf5ce6a67a78357da5e88782b1cf1cc10b36f102c (diff)
davinci: DM355: add base SoC and board support
In addition, add board support for the DM355 Evaluation Module (EVM) and the DM355 Leopard board. Original DM355 EVM support done by Sandeep Paulraj, with significant updates and improvements by David Brownell. DM355 Leopord support done by Koen Kooi. Signed-off-by: Sandeep Paulraj <s-paulraj@ti.com> Signed-off-by: Koen Kooi <koen@beagleboard.org> Cc: David Brownell <dbrownell@users.sourceforge.net> Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Diffstat (limited to 'arch/arm/mach-davinci/board-dm355-leopard.c')
-rw-r--r--arch/arm/mach-davinci/board-dm355-leopard.c268
1 files changed, 268 insertions, 0 deletions
diff --git a/arch/arm/mach-davinci/board-dm355-leopard.c b/arch/arm/mach-davinci/board-dm355-leopard.c
new file mode 100644
index 000000000000..22f16f38a0ba
--- /dev/null
+++ b/arch/arm/mach-davinci/board-dm355-leopard.c
@@ -0,0 +1,268 @@
1/*
2 * DM355 leopard board support
3 *
4 * Based on board-dm355-evm.c
5 *
6 * This file is licensed under the terms of the GNU General Public
7 * License version 2. This program is licensed "as is" without any
8 * warranty of any kind, whether express or implied.
9 */
10#include <linux/kernel.h>
11#include <linux/module.h>
12#include <linux/init.h>
13#include <linux/dma-mapping.h>
14#include <linux/platform_device.h>
15#include <linux/mtd/mtd.h>
16#include <linux/mtd/partitions.h>
17#include <linux/mtd/nand.h>
18#include <linux/i2c.h>
19#include <linux/io.h>
20#include <linux/gpio.h>
21#include <linux/clk.h>
22#include <linux/spi/spi.h>
23#include <linux/spi/eeprom.h>
24
25#include <asm/setup.h>
26#include <asm/mach-types.h>
27#include <asm/mach/arch.h>
28#include <asm/mach/map.h>
29#include <asm/mach/flash.h>
30
31#include <mach/hardware.h>
32#include <mach/dm355.h>
33#include <mach/psc.h>
34#include <mach/common.h>
35#include <mach/i2c.h>
36#include <mach/serial.h>
37#include <mach/nand.h>
38
39#define DAVINCI_ASYNC_EMIF_CONTROL_BASE 0x01e10000
40#define DAVINCI_ASYNC_EMIF_DATA_CE0_BASE 0x02000000
41
42/* NOTE: this is geared for the standard config, with a socketed
43 * 2 GByte Micron NAND (MT29F16G08FAA) using 128KB sectors. If you
44 * swap chips, maybe with a different block size, partitioning may
45 * need to be changed.
46 */
47#define NAND_BLOCK_SIZE SZ_128K
48
49static struct mtd_partition davinci_nand_partitions[] = {
50 {
51 /* UBL (a few copies) plus U-Boot */
52 .name = "bootloader",
53 .offset = 0,
54 .size = 15 * NAND_BLOCK_SIZE,
55 .mask_flags = MTD_WRITEABLE, /* force read-only */
56 }, {
57 /* U-Boot environment */
58 .name = "params",
59 .offset = MTDPART_OFS_APPEND,
60 .size = 1 * NAND_BLOCK_SIZE,
61 .mask_flags = 0,
62 }, {
63 .name = "kernel",
64 .offset = MTDPART_OFS_APPEND,
65 .size = SZ_4M,
66 .mask_flags = 0,
67 }, {
68 .name = "filesystem1",
69 .offset = MTDPART_OFS_APPEND,
70 .size = SZ_512M,
71 .mask_flags = 0,
72 }, {
73 .name = "filesystem2",
74 .offset = MTDPART_OFS_APPEND,
75 .size = MTDPART_SIZ_FULL,
76 .mask_flags = 0,
77 }
78 /* two blocks with bad block table (and mirror) at the end */
79};
80
81static struct davinci_nand_pdata davinci_nand_data = {
82 .mask_chipsel = BIT(14),
83 .parts = davinci_nand_partitions,
84 .nr_parts = ARRAY_SIZE(davinci_nand_partitions),
85 .ecc_mode = NAND_ECC_HW_SYNDROME,
86 .options = NAND_USE_FLASH_BBT,
87};
88
89static struct resource davinci_nand_resources[] = {
90 {
91 .start = DAVINCI_ASYNC_EMIF_DATA_CE0_BASE,
92 .end = DAVINCI_ASYNC_EMIF_DATA_CE0_BASE + SZ_32M - 1,
93 .flags = IORESOURCE_MEM,
94 }, {
95 .start = DAVINCI_ASYNC_EMIF_CONTROL_BASE,
96 .end = DAVINCI_ASYNC_EMIF_CONTROL_BASE + SZ_4K - 1,
97 .flags = IORESOURCE_MEM,
98 },
99};
100
101static struct platform_device davinci_nand_device = {
102 .name = "davinci_nand",
103 .id = 0,
104
105 .num_resources = ARRAY_SIZE(davinci_nand_resources),
106 .resource = davinci_nand_resources,
107
108 .dev = {
109 .platform_data = &davinci_nand_data,
110 },
111};
112
113static struct davinci_i2c_platform_data i2c_pdata = {
114 .bus_freq = 400 /* kHz */,
115 .bus_delay = 0 /* usec */,
116};
117
118static int leopard_mmc_gpio = -EINVAL;
119
120static void dm355leopard_mmcsd_gpios(unsigned gpio)
121{
122 gpio_request(gpio + 0, "mmc0_ro");
123 gpio_request(gpio + 1, "mmc0_cd");
124 gpio_request(gpio + 2, "mmc1_ro");
125 gpio_request(gpio + 3, "mmc1_cd");
126
127 /* we "know" these are input-only so we don't
128 * need to call gpio_direction_input()
129 */
130
131 leopard_mmc_gpio = gpio;
132}
133
134static struct i2c_board_info dm355leopard_i2c_info[] = {
135 { I2C_BOARD_INFO("dm355leopard_msp", 0x25),
136 .platform_data = dm355leopard_mmcsd_gpios,
137 /* plus irq */ },
138 /* { I2C_BOARD_INFO("tlv320aic3x", 0x1b), }, */
139 /* { I2C_BOARD_INFO("tvp5146", 0x5d), }, */
140};
141
142static void __init leopard_init_i2c(void)
143{
144 davinci_init_i2c(&i2c_pdata);
145
146 gpio_request(5, "dm355leopard_msp");
147 gpio_direction_input(5);
148 dm355leopard_i2c_info[0].irq = gpio_to_irq(5);
149
150 i2c_register_board_info(1, dm355leopard_i2c_info,
151 ARRAY_SIZE(dm355leopard_i2c_info));
152}
153
154static struct resource dm355leopard_dm9000_rsrc[] = {
155 {
156 /* addr */
157 .start = 0x04000000,
158 .end = 0x04000001,
159 .flags = IORESOURCE_MEM,
160 }, {
161 /* data */
162 .start = 0x04000016,
163 .end = 0x04000017,
164 .flags = IORESOURCE_MEM,
165 }, {
166 .flags = IORESOURCE_IRQ
167 | IORESOURCE_IRQ_HIGHEDGE /* rising (active high) */,
168 },
169};
170
171static struct platform_device dm355leopard_dm9000 = {
172 .name = "dm9000",
173 .id = -1,
174 .resource = dm355leopard_dm9000_rsrc,
175 .num_resources = ARRAY_SIZE(dm355leopard_dm9000_rsrc),
176};
177
178static struct platform_device *davinci_leopard_devices[] __initdata = {
179 &dm355leopard_dm9000,
180 &davinci_nand_device,
181};
182
183static struct davinci_uart_config uart_config __initdata = {
184 .enabled_uarts = (1 << 0),
185};
186
187static void __init dm355_leopard_map_io(void)
188{
189 davinci_map_common_io();
190 dm355_init();
191}
192
193/* Don't connect anything to J10 unless you're only using USB host
194 * mode *and* have to do so with some kind of gender-bender. If
195 * you have proper Mini-B or Mini-A cables (or Mini-A adapters)
196 * the ID pin won't need any help.
197 */
198#ifdef CONFIG_USB_MUSB_PERIPHERAL
199#define USB_ID_VALUE 0 /* ID pulled high; *should* float */
200#else
201#define USB_ID_VALUE 1 /* ID pulled low */
202#endif
203
204static struct spi_eeprom at25640a = {
205 .byte_len = SZ_64K / 8,
206 .name = "at25640a",
207 .page_size = 32,
208 .flags = EE_ADDR2,
209};
210
211static struct spi_board_info dm355_leopard_spi_info[] __initconst = {
212 {
213 .modalias = "at25",
214 .platform_data = &at25640a,
215 .max_speed_hz = 10 * 1000 * 1000, /* at 3v3 */
216 .bus_num = 0,
217 .chip_select = 0,
218 .mode = SPI_MODE_0,
219 },
220};
221
222static __init void dm355_leopard_init(void)
223{
224 struct clk *aemif;
225
226 gpio_request(9, "dm9000");
227 gpio_direction_input(9);
228 dm355leopard_dm9000_rsrc[2].start = gpio_to_irq(9);
229
230 aemif = clk_get(&dm355leopard_dm9000.dev, "aemif");
231 if (IS_ERR(aemif))
232 WARN("%s: unable to get AEMIF clock\n", __func__);
233 else
234 clk_enable(aemif);
235
236 platform_add_devices(davinci_leopard_devices,
237 ARRAY_SIZE(davinci_leopard_devices));
238 leopard_init_i2c();
239 davinci_serial_init(&uart_config);
240
241 /* NOTE: NAND flash timings set by the UBL are slower than
242 * needed by MT29F16G08FAA chips ... EMIF.A1CR is 0x40400204
243 * but could be 0x0400008c for about 25% faster page reads.
244 */
245
246 gpio_request(2, "usb_id_toggle");
247 gpio_direction_output(2, USB_ID_VALUE);
248 /* irlml6401 switches over 1A in under 8 msec */
249 setup_usb(500, 8);
250
251 dm355_init_spi0(BIT(0), dm355_leopard_spi_info,
252 ARRAY_SIZE(dm355_leopard_spi_info));
253}
254
255static __init void dm355_leopard_irq_init(void)
256{
257 davinci_irq_init();
258}
259
260MACHINE_START(DM355_LEOPARD, "DaVinci DM355 leopard")
261 .phys_io = IO_PHYS,
262 .io_pg_offst = (__IO_ADDRESS(IO_PHYS) >> 18) & 0xfffc,
263 .boot_params = (0x80000100),
264 .map_io = dm355_leopard_map_io,
265 .init_irq = dm355_leopard_irq_init,
266 .timer = &davinci_timer,
267 .init_machine = dm355_leopard_init,
268MACHINE_END