@@ -137,7 +137,8 @@ static int icn8318_start(struct input_dev *dev)
struct icn8318_data *data = input_get_drvdata(dev);
enable_irq(data->client->irq);
- gpiod_set_value_cansleep(data->wake_gpio, 1);
+ if (data->wake_gpio)
+ gpiod_set_value_cansleep(data->wake_gpio, 1);
return 0;
}
@@ -149,7 +150,8 @@ static void icn8318_stop(struct input_dev *dev)
disable_irq(data->client->irq);
i2c_smbus_write_byte_data(data->client, ICN8318_REG_POWER,
ICN8318_POWER_HIBERNATE);
- gpiod_set_value_cansleep(data->wake_gpio, 0);
+ if (data->wake_gpio)
+ gpiod_set_value_cansleep(data->wake_gpio, 0);
}
#ifdef CONFIG_PM_SLEEP
@@ -180,8 +182,29 @@ static int icn8318_resume(struct device *dev)
static SIMPLE_DEV_PM_OPS(icn8318_pm_ops, icn8318_suspend, icn8318_resume);
-static int icn8318_probe(struct i2c_client *client,
- const struct i2c_device_id *id)
+#ifdef CONFIG_OF
+static int icn8318_probe_of(struct icn8318_data *data, struct device *dev)
+{
+ int error;
+
+ data->wake_gpio = devm_gpiod_get(dev, "wake", GPIOD_OUT_LOW);
+ if (IS_ERR(data->wake_gpio)) {
+ error = PTR_ERR(data->wake_gpio);
+ if (error != -EPROBE_DEFER)
+ dev_err(dev, "Error getting wake gpio: %d\n", error);
+ return error;
+ }
+
+ return 0;
+}
+#else
+static int icn8318_probe_of(struct icn8318_data *data, struct device *dev)
+{
+ return -ENODEV;
+}
+#endif
+
+static int icn8318_probe(struct i2c_client *client)
{
struct device *dev = &client->dev;
struct icn8318_data *data;
@@ -197,18 +220,13 @@ static int icn8318_probe(struct i2c_client *client,
if (!data)
return -ENOMEM;
- data->wake_gpio = devm_gpiod_get(dev, "wake", GPIOD_OUT_LOW);
- if (IS_ERR(data->wake_gpio)) {
- error = PTR_ERR(data->wake_gpio);
- if (error != -EPROBE_DEFER)
- dev_err(dev, "Error getting wake gpio: %d\n", error);
- return error;
- }
-
input = devm_input_allocate_device(dev);
if (!input)
return -ENOMEM;
+ data->client = client;
+ data->input = input;
+
input->name = client->name;
input->id.bustype = BUS_I2C;
input->open = icn8318_start;
@@ -218,6 +236,10 @@ static int icn8318_probe(struct i2c_client *client,
input_set_capability(input, EV_ABS, ABS_MT_POSITION_X);
input_set_capability(input, EV_ABS, ABS_MT_POSITION_Y);
+ error = icn8318_probe_of(data, dev);
+ if (error)
+ return error;
+
touchscreen_parse_properties(input, true, &data->prop);
if (!input_abs_get_max(input, ABS_MT_POSITION_X) ||
!input_abs_get_max(input, ABS_MT_POSITION_Y)) {
@@ -230,8 +252,6 @@ static int icn8318_probe(struct i2c_client *client,
if (error)
return error;
- data->client = client;
- data->input = input;
input_set_drvdata(input, data);
error = devm_request_threaded_irq(dev, client->irq, NULL, icn8318_irq,
@@ -271,7 +291,7 @@ static struct i2c_driver icn8318_driver = {
.pm = &icn8318_pm_ops,
.of_match_table = icn8318_of_match,
},
- .probe = icn8318_probe,
+ .probe_new = icn8318_probe,
.id_table = icn8318_i2c_id,
};
This is a preparation patch for adding support for ACPI enumerated Chipone touchscreens. On ACPI platforms the wake GPIO is unused, move the code to get the GPIO to a new icn8318_probe_of helper function. Signed-off-by: Hans de Goede <hdegoede@redhat.com> --- drivers/input/touchscreen/chipone_icn8318.c | 50 ++++++++++++++++++++--------- 1 file changed, 35 insertions(+), 15 deletions(-)