All of lore.kernel.org
 help / color / mirror / Atom feed
From: Matt Ranostay <mranostay@gmail.com>
To: galak@codeaurora.org, linux-input@vger.kernel.org,
	linux-kernel@vger.kernel.org, dmitry.torokhov@gmail.com,
	zonque@gmail.com, robh+dt@kernel.org
Cc: devicetree@vger.kernel.org, Matt Ranostay <mranostay@gmail.com>
Subject: [PATCH 1/3] cap1106: Add support for various cap11xx devices
Date: Sat, 20 Sep 2014 20:01:07 -0700	[thread overview]
Message-ID: <1411268469-21283-2-git-send-email-mranostay@gmail.com> (raw)
In-Reply-To: <1411268469-21283-1-git-send-email-mranostay@gmail.com>

Several other variants of the cap11xx device exists with a varying
number of capacitance detection channels. Add support for creating
the channels dynamically.

Signed-off-by: Matt Ranostay <mranostay@gmail.com>
---
 drivers/input/keyboard/cap1106.c | 54 +++++++++++++++++++---------------------
 1 file changed, 26 insertions(+), 28 deletions(-)

diff --git a/drivers/input/keyboard/cap1106.c b/drivers/input/keyboard/cap1106.c
index d70b65a..b9c43b5 100644
--- a/drivers/input/keyboard/cap1106.c
+++ b/drivers/input/keyboard/cap1106.c
@@ -55,8 +55,6 @@
 #define CAP1106_REG_MANUFACTURER_ID	0xfe
 #define CAP1106_REG_REVISION		0xff
 
-#define CAP1106_NUM_CHN 6
-#define CAP1106_PRODUCT_ID	0x55
 #define CAP1106_MANUFACTURER_ID	0x5d
 
 struct cap1106_priv {
@@ -64,7 +62,8 @@ struct cap1106_priv {
 	struct input_dev *idev;
 
 	/* config */
-	unsigned short keycodes[CAP1106_NUM_CHN];
+	u32 *keycodes;
+	unsigned int num_channels;
 };
 
 static const struct reg_default cap1106_reg_defaults[] = {
@@ -151,7 +150,7 @@ static irqreturn_t cap1106_thread_func(int irq_num, void *data)
 	if (ret < 0)
 		goto out;
 
-	for (i = 0; i < CAP1106_NUM_CHN; i++)
+	for (i = 0; i < priv->num_channels; i++)
 		input_report_key(priv->idev, priv->keycodes[i],
 				 status & (1 << i));
 
@@ -189,27 +188,23 @@ static int cap1106_i2c_probe(struct i2c_client *i2c_client,
 	struct cap1106_priv *priv;
 	struct device_node *node;
 	int i, error, irq, gain = 0;
-	unsigned int val, rev;
-	u32 gain32, keycodes[CAP1106_NUM_CHN];
+	unsigned int val, prod, rev;
+	u32 gain32;
 
 	priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
 	if (!priv)
 		return -ENOMEM;
 
+	priv->num_channels = (unsigned long) id->driver_data;
+	priv->keycodes = devm_kzalloc(dev,
+		sizeof(u32) * priv->num_channels, GFP_KERNEL);
+	if (!priv->keycodes)
+		return -ENOMEM;
+
 	priv->regmap = devm_regmap_init_i2c(i2c_client, &cap1106_regmap_config);
 	if (IS_ERR(priv->regmap))
 		return PTR_ERR(priv->regmap);
 
-	error = regmap_read(priv->regmap, CAP1106_REG_PRODUCT_ID, &val);
-	if (error)
-		return error;
-
-	if (val != CAP1106_PRODUCT_ID) {
-		dev_err(dev, "Product ID: Got 0x%02x, expected 0x%02x\n",
-			val, CAP1106_PRODUCT_ID);
-		return -ENODEV;
-	}
-
 	error = regmap_read(priv->regmap, CAP1106_REG_MANUFACTURER_ID, &val);
 	if (error)
 		return error;
@@ -220,6 +215,10 @@ static int cap1106_i2c_probe(struct i2c_client *i2c_client,
 		return -ENODEV;
 	}
 
+	error = regmap_read(priv->regmap, CAP1106_REG_PRODUCT_ID, &prod);
+	if (error < 0)
+		return error;
+
 	error = regmap_read(priv->regmap, CAP1106_REG_REVISION, &rev);
 	if (error < 0)
 		return error;
@@ -235,17 +234,12 @@ static int cap1106_i2c_probe(struct i2c_client *i2c_client,
 			dev_err(dev, "Invalid sensor-gain value %d\n", gain32);
 	}
 
-	BUILD_BUG_ON(ARRAY_SIZE(keycodes) != ARRAY_SIZE(priv->keycodes));
-
 	/* Provide some useful defaults */
-	for (i = 0; i < ARRAY_SIZE(keycodes); i++)
-		keycodes[i] = KEY_A + i;
+	for (i = 0; i < priv->num_channels; i++)
+		priv->keycodes[i] = KEY_A + i;
 
 	of_property_read_u32_array(node, "linux,keycodes",
-				   keycodes, ARRAY_SIZE(keycodes));
-
-	for (i = 0; i < ARRAY_SIZE(keycodes); i++)
-		priv->keycodes[i] = keycodes[i];
+				  priv->keycodes, priv->num_channels);
 
 	error = regmap_update_bits(priv->regmap, CAP1106_REG_MAIN_CONTROL,
 				   CAP1106_REG_MAIN_CONTROL_GAIN_MASK,
@@ -269,17 +263,17 @@ static int cap1106_i2c_probe(struct i2c_client *i2c_client,
 	if (of_property_read_bool(node, "autorepeat"))
 		__set_bit(EV_REP, priv->idev->evbit);
 
-	for (i = 0; i < CAP1106_NUM_CHN; i++)
+	for (i = 0; i < priv->num_channels; i++)
 		__set_bit(priv->keycodes[i], priv->idev->keybit);
 
 	__clear_bit(KEY_RESERVED, priv->idev->keybit);
 
 	priv->idev->keycode = priv->keycodes;
 	priv->idev->keycodesize = sizeof(priv->keycodes[0]);
-	priv->idev->keycodemax = ARRAY_SIZE(priv->keycodes);
+	priv->idev->keycodemax = priv->num_channels;
 
 	priv->idev->id.vendor = CAP1106_MANUFACTURER_ID;
-	priv->idev->id.product = CAP1106_PRODUCT_ID;
+	priv->idev->id.product = prod;
 	priv->idev->id.version = rev;
 
 	priv->idev->open = cap1106_input_open;
@@ -313,12 +307,16 @@ static int cap1106_i2c_probe(struct i2c_client *i2c_client,
 
 static const struct of_device_id cap1106_dt_ids[] = {
 	{ .compatible = "microchip,cap1106", },
+	{ .compatible = "microchip,cap1126", },
+	{ .compatible = "microchip,cap1188", },
 	{}
 };
 MODULE_DEVICE_TABLE(of, cap1106_dt_ids);
 
 static const struct i2c_device_id cap1106_i2c_ids[] = {
-	{ "cap1106", 0 },
+	{ "cap1106", 6 },
+	{ "cap1126", 6 },
+	{ "cap1188", 8 },
 	{}
 };
 MODULE_DEVICE_TABLE(i2c, cap1106_i2c_ids);
-- 
1.9.1


  reply	other threads:[~2014-09-21  3:00 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-09-21  3:01 [PATCH 0/3] cap1106: add support for cap11xx variants Matt Ranostay
2014-09-21  3:01 ` Matt Ranostay
2014-09-21  3:01 ` Matt Ranostay [this message]
2014-09-21  9:58   ` [PATCH 1/3] cap1106: Add support for various cap11xx devices Daniel Mack
     [not found]     ` <541EA149.5000408-cYrQPVfZoowdnm+yROfE0A@public.gmane.org>
2014-09-21 22:46       ` Matt Ranostay
2014-09-21 22:46         ` Matt Ranostay
2014-09-22  7:36         ` Daniel Mack
2014-09-22  0:28     ` Matt Ranostay
2014-09-22  5:59       ` Dmitry Torokhov
2014-09-21 10:53   ` Daniel Mack
2014-09-21  3:01 ` [PATCH 2/3] cap1106: support for active-high interrupt option Matt Ranostay
2014-09-21 10:06   ` Daniel Mack
2014-09-22  5:56     ` Dmitry Torokhov
2014-09-22  7:44       ` Daniel Mack
2014-09-21  3:01 ` [PATCH 3/3] dt: cap1106 active-high property addition Matt Ranostay

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=1411268469-21283-2-git-send-email-mranostay@gmail.com \
    --to=mranostay@gmail.com \
    --cc=devicetree@vger.kernel.org \
    --cc=dmitry.torokhov@gmail.com \
    --cc=galak@codeaurora.org \
    --cc=linux-input@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=robh+dt@kernel.org \
    --cc=zonque@gmail.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.