]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blob - arch/arm/mach-omap2/board-h4.c
ARM: OMAP: Use I2C bus registration helper
[linux-2.6-omap-h63xx.git] / arch / arm / mach-omap2 / board-h4.c
1 /*
2  * linux/arch/arm/mach-omap2/board-h4.c
3  *
4  * Copyright (C) 2005 Nokia Corporation
5  * Author: Paul Mundt <paul.mundt@nokia.com>
6  *
7  * Modified from mach-omap/omap1/board-generic.c
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License version 2 as
11  * published by the Free Software Foundation.
12  */
13
14 #include <linux/kernel.h>
15 #include <linux/init.h>
16 #include <linux/platform_device.h>
17 #include <linux/mtd/mtd.h>
18 #include <linux/mtd/partitions.h>
19 #include <linux/delay.h>
20 #include <linux/workqueue.h>
21 #include <linux/input.h>
22 #include <linux/err.h>
23 #include <linux/clk.h>
24 #include <linux/i2c.h>
25 #include <linux/spi/spi.h>
26 #include <linux/spi/tsc210x.h>
27
28 #include <media/v4l2-int-device.h>
29
30 #include <asm/hardware.h>
31 #include <asm/mach-types.h>
32 #include <asm/mach/arch.h>
33 #include <asm/mach/map.h>
34 #include <asm/mach/flash.h>
35
36 #include <asm/arch/gpio.h>
37 #include <asm/arch/gpioexpander.h>
38 #include <asm/arch/mux.h>
39 #include <asm/arch/usb.h>
40 #include <asm/arch/irda.h>
41 #include <asm/arch/board.h>
42 #include <asm/arch/common.h>
43 #include <asm/arch/keypad.h>
44 #include <asm/arch/menelaus.h>
45 #include <asm/arch/dma.h>
46 #include <asm/arch/gpmc.h>
47
48 #include <asm/io.h>
49
50 #include <../drivers/media/video/ov9640.h>
51
52 #define H4_FLASH_CS     0
53 #define H4_SMC91X_CS    1
54
55 static unsigned int row_gpios[6] = { 88, 89, 124, 11, 6, 96 };
56 static unsigned int col_gpios[7] = { 90, 91, 100, 36, 12, 97, 98 };
57
58 static int h4_keymap[] = {
59         KEY(0, 0, KEY_LEFT),
60         KEY(0, 1, KEY_RIGHT),
61         KEY(0, 2, KEY_A),
62         KEY(0, 3, KEY_B),
63         KEY(0, 4, KEY_C),
64         KEY(1, 0, KEY_DOWN),
65         KEY(1, 1, KEY_UP),
66         KEY(1, 2, KEY_E),
67         KEY(1, 3, KEY_F),
68         KEY(1, 4, KEY_G),
69         KEY(2, 0, KEY_ENTER),
70         KEY(2, 1, KEY_I),
71         KEY(2, 2, KEY_J),
72         KEY(2, 3, KEY_K),
73         KEY(2, 4, KEY_3),
74         KEY(3, 0, KEY_M),
75         KEY(3, 1, KEY_N),
76         KEY(3, 2, KEY_O),
77         KEY(3, 3, KEY_P),
78         KEY(3, 4, KEY_Q),
79         KEY(4, 0, KEY_R),
80         KEY(4, 1, KEY_4),
81         KEY(4, 2, KEY_T),
82         KEY(4, 3, KEY_U),
83         KEY(4, 4, KEY_ENTER),
84         KEY(5, 0, KEY_V),
85         KEY(5, 1, KEY_W),
86         KEY(5, 2, KEY_L),
87         KEY(5, 3, KEY_S),
88         KEY(5, 4, KEY_ENTER),
89         0
90 };
91
92 static struct mtd_partition h4_partitions[] = {
93         /* bootloader (U-Boot, etc) in first sector */
94         {
95               .name             = "bootloader",
96               .offset           = 0,
97               .size             = SZ_128K,
98               .mask_flags       = MTD_WRITEABLE, /* force read-only */
99         },
100         /* bootloader params in the next sector */
101         {
102               .name             = "params",
103               .offset           = MTDPART_OFS_APPEND,
104               .size             = SZ_128K,
105               .mask_flags       = 0,
106         },
107         /* kernel */
108         {
109               .name             = "kernel",
110               .offset           = MTDPART_OFS_APPEND,
111               .size             = SZ_2M,
112               .mask_flags       = 0
113         },
114         /* file system */
115         {
116               .name             = "filesystem",
117               .offset           = MTDPART_OFS_APPEND,
118               .size             = MTDPART_SIZ_FULL,
119               .mask_flags       = 0
120         }
121 };
122
123 static struct flash_platform_data h4_flash_data = {
124         .map_name       = "cfi_probe",
125         .width          = 2,
126         .parts          = h4_partitions,
127         .nr_parts       = ARRAY_SIZE(h4_partitions),
128 };
129
130 static struct resource h4_flash_resource = {
131         .flags          = IORESOURCE_MEM,
132 };
133
134 static struct platform_device h4_flash_device = {
135         .name           = "omapflash",
136         .id             = 0,
137         .dev            = {
138                 .platform_data  = &h4_flash_data,
139         },
140         .num_resources  = 1,
141         .resource       = &h4_flash_resource,
142 };
143
144 /* Select between the IrDA and aGPS module
145  */
146 #if defined(CONFIG_OMAP_IR) || defined(CONFIG_OMAP_IR_MODULE)
147 static int h4_select_irda(struct device *dev, int state)
148 {
149         unsigned char expa;
150         int err = 0;
151
152         if ((err = read_gpio_expa(&expa, 0x21))) {
153                 printk(KERN_ERR "Error reading from I/O expander\n");
154                 return err;
155         }
156
157         /* 'P6' enable/disable IRDA_TX and IRDA_RX */
158         if (state & IR_SEL) {   /* IrDa */
159                 if ((err = write_gpio_expa(expa | 0x01, 0x21))) {
160                         printk(KERN_ERR "Error writing to I/O expander\n");
161                         return err;
162                 }
163         } else {
164                 if ((err = write_gpio_expa(expa & ~0x01, 0x21))) {
165                         printk(KERN_ERR "Error writing to I/O expander\n");
166                         return err;
167                 }
168         }
169         return err;
170 }
171
172 static void set_trans_mode(struct work_struct *work)
173 {
174         struct omap_irda_config *irda_config =
175                 container_of(work, struct omap_irda_config, gpio_expa.work);
176         int mode = irda_config->mode;
177         unsigned char expa;
178         int err = 0;
179
180         if ((err = read_gpio_expa(&expa, 0x20)) != 0) {
181                 printk(KERN_ERR "Error reading from I/O expander\n");
182         }
183
184         expa &= ~0x01;
185
186         if (!(mode & IR_SIRMODE)) { /* MIR/FIR */
187                 expa |= 0x01;
188         }
189
190         if ((err = write_gpio_expa(expa, 0x20)) != 0) {
191                 printk(KERN_ERR "Error writing to I/O expander\n");
192         }
193 }
194
195 static int h4_transceiver_mode(struct device *dev, int mode)
196 {
197         struct omap_irda_config *irda_config = dev->platform_data;
198
199         irda_config->mode = mode;
200         cancel_delayed_work(&irda_config->gpio_expa);
201         PREPARE_DELAYED_WORK(&irda_config->gpio_expa, set_trans_mode);
202         schedule_delayed_work(&irda_config->gpio_expa, 0);
203
204         return 0;
205 }
206 #else
207 static int h4_select_irda(struct device *dev, int state) { return 0; }
208 static int h4_transceiver_mode(struct device *dev, int mode) { return 0; }
209 #endif
210
211 static struct omap_irda_config h4_irda_data = {
212         .transceiver_cap        = IR_SIRMODE | IR_MIRMODE | IR_FIRMODE,
213         .transceiver_mode       = h4_transceiver_mode,
214         .select_irda            = h4_select_irda,
215         .rx_channel             = OMAP24XX_DMA_UART3_RX,
216         .tx_channel             = OMAP24XX_DMA_UART3_TX,
217         .dest_start             = OMAP_UART3_BASE,
218         .src_start              = OMAP_UART3_BASE,
219         .tx_trigger             = OMAP24XX_DMA_UART3_TX,
220         .rx_trigger             = OMAP24XX_DMA_UART3_RX,
221 };
222
223 static struct resource h4_irda_resources[] = {
224         [0] = {
225                 .start  = INT_24XX_UART3_IRQ,
226                 .end    = INT_24XX_UART3_IRQ,
227                 .flags  = IORESOURCE_IRQ,
228         },
229 };
230
231 static struct platform_device h4_irda_device = {
232         .name           = "omapirda",
233         .id             = -1,
234         .dev            = {
235                 .platform_data  = &h4_irda_data,
236         },
237         .num_resources  = 1,
238         .resource       = h4_irda_resources,
239 };
240
241 static struct omap_kp_platform_data h4_kp_data = {
242         .rows           = 6,
243         .cols           = 7,
244         .keymap         = h4_keymap,
245         .keymapsize     = ARRAY_SIZE(h4_keymap),
246         .rep            = 1,
247         .row_gpios      = row_gpios,
248         .col_gpios      = col_gpios,
249 };
250
251 static struct platform_device h4_kp_device = {
252         .name           = "omap-keypad",
253         .id             = -1,
254         .dev            = {
255                 .platform_data = &h4_kp_data,
256         },
257 };
258
259 static struct platform_device h4_lcd_device = {
260         .name           = "lcd_h4",
261         .id             = -1,
262 };
263
264 static struct platform_device *h4_devices[] __initdata = {
265         &h4_flash_device,
266         &h4_irda_device,
267         &h4_kp_device,
268         &h4_lcd_device,
269 };
270
271 /* 2420 Sysboot setup (2430 is different) */
272 static u32 get_sysboot_value(void)
273 {
274         return (omap_readl(OMAP2_CONTROL_STATUS) & 0xFFF);
275 }
276
277 /* FIXME: This function should be moved to some other file, gpmc.c? */
278
279 /* H4-2420's always used muxed mode, H4-2422's always use non-muxed
280  *
281  * Note: OMAP-GIT doesn't correctly do is_cpu_omap2422 and is_cpu_omap2423
282  *  correctly.  The macro needs to look at production_id not just hawkeye.
283  */
284 static u32 is_gpmc_muxed(void)
285 {
286         u32 mux;
287         mux = get_sysboot_value();
288         if ((mux & 0xF) == 0xd)
289                 return 1;       /* NAND config (could be either) */
290         if (mux & 0x2)          /* if mux'ed */
291                 return 1;
292         else
293                 return 0;
294 }
295
296 static inline void __init h4_init_debug(void)
297 {
298         int eth_cs;
299         unsigned long cs_mem_base;
300         unsigned int muxed, rate;
301         struct clk *l3ck;
302
303         eth_cs  = H4_SMC91X_CS;
304
305         l3ck = clk_get(NULL, "core_l3_ck");
306         if (IS_ERR(l3ck))
307                 rate = 100000000;
308         else
309                 rate = clk_get_rate(l3ck);
310
311         if (is_gpmc_muxed())
312                 muxed = 0x200;
313         else
314                 muxed = 0;
315
316         /* Make sure CS1 timings are correct */
317         gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG1,
318                           0x00011000 | muxed);
319
320         if (rate >= 160000000) {
321                 gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG2, 0x001f1f01);
322                 gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG3, 0x00080803);
323                 gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG4, 0x1c0b1c0a);
324                 gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG5, 0x041f1F1F);
325                 gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG6, 0x000004C4);
326         } else if (rate >= 130000000) {
327                 gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG2, 0x001f1f00);
328                 gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG3, 0x00080802);
329                 gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG4, 0x1C091C09);
330                 gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG5, 0x041f1F1F);
331                 gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG6, 0x000004C4);
332         } else {/* rate = 100000000 */
333                 gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG2, 0x001f1f00);
334                 gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG3, 0x00080802);
335                 gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG4, 0x1C091C09);
336                 gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG5, 0x031A1F1F);
337                 gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG6, 0x000003C2);
338         }
339
340         if (gpmc_cs_request(eth_cs, SZ_16M, &cs_mem_base) < 0) {
341                 printk(KERN_ERR "Failed to request GPMC mem for smc91x\n");
342                 return;
343         }
344
345         udelay(100);
346
347         omap_cfg_reg(M15_24XX_GPIO92);
348         if (debug_card_init(cs_mem_base, OMAP24XX_ETHR_GPIO_IRQ) < 0)
349                 gpmc_cs_free(eth_cs);
350 }
351
352 static void __init h4_init_flash(void)
353 {
354         unsigned long base;
355
356         if (gpmc_cs_request(H4_FLASH_CS, SZ_64M, &base) < 0) {
357                 printk("Can't request GPMC CS for flash\n");
358                 return;
359         }
360         h4_flash_resource.start = base;
361         h4_flash_resource.end   = base + SZ_64M - 1;
362 }
363
364 static void __init omap_h4_init_irq(void)
365 {
366         omap2_init_common_hw();
367         omap_init_irq();
368         omap_gpio_init();
369         h4_init_flash();
370 }
371
372 static struct omap_uart_config h4_uart_config __initdata = {
373 #ifdef  CONFIG_MACH_OMAP2_H4_USB1
374         .enabled_uarts = ((1 << 0) | (1 << 1)),
375 #else
376         .enabled_uarts = ((1 << 0) | (1 << 1) | (1 << 2)),
377 #endif
378 };
379
380 static struct omap_mmc_config h4_mmc_config __initdata = {
381         .mmc [0] = {
382                 .enabled        = 1,
383                 .wire4          = 1,
384                 .wp_pin         = -1,
385                 .power_pin      = -1,
386                 .switch_pin     = -1,
387         },
388 };
389
390 static struct omap_lcd_config h4_lcd_config __initdata = {
391         .ctrl_name      = "internal",
392 };
393
394 static struct omap_usb_config h4_usb_config __initdata = {
395 #ifdef  CONFIG_MACH_OMAP2_H4_USB1
396         /* NOTE:  usb1 could also be used with 3 wire signaling */
397         .pins[1]        = 4,
398 #endif
399
400 #ifdef  CONFIG_MACH_OMAP_H4_OTG
401         /* S1.10 ON -- USB OTG port
402          * usb0 switched to Mini-AB port and isp1301 transceiver;
403          * S2.POS3 = OFF, S2.POS4 = ON ... to allow battery charging
404          */
405         .otg            = 1,
406         .pins[0]        = 4,
407 #ifdef  CONFIG_USB_GADGET_OMAP
408         /* use OTG cable, or standard A-to-MiniB */
409         .hmc_mode       = 0x14, /* 0:dev/otg 1:host 2:disable */
410 #elif   defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE)
411         /* use OTG cable, or NONSTANDARD (B-to-MiniB) */
412         .hmc_mode       = 0x11, /* 0:host 1:host 2:disable */
413 #endif  /* XX */
414
415 #else
416         /* S1.10 OFF -- usb "download port"
417          * usb0 switched to Mini-B port and isp1105 transceiver;
418          * S2.POS3 = ON, S2.POS4 = OFF ... to enable battery charging
419          */
420         .register_dev   = 1,
421         .pins[0]        = 3,
422 //      .hmc_mode       = 0x14, /* 0:dev 1:host 2:disable */
423         .hmc_mode       = 0x00, /* 0:dev|otg 1:disable 2:disable */
424 #endif
425 };
426
427 /* ----------------------------------------------------------------------- */
428
429 static struct tsc210x_config tsc_platform_data = {
430         .use_internal           = 1,
431         .monitor                = TSC_VBAT | TSC_TEMP,
432         /* REVISIT temp calibration data -- board-specific; from EEPROM? */
433         .mclk                   = "sys_clkout",
434 };
435
436 static struct spi_board_info h4_spi_board_info[] __initdata = {
437         {
438                 .modalias       = "tsc2101",
439                 .bus_num        = 1,
440                 .chip_select    = 0,
441                 .mode           = SPI_MODE_1,
442                 .irq            = OMAP_GPIO_IRQ(93),
443                 .max_speed_hz   = 16000000,
444                 .platform_data  = &tsc_platform_data,
445         },
446
447         /* nCS1 -- to lcd board, but unused
448          * nCS2 -- to WLAN/miniPCI
449          */
450 };
451
452 /* ----------------------------------------------------------------------- */
453
454 static struct omap_board_config_kernel h4_config[] __initdata = {
455         { OMAP_TAG_UART,        &h4_uart_config },
456         { OMAP_TAG_MMC,         &h4_mmc_config },
457         { OMAP_TAG_LCD,         &h4_lcd_config },
458         { OMAP_TAG_USB,         &h4_usb_config },
459 };
460
461 #ifdef  CONFIG_MACH_OMAP_H4_TUSB
462
463 #include <linux/usb/musb.h>
464
465 static struct musb_hdrc_platform_data tusb_data = {
466         .mode           = MUSB_OTG,
467         .min_power      = 25,   /* x2 = 50 mA drawn from VBUS as peripheral */
468
469         /* 1.8V supplied by Menelaus, other voltages supplied by VBAT;
470          * so no switching.
471          */
472 };
473
474 static void __init tusb_evm_setup(void)
475 {
476         static char     announce[] __initdata =
477                                 KERN_INFO "TUSB 6010 EVM\n";
478         int             irq;
479         unsigned        dmachan = 0;
480
481         /* There are at least 32 different combinations of boards that
482          * are loosely called "H4", with a 2420 ... different OMAP chip
483          * revisions (with pin mux changes for DMAREQ, GPMC errata, etc),
484          * modifications of the CPU board, mainboard, EVM, TUSB etc.
485          * Plus omap2422, omap2423, etc.
486          *
487          * So you might need to tweak this setup to make the TUSB EVM
488          * behave on your particular setup ...
489          */
490
491         /* Already set up:  GPMC AD[0..15], CLK, nOE, nWE, nADV_ALE */
492         omap_cfg_reg(E2_GPMC_NCS2);
493         omap_cfg_reg(L2_GPMC_NCS7);
494         omap_cfg_reg(M1_GPMC_WAIT2);
495
496         switch ((system_rev >> 8) & 0x0f) {
497         case 0:         /* ES 1.0 */
498         case 1:         /* ES 2.0 */
499                 /* Assume early board revision without optional ES2.0
500                  * rework to swap J15 & AA10 so DMAREQ0 works
501                  */
502                 omap_cfg_reg(AA10_242X_GPIO13);
503                 irq = 13;
504                 // omap_cfg_reg(J15_24XX_DMAREQ0);
505                 break;
506         default:
507                 /* Later Menelaus boards can support all 6 DMA request
508                  * lines, at the price of boot flash A23-A26.
509                  */
510                 omap_cfg_reg(J15_24XX_GPIO99);
511                 irq = 99;
512                 dmachan = (1 << 1) | (1 << 0);
513 #if !(defined(CONFIG_MTD_OMAP_NOR) || defined(CONFIG_MTD_OMAP_NOR_MODULE))
514                 dmachan |= (1 << 5) | (1 << 4) (1 << 3) | (1 << 2);
515 #endif
516                 break;
517         }
518
519         if (tusb6010_setup_interface(&tusb_data,
520                         TUSB6010_REFCLK_24, /* waitpin */ 2,
521                         /* async cs */ 2, /* sync cs */ 7,
522                         irq, dmachan) == 0)
523                 printk(announce);
524 }
525
526 #endif
527
528 /*
529  * Common OV9640 register initialization for all image sizes, pixel formats,
530  * and frame rates
531  */
532 const static struct ov9640_reg ov9640_common[] = {
533         { 0x12, 0x80 }, { 0x11, 0x80 }, { 0x13, 0x8F }, /* COM7, CLKRC, COM8 */
534         { 0x01, 0x80 }, { 0x02, 0x80 }, { 0x04, 0x00 }, /* BLUE, RED, COM1 */
535         { 0x0E, 0x81 }, { 0x0F, 0x4F }, { 0x14, 0x4A }, /* COM5, COM6, COM9 */
536         { 0x16, 0x02 }, { 0x1B, 0x01 }, { 0x24, 0x70 }, /* ?, PSHFT, AEW */
537         { 0x25, 0x68 }, { 0x26, 0xD3 }, { 0x27, 0x90 }, /* AEB, VPT, BBIAS */
538         { 0x2A, 0x00 }, { 0x2B, 0x00 }, { 0x32, 0x24 }, /* EXHCH, EXHCL, HREF */
539         { 0x33, 0x02 }, { 0x37, 0x02 }, { 0x38, 0x13 }, /* CHLF, ADC, ACOM */
540         { 0x39, 0xF0 }, { 0x3A, 0x00 }, { 0x3B, 0x01 }, /* OFON, TSLB, COM11 */
541         { 0x3D, 0x90 }, { 0x3E, 0x02 }, { 0x3F, 0xF2 }, /* COM13, COM14, EDGE */
542         { 0x41, 0x02 }, { 0x42, 0xC8 },         /* COM16, COM17 */
543         { 0x43, 0xF0 }, { 0x44, 0x10 }, { 0x45, 0x6C }, /* ?, ?, ? */
544         { 0x46, 0x6C }, { 0x47, 0x44 }, { 0x48, 0x44 }, /* ?, ?, ? */
545         { 0x49, 0x03 }, { 0x59, 0x49 }, { 0x5A, 0x94 }, /* ?, ?, ? */
546         { 0x5B, 0x46 }, { 0x5C, 0x84 }, { 0x5D, 0x5C }, /* ?, ?, ? */
547         { 0x5E, 0x08 }, { 0x5F, 0x00 }, { 0x60, 0x14 }, /* ?, ?, ? */
548         { 0x61, 0xCE },                                 /* ? */
549         { 0x62, 0x70 }, { 0x63, 0x00 }, { 0x64, 0x04 }, /* LCC1, LCC2, LCC3 */
550         { 0x65, 0x00 }, { 0x66, 0x00 },                 /* LCC4, LCC5 */
551         { 0x69, 0x00 }, { 0x6A, 0x3E }, { 0x6B, 0x3F }, /* HV, MBD, DBLV */
552         { 0x6C, 0x40 }, { 0x6D, 0x30 }, { 0x6E, 0x4B }, /* GSP1, GSP2, GSP3 */
553         { 0x6F, 0x60 }, { 0x70, 0x70 }, { 0x71, 0x70 }, /* GSP4, GSP5, GSP6 */
554         { 0x72, 0x70 }, { 0x73, 0x70 }, { 0x74, 0x60 }, /* GSP7, GSP8, GSP9 */
555         { 0x75, 0x60 }, { 0x76, 0x50 }, { 0x77, 0x48 }, /* GSP10,GSP11,GSP12 */
556         { 0x78, 0x3A }, { 0x79, 0x2E }, { 0x7A, 0x28 }, /* GSP13,GSP14,GSP15 */
557         { 0x7B, 0x22 }, { 0x7C, 0x04 }, { 0x7D, 0x07 }, /* GSP16,GST1, GST2 */
558         { 0x7E, 0x10 }, { 0x7F, 0x28 }, { 0x80, 0x36 }, /* GST3, GST4, GST5 */
559         { 0x81, 0x44 }, { 0x82, 0x52 }, { 0x83, 0x60 }, /* GST6, GST7, GST8 */
560         { 0x84, 0x6C }, { 0x85, 0x78 }, { 0x86, 0x8C }, /* GST9, GST10,GST11 */
561         { 0x87, 0x9E }, { 0x88, 0xBB }, { 0x89, 0xD2 }, /* GST12,GST13,GST14 */
562         { 0x8A, 0xE6 }, { 0x13, 0x8F }, { 0x00, 0x7F }, /* GST15, COM8 */
563         { OV9640_REG_TERM, OV9640_VAL_TERM }
564 };
565
566 #if defined(CONFIG_VIDEO_OV9640) || defined(CONFIG_VIDEO_OV9640_MODULE)
567 static int ov9640_sensor_powerup(void)
568 {
569         unsigned char expa;
570         int err;
571
572         /* read current state of GPIO EXPA outputs */
573         if ((err = read_gpio_expa(&expa, 0x20))) {
574                 printk(KERN_ERR "Error reading GPIO EXPA\n");
575                 return err;
576         }
577         /* Set GPIO EXPA P3 (CAMERA_MODULE_EN) to power-up sensor */
578         if ((err = write_gpio_expa(expa | 0x08, 0x20))) {
579                 printk(KERN_ERR "Error writing to GPIO EXPA\n");
580                 return err;
581         }
582
583         /* read current state of GPIO EXPA outputs */
584         if ((err = read_gpio_expa(&expa, 0x22))) {
585                 printk(KERN_ERR "Error reading GPIO EXPA\n");
586                 return err;
587         }
588         /* Clear GPIO EXPA P7 (CAM_RST) */
589         if ((err = write_gpio_expa(expa & ~0x80, 0x22))) {
590                 printk(KERN_ERR "Error writing to GPIO EXPA\n");
591                 return err;
592         }
593
594         return 0;
595 }
596 static int ov9640_sensor_powerdown(void)
597 {
598         unsigned char expa;
599         int err;
600
601         /* read current state of GPIO EXPA outputs */
602         if ((err = read_gpio_expa(&expa, 0x20))) {
603                 printk(KERN_ERR "Error reading GPIO EXPA\n");
604                 return err;
605         }
606         /* Clear GPIO EXPA P3 (CAMERA_MODULE_EN) to power-down sensor */
607         if ((err = write_gpio_expa(expa & ~0x08, 0x20))) {
608                 printk(KERN_ERR "Error writing to GPIO EXPA\n");
609                 return err;
610         }
611
612         return 0;
613 }
614
615 static int ov9640_sensor_power_set(int power)
616 {
617         int err = 0;
618
619         if (power)
620                 err = ov9640_sensor_powerup();
621         else
622                 err = ov9640_sensor_powerdown();
623
624         return err;
625 }
626
627 static struct v4l2_ifparm ifparm = {
628         .if_type = V4L2_IF_TYPE_BT656,
629         .u = {
630                 .bt656 = {
631                          .frame_start_on_rising_vs = 1,
632                          .nobt_vs_inv = 1,
633                          .mode = V4L2_IF_TYPE_BT656_MODE_NOBT_8BIT,
634                          .clock_min = OV9640_XCLK_MIN,
635                          .clock_max = OV9640_XCLK_MAX,
636                  },
637         },
638 };
639
640 static int ov9640_ifparm(struct v4l2_ifparm *p)
641 {
642         *p = ifparm;
643
644         return 0;
645 }
646 #else
647 static int ov9640_sensor_power_set(int power) { return 0; }
648 static int ov9640_ifparm(struct v4l2_ifparm *p) { return 0; }
649 #endif
650
651 static struct ov9640_platform_data h4_ov9640_platform_data = {
652         .power_set      = ov9640_sensor_power_set,
653         .default_regs   = ov9640_common,
654         .ifparm         = ov9640_ifparm,
655 };
656
657 static struct i2c_board_info __initdata h4_i2c_board_info[] = {
658         {
659                 I2C_BOARD_INFO("rtc-rs5c372", 0x32),
660                 .type = "rv5c387a",
661                 /* no IRQ wired to OMAP; nINTB goes to AGPS */
662         },
663         {
664                 I2C_BOARD_INFO("menelaus", 0x72),
665                 .irq = INT_24XX_SYS_NIRQ,
666         },
667         {
668                 I2C_BOARD_INFO("ov9640", 0x30),
669                 .platform_data = &h4_ov9640_platform_data,
670         },
671 };
672
673 static void __init omap_h4_init(void)
674 {
675         /*
676          * Make sure the serial ports are muxed on at this point.
677          * You have to mux them off in device drivers later on
678          * if not needed.
679          */
680 #if defined(CONFIG_OMAP_IR) || defined(CONFIG_OMAP_IR_MODULE)
681         omap_cfg_reg(K15_24XX_UART3_TX);
682         omap_cfg_reg(K14_24XX_UART3_RX);
683 #endif
684
685 #if defined(CONFIG_KEYBOARD_OMAP) || defined(CONFIG_KEYBOARD_OMAP_MODULE)
686         if (omap_has_menelaus()) {
687                 row_gpios[5] = 0;
688                 col_gpios[2] = 15;
689                 col_gpios[6] = 18;
690         }
691 #endif
692
693 #ifdef  CONFIG_MACH_OMAP2_H4_USB1
694         /* S3.3 controls whether these pins are for UART2 or USB1 */
695         omap_cfg_reg(N14_24XX_USB1_SE0);
696         omap_cfg_reg(P15_24XX_USB1_DAT);
697         omap_cfg_reg(W20_24XX_USB1_TXEN);
698         omap_cfg_reg(V19_24XX_USB1_RCV);
699 #endif
700
701         /* Menelaus interrupt */
702         omap_cfg_reg(W19_24XX_SYS_NIRQ);
703
704         platform_add_devices(h4_devices, ARRAY_SIZE(h4_devices));
705         omap_board_config = h4_config;
706         omap_board_config_size = ARRAY_SIZE(h4_config);
707         omap_serial_init();
708         omap_register_i2c_bus(1, 100, h4_i2c_board_info,
709                               ARRAY_SIZE(h4_i2c_board_info));
710
711         /* smc91x, debug leds, ps/2, extra uarts */
712         h4_init_debug();
713
714 #ifdef  CONFIG_MACH_OMAP_H4_TUSB
715         tusb_evm_setup();
716 #endif
717
718         /* defaults seem ok for:
719          * omap_cfg_reg(U18_24XX_SPI1_SCK);
720          * omap_cfg_reg(V20_24XX_SPI1_MOSI);
721          * omap_cfg_reg(T18_24XX_SPI1_MISO);
722          * omap_cfg_reg(U19_24XX_SPI1_NCS0);
723          */
724
725         /* TSC2101 */
726         omap_cfg_reg(P20_24XX_GPIO93);
727         gpio_request(93, "tsc_irq");
728         gpio_direction_input(93);
729
730         omap_cfg_reg(W14_24XX_SYS_CLKOUT);      /* mclk */
731         /* defaults seem ok for:
732          * omap_cfg_reg(Y15_EAC_AC_SCLK);       // bclk
733          * omap_cfg_reg(R14_EAC_AC_FS);
734          * omap_cfg_reg(V15_EAC_AC_DOUT);
735          * omap_cfg_reg(W15_EAC_AC_DIN);
736          */
737
738         spi_register_board_info(h4_spi_board_info,
739                                 ARRAY_SIZE(h4_spi_board_info));
740 }
741
742 static void __init omap_h4_map_io(void)
743 {
744         omap2_map_common_io();
745 }
746
747 MACHINE_START(OMAP_H4, "OMAP2420 H4 board")
748         /* Maintainer: Paul Mundt <paul.mundt@nokia.com> */
749         .phys_io        = 0x48000000,
750         .io_pg_offst    = ((0xd8000000) >> 18) & 0xfffc,
751         .boot_params    = 0x80000100,
752         .map_io         = omap_h4_map_io,
753         .init_irq       = omap_h4_init_irq,
754         .init_machine   = omap_h4_init,
755         .timer          = &omap_timer,
756 MACHINE_END