forked from rubenslte/android_kernel_samsung_msm8226
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:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user