All of lore.kernel.org
 help / color / mirror / Atom feed
From: Benjamin Tissoires <benjamin.tissoires@redhat.com>
To: Brian Norris <briannorris@chromium.org>
Cc: Jiri Kosina <jikos@kernel.org>, Caesar Wang <wxt@rock-chips.com>,
	linux-rockchip@lists.infradead.org,
	Rob Herring <robh+dt@kernel.org>,
	linux-input@vger.kernel.org, devicetree@vger.kernel.org,
	linux-kernel@vger.kernel.org,
	Dmitry Torokhov <dmitry.torokhov@gmail.com>,
	Mark Rutland <mark.rutland@arm.com>,
	Doug Anderson <dianders@chromium.org>
Subject: Re: [PATCH v2 2/2] HID: i2c-hid: support Wacom digitizer + regulator
Date: Thu, 1 Dec 2016 15:41:26 +0100	[thread overview]
Message-ID: <20161201144126.GE1280@mail.corp.redhat.com> (raw)
In-Reply-To: <1480555288-142791-2-git-send-email-briannorris@chromium.org>

On Nov 30 2016 or thereabouts, Brian Norris wrote:
> We need to power on the digitizer before using it, and it's also nice to
> save power in suspend by disabling it. Support an optional "vdd-supply"
> and wire it up for the new Wacom device.
> 
> Wacom recommended waiting up to 100ms after powering on before trying to
> access this device.
> 
> Signed-off-by: Brian Norris <briannorris@chromium.org>
> Signed-off-by: Caesar Wang <wxt@rock-chips.com>
> Cc: Jiri Kosina <jikos@kernel.org>
> Cc: linux-input@vger.kernel.org
> ---
> v1 was a few months back. I finally got around to rewriting it based on
> DT binding feedback.
> 
> v2:
>  * support compatible property for wacom, with specific "vdd-supply" name
>  * support the 100ms delay needed for this digitizer
>  * target regulator support only at specific device
> 
>  Documentation/devicetree/bindings/input/hid-over-i2c.txt | 6 +++++-
>  drivers/hid/i2c-hid/i2c-hid.c | 70 ++++++++++++++++++++++++++++++++++++++++++-
>  include/linux/i2c/i2c-hid.h   |  6 ++++
>  2 files changed, 75 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/hid/i2c-hid/i2c-hid.c b/drivers/hid/i2c-hid/i2c-hid.c
> index b3ec4f2de875..1bc174f3a788 100644
> --- a/drivers/hid/i2c-hid/i2c-hid.c
> +++ b/drivers/hid/i2c-hid/i2c-hid.c
> @@ -37,7 +37,9 @@
>  #include <linux/mutex.h>
>  #include <linux/acpi.h>
>  #include <linux/of.h>
> +#include <linux/of_device.h>
>  #include <linux/gpio/consumer.h>
> +#include <linux/regulator/consumer.h>
>  
>  #include <linux/i2c/i2c-hid.h>
>  
> @@ -918,10 +920,25 @@ static inline int i2c_hid_acpi_pdata(struct i2c_client *client,
>  #endif
>  
>  #ifdef CONFIG_OF
> +
> +/* of_device_id match data */
> +struct i2c_hid_of_data {
> +	/* Name of supply regulator. */
> +	const char *supply_name;
> +	/* Delay required after powering on device before it is usable. */
> +	int init_delay_ms;
> +};
> +
> +static const struct i2c_hid_of_data wacom_w9013_data = {

Why is the struct "wacom" specific?
If the vdd line is required, I don't see why there is a need to specify
that this is a Wacom specifics. Then Elan, SYnaptics will want the same
and we won't be able to to follow.

> +	.supply_name		= "vdd",
> +	.init_delay_ms		= 100,

If the purpose of this declaration is to set the delay, why isn't this
something provided by the device tree?

> +};
> +
>  static int i2c_hid_of_probe(struct i2c_client *client,
>  		struct i2c_hid_platform_data *pdata)
>  {
>  	struct device *dev = &client->dev;
> +	const struct i2c_hid_of_data *data = of_device_get_match_data(dev);
>  	u32 val;
>  	int ret;
>  
> @@ -937,10 +954,33 @@ static int i2c_hid_of_probe(struct i2c_client *client,
>  	}
>  	pdata->hid_descriptor_address = val;
>  
> +	if (data) {
> +		pdata->init_delay_ms = data->init_delay_ms;
> +		if (data->supply_name) {
> +			pdata->supply = devm_regulator_get_optional(&client->dev,
> +								    data->supply_name);
> +			if (IS_ERR(pdata->supply)) {
> +				ret = PTR_ERR(pdata->supply);
> +				pdata->supply = NULL;
> +				if (ret == -EPROBE_DEFER)
> +					return ret;
> +				if (ret == -ENODEV)
> +					return 0;
> +				dev_err(dev, "Failed to get %s regulator: %d\n",
> +					data->supply_name, ret);
> +				return ret;
> +			}
> +		}
> +	}
> +
>  	return 0;
>  }
>  
>  static const struct of_device_id i2c_hid_of_match[] = {
> +	{
> +		.compatible = "wacom,w9013",
> +		.data = &wacom_w9013_data,
> +	},

NACK, see 1/2

I don't really like the v2. IMO, v1 was less intrusive (though it was
missing the init_delay_ms).
I believe it's possible to have a generic device tree description which
doesn't require us to adapt the driver for each and every device.

Cheers,
Benjamin

>  	{ .compatible = "hid-over-i2c" },
>  	{},
>  };
> @@ -983,6 +1023,17 @@ static int i2c_hid_probe(struct i2c_client *client,
>  		ihid->pdata = *platform_data;
>  	}
>  
> +	if (ihid->pdata.supply) {
> +		ret = regulator_enable(ihid->pdata.supply);
> +		if (ret < 0) {
> +			dev_err(&client->dev, "Failed to enable regulator: %d\n",
> +				ret);
> +			return ret;
> +		}
> +		if (ihid->pdata.init_delay_ms)
> +			msleep(ihid->pdata.init_delay_ms);
> +	}
> +
>  	if (client->irq > 0) {
>  		ihid->irq = client->irq;
>  	} else if (ACPI_COMPANION(&client->dev)) {
> @@ -1100,6 +1151,9 @@ static int i2c_hid_remove(struct i2c_client *client)
>  	if (ihid->desc)
>  		gpiod_put(ihid->desc);
>  
> +	if (ihid->pdata.supply)
> +		regulator_disable(ihid->pdata.supply);
> +
>  	kfree(ihid);
>  
>  	acpi_dev_remove_driver_gpios(ACPI_COMPANION(&client->dev));
> @@ -1152,6 +1206,11 @@ static int i2c_hid_suspend(struct device *dev)
>  		else
>  			hid_warn(hid, "Failed to enable irq wake: %d\n",
>  				wake_status);
> +	} else if (ihid->pdata.supply) {
> +		ret = regulator_disable(ihid->pdata.supply);
> +		if (ret < 0)
> +			hid_warn(hid, "Failed to disable supply: %d\n",
> +				 ret);
>  	}
>  
>  	return 0;
> @@ -1165,7 +1224,16 @@ static int i2c_hid_resume(struct device *dev)
>  	struct hid_device *hid = ihid->hid;
>  	int wake_status;
>  
> -	if (device_may_wakeup(&client->dev) && ihid->irq_wake_enabled) {
> +	if (!device_may_wakeup(&client->dev)) {
> +		if (ihid->pdata.supply) {
> +			ret = regulator_enable(ihid->pdata.supply);
> +			if (ret < 0)
> +				hid_warn(hid, "Failed to enable supply: %d\n",
> +					 ret);
> +			if (ihid->pdata.init_delay_ms)
> +				msleep(ihid->pdata.init_delay_ms);
> +		}
> +	} else if (ihid->irq_wake_enabled) {
>  		wake_status = disable_irq_wake(ihid->irq);
>  		if (!wake_status)
>  			ihid->irq_wake_enabled = false;
> diff --git a/include/linux/i2c/i2c-hid.h b/include/linux/i2c/i2c-hid.h
> index 7aa901d92058..97688cde4a91 100644
> --- a/include/linux/i2c/i2c-hid.h
> +++ b/include/linux/i2c/i2c-hid.h
> @@ -14,9 +14,13 @@
>  
>  #include <linux/types.h>
>  
> +struct regulator;
> +
>  /**
>   * struct i2chid_platform_data - used by hid over i2c implementation.
>   * @hid_descriptor_address: i2c register where the HID descriptor is stored.
> + * @supply: regulator for powering on the device.
> + * @init_delay_ms: delay after powering on before device is usable.
>   *
>   * Note that it is the responsibility of the platform driver (or the acpi 5.0
>   * driver, or the flattened device tree) to setup the irq related to the gpio in
> @@ -31,6 +35,8 @@
>   */
>  struct i2c_hid_platform_data {
>  	u16 hid_descriptor_address;
> +	struct regulator *supply;
> +	int init_delay_ms;
>  };
>  
>  #endif /* __LINUX_I2C_HID_H */
> -- 
> 2.8.0.rc3.226.g39d4020
> 

  reply	other threads:[~2016-12-01 14:41 UTC|newest]

Thread overview: 45+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-12-01  1:21 [PATCH v2 1/2] devicetree: i2c-hid: Add Wacom digitizer + regulator support Brian Norris
2016-12-01  1:21 ` [PATCH v2 2/2] HID: i2c-hid: support Wacom digitizer + regulator Brian Norris
2016-12-01 14:41   ` Benjamin Tissoires [this message]
     [not found]     ` <20161201144126.GE1280-/m+UfqrgI5QNLKR9yMNcA1aTQe2KTcn/@public.gmane.org>
2016-12-01 17:30       ` Brian Norris
2016-12-01 17:30         ` Brian Norris
2016-12-01 14:34 ` [PATCH v2 1/2] devicetree: i2c-hid: Add Wacom digitizer + regulator support Benjamin Tissoires
2016-12-01 17:24   ` Brian Norris
2016-12-01 17:24     ` Brian Norris
2016-12-05 23:59     ` Rob Herring
2016-12-06  0:16       ` Dmitry Torokhov
2016-12-06  0:16         ` Dmitry Torokhov
2016-12-06  8:48       ` Benjamin Tissoires
2016-12-06  8:48         ` Benjamin Tissoires
2016-12-06 14:56         ` Rob Herring
     [not found]           ` <CAL_Jsq+C1MWrN4Sg_xOgpTzQh9gfL12G5Uxb1ya2MTkoa=7fMA-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2016-12-06 16:18             ` Doug Anderson
2016-12-06 16:18               ` Doug Anderson
     [not found]               ` <CAD=FV=UMonRe8WJ1feDv3Nh9g8hEGAwwFT5NYLbzXADBqhTf-A-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2016-12-08 15:41                 ` Benjamin Tissoires
2016-12-08 15:41                   ` Benjamin Tissoires
     [not found]                   ` <20161208154145.GA30888-/m+UfqrgI5QNLKR9yMNcA1aTQe2KTcn/@public.gmane.org>
2016-12-08 16:03                     ` Rob Herring
2016-12-08 16:03                       ` Rob Herring
2016-12-08 16:13                       ` Dmitry Torokhov
2016-12-08 16:26                         ` Rob Herring
     [not found]                           ` <CAL_JsqKu0yhLVyEjcZs_rn=VqM9O4F_VMhOkfhEEvbYAjvWSTg-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2016-12-08 18:12                             ` Dmitry Torokhov
2016-12-08 18:12                               ` Dmitry Torokhov
2016-12-09 14:36                               ` Rob Herring
2016-12-09 14:36                                 ` Rob Herring
2016-12-09 14:36                           ` Jiri Kosina
2016-12-09 15:01                             ` Rob Herring
2016-12-09 16:16                               ` Doug Anderson
2016-12-12  8:53                               ` Jiri Kosina
2016-12-12 10:01                                 ` Benjamin Tissoires
     [not found]                                   ` <20161212100110.GA13907-/m+UfqrgI5QNLKR9yMNcA1aTQe2KTcn/@public.gmane.org>
2016-12-12 14:47                                     ` Rob Herring
2016-12-12 14:47                                       ` Rob Herring
     [not found]                                       ` <CAL_JsqJ7t=C4+PgCyNTev66V33-cyPkUHKsTcbnsYgvAaffVfw-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2016-12-12 18:34                                         ` Brian Norris
2016-12-12 18:34                                           ` Brian Norris
2016-12-13 22:10                                           ` Rob Herring
2016-12-08 16:01                 ` Rob Herring
2016-12-08 16:01                   ` Rob Herring
2016-12-09 16:05                   ` Doug Anderson
     [not found]                     ` <CAD=FV=VBvn-QDBMehCXuuTH7ym8-nTV=VxPs=JRjRBzNdezz+Q-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2016-12-09 17:44                       ` Rob Herring
2016-12-09 17:44                         ` Rob Herring
     [not found] ` <1480555288-142791-1-git-send-email-briannorris-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>
2016-12-05 23:42   ` Rob Herring
2016-12-05 23:42     ` Rob Herring
2016-12-05 23:54     ` Brian Norris
2016-12-05 23:54       ` Brian Norris

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=20161201144126.GE1280@mail.corp.redhat.com \
    --to=benjamin.tissoires@redhat.com \
    --cc=briannorris@chromium.org \
    --cc=devicetree@vger.kernel.org \
    --cc=dianders@chromium.org \
    --cc=dmitry.torokhov@gmail.com \
    --cc=jikos@kernel.org \
    --cc=linux-input@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-rockchip@lists.infradead.org \
    --cc=mark.rutland@arm.com \
    --cc=robh+dt@kernel.org \
    --cc=wxt@rock-chips.com \
    /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.