Linux Audio

Check our new training course

Linux debugging, profiling, tracing and performance analysis training

Mar 24-27, 2025, special US time zones
Register
Loading...
Note: File does not exist in v6.13.7.
   1/*
   2 *  ezx.c - Common code for the EZX platform.
   3 *
   4 *  Copyright (C) 2005-2006 Harald Welte <laforge@openezx.org>,
   5 *		  2007-2008 Daniel Ribeiro <drwyrm@gmail.com>,
   6 *		  2007-2008 Stefan Schmidt <stefan@datenfreihafen.org>
   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>
  32#include <linux/platform_data/video-pxafb.h>
  33#include <linux/platform_data/usb-ohci-pxa27x.h>
  34#include <mach/hardware.h>
  35#include <linux/platform_data/keypad-pxa27x.h>
  36#include <linux/platform_data/camera-pxa.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
  52static 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	.enable_gpio	= -1,
  58};
  59
  60static struct platform_device ezx_backlight_device = {
  61	.name		= "pwm-backlight",
  62	.dev		= {
  63		.parent	= &pxa27x_device_pwm0.dev,
  64		.platform_data = &ezx_backlight_data,
  65	},
  66};
  67
  68static struct pxafb_mode_info mode_ezx_old = {
  69	.pixclock		= 150000,
  70	.xres			= 240,
  71	.yres			= 320,
  72	.bpp			= 16,
  73	.hsync_len		= 10,
  74	.left_margin		= 20,
  75	.right_margin		= 10,
  76	.vsync_len		= 2,
  77	.upper_margin		= 3,
  78	.lower_margin		= 2,
  79	.sync			= 0,
  80};
  81
  82static struct pxafb_mach_info ezx_fb_info_1 = {
  83	.modes		= &mode_ezx_old,
  84	.num_modes	= 1,
  85	.lcd_conn	= LCD_COLOR_TFT_16BPP,
  86};
  87
  88static struct pxafb_mode_info mode_72r89803y01 = {
  89	.pixclock		= 192308,
  90	.xres			= 240,
  91	.yres			= 320,
  92	.bpp			= 32,
  93	.depth			= 18,
  94	.hsync_len		= 10,
  95	.left_margin		= 20,
  96	.right_margin		= 10,
  97	.vsync_len		= 2,
  98	.upper_margin		= 3,
  99	.lower_margin		= 2,
 100	.sync			= 0,
 101};
 102
 103static struct pxafb_mach_info ezx_fb_info_2 = {
 104	.modes		= &mode_72r89803y01,
 105	.num_modes	= 1,
 106	.lcd_conn	= LCD_COLOR_TFT_18BPP,
 107};
 108
 109static struct platform_device *ezx_devices[] __initdata = {
 110	&ezx_backlight_device,
 111};
 112
 113static unsigned long ezx_pin_config[] __initdata = {
 114	/* PWM backlight */
 115	GPIO16_PWM0_OUT,
 116
 117	/* BTUART */
 118	GPIO42_BTUART_RXD,
 119	GPIO43_BTUART_TXD,
 120	GPIO44_BTUART_CTS,
 121	GPIO45_BTUART_RTS,
 122
 123	/* I2C */
 124	GPIO117_I2C_SCL,
 125	GPIO118_I2C_SDA,
 126
 127	/* PCAP SSP */
 128	GPIO29_SSP1_SCLK,
 129	GPIO25_SSP1_TXD,
 130	GPIO26_SSP1_RXD,
 131	GPIO24_GPIO,				/* pcap chip select */
 132	GPIO1_GPIO | WAKEUP_ON_EDGE_RISE,	/* pcap interrupt */
 133	GPIO4_GPIO | MFP_LPM_DRIVE_HIGH,	/* WDI_AP */
 134	GPIO55_GPIO | MFP_LPM_DRIVE_HIGH,	/* SYS_RESTART */
 135
 136	/* MMC */
 137	GPIO32_MMC_CLK,
 138	GPIO92_MMC_DAT_0,
 139	GPIO109_MMC_DAT_1,
 140	GPIO110_MMC_DAT_2,
 141	GPIO111_MMC_DAT_3,
 142	GPIO112_MMC_CMD,
 143	GPIO11_GPIO,				/* mmc detect */
 144
 145	/* usb to external transceiver */
 146	GPIO34_USB_P2_2,
 147	GPIO35_USB_P2_1,
 148	GPIO36_USB_P2_4,
 149	GPIO39_USB_P2_6,
 150	GPIO40_USB_P2_5,
 151	GPIO53_USB_P2_3,
 152
 153	/* usb to Neptune GSM chip */
 154	GPIO30_USB_P3_2,
 155	GPIO31_USB_P3_6,
 156	GPIO90_USB_P3_5,
 157	GPIO91_USB_P3_1,
 158	GPIO56_USB_P3_4,
 159	GPIO113_USB_P3_3,
 160};
 161
 162#if defined(CONFIG_MACH_EZX_A780) || defined(CONFIG_MACH_EZX_E680)
 163static unsigned long gen1_pin_config[] __initdata = {
 164	/* flip / lockswitch */
 165	GPIO12_GPIO | WAKEUP_ON_EDGE_BOTH,
 166
 167	/* bluetooth (bcm2035) */
 168	GPIO14_GPIO | WAKEUP_ON_EDGE_RISE,	/* HOSTWAKE */
 169	GPIO48_GPIO,				/* RESET */
 170	GPIO28_GPIO,				/* WAKEUP */
 171
 172	/* Neptune handshake */
 173	GPIO0_GPIO | WAKEUP_ON_EDGE_FALL,	/* BP_RDY */
 174	GPIO57_GPIO | MFP_LPM_DRIVE_HIGH,	/* AP_RDY */
 175	GPIO13_GPIO | WAKEUP_ON_EDGE_BOTH,	/* WDI */
 176	GPIO3_GPIO | WAKEUP_ON_EDGE_BOTH,	/* WDI2 */
 177	GPIO82_GPIO | MFP_LPM_DRIVE_HIGH,	/* RESET */
 178	GPIO99_GPIO | MFP_LPM_DRIVE_HIGH,	/* TC_MM_EN */
 179
 180	/* sound */
 181	GPIO52_SSP3_SCLK,
 182	GPIO83_SSP3_SFRM,
 183	GPIO81_SSP3_TXD,
 184	GPIO89_SSP3_RXD,
 185
 186	/* ssp2 pins to in */
 187	GPIO22_GPIO,				/* SSP2_SCLK */
 188	GPIO37_GPIO,				/* SSP2_SFRM */
 189	GPIO38_GPIO,				/* SSP2_TXD */
 190	GPIO88_GPIO,				/* SSP2_RXD */
 191
 192	/* camera */
 193	GPIO23_CIF_MCLK,
 194	GPIO54_CIF_PCLK,
 195	GPIO85_CIF_LV,
 196	GPIO84_CIF_FV,
 197	GPIO27_CIF_DD_0,
 198	GPIO114_CIF_DD_1,
 199	GPIO51_CIF_DD_2,
 200	GPIO115_CIF_DD_3,
 201	GPIO95_CIF_DD_4,
 202	GPIO94_CIF_DD_5,
 203	GPIO17_CIF_DD_6,
 204	GPIO108_CIF_DD_7,
 205	GPIO50_GPIO | MFP_LPM_DRIVE_HIGH,	/* CAM_EN */
 206	GPIO19_GPIO | MFP_LPM_DRIVE_HIGH,	/* CAM_RST */
 207
 208	/* EMU */
 209	GPIO120_GPIO,				/* EMU_MUX1 */
 210	GPIO119_GPIO,				/* EMU_MUX2 */
 211	GPIO86_GPIO,				/* SNP_INT_CTL */
 212	GPIO87_GPIO,				/* SNP_INT_IN */
 213};
 214#endif
 215
 216#if defined(CONFIG_MACH_EZX_A1200) || defined(CONFIG_MACH_EZX_A910) || \
 217	defined(CONFIG_MACH_EZX_E2) || defined(CONFIG_MACH_EZX_E6)
 218static unsigned long gen2_pin_config[] __initdata = {
 219	/* flip / lockswitch */
 220	GPIO15_GPIO | WAKEUP_ON_EDGE_BOTH,
 221
 222	/* EOC */
 223	GPIO10_GPIO | WAKEUP_ON_EDGE_RISE,
 224
 225	/* bluetooth (bcm2045) */
 226	GPIO13_GPIO | WAKEUP_ON_EDGE_RISE,	/* HOSTWAKE */
 227	GPIO37_GPIO,				/* RESET */
 228	GPIO57_GPIO,				/* WAKEUP */
 229
 230	/* Neptune handshake */
 231	GPIO0_GPIO | WAKEUP_ON_EDGE_FALL,	/* BP_RDY */
 232	GPIO96_GPIO | MFP_LPM_DRIVE_HIGH,	/* AP_RDY */
 233	GPIO3_GPIO | WAKEUP_ON_EDGE_FALL,	/* WDI */
 234	GPIO116_GPIO | MFP_LPM_DRIVE_HIGH,	/* RESET */
 235	GPIO41_GPIO,				/* BP_FLASH */
 236
 237	/* sound */
 238	GPIO52_SSP3_SCLK,
 239	GPIO83_SSP3_SFRM,
 240	GPIO81_SSP3_TXD,
 241	GPIO82_SSP3_RXD,
 242
 243	/* ssp2 pins to in */
 244	GPIO22_GPIO,				/* SSP2_SCLK */
 245	GPIO14_GPIO,				/* SSP2_SFRM */
 246	GPIO38_GPIO,				/* SSP2_TXD */
 247	GPIO88_GPIO,				/* SSP2_RXD */
 248
 249	/* camera */
 250	GPIO23_CIF_MCLK,
 251	GPIO54_CIF_PCLK,
 252	GPIO85_CIF_LV,
 253	GPIO84_CIF_FV,
 254	GPIO27_CIF_DD_0,
 255	GPIO114_CIF_DD_1,
 256	GPIO51_CIF_DD_2,
 257	GPIO115_CIF_DD_3,
 258	GPIO95_CIF_DD_4,
 259	GPIO48_CIF_DD_5,
 260	GPIO93_CIF_DD_6,
 261	GPIO12_CIF_DD_7,
 262	GPIO50_GPIO | MFP_LPM_DRIVE_HIGH,	/* CAM_EN */
 263	GPIO28_GPIO | MFP_LPM_DRIVE_HIGH,	/* CAM_RST */
 264	GPIO17_GPIO,				/* CAM_FLASH */
 265};
 266#endif
 267
 268#ifdef CONFIG_MACH_EZX_A780
 269static unsigned long a780_pin_config[] __initdata = {
 270	/* keypad */
 271	GPIO93_KP_DKIN_0 | WAKEUP_ON_LEVEL_HIGH,
 272	GPIO100_KP_MKIN_0 | WAKEUP_ON_LEVEL_HIGH,
 273	GPIO101_KP_MKIN_1 | WAKEUP_ON_LEVEL_HIGH,
 274	GPIO102_KP_MKIN_2 | WAKEUP_ON_LEVEL_HIGH,
 275	GPIO97_KP_MKIN_3 | WAKEUP_ON_LEVEL_HIGH,
 276	GPIO98_KP_MKIN_4 | WAKEUP_ON_LEVEL_HIGH,
 277	GPIO103_KP_MKOUT_0,
 278	GPIO104_KP_MKOUT_1,
 279	GPIO105_KP_MKOUT_2,
 280	GPIO106_KP_MKOUT_3,
 281	GPIO107_KP_MKOUT_4,
 282
 283	/* attenuate sound */
 284	GPIO96_GPIO,
 285};
 286#endif
 287
 288#ifdef CONFIG_MACH_EZX_E680
 289static unsigned long e680_pin_config[] __initdata = {
 290	/* keypad */
 291	GPIO93_KP_DKIN_0 | WAKEUP_ON_LEVEL_HIGH,
 292	GPIO96_KP_DKIN_3 | WAKEUP_ON_LEVEL_HIGH,
 293	GPIO97_KP_DKIN_4 | WAKEUP_ON_LEVEL_HIGH,
 294	GPIO98_KP_DKIN_5 | WAKEUP_ON_LEVEL_HIGH,
 295	GPIO100_KP_MKIN_0 | WAKEUP_ON_LEVEL_HIGH,
 296	GPIO101_KP_MKIN_1 | WAKEUP_ON_LEVEL_HIGH,
 297	GPIO102_KP_MKIN_2 | WAKEUP_ON_LEVEL_HIGH,
 298	GPIO103_KP_MKOUT_0,
 299	GPIO104_KP_MKOUT_1,
 300	GPIO105_KP_MKOUT_2,
 301	GPIO106_KP_MKOUT_3,
 302
 303	/* MIDI */
 304	GPIO79_GPIO,				/* VA_SEL_BUL */
 305	GPIO80_GPIO,				/* FLT_SEL_BUL */
 306	GPIO78_GPIO,				/* MIDI_RESET */
 307	GPIO33_GPIO,				/* MIDI_CS */
 308	GPIO15_GPIO,				/* MIDI_IRQ */
 309	GPIO49_GPIO,				/* MIDI_NPWE */
 310	GPIO18_GPIO,				/* MIDI_RDY */
 311
 312	/* leds */
 313	GPIO46_GPIO,
 314	GPIO47_GPIO,
 315};
 316#endif
 317
 318#ifdef CONFIG_MACH_EZX_A1200
 319static unsigned long a1200_pin_config[] __initdata = {
 320	/* keypad */
 321	GPIO100_KP_MKIN_0 | WAKEUP_ON_LEVEL_HIGH,
 322	GPIO101_KP_MKIN_1 | WAKEUP_ON_LEVEL_HIGH,
 323	GPIO102_KP_MKIN_2 | WAKEUP_ON_LEVEL_HIGH,
 324	GPIO97_KP_MKIN_3 | WAKEUP_ON_LEVEL_HIGH,
 325	GPIO98_KP_MKIN_4 | WAKEUP_ON_LEVEL_HIGH,
 326	GPIO103_KP_MKOUT_0,
 327	GPIO104_KP_MKOUT_1,
 328	GPIO105_KP_MKOUT_2,
 329	GPIO106_KP_MKOUT_3,
 330	GPIO107_KP_MKOUT_4,
 331	GPIO108_KP_MKOUT_5,
 332};
 333#endif
 334
 335#ifdef CONFIG_MACH_EZX_A910
 336static unsigned long a910_pin_config[] __initdata = {
 337	/* keypad */
 338	GPIO100_KP_MKIN_0 | WAKEUP_ON_LEVEL_HIGH,
 339	GPIO101_KP_MKIN_1 | WAKEUP_ON_LEVEL_HIGH,
 340	GPIO102_KP_MKIN_2 | WAKEUP_ON_LEVEL_HIGH,
 341	GPIO97_KP_MKIN_3 | WAKEUP_ON_LEVEL_HIGH,
 342	GPIO98_KP_MKIN_4 | WAKEUP_ON_LEVEL_HIGH,
 343	GPIO103_KP_MKOUT_0,
 344	GPIO104_KP_MKOUT_1,
 345	GPIO105_KP_MKOUT_2,
 346	GPIO106_KP_MKOUT_3,
 347	GPIO107_KP_MKOUT_4,
 348	GPIO108_KP_MKOUT_5,
 349
 350	/* WLAN */
 351	GPIO89_GPIO,				/* RESET */
 352	GPIO33_GPIO,				/* WAKEUP */
 353	GPIO94_GPIO | WAKEUP_ON_LEVEL_HIGH,	/* HOSTWAKE */
 354
 355	/* MMC CS */
 356	GPIO20_GPIO,
 357};
 358#endif
 359
 360#ifdef CONFIG_MACH_EZX_E2
 361static unsigned long e2_pin_config[] __initdata = {
 362	/* keypad */
 363	GPIO100_KP_MKIN_0 | WAKEUP_ON_LEVEL_HIGH,
 364	GPIO101_KP_MKIN_1 | WAKEUP_ON_LEVEL_HIGH,
 365	GPIO102_KP_MKIN_2 | WAKEUP_ON_LEVEL_HIGH,
 366	GPIO97_KP_MKIN_3 | WAKEUP_ON_LEVEL_HIGH,
 367	GPIO98_KP_MKIN_4 | WAKEUP_ON_LEVEL_HIGH,
 368	GPIO103_KP_MKOUT_0,
 369	GPIO104_KP_MKOUT_1,
 370	GPIO105_KP_MKOUT_2,
 371	GPIO106_KP_MKOUT_3,
 372	GPIO107_KP_MKOUT_4,
 373	GPIO108_KP_MKOUT_5,
 374};
 375#endif
 376
 377#ifdef CONFIG_MACH_EZX_E6
 378static unsigned long e6_pin_config[] __initdata = {
 379	/* keypad */
 380	GPIO100_KP_MKIN_0 | WAKEUP_ON_LEVEL_HIGH,
 381	GPIO101_KP_MKIN_1 | WAKEUP_ON_LEVEL_HIGH,
 382	GPIO102_KP_MKIN_2 | WAKEUP_ON_LEVEL_HIGH,
 383	GPIO97_KP_MKIN_3 | WAKEUP_ON_LEVEL_HIGH,
 384	GPIO98_KP_MKIN_4 | WAKEUP_ON_LEVEL_HIGH,
 385	GPIO103_KP_MKOUT_0,
 386	GPIO104_KP_MKOUT_1,
 387	GPIO105_KP_MKOUT_2,
 388	GPIO106_KP_MKOUT_3,
 389	GPIO107_KP_MKOUT_4,
 390	GPIO108_KP_MKOUT_5,
 391};
 392#endif
 393
 394/* KEYPAD */
 395#ifdef CONFIG_MACH_EZX_A780
 396static const unsigned int a780_key_map[] = {
 397	KEY(0, 0, KEY_SEND),
 398	KEY(0, 1, KEY_BACK),
 399	KEY(0, 2, KEY_END),
 400	KEY(0, 3, KEY_PAGEUP),
 401	KEY(0, 4, KEY_UP),
 402
 403	KEY(1, 0, KEY_NUMERIC_1),
 404	KEY(1, 1, KEY_NUMERIC_2),
 405	KEY(1, 2, KEY_NUMERIC_3),
 406	KEY(1, 3, KEY_SELECT),
 407	KEY(1, 4, KEY_KPENTER),
 408
 409	KEY(2, 0, KEY_NUMERIC_4),
 410	KEY(2, 1, KEY_NUMERIC_5),
 411	KEY(2, 2, KEY_NUMERIC_6),
 412	KEY(2, 3, KEY_RECORD),
 413	KEY(2, 4, KEY_LEFT),
 414
 415	KEY(3, 0, KEY_NUMERIC_7),
 416	KEY(3, 1, KEY_NUMERIC_8),
 417	KEY(3, 2, KEY_NUMERIC_9),
 418	KEY(3, 3, KEY_HOME),
 419	KEY(3, 4, KEY_RIGHT),
 420
 421	KEY(4, 0, KEY_NUMERIC_STAR),
 422	KEY(4, 1, KEY_NUMERIC_0),
 423	KEY(4, 2, KEY_NUMERIC_POUND),
 424	KEY(4, 3, KEY_PAGEDOWN),
 425	KEY(4, 4, KEY_DOWN),
 426};
 427
 428static struct matrix_keymap_data a780_matrix_keymap_data = {
 429	.keymap			= a780_key_map,
 430	.keymap_size		= ARRAY_SIZE(a780_key_map),
 431};
 432
 433static struct pxa27x_keypad_platform_data a780_keypad_platform_data = {
 434	.matrix_key_rows = 5,
 435	.matrix_key_cols = 5,
 436	.matrix_keymap_data = &a780_matrix_keymap_data,
 437
 438	.direct_key_map = { KEY_CAMERA },
 439	.direct_key_num = 1,
 440
 441	.debounce_interval = 30,
 442};
 443#endif /* CONFIG_MACH_EZX_A780 */
 444
 445#ifdef CONFIG_MACH_EZX_E680
 446static const unsigned int e680_key_map[] = {
 447	KEY(0, 0, KEY_UP),
 448	KEY(0, 1, KEY_RIGHT),
 449	KEY(0, 2, KEY_RESERVED),
 450	KEY(0, 3, KEY_SEND),
 451
 452	KEY(1, 0, KEY_DOWN),
 453	KEY(1, 1, KEY_LEFT),
 454	KEY(1, 2, KEY_PAGEUP),
 455	KEY(1, 3, KEY_PAGEDOWN),
 456
 457	KEY(2, 0, KEY_RESERVED),
 458	KEY(2, 1, KEY_RESERVED),
 459	KEY(2, 2, KEY_RESERVED),
 460	KEY(2, 3, KEY_KPENTER),
 461};
 462
 463static struct matrix_keymap_data e680_matrix_keymap_data = {
 464	.keymap			= e680_key_map,
 465	.keymap_size		= ARRAY_SIZE(e680_key_map),
 466};
 467
 468static struct pxa27x_keypad_platform_data e680_keypad_platform_data = {
 469	.matrix_key_rows = 3,
 470	.matrix_key_cols = 4,
 471	.matrix_keymap_data = &e680_matrix_keymap_data,
 472
 473	.direct_key_map = {
 474		KEY_CAMERA,
 475		KEY_RESERVED,
 476		KEY_RESERVED,
 477		KEY_F1,
 478		KEY_CANCEL,
 479		KEY_F2,
 480	},
 481	.direct_key_num = 6,
 482
 483	.debounce_interval = 30,
 484};
 485#endif /* CONFIG_MACH_EZX_E680 */
 486
 487#ifdef CONFIG_MACH_EZX_A1200
 488static const unsigned int a1200_key_map[] = {
 489	KEY(0, 0, KEY_RESERVED),
 490	KEY(0, 1, KEY_RIGHT),
 491	KEY(0, 2, KEY_PAGEDOWN),
 492	KEY(0, 3, KEY_RESERVED),
 493	KEY(0, 4, KEY_RESERVED),
 494	KEY(0, 5, KEY_RESERVED),
 495
 496	KEY(1, 0, KEY_RESERVED),
 497	KEY(1, 1, KEY_DOWN),
 498	KEY(1, 2, KEY_CAMERA),
 499	KEY(1, 3, KEY_RESERVED),
 500	KEY(1, 4, KEY_RESERVED),
 501	KEY(1, 5, KEY_RESERVED),
 502
 503	KEY(2, 0, KEY_RESERVED),
 504	KEY(2, 1, KEY_KPENTER),
 505	KEY(2, 2, KEY_RECORD),
 506	KEY(2, 3, KEY_RESERVED),
 507	KEY(2, 4, KEY_RESERVED),
 508	KEY(2, 5, KEY_SELECT),
 509
 510	KEY(3, 0, KEY_RESERVED),
 511	KEY(3, 1, KEY_UP),
 512	KEY(3, 2, KEY_SEND),
 513	KEY(3, 3, KEY_RESERVED),
 514	KEY(3, 4, KEY_RESERVED),
 515	KEY(3, 5, KEY_RESERVED),
 516
 517	KEY(4, 0, KEY_RESERVED),
 518	KEY(4, 1, KEY_LEFT),
 519	KEY(4, 2, KEY_PAGEUP),
 520	KEY(4, 3, KEY_RESERVED),
 521	KEY(4, 4, KEY_RESERVED),
 522	KEY(4, 5, KEY_RESERVED),
 523};
 524
 525static struct matrix_keymap_data a1200_matrix_keymap_data = {
 526	.keymap			= a1200_key_map,
 527	.keymap_size		= ARRAY_SIZE(a1200_key_map),
 528};
 529
 530static struct pxa27x_keypad_platform_data a1200_keypad_platform_data = {
 531	.matrix_key_rows = 5,
 532	.matrix_key_cols = 6,
 533	.matrix_keymap_data = &a1200_matrix_keymap_data,
 534
 535	.debounce_interval = 30,
 536};
 537#endif /* CONFIG_MACH_EZX_A1200 */
 538
 539#ifdef CONFIG_MACH_EZX_E6
 540static const unsigned int e6_key_map[] = {
 541	KEY(0, 0, KEY_RESERVED),
 542	KEY(0, 1, KEY_RIGHT),
 543	KEY(0, 2, KEY_PAGEDOWN),
 544	KEY(0, 3, KEY_RESERVED),
 545	KEY(0, 4, KEY_RESERVED),
 546	KEY(0, 5, KEY_NEXTSONG),
 547
 548	KEY(1, 0, KEY_RESERVED),
 549	KEY(1, 1, KEY_DOWN),
 550	KEY(1, 2, KEY_PROG1),
 551	KEY(1, 3, KEY_RESERVED),
 552	KEY(1, 4, KEY_RESERVED),
 553	KEY(1, 5, KEY_RESERVED),
 554
 555	KEY(2, 0, KEY_RESERVED),
 556	KEY(2, 1, KEY_ENTER),
 557	KEY(2, 2, KEY_CAMERA),
 558	KEY(2, 3, KEY_RESERVED),
 559	KEY(2, 4, KEY_RESERVED),
 560	KEY(2, 5, KEY_WWW),
 561
 562	KEY(3, 0, KEY_RESERVED),
 563	KEY(3, 1, KEY_UP),
 564	KEY(3, 2, KEY_SEND),
 565	KEY(3, 3, KEY_RESERVED),
 566	KEY(3, 4, KEY_RESERVED),
 567	KEY(3, 5, KEY_PLAYPAUSE),
 568
 569	KEY(4, 0, KEY_RESERVED),
 570	KEY(4, 1, KEY_LEFT),
 571	KEY(4, 2, KEY_PAGEUP),
 572	KEY(4, 3, KEY_RESERVED),
 573	KEY(4, 4, KEY_RESERVED),
 574	KEY(4, 5, KEY_PREVIOUSSONG),
 575};
 576
 577static struct matrix_keymap_data e6_keymap_data = {
 578	.keymap			= e6_key_map,
 579	.keymap_size		= ARRAY_SIZE(e6_key_map),
 580};
 581
 582static struct pxa27x_keypad_platform_data e6_keypad_platform_data = {
 583	.matrix_key_rows = 5,
 584	.matrix_key_cols = 6,
 585	.matrix_keymap_data = &e6_keymap_data,
 586
 587	.debounce_interval = 30,
 588};
 589#endif /* CONFIG_MACH_EZX_E6 */
 590
 591#ifdef CONFIG_MACH_EZX_A910
 592static const unsigned int a910_key_map[] = {
 593	KEY(0, 0, KEY_NUMERIC_6),
 594	KEY(0, 1, KEY_RIGHT),
 595	KEY(0, 2, KEY_PAGEDOWN),
 596	KEY(0, 3, KEY_KPENTER),
 597	KEY(0, 4, KEY_NUMERIC_5),
 598	KEY(0, 5, KEY_CAMERA),
 599
 600	KEY(1, 0, KEY_NUMERIC_8),
 601	KEY(1, 1, KEY_DOWN),
 602	KEY(1, 2, KEY_RESERVED),
 603	KEY(1, 3, KEY_F1), /* Left SoftKey */
 604	KEY(1, 4, KEY_NUMERIC_STAR),
 605	KEY(1, 5, KEY_RESERVED),
 606
 607	KEY(2, 0, KEY_NUMERIC_7),
 608	KEY(2, 1, KEY_NUMERIC_9),
 609	KEY(2, 2, KEY_RECORD),
 610	KEY(2, 3, KEY_F2), /* Right SoftKey */
 611	KEY(2, 4, KEY_BACK),
 612	KEY(2, 5, KEY_SELECT),
 613
 614	KEY(3, 0, KEY_NUMERIC_2),
 615	KEY(3, 1, KEY_UP),
 616	KEY(3, 2, KEY_SEND),
 617	KEY(3, 3, KEY_NUMERIC_0),
 618	KEY(3, 4, KEY_NUMERIC_1),
 619	KEY(3, 5, KEY_RECORD),
 620
 621	KEY(4, 0, KEY_NUMERIC_4),
 622	KEY(4, 1, KEY_LEFT),
 623	KEY(4, 2, KEY_PAGEUP),
 624	KEY(4, 3, KEY_NUMERIC_POUND),
 625	KEY(4, 4, KEY_NUMERIC_3),
 626	KEY(4, 5, KEY_RESERVED),
 627};
 628
 629static struct matrix_keymap_data a910_matrix_keymap_data = {
 630	.keymap			= a910_key_map,
 631	.keymap_size		= ARRAY_SIZE(a910_key_map),
 632};
 633
 634static struct pxa27x_keypad_platform_data a910_keypad_platform_data = {
 635	.matrix_key_rows = 5,
 636	.matrix_key_cols = 6,
 637	.matrix_keymap_data = &a910_matrix_keymap_data,
 638
 639	.debounce_interval = 30,
 640};
 641#endif /* CONFIG_MACH_EZX_A910 */
 642
 643#ifdef CONFIG_MACH_EZX_E2
 644static const unsigned int e2_key_map[] = {
 645	KEY(0, 0, KEY_NUMERIC_6),
 646	KEY(0, 1, KEY_RIGHT),
 647	KEY(0, 2, KEY_NUMERIC_9),
 648	KEY(0, 3, KEY_NEXTSONG),
 649	KEY(0, 4, KEY_NUMERIC_5),
 650	KEY(0, 5, KEY_F1), /* Left SoftKey */
 651
 652	KEY(1, 0, KEY_NUMERIC_8),
 653	KEY(1, 1, KEY_DOWN),
 654	KEY(1, 2, KEY_RESERVED),
 655	KEY(1, 3, KEY_PAGEUP),
 656	KEY(1, 4, KEY_NUMERIC_STAR),
 657	KEY(1, 5, KEY_F2), /* Right SoftKey */
 658
 659	KEY(2, 0, KEY_NUMERIC_7),
 660	KEY(2, 1, KEY_KPENTER),
 661	KEY(2, 2, KEY_RECORD),
 662	KEY(2, 3, KEY_PAGEDOWN),
 663	KEY(2, 4, KEY_BACK),
 664	KEY(2, 5, KEY_NUMERIC_0),
 665
 666	KEY(3, 0, KEY_NUMERIC_2),
 667	KEY(3, 1, KEY_UP),
 668	KEY(3, 2, KEY_SEND),
 669	KEY(3, 3, KEY_PLAYPAUSE),
 670	KEY(3, 4, KEY_NUMERIC_1),
 671	KEY(3, 5, KEY_SOUND), /* Music SoftKey */
 672
 673	KEY(4, 0, KEY_NUMERIC_4),
 674	KEY(4, 1, KEY_LEFT),
 675	KEY(4, 2, KEY_NUMERIC_POUND),
 676	KEY(4, 3, KEY_PREVIOUSSONG),
 677	KEY(4, 4, KEY_NUMERIC_3),
 678	KEY(4, 5, KEY_RESERVED),
 679};
 680
 681static struct matrix_keymap_data e2_matrix_keymap_data = {
 682	.keymap			= e2_key_map,
 683	.keymap_size		= ARRAY_SIZE(e2_key_map),
 684};
 685
 686static struct pxa27x_keypad_platform_data e2_keypad_platform_data = {
 687	.matrix_key_rows = 5,
 688	.matrix_key_cols = 6,
 689	.matrix_keymap_data = &e2_matrix_keymap_data,
 690
 691	.debounce_interval = 30,
 692};
 693#endif /* CONFIG_MACH_EZX_E2 */
 694
 695#ifdef CONFIG_MACH_EZX_A780
 696/* gpio_keys */
 697static struct gpio_keys_button a780_buttons[] = {
 698	[0] = {
 699		.code       = SW_LID,
 700		.gpio       = GPIO12_A780_FLIP_LID,
 701		.active_low = 0,
 702		.desc       = "A780 flip lid",
 703		.type       = EV_SW,
 704		.wakeup     = 1,
 705	},
 706};
 707
 708static struct gpio_keys_platform_data a780_gpio_keys_platform_data = {
 709	.buttons  = a780_buttons,
 710	.nbuttons = ARRAY_SIZE(a780_buttons),
 711};
 712
 713static struct platform_device a780_gpio_keys = {
 714	.name = "gpio-keys",
 715	.id   = -1,
 716	.dev  = {
 717		.platform_data = &a780_gpio_keys_platform_data,
 718	},
 719};
 720
 721/* camera */
 722static int a780_camera_init(void)
 723{
 724	int err;
 725
 726	/*
 727	 * GPIO50_nCAM_EN is active low
 728	 * GPIO19_GEN1_CAM_RST is active on rising edge
 729	 */
 730	err = gpio_request(GPIO50_nCAM_EN, "nCAM_EN");
 731	if (err) {
 732		pr_err("%s: Failed to request nCAM_EN\n", __func__);
 733		goto fail;
 734	}
 735
 736	err = gpio_request(GPIO19_GEN1_CAM_RST, "CAM_RST");
 737	if (err) {
 738		pr_err("%s: Failed to request CAM_RST\n", __func__);
 739		goto fail_gpio_cam_rst;
 740	}
 741
 742	gpio_direction_output(GPIO50_nCAM_EN, 1);
 743	gpio_direction_output(GPIO19_GEN1_CAM_RST, 0);
 744
 745	return 0;
 746
 747fail_gpio_cam_rst:
 748	gpio_free(GPIO50_nCAM_EN);
 749fail:
 750	return err;
 751}
 752
 753static int a780_camera_power(struct device *dev, int on)
 754{
 755	gpio_set_value(GPIO50_nCAM_EN, !on);
 756	return 0;
 757}
 758
 759static int a780_camera_reset(struct device *dev)
 760{
 761	gpio_set_value(GPIO19_GEN1_CAM_RST, 0);
 762	msleep(10);
 763	gpio_set_value(GPIO19_GEN1_CAM_RST, 1);
 764
 765	return 0;
 766}
 767
 768struct pxacamera_platform_data a780_pxacamera_platform_data = {
 769	.flags  = PXA_CAMERA_MASTER | PXA_CAMERA_DATAWIDTH_8 |
 770		PXA_CAMERA_PCLK_EN | PXA_CAMERA_MCLK_EN,
 771	.mclk_10khz = 5000,
 772};
 773
 774static struct i2c_board_info a780_camera_i2c_board_info = {
 775	I2C_BOARD_INFO("mt9m111", 0x5d),
 776};
 777
 778static struct soc_camera_link a780_iclink = {
 779	.bus_id         = 0,
 780	.flags          = SOCAM_SENSOR_INVERT_PCLK,
 781	.i2c_adapter_id = 0,
 782	.board_info     = &a780_camera_i2c_board_info,
 783	.power          = a780_camera_power,
 784	.reset          = a780_camera_reset,
 785};
 786
 787static struct platform_device a780_camera = {
 788	.name   = "soc-camera-pdrv",
 789	.id     = 0,
 790	.dev    = {
 791		.platform_data = &a780_iclink,
 792	},
 793};
 794
 795static struct platform_device *a780_devices[] __initdata = {
 796	&a780_gpio_keys,
 797};
 798
 799static void __init a780_init(void)
 800{
 801	pxa2xx_mfp_config(ARRAY_AND_SIZE(ezx_pin_config));
 802	pxa2xx_mfp_config(ARRAY_AND_SIZE(gen1_pin_config));
 803	pxa2xx_mfp_config(ARRAY_AND_SIZE(a780_pin_config));
 804
 805	pxa_set_ffuart_info(NULL);
 806	pxa_set_btuart_info(NULL);
 807	pxa_set_stuart_info(NULL);
 808
 809	pxa_set_i2c_info(NULL);
 810
 811	pxa_set_fb_info(NULL, &ezx_fb_info_1);
 812
 813	pxa_set_keypad_info(&a780_keypad_platform_data);
 814
 815	if (a780_camera_init() == 0) {
 816		pxa_set_camera_info(&a780_pxacamera_platform_data);
 817		platform_device_register(&a780_camera);
 818	}
 819
 820	platform_add_devices(ARRAY_AND_SIZE(ezx_devices));
 821	platform_add_devices(ARRAY_AND_SIZE(a780_devices));
 822}
 823
 824MACHINE_START(EZX_A780, "Motorola EZX A780")
 825	.atag_offset    = 0x100,
 826	.map_io         = pxa27x_map_io,
 827	.nr_irqs	= EZX_NR_IRQS,
 828	.init_irq       = pxa27x_init_irq,
 829	.handle_irq       = pxa27x_handle_irq,
 830	.init_time	= pxa_timer_init,
 831	.init_machine   = a780_init,
 832	.restart	= pxa_restart,
 833MACHINE_END
 834#endif
 835
 836#ifdef CONFIG_MACH_EZX_E680
 837/* gpio_keys */
 838static struct gpio_keys_button e680_buttons[] = {
 839	[0] = {
 840		.code       = KEY_SCREENLOCK,
 841		.gpio       = GPIO12_E680_LOCK_SWITCH,
 842		.active_low = 0,
 843		.desc       = "E680 lock switch",
 844		.type       = EV_KEY,
 845		.wakeup     = 1,
 846	},
 847};
 848
 849static struct gpio_keys_platform_data e680_gpio_keys_platform_data = {
 850	.buttons  = e680_buttons,
 851	.nbuttons = ARRAY_SIZE(e680_buttons),
 852};
 853
 854static struct platform_device e680_gpio_keys = {
 855	.name = "gpio-keys",
 856	.id   = -1,
 857	.dev  = {
 858		.platform_data = &e680_gpio_keys_platform_data,
 859	},
 860};
 861
 862static struct i2c_board_info __initdata e680_i2c_board_info[] = {
 863	{ I2C_BOARD_INFO("tea5767", 0x81) },
 864};
 865
 866static struct platform_device *e680_devices[] __initdata = {
 867	&e680_gpio_keys,
 868};
 869
 870static void __init e680_init(void)
 871{
 872	pxa2xx_mfp_config(ARRAY_AND_SIZE(ezx_pin_config));
 873	pxa2xx_mfp_config(ARRAY_AND_SIZE(gen1_pin_config));
 874	pxa2xx_mfp_config(ARRAY_AND_SIZE(e680_pin_config));
 875
 876	pxa_set_ffuart_info(NULL);
 877	pxa_set_btuart_info(NULL);
 878	pxa_set_stuart_info(NULL);
 879
 880	pxa_set_i2c_info(NULL);
 881	i2c_register_board_info(0, ARRAY_AND_SIZE(e680_i2c_board_info));
 882
 883	pxa_set_fb_info(NULL, &ezx_fb_info_1);
 884
 885	pxa_set_keypad_info(&e680_keypad_platform_data);
 886
 887	platform_add_devices(ARRAY_AND_SIZE(ezx_devices));
 888	platform_add_devices(ARRAY_AND_SIZE(e680_devices));
 889}
 890
 891MACHINE_START(EZX_E680, "Motorola EZX E680")
 892	.atag_offset    = 0x100,
 893	.map_io         = pxa27x_map_io,
 894	.nr_irqs	= EZX_NR_IRQS,
 895	.init_irq       = pxa27x_init_irq,
 896	.handle_irq       = pxa27x_handle_irq,
 897	.init_time	= pxa_timer_init,
 898	.init_machine   = e680_init,
 899	.restart	= pxa_restart,
 900MACHINE_END
 901#endif
 902
 903#ifdef CONFIG_MACH_EZX_A1200
 904/* gpio_keys */
 905static struct gpio_keys_button a1200_buttons[] = {
 906	[0] = {
 907		.code       = SW_LID,
 908		.gpio       = GPIO15_A1200_FLIP_LID,
 909		.active_low = 0,
 910		.desc       = "A1200 flip lid",
 911		.type       = EV_SW,
 912		.wakeup     = 1,
 913	},
 914};
 915
 916static struct gpio_keys_platform_data a1200_gpio_keys_platform_data = {
 917	.buttons  = a1200_buttons,
 918	.nbuttons = ARRAY_SIZE(a1200_buttons),
 919};
 920
 921static struct platform_device a1200_gpio_keys = {
 922	.name = "gpio-keys",
 923	.id   = -1,
 924	.dev  = {
 925		.platform_data = &a1200_gpio_keys_platform_data,
 926	},
 927};
 928
 929static struct i2c_board_info __initdata a1200_i2c_board_info[] = {
 930	{ I2C_BOARD_INFO("tea5767", 0x81) },
 931};
 932
 933static struct platform_device *a1200_devices[] __initdata = {
 934	&a1200_gpio_keys,
 935};
 936
 937static void __init a1200_init(void)
 938{
 939	pxa2xx_mfp_config(ARRAY_AND_SIZE(ezx_pin_config));
 940	pxa2xx_mfp_config(ARRAY_AND_SIZE(gen2_pin_config));
 941	pxa2xx_mfp_config(ARRAY_AND_SIZE(a1200_pin_config));
 942
 943	pxa_set_ffuart_info(NULL);
 944	pxa_set_btuart_info(NULL);
 945	pxa_set_stuart_info(NULL);
 946
 947	pxa_set_i2c_info(NULL);
 948	i2c_register_board_info(0, ARRAY_AND_SIZE(a1200_i2c_board_info));
 949
 950	pxa_set_fb_info(NULL, &ezx_fb_info_2);
 951
 952	pxa_set_keypad_info(&a1200_keypad_platform_data);
 953
 954	platform_add_devices(ARRAY_AND_SIZE(ezx_devices));
 955	platform_add_devices(ARRAY_AND_SIZE(a1200_devices));
 956}
 957
 958MACHINE_START(EZX_A1200, "Motorola EZX A1200")
 959	.atag_offset    = 0x100,
 960	.map_io         = pxa27x_map_io,
 961	.nr_irqs	= EZX_NR_IRQS,
 962	.init_irq       = pxa27x_init_irq,
 963	.handle_irq       = pxa27x_handle_irq,
 964	.init_time	= pxa_timer_init,
 965	.init_machine   = a1200_init,
 966	.restart	= pxa_restart,
 967MACHINE_END
 968#endif
 969
 970#ifdef CONFIG_MACH_EZX_A910
 971/* gpio_keys */
 972static struct gpio_keys_button a910_buttons[] = {
 973	[0] = {
 974		.code       = SW_LID,
 975		.gpio       = GPIO15_A910_FLIP_LID,
 976		.active_low = 0,
 977		.desc       = "A910 flip lid",
 978		.type       = EV_SW,
 979		.wakeup     = 1,
 980	},
 981};
 982
 983static struct gpio_keys_platform_data a910_gpio_keys_platform_data = {
 984	.buttons  = a910_buttons,
 985	.nbuttons = ARRAY_SIZE(a910_buttons),
 986};
 987
 988static struct platform_device a910_gpio_keys = {
 989	.name = "gpio-keys",
 990	.id   = -1,
 991	.dev  = {
 992		.platform_data = &a910_gpio_keys_platform_data,
 993	},
 994};
 995
 996/* camera */
 997static int a910_camera_init(void)
 998{
 999	int err;
1000
1001	/*
1002	 * GPIO50_nCAM_EN is active low
1003	 * GPIO28_GEN2_CAM_RST is active on rising edge
1004	 */
1005	err = gpio_request(GPIO50_nCAM_EN, "nCAM_EN");
1006	if (err) {
1007		pr_err("%s: Failed to request nCAM_EN\n", __func__);
1008		goto fail;
1009	}
1010
1011	err = gpio_request(GPIO28_GEN2_CAM_RST, "CAM_RST");
1012	if (err) {
1013		pr_err("%s: Failed to request CAM_RST\n", __func__);
1014		goto fail_gpio_cam_rst;
1015	}
1016
1017	gpio_direction_output(GPIO50_nCAM_EN, 1);
1018	gpio_direction_output(GPIO28_GEN2_CAM_RST, 0);
1019
1020	return 0;
1021
1022fail_gpio_cam_rst:
1023	gpio_free(GPIO50_nCAM_EN);
1024fail:
1025	return err;
1026}
1027
1028static int a910_camera_power(struct device *dev, int on)
1029{
1030	gpio_set_value(GPIO50_nCAM_EN, !on);
1031	return 0;
1032}
1033
1034static int a910_camera_reset(struct device *dev)
1035{
1036	gpio_set_value(GPIO28_GEN2_CAM_RST, 0);
1037	msleep(10);
1038	gpio_set_value(GPIO28_GEN2_CAM_RST, 1);
1039
1040	return 0;
1041}
1042
1043struct pxacamera_platform_data a910_pxacamera_platform_data = {
1044	.flags  = PXA_CAMERA_MASTER | PXA_CAMERA_DATAWIDTH_8 |
1045		PXA_CAMERA_PCLK_EN | PXA_CAMERA_MCLK_EN,
1046	.mclk_10khz = 5000,
1047};
1048
1049static struct i2c_board_info a910_camera_i2c_board_info = {
1050	I2C_BOARD_INFO("mt9m111", 0x5d),
1051};
1052
1053static struct soc_camera_link a910_iclink = {
1054	.bus_id         = 0,
1055	.i2c_adapter_id = 0,
1056	.board_info     = &a910_camera_i2c_board_info,
1057	.power          = a910_camera_power,
1058	.reset          = a910_camera_reset,
1059};
1060
1061static struct platform_device a910_camera = {
1062	.name   = "soc-camera-pdrv",
1063	.id     = 0,
1064	.dev    = {
1065		.platform_data = &a910_iclink,
1066	},
1067};
1068
1069/* leds-lp3944 */
1070static struct lp3944_platform_data a910_lp3944_leds = {
1071	.leds_size = LP3944_LEDS_MAX,
1072	.leds = {
1073		[0] = {
1074			.name = "a910:red:",
1075			.status = LP3944_LED_STATUS_OFF,
1076			.type = LP3944_LED_TYPE_LED,
1077		},
1078		[1] = {
1079			.name = "a910:green:",
1080			.status = LP3944_LED_STATUS_OFF,
1081			.type = LP3944_LED_TYPE_LED,
1082		},
1083		[2] {
1084			.name = "a910:blue:",
1085			.status = LP3944_LED_STATUS_OFF,
1086			.type = LP3944_LED_TYPE_LED,
1087		},
1088		/* Leds 3 and 4 are used as display power switches */
1089		[3] = {
1090			.name = "a910::cli_display",
1091			.status = LP3944_LED_STATUS_OFF,
1092			.type = LP3944_LED_TYPE_LED_INVERTED
1093		},
1094		[4] = {
1095			.name = "a910::main_display",
1096			.status = LP3944_LED_STATUS_ON,
1097			.type = LP3944_LED_TYPE_LED_INVERTED
1098		},
1099		[5] = { .type = LP3944_LED_TYPE_NONE },
1100		[6] = {
1101			.name = "a910::torch",
1102			.status = LP3944_LED_STATUS_OFF,
1103			.type = LP3944_LED_TYPE_LED,
1104		},
1105		[7] = {
1106			.name = "a910::flash",
1107			.status = LP3944_LED_STATUS_OFF,
1108			.type = LP3944_LED_TYPE_LED_INVERTED,
1109		},
1110	},
1111};
1112
1113static struct i2c_board_info __initdata a910_i2c_board_info[] = {
1114	{
1115		I2C_BOARD_INFO("lp3944", 0x60),
1116		.platform_data = &a910_lp3944_leds,
1117	},
1118};
1119
1120static struct platform_device *a910_devices[] __initdata = {
1121	&a910_gpio_keys,
1122};
1123
1124static void __init a910_init(void)
1125{
1126	pxa2xx_mfp_config(ARRAY_AND_SIZE(ezx_pin_config));
1127	pxa2xx_mfp_config(ARRAY_AND_SIZE(gen2_pin_config));
1128	pxa2xx_mfp_config(ARRAY_AND_SIZE(a910_pin_config));
1129
1130	pxa_set_ffuart_info(NULL);
1131	pxa_set_btuart_info(NULL);
1132	pxa_set_stuart_info(NULL);
1133
1134	pxa_set_i2c_info(NULL);
1135	i2c_register_board_info(0, ARRAY_AND_SIZE(a910_i2c_board_info));
1136
1137	pxa_set_fb_info(NULL, &ezx_fb_info_2);
1138
1139	pxa_set_keypad_info(&a910_keypad_platform_data);
1140
1141	if (a910_camera_init() == 0) {
1142		pxa_set_camera_info(&a910_pxacamera_platform_data);
1143		platform_device_register(&a910_camera);
1144	}
1145
1146	platform_add_devices(ARRAY_AND_SIZE(ezx_devices));
1147	platform_add_devices(ARRAY_AND_SIZE(a910_devices));
1148}
1149
1150MACHINE_START(EZX_A910, "Motorola EZX A910")
1151	.atag_offset    = 0x100,
1152	.map_io         = pxa27x_map_io,
1153	.nr_irqs	= EZX_NR_IRQS,
1154	.init_irq       = pxa27x_init_irq,
1155	.handle_irq       = pxa27x_handle_irq,
1156	.init_time	= pxa_timer_init,
1157	.init_machine   = a910_init,
1158	.restart	= pxa_restart,
1159MACHINE_END
1160#endif
1161
1162#ifdef CONFIG_MACH_EZX_E6
1163/* gpio_keys */
1164static struct gpio_keys_button e6_buttons[] = {
1165	[0] = {
1166		.code       = KEY_SCREENLOCK,
1167		.gpio       = GPIO15_E6_LOCK_SWITCH,
1168		.active_low = 0,
1169		.desc       = "E6 lock switch",
1170		.type       = EV_KEY,
1171		.wakeup     = 1,
1172	},
1173};
1174
1175static struct gpio_keys_platform_data e6_gpio_keys_platform_data = {
1176	.buttons  = e6_buttons,
1177	.nbuttons = ARRAY_SIZE(e6_buttons),
1178};
1179
1180static struct platform_device e6_gpio_keys = {
1181	.name = "gpio-keys",
1182	.id   = -1,
1183	.dev  = {
1184		.platform_data = &e6_gpio_keys_platform_data,
1185	},
1186};
1187
1188static struct i2c_board_info __initdata e6_i2c_board_info[] = {
1189	{ I2C_BOARD_INFO("tea5767", 0x81) },
1190};
1191
1192static struct platform_device *e6_devices[] __initdata = {
1193	&e6_gpio_keys,
1194};
1195
1196static void __init e6_init(void)
1197{
1198	pxa2xx_mfp_config(ARRAY_AND_SIZE(ezx_pin_config));
1199	pxa2xx_mfp_config(ARRAY_AND_SIZE(gen2_pin_config));
1200	pxa2xx_mfp_config(ARRAY_AND_SIZE(e6_pin_config));
1201
1202	pxa_set_ffuart_info(NULL);
1203	pxa_set_btuart_info(NULL);
1204	pxa_set_stuart_info(NULL);
1205
1206	pxa_set_i2c_info(NULL);
1207	i2c_register_board_info(0, ARRAY_AND_SIZE(e6_i2c_board_info));
1208
1209	pxa_set_fb_info(NULL, &ezx_fb_info_2);
1210
1211	pxa_set_keypad_info(&e6_keypad_platform_data);
1212
1213	platform_add_devices(ARRAY_AND_SIZE(ezx_devices));
1214	platform_add_devices(ARRAY_AND_SIZE(e6_devices));
1215}
1216
1217MACHINE_START(EZX_E6, "Motorola EZX E6")
1218	.atag_offset    = 0x100,
1219	.map_io         = pxa27x_map_io,
1220	.nr_irqs	= EZX_NR_IRQS,
1221	.init_irq       = pxa27x_init_irq,
1222	.handle_irq       = pxa27x_handle_irq,
1223	.init_time	= pxa_timer_init,
1224	.init_machine   = e6_init,
1225	.restart	= pxa_restart,
1226MACHINE_END
1227#endif
1228
1229#ifdef CONFIG_MACH_EZX_E2
1230static struct i2c_board_info __initdata e2_i2c_board_info[] = {
1231	{ I2C_BOARD_INFO("tea5767", 0x81) },
1232};
1233
1234static struct platform_device *e2_devices[] __initdata = {
1235};
1236
1237static void __init e2_init(void)
1238{
1239	pxa2xx_mfp_config(ARRAY_AND_SIZE(ezx_pin_config));
1240	pxa2xx_mfp_config(ARRAY_AND_SIZE(gen2_pin_config));
1241	pxa2xx_mfp_config(ARRAY_AND_SIZE(e2_pin_config));
1242
1243	pxa_set_ffuart_info(NULL);
1244	pxa_set_btuart_info(NULL);
1245	pxa_set_stuart_info(NULL);
1246
1247	pxa_set_i2c_info(NULL);
1248	i2c_register_board_info(0, ARRAY_AND_SIZE(e2_i2c_board_info));
1249
1250	pxa_set_fb_info(NULL, &ezx_fb_info_2);
1251
1252	pxa_set_keypad_info(&e2_keypad_platform_data);
1253
1254	platform_add_devices(ARRAY_AND_SIZE(ezx_devices));
1255	platform_add_devices(ARRAY_AND_SIZE(e2_devices));
1256}
1257
1258MACHINE_START(EZX_E2, "Motorola EZX E2")
1259	.atag_offset    = 0x100,
1260	.map_io         = pxa27x_map_io,
1261	.nr_irqs	= EZX_NR_IRQS,
1262	.init_irq       = pxa27x_init_irq,
1263	.handle_irq       = pxa27x_handle_irq,
1264	.init_time	= pxa_timer_init,
1265	.init_machine   = e2_init,
1266	.restart	= pxa_restart,
1267MACHINE_END
1268#endif