From: Dmitry Torokhov <dmitry.torokhov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
To: Jelle van der Waa <jelle-oJJ1AqDjjO4@public.gmane.org>
Cc: Rob Herring <robh+dt-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>,
linux-input-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
Subject: Re: [PATCH 1/2] input: touchscreen: add driver for Zeitec ZET6223
Date: Sat, 14 Jan 2017 11:14:25 -0800 [thread overview]
Message-ID: <20170114191425.GA31309@dtor-ws> (raw)
In-Reply-To: <20161223163214.7716-1-jelle-oJJ1AqDjjO4@public.gmane.org>
Hi Jelle,
On Fri, Dec 23, 2016 at 05:32:13PM +0100, Jelle van der Waa wrote:
> This is a basic driver for the Zeitec ZET6223 I2C touchscreen
> controllers. The driver does not support firmware loading, which is not
> required for all tablets which contain this chip.
>
> Signed-off-by: Jelle van der Waa <jelle-oJJ1AqDjjO4@public.gmane.org>
This looks mostly good with exception of this:
> +
> +static const struct of_device_id zet6223_of_match[] = {
> + { .compatible = "zeitec", "zet6223" },
The compatible should be "zeitec,zet6223", what you have here is
equivalent of:
{ .compatible = "zeitec", .data = "zet6223" },
I also have been looking at you previosu submission and had some draft
changes. I reconciled them in the patch below, if it still works for you
then I'll fold everything together and apply. Please let me know.
Thanks.
--
Dmitry
Input: zeitech - misc changes
From: Dmitry Torokhov <dmitry.torokhov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
Signed-off-by: Dmitry Torokhov <dmitry.torokhov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
.../bindings/input/touchscreen/zet6223.txt | 29 +-
drivers/input/touchscreen/Kconfig | 22 +-
drivers/input/touchscreen/Makefile | 2
drivers/input/touchscreen/zet6223.c | 262 ++++++++++++++------
4 files changed, 209 insertions(+), 106 deletions(-)
diff --git a/Documentation/devicetree/bindings/input/touchscreen/zet6223.txt b/Documentation/devicetree/bindings/input/touchscreen/zet6223.txt
index cc0f7d06bc8b..fe6a1feef703 100644
--- a/Documentation/devicetree/bindings/input/touchscreen/zet6223.txt
+++ b/Documentation/devicetree/bindings/input/touchscreen/zet6223.txt
@@ -1,16 +1,19 @@
Zeitec ZET6223 I2C touchscreen controller
Required properties:
- - compatible : "zeitec,zet6223"
- - reg : I2C slave address of the chip (0x76)
- - interrupt-parent : a phandle pointing to the interrupt controller
- serving the interrupt for this chip
- - interrupts : interrupt specification for the zet6223 interrupt
+- compatible : "zeitec,zet6223"
+- reg : I2C slave address of the chip (0x76)
+- interrupt-parent : a phandle pointing to the interrupt controller
+ serving the interrupt for this chip
+- interrupts : interrupt specification for the zet6223 interrupt
Optional properties:
-- touchscreen-size-x : See touchscreen.txt
-- touchscreen-size-y : See touchscreen.txt
+- vio-supply : Specification for VIO supply (1.8V or 3.3V,
+ depending on system interface needs).
+- vcc-supply : Specification for 3.3V VCC supply.
+- touchscreen-size-x : See touchscreen.txt
+- touchscreen-size-y : See touchscreen.txt
- touchscreen-inverted-x : See touchscreen.txt
- touchscreen-inverted-y : See touchscreen.txt
- touchscreen-swapped-x-y : See touchscreen.txt
@@ -19,11 +22,11 @@ Example:
i2c@00000000 {
- zet6223: touchscreen@76 {
- compatible = "zeitec,zet6223";
- reg = <0x76>;
- interrupt-parent = <&pio>;
- interrupts = <6 11 IRQ_TYPE_EDGE_FALLING>
- };
+ zet6223: touchscreen@76 {
+ compatible = "zeitec,zet6223";
+ reg = <0x76>;
+ interrupt-parent = <&pio>;
+ interrupts = <6 11 IRQ_TYPE_EDGE_FALLING>
+ };
};
diff --git a/drivers/input/touchscreen/Kconfig b/drivers/input/touchscreen/Kconfig
index 270ce9317842..033599777651 100644
--- a/drivers/input/touchscreen/Kconfig
+++ b/drivers/input/touchscreen/Kconfig
@@ -1165,6 +1165,17 @@ config TOUCHSCREEN_TPS6507X
To compile this driver as a module, choose M here: the
module will be called tps6507x_ts.
+config TOUCHSCREEN_ZET6223
+ tristate "Zeitec ZET6223 touchscreen driver"
+ depends on I2C
+ help
+ Say Y here if you have a touchscreen using Zeitec ZET6223
+
+ If unsure, say N.
+
+ To compile this driver as a module, choose M here: the
+ module will be called zet6223.
+
config TOUCHSCREEN_ZFORCE
tristate "Neonode zForce infrared touchscreens"
depends on I2C
@@ -1202,15 +1213,4 @@ config TOUCHSCREEN_ROHM_BU21023
To compile this driver as a module, choose M here: the
module will be called bu21023_ts.
-config TOUCHSCREEN_ZET6223
- tristate "Zeitec ZET6223 touchscreen driver"
- depends on I2C
- help
- Say Y here if you have a touchscreen using Zeitec ZET6223
-
- If unsure, say N.
-
- To compile this driver as a module, choose M here: the
- module will be called zet6223.
-
endif
diff --git a/drivers/input/touchscreen/Makefile b/drivers/input/touchscreen/Makefile
index 03dc730c096c..b622e5344137 100644
--- a/drivers/input/touchscreen/Makefile
+++ b/drivers/input/touchscreen/Makefile
@@ -95,7 +95,7 @@ obj-$(CONFIG_TOUCHSCREEN_WM97XX_ZYLONITE) += zylonite-wm97xx.o
obj-$(CONFIG_TOUCHSCREEN_W90X900) += w90p910_ts.o
obj-$(CONFIG_TOUCHSCREEN_SX8654) += sx8654.o
obj-$(CONFIG_TOUCHSCREEN_TPS6507X) += tps6507x-ts.o
+obj-$(CONFIG_TOUCHSCREEN_ZET6223) += zet6223.o
obj-$(CONFIG_TOUCHSCREEN_ZFORCE) += zforce_ts.o
obj-$(CONFIG_TOUCHSCREEN_COLIBRI_VF50) += colibri-vf50-ts.o
obj-$(CONFIG_TOUCHSCREEN_ROHM_BU21023) += rohm_bu21023.o
-obj-$(CONFIG_TOUCHSCREEN_ZET6223) += zet6223.o
diff --git a/drivers/input/touchscreen/zet6223.c b/drivers/input/touchscreen/zet6223.c
index aecae06877cf..8702d31958aa 100644
--- a/drivers/input/touchscreen/zet6223.c
+++ b/drivers/input/touchscreen/zet6223.c
@@ -1,70 +1,83 @@
/*
* Copyright (C) 2016, Jelle van der Waa <jelle-oJJ1AqDjjO4@public.gmane.org>
*
- * 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 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.
+ * 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.
*/
-#include <asm/unaligned.h>
-#include <linux/gpio/consumer.h>
-#include <linux/interrupt.h>
+#include <linux/delay.h>
#include <linux/i2c.h>
#include <linux/input.h>
#include <linux/input/mt.h>
#include <linux/input/touchscreen.h>
+#include <linux/interrupt.h>
#include <linux/module.h>
+#include <linux/regulator/consumer.h>
+#include <asm/unaligned.h>
+
+#define ZET6223_MAX_FINGERS 16
+#define ZET6223_MAX_PKT_SIZE (3 + 4 * ZET6223_MAX_FINGERS)
+
+#define ZET6223_CMD_INFO 0xB2
+#define ZET6223_CMD_INFO_LENGTH 17
+#define ZET6223_VALID_PACKET 0x3c
-#define ZET6223_CMD_INFO 0xB2
-#define ZET6223_CMD_INFO_LENGTH 17
-#define ZET6223_VALID_PACKET 0x3c
+#define ZET6223_POWER_ON_DELAY_MSEC 30
-struct zet6223_data {
+struct zet6223_ts {
struct i2c_client *client;
struct input_dev *input;
+ struct regulator *vcc;
+ struct regulator *vio;
struct touchscreen_properties prop;
+ u16 max_x;
+ u16 max_y;
u8 fingernum;
};
static int zet6223_start(struct input_dev *dev)
{
- struct zet6223_data *data = input_get_drvdata(dev);
+ struct zet6223_ts *ts = input_get_drvdata(dev);
- enable_irq(data->client->irq);
+ enable_irq(ts->client->irq);
return 0;
}
static void zet6223_stop(struct input_dev *dev)
{
- struct zet6223_data *data = input_get_drvdata(dev);
+ struct zet6223_ts *ts = input_get_drvdata(dev);
- disable_irq(data->client->irq);
+ disable_irq(ts->client->irq);
}
-static irqreturn_t irqreturn_t_zet6223(int irq, void *dev_id)
+static irqreturn_t zet6223_irq(int irq, void *dev_id)
{
- struct zet6223_data *data = dev_id;
- struct device *dev = &data->client->dev;
+ struct zet6223_ts *ts = dev_id;
+ u16 finger_bits;
+
/*
* First 3 bytes are an identifier, two bytes of finger data.
* X, Y data per finger is 4 bytes.
*/
- u8 bufsize = 3 + 4 * data->fingernum;
- u8 buf[bufsize];
- u8 i;
- u16 finger_bits;
+ u8 bufsize = 3 + 4 * ts->fingernum;
+ u8 buf[ZET6223_MAX_PKT_SIZE];
+ int i;
int ret;
+ int error;
- ret = i2c_master_recv(data->client, buf, bufsize);
+ ret = i2c_master_recv(ts->client, buf, bufsize);
if (ret != bufsize) {
- dev_err_ratelimited(dev, "Error reading input data: %d\n", ret);
+ error = ret < 0 ? ret : -EIO;
+ dev_err_ratelimited(&ts->client->dev,
+ "Error reading input data: %d\n", error);
return IRQ_HANDLED;
}
@@ -72,113 +85,201 @@ static irqreturn_t irqreturn_t_zet6223(int irq, void *dev_id)
return IRQ_HANDLED;
finger_bits = get_unaligned_be16(buf + 1);
- for (i = 0; i < data->fingernum; i++) {
+ for (i = 0; i < ts->fingernum; i++) {
if (!(finger_bits & BIT(15 - i)))
continue;
- input_mt_slot(data->input, i);
- input_mt_report_slot_state(data->input, MT_TOOL_FINGER, true);
- input_event(data->input, EV_ABS, ABS_MT_POSITION_X,
+ input_mt_slot(ts->input, i);
+ input_mt_report_slot_state(ts->input, MT_TOOL_FINGER, true);
+ input_event(ts->input, EV_ABS, ABS_MT_POSITION_X,
((buf[i + 3] >> 4) << 8) + buf[i + 4]);
- input_event(data->input, EV_ABS, ABS_MT_POSITION_Y,
+ input_event(ts->input, EV_ABS, ABS_MT_POSITION_Y,
((buf[i + 3] & 0xF) << 8) + buf[i + 5]);
}
- input_mt_sync_frame(data->input);
- input_sync(data->input);
+ input_mt_sync_frame(ts->input);
+ input_sync(ts->input);
return IRQ_HANDLED;
}
-static int zet6223_probe(struct i2c_client *client,
- const struct i2c_device_id *id)
+static int zet6223_power_on(struct zet6223_ts *ts)
+{
+ int error;
+
+ if (ts->vio) {
+ error = regulator_enable(ts->vio);
+ if (error) {
+ dev_err(&ts->client->dev,
+ "failed to enable vio supply: %d\n", error);
+ return error;
+ }
+ }
+
+ if (ts->vcc) {
+ error = regulator_enable(ts->vcc);
+ if (error) {
+ dev_err(&ts->client->dev,
+ "failed to enable vcc supply: %d\n", error);
+ goto err_disable_vio;
+ }
+ }
+
+ if (ts->vio || ts->vcc)
+ msleep(ZET6223_POWER_ON_DELAY_MSEC);
+
+ return 0;
+
+err_disable_vio:
+ if (ts->vio)
+ regulator_disable(ts->vio);
+
+ return error;
+}
+
+static void zet6223_power_off(void *_ts)
+{
+ struct zet6223_ts *ts = _ts;
+
+ if (ts->vcc)
+ regulator_disable(ts->vcc);
+
+ if (ts->vio)
+ regulator_disable(ts->vio);
+}
+
+static int zet6223_query_device(struct zet6223_ts *ts)
{
- struct device *dev = &client->dev;
- struct zet6223_data *data;
- struct input_dev *input;
u8 buf[ZET6223_CMD_INFO_LENGTH];
u8 cmd = ZET6223_CMD_INFO;
int ret;
+ int error;
+
+ ret = i2c_master_send(ts->client, &cmd, sizeof(cmd));
+ if (ret != sizeof(cmd)) {
+ error = ret < 0 ? ret : -EIO;
+ dev_err(&ts->client->dev,
+ "touchpanel info cmd failed: %d\n", error);
+ return error;
+ }
+
+ ret = i2c_master_recv(ts->client, buf, sizeof(buf));
+ if (ret != sizeof(buf)) {
+ error = ret < 0 ? ret : -EIO;
+ dev_err(&ts->client->dev,
+ "failed to retrieve touchpanel info: %d\n", error);
+ return error;
+ }
+
+ ts->fingernum = buf[15] & 0x7F;
+ if (ts->fingernum > ZET6223_MAX_FINGERS) {
+ dev_warn(&ts->client->dev,
+ "touchpanel reports %d fingers, limiting to %d\n",
+ ts->fingernum, ZET6223_MAX_FINGERS);
+ ts->fingernum = 16;
+ }
+
+ ts->max_x = get_unaligned_le16(&buf[8]);
+ ts->max_y = get_unaligned_le16(&buf[10]);
+
+ return 0;
+}
+
+static int zet6223_probe(struct i2c_client *client,
+ const struct i2c_device_id *id)
+{
+ struct device *dev = &client->dev;
+ struct zet6223_ts *ts;
+ struct input_dev *input;
+ int error;
if (!client->irq) {
- dev_err(dev, "Error no irq specified\n");
+ dev_err(dev, "no irq specified\n");
return -EINVAL;
}
- data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL);
- if (!data)
+ ts = devm_kzalloc(dev, sizeof(*ts), GFP_KERNEL);
+ if (!ts)
return -ENOMEM;
- ret = i2c_master_send(client, &cmd, 1);
- if (ret < 0) {
- dev_err(dev, "touchpanel info cmd failed: %d\n", ret);
- return -ENODEV;
+ ts->client = client;
+
+ ts->vio = devm_regulator_get_optional(dev, "vio");
+ if (IS_ERR(ts->vio)) {
+ error = PTR_ERR(ts->vio);
+ dev_err(dev, "failed to get 'vio' regulator: %d\n", error);
+ return error;
}
- ret = i2c_master_recv(client, buf, ZET6223_CMD_INFO_LENGTH);
- if (ret < 0) {
- dev_err(dev, "cannot retrieve touchpanel info: %d\n", ret);
- return -ENODEV;
+ ts->vcc = devm_regulator_get_optional(dev, "vcc");
+ if (IS_ERR(ts->vcc)) {
+ error = PTR_ERR(ts->vcc);
+ dev_err(dev, "failed to get 'vcc' regulator: %d\n", error);
+ return error;
}
- data->fingernum = buf[15] & 0x7F;
- if (data->fingernum > 16) {
- data->fingernum = 16;
- dev_warn(dev, "touchpanel reports more then 16 fingers, limit to 16");
+ error = zet6223_power_on(ts);
+ if (error)
+ return error;
+
+ error = devm_add_action_or_reset(dev, zet6223_power_off, ts);
+ if (error) {
+ dev_err(dev, "failed to install poweroff action: %d\n", error);
+ return error;
}
- input = devm_input_allocate_device(dev);
+ error = zet6223_query_device(ts);
+ if (error)
+ return error;
+
+ ts->input = input = devm_input_allocate_device(dev);
if (!input)
return -ENOMEM;
- input_set_abs_params(input, ABS_MT_POSITION_X, 0,
- get_unaligned_le16(&buf[8]), 0, 0);
- input_set_abs_params(input, ABS_MT_POSITION_Y, 0,
- get_unaligned_le16(&buf[10]), 0, 0);
- touchscreen_parse_properties(input, true, &data->prop);
+ input_set_drvdata(input, ts);
input->name = client->name;
input->id.bustype = BUS_I2C;
- input->dev.parent = dev;
input->open = zet6223_start;
input->close = zet6223_stop;
- ret = input_mt_init_slots(input, data->fingernum,
- INPUT_MT_DIRECT | INPUT_MT_DROP_UNUSED);
- if (ret)
- return ret;
+ input_set_abs_params(input, ABS_MT_POSITION_X, 0, ts->max_x, 0, 0);
+ input_set_abs_params(input, ABS_MT_POSITION_Y, 0, ts->max_y, 0, 0);
- data->client = client;
- data->input = input;
+ touchscreen_parse_properties(input, true, &ts->prop);
- input_set_drvdata(input, data);
+ error = input_mt_init_slots(input, ts->fingernum,
+ INPUT_MT_DIRECT | INPUT_MT_DROP_UNUSED);
+ if (error)
+ return error;
- ret = devm_request_threaded_irq(dev, client->irq, NULL,
- irqreturn_t_zet6223, IRQF_ONESHOT, client->name, data);
- if (ret) {
- dev_err(dev, "Error requesting irq: %d\n", ret);
- return ret;
+ error = devm_request_threaded_irq(dev, client->irq, NULL, zet6223_irq,
+ IRQF_ONESHOT, client->name, ts);
+ if (error) {
+ dev_err(dev, "failed to request irq %d: %d\n",
+ client->irq, error);
+ return error;
}
zet6223_stop(input);
- ret = input_register_device(input);
- if (ret)
- return ret;
+ error = input_register_device(input);
+ if (error)
+ return error;
- i2c_set_clientdata(client, data);
+ i2c_set_clientdata(client, ts);
return 0;
}
static const struct of_device_id zet6223_of_match[] = {
- { .compatible = "zeitec", "zet6223" },
+ { .compatible = "zeitec,zet6223" },
{ }
};
static const struct i2c_device_id zet6223_id[] = {
{ "zet6223", 0},
- {}
+ { }
};
MODULE_DEVICE_TABLE(i2c, zet6223_id);
@@ -190,7 +291,6 @@ static struct i2c_driver zet6223_driver = {
.probe = zet6223_probe,
.id_table = zet6223_id
};
-
module_i2c_driver(zet6223_driver);
MODULE_AUTHOR("Jelle van der Waa <jelle-oJJ1AqDjjO4@public.gmane.org>");
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
next prev parent reply other threads:[~2017-01-14 19:14 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-12-23 16:32 [PATCH 1/2] input: touchscreen: add driver for Zeitec ZET6223 Jelle van der Waa
2016-12-23 16:32 ` [PATCH 2/2] devicetree: add vendor prefix for Zeitec Jelle van der Waa
2017-01-03 15:25 ` Rob Herring
[not found] ` <20161223163214.7716-1-jelle-oJJ1AqDjjO4@public.gmane.org>
2017-01-03 15:24 ` [PATCH 1/2] input: touchscreen: add driver for Zeitec ZET6223 Rob Herring
2017-01-14 19:14 ` Dmitry Torokhov [this message]
2017-01-18 20:57 ` Jelle van der Waa
2017-01-18 22:49 ` Dmitry Torokhov
2017-01-31 8:19 ` Dmitry Torokhov
2017-02-01 19:10 ` Jelle van der Waa
[not found] ` <20170201191058.GA8453-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2017-02-01 19:20 ` Dmitry Torokhov
2017-02-01 19:23 ` Dmitry Torokhov
2017-02-01 19:30 ` Dmitry Torokhov
2017-02-01 19:35 ` Jelle van der Waa
[not found] ` <20170201193554.GB8453-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2017-02-01 22:47 ` Dmitry Torokhov
2017-02-09 21:38 ` Dmitry Torokhov
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=20170114191425.GA31309@dtor-ws \
--to=dmitry.torokhov-re5jqeeqqe8avxtiumwx3w@public.gmane.org \
--cc=devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=jelle-oJJ1AqDjjO4@public.gmane.org \
--cc=linux-input-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=robh+dt-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.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.