| 
					
				 | 
			
			
				@@ -122,3 +122,195 @@ static struct platform_device pandora_leds_gpio = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 static struct platform_device pandora_backlight = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	.name	= "pandora-backlight", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	.id	= -1, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#define GPIO_BUTTON(gpio_num, ev_type, ev_code, act_low, descr)	\ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{								\ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	.gpio		= gpio_num,				\ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	.type		= ev_type,				\ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	.code		= ev_code,				\ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	.active_low	= act_low,				\ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	.debounce_interval = 4,					\ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	.desc		= "btn " descr,				\ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#define GPIO_BUTTON_LOW(gpio_num, event_code, description)	\ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	GPIO_BUTTON(gpio_num, EV_KEY, event_code, 1, description) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static struct gpio_keys_button pandora_gpio_keys[] = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	GPIO_BUTTON_LOW(110,	KEY_UP,		"up"), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	GPIO_BUTTON_LOW(103,	KEY_DOWN,	"down"), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	GPIO_BUTTON_LOW(96,	KEY_LEFT,	"left"), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	GPIO_BUTTON_LOW(98,	KEY_RIGHT,	"right"), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	GPIO_BUTTON_LOW(109,	KEY_PAGEUP,	"game 1"), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	GPIO_BUTTON_LOW(111,	KEY_END,	"game 2"), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	GPIO_BUTTON_LOW(106,	KEY_PAGEDOWN,	"game 3"), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	GPIO_BUTTON_LOW(101,	KEY_HOME,	"game 4"), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	GPIO_BUTTON_LOW(102,	KEY_RIGHTSHIFT,	"l"), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	GPIO_BUTTON_LOW(97,	KEY_KPPLUS,	"l2"), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	GPIO_BUTTON_LOW(105,	KEY_RIGHTCTRL,	"r"), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	GPIO_BUTTON_LOW(107,	KEY_KPMINUS,	"r2"), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	GPIO_BUTTON_LOW(104,	KEY_LEFTCTRL,	"ctrl"), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	GPIO_BUTTON_LOW(99,	KEY_MENU,	"menu"), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	GPIO_BUTTON_LOW(176,	KEY_COFFEE,	"hold"), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	GPIO_BUTTON(100, EV_KEY, KEY_LEFTALT, 0, "alt"), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	GPIO_BUTTON(108, EV_SW, SW_LID, 1, "lid"), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static struct gpio_keys_platform_data pandora_gpio_key_info = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	.buttons	= pandora_gpio_keys, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	.nbuttons	= ARRAY_SIZE(pandora_gpio_keys), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static struct platform_device pandora_keys_gpio = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	.name	= "gpio-keys", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	.id	= -1, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	.dev	= { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		.platform_data	= &pandora_gpio_key_info, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static const uint32_t board_keymap[] = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	/* row, col, code */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	KEY(0, 0, KEY_9), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	KEY(0, 1, KEY_8), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	KEY(0, 2, KEY_I), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	KEY(0, 3, KEY_J), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	KEY(0, 4, KEY_N), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	KEY(0, 5, KEY_M), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	KEY(1, 0, KEY_0), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	KEY(1, 1, KEY_7), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	KEY(1, 2, KEY_U), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	KEY(1, 3, KEY_H), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	KEY(1, 4, KEY_B), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	KEY(1, 5, KEY_SPACE), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	KEY(2, 0, KEY_BACKSPACE), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	KEY(2, 1, KEY_6), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	KEY(2, 2, KEY_Y), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	KEY(2, 3, KEY_G), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	KEY(2, 4, KEY_V), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	KEY(2, 5, KEY_FN), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	KEY(3, 0, KEY_O), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	KEY(3, 1, KEY_5), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	KEY(3, 2, KEY_T), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	KEY(3, 3, KEY_F), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	KEY(3, 4, KEY_C), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	KEY(4, 0, KEY_P), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	KEY(4, 1, KEY_4), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	KEY(4, 2, KEY_R), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	KEY(4, 3, KEY_D), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	KEY(4, 4, KEY_X), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	KEY(5, 0, KEY_K), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	KEY(5, 1, KEY_3), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	KEY(5, 2, KEY_E), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	KEY(5, 3, KEY_S), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	KEY(5, 4, KEY_Z), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	KEY(6, 0, KEY_L), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	KEY(6, 1, KEY_2), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	KEY(6, 2, KEY_W), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	KEY(6, 3, KEY_A), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	KEY(6, 4, KEY_DOT), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	KEY(7, 0, KEY_ENTER), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	KEY(7, 1, KEY_1), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	KEY(7, 2, KEY_Q), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	KEY(7, 3, KEY_LEFTSHIFT), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	KEY(7, 4, KEY_COMMA), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static struct matrix_keymap_data board_map_data = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	.keymap			= board_keymap, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	.keymap_size		= ARRAY_SIZE(board_keymap), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static struct twl4030_keypad_data pandora_kp_data = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	.keymap_data	= &board_map_data, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	.rows		= 8, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	.cols		= 6, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	.rep		= 1, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static struct omap_dss_device pandora_lcd_device = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	.name			= "lcd", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	.driver_name		= "tpo_td043mtea1_panel", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	.type			= OMAP_DISPLAY_TYPE_DPI, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	.phy.dpi.data_lines	= 24, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	.reset_gpio		= 157, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static struct omap_dss_device pandora_tv_device = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	.name			= "tv", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	.driver_name		= "venc", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	.type			= OMAP_DISPLAY_TYPE_VENC, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	.phy.venc.type		= OMAP_DSS_VENC_TYPE_SVIDEO, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static struct omap_dss_device *pandora_dss_devices[] = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	&pandora_lcd_device, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	&pandora_tv_device, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static struct omap_dss_board_info pandora_dss_data = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	.num_devices	= ARRAY_SIZE(pandora_dss_devices), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	.devices	= pandora_dss_devices, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	.default_device	= &pandora_lcd_device, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static void pandora_wl1251_init_card(struct mmc_card *card) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	/* 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 * We have TI wl1251 attached to MMC3. Pass this information to 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 * SDIO core because it can't be probed by normal methods. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	card->quirks |= MMC_QUIRK_NONSTD_SDIO; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	card->cccr.wide_bus = 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	card->cis.vendor = 0x104c; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	card->cis.device = 0x9066; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	card->cis.blksize = 512; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	card->cis.max_dtr = 20000000; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static struct omap2_hsmmc_info omap3pandora_mmc[] = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		.mmc		= 1, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		.caps		= MMC_CAP_4_BIT_DATA, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		.gpio_cd	= -EINVAL, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		.gpio_wp	= 126, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		.ext_clock	= 0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		.deferred	= true, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		.mmc		= 2, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		.caps		= MMC_CAP_4_BIT_DATA, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		.gpio_cd	= -EINVAL, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		.gpio_wp	= 127, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		.ext_clock	= 1, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		.transceiver	= true, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		.deferred	= true, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		.mmc		= 3, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		.caps		= MMC_CAP_4_BIT_DATA | MMC_CAP_POWER_OFF_CARD, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		.gpio_cd	= -EINVAL, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		.gpio_wp	= -EINVAL, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		.init_card	= pandora_wl1251_init_card, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	{}	/* Terminator */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static int omap3pandora_twl_gpio_setup(struct device *dev, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		unsigned gpio, unsigned ngpio) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	int ret, gpio_32khz; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	/* gpio + {0,1} is "mmc{0,1}_cd" (input/IRQ) */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	omap3pandora_mmc[0].gpio_cd = gpio + 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	omap3pandora_mmc[1].gpio_cd = gpio + 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	omap_hsmmc_late_init(omap3pandora_mmc); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	/* gpio + 13 drives 32kHz buffer for wifi module */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	gpio_32khz = gpio + 13; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	ret = gpio_request_one(gpio_32khz, GPIOF_OUT_INIT_HIGH, "wifi 32kHz"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if (ret < 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		pr_err("Cannot get GPIO line %d, ret=%d\n", gpio_32khz, ret); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return -ENODEV; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 |