lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite for Android: free password hash cracker in your pocket
[<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

Powered by Openwall GNU/*/Linux Powered by OpenVZ