]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blob - arch/arm/mach-omap1/board-osk.c
56c8a4b12bb8171178a13f68d161485c40d09a60
[linux-2.6-omap-h63xx.git] / arch / arm / mach-omap1 / board-osk.c
1 /*
2  * linux/arch/arm/mach-omap1/board-osk.c
3  *
4  * Board specific init for OMAP5912 OSK
5  *
6  * Written by Dirk Behme <dirk.behme@de.bosch.com>
7  *
8  * This program is free software; you can redistribute it and/or modify it
9  * under the terms of the GNU General Public License as published by the
10  * Free Software Foundation; either version 2 of the License, or (at your
11  * option) any later version.
12  *
13  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
14  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
15  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
16  * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
17  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
18  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
19  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
20  * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
22  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23  *
24  * You should have received a copy of the  GNU General Public License along
25  * with this program; if not, write  to the Free Software Foundation, Inc.,
26  * 675 Mass Ave, Cambridge, MA 02139, USA.
27  */
28
29 #include <linux/kernel.h>
30 #include <linux/init.h>
31 #include <linux/platform_device.h>
32 #include <linux/interrupt.h>
33
34 #include <linux/mtd/mtd.h>
35 #include <linux/mtd/partitions.h>
36 #include <linux/input.h>
37
38 #include <asm/hardware.h>
39 #include <asm/mach-types.h>
40 #include <asm/mach/arch.h>
41 #include <asm/mach/map.h>
42 #include <asm/mach/flash.h>
43
44 #include <asm/arch/gpio.h>
45 #include <asm/arch/usb.h>
46 #include <asm/arch/mux.h>
47 #include <asm/arch/tc.h>
48 #include <asm/arch/keypad.h>
49 #include <asm/arch/common.h>
50
51 static int osk_keymap[] = {
52         KEY(0, 0, KEY_F1),
53         KEY(0, 3, KEY_UP),
54         KEY(1, 1, KEY_LEFTCTRL),
55         KEY(1, 2, KEY_LEFT),
56         KEY(2, 0, KEY_SPACE),
57         KEY(2, 1, KEY_ESC),
58         KEY(2, 2, KEY_DOWN),
59         KEY(3, 2, KEY_ENTER),
60         KEY(3, 3, KEY_RIGHT),
61         0
62 };
63
64
65 static struct mtd_partition osk_partitions[] = {
66         /* bootloader (U-Boot, etc) in first sector */
67         {
68               .name             = "bootloader",
69               .offset           = 0,
70               .size             = SZ_128K,
71               .mask_flags       = MTD_WRITEABLE, /* force read-only */
72         },
73         /* bootloader params in the next sector */
74         {
75               .name             = "params",
76               .offset           = MTDPART_OFS_APPEND,
77               .size             = SZ_128K,
78               .mask_flags       = 0,
79         }, {
80               .name             = "kernel",
81               .offset           = MTDPART_OFS_APPEND,
82               .size             = SZ_2M,
83               .mask_flags       = 0
84         }, {
85               .name             = "filesystem",
86               .offset           = MTDPART_OFS_APPEND,
87               .size             = MTDPART_SIZ_FULL,
88               .mask_flags       = 0
89         }
90 };
91
92 static struct flash_platform_data osk_flash_data = {
93         .map_name       = "cfi_probe",
94         .width          = 2,
95         .parts          = osk_partitions,
96         .nr_parts       = ARRAY_SIZE(osk_partitions),
97 };
98
99 static struct resource osk_flash_resource = {
100         /* this is on CS3, wherever it's mapped */
101         .flags          = IORESOURCE_MEM,
102 };
103
104 static struct platform_device osk5912_flash_device = {
105         .name           = "omapflash",
106         .id             = 0,
107         .dev            = {
108                 .platform_data  = &osk_flash_data,
109         },
110         .num_resources  = 1,
111         .resource       = &osk_flash_resource,
112 };
113
114 static struct resource osk5912_smc91x_resources[] = {
115         [0] = {
116                 .start  = OMAP_OSK_ETHR_START,          /* Physical */
117                 .end    = OMAP_OSK_ETHR_START + 0xf,
118                 .flags  = IORESOURCE_MEM,
119         },
120         [1] = {
121                 .start  = OMAP_GPIO_IRQ(0),
122                 .end    = OMAP_GPIO_IRQ(0),
123                 .flags  = IORESOURCE_IRQ,
124         },
125 };
126
127 static struct platform_device osk5912_smc91x_device = {
128         .name           = "smc91x",
129         .id             = -1,
130         .num_resources  = ARRAY_SIZE(osk5912_smc91x_resources),
131         .resource       = osk5912_smc91x_resources,
132 };
133
134 static struct resource osk5912_cf_resources[] = {
135         [0] = {
136                 .start  = OMAP_GPIO_IRQ(62),
137                 .end    = OMAP_GPIO_IRQ(62),
138                 .flags  = IORESOURCE_IRQ,
139         },
140 };
141
142 static struct platform_device osk5912_cf_device = {
143         .name           = "omap_cf",
144         .id             = -1,
145         .dev = {
146                 .platform_data  = (void *) 2 /* CS2 */,
147         },
148         .num_resources  = ARRAY_SIZE(osk5912_cf_resources),
149         .resource       = osk5912_cf_resources,
150 };
151
152 static struct platform_device osk5912_mcbsp1_device = {
153         .name           = "omap_mcbsp",
154         .id             = 1,
155 };
156
157 static struct resource osk5912_kp_resources[] = {
158         [0] = {
159                 .start  = INT_KEYBOARD,
160                 .end    = INT_KEYBOARD,
161                 .flags  = IORESOURCE_IRQ,
162         },
163 };
164
165 static struct omap_kp_platform_data osk_kp_data = {
166         .rows   = 8,
167         .cols   = 8,
168         .keymap = osk_keymap,
169 };
170
171 static struct platform_device osk5912_kp_device = {
172         .name           = "omap-keypad",
173         .id             = -1,
174         .dev            = {
175                 .platform_data = &osk_kp_data,
176         },
177         .num_resources  = ARRAY_SIZE(osk5912_kp_resources),
178         .resource       = osk5912_kp_resources,
179 };
180
181 static struct platform_device osk5912_lcd_device = {
182         .name           = "lcd_osk",
183         .id             = -1,
184 };
185
186 static struct platform_device *osk5912_devices[] __initdata = {
187         &osk5912_flash_device,
188         &osk5912_smc91x_device,
189         &osk5912_cf_device,
190         &osk5912_mcbsp1_device,
191         &osk5912_kp_device,
192         &osk5912_lcd_device,
193 };
194
195 static void __init osk_init_smc91x(void)
196 {
197         if ((omap_request_gpio(0)) < 0) {
198                 printk("Error requesting gpio 0 for smc91x irq\n");
199                 return;
200         }
201
202         /* Check EMIFS wait states to fix errors with SMC_GET_PKT_HDR */
203         EMIFS_CCS(1) |= 0x3;
204 }
205
206 static void __init osk_init_cf(void)
207 {
208         omap_cfg_reg(M7_1610_GPIO62);
209         if ((omap_request_gpio(62)) < 0) {
210                 printk("Error requesting gpio 62 for CF irq\n");
211                 return;
212         }
213         /* the CF I/O IRQ is really active-low */
214         set_irq_type(OMAP_GPIO_IRQ(62), IRQT_FALLING);
215 }
216
217 static void __init osk_init_irq(void)
218 {
219         omap1_init_common_hw();
220         omap_init_irq();
221         omap_gpio_init();
222         osk_init_smc91x();
223         osk_init_cf();
224 }
225
226 static struct omap_usb_config osk_usb_config __initdata = {
227         /* has usb host connector (A) ... for development it can also
228          * be used, with a NONSTANDARD gender-bending cable/dongle, as
229          * a peripheral.
230          */
231 #ifdef  CONFIG_USB_GADGET_OMAP
232         .register_dev   = 1,
233         .hmc_mode       = 0,
234 #else
235         .register_host  = 1,
236         .hmc_mode       = 16,
237         .rwc            = 1,
238 #endif
239         .pins[0]        = 2,
240 };
241
242 static struct omap_uart_config osk_uart_config __initdata = {
243         .enabled_uarts = (1 << 0),
244 };
245
246 static struct omap_lcd_config osk_lcd_config __initdata = {
247         .ctrl_name      = "internal",
248 };
249
250 static struct omap_board_config_kernel osk_config[] = {
251         { OMAP_TAG_USB,           &osk_usb_config },
252         { OMAP_TAG_UART,                &osk_uart_config },
253         { OMAP_TAG_LCD,                 &osk_lcd_config },
254 };
255
256 #ifdef  CONFIG_OMAP_OSK_MISTRAL
257
258 #ifdef  CONFIG_PM
259 static irqreturn_t
260 osk_mistral_wake_interrupt(int irq, void *ignored, struct pt_regs *regs)
261 {
262         return IRQ_HANDLED;
263 }
264 #endif
265
266 static void __init osk_mistral_init(void)
267 {
268         /* FIXME here's where to feed in framebuffer, touchpad, and
269          * keyboard setup ...  not in the drivers for those devices!
270          *
271          * NOTE:  we could actually tell if there's a Mistral board
272          * attached, e.g. by trying to read something from the ads7846.
273          * But this is too early for that...
274          */
275
276         /* the sideways button (SW1) is for use as a "wakeup" button */
277         omap_cfg_reg(N15_1610_MPUIO2);
278         if (omap_request_gpio(OMAP_MPUIO(2)) == 0) {
279                 int ret = 0;
280                 omap_set_gpio_direction(OMAP_MPUIO(2), 1);
281                 set_irq_type(OMAP_GPIO_IRQ(OMAP_MPUIO(2)), IRQT_RISING);
282 #ifdef  CONFIG_PM
283                 /* share the IRQ in case someone wants to use the
284                  * button for more than wakeup from system sleep.
285                  */
286                 ret = request_irq(OMAP_GPIO_IRQ(OMAP_MPUIO(2)),
287                                 &osk_mistral_wake_interrupt,
288                                 SA_SHIRQ, "mistral_wakeup",
289                                 &osk_mistral_wake_interrupt);
290                 if (ret != 0) {
291                         omap_free_gpio(OMAP_MPUIO(2));
292                         printk(KERN_ERR "OSK+Mistral: no wakeup irq, %d?\n",
293                                 ret);
294                 } else
295                         enable_irq_wake(OMAP_GPIO_IRQ(OMAP_MPUIO(2)));
296 #endif
297         } else
298                 printk(KERN_ERR "OSK+Mistral: wakeup button is awol\n");
299 }
300 #else
301 static void __init osk_mistral_init(void) { }
302 #endif
303
304 #define EMIFS_CS3_VAL   (0x88013141)
305
306 static void __init osk_init(void)
307 {
308         /* Workaround for wrong CS3 (NOR flash) timing
309          * There are some U-Boot versions out there which configure
310          * wrong CS3 memory timings. This mainly leads to CRC
311          * or similiar errors if you use NOR flash (e.g. with JFFS2)
312          */
313         if (EMIFS_CCS(3) != EMIFS_CS3_VAL)
314                 EMIFS_CCS(3) = EMIFS_CS3_VAL;
315
316         osk_flash_resource.end = osk_flash_resource.start = omap_cs3_phys();
317         osk_flash_resource.end += SZ_32M - 1;
318         platform_add_devices(osk5912_devices, ARRAY_SIZE(osk5912_devices));
319         omap_board_config = osk_config;
320         omap_board_config_size = ARRAY_SIZE(osk_config);
321         USB_TRANSCEIVER_CTRL_REG |= (3 << 1);
322
323         omap_serial_init();
324         osk_mistral_init();
325 }
326
327 static void __init osk_map_io(void)
328 {
329         omap1_map_common_io();
330 }
331
332 MACHINE_START(OMAP_OSK, "TI-OSK")
333         /* Maintainer: Dirk Behme <dirk.behme@de.bosch.com> */
334         .phys_io        = 0xfff00000,
335         .io_pg_offst    = ((0xfef00000) >> 18) & 0xfffc,
336         .boot_params    = 0x10000100,
337         .map_io         = osk_map_io,
338         .init_irq       = osk_init_irq,
339         .init_machine   = osk_init,
340         .timer          = &omap_timer,
341 MACHINE_END