input: synaptics_i2c_rmi4: Add GPIO configuration support

Add GPIO support to driver.  This includes setup and delays
required for gpio toggling during device bootup.

Change-Id: I7945ac26d3655902346a4969ac264311a96d3cbf
Signed-off-by: Amy Maloche <amaloche@codeaurora.org>
This commit is contained in:
Amy Maloche
2013-03-06 11:47:27 -08:00
parent 2d0b912bbc
commit 946da663e6
+66 -7
View File
@@ -82,6 +82,8 @@
#define RMI4_I2C_LOAD_UA 10000
#define RMI4_I2C_LPM_LOAD_UA 10
#define RMI4_GPIO_SLEEP_LOW_US 10000
#define RMI4_GPIO_WAIT_HIGH_MS 25
static int synaptics_rmi4_i2c_read(struct synaptics_rmi4_data *rmi4_data,
unsigned short addr, unsigned char *data,
@@ -1871,15 +1873,60 @@ static int __devinit synaptics_rmi4_probe(struct i2c_client *client,
retval = synaptics_rmi4_regulator_configure(rmi4_data, true);
if (retval < 0) {
dev_err(&client->dev, "Failed to configure regulators\n");
goto err_input_device;
goto err_reg_configure;
}
retval = synaptics_rmi4_power_on(rmi4_data, true);
if (retval < 0) {
dev_err(&client->dev, "Failed to power on\n");
goto err_input_device;
goto err_power_device;
}
if (gpio_is_valid(platform_data->irq_gpio)) {
/* configure touchscreen irq gpio */
retval = gpio_request(platform_data->irq_gpio, "rmi4_irq_gpio");
if (retval) {
dev_err(&client->dev, "unable to request gpio [%d]\n",
platform_data->irq_gpio);
goto err_query_device;
}
retval = gpio_direction_input(platform_data->irq_gpio);
if (retval) {
dev_err(&client->dev,
"unable to set direction for gpio [%d]\n",
platform_data->irq_gpio);
goto err_irq_gpio_req;
}
} else {
dev_err(&client->dev, "irq gpio not provided\n");
goto err_query_device;
}
if (gpio_is_valid(platform_data->reset_gpio)) {
/* configure touchscreen reset out gpio */
retval = gpio_request(platform_data->reset_gpio,
"rmi4_reset_gpio");
if (retval) {
dev_err(&client->dev, "unable to request gpio [%d]\n",
platform_data->reset_gpio);
goto err_irq_gpio_req;
}
retval = gpio_direction_output(platform_data->reset_gpio, 1);
if (retval) {
dev_err(&client->dev,
"unable to set direction for gpio [%d]\n",
platform_data->reset_gpio);
goto err_reset_gpio_req;
}
gpio_set_value(platform_data->reset_gpio, 0);
usleep(RMI4_GPIO_SLEEP_LOW_US);
gpio_set_value(platform_data->reset_gpio, 1);
msleep(RMI4_GPIO_WAIT_HIGH_MS);
}
init_waitqueue_head(&rmi4_data->wait);
mutex_init(&(rmi4_data->rmi4_io_ctrl_mutex));
@@ -1888,7 +1935,7 @@ static int __devinit synaptics_rmi4_probe(struct i2c_client *client,
dev_err(&client->dev,
"%s: Failed to query device\n",
__func__);
goto err_query_device;
goto err_reset_gpio_req;
}
i2c_set_clientdata(client, rmi4_data);
@@ -1972,9 +2019,6 @@ err_enable_irq:
input_unregister_device(rmi4_data->input_dev);
err_register_input:
err_query_device:
synaptics_rmi4_power_on(rmi4_data, false);
synaptics_rmi4_regulator_configure(rmi4_data, false);
if (!list_empty(&rmi->support_fn_list)) {
list_for_each_entry(fhandler, &rmi->support_fn_list, link) {
if (fhandler->fn_number == SYNAPTICS_RMI4_F1A)
@@ -1984,6 +2028,17 @@ err_query_device:
kfree(fhandler);
}
}
err_reset_gpio_req:
if (gpio_is_valid(platform_data->reset_gpio))
gpio_free(platform_data->reset_gpio);
err_irq_gpio_req:
if (gpio_is_valid(platform_data->irq_gpio))
gpio_free(platform_data->irq_gpio);
err_query_device:
synaptics_rmi4_power_on(rmi4_data, false);
err_power_device:
synaptics_rmi4_regulator_configure(rmi4_data, false);
err_reg_configure:
input_free_device(rmi4_data->input_dev);
rmi4_data->input_dev = NULL;
err_input_device:
@@ -2036,7 +2091,11 @@ static int __devexit synaptics_rmi4_remove(struct i2c_client *client)
kfree(fhandler);
}
}
input_free_device(rmi4_data->input_dev);
if (gpio_is_valid(rmi4_data->board->reset_gpio))
gpio_free(rmi4_data->board->reset_gpio);
if (gpio_is_valid(rmi4_data->board->irq_gpio))
gpio_free(rmi4_data->board->irq_gpio);
synaptics_rmi4_power_on(rmi4_data, false);
synaptics_rmi4_regulator_configure(rmi4_data, false);