Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
ezx.c
Go to the documentation of this file.
1 /*
2  * ezx.c - Common code for the EZX platform.
3  *
4  * Copyright (C) 2005-2006 Harald Welte <[email protected]>,
5  * 2007-2008 Daniel Ribeiro <[email protected]>,
6  * 2007-2008 Stefan Schmidt <[email protected]>
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License version 2 as
10  * published by the Free Software Foundation.
11  *
12  */
13 
14 #include <linux/kernel.h>
15 #include <linux/init.h>
16 #include <linux/platform_device.h>
17 #include <linux/delay.h>
18 #include <linux/pwm_backlight.h>
19 #include <linux/input.h>
20 #include <linux/gpio.h>
21 #include <linux/gpio_keys.h>
22 #include <linux/leds-lp3944.h>
23 #include <linux/i2c/pxa-i2c.h>
24 
25 #include <media/soc_camera.h>
26 
27 #include <asm/setup.h>
28 #include <asm/mach-types.h>
29 #include <asm/mach/arch.h>
30 
31 #include <mach/pxa27x.h>
34 #include <mach/hardware.h>
37 
38 #include "devices.h"
39 #include "generic.h"
40 
41 #define EZX_NR_IRQS (IRQ_BOARD_START + 24)
42 
43 #define GPIO12_A780_FLIP_LID 12
44 #define GPIO15_A1200_FLIP_LID 15
45 #define GPIO15_A910_FLIP_LID 15
46 #define GPIO12_E680_LOCK_SWITCH 12
47 #define GPIO15_E6_LOCK_SWITCH 15
48 #define GPIO50_nCAM_EN 50
49 #define GPIO19_GEN1_CAM_RST 19
50 #define GPIO28_GEN2_CAM_RST 28
51 
52 static struct platform_pwm_backlight_data ezx_backlight_data = {
53  .pwm_id = 0,
54  .max_brightness = 1023,
55  .dft_brightness = 1023,
56  .pwm_period_ns = 78770,
57 };
58 
59 static struct platform_device ezx_backlight_device = {
60  .name = "pwm-backlight",
61  .dev = {
62  .parent = &pxa27x_device_pwm0.dev,
63  .platform_data = &ezx_backlight_data,
64  },
65 };
66 
67 static struct pxafb_mode_info mode_ezx_old = {
68  .pixclock = 150000,
69  .xres = 240,
70  .yres = 320,
71  .bpp = 16,
72  .hsync_len = 10,
73  .left_margin = 20,
74  .right_margin = 10,
75  .vsync_len = 2,
76  .upper_margin = 3,
77  .lower_margin = 2,
78  .sync = 0,
79 };
80 
81 static struct pxafb_mach_info ezx_fb_info_1 = {
82  .modes = &mode_ezx_old,
83  .num_modes = 1,
84  .lcd_conn = LCD_COLOR_TFT_16BPP,
85 };
86 
87 static struct pxafb_mode_info mode_72r89803y01 = {
88  .pixclock = 192308,
89  .xres = 240,
90  .yres = 320,
91  .bpp = 32,
92  .depth = 18,
93  .hsync_len = 10,
94  .left_margin = 20,
95  .right_margin = 10,
96  .vsync_len = 2,
97  .upper_margin = 3,
98  .lower_margin = 2,
99  .sync = 0,
100 };
101 
102 static struct pxafb_mach_info ezx_fb_info_2 = {
103  .modes = &mode_72r89803y01,
104  .num_modes = 1,
105  .lcd_conn = LCD_COLOR_TFT_18BPP,
106 };
107 
108 static struct platform_device *ezx_devices[] __initdata = {
109  &ezx_backlight_device,
110 };
111 
112 static unsigned long ezx_pin_config[] __initdata = {
113  /* PWM backlight */
115 
116  /* BTUART */
121 
122  /* I2C */
125 
126  /* PCAP SSP */
130  GPIO24_GPIO, /* pcap chip select */
131  GPIO1_GPIO | WAKEUP_ON_EDGE_RISE, /* pcap interrupt */
132  GPIO4_GPIO | MFP_LPM_DRIVE_HIGH, /* WDI_AP */
133  GPIO55_GPIO | MFP_LPM_DRIVE_HIGH, /* SYS_RESTART */
134 
135  /* MMC */
142  GPIO11_GPIO, /* mmc detect */
143 
144  /* usb to external transceiver */
151 
152  /* usb to Neptune GSM chip */
159 };
160 
161 #if defined(CONFIG_MACH_EZX_A780) || defined(CONFIG_MACH_EZX_E680)
162 static unsigned long gen1_pin_config[] __initdata = {
163  /* flip / lockswitch */
165 
166  /* bluetooth (bcm2035) */
167  GPIO14_GPIO | WAKEUP_ON_EDGE_RISE, /* HOSTWAKE */
168  GPIO48_GPIO, /* RESET */
169  GPIO28_GPIO, /* WAKEUP */
170 
171  /* Neptune handshake */
172  GPIO0_GPIO | WAKEUP_ON_EDGE_FALL, /* BP_RDY */
173  GPIO57_GPIO | MFP_LPM_DRIVE_HIGH, /* AP_RDY */
174  GPIO13_GPIO | WAKEUP_ON_EDGE_BOTH, /* WDI */
175  GPIO3_GPIO | WAKEUP_ON_EDGE_BOTH, /* WDI2 */
176  GPIO82_GPIO | MFP_LPM_DRIVE_HIGH, /* RESET */
177  GPIO99_GPIO | MFP_LPM_DRIVE_HIGH, /* TC_MM_EN */
178 
179  /* sound */
184 
185  /* ssp2 pins to in */
186  GPIO22_GPIO, /* SSP2_SCLK */
187  GPIO37_GPIO, /* SSP2_SFRM */
188  GPIO38_GPIO, /* SSP2_TXD */
189  GPIO88_GPIO, /* SSP2_RXD */
190 
191  /* camera */
204  GPIO50_GPIO | MFP_LPM_DRIVE_HIGH, /* CAM_EN */
205  GPIO19_GPIO | MFP_LPM_DRIVE_HIGH, /* CAM_RST */
206 
207  /* EMU */
208  GPIO120_GPIO, /* EMU_MUX1 */
209  GPIO119_GPIO, /* EMU_MUX2 */
210  GPIO86_GPIO, /* SNP_INT_CTL */
211  GPIO87_GPIO, /* SNP_INT_IN */
212 };
213 #endif
214 
215 #if defined(CONFIG_MACH_EZX_A1200) || defined(CONFIG_MACH_EZX_A910) || \
216  defined(CONFIG_MACH_EZX_E2) || defined(CONFIG_MACH_EZX_E6)
217 static unsigned long gen2_pin_config[] __initdata = {
218  /* flip / lockswitch */
220 
221  /* EOC */
223 
224  /* bluetooth (bcm2045) */
225  GPIO13_GPIO | WAKEUP_ON_EDGE_RISE, /* HOSTWAKE */
226  GPIO37_GPIO, /* RESET */
227  GPIO57_GPIO, /* WAKEUP */
228 
229  /* Neptune handshake */
230  GPIO0_GPIO | WAKEUP_ON_EDGE_FALL, /* BP_RDY */
231  GPIO96_GPIO | MFP_LPM_DRIVE_HIGH, /* AP_RDY */
232  GPIO3_GPIO | WAKEUP_ON_EDGE_FALL, /* WDI */
233  GPIO116_GPIO | MFP_LPM_DRIVE_HIGH, /* RESET */
234  GPIO41_GPIO, /* BP_FLASH */
235 
236  /* sound */
241 
242  /* ssp2 pins to in */
243  GPIO22_GPIO, /* SSP2_SCLK */
244  GPIO14_GPIO, /* SSP2_SFRM */
245  GPIO38_GPIO, /* SSP2_TXD */
246  GPIO88_GPIO, /* SSP2_RXD */
247 
248  /* camera */
261  GPIO50_GPIO | MFP_LPM_DRIVE_HIGH, /* CAM_EN */
262  GPIO28_GPIO | MFP_LPM_DRIVE_HIGH, /* CAM_RST */
263  GPIO17_GPIO, /* CAM_FLASH */
264 };
265 #endif
266 
267 #ifdef CONFIG_MACH_EZX_A780
268 static unsigned long a780_pin_config[] __initdata = {
269  /* keypad */
281 
282  /* attenuate sound */
283  GPIO96_GPIO,
284 };
285 #endif
286 
287 #ifdef CONFIG_MACH_EZX_E680
288 static unsigned long e680_pin_config[] __initdata = {
289  /* keypad */
301 
302  /* MIDI */
303  GPIO79_GPIO, /* VA_SEL_BUL */
304  GPIO80_GPIO, /* FLT_SEL_BUL */
305  GPIO78_GPIO, /* MIDI_RESET */
306  GPIO33_GPIO, /* MIDI_CS */
307  GPIO15_GPIO, /* MIDI_IRQ */
308  GPIO49_GPIO, /* MIDI_NPWE */
309  GPIO18_GPIO, /* MIDI_RDY */
310 
311  /* leds */
312  GPIO46_GPIO,
313  GPIO47_GPIO,
314 };
315 #endif
316 
317 #ifdef CONFIG_MACH_EZX_A1200
318 static unsigned long a1200_pin_config[] __initdata = {
319  /* keypad */
331 };
332 #endif
333 
334 #ifdef CONFIG_MACH_EZX_A910
335 static unsigned long a910_pin_config[] __initdata = {
336  /* keypad */
348 
349  /* WLAN */
350  GPIO89_GPIO, /* RESET */
351  GPIO33_GPIO, /* WAKEUP */
352  GPIO94_GPIO | WAKEUP_ON_LEVEL_HIGH, /* HOSTWAKE */
353 
354  /* MMC CS */
355  GPIO20_GPIO,
356 };
357 #endif
358 
359 #ifdef CONFIG_MACH_EZX_E2
360 static unsigned long e2_pin_config[] __initdata = {
361  /* keypad */
373 };
374 #endif
375 
376 #ifdef CONFIG_MACH_EZX_E6
377 static unsigned long e6_pin_config[] __initdata = {
378  /* keypad */
390 };
391 #endif
392 
393 /* KEYPAD */
394 #ifdef CONFIG_MACH_EZX_A780
395 static unsigned int a780_key_map[] = {
396  KEY(0, 0, KEY_SEND),
397  KEY(0, 1, KEY_BACK),
398  KEY(0, 2, KEY_END),
399  KEY(0, 3, KEY_PAGEUP),
400  KEY(0, 4, KEY_UP),
401 
402  KEY(1, 0, KEY_NUMERIC_1),
403  KEY(1, 1, KEY_NUMERIC_2),
404  KEY(1, 2, KEY_NUMERIC_3),
405  KEY(1, 3, KEY_SELECT),
406  KEY(1, 4, KEY_KPENTER),
407 
408  KEY(2, 0, KEY_NUMERIC_4),
409  KEY(2, 1, KEY_NUMERIC_5),
410  KEY(2, 2, KEY_NUMERIC_6),
411  KEY(2, 3, KEY_RECORD),
412  KEY(2, 4, KEY_LEFT),
413 
414  KEY(3, 0, KEY_NUMERIC_7),
415  KEY(3, 1, KEY_NUMERIC_8),
416  KEY(3, 2, KEY_NUMERIC_9),
417  KEY(3, 3, KEY_HOME),
418  KEY(3, 4, KEY_RIGHT),
419 
420  KEY(4, 0, KEY_NUMERIC_STAR),
421  KEY(4, 1, KEY_NUMERIC_0),
422  KEY(4, 2, KEY_NUMERIC_POUND),
423  KEY(4, 3, KEY_PAGEDOWN),
424  KEY(4, 4, KEY_DOWN),
425 };
426 
427 static struct pxa27x_keypad_platform_data a780_keypad_platform_data = {
428  .matrix_key_rows = 5,
429  .matrix_key_cols = 5,
430  .matrix_key_map = a780_key_map,
431  .matrix_key_map_size = ARRAY_SIZE(a780_key_map),
432 
433  .direct_key_map = { KEY_CAMERA },
434  .direct_key_num = 1,
435 
436  .debounce_interval = 30,
437 };
438 #endif /* CONFIG_MACH_EZX_A780 */
439 
440 #ifdef CONFIG_MACH_EZX_E680
441 static unsigned int e680_key_map[] = {
442  KEY(0, 0, KEY_UP),
443  KEY(0, 1, KEY_RIGHT),
444  KEY(0, 2, KEY_RESERVED),
445  KEY(0, 3, KEY_SEND),
446 
447  KEY(1, 0, KEY_DOWN),
448  KEY(1, 1, KEY_LEFT),
449  KEY(1, 2, KEY_PAGEUP),
450  KEY(1, 3, KEY_PAGEDOWN),
451 
452  KEY(2, 0, KEY_RESERVED),
453  KEY(2, 1, KEY_RESERVED),
454  KEY(2, 2, KEY_RESERVED),
455  KEY(2, 3, KEY_KPENTER),
456 };
457 
458 static struct pxa27x_keypad_platform_data e680_keypad_platform_data = {
459  .matrix_key_rows = 3,
460  .matrix_key_cols = 4,
461  .matrix_key_map = e680_key_map,
462  .matrix_key_map_size = ARRAY_SIZE(e680_key_map),
463 
464  .direct_key_map = {
465  KEY_CAMERA,
466  KEY_RESERVED,
467  KEY_RESERVED,
468  KEY_F1,
469  KEY_CANCEL,
470  KEY_F2,
471  },
472  .direct_key_num = 6,
473 
474  .debounce_interval = 30,
475 };
476 #endif /* CONFIG_MACH_EZX_E680 */
477 
478 #ifdef CONFIG_MACH_EZX_A1200
479 static unsigned int a1200_key_map[] = {
480  KEY(0, 0, KEY_RESERVED),
481  KEY(0, 1, KEY_RIGHT),
482  KEY(0, 2, KEY_PAGEDOWN),
483  KEY(0, 3, KEY_RESERVED),
484  KEY(0, 4, KEY_RESERVED),
485  KEY(0, 5, KEY_RESERVED),
486 
487  KEY(1, 0, KEY_RESERVED),
488  KEY(1, 1, KEY_DOWN),
489  KEY(1, 2, KEY_CAMERA),
490  KEY(1, 3, KEY_RESERVED),
491  KEY(1, 4, KEY_RESERVED),
492  KEY(1, 5, KEY_RESERVED),
493 
494  KEY(2, 0, KEY_RESERVED),
495  KEY(2, 1, KEY_KPENTER),
496  KEY(2, 2, KEY_RECORD),
497  KEY(2, 3, KEY_RESERVED),
498  KEY(2, 4, KEY_RESERVED),
499  KEY(2, 5, KEY_SELECT),
500 
501  KEY(3, 0, KEY_RESERVED),
502  KEY(3, 1, KEY_UP),
503  KEY(3, 2, KEY_SEND),
504  KEY(3, 3, KEY_RESERVED),
505  KEY(3, 4, KEY_RESERVED),
506  KEY(3, 5, KEY_RESERVED),
507 
508  KEY(4, 0, KEY_RESERVED),
509  KEY(4, 1, KEY_LEFT),
510  KEY(4, 2, KEY_PAGEUP),
511  KEY(4, 3, KEY_RESERVED),
512  KEY(4, 4, KEY_RESERVED),
513  KEY(4, 5, KEY_RESERVED),
514 };
515 
516 static struct pxa27x_keypad_platform_data a1200_keypad_platform_data = {
517  .matrix_key_rows = 5,
518  .matrix_key_cols = 6,
519  .matrix_key_map = a1200_key_map,
520  .matrix_key_map_size = ARRAY_SIZE(a1200_key_map),
521 
522  .debounce_interval = 30,
523 };
524 #endif /* CONFIG_MACH_EZX_A1200 */
525 
526 #ifdef CONFIG_MACH_EZX_E6
527 static unsigned int e6_key_map[] = {
528  KEY(0, 0, KEY_RESERVED),
529  KEY(0, 1, KEY_RIGHT),
530  KEY(0, 2, KEY_PAGEDOWN),
531  KEY(0, 3, KEY_RESERVED),
532  KEY(0, 4, KEY_RESERVED),
533  KEY(0, 5, KEY_NEXTSONG),
534 
535  KEY(1, 0, KEY_RESERVED),
536  KEY(1, 1, KEY_DOWN),
537  KEY(1, 2, KEY_PROG1),
538  KEY(1, 3, KEY_RESERVED),
539  KEY(1, 4, KEY_RESERVED),
540  KEY(1, 5, KEY_RESERVED),
541 
542  KEY(2, 0, KEY_RESERVED),
543  KEY(2, 1, KEY_ENTER),
544  KEY(2, 2, KEY_CAMERA),
545  KEY(2, 3, KEY_RESERVED),
546  KEY(2, 4, KEY_RESERVED),
547  KEY(2, 5, KEY_WWW),
548 
549  KEY(3, 0, KEY_RESERVED),
550  KEY(3, 1, KEY_UP),
551  KEY(3, 2, KEY_SEND),
552  KEY(3, 3, KEY_RESERVED),
553  KEY(3, 4, KEY_RESERVED),
554  KEY(3, 5, KEY_PLAYPAUSE),
555 
556  KEY(4, 0, KEY_RESERVED),
557  KEY(4, 1, KEY_LEFT),
558  KEY(4, 2, KEY_PAGEUP),
559  KEY(4, 3, KEY_RESERVED),
560  KEY(4, 4, KEY_RESERVED),
561  KEY(4, 5, KEY_PREVIOUSSONG),
562 };
563 
564 static struct pxa27x_keypad_platform_data e6_keypad_platform_data = {
565  .matrix_key_rows = 5,
566  .matrix_key_cols = 6,
567  .matrix_key_map = e6_key_map,
568  .matrix_key_map_size = ARRAY_SIZE(e6_key_map),
569 
570  .debounce_interval = 30,
571 };
572 #endif /* CONFIG_MACH_EZX_E6 */
573 
574 #ifdef CONFIG_MACH_EZX_A910
575 static unsigned int a910_key_map[] = {
576  KEY(0, 0, KEY_NUMERIC_6),
577  KEY(0, 1, KEY_RIGHT),
578  KEY(0, 2, KEY_PAGEDOWN),
579  KEY(0, 3, KEY_KPENTER),
580  KEY(0, 4, KEY_NUMERIC_5),
581  KEY(0, 5, KEY_CAMERA),
582 
583  KEY(1, 0, KEY_NUMERIC_8),
584  KEY(1, 1, KEY_DOWN),
585  KEY(1, 2, KEY_RESERVED),
586  KEY(1, 3, KEY_F1), /* Left SoftKey */
587  KEY(1, 4, KEY_NUMERIC_STAR),
588  KEY(1, 5, KEY_RESERVED),
589 
590  KEY(2, 0, KEY_NUMERIC_7),
591  KEY(2, 1, KEY_NUMERIC_9),
592  KEY(2, 2, KEY_RECORD),
593  KEY(2, 3, KEY_F2), /* Right SoftKey */
594  KEY(2, 4, KEY_BACK),
595  KEY(2, 5, KEY_SELECT),
596 
597  KEY(3, 0, KEY_NUMERIC_2),
598  KEY(3, 1, KEY_UP),
599  KEY(3, 2, KEY_SEND),
600  KEY(3, 3, KEY_NUMERIC_0),
601  KEY(3, 4, KEY_NUMERIC_1),
602  KEY(3, 5, KEY_RECORD),
603 
604  KEY(4, 0, KEY_NUMERIC_4),
605  KEY(4, 1, KEY_LEFT),
606  KEY(4, 2, KEY_PAGEUP),
607  KEY(4, 3, KEY_NUMERIC_POUND),
608  KEY(4, 4, KEY_NUMERIC_3),
609  KEY(4, 5, KEY_RESERVED),
610 };
611 
612 static struct pxa27x_keypad_platform_data a910_keypad_platform_data = {
613  .matrix_key_rows = 5,
614  .matrix_key_cols = 6,
615  .matrix_key_map = a910_key_map,
616  .matrix_key_map_size = ARRAY_SIZE(a910_key_map),
617 
618  .debounce_interval = 30,
619 };
620 #endif /* CONFIG_MACH_EZX_A910 */
621 
622 #ifdef CONFIG_MACH_EZX_E2
623 static unsigned int e2_key_map[] = {
624  KEY(0, 0, KEY_NUMERIC_6),
625  KEY(0, 1, KEY_RIGHT),
626  KEY(0, 2, KEY_NUMERIC_9),
627  KEY(0, 3, KEY_NEXTSONG),
628  KEY(0, 4, KEY_NUMERIC_5),
629  KEY(0, 5, KEY_F1), /* Left SoftKey */
630 
631  KEY(1, 0, KEY_NUMERIC_8),
632  KEY(1, 1, KEY_DOWN),
633  KEY(1, 2, KEY_RESERVED),
634  KEY(1, 3, KEY_PAGEUP),
635  KEY(1, 4, KEY_NUMERIC_STAR),
636  KEY(1, 5, KEY_F2), /* Right SoftKey */
637 
638  KEY(2, 0, KEY_NUMERIC_7),
639  KEY(2, 1, KEY_KPENTER),
640  KEY(2, 2, KEY_RECORD),
641  KEY(2, 3, KEY_PAGEDOWN),
642  KEY(2, 4, KEY_BACK),
643  KEY(2, 5, KEY_NUMERIC_0),
644 
645  KEY(3, 0, KEY_NUMERIC_2),
646  KEY(3, 1, KEY_UP),
647  KEY(3, 2, KEY_SEND),
648  KEY(3, 3, KEY_PLAYPAUSE),
649  KEY(3, 4, KEY_NUMERIC_1),
650  KEY(3, 5, KEY_SOUND), /* Music SoftKey */
651 
652  KEY(4, 0, KEY_NUMERIC_4),
653  KEY(4, 1, KEY_LEFT),
654  KEY(4, 2, KEY_NUMERIC_POUND),
655  KEY(4, 3, KEY_PREVIOUSSONG),
656  KEY(4, 4, KEY_NUMERIC_3),
657  KEY(4, 5, KEY_RESERVED),
658 };
659 
660 static struct pxa27x_keypad_platform_data e2_keypad_platform_data = {
661  .matrix_key_rows = 5,
662  .matrix_key_cols = 6,
663  .matrix_key_map = e2_key_map,
664  .matrix_key_map_size = ARRAY_SIZE(e2_key_map),
665 
666  .debounce_interval = 30,
667 };
668 #endif /* CONFIG_MACH_EZX_E2 */
669 
670 #ifdef CONFIG_MACH_EZX_A780
671 /* gpio_keys */
672 static struct gpio_keys_button a780_buttons[] = {
673  [0] = {
674  .code = SW_LID,
675  .gpio = GPIO12_A780_FLIP_LID,
676  .active_low = 0,
677  .desc = "A780 flip lid",
678  .type = EV_SW,
679  .wakeup = 1,
680  },
681 };
682 
683 static struct gpio_keys_platform_data a780_gpio_keys_platform_data = {
684  .buttons = a780_buttons,
685  .nbuttons = ARRAY_SIZE(a780_buttons),
686 };
687 
688 static struct platform_device a780_gpio_keys = {
689  .name = "gpio-keys",
690  .id = -1,
691  .dev = {
692  .platform_data = &a780_gpio_keys_platform_data,
693  },
694 };
695 
696 /* camera */
697 static int a780_camera_init(void)
698 {
699  int err;
700 
701  /*
702  * GPIO50_nCAM_EN is active low
703  * GPIO19_GEN1_CAM_RST is active on rising edge
704  */
705  err = gpio_request(GPIO50_nCAM_EN, "nCAM_EN");
706  if (err) {
707  pr_err("%s: Failed to request nCAM_EN\n", __func__);
708  goto fail;
709  }
710 
711  err = gpio_request(GPIO19_GEN1_CAM_RST, "CAM_RST");
712  if (err) {
713  pr_err("%s: Failed to request CAM_RST\n", __func__);
714  goto fail_gpio_cam_rst;
715  }
716 
719 
720  return 0;
721 
722 fail_gpio_cam_rst:
724 fail:
725  return err;
726 }
727 
728 static int a780_camera_power(struct device *dev, int on)
729 {
731  return 0;
732 }
733 
734 static int a780_camera_reset(struct device *dev)
735 {
737  msleep(10);
739 
740  return 0;
741 }
742 
743 struct pxacamera_platform_data a780_pxacamera_platform_data = {
746  .mclk_10khz = 5000,
747 };
748 
749 static struct i2c_board_info a780_camera_i2c_board_info = {
750  I2C_BOARD_INFO("mt9m111", 0x5d),
751 };
752 
753 static struct soc_camera_link a780_iclink = {
754  .bus_id = 0,
755  .flags = SOCAM_SENSOR_INVERT_PCLK,
756  .i2c_adapter_id = 0,
757  .board_info = &a780_camera_i2c_board_info,
758  .power = a780_camera_power,
759  .reset = a780_camera_reset,
760 };
761 
762 static struct platform_device a780_camera = {
763  .name = "soc-camera-pdrv",
764  .id = 0,
765  .dev = {
766  .platform_data = &a780_iclink,
767  },
768 };
769 
770 static struct platform_device *a780_devices[] __initdata = {
771  &a780_gpio_keys,
772 };
773 
774 static void __init a780_init(void)
775 {
776  pxa2xx_mfp_config(ARRAY_AND_SIZE(ezx_pin_config));
777  pxa2xx_mfp_config(ARRAY_AND_SIZE(gen1_pin_config));
778  pxa2xx_mfp_config(ARRAY_AND_SIZE(a780_pin_config));
779 
783 
785 
786  pxa_set_fb_info(NULL, &ezx_fb_info_1);
787 
788  pxa_set_keypad_info(&a780_keypad_platform_data);
789 
790  if (a780_camera_init() == 0) {
791  pxa_set_camera_info(&a780_pxacamera_platform_data);
792  platform_device_register(&a780_camera);
793  }
794 
795  platform_add_devices(ARRAY_AND_SIZE(ezx_devices));
796  platform_add_devices(ARRAY_AND_SIZE(a780_devices));
797 }
798 
799 MACHINE_START(EZX_A780, "Motorola EZX A780")
800  .atag_offset = 0x100,
801  .map_io = pxa27x_map_io,
802  .nr_irqs = EZX_NR_IRQS,
803  .init_irq = pxa27x_init_irq,
804  .handle_irq = pxa27x_handle_irq,
805  .timer = &pxa_timer,
806  .init_machine = a780_init,
807  .restart = pxa_restart,
809 #endif
810 
811 #ifdef CONFIG_MACH_EZX_E680
812 /* gpio_keys */
813 static struct gpio_keys_button e680_buttons[] = {
814  [0] = {
815  .code = KEY_SCREENLOCK,
816  .gpio = GPIO12_E680_LOCK_SWITCH,
817  .active_low = 0,
818  .desc = "E680 lock switch",
819  .type = EV_KEY,
820  .wakeup = 1,
821  },
822 };
823 
824 static struct gpio_keys_platform_data e680_gpio_keys_platform_data = {
825  .buttons = e680_buttons,
826  .nbuttons = ARRAY_SIZE(e680_buttons),
827 };
828 
829 static struct platform_device e680_gpio_keys = {
830  .name = "gpio-keys",
831  .id = -1,
832  .dev = {
833  .platform_data = &e680_gpio_keys_platform_data,
834  },
835 };
836 
837 static struct i2c_board_info __initdata e680_i2c_board_info[] = {
838  { I2C_BOARD_INFO("tea5767", 0x81) },
839 };
840 
841 static struct platform_device *e680_devices[] __initdata = {
842  &e680_gpio_keys,
843 };
844 
845 static void __init e680_init(void)
846 {
847  pxa2xx_mfp_config(ARRAY_AND_SIZE(ezx_pin_config));
848  pxa2xx_mfp_config(ARRAY_AND_SIZE(gen1_pin_config));
849  pxa2xx_mfp_config(ARRAY_AND_SIZE(e680_pin_config));
850 
854 
856  i2c_register_board_info(0, ARRAY_AND_SIZE(e680_i2c_board_info));
857 
858  pxa_set_fb_info(NULL, &ezx_fb_info_1);
859 
860  pxa_set_keypad_info(&e680_keypad_platform_data);
861 
862  platform_add_devices(ARRAY_AND_SIZE(ezx_devices));
863  platform_add_devices(ARRAY_AND_SIZE(e680_devices));
864 }
865 
866 MACHINE_START(EZX_E680, "Motorola EZX E680")
867  .atag_offset = 0x100,
868  .map_io = pxa27x_map_io,
869  .nr_irqs = EZX_NR_IRQS,
870  .init_irq = pxa27x_init_irq,
871  .handle_irq = pxa27x_handle_irq,
872  .timer = &pxa_timer,
873  .init_machine = e680_init,
874  .restart = pxa_restart,
876 #endif
877 
878 #ifdef CONFIG_MACH_EZX_A1200
879 /* gpio_keys */
880 static struct gpio_keys_button a1200_buttons[] = {
881  [0] = {
882  .code = SW_LID,
883  .gpio = GPIO15_A1200_FLIP_LID,
884  .active_low = 0,
885  .desc = "A1200 flip lid",
886  .type = EV_SW,
887  .wakeup = 1,
888  },
889 };
890 
891 static struct gpio_keys_platform_data a1200_gpio_keys_platform_data = {
892  .buttons = a1200_buttons,
893  .nbuttons = ARRAY_SIZE(a1200_buttons),
894 };
895 
896 static struct platform_device a1200_gpio_keys = {
897  .name = "gpio-keys",
898  .id = -1,
899  .dev = {
900  .platform_data = &a1200_gpio_keys_platform_data,
901  },
902 };
903 
904 static struct i2c_board_info __initdata a1200_i2c_board_info[] = {
905  { I2C_BOARD_INFO("tea5767", 0x81) },
906 };
907 
908 static struct platform_device *a1200_devices[] __initdata = {
909  &a1200_gpio_keys,
910 };
911 
912 static void __init a1200_init(void)
913 {
914  pxa2xx_mfp_config(ARRAY_AND_SIZE(ezx_pin_config));
915  pxa2xx_mfp_config(ARRAY_AND_SIZE(gen2_pin_config));
916  pxa2xx_mfp_config(ARRAY_AND_SIZE(a1200_pin_config));
917 
921 
923  i2c_register_board_info(0, ARRAY_AND_SIZE(a1200_i2c_board_info));
924 
925  pxa_set_fb_info(NULL, &ezx_fb_info_2);
926 
927  pxa_set_keypad_info(&a1200_keypad_platform_data);
928 
929  platform_add_devices(ARRAY_AND_SIZE(ezx_devices));
930  platform_add_devices(ARRAY_AND_SIZE(a1200_devices));
931 }
932 
933 MACHINE_START(EZX_A1200, "Motorola EZX A1200")
934  .atag_offset = 0x100,
935  .map_io = pxa27x_map_io,
936  .nr_irqs = EZX_NR_IRQS,
937  .init_irq = pxa27x_init_irq,
938  .handle_irq = pxa27x_handle_irq,
939  .timer = &pxa_timer,
940  .init_machine = a1200_init,
941  .restart = pxa_restart,
943 #endif
944 
945 #ifdef CONFIG_MACH_EZX_A910
946 /* gpio_keys */
947 static struct gpio_keys_button a910_buttons[] = {
948  [0] = {
949  .code = SW_LID,
950  .gpio = GPIO15_A910_FLIP_LID,
951  .active_low = 0,
952  .desc = "A910 flip lid",
953  .type = EV_SW,
954  .wakeup = 1,
955  },
956 };
957 
958 static struct gpio_keys_platform_data a910_gpio_keys_platform_data = {
959  .buttons = a910_buttons,
960  .nbuttons = ARRAY_SIZE(a910_buttons),
961 };
962 
963 static struct platform_device a910_gpio_keys = {
964  .name = "gpio-keys",
965  .id = -1,
966  .dev = {
967  .platform_data = &a910_gpio_keys_platform_data,
968  },
969 };
970 
971 /* camera */
972 static int a910_camera_init(void)
973 {
974  int err;
975 
976  /*
977  * GPIO50_nCAM_EN is active low
978  * GPIO28_GEN2_CAM_RST is active on rising edge
979  */
980  err = gpio_request(GPIO50_nCAM_EN, "nCAM_EN");
981  if (err) {
982  pr_err("%s: Failed to request nCAM_EN\n", __func__);
983  goto fail;
984  }
985 
986  err = gpio_request(GPIO28_GEN2_CAM_RST, "CAM_RST");
987  if (err) {
988  pr_err("%s: Failed to request CAM_RST\n", __func__);
989  goto fail_gpio_cam_rst;
990  }
991 
994 
995  return 0;
996 
997 fail_gpio_cam_rst:
999 fail:
1000  return err;
1001 }
1002 
1003 static int a910_camera_power(struct device *dev, int on)
1004 {
1006  return 0;
1007 }
1008 
1009 static int a910_camera_reset(struct device *dev)
1010 {
1012  msleep(10);
1014 
1015  return 0;
1016 }
1017 
1018 struct pxacamera_platform_data a910_pxacamera_platform_data = {
1021  .mclk_10khz = 5000,
1022 };
1023 
1024 static struct i2c_board_info a910_camera_i2c_board_info = {
1025  I2C_BOARD_INFO("mt9m111", 0x5d),
1026 };
1027 
1028 static struct soc_camera_link a910_iclink = {
1029  .bus_id = 0,
1030  .i2c_adapter_id = 0,
1031  .board_info = &a910_camera_i2c_board_info,
1032  .power = a910_camera_power,
1033  .reset = a910_camera_reset,
1034 };
1035 
1036 static struct platform_device a910_camera = {
1037  .name = "soc-camera-pdrv",
1038  .id = 0,
1039  .dev = {
1040  .platform_data = &a910_iclink,
1041  },
1042 };
1043 
1044 /* leds-lp3944 */
1045 static struct lp3944_platform_data a910_lp3944_leds = {
1047  .leds = {
1048  [0] = {
1049  .name = "a910:red:",
1050  .status = LP3944_LED_STATUS_OFF,
1051  .type = LP3944_LED_TYPE_LED,
1052  },
1053  [1] = {
1054  .name = "a910:green:",
1055  .status = LP3944_LED_STATUS_OFF,
1056  .type = LP3944_LED_TYPE_LED,
1057  },
1058  [2] {
1059  .name = "a910:blue:",
1060  .status = LP3944_LED_STATUS_OFF,
1061  .type = LP3944_LED_TYPE_LED,
1062  },
1063  /* Leds 3 and 4 are used as display power switches */
1064  [3] = {
1065  .name = "a910::cli_display",
1066  .status = LP3944_LED_STATUS_OFF,
1068  },
1069  [4] = {
1070  .name = "a910::main_display",
1071  .status = LP3944_LED_STATUS_ON,
1073  },
1074  [5] = { .type = LP3944_LED_TYPE_NONE },
1075  [6] = {
1076  .name = "a910::torch",
1077  .status = LP3944_LED_STATUS_OFF,
1078  .type = LP3944_LED_TYPE_LED,
1079  },
1080  [7] = {
1081  .name = "a910::flash",
1082  .status = LP3944_LED_STATUS_OFF,
1084  },
1085  },
1086 };
1087 
1088 static struct i2c_board_info __initdata a910_i2c_board_info[] = {
1089  {
1090  I2C_BOARD_INFO("lp3944", 0x60),
1091  .platform_data = &a910_lp3944_leds,
1092  },
1093 };
1094 
1095 static struct platform_device *a910_devices[] __initdata = {
1096  &a910_gpio_keys,
1097 };
1098 
1099 static void __init a910_init(void)
1100 {
1101  pxa2xx_mfp_config(ARRAY_AND_SIZE(ezx_pin_config));
1102  pxa2xx_mfp_config(ARRAY_AND_SIZE(gen2_pin_config));
1103  pxa2xx_mfp_config(ARRAY_AND_SIZE(a910_pin_config));
1104 
1108 
1110  i2c_register_board_info(0, ARRAY_AND_SIZE(a910_i2c_board_info));
1111 
1112  pxa_set_fb_info(NULL, &ezx_fb_info_2);
1113 
1114  pxa_set_keypad_info(&a910_keypad_platform_data);
1115 
1116  if (a910_camera_init() == 0) {
1117  pxa_set_camera_info(&a910_pxacamera_platform_data);
1118  platform_device_register(&a910_camera);
1119  }
1120 
1121  platform_add_devices(ARRAY_AND_SIZE(ezx_devices));
1122  platform_add_devices(ARRAY_AND_SIZE(a910_devices));
1123 }
1124 
1125 MACHINE_START(EZX_A910, "Motorola EZX A910")
1126  .atag_offset = 0x100,
1127  .map_io = pxa27x_map_io,
1128  .nr_irqs = EZX_NR_IRQS,
1129  .init_irq = pxa27x_init_irq,
1130  .handle_irq = pxa27x_handle_irq,
1131  .timer = &pxa_timer,
1132  .init_machine = a910_init,
1133  .restart = pxa_restart,
1135 #endif
1136 
1137 #ifdef CONFIG_MACH_EZX_E6
1138 /* gpio_keys */
1139 static struct gpio_keys_button e6_buttons[] = {
1140  [0] = {
1141  .code = KEY_SCREENLOCK,
1142  .gpio = GPIO15_E6_LOCK_SWITCH,
1143  .active_low = 0,
1144  .desc = "E6 lock switch",
1145  .type = EV_KEY,
1146  .wakeup = 1,
1147  },
1148 };
1149 
1150 static struct gpio_keys_platform_data e6_gpio_keys_platform_data = {
1151  .buttons = e6_buttons,
1152  .nbuttons = ARRAY_SIZE(e6_buttons),
1153 };
1154 
1155 static struct platform_device e6_gpio_keys = {
1156  .name = "gpio-keys",
1157  .id = -1,
1158  .dev = {
1159  .platform_data = &e6_gpio_keys_platform_data,
1160  },
1161 };
1162 
1163 static struct i2c_board_info __initdata e6_i2c_board_info[] = {
1164  { I2C_BOARD_INFO("tea5767", 0x81) },
1165 };
1166 
1167 static struct platform_device *e6_devices[] __initdata = {
1168  &e6_gpio_keys,
1169 };
1170 
1171 static void __init e6_init(void)
1172 {
1173  pxa2xx_mfp_config(ARRAY_AND_SIZE(ezx_pin_config));
1174  pxa2xx_mfp_config(ARRAY_AND_SIZE(gen2_pin_config));
1175  pxa2xx_mfp_config(ARRAY_AND_SIZE(e6_pin_config));
1176 
1180 
1182  i2c_register_board_info(0, ARRAY_AND_SIZE(e6_i2c_board_info));
1183 
1184  pxa_set_fb_info(NULL, &ezx_fb_info_2);
1185 
1186  pxa_set_keypad_info(&e6_keypad_platform_data);
1187 
1188  platform_add_devices(ARRAY_AND_SIZE(ezx_devices));
1189  platform_add_devices(ARRAY_AND_SIZE(e6_devices));
1190 }
1191 
1192 MACHINE_START(EZX_E6, "Motorola EZX E6")
1193  .atag_offset = 0x100,
1194  .map_io = pxa27x_map_io,
1195  .nr_irqs = EZX_NR_IRQS,
1196  .init_irq = pxa27x_init_irq,
1197  .handle_irq = pxa27x_handle_irq,
1198  .timer = &pxa_timer,
1199  .init_machine = e6_init,
1200  .restart = pxa_restart,
1202 #endif
1203 
1204 #ifdef CONFIG_MACH_EZX_E2
1205 static struct i2c_board_info __initdata e2_i2c_board_info[] = {
1206  { I2C_BOARD_INFO("tea5767", 0x81) },
1207 };
1208 
1209 static struct platform_device *e2_devices[] __initdata = {
1210 };
1211 
1212 static void __init e2_init(void)
1213 {
1214  pxa2xx_mfp_config(ARRAY_AND_SIZE(ezx_pin_config));
1215  pxa2xx_mfp_config(ARRAY_AND_SIZE(gen2_pin_config));
1216  pxa2xx_mfp_config(ARRAY_AND_SIZE(e2_pin_config));
1217 
1221 
1223  i2c_register_board_info(0, ARRAY_AND_SIZE(e2_i2c_board_info));
1224 
1225  pxa_set_fb_info(NULL, &ezx_fb_info_2);
1226 
1227  pxa_set_keypad_info(&e2_keypad_platform_data);
1228 
1229  platform_add_devices(ARRAY_AND_SIZE(ezx_devices));
1230  platform_add_devices(ARRAY_AND_SIZE(e2_devices));
1231 }
1232 
1233 MACHINE_START(EZX_E2, "Motorola EZX E2")
1234  .atag_offset = 0x100,
1235  .map_io = pxa27x_map_io,
1236  .nr_irqs = EZX_NR_IRQS,
1237  .init_irq = pxa27x_init_irq,
1238  .handle_irq = pxa27x_handle_irq,
1239  .timer = &pxa_timer,
1240  .init_machine = e2_init,
1241  .restart = pxa_restart,
1243 #endif