|
@@ -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;
|
|
|
+ }
|