blob: cefc2abd767657441506e7506cb80201101f4b50 [file] [log] [blame] [edit]
/*
* Copyright (C) 2011 Google, Inc.
*
* This software is licensed under the terms of the GNU General Public
* License version 2, as published by the Free Software Foundation, and
* may be copied, distributed, and modified under those terms.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
#include <linux/platform_device.h>
#include <linux/input.h>
#include <linux/interrupt.h>
#include <linux/keyreset.h>
#include <linux/gpio_event.h>
#include <linux/gpio.h>
#include <linux/i2c.h>
#include <linux/i2c/atmel_mxt_ts.h>
#include <linux/platform_data/mms_ts.h>
#include <asm/mach-types.h>
#include <plat/omap4-keypad.h>
#include "board-tuna.h"
#include "mux.h"
#define GPIO_TOUCH_EN 19
#define GPIO_TOUCH_IRQ 46
/* touch is on i2c3 */
#define GPIO_TOUCH_SCL 130
#define GPIO_TOUCH_SDA 131
static int mms_ts_panel_id;
static struct gpio_event_direct_entry tuna_gpio_keypad_keys_map_high[] = {
{
.code = KEY_POWER,
.gpio = 3,
},
};
static struct gpio_event_input_info tuna_gpio_keypad_keys_info_high = {
.info.func = gpio_event_input_func,
.info.no_suspend = true,
.type = EV_KEY,
.keymap = tuna_gpio_keypad_keys_map_high,
.keymap_size = ARRAY_SIZE(tuna_gpio_keypad_keys_map_high),
.flags = GPIOEDF_ACTIVE_HIGH,
.debounce_time.tv64 = 2 * NSEC_PER_MSEC,
};
static struct gpio_event_direct_entry tuna_gpio_keypad_keys_map_low[] = {
{
.code = KEY_VOLUMEDOWN,
.gpio = 8,
},
{
.code = KEY_VOLUMEUP,
.gpio = 30,
},
};
static struct gpio_event_input_info tuna_gpio_keypad_keys_info_low = {
.info.func = gpio_event_input_func,
.info.no_suspend = true,
.type = EV_KEY,
.keymap = tuna_gpio_keypad_keys_map_low,
.keymap_size = ARRAY_SIZE(tuna_gpio_keypad_keys_map_low),
.debounce_time.tv64 = 2 * NSEC_PER_MSEC,
};
static struct gpio_event_info *tuna_gpio_keypad_info[] = {
&tuna_gpio_keypad_keys_info_high.info,
&tuna_gpio_keypad_keys_info_low.info,
};
static struct gpio_event_platform_data tuna_gpio_keypad_data = {
.name = "tuna-gpio-keypad",
.info = tuna_gpio_keypad_info,
.info_count = ARRAY_SIZE(tuna_gpio_keypad_info)
};
static struct platform_device tuna_gpio_keypad_device = {
.name = GPIO_EVENT_DEV_NAME,
.id = 0,
.dev = {
.platform_data = &tuna_gpio_keypad_data,
},
};
static int melfas_mux_fw_flash(bool to_gpios)
{
/* TOUCH_EN is always an output */
if (to_gpios) {
gpio_direction_output(GPIO_TOUCH_IRQ, 0);
omap_mux_set_gpio(
OMAP_PIN_INPUT | OMAP_MUX_MODE3,
GPIO_TOUCH_IRQ);
gpio_direction_output(GPIO_TOUCH_SCL, 0);
omap_mux_set_gpio(OMAP_PIN_INPUT | OMAP_MUX_MODE3,
GPIO_TOUCH_SCL);
gpio_direction_output(GPIO_TOUCH_SDA, 0);
omap_mux_set_gpio(OMAP_PIN_INPUT | OMAP_MUX_MODE3,
GPIO_TOUCH_SDA);
} else {
gpio_direction_output(GPIO_TOUCH_IRQ, 1);
gpio_direction_input(GPIO_TOUCH_IRQ);
omap_mux_set_gpio(
OMAP_PIN_INPUT_PULLUP | OMAP_MUX_MODE3,
GPIO_TOUCH_IRQ);
gpio_direction_output(GPIO_TOUCH_SCL, 1);
gpio_direction_input(GPIO_TOUCH_SCL);
omap_mux_set_gpio(OMAP_PIN_INPUT | OMAP_MUX_MODE0,
GPIO_TOUCH_SCL);
gpio_direction_output(GPIO_TOUCH_SDA, 1);
gpio_direction_input(GPIO_TOUCH_SDA);
omap_mux_set_gpio(OMAP_PIN_INPUT | OMAP_MUX_MODE0,
GPIO_TOUCH_SDA);
}
return 0;
}
static int __init mms_ts_panel_id_setup(char *str)
{
mms_ts_panel_id = simple_strtol(str, NULL, 0);
return 1;
}
__setup("mms_ts.panel_id=", mms_ts_panel_id_setup);
static struct mms_ts_platform_data mms_ts_pdata = {
.max_x = 720,
.max_y = 1280,
.mux_fw_flash = melfas_mux_fw_flash,
.gpio_resetb = GPIO_TOUCH_IRQ,
.gpio_vdd_en = GPIO_TOUCH_EN,
.gpio_scl = GPIO_TOUCH_SCL,
.gpio_sda = GPIO_TOUCH_SDA,
};
static struct i2c_board_info __initdata tuna_i2c3_boardinfo_final[] = {
{
I2C_BOARD_INFO("mms_ts", 0x48),
.flags = I2C_CLIENT_WAKE,
.platform_data = &mms_ts_pdata,
.irq = OMAP_GPIO_IRQ(GPIO_TOUCH_IRQ),
},
};
void __init omap4_tuna_input_init(void)
{
gpio_request(GPIO_TOUCH_IRQ, "tsp_int_n");
gpio_direction_input(GPIO_TOUCH_IRQ);
omap_mux_init_gpio(GPIO_TOUCH_IRQ,
OMAP_PIN_INPUT_PULLUP);
gpio_request(GPIO_TOUCH_EN, "tsp_en");
gpio_direction_output(GPIO_TOUCH_EN, 1);
omap_mux_init_gpio(GPIO_TOUCH_EN, OMAP_PIN_OUTPUT);
gpio_request(GPIO_TOUCH_SCL, "ap_i2c3_scl");
gpio_request(GPIO_TOUCH_SDA, "ap_i2c3_sda");
/* 0x12 == FPCB 3.2
* 0xa1 == FPCB 3.1
*/
if (mms_ts_panel_id == 0x12 || mms_ts_panel_id == 0xA2)
mms_ts_pdata.fw_name = "mms144_ts_rev32.fw";
else
mms_ts_pdata.fw_name = "mms144_ts_rev31.fw";
i2c_register_board_info(3, tuna_i2c3_boardinfo_final,
ARRAY_SIZE(tuna_i2c3_boardinfo_final));
omap_mux_init_gpio(8, OMAP_PIN_INPUT);
omap_mux_init_gpio(30, OMAP_PIN_INPUT);
platform_device_register(&tuna_gpio_keypad_device);
}