All of lore.kernel.org
 help / color / mirror / Atom feed
From: Lukasz Majewski <lukma@denx.de>
To: Lee Jones <lee.jones@linaro.org>
Cc: linux-kernel@vger.kernel.org,
	Dmitry Torokhov <dmitry.torokhov@gmail.com>,
	Sascha Hauer <s.hauer@pengutronix.de>,
	Enrico Weigelt <info@metux.net>,
	Thomas Gleixner <tglx@linutronix.de>,
	Kate Stewart <kstewart@linuxfoundation.org>,
	linux-input@vger.kernel.org, Lukasz Majewski <lukma@denx.de>
Subject: [PATCH v4 3/3] input: touchscreen mc13xxx: Add mc34708 support
Date: Thu, 18 Jul 2019 00:26:02 +0200	[thread overview]
Message-ID: <20190717222602.2912-4-lukma@denx.de> (raw)
In-Reply-To: <20190717222602.2912-1-lukma@denx.de>

From: Sascha Hauer <s.hauer@pengutronix.de>

The mc34708 has a different bit to enable pen detection. This
adds the driver data and devtype necessary to probe the device
and to distinguish between the mc13783 and the mc34708.

Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Signed-off-by: Lukasz Majewski <lukma@denx.de>
Acked-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>

---
Changes for v4:
- Remove type from struct mc13xx_chip
- Add Acked-by from Dmitry

Changes for v3:
- Replace forward declaration of mc13xxx_driver_data with
  structure definition
- Rename mc13xxx_driver_data with mc13xxx_chip
- Move static struct mc13xxx_chip mc13783_chip and mc34708_chip
  closer to ID table
- Do not check mc13xxx device type

Changes for v2:
- Change nested if statements to a single one (with cr0 > ...)
- Replace hardcoded max resistance value (4080) with a generic driver data
  value.
- Introduce new include/linux/mfd/mc34708.h header file for mc34708 specific
  defines
- Define as driver data mask and value for accessing mc13xxx registers

Changes from the original patch:
- Simplify the mcXXXXX_set_pen_detection functions
- Fix checkpatch warnings
---
 drivers/input/touchscreen/mc13783_ts.c | 48 +++++++++++++++++++++++++++++++---
 1 file changed, 44 insertions(+), 4 deletions(-)

diff --git a/drivers/input/touchscreen/mc13783_ts.c b/drivers/input/touchscreen/mc13783_ts.c
index edd49e44e0c9..1dd8ed396225 100644
--- a/drivers/input/touchscreen/mc13783_ts.c
+++ b/drivers/input/touchscreen/mc13783_ts.c
@@ -10,6 +10,7 @@
  */
 #include <linux/platform_device.h>
 #include <linux/mfd/mc13783.h>
+#include <linux/mfd/mc34708.h>
 #include <linux/kernel.h>
 #include <linux/module.h>
 #include <linux/input.h>
@@ -30,6 +31,12 @@ MODULE_PARM_DESC(sample_tolerance,
 		"is supposed to be wrong and is discarded.  Set to 0 to "
 		"disable this check.");
 
+struct mc13xxx_chip {
+	int max_resistance;
+	u32 reg_mask;
+	u32 reg_value;
+};
+
 struct mc13783_ts_priv {
 	struct input_dev *idev;
 	struct mc13xxx *mc13xxx;
@@ -37,6 +44,7 @@ struct mc13783_ts_priv {
 	unsigned int sample[4];
 	u8 ato;
 	bool atox;
+	const struct mc13xxx_chip *chip;
 };
 
 static irqreturn_t mc13783_ts_handler(int irq, void *data)
@@ -93,6 +101,9 @@ static void mc13783_ts_report_sample(struct mc13783_ts_priv *priv)
 
 	cr0 = (cr0 + cr1) / 2;
 
+	if (cr0 > priv->chip->max_resistance)
+		cr0 = 0;
+
 	if (!cr0 || !sample_tolerance ||
 			(x2 - x0 < sample_tolerance &&
 			 y2 - y0 < sample_tolerance)) {
@@ -102,14 +113,14 @@ static void mc13783_ts_report_sample(struct mc13783_ts_priv *priv)
 			input_report_abs(idev, ABS_Y, y1);
 
 			dev_dbg(&idev->dev, "report (%d, %d, %d)\n",
-					x1, y1, 0x1000 - cr0);
+				x1, y1, priv->chip->max_resistance - cr0);
 			schedule_delayed_work(&priv->work, HZ / 50);
 		} else {
 			dev_dbg(&idev->dev, "report release\n");
 		}
 
 		input_report_abs(idev, ABS_PRESSURE,
-				cr0 ? 0x1000 - cr0 : cr0);
+				 cr0 ? priv->chip->max_resistance - cr0 : 0);
 		input_report_key(idev, BTN_TOUCH, cr0);
 		input_sync(idev);
 	} else {
@@ -146,7 +157,8 @@ static int mc13783_ts_open(struct input_dev *dev)
 		goto out;
 
 	ret = mc13xxx_reg_rmw(priv->mc13xxx, MC13XXX_ADC0,
-			MC13XXX_ADC0_TSMOD_MASK, MC13XXX_ADC0_TSMOD0);
+			      priv->chip->reg_mask,
+			      priv->chip->reg_value);
 	if (ret)
 		mc13xxx_irq_free(priv->mc13xxx, MC13XXX_IRQ_TS, priv);
 out:
@@ -160,7 +172,7 @@ static void mc13783_ts_close(struct input_dev *dev)
 
 	mc13xxx_lock(priv->mc13xxx);
 	mc13xxx_reg_rmw(priv->mc13xxx, MC13XXX_ADC0,
-			MC13XXX_ADC0_TSMOD_MASK, 0);
+			priv->chip->reg_mask, 0);
 	mc13xxx_irq_free(priv->mc13xxx, MC13XXX_IRQ_TS, priv);
 	mc13xxx_unlock(priv->mc13xxx);
 
@@ -172,6 +184,7 @@ static int __init mc13783_ts_probe(struct platform_device *pdev)
 	struct mc13783_ts_priv *priv;
 	struct mc13xxx_ts_platform_data *pdata = dev_get_platdata(&pdev->dev);
 	struct input_dev *idev;
+	const struct platform_device_id *id = platform_get_device_id(pdev);
 	int ret = -ENOMEM;
 
 	priv = kzalloc(sizeof(*priv), GFP_KERNEL);
@@ -182,6 +195,7 @@ static int __init mc13783_ts_probe(struct platform_device *pdev)
 	INIT_DELAYED_WORK(&priv->work, mc13783_ts_work);
 	priv->mc13xxx = dev_get_drvdata(pdev->dev.parent);
 	priv->idev = idev;
+	priv->chip = (void *)id->driver_data;
 
 	if (pdata) {
 		priv->atox = pdata->atox;
@@ -228,7 +242,33 @@ static int mc13783_ts_remove(struct platform_device *pdev)
 	return 0;
 }
 
+static struct mc13xxx_chip mc13783_chip = {
+	.max_resistance = 4096,
+	.reg_mask = MC13XXX_ADC0_TSMOD_MASK,
+	.reg_value = MC13XXX_ADC0_TSMOD0,
+};
+
+static struct mc13xxx_chip mc34708_chip = {
+	.max_resistance = 4080,
+	.reg_mask = MC34708_ADC0_TSMASK,
+	.reg_value = MC34708_ADC0_TSPENDETEN,
+};
+
+static const struct platform_device_id mc13xxx_ts_idtable[] = {
+	{
+		.name = "mc13783-ts",
+		.driver_data = (kernel_ulong_t)&mc13783_chip,
+	}, {
+		.name = "mc34708-ts",
+		.driver_data = (kernel_ulong_t)&mc34708_chip,
+	}, {
+		/* sentinel */
+	}
+};
+MODULE_DEVICE_TABLE(platform, mc13xxx_ts_idtable);
+
 static struct platform_driver mc13783_ts_driver = {
+	.id_table	= mc13xxx_ts_idtable,
 	.remove		= mc13783_ts_remove,
 	.driver		= {
 		.name	= MC13783_TS_NAME,
-- 
2.11.0


      parent reply	other threads:[~2019-07-17 22:26 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-07-17 22:25 [PATCH v4 0/3] mfd: mc13xxx: Fixes and enhancements for NXP's mc34708 Lukasz Majewski
2019-07-17 22:26 ` [PATCH v4 1/3] mfd: mc13xxx: Add mc34708 adc support Lukasz Majewski
2019-07-25 12:36   ` Lee Jones
2019-07-25 16:20     ` Lukasz Majewski
2019-08-02 13:19       ` Lukasz Majewski
2019-08-12 10:08       ` Lee Jones
2019-07-17 22:26 ` [PATCH v4 2/3] input: touchscreen mc13xxx: Make platform data optional Lukasz Majewski
2019-07-17 22:26 ` Lukasz Majewski [this message]

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=20190717222602.2912-4-lukma@denx.de \
    --to=lukma@denx.de \
    --cc=dmitry.torokhov@gmail.com \
    --cc=info@metux.net \
    --cc=kstewart@linuxfoundation.org \
    --cc=lee.jones@linaro.org \
    --cc=linux-input@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=s.hauer@pengutronix.de \
    --cc=tglx@linutronix.de \
    /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.