]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blob - arch/arm/mach-omap1/board-h2.c
ARM: OMAP1: Make omap1 use MMC multislot structures
[linux-2.6-omap-h63xx.git] / arch / arm / mach-omap1 / board-h2.c
1 /*
2  * linux/arch/arm/mach-omap1/board-h2.c
3  *
4  * Board specific inits for OMAP-1610 H2
5  *
6  * Copyright (C) 2001 RidgeRun, Inc.
7  * Author: Greg Lonnon <glonnon@ridgerun.com>
8  *
9  * Copyright (C) 2002 MontaVista Software, Inc.
10  *
11  * Separated FPGA interrupts from innovator1510.c and cleaned up for 2.6
12  * Copyright (C) 2004 Nokia Corporation by Tony Lindrgen <tony@atomide.com>
13  *
14  * H2 specific changes and cleanup
15  * Copyright (C) 2004 Nokia Corporation by Imre Deak <imre.deak@nokia.com>
16  *
17  * This program is free software; you can redistribute it and/or modify
18  * it under the terms of the GNU General Public License version 2 as
19  * published by the Free Software Foundation.
20  */
21
22 #include <linux/kernel.h>
23 #include <linux/platform_device.h>
24 #include <linux/delay.h>
25 #include <linux/i2c.h>
26 #include <linux/mtd/mtd.h>
27 #include <linux/mtd/nand.h>
28 #include <linux/mtd/partitions.h>
29 #include <linux/input.h>
30 #include <linux/i2c/tps65010.h>
31
32 #include <asm/hardware.h>
33 #include <asm/gpio.h>
34
35 #include <asm/mach-types.h>
36 #include <asm/mach/arch.h>
37 #include <asm/mach/flash.h>
38 #include <asm/mach/map.h>
39
40 #include <asm/arch/mux.h>
41 #include <asm/arch/tc.h>
42 #include <asm/arch/nand.h>
43 #include <asm/arch/irda.h>
44 #include <asm/arch/usb.h>
45 #include <asm/arch/keypad.h>
46 #include <asm/arch/common.h>
47 #include <asm/arch/mcbsp.h>
48 #include <asm/arch/omap-alsa.h>
49
50 extern int omap_gpio_init(void);
51
52 static int h2_keymap[] = {
53         KEY(0, 0, KEY_LEFT),
54         KEY(0, 1, KEY_RIGHT),
55         KEY(0, 2, KEY_3),
56         KEY(0, 3, KEY_F10),
57         KEY(0, 4, KEY_F5),
58         KEY(0, 5, KEY_9),
59         KEY(1, 0, KEY_DOWN),
60         KEY(1, 1, KEY_UP),
61         KEY(1, 2, KEY_2),
62         KEY(1, 3, KEY_F9),
63         KEY(1, 4, KEY_F7),
64         KEY(1, 5, KEY_0),
65         KEY(2, 0, KEY_ENTER),
66         KEY(2, 1, KEY_6),
67         KEY(2, 2, KEY_1),
68         KEY(2, 3, KEY_F2),
69         KEY(2, 4, KEY_F6),
70         KEY(2, 5, KEY_HOME),
71         KEY(3, 0, KEY_8),
72         KEY(3, 1, KEY_5),
73         KEY(3, 2, KEY_F12),
74         KEY(3, 3, KEY_F3),
75         KEY(3, 4, KEY_F8),
76         KEY(3, 5, KEY_END),
77         KEY(4, 0, KEY_7),
78         KEY(4, 1, KEY_4),
79         KEY(4, 2, KEY_F11),
80         KEY(4, 3, KEY_F1),
81         KEY(4, 4, KEY_F4),
82         KEY(4, 5, KEY_ESC),
83         KEY(5, 0, KEY_F13),
84         KEY(5, 1, KEY_F14),
85         KEY(5, 2, KEY_F15),
86         KEY(5, 3, KEY_F16),
87         KEY(5, 4, KEY_SLEEP),
88         0
89 };
90
91 static struct mtd_partition h2_nor_partitions[] = {
92         /* bootloader (U-Boot, etc) in first sector */
93         {
94               .name             = "bootloader",
95               .offset           = 0,
96               .size             = SZ_128K,
97               .mask_flags       = MTD_WRITEABLE, /* force read-only */
98         },
99         /* bootloader params in the next sector */
100         {
101               .name             = "params",
102               .offset           = MTDPART_OFS_APPEND,
103               .size             = SZ_128K,
104               .mask_flags       = 0,
105         },
106         /* kernel */
107         {
108               .name             = "kernel",
109               .offset           = MTDPART_OFS_APPEND,
110               .size             = SZ_2M,
111               .mask_flags       = 0
112         },
113         /* file system */
114         {
115               .name             = "filesystem",
116               .offset           = MTDPART_OFS_APPEND,
117               .size             = MTDPART_SIZ_FULL,
118               .mask_flags       = 0
119         }
120 };
121
122 static struct flash_platform_data h2_nor_data = {
123         .map_name       = "cfi_probe",
124         .width          = 2,
125         .parts          = h2_nor_partitions,
126         .nr_parts       = ARRAY_SIZE(h2_nor_partitions),
127 };
128
129 static struct resource h2_nor_resource = {
130         /* This is on CS3, wherever it's mapped */
131         .flags          = IORESOURCE_MEM,
132 };
133
134 static struct platform_device h2_nor_device = {
135         .name           = "omapflash",
136         .id             = 0,
137         .dev            = {
138                 .platform_data  = &h2_nor_data,
139         },
140         .num_resources  = 1,
141         .resource       = &h2_nor_resource,
142 };
143
144 static struct mtd_partition h2_nand_partitions[] = {
145 #if 0
146         /* REVISIT:  enable these partitions if you make NAND BOOT
147          * work on your H2 (rev C or newer); published versions of
148          * x-load only support P2 and H3.
149          */
150         {
151                 .name           = "xloader",
152                 .offset         = 0,
153                 .size           = 64 * 1024,
154                 .mask_flags     = MTD_WRITEABLE,        /* force read-only */
155         },
156         {
157                 .name           = "bootloader",
158                 .offset         = MTDPART_OFS_APPEND,
159                 .size           = 256 * 1024,
160                 .mask_flags     = MTD_WRITEABLE,        /* force read-only */
161         },
162         {
163                 .name           = "params",
164                 .offset         = MTDPART_OFS_APPEND,
165                 .size           = 192 * 1024,
166         },
167         {
168                 .name           = "kernel",
169                 .offset         = MTDPART_OFS_APPEND,
170                 .size           = 2 * SZ_1M,
171         },
172 #endif
173         {
174                 .name           = "filesystem",
175                 .size           = MTDPART_SIZ_FULL,
176                 .offset         = MTDPART_OFS_APPEND,
177         },
178 };
179
180 /* dip switches control NAND chip access:  8 bit, 16 bit, or neither */
181 static struct omap_nand_platform_data h2_nand_data = {
182         .options        = NAND_SAMSUNG_LP_OPTIONS,
183         .parts          = h2_nand_partitions,
184         .nr_parts       = ARRAY_SIZE(h2_nand_partitions),
185 };
186
187 static struct resource h2_nand_resource = {
188         .flags          = IORESOURCE_MEM,
189 };
190
191 static struct platform_device h2_nand_device = {
192         .name           = "omapnand",
193         .id             = 0,
194         .dev            = {
195                 .platform_data  = &h2_nand_data,
196         },
197         .num_resources  = 1,
198         .resource       = &h2_nand_resource,
199 };
200
201 static struct resource h2_smc91x_resources[] = {
202         [0] = {
203                 .start  = OMAP1610_ETHR_START,          /* Physical */
204                 .end    = OMAP1610_ETHR_START + 0xf,
205                 .flags  = IORESOURCE_MEM,
206         },
207         [1] = {
208                 .start  = OMAP_GPIO_IRQ(0),
209                 .end    = OMAP_GPIO_IRQ(0),
210                 .flags  = IORESOURCE_IRQ | IORESOURCE_IRQ_LOWEDGE,
211         },
212 };
213
214 static struct platform_device h2_smc91x_device = {
215         .name           = "smc91x",
216         .id             = 0,
217         .num_resources  = ARRAY_SIZE(h2_smc91x_resources),
218         .resource       = h2_smc91x_resources,
219 };
220
221 static struct resource h2_kp_resources[] = {
222         [0] = {
223                 .start  = INT_KEYBOARD,
224                 .end    = INT_KEYBOARD,
225                 .flags  = IORESOURCE_IRQ,
226         },
227 };
228
229 static struct omap_kp_platform_data h2_kp_data = {
230         .rows           = 8,
231         .cols           = 8,
232         .keymap         = h2_keymap,
233         .keymapsize     = ARRAY_SIZE(h2_keymap),
234         .rep            = 1,
235         .delay          = 9,
236         .dbounce        = 1,
237 };
238
239 static struct platform_device h2_kp_device = {
240         .name           = "omap-keypad",
241         .id             = -1,
242         .dev            = {
243                 .platform_data = &h2_kp_data,
244         },
245         .num_resources  = ARRAY_SIZE(h2_kp_resources),
246         .resource       = h2_kp_resources,
247 };
248
249 #define H2_IRDA_FIRSEL_GPIO_PIN 17
250
251 #if defined(CONFIG_OMAP_IR) || defined(CONFIG_OMAP_IR_MODULE)
252 static int h2_transceiver_mode(struct device *dev, int state)
253 {
254         if (state & IR_SIRMODE)
255                 omap_set_gpio_dataout(H2_IRDA_FIRSEL_GPIO_PIN, 0);
256         else    /* MIR/FIR */
257                 omap_set_gpio_dataout(H2_IRDA_FIRSEL_GPIO_PIN, 1);
258
259         return 0;
260 }
261 #endif
262
263 static struct omap_irda_config h2_irda_data = {
264         .transceiver_cap        = IR_SIRMODE | IR_MIRMODE | IR_FIRMODE,
265         .rx_channel             = OMAP_DMA_UART3_RX,
266         .tx_channel             = OMAP_DMA_UART3_TX,
267         .dest_start             = UART3_THR,
268         .src_start              = UART3_RHR,
269         .tx_trigger             = 0,
270         .rx_trigger             = 0,
271 };
272
273 static struct resource h2_irda_resources[] = {
274         [0] = {
275                 .start  = INT_UART3,
276                 .end    = INT_UART3,
277                 .flags  = IORESOURCE_IRQ,
278         },
279 };
280
281 static u64 irda_dmamask = 0xffffffff;
282
283 static struct platform_device h2_irda_device = {
284         .name           = "omapirda",
285         .id             = 0,
286         .dev            = {
287                 .platform_data  = &h2_irda_data,
288                 .dma_mask       = &irda_dmamask,
289         },
290         .num_resources  = ARRAY_SIZE(h2_irda_resources),
291         .resource       = h2_irda_resources,
292 };
293
294 static struct platform_device h2_lcd_device = {
295         .name           = "lcd_h2",
296         .id             = -1,
297 };
298
299 static struct omap_mcbsp_reg_cfg mcbsp_regs = {
300         .spcr2 = FREE | FRST | GRST | XRST | XINTM(3),
301         .spcr1 = RINTM(3) | RRST,
302         .rcr2  = RPHASE | RFRLEN2(OMAP_MCBSP_WORD_8) |
303                 RWDLEN2(OMAP_MCBSP_WORD_16) | RDATDLY(1),
304         .rcr1  = RFRLEN1(OMAP_MCBSP_WORD_8) | RWDLEN1(OMAP_MCBSP_WORD_16),
305         .xcr2  = XPHASE | XFRLEN2(OMAP_MCBSP_WORD_8) |
306                 XWDLEN2(OMAP_MCBSP_WORD_16) | XDATDLY(1) | XFIG,
307         .xcr1  = XFRLEN1(OMAP_MCBSP_WORD_8) | XWDLEN1(OMAP_MCBSP_WORD_16),
308         .srgr1 = FWID(15),
309         .srgr2 = GSYNC | CLKSP | FSGM | FPER(31),
310
311         .pcr0  = CLKXM | CLKRM | FSXP | FSRP | CLKXP | CLKRP,
312         /*.pcr0 = CLKXP | CLKRP,*/        /* mcbsp: slave */
313 };
314
315 static struct omap_alsa_codec_config alsa_config = {
316         .name                   = "H2 TSC2101",
317         .mcbsp_regs_alsa        = &mcbsp_regs,
318         .codec_configure_dev    = NULL, /* tsc2101_configure, */
319         .codec_set_samplerate   = NULL, /* tsc2101_set_samplerate, */
320         .codec_clock_setup      = NULL, /* tsc2101_clock_setup, */
321         .codec_clock_on         = NULL, /* tsc2101_clock_on, */
322         .codec_clock_off        = NULL, /* tsc2101_clock_off, */
323         .get_default_samplerate = NULL, /* tsc2101_get_default_samplerate, */
324 };
325
326 static struct platform_device h2_mcbsp1_device = {
327         .name   = "omap_alsa_mcbsp",
328         .id     = 1,
329         .dev = {
330                 .platform_data  = &alsa_config,
331         },
332 };
333
334 static struct platform_device *h2_devices[] __initdata = {
335         &h2_nor_device,
336         &h2_nand_device,
337         &h2_smc91x_device,
338         &h2_irda_device,
339         &h2_kp_device,
340         &h2_lcd_device,
341         &h2_mcbsp1_device,
342 };
343
344 #ifdef CONFIG_I2C_BOARDINFO
345 static struct i2c_board_info __initdata h2_i2c_board_info[] = {
346         {
347                 I2C_BOARD_INFO("tps65010", 0x48),
348                 .type           = "tps65010",
349                 .irq            = OMAP_GPIO_IRQ(58),
350         },
351         /* TODO when driver support is ready:
352          *  - isp1301 OTG transceiver
353          *  - optional ov9640 camera sensor at 0x30
354          *  - pcf9754 for aGPS control
355          *  - ... etc
356          */
357 };
358 #endif
359
360 static void __init h2_init_smc91x(void)
361 {
362         if ((omap_request_gpio(0)) < 0) {
363                 printk("Error requesting gpio 0 for smc91x irq\n");
364                 return;
365         }
366 }
367
368 static void __init h2_init_irq(void)
369 {
370         omap1_init_common_hw();
371         omap_init_irq();
372         omap_gpio_init();
373         h2_init_smc91x();
374 }
375
376 static struct omap_usb_config h2_usb_config __initdata = {
377         /* usb1 has a Mini-AB port and external isp1301 transceiver */
378         .otg            = 2,
379
380 #ifdef  CONFIG_USB_GADGET_OMAP
381         .hmc_mode       = 19,   /* 0:host(off) 1:dev|otg 2:disabled */
382         /* .hmc_mode    = 21,*/ /* 0:host(off) 1:dev(loopback) 2:host(loopback) */
383 #elif   defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE)
384         /* needs OTG cable, or NONSTANDARD (B-to-MiniB) */
385         .hmc_mode       = 20,   /* 1:dev|otg(off) 1:host 2:disabled */
386 #endif
387
388         .pins[1]        = 3,
389 };
390
391 static struct omap_mmc_config h2_mmc_config __initdata = {
392         .mmc[0] = {
393                 .enabled        = 1,
394                 .wire4          = 1,
395         },
396 };
397
398 extern struct omap_mmc_platform_data h2_mmc_data;
399
400 static struct omap_uart_config h2_uart_config __initdata = {
401         .enabled_uarts = ((1 << 0) | (1 << 1) | (1 << 2)),
402 };
403
404 static struct omap_lcd_config h2_lcd_config __initdata = {
405         .ctrl_name      = "internal",
406 };
407
408 static struct omap_board_config_kernel h2_config[] __initdata = {
409         { OMAP_TAG_USB,         &h2_usb_config },
410         { OMAP_TAG_MMC,         &h2_mmc_config },
411         { OMAP_TAG_UART,        &h2_uart_config },
412         { OMAP_TAG_LCD,         &h2_lcd_config },
413 };
414
415 #define H2_NAND_RB_GPIO_PIN     62
416
417 static int h2_nand_dev_ready(struct omap_nand_platform_data *data)
418 {
419         return omap_get_gpio_datain(H2_NAND_RB_GPIO_PIN);
420 }
421
422 static void __init h2_init(void)
423 {
424         /* Here we assume the NOR boot config:  NOR on CS3 (possibly swapped
425          * to address 0 by a dip switch), NAND on CS2B.  The NAND driver will
426          * notice whether a NAND chip is enabled at probe time.
427          *
428          * FIXME revC boards (and H3) support NAND-boot, with a dip switch to
429          * put NOR on CS2B and NAND (which on H2 may be 16bit) on CS3.  Try
430          * detecting that in code here, to avoid probing every possible flash
431          * configuration...
432          */
433         h2_nor_resource.end = h2_nor_resource.start = omap_cs3_phys();
434         h2_nor_resource.end += SZ_32M - 1;
435
436         h2_nand_resource.end = h2_nand_resource.start = OMAP_CS2B_PHYS;
437         h2_nand_resource.end += SZ_4K - 1;
438         if (!(omap_request_gpio(H2_NAND_RB_GPIO_PIN)))
439                 h2_nand_data.dev_ready = h2_nand_dev_ready;
440
441         omap_cfg_reg(L3_1610_FLASH_CS2B_OE);
442         omap_cfg_reg(M8_1610_FLASH_CS2B_WE);
443
444         /* MMC:  card detect and WP */
445         /* omap_cfg_reg(U19_ARMIO1); */         /* CD */
446         omap_cfg_reg(BALLOUT_V8_ARMIO3);        /* WP */
447
448         /* Irda */
449 #if defined(CONFIG_OMAP_IR) || defined(CONFIG_OMAP_IR_MODULE)
450         omap_writel(omap_readl(FUNC_MUX_CTRL_A) | 7, FUNC_MUX_CTRL_A);
451         if (!(omap_request_gpio(H2_IRDA_FIRSEL_GPIO_PIN))) {
452                 omap_set_gpio_direction(H2_IRDA_FIRSEL_GPIO_PIN, 0);
453                 h2_irda_data.transceiver_mode = h2_transceiver_mode;
454         }
455 #endif
456
457         platform_add_devices(h2_devices, ARRAY_SIZE(h2_devices));
458         omap_board_config = h2_config;
459         omap_board_config_size = ARRAY_SIZE(h2_config);
460         omap_serial_init();
461         h2_mmc_init();
462
463         /* irq for tps65010 chip */
464         omap_cfg_reg(W4_GPIO58);
465         if (gpio_request(58, "tps65010") == 0)
466                 gpio_direction_input(58);
467
468 #ifdef CONFIG_I2C_BOARDINFO
469         i2c_register_board_info(1, h2_i2c_board_info,
470                         ARRAY_SIZE(h2_i2c_board_info));
471 #endif
472 }
473
474 static void __init h2_map_io(void)
475 {
476         omap1_map_common_io();
477 }
478
479 #ifdef CONFIG_TPS65010
480 static int __init h2_tps_init(void)
481 {
482         if (!machine_is_omap_h2())
483                 return 0;
484
485         /* gpio3 for SD, gpio4 for VDD_DSP */
486         /* FIXME send power to DSP iff it's configured */
487
488         /* Enable LOW_PWR */
489         tps65010_set_low_pwr(ON);
490         return 0;
491 }
492 fs_initcall(h2_tps_init);
493 #endif
494
495 MACHINE_START(OMAP_H2, "TI-H2")
496         /* Maintainer: Imre Deak <imre.deak@nokia.com> */
497         .phys_io        = 0xfff00000,
498         .io_pg_offst    = ((0xfef00000) >> 18) & 0xfffc,
499         .boot_params    = 0x10000100,
500         .map_io         = h2_map_io,
501         .init_irq       = h2_init_irq,
502         .init_machine   = h2_init,
503         .timer          = &omap_timer,
504 MACHINE_END