[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <20170211173748.ad6fsrjvkepfqu5e@earth>
Date: Sat, 11 Feb 2017 18:37:48 +0100
From: Sebastian Reichel <sre@...nel.org>
To: Dmitry Torokhov <dmitry.torokhov@...il.com>
Cc: linux-input@...r.kernel.org,
Pali Rohár <pali.rohar@...il.com>,
Michael Welling <mwelling@...e.org>,
linux-kernel@...r.kernel.org
Subject: Re: [PATCH 3/3] Input: tsc2004/5 - switch to using generic device
properties
Hi,
On Fri, Feb 10, 2017 at 04:06:23PM -0800, Dmitry Torokhov wrote:
> Instead of supporting legacy platform data (of which we have no mainline
> users) and OF-based properties, let's switch to generic device properties.
> This will still allow legacy boards to use the driver (by defining property
> sets and attaching them to the drivers) and will simplify probe and make
> driver usable on ACPI-based systems as well.
Reviewed-By: Sebastian Reichel <sre@...nel.org>
FYI: The last & only platform data user of tsc2005 was N900, which was
removed in 9b7141d01a76 (ARM: OMAP2+: Drop legacy board file for n900).
-- Sebastian
> Signed-off-by: Dmitry Torokhov <dmitry.torokhov@...il.com>
> ---
> drivers/input/touchscreen/tsc200x-core.c | 93 +++++++++++---------------------
> include/linux/spi/tsc2005.h | 34 ------------
> 2 files changed, 30 insertions(+), 97 deletions(-)
> delete mode 100644 include/linux/spi/tsc2005.h
>
> diff --git a/drivers/input/touchscreen/tsc200x-core.c b/drivers/input/touchscreen/tsc200x-core.c
> index 1c14a38e3748..88ea5e1b72ae 100644
> --- a/drivers/input/touchscreen/tsc200x-core.c
> +++ b/drivers/input/touchscreen/tsc200x-core.c
> @@ -27,7 +27,6 @@
> #include <linux/delay.h>
> #include <linux/pm.h>
> #include <linux/of.h>
> -#include <linux/spi/tsc2005.h>
> #include <linux/regulator/consumer.h>
> #include <linux/regmap.h>
> #include <linux/gpio/consumer.h>
> @@ -114,7 +113,6 @@ struct tsc200x {
> struct regulator *vio;
>
> struct gpio_desc *reset_gpio;
> - void (*set_reset)(bool enable);
> int (*tsc200x_cmd)(struct device *dev, u8 cmd);
> int irq;
> };
> @@ -227,12 +225,13 @@ static void tsc200x_stop_scan(struct tsc200x *ts)
> ts->tsc200x_cmd(ts->dev, TSC200X_CMD_STOP);
> }
>
> -static void tsc200x_set_reset(struct tsc200x *ts, bool enable)
> +static void tsc200x_reset(struct tsc200x *ts)
> {
> - if (ts->reset_gpio)
> - gpiod_set_value_cansleep(ts->reset_gpio, enable);
> - else if (ts->set_reset)
> - ts->set_reset(enable);
> + if (ts->reset_gpio) {
> + gpiod_set_value_cansleep(ts->reset_gpio, 1);
> + usleep_range(100, 500); /* only 10us required */
> + gpiod_set_value_cansleep(ts->reset_gpio, 0);
> + }
> }
>
> /* must be called with ts->mutex held */
> @@ -253,7 +252,7 @@ static void __tsc200x_enable(struct tsc200x *ts)
> {
> tsc200x_start_scan(ts);
>
> - if (ts->esd_timeout && (ts->set_reset || ts->reset_gpio)) {
> + if (ts->esd_timeout && ts->reset_gpio) {
> ts->last_valid_interrupt = jiffies;
> schedule_delayed_work(&ts->esd_work,
> round_jiffies_relative(
> @@ -310,9 +309,7 @@ static ssize_t tsc200x_selftest_show(struct device *dev,
> }
>
> /* hardware reset */
> - tsc200x_set_reset(ts, false);
> - usleep_range(100, 500); /* only 10us required */
> - tsc200x_set_reset(ts, true);
> + tsc200x_reset(ts);
>
> if (!success)
> goto out;
> @@ -354,7 +351,7 @@ static umode_t tsc200x_attr_is_visible(struct kobject *kobj,
> umode_t mode = attr->mode;
>
> if (attr == &dev_attr_selftest.attr) {
> - if (!ts->set_reset && !ts->reset_gpio)
> + if (!ts->reset_gpio)
> mode = 0;
> }
>
> @@ -404,9 +401,7 @@ static void tsc200x_esd_work(struct work_struct *work)
>
> tsc200x_update_pen_state(ts, 0, 0, 0);
>
> - tsc200x_set_reset(ts, false);
> - usleep_range(100, 500); /* only 10us required */
> - tsc200x_set_reset(ts, true);
> + tsc200x_reset(ts);
>
> enable_irq(ts->irq);
> tsc200x_start_scan(ts);
> @@ -454,26 +449,12 @@ int tsc200x_probe(struct device *dev, int irq, const struct input_id *tsc_id,
> struct regmap *regmap,
> int (*tsc200x_cmd)(struct device *dev, u8 cmd))
> {
> - const struct tsc2005_platform_data *pdata = dev_get_platdata(dev);
> - struct device_node *np = dev->of_node;
> -
> struct tsc200x *ts;
> struct input_dev *input_dev;
> - unsigned int max_x = MAX_12BIT;
> - unsigned int max_y = MAX_12BIT;
> - unsigned int max_p = MAX_12BIT;
> - unsigned int fudge_x = TSC200X_DEF_X_FUZZ;
> - unsigned int fudge_y = TSC200X_DEF_Y_FUZZ;
> - unsigned int fudge_p = TSC200X_DEF_P_FUZZ;
> - unsigned int x_plate_ohm = TSC200X_DEF_RESISTOR;
> - unsigned int esd_timeout;
> + u32 x_plate_ohm;
> + u32 esd_timeout;
> int error;
>
> - if (!np && !pdata) {
> - dev_err(dev, "no platform data\n");
> - return -ENODEV;
> - }
> -
> if (irq <= 0) {
> dev_err(dev, "no irq\n");
> return -ENODEV;
> @@ -487,23 +468,6 @@ int tsc200x_probe(struct device *dev, int irq, const struct input_id *tsc_id,
> return -ENODEV;
> }
>
> - if (pdata) {
> - fudge_x = pdata->ts_x_fudge;
> - fudge_y = pdata->ts_y_fudge;
> - fudge_p = pdata->ts_pressure_fudge;
> - max_x = pdata->ts_x_max;
> - max_y = pdata->ts_y_max;
> - max_p = pdata->ts_pressure_max;
> - x_plate_ohm = pdata->ts_x_plate_ohm;
> - esd_timeout = pdata->esd_timeout_ms;
> - } else {
> - x_plate_ohm = TSC200X_DEF_RESISTOR;
> - of_property_read_u32(np, "ti,x-plate-ohms", &x_plate_ohm);
> - esd_timeout = 0;
> - of_property_read_u32(np, "ti,esd-recovery-timeout-ms",
> - &esd_timeout);
> - }
> -
> ts = devm_kzalloc(dev, sizeof(*ts), GFP_KERNEL);
> if (!ts)
> return -ENOMEM;
> @@ -517,8 +481,13 @@ int tsc200x_probe(struct device *dev, int irq, const struct input_id *tsc_id,
> ts->idev = input_dev;
> ts->regmap = regmap;
> ts->tsc200x_cmd = tsc200x_cmd;
> - ts->x_plate_ohm = x_plate_ohm;
> - ts->esd_timeout = esd_timeout;
> +
> + error = device_property_read_u32(dev, "ti,x-plate-ohms", &x_plate_ohm);
> + ts->x_plate_ohm = error ? TSC200X_DEF_RESISTOR : x_plate_ohm;
> +
> + error = device_property_read_u32(dev, "ti,esd-recovery-timeout-ms",
> + &esd_timeout);
> + ts->esd_timeout = error ? 0 : esd_timeout;
>
> ts->reset_gpio = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_HIGH);
> if (IS_ERR(ts->reset_gpio)) {
> @@ -534,9 +503,6 @@ int tsc200x_probe(struct device *dev, int irq, const struct input_id *tsc_id,
> return error;
> }
>
> - if (!ts->reset_gpio && pdata)
> - ts->set_reset = pdata->set_reset;
> -
> mutex_init(&ts->mutex);
>
> spin_lock_init(&ts->lock);
> @@ -559,22 +525,23 @@ int tsc200x_probe(struct device *dev, int irq, const struct input_id *tsc_id,
>
> input_dev->phys = ts->phys;
> input_dev->id = *tsc_id;
> - input_dev->dev.parent = dev;
> - input_dev->evbit[0] = BIT(EV_ABS) | BIT(EV_KEY);
> - input_dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH);
> -
> - input_set_abs_params(input_dev, ABS_X, 0, max_x, fudge_x, 0);
> - input_set_abs_params(input_dev, ABS_Y, 0, max_y, fudge_y, 0);
> - input_set_abs_params(input_dev, ABS_PRESSURE, 0, max_p, fudge_p, 0);
> -
> - if (np)
> - touchscreen_parse_properties(input_dev, false, NULL);
>
> input_dev->open = tsc200x_open;
> input_dev->close = tsc200x_close;
>
> input_set_drvdata(input_dev, ts);
>
> + input_set_capability(input_dev, EV_KEY, BTN_TOUCH);
> +
> + input_set_abs_params(input_dev, ABS_X,
> + 0, MAX_12BIT, TSC200X_DEF_X_FUZZ, 0);
> + input_set_abs_params(input_dev, ABS_Y,
> + 0, MAX_12BIT, TSC200X_DEF_Y_FUZZ, 0);
> + input_set_abs_params(input_dev, ABS_PRESSURE,
> + 0, MAX_12BIT, TSC200X_DEF_P_FUZZ, 0);
> +
> + touchscreen_parse_properties(input_dev, false, NULL);
> +
> /* Ensure the touchscreen is off */
> tsc200x_stop_scan(ts);
>
> diff --git a/include/linux/spi/tsc2005.h b/include/linux/spi/tsc2005.h
> deleted file mode 100644
> index 563b3b1799a8..000000000000
> --- a/include/linux/spi/tsc2005.h
> +++ /dev/null
> @@ -1,34 +0,0 @@
> -/*
> - * This file is part of TSC2005 touchscreen driver
> - *
> - * Copyright (C) 2009-2010 Nokia Corporation
> - *
> - * This program is free software; you can redistribute it and/or modify
> - * it under the terms of the GNU General Public License as published by
> - * the Free Software Foundation; either version 2 of the License, or
> - * (at your option) any later version.
> - *
> - * This program is distributed in the hope that it will be useful,
> - * but WITHOUT ANY WARRANTY; without even the implied warranty of
> - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> - * GNU General Public License for more details.
> - */
> -
> -#ifndef _LINUX_SPI_TSC2005_H
> -#define _LINUX_SPI_TSC2005_H
> -
> -#include <linux/types.h>
> -
> -struct tsc2005_platform_data {
> - int ts_pressure_max;
> - int ts_pressure_fudge;
> - int ts_x_max;
> - int ts_x_fudge;
> - int ts_y_max;
> - int ts_y_fudge;
> - int ts_x_plate_ohm;
> - unsigned int esd_timeout_ms;
> - void (*set_reset)(bool enable);
> -};
> -
> -#endif
> --
> 2.11.0.483.g087da7b7c-goog
>
Download attachment "signature.asc" of type "application/pgp-signature" (834 bytes)
Powered by blists - more mailing lists