Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1508470 > unrolled thread

[PATCHv6 00/11] i2c: Relax mandatory I2C ID table passing

Started byKieran Bingham <kieran@ksquared.org.uk>
First post2016-10-25 18:50 +0200
Last post2016-10-25 18:50 +0200
Articles 4 — 1 participant

Back to article view | Back to linux.kernel


Contents

  [PATCHv6 00/11] i2c: Relax mandatory I2C ID table passing Kieran Bingham <kieran@ksquared.org.uk> - 2016-10-25 18:50 +0200
    [PATCHv6 02/11] i2c: Add the ability to match device to compatible string without an of_node Kieran Bingham <kieran@ksquared.org.uk> - 2016-10-25 18:50 +0200
    [PATCHv6 10/11] mfd: as3722: Rid driver of superfluous I2C device ID structure Kieran Bingham <kieran@ksquared.org.uk> - 2016-10-25 18:50 +0200
    [PATCHv6 01/11] i2c: Add pointer dereference protection to i2c_match_id() Kieran Bingham <kieran@ksquared.org.uk> - 2016-10-25 18:50 +0200

#1508470 — [PATCHv6 00/11] i2c: Relax mandatory I2C ID table passing

FromKieran Bingham <kieran@ksquared.org.uk>
Date2016-10-25 18:50 +0200
Subject[PATCHv6 00/11] i2c: Relax mandatory I2C ID table passing
Message-ID<swd5f-8aC-3@gated-at.bofh.it>
Version 6 of this patchset adds two new patches on top of the existing
submission to resolve the (final?) pending question from the previous
discussions during v5 [0]. Javier's tags are also collected here.

In particular, the remaining issue was that a user could provide a full
vendor prefixed string to the sysfs interface to instantiate an i2c
device. In version 5 of this submission this would not have matched
against a device driver as highlighted by the test patch provided by
Wolfram.

As such, in this series I have extended i2c_of_match_device_strip_vendor
so that it will also perform a search against a full compatible string
for the matching process. This was not done by the core OF framework as
the sysfs interface does not create an of_node to match against. If so
desired, this function could now be renamed to i2c_of_match_device_sysfs

Patch 11/11 of this series brings back Wolframs test case (correctly this
time) and also serves as a demonstration as to how to map the ID's when
matched against an of-style node. Note that this patch is *not* signed
off and not suitable for integration.

[0] [PATCHv5 0/8] 2c: Relax mandatory I2C ID table passing
    https://lkml.org/lkml/2016/5/4/534

Kieran Bingham (3):
  i2c: match dt-style device names from sysfs interface
  i2c: match vendorless strings on the internal string length
  [TESTPATCH] rtc: convert ds1307 to interim probe_new

Lee Jones (8):
  i2c: Add pointer dereference protection to i2c_match_id()
  i2c: Add the ability to match device to compatible string without an
    of_node
  i2c: Match using traditional OF methods, then by vendor-less
    compatible strings
  i2c: Make I2C ID tables non-mandatory for DT'ed devices
  i2c: Export i2c_match_id() for direct use by device drivers
  i2c: Provide a temporary .probe_new() call-back type
  mfd: 88pm860x: Move over to new I2C device .probe() call
  mfd: as3722: Rid driver of superfluous I2C device ID structure

 drivers/i2c/i2c-core.c      | 85 ++++++++++++++++++++++++++++++++++++++++-----
 drivers/mfd/88pm860x-core.c |  5 ++-
 drivers/mfd/as3722.c        | 12 ++-----
 drivers/rtc/rtc-ds1307.c    | 53 ++++++++++++++++------------
 include/linux/i2c.h         | 22 +++++++++++-
 5 files changed, 132 insertions(+), 45 deletions(-)

-- 
2.7.4

[toc] | [next] | [standalone]


#1508473 — [PATCHv6 02/11] i2c: Add the ability to match device to compatible string without an of_node

FromKieran Bingham <kieran@ksquared.org.uk>
Date2016-10-25 18:50 +0200
Subject[PATCHv6 02/11] i2c: Add the ability to match device to compatible string without an of_node
Message-ID<swd5h-8aC-55@gated-at.bofh.it>
In reply to#1508470
From: Lee Jones <lee.jones@linaro.org>

A great deal of I2C devices are currently matched via DT node name, and
as such the compatible naming convention of '<vendor>,<device>' has gone
somewhat awry - some nodes don't supply one, some supply an arbitrary
string and others the correct device name with an arbitrary vendor prefix.

In an effort to correct this problem we have to supply a mechanism to
match a device by compatible string AND by simple device name.  This
function strips off the '<vendor>,' part of a supplied compatible string
and attempts to match without it.

The plan is to remove this function once all of the compatible strings
for each device have been brought into line.

Acked-by: Grant Likely <grant.likely@linaro.org>
Signed-off-by: Lee Jones <lee.jones@linaro.org>
[Kieran: strnicmp to strncasecmp]
Tested-by: Kieran Bingham <kieran@bingham.xyz>
Reviewed-by: Javier Martinez Canillas <javier@osg.samsung.com>
Tested-by: Javier Martinez Canillas <javier@osg.samsung.com>
Signed-off-by: Kieran Bingham <kieran@bingham.xyz>
---
 drivers/i2c/i2c-core.c | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)

diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c
index eec4d4d81bf8..a699ca541702 100644
--- a/drivers/i2c/i2c-core.c
+++ b/drivers/i2c/i2c-core.c
@@ -1666,6 +1666,27 @@ struct i2c_adapter *of_get_i2c_adapter_by_node(struct device_node *node)
 	return adapter;
 }
 EXPORT_SYMBOL(of_get_i2c_adapter_by_node);
+
+static const struct of_device_id*
+i2c_of_match_device_strip_vendor(const struct of_device_id *matches,
+				  struct i2c_client *client)
+{
+	const char *name;
+
+	for (; matches->compatible[0]; matches++) {
+		name = strchr(matches->compatible, ',');
+		if (!name)
+			name = matches->compatible;
+		else
+			name++;
+
+		if (!strncasecmp(client->name, name, strlen(client->name)))
+			return matches;
+	}
+
+	return NULL;
+}
+
 #else
 static void of_i2c_register_devices(struct i2c_adapter *adap) { }
 #endif /* CONFIG_OF */
-- 
2.7.4

[toc] | [prev] | [next] | [standalone]


#1508476 — [PATCHv6 10/11] mfd: as3722: Rid driver of superfluous I2C device ID structure

FromKieran Bingham <kieran@ksquared.org.uk>
Date2016-10-25 18:50 +0200
Subject[PATCHv6 10/11] mfd: as3722: Rid driver of superfluous I2C device ID structure
Message-ID<swd5h-8aC-59@gated-at.bofh.it>
In reply to#1508470
From: Lee Jones <lee.jones@linaro.org>

Also remove unused second probe() parameter 'i2c_device_id'.

Acked-by: Grant Likely <grant.likely@linaro.org>
Signed-off-by: Lee Jones <lee.jones@linaro.org>
Signed-off-by: Kieran Bingham <kieran@bingham.xyz>

---
Changes since v4
 - Rename .probe2 to probe_new
---
 drivers/mfd/as3722.c | 12 ++----------
 1 file changed, 2 insertions(+), 10 deletions(-)

diff --git a/drivers/mfd/as3722.c b/drivers/mfd/as3722.c
index f87342c211bc..7d8c5e4136e2 100644
--- a/drivers/mfd/as3722.c
+++ b/drivers/mfd/as3722.c
@@ -354,8 +354,7 @@ static int as3722_i2c_of_probe(struct i2c_client *i2c,
 	return 0;
 }
 
-static int as3722_i2c_probe(struct i2c_client *i2c,
-			const struct i2c_device_id *id)
+static int as3722_i2c_probe(struct i2c_client *i2c)
 {
 	struct as3722 *as3722;
 	unsigned long irq_flags;
@@ -441,12 +440,6 @@ static const struct of_device_id as3722_of_match[] = {
 };
 MODULE_DEVICE_TABLE(of, as3722_of_match);
 
-static const struct i2c_device_id as3722_i2c_id[] = {
-	{ "as3722", 0 },
-	{},
-};
-MODULE_DEVICE_TABLE(i2c, as3722_i2c_id);
-
 static const struct dev_pm_ops as3722_pm_ops = {
 	SET_SYSTEM_SLEEP_PM_OPS(as3722_i2c_suspend, as3722_i2c_resume)
 };
@@ -457,8 +450,7 @@ static struct i2c_driver as3722_i2c_driver = {
 		.of_match_table = as3722_of_match,
 		.pm = &as3722_pm_ops,
 	},
-	.probe = as3722_i2c_probe,
-	.id_table = as3722_i2c_id,
+	.probe_new = as3722_i2c_probe,
 };
 
 module_i2c_driver(as3722_i2c_driver);
-- 
2.7.4

[toc] | [prev] | [next] | [standalone]


#1508477 — [PATCHv6 01/11] i2c: Add pointer dereference protection to i2c_match_id()

FromKieran Bingham <kieran@ksquared.org.uk>
Date2016-10-25 18:50 +0200
Subject[PATCHv6 01/11] i2c: Add pointer dereference protection to i2c_match_id()
Message-ID<swd5h-8aC-63@gated-at.bofh.it>
In reply to#1508470
From: Lee Jones <lee.jones@linaro.org>

Here we're providing dereference protection for i2c_match_id(), which
saves us having to do it each time it's called.  We're also stripping
out the (now) needless checks in i2c_device_match().  This patch paves
the way for other, similar code trimming.

Acked-by: Grant Likely <grant.likely@linaro.org>
Signed-off-by: Lee Jones <lee.jones@linaro.org>
Tested-by: Kieran Bingham <kieran@bingham.xyz>
Reviewed-by: Javier Martinez Canillas <javier@osg.samsung.com>
Tested-by: Javier Martinez Canillas <javier@osg.samsung.com>
Signed-off-by: Kieran Bingham <kieran@bingham.xyz>
---
 drivers/i2c/i2c-core.c | 12 +++++++-----
 1 file changed, 7 insertions(+), 5 deletions(-)

diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c
index da3a02ef4a31..eec4d4d81bf8 100644
--- a/drivers/i2c/i2c-core.c
+++ b/drivers/i2c/i2c-core.c
@@ -589,6 +589,9 @@ static inline int acpi_i2c_install_space_handler(struct i2c_adapter *adapter)
 static const struct i2c_device_id *i2c_match_id(const struct i2c_device_id *id,
 						const struct i2c_client *client)
 {
+	if (!(id && client))
+		return NULL;
+
 	while (id->name[0]) {
 		if (strcmp(client->name, id->name) == 0)
 			return id;
@@ -602,8 +605,6 @@ static int i2c_device_match(struct device *dev, struct device_driver *drv)
 	struct i2c_client	*client = i2c_verify_client(dev);
 	struct i2c_driver	*driver;
 
-	if (!client)
-		return 0;
 
 	/* Attempt an OF style match */
 	if (of_driver_match_device(dev, drv))
@@ -614,9 +615,10 @@ static int i2c_device_match(struct device *dev, struct device_driver *drv)
 		return 1;
 
 	driver = to_i2c_driver(drv);
-	/* match on an id table if there is one */
-	if (driver->id_table)
-		return i2c_match_id(driver->id_table, client) != NULL;
+
+	/* Finally an I2C match */
+	if (i2c_match_id(driver->id_table, client))
+		return 1;
 
 	return 0;
 }
-- 
2.7.4

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web