Get rid of the attb_read_val() platform hook. Instead, read the ATTB gpio directly from the driver. Fail if valid ATTB gpio is not provided by patform data.
Unified · Split
| @@ -24,6 +24,7 @@ · 23 unmodified lines | ||
| 24 | 24 | #include <linux/i2c.h> |
| 25 | 25 | #include <linux/input.h> |
| 26 | 26 | #include <linux/input/pixcir_ts.h> |
| 27 | +#include <linux/gpio.h> | |
| 27 | 28 | |
| 28 | 29 | struct pixcir_i2c_ts_data { |
| 29 | 30 | struct i2c_client *client; |
| @@ -87,11 +88,12 @@ static void pixcir_ts_poscheck(struct pixcir_i2c_ts_data *data) · 57 unmodified lines | ||
| 87 | 88 | static irqreturn_t pixcir_ts_isr(int irq, void *dev_id) |
| 88 | 89 | { |
| 89 | 90 | struct pixcir_i2c_ts_data *tsdata = dev_id; |
| 91 | + const struct pixcir_ts_platform_data *pdata = tsdata->chip; | |
| 90 | 92 | |
| 91 | 93 | while (tsdata->running) { |
| 92 | 94 | pixcir_ts_poscheck(tsdata); |
| 93 | 95 | |
| 94 | − if (tsdata->chip->attb_read_val()) | |
| 96 | + if (gpio_get_value(pdata->gpio_attb)) | |
| 95 | 97 | break; |
| 96 | 98 | |
| 97 | 99 | msleep(20); |
| @@ -298,6 +300,11 @@ static int pixcir_i2c_ts_probe(struct i2c_client *client, · 200 unmodified lines | ||
| 298 | 300 | return -EINVAL; |
| 299 | 301 | } |
| 300 | 302 | |
| 303 | + if (!gpio_is_valid(pdata->gpio_attb)) { | |
| 304 | + dev_err(dev, "Invalid gpio_attb in pdata\n"); | |
| 305 | + return -EINVAL; | |
| 306 | + } | |
| 307 | + | |
| 301 | 308 | tsdata = devm_kzalloc(dev, sizeof(*tsdata), GFP_KERNEL); |
| 302 | 309 | if (!tsdata) |
| 303 | 310 | return -ENOMEM; |
| @@ -328,6 +335,13 @@ static int pixcir_i2c_ts_probe(struct i2c_client *client, · 24 unmodified lines | ||
| 328 | 335 | |
| 329 | 336 | input_set_drvdata(input, tsdata); |
| 330 | 337 | |
| 338 | + error = devm_gpio_request_one(dev, pdata->gpio_attb, | |
| 339 | + GPIOF_DIR_IN, "pixcir_i2c_attb"); | |
| 340 | + if (error) { | |
| 341 | + dev_err(dev, "Failed to request ATTB gpio\n"); | |
| 342 | + return error; | |
| 343 | + } | |
| 344 | + | |
| 331 | 345 | error = devm_request_threaded_irq(dev, client->irq, NULL, pixcir_ts_isr, |
| 332 | 346 | IRQF_TRIGGER_FALLING | IRQF_ONESHOT, |
| 333 | 347 | client->name, tsdata); |
| @@ -44,9 +44,9 @@ enum pixcir_int_mode { · 43 unmodified lines | ||
| 44 | 44 | #define PIXCIR_INT_POL_HIGH (1UL << 2) |
| 45 | 45 | |
| 46 | 46 | struct pixcir_ts_platform_data { |
| 47 | − int (*attb_read_val)(void); | |
| 48 | 47 | int x_max; |
| 49 | 48 | int y_max; |
| 49 | + int gpio_attb; /* GPIO connected to ATTB line */ | |
| 50 | 50 | }; |
| 51 | 51 | |
| 52 | 52 | #endif |