> -----Original Message----- > From: Linus Walleij [mailto:linus.walleij@xxxxxxxxxx] > Sent: Mittwoch, 14. November 2018 01:23 > To: Dmitry Torokhov <dmitry.torokhov@xxxxxxxxx>; linux-input@xxxxxxxxxxxxxxx > Cc: Linus Walleij <linus.walleij@xxxxxxxxxx>; Hennerich, Michael <Michael.Hennerich@xxxxxxxxxx> > Subject: [PATCH] Input: ad7879: Drop platform data support > > This driver supports configuration via platform data but > absolutely nothing in the upstream kernel uses it. Since this > configuration allows harmful practices such as encoding the > GPIO base for the chip, delete platform data support so that > no new platform using it gets introduced. > > Also: include the right driver header, not <linux/gpio.h>. > > Cc: Michael Hennerich <michael.hennerich@xxxxxxxxxx> > Signed-off-by: Linus Walleij <linus.walleij@xxxxxxxxxx> Acked-by: Michael Hennerich <michael.hennerich@xxxxxxxxxx> > --- > drivers/input/touchscreen/ad7879.c | 107 +++++++++------------------ > include/linux/platform_data/ad7879.h | 42 ----------- > 2 files changed, 33 insertions(+), 116 deletions(-) > delete mode 100644 include/linux/platform_data/ad7879.h > > diff --git a/drivers/input/touchscreen/ad7879.c b/drivers/input/touchscreen/ad7879.c > index 6bad23ee47a1..2aae880c8aa6 100644 > --- a/drivers/input/touchscreen/ad7879.c > +++ b/drivers/input/touchscreen/ad7879.c > @@ -29,10 +29,9 @@ > #include <linux/property.h> > #include <linux/regmap.h> > #include <linux/slab.h> > -#include <linux/gpio.h> > +#include <linux/gpio/driver.h> > > #include <linux/input/touchscreen.h> > -#include <linux/platform_data/ad7879.h> > #include <linux/module.h> > #include "ad7879.h" > > @@ -452,47 +451,36 @@ static void ad7879_gpio_set_value(struct gpio_chip *chip, > mutex_unlock(&ts->mutex); > } > > -static int ad7879_gpio_add(struct ad7879 *ts, > - const struct ad7879_platform_data *pdata) > +static int ad7879_gpio_add(struct ad7879 *ts) > { > - bool gpio_export; > - int gpio_base; > int ret = 0; > > - if (pdata) { > - gpio_export = pdata->gpio_export; > - gpio_base = pdata->gpio_base; > - } else { > - gpio_export = device_property_read_bool(ts->dev, > - "gpio-controller"); > - gpio_base = -1; > - } > - > mutex_init(&ts->mutex); > > - if (gpio_export) { > - ts->gc.direction_input = ad7879_gpio_direction_input; > - ts->gc.direction_output = ad7879_gpio_direction_output; > - ts->gc.get = ad7879_gpio_get_value; > - ts->gc.set = ad7879_gpio_set_value; > - ts->gc.can_sleep = 1; > - ts->gc.base = gpio_base; > - ts->gc.ngpio = 1; > - ts->gc.label = "AD7879-GPIO"; > - ts->gc.owner = THIS_MODULE; > - ts->gc.parent = ts->dev; > - > - ret = devm_gpiochip_add_data(ts->dev, &ts->gc, ts); > - if (ret) > - dev_err(ts->dev, "failed to register gpio %d\n", > - ts->gc.base); > - } > + /* Do not create a chip unless flagged for it */ > + if (!device_property_read_bool(ts->dev, "gpio-controller")) > + return 0; > + > + ts->gc.direction_input = ad7879_gpio_direction_input; > + ts->gc.direction_output = ad7879_gpio_direction_output; > + ts->gc.get = ad7879_gpio_get_value; > + ts->gc.set = ad7879_gpio_set_value; > + ts->gc.can_sleep = 1; > + ts->gc.base = -1; > + ts->gc.ngpio = 1; > + ts->gc.label = "AD7879-GPIO"; > + ts->gc.owner = THIS_MODULE; > + ts->gc.parent = ts->dev; > + > + ret = devm_gpiochip_add_data(ts->dev, &ts->gc, ts); > + if (ret) > + dev_err(ts->dev, "failed to register gpio %d\n", > + ts->gc.base); > > return ret; > } > #else > -static int ad7879_gpio_add(struct ad7879 *ts, > - const struct ad7879_platform_data *pdata) > +static int ad7879_gpio_add(struct ad7879 *ts) > { > return 0; > } > @@ -527,7 +515,6 @@ static int ad7879_parse_dt(struct device *dev, struct ad7879 *ts) > int ad7879_probe(struct device *dev, struct regmap *regmap, > int irq, u16 bustype, u8 devid) > { > - struct ad7879_platform_data *pdata = dev_get_platdata(dev); > struct ad7879 *ts; > struct input_dev *input_dev; > int err; > @@ -542,22 +529,9 @@ int ad7879_probe(struct device *dev, struct regmap *regmap, > if (!ts) > return -ENOMEM; > > - if (pdata) { > - /* Platform data use swapped axis (backward compatibility) */ > - ts->swap_xy = !pdata->swap_xy; > - > - ts->x_plate_ohms = pdata->x_plate_ohms ? : 400; > - > - ts->first_conversion_delay = pdata->first_conversion_delay; > - ts->acquisition_time = pdata->acquisition_time; > - ts->averaging = pdata->averaging; > - ts->pen_down_acc_interval = pdata->pen_down_acc_interval; > - ts->median = pdata->median; > - } else { > - err = ad7879_parse_dt(dev, ts); > - if (err) > - return err; > - } > + err = ad7879_parse_dt(dev, ts); > + if (err) > + return err; > > input_dev = devm_input_allocate_device(dev); > if (!input_dev) { > @@ -585,28 +559,13 @@ int ad7879_probe(struct device *dev, struct regmap *regmap, > > input_set_capability(input_dev, EV_KEY, BTN_TOUCH); > > - if (pdata) { > - input_set_abs_params(input_dev, ABS_X, > - pdata->x_min ? : 0, > - pdata->x_max ? : MAX_12BIT, > - 0, 0); > - input_set_abs_params(input_dev, ABS_Y, > - pdata->y_min ? : 0, > - pdata->y_max ? : MAX_12BIT, > - 0, 0); > - input_set_abs_params(input_dev, ABS_PRESSURE, > - pdata->pressure_min, > - pdata->pressure_max ? : ~0, > - 0, 0); > - } else { > - input_set_abs_params(input_dev, ABS_X, 0, MAX_12BIT, 0, 0); > - input_set_abs_params(input_dev, ABS_Y, 0, MAX_12BIT, 0, 0); > - input_set_capability(input_dev, EV_ABS, ABS_PRESSURE); > - touchscreen_parse_properties(input_dev, false, NULL); > - if (!input_abs_get_max(input_dev, ABS_PRESSURE)) { > - dev_err(dev, "Touchscreen pressure is not specified\n"); > - return -EINVAL; > - } > + input_set_abs_params(input_dev, ABS_X, 0, MAX_12BIT, 0, 0); > + input_set_abs_params(input_dev, ABS_Y, 0, MAX_12BIT, 0, 0); > + input_set_capability(input_dev, EV_ABS, ABS_PRESSURE); > + touchscreen_parse_properties(input_dev, false, NULL); > + if (!input_abs_get_max(input_dev, ABS_PRESSURE)) { > + dev_err(dev, "Touchscreen pressure is not specified\n"); > + return -EINVAL; > } > > err = ad7879_write(ts, AD7879_REG_CTRL2, AD7879_RESET); > @@ -655,7 +614,7 @@ int ad7879_probe(struct device *dev, struct regmap *regmap, > if (err) > return err; > > - err = ad7879_gpio_add(ts, pdata); > + err = ad7879_gpio_add(ts); > if (err) > return err; > > diff --git a/include/linux/platform_data/ad7879.h b/include/linux/platform_data/ad7879.h > deleted file mode 100644 > index 6655cc8453ac..000000000000 > --- a/include/linux/platform_data/ad7879.h > +++ /dev/null > @@ -1,42 +0,0 @@ > -/* SPDX-License-Identifier: GPL-2.0 */ > -/* linux/platform_data/ad7879.h */ > - > -/* Touchscreen characteristics vary between boards and models. The > - * platform_data for the device's "struct device" holds this information. > - * > - * It's OK if the min/max values are zero. > - */ > -struct ad7879_platform_data { > - u16 model; /* 7879 */ > - u16 x_plate_ohms; > - u16 x_min, x_max; > - u16 y_min, y_max; > - u16 pressure_min, pressure_max; > - > - bool swap_xy; /* swap x and y axes */ > - > - /* [0..255] 0=OFF Starts at 1=550us and goes > - * all the way to 9.440ms in steps of 35us. > - */ > - u8 pen_down_acc_interval; > - /* [0..15] Starts at 0=128us and goes all the > - * way to 4.096ms in steps of 128us. > - */ > - u8 first_conversion_delay; > - /* [0..3] 0 = 2us, 1 = 4us, 2 = 8us, 3 = 16us */ > - u8 acquisition_time; > - /* [0..3] Average X middle samples 0 = 2, 1 = 4, 2 = 8, 3 = 16 */ > - u8 averaging; > - /* [0..3] Perform X measurements 0 = OFF, > - * 1 = 4, 2 = 8, 3 = 16 (median > averaging) > - */ > - u8 median; > - /* 1 = AUX/VBAT/GPIO export GPIO to gpiolib > - * requires CONFIG_GPIOLIB > - */ > - bool gpio_export; > - /* identifies the first GPIO number handled by this chip; > - * or, if negative, requests dynamic ID allocation. > - */ > - s32 gpio_base; > -}; > -- > 2.17.2 >