From: Bastien Nocera <hadess@hadess.net>
To: Irina Tirdea <irina.tirdea@intel.com>
Cc: Dmitry Torokhov <dmitry.torokhov@gmail.com>,
linux-input@vger.kernel.org, devicetree@vger.kernel.org,
linux-kernel@vger.kernel.org,
Octavian Purdila <octavian.purdila@intel.com>
Subject: Re: [PATCH 7/9] input: goodix: add power management support
Date: Thu, 04 Jun 2015 15:01:06 +0200 [thread overview]
Message-ID: <1433422866.5346.23.camel@hadess.net> (raw)
In-Reply-To: <1432817265-23891-8-git-send-email-irina.tirdea@intel.com>
On Thu, 2015-05-28 at 15:47 +0300, Irina Tirdea wrote:
> Implement suspend/resume for goodix driver.
>
> Signed-off-by: Octavian Purdila <octavian.purdila@intel.com>
> Signed-off-by: Irina Tirdea <irina.tirdea@intel.com>
> ---
> drivers/input/touchscreen/goodix.c | 81
> +++++++++++++++++++++++++++++++++++---
> 1 file changed, 76 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/input/touchscreen/goodix.c
> b/drivers/input/touchscreen/goodix.c
> index 22052c9..ce7e834 100644
> --- a/drivers/input/touchscreen/goodix.c
> +++ b/drivers/input/touchscreen/goodix.c
> @@ -37,6 +37,7 @@ struct goodix_ts_data {
> unsigned int int_trigger_type;
> struct gpio_desc *gpiod_int;
> struct gpio_desc *gpiod_rst;
> + unsigned long irq_flags;
> };
>
> #define GOODIX_GPIO_INT_NAME "irq"
> @@ -52,6 +53,9 @@ struct goodix_ts_data {
> #define GOODIX_CONFIG_MAX_LENGTH 240
>
> /* Register defines */
> +#define GOODIX_REG_COMMAND 0x8040
> +#define GOODIX_CMD_SCREEN_OFF 0x05
> +
> #define GOODIX_READ_COOR_ADDR 0x814E
> #define GOODIX_REG_CONFIG_DATA 0x8047
> #define GOODIX_REG_ID 0x8140
> @@ -129,6 +133,11 @@ static int goodix_i2c_write(struct i2c_client
> *client, u16 reg, u8 *buf,
> return ret < 0 ? ret : (ret != 1 ? -EIO : 0);
> }
>
> +static int goodix_i2c_write_u8(struct i2c_client *client, u16 reg,
> u8 value)
> +{
> + return goodix_i2c_write(client, reg, &value, sizeof(value));
> +}
> +
> static int goodix_ts_read_input_report(struct goodix_ts_data *ts, u8
> *data)
> {
> int touch_num;
> @@ -227,6 +236,18 @@ static irqreturn_t goodix_ts_irq_handler(int
> irq, void *dev_id)
> return IRQ_HANDLED;
> }
>
> +static void goodix_free_irq(struct goodix_ts_data *ts)
> +{
> + devm_free_irq(&ts->client->dev, ts->client->irq, ts);
> +}
> +
> +static int goodix_request_irq(struct goodix_ts_data *ts)
> +{
> + return devm_request_threaded_irq(&ts->client->dev, ts
> ->client->irq,
> + NULL,
> goodix_ts_irq_handler,
> + ts->irq_flags, ts->client
> ->name, ts);
> +}
> +
> /**
> * goodix_get_cfg - Get device config from ACPI/DT.
> *
> @@ -562,7 +583,6 @@ static int goodix_ts_probe(struct i2c_client
> *client,
> const struct i2c_device_id *id)
> {
> struct goodix_ts_data *ts;
> - unsigned long irq_flags;
> int error;
> u16 version_info, id_info;
>
> @@ -614,10 +634,8 @@ static int goodix_ts_probe(struct i2c_client
> *client,
> if (error)
> return error;
>
> - irq_flags = goodix_irq_flags[ts->int_trigger_type] |
> IRQF_ONESHOT;
> - error = devm_request_threaded_irq(&ts->client->dev, client
> ->irq,
> - NULL,
> goodix_ts_irq_handler,
> - irq_flags, client->name,
> ts);
> + ts->irq_flags = goodix_irq_flags[ts->int_trigger_type] |
> IRQF_ONESHOT;
> + error = goodix_request_irq(ts);
> if (error) {
> dev_err(&client->dev, "request IRQ failed: %d\n",
> error);
> return error;
> @@ -626,6 +644,58 @@ static int goodix_ts_probe(struct i2c_client
> *client,
> return 0;
> }
>
> +#ifdef CONFIG_PM_SLEEP
> +static int goodix_suspend(struct device *dev)
> +{
> + struct i2c_client *client = to_i2c_client(dev);
> + struct goodix_ts_data *ts = i2c_get_clientdata(client);
> + int ret;
> +
> + goodix_free_irq(ts);
> + ret = gpiod_direction_output(ts->gpiod_int, 0);
> + if (ret) {
> + goodix_request_irq(ts);
> + return ret;
> + }
> + usleep_range(5000, 6000);
I'd appreciate some references and explanations for those magic
numbers.
> +
> + ret = goodix_i2c_write_u8(ts->client, GOODIX_REG_COMMAND,
> + GOODIX_CMD_SCREEN_OFF);
> + if (ret) {
> + dev_err(&ts->client->dev, "Screen off command
> failed\n");
> + gpiod_direction_input(ts->gpiod_int);
> + goodix_request_irq(ts);
> + return -EAGAIN;
> + }
> +
> + /*
> + * To avoid waking up while is not sleeping,
You're missing a subject in that sentence.
> + * delay 58ms to ensure reliability
> + */
> + msleep(58);
Why 58ms?
> + return 0;
> +}
> +
> +static int goodix_resume(struct device *dev)
> +{
> + struct i2c_client *client = to_i2c_client(dev);
> + struct goodix_ts_data *ts = i2c_get_clientdata(client);
> + int ret;
> +
> + ret = gpiod_direction_output(ts->gpiod_int, 1);
> + if (ret)
> + return ret;
> + usleep_range(2000, 5000); /* 2ms~5ms */
Good comment, just missing a reference (anything that could help find
that information in the datasheets would be good).
> + ret = goodix_int_sync(ts);
> + if (ret)
> + return ret;
> +
> + return goodix_request_irq(ts);
> +}
> +#endif
> +
> +static SIMPLE_DEV_PM_OPS(goodix_pm_ops, goodix_suspend,
> goodix_resume);
> +
> static const struct i2c_device_id goodix_ts_id[] = {
> { "GDIX1001:00", 0 },
> { }
> @@ -663,6 +733,7 @@ static struct i2c_driver goodix_ts_driver = {
> .owner = THIS_MODULE,
> .acpi_match_table = ACPI_PTR(goodix_acpi_match),
> .of_match_table = of_match_ptr(goodix_of_match),
> + .pm = &goodix_pm_ops,
> },
> };
> module_i2c_driver(goodix_ts_driver);
next prev parent reply other threads:[~2015-06-04 13:01 UTC|newest]
Thread overview: 62+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-05-28 12:47 [PATCH 0/9] Goodix touchscreen enhancements Irina Tirdea
2015-05-28 12:47 ` [PATCH 1/9] input: goodix: fix alignment issues Irina Tirdea
2015-06-04 12:48 ` Bastien Nocera
2015-06-05 16:49 ` Dmitry Torokhov
2015-06-05 17:07 ` Tirdea, Irina
2015-06-05 17:17 ` Joe Perches
2015-06-05 17:31 ` Dmitry Torokhov
2015-05-28 12:47 ` [PATCH 2/9] input: goodix: fix variable length array warning Irina Tirdea
2015-05-28 15:57 ` Antonio Ospite
2015-06-03 10:26 ` Tirdea, Irina
2015-06-03 20:49 ` Antonio Ospite
2015-06-03 20:49 ` Antonio Ospite
2015-06-05 16:34 ` Tirdea, Irina
2015-06-05 16:34 ` Tirdea, Irina
2015-06-05 16:40 ` Dmitry Torokhov
2015-06-05 16:40 ` Dmitry Torokhov
2015-06-05 17:00 ` Tirdea, Irina
2015-06-05 17:00 ` Tirdea, Irina
2015-06-05 17:11 ` Dmitry Torokhov
2015-06-05 17:11 ` Dmitry Torokhov
2015-06-05 17:34 ` Tirdea, Irina
2015-06-05 17:34 ` Tirdea, Irina
2015-05-28 12:47 ` [PATCH 3/9] input: goodix: export id and version read from device Irina Tirdea
2015-05-28 12:47 ` [PATCH 4/9] input: goodix: add ACPI IDs for GT911 and GT9271 Irina Tirdea
2015-06-04 12:51 ` Bastien Nocera
2015-06-05 16:36 ` Tirdea, Irina
2015-06-05 16:36 ` Tirdea, Irina
2015-06-05 16:41 ` Dmitry Torokhov
2015-06-05 17:01 ` Tirdea, Irina
2015-06-05 17:01 ` Tirdea, Irina
2015-05-28 12:47 ` [PATCH 5/9] input: goodix: reset device at init Irina Tirdea
[not found] ` <1432817265-23891-6-git-send-email-irina.tirdea-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2015-05-28 13:19 ` Mark Rutland
2015-05-28 13:19 ` Mark Rutland
2015-05-28 13:42 ` Tirdea, Irina
2015-05-28 12:47 ` [PATCH 6/9] input: goodix: write configuration data to device Irina Tirdea
2015-05-28 13:21 ` Mark Rutland
2015-05-28 13:51 ` Tirdea, Irina
2015-06-04 12:55 ` Bastien Nocera
2015-06-05 16:36 ` Tirdea, Irina
2015-06-05 16:36 ` Tirdea, Irina
2015-06-05 16:43 ` Dmitry Torokhov
2015-06-05 17:05 ` Tirdea, Irina
2015-05-28 12:47 ` [PATCH 7/9] input: goodix: add power management support Irina Tirdea
2015-06-04 13:01 ` Bastien Nocera [this message]
2015-06-05 16:42 ` Tirdea, Irina
2015-06-05 16:42 ` Tirdea, Irina
[not found] ` <1432817265-23891-1-git-send-email-irina.tirdea-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2015-05-28 12:47 ` [PATCH 8/9] input: goodix: add support for ESD Irina Tirdea
2015-05-28 12:47 ` Irina Tirdea
[not found] ` <1432817265-23891-9-git-send-email-irina.tirdea-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2015-05-28 13:23 ` Mark Rutland
2015-05-28 13:23 ` Mark Rutland
2015-05-28 14:26 ` Tirdea, Irina
2015-06-04 12:57 ` Bastien Nocera
2015-06-05 16:37 ` Tirdea, Irina
2015-06-05 16:37 ` Tirdea, Irina
2015-06-05 16:46 ` Dmitry Torokhov
2015-06-08 14:28 ` Tirdea, Irina
2015-07-30 12:06 ` Tirdea, Irina
2015-05-28 12:47 ` [PATCH 9/9] input: goodix: use goodix_i2c_write_u8 instead of i2c_master_send Irina Tirdea
2015-05-28 12:47 ` Irina Tirdea
2015-06-04 13:04 ` [PATCH 0/9] Goodix touchscreen enhancements Bastien Nocera
2015-06-05 16:36 ` Tirdea, Irina
2015-06-05 16:36 ` Tirdea, Irina
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=1433422866.5346.23.camel@hadess.net \
--to=hadess@hadess.net \
--cc=devicetree@vger.kernel.org \
--cc=dmitry.torokhov@gmail.com \
--cc=irina.tirdea@intel.com \
--cc=linux-input@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=octavian.purdila@intel.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.