All of lore.kernel.org
 help / color / mirror / Atom feed
From: Roger Quadros <rogerq@ti.com>
To: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Cc: rydberg@bitmath.org, mugunthanvnm@ti.com, jg1.han@samsung.com,
	linux-input@vger.kernel.org, devicetree@vger.kernel.org,
	linux-kernel@vger.kernel.org
Subject: Re: [PATCH] Input: pixcir_i2c_ts - Add RESET gpio
Date: Tue, 10 Feb 2015 10:33:26 +0200	[thread overview]
Message-ID: <54D9C256.70700@ti.com> (raw)
In-Reply-To: <20150206165406.GB29225@dtor-ws>

Hi Dmitry,

On 06/02/15 18:54, Dmitry Torokhov wrote:
> Hi Roger,
> 
> On Fri, Feb 06, 2015 at 02:53:10PM +0200, Roger Quadros wrote:
>> The controller has a RESET pin which is usually controlled over
>> a GPIO line. If such a GPIO is provided, perform a RESET
>> during probe.
>>
>> Signed-off-by: Roger Quadros <rogerq@ti.com>
>> ---
>>  .../bindings/input/touchscreen/pixcir_i2c_ts.txt   |  3 ++
>>  drivers/input/touchscreen/pixcir_i2c_ts.c          | 37 ++++++++++++++++++++--
>>  include/linux/input/pixcir_ts.h                    |  1 +
>>  3 files changed, 38 insertions(+), 3 deletions(-)
>>
>> diff --git a/Documentation/devicetree/bindings/input/touchscreen/pixcir_i2c_ts.txt b/Documentation/devicetree/bindings/input/touchscreen/pixcir_i2c_ts.txt
>> index 6e55109..8eb240a 100644
>> --- a/Documentation/devicetree/bindings/input/touchscreen/pixcir_i2c_ts.txt
>> +++ b/Documentation/devicetree/bindings/input/touchscreen/pixcir_i2c_ts.txt
>> @@ -8,6 +8,9 @@ Required properties:
>>  - touchscreen-size-x: horizontal resolution of touchscreen (in pixels)
>>  - touchscreen-size-y: vertical resolution of touchscreen (in pixels)
>>  
>> +Optional properties:
>> +- reset-gpio: GPIO connected to the RESET line of the chip
>> +
>>  Example:
>>  
>>  	i2c@00000000 {
>> diff --git a/drivers/input/touchscreen/pixcir_i2c_ts.c b/drivers/input/touchscreen/pixcir_i2c_ts.c
>> index 4fb5537..610ce0b 100644
>> --- a/drivers/input/touchscreen/pixcir_i2c_ts.c
>> +++ b/drivers/input/touchscreen/pixcir_i2c_ts.c
>> @@ -51,6 +51,19 @@ struct pixcir_report_data {
>>  	struct pixcir_touch touches[PIXCIR_MAX_SLOTS];
>>  };
>>  
>> +static void pixcir_reset(struct pixcir_i2c_ts_data *tsdata)
>> +{
>> +	const struct pixcir_ts_platform_data *pdata = tsdata->pdata;
>> +
>> +	if (gpio_is_valid(pdata->gpio_reset)) {
>> +		gpio_set_value(pdata->gpio_reset, 1);
>> +		ndelay(80);
>> +		gpio_set_value(pdata->gpio_reset, 0);
>> +		/* wait as controller might not immediately respond */
>> +		msleep(100);
>> +	}
>> +}
>> +
>>  static void pixcir_ts_parse(struct pixcir_i2c_ts_data *tsdata,
>>  			    struct pixcir_report_data *report)
>>  {
>> @@ -428,7 +441,8 @@ static struct pixcir_ts_platform_data *pixcir_parse_dt(struct device *dev)
>>  	pdata->chip = *(const struct pixcir_i2c_chip_data *)match->data;
>>  
>>  	pdata->gpio_attb = of_get_named_gpio(np, "attb-gpio", 0);
>> -	/* gpio_attb validity is checked in probe */
>> +	pdata->gpio_reset = of_get_named_gpio(np, "reset-gpio", 0);
>> +	/* gpio validity is checked in probe */
>>  
>>  	if (of_property_read_u32(np, "touchscreen-size-x", &pdata->x_max)) {
>>  		dev_err(dev, "Failed to get touchscreen-size-x property\n");
>> @@ -442,8 +456,9 @@ static struct pixcir_ts_platform_data *pixcir_parse_dt(struct device *dev)
>>  	}
>>  	pdata->y_max -= 1;
>>  
>> -	dev_dbg(dev, "%s: x %d, y %d, gpio %d\n", __func__,
>> -		pdata->x_max + 1, pdata->y_max + 1, pdata->gpio_attb);
>> +	dev_dbg(dev, "%s: x %d, y %d, ATTB gpio %d, RESET gpio %d\n", __func__,
>> +		pdata->x_max + 1, pdata->y_max + 1, pdata->gpio_attb,
>> +		pdata->gpio_reset);
>>  
>>  	return pdata;
>>  }
>> @@ -481,6 +496,10 @@ static int pixcir_i2c_ts_probe(struct i2c_client *client,
>>  		return -EINVAL;
>>  	}
>>  
>> +	/* RESET gpio is optional */
>> +	if (!gpio_is_valid(pdata->gpio_reset))
>> +		dev_info(dev, "Invalid gpio_reset in pdata\n");
>> +
>>  	if (!pdata->chip.max_fingers) {
>>  		dev_err(dev, "Invalid max_fingers in pdata\n");
>>  		return -EINVAL;
>> @@ -530,6 +549,16 @@ static int pixcir_i2c_ts_probe(struct i2c_client *client,
>>  
>>  	input_set_drvdata(input, tsdata);
>>  
>> +	if (gpio_is_valid(pdata->gpio_reset)) {
>> +		error = devm_gpio_request_one(dev, pdata->gpio_reset,
>> +					      GPIOF_OUT_INIT_LOW,
>> +					      "pixcir_i2c_reset");
>> +		if (error) {
>> +			dev_err(dev, "Failed to request RESET gpio\n");
>> +			return error;
>> +		}
>> +	}
>> +
>>  	error = devm_gpio_request_one(dev, pdata->gpio_attb,
>>  				      GPIOF_DIR_IN, "pixcir_i2c_attb");
>>  	if (error) {
>> @@ -545,6 +574,8 @@ static int pixcir_i2c_ts_probe(struct i2c_client *client,
>>  		return error;
>>  	}
>>  
>> +	pixcir_reset(tsdata);
>> +
>>  	/* Always be in IDLE mode to save power, device supports auto wake */
>>  	error = pixcir_set_power_mode(tsdata, PIXCIR_POWER_IDLE);
>>  	if (error) {
>> diff --git a/include/linux/input/pixcir_ts.h b/include/linux/input/pixcir_ts.h
>> index 7bae83b..9e91fd3 100644
>> --- a/include/linux/input/pixcir_ts.h
>> +++ b/include/linux/input/pixcir_ts.h
>> @@ -58,6 +58,7 @@ struct pixcir_ts_platform_data {
>>  	int x_max;
>>  	int y_max;
>>  	int gpio_attb;		/* GPIO connected to ATTB line */
>> +	int gpio_reset;		/* GPIO connected to RESET line */
>>  	struct pixcir_i2c_chip_data chip;
> 
> Declaring gpio_reset like this means that non-OF platforms will have it
> as 0, which is usually a valid gpio number, which means they'll get a
> nasty surprise when they update the driver.
> 
> Maybe we should add a flag, or at least document that it should be set
> to -1 if not available (since I do not see non-OF users in the tree)?
> 

Yes, I'll add a note to set this to -1 for non-OF users.

cheers,
-roger

WARNING: multiple messages have this Message-ID (diff)
From: Roger Quadros <rogerq@ti.com>
To: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Cc: <rydberg@bitmath.org>, <mugunthanvnm@ti.com>,
	<jg1.han@samsung.com>, <linux-input@vger.kernel.org>,
	<devicetree@vger.kernel.org>, <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH] Input: pixcir_i2c_ts - Add RESET gpio
Date: Tue, 10 Feb 2015 10:33:26 +0200	[thread overview]
Message-ID: <54D9C256.70700@ti.com> (raw)
In-Reply-To: <20150206165406.GB29225@dtor-ws>

Hi Dmitry,

On 06/02/15 18:54, Dmitry Torokhov wrote:
> Hi Roger,
> 
> On Fri, Feb 06, 2015 at 02:53:10PM +0200, Roger Quadros wrote:
>> The controller has a RESET pin which is usually controlled over
>> a GPIO line. If such a GPIO is provided, perform a RESET
>> during probe.
>>
>> Signed-off-by: Roger Quadros <rogerq@ti.com>
>> ---
>>  .../bindings/input/touchscreen/pixcir_i2c_ts.txt   |  3 ++
>>  drivers/input/touchscreen/pixcir_i2c_ts.c          | 37 ++++++++++++++++++++--
>>  include/linux/input/pixcir_ts.h                    |  1 +
>>  3 files changed, 38 insertions(+), 3 deletions(-)
>>
>> diff --git a/Documentation/devicetree/bindings/input/touchscreen/pixcir_i2c_ts.txt b/Documentation/devicetree/bindings/input/touchscreen/pixcir_i2c_ts.txt
>> index 6e55109..8eb240a 100644
>> --- a/Documentation/devicetree/bindings/input/touchscreen/pixcir_i2c_ts.txt
>> +++ b/Documentation/devicetree/bindings/input/touchscreen/pixcir_i2c_ts.txt
>> @@ -8,6 +8,9 @@ Required properties:
>>  - touchscreen-size-x: horizontal resolution of touchscreen (in pixels)
>>  - touchscreen-size-y: vertical resolution of touchscreen (in pixels)
>>  
>> +Optional properties:
>> +- reset-gpio: GPIO connected to the RESET line of the chip
>> +
>>  Example:
>>  
>>  	i2c@00000000 {
>> diff --git a/drivers/input/touchscreen/pixcir_i2c_ts.c b/drivers/input/touchscreen/pixcir_i2c_ts.c
>> index 4fb5537..610ce0b 100644
>> --- a/drivers/input/touchscreen/pixcir_i2c_ts.c
>> +++ b/drivers/input/touchscreen/pixcir_i2c_ts.c
>> @@ -51,6 +51,19 @@ struct pixcir_report_data {
>>  	struct pixcir_touch touches[PIXCIR_MAX_SLOTS];
>>  };
>>  
>> +static void pixcir_reset(struct pixcir_i2c_ts_data *tsdata)
>> +{
>> +	const struct pixcir_ts_platform_data *pdata = tsdata->pdata;
>> +
>> +	if (gpio_is_valid(pdata->gpio_reset)) {
>> +		gpio_set_value(pdata->gpio_reset, 1);
>> +		ndelay(80);
>> +		gpio_set_value(pdata->gpio_reset, 0);
>> +		/* wait as controller might not immediately respond */
>> +		msleep(100);
>> +	}
>> +}
>> +
>>  static void pixcir_ts_parse(struct pixcir_i2c_ts_data *tsdata,
>>  			    struct pixcir_report_data *report)
>>  {
>> @@ -428,7 +441,8 @@ static struct pixcir_ts_platform_data *pixcir_parse_dt(struct device *dev)
>>  	pdata->chip = *(const struct pixcir_i2c_chip_data *)match->data;
>>  
>>  	pdata->gpio_attb = of_get_named_gpio(np, "attb-gpio", 0);
>> -	/* gpio_attb validity is checked in probe */
>> +	pdata->gpio_reset = of_get_named_gpio(np, "reset-gpio", 0);
>> +	/* gpio validity is checked in probe */
>>  
>>  	if (of_property_read_u32(np, "touchscreen-size-x", &pdata->x_max)) {
>>  		dev_err(dev, "Failed to get touchscreen-size-x property\n");
>> @@ -442,8 +456,9 @@ static struct pixcir_ts_platform_data *pixcir_parse_dt(struct device *dev)
>>  	}
>>  	pdata->y_max -= 1;
>>  
>> -	dev_dbg(dev, "%s: x %d, y %d, gpio %d\n", __func__,
>> -		pdata->x_max + 1, pdata->y_max + 1, pdata->gpio_attb);
>> +	dev_dbg(dev, "%s: x %d, y %d, ATTB gpio %d, RESET gpio %d\n", __func__,
>> +		pdata->x_max + 1, pdata->y_max + 1, pdata->gpio_attb,
>> +		pdata->gpio_reset);
>>  
>>  	return pdata;
>>  }
>> @@ -481,6 +496,10 @@ static int pixcir_i2c_ts_probe(struct i2c_client *client,
>>  		return -EINVAL;
>>  	}
>>  
>> +	/* RESET gpio is optional */
>> +	if (!gpio_is_valid(pdata->gpio_reset))
>> +		dev_info(dev, "Invalid gpio_reset in pdata\n");
>> +
>>  	if (!pdata->chip.max_fingers) {
>>  		dev_err(dev, "Invalid max_fingers in pdata\n");
>>  		return -EINVAL;
>> @@ -530,6 +549,16 @@ static int pixcir_i2c_ts_probe(struct i2c_client *client,
>>  
>>  	input_set_drvdata(input, tsdata);
>>  
>> +	if (gpio_is_valid(pdata->gpio_reset)) {
>> +		error = devm_gpio_request_one(dev, pdata->gpio_reset,
>> +					      GPIOF_OUT_INIT_LOW,
>> +					      "pixcir_i2c_reset");
>> +		if (error) {
>> +			dev_err(dev, "Failed to request RESET gpio\n");
>> +			return error;
>> +		}
>> +	}
>> +
>>  	error = devm_gpio_request_one(dev, pdata->gpio_attb,
>>  				      GPIOF_DIR_IN, "pixcir_i2c_attb");
>>  	if (error) {
>> @@ -545,6 +574,8 @@ static int pixcir_i2c_ts_probe(struct i2c_client *client,
>>  		return error;
>>  	}
>>  
>> +	pixcir_reset(tsdata);
>> +
>>  	/* Always be in IDLE mode to save power, device supports auto wake */
>>  	error = pixcir_set_power_mode(tsdata, PIXCIR_POWER_IDLE);
>>  	if (error) {
>> diff --git a/include/linux/input/pixcir_ts.h b/include/linux/input/pixcir_ts.h
>> index 7bae83b..9e91fd3 100644
>> --- a/include/linux/input/pixcir_ts.h
>> +++ b/include/linux/input/pixcir_ts.h
>> @@ -58,6 +58,7 @@ struct pixcir_ts_platform_data {
>>  	int x_max;
>>  	int y_max;
>>  	int gpio_attb;		/* GPIO connected to ATTB line */
>> +	int gpio_reset;		/* GPIO connected to RESET line */
>>  	struct pixcir_i2c_chip_data chip;
> 
> Declaring gpio_reset like this means that non-OF platforms will have it
> as 0, which is usually a valid gpio number, which means they'll get a
> nasty surprise when they update the driver.
> 
> Maybe we should add a flag, or at least document that it should be set
> to -1 if not available (since I do not see non-OF users in the tree)?
> 

Yes, I'll add a note to set this to -1 for non-OF users.

cheers,
-roger

  reply	other threads:[~2015-02-10  8:33 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-02-06 12:53 [PATCH] Input: pixcir_i2c_ts - Add RESET gpio Roger Quadros
2015-02-06 12:53 ` Roger Quadros
     [not found] ` <1423227190-10943-1-git-send-email-rogerq-l0cyMroinI0@public.gmane.org>
2015-02-06 16:54   ` Dmitry Torokhov
2015-02-06 16:54     ` Dmitry Torokhov
2015-02-10  8:33     ` Roger Quadros [this message]
2015-02-10  8:33       ` Roger Quadros
2015-06-02  9:33   ` [PATCH v2] " Roger Quadros
2015-06-02  9:33     ` Roger Quadros
2015-07-06 10:28     ` Roger Quadros
2015-07-06 10:28       ` Roger Quadros

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=54D9C256.70700@ti.com \
    --to=rogerq@ti.com \
    --cc=devicetree@vger.kernel.org \
    --cc=dmitry.torokhov@gmail.com \
    --cc=jg1.han@samsung.com \
    --cc=linux-input@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mugunthanvnm@ti.com \
    --cc=rydberg@bitmath.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.