linuxppc-dev.lists.ozlabs.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/3] i2c: Use the standard, alias-based device/driver matching scheme
@ 2008-01-21 10:25 Jean Delvare
  2008-01-21 10:39 ` [PATCH 1/3] i2c: Add support for device alias names Jean Delvare
                   ` (3 more replies)
  0 siblings, 4 replies; 11+ messages in thread
From: Jean Delvare @ 2008-01-21 10:25 UTC (permalink / raw)
  To: Linux I2C; +Cc: David Brownell, linuxppc-dev

Hi all,

Here comes a patch set, based on earlier work by Jon Smirl, that
updates the i2c subsystem to support and use the standard, alias-based
device/driver matching scheme that most other subsystems are using.
Contrary to Jon's patch set, this one only supports Linux names and not
OF names, although it might be added later (just not sure how exactly.)

Patch 1/3 adds support for this standard matching scheme, patch 2/3
converts all the in-tree drivers to make use of it, and patch 3/3
removes the old driver_name/type matching scheme that has no users left
at this point.

This new approach makes the i2c device drivers smaller in general
(because the name matching code moved to i2c-core), the exception being
drivers which support only one device, for which the device ID table
adds a small overhead (88 bytes on x86_64).

The key benefit compared to the original matching scheme is that
platform code no longer needs to know which driver supports which
device. This means that support for a given device can move from one
driver to another without changing the platform code.

Note: all the arm and powerpc stuff is untested.

-- 
Jean Delvare

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [PATCH 1/3] i2c: Add support for device alias names
  2008-01-21 10:25 [PATCH 0/3] i2c: Use the standard, alias-based device/driver matching scheme Jean Delvare
@ 2008-01-21 10:39 ` Jean Delvare
  2008-01-21 10:41 ` [PATCH 2/3] i2c: Convert all new-style drivers to use module aliasing Jean Delvare
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 11+ messages in thread
From: Jean Delvare @ 2008-01-21 10:39 UTC (permalink / raw)
  To: Linux I2C; +Cc: David Brownell, linuxppc-dev

Based on earlier work by Jon Smirl.

This patch allows new-style i2c chip drivers to have alias names using
the official kernel aliasing system and MODULE_DEVICE_TABLE(). At this
point, the old i2c driver binding scheme (driver_name/type) is still
supported.

Signed-off-by: Jean Delvare <khali@linux-fr.org>
Cc: Jon Smirl <jonsmirl@gmail.com>
---
 drivers/hwmon/f75375s.c         |    8 +++---
 drivers/i2c/chips/ds1682.c      |    3 +-
 drivers/i2c/chips/menelaus.c    |    3 +-
 drivers/i2c/chips/tps65010.c    |    3 +-
 drivers/i2c/chips/tsl2550.c     |    3 +-
 drivers/i2c/i2c-core.c          |   50 +++++++++++++++++++++++++++++++--------
 drivers/rtc/rtc-ds1307.c        |    3 +-
 drivers/rtc/rtc-ds1374.c        |    3 +-
 drivers/rtc/rtc-m41t80.c        |    3 +-
 drivers/rtc/rtc-rs5c372.c       |    3 +-
 include/linux/i2c.h             |    5 +--
 include/linux/mod_devicetable.h |   13 ++++++++++
 scripts/mod/file2alias.c        |   13 ++++++++++
 13 files changed, 90 insertions(+), 23 deletions(-)


--- linux-2.6.24-rc8.orig/drivers/hwmon/f75375s.c	2008-01-21 08:47:05.000000000 +0100
+++ linux-2.6.24-rc8/drivers/hwmon/f75375s.c	2008-01-21 09:12:25.000000000 +0100
@@ -117,7 +117,8 @@ struct f75375_data {
 static int f75375_attach_adapter(struct i2c_adapter *adapter);
 static int f75375_detect(struct i2c_adapter *adapter, int address, int kind);
 static int f75375_detach_client(struct i2c_client *client);
-static int f75375_probe(struct i2c_client *client);
+static int f75375_probe(struct i2c_client *client,
+			const struct i2c_device_id* id);
 static int f75375_remove(struct i2c_client *client);
 
 static struct i2c_driver f75375_legacy_driver = {
@@ -628,7 +629,8 @@ static void f75375_init(struct i2c_clien
 
 }
 
-static int f75375_probe(struct i2c_client *client)
+static int f75375_probe(struct i2c_client *client,
+		const struct i2c_device_id *id)
 {
 	struct f75375_data *data = i2c_get_clientdata(client);
 	struct f75375s_platform_data *f75375s_pdata = client->dev.platform_data;
@@ -748,7 +750,7 @@ static int f75375_detect(struct i2c_adap
 	if ((err = i2c_attach_client(client)))
 		goto exit_free;
 
-	if ((err = f75375_probe(client)) < 0)
+	if ((err = f75375_probe(client, NULL)) < 0)
 		goto exit_detach;
 
 	return 0;
--- linux-2.6.24-rc8.orig/drivers/i2c/chips/ds1682.c	2008-01-21 08:47:05.000000000 +0100
+++ linux-2.6.24-rc8/drivers/i2c/chips/ds1682.c	2008-01-21 09:12:25.000000000 +0100
@@ -200,7 +200,8 @@ static struct bin_attribute ds1682_eepro
 /*
  * Called when a ds1682 device is matched with this driver
  */
-static int ds1682_probe(struct i2c_client *client)
+static int ds1682_probe(struct i2c_client *client,
+			const struct i2c_device_id *id)
 {
 	int rc;
 
--- linux-2.6.24-rc8.orig/drivers/i2c/chips/menelaus.c	2008-01-21 08:47:05.000000000 +0100
+++ linux-2.6.24-rc8/drivers/i2c/chips/menelaus.c	2008-01-21 09:12:25.000000000 +0100
@@ -1149,7 +1149,8 @@ static inline void menelaus_rtc_init(str
 
 static struct i2c_driver menelaus_i2c_driver;
 
-static int menelaus_probe(struct i2c_client *client)
+static int menelaus_probe(struct i2c_client *client,
+			  const struct i2c_device_id *id)
 {
 	struct menelaus_chip	*menelaus;
 	int			rev = 0, val;
--- linux-2.6.24-rc8.orig/drivers/i2c/chips/tps65010.c	2008-01-21 08:47:05.000000000 +0100
+++ linux-2.6.24-rc8/drivers/i2c/chips/tps65010.c	2008-01-21 09:12:25.000000000 +0100
@@ -465,7 +465,8 @@ static int __exit tps65010_remove(struct
 	return 0;
 }
 
-static int tps65010_probe(struct i2c_client *client)
+static int tps65010_probe(struct i2c_client *client,
+			  const struct i2c_device_id *id)
 {
 	struct tps65010		*tps;
 	int			status;
--- linux-2.6.24-rc8.orig/drivers/i2c/chips/tsl2550.c	2008-01-21 08:47:05.000000000 +0100
+++ linux-2.6.24-rc8/drivers/i2c/chips/tsl2550.c	2008-01-21 09:12:25.000000000 +0100
@@ -364,7 +364,8 @@ static int tsl2550_init_client(struct i2
  */
 
 static struct i2c_driver tsl2550_driver;
-static int __devinit tsl2550_probe(struct i2c_client *client)
+static int __devinit tsl2550_probe(struct i2c_client *client,
+				   const struct i2c_device_id *id)
 {
 	struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent);
 	struct tsl2550_data *data;
--- linux-2.6.24-rc8.orig/drivers/i2c/i2c-core.c	2008-01-21 08:47:05.000000000 +0100
+++ linux-2.6.24-rc8/drivers/i2c/i2c-core.c	2008-01-21 09:12:25.000000000 +0100
@@ -48,6 +48,17 @@ static DEFINE_IDR(i2c_adapter_idr);
 
 /* ------------------------------------------------------------------------- */
 
+static const struct i2c_device_id *i2c_match_id(const struct i2c_device_id *id,
+						const struct i2c_client *client)
+{
+	while (id->name[0]) {
+		if (strcmp(client->name, id->name) == 0)
+			return id;
+		id++;
+	}
+	return NULL;
+}
+
 static int i2c_device_match(struct device *dev, struct device_driver *drv)
 {
 	struct i2c_client	*client = to_i2c_client(dev);
@@ -59,6 +70,10 @@ static int i2c_device_match(struct devic
 	if (!is_newstyle_driver(driver))
 		return 0;
 
+	/* match on an id table if there is one */
+	if (driver->id_table)
+		return i2c_match_id(driver->id_table, client) != NULL;
+
 	/* new style drivers use the same kind of driver matching policy
 	 * as platform devices or SPI:  compare device and driver IDs.
 	 */
@@ -73,11 +88,17 @@ static int i2c_device_uevent(struct devi
 	struct i2c_client	*client = to_i2c_client(dev);
 
 	/* by definition, legacy drivers can't hotplug */
-	if (dev->driver || !client->driver_name)
+	if (dev->driver)
 		return 0;
 
-	if (add_uevent_var(env, "MODALIAS=%s", client->driver_name))
-		return -ENOMEM;
+	if (client->driver_name[0]) {
+		if (add_uevent_var(env, "MODALIAS=%s", client->driver_name))
+			return -ENOMEM;
+	} else {
+		if (add_uevent_var(env, "MODALIAS=%s%s",
+				   I2C_MODULE_PREFIX, client->name))
+			return -ENOMEM;
+	}
 	dev_dbg(dev, "uevent\n");
 	return 0;
 }
@@ -90,12 +111,18 @@ static int i2c_device_probe(struct devic
 {
 	struct i2c_client	*client = to_i2c_client(dev);
 	struct i2c_driver	*driver = to_i2c_driver(dev->driver);
+	const struct i2c_device_id *id;
 
 	if (!driver->probe)
 		return -ENODEV;
 	client->driver = driver;
 	dev_dbg(dev, "probe\n");
-	return driver->probe(client);
+
+	if (driver->id_table)
+		id = i2c_match_id(driver->id_table, client);
+	else
+		id = NULL;
+	return driver->probe(client, id);
 }
 
 static int i2c_device_remove(struct device *dev)
@@ -175,9 +202,9 @@ static ssize_t show_client_name(struct d
 static ssize_t show_modalias(struct device *dev, struct device_attribute *attr, char *buf)
 {
 	struct i2c_client *client = to_i2c_client(dev);
-	return client->driver_name
+	return client->driver_name[0]
 		? sprintf(buf, "%s\n", client->driver_name)
-		: 0;
+		: sprintf(buf, "%s%s\n", I2C_MODULE_PREFIX, client->name);
 }
 
 static struct device_attribute i2c_dev_attrs[] = {
@@ -296,15 +323,20 @@ void i2c_unregister_device(struct i2c_cl
 EXPORT_SYMBOL_GPL(i2c_unregister_device);
 
 
-static int dummy_nop(struct i2c_client *client)
+static int dummy_probe(struct i2c_client *client, const struct i2c_device_id *id)
+{
+	return 0;
+}
+
+static int dummy_remove(struct i2c_client *client)
 {
 	return 0;
 }
 
 static struct i2c_driver dummy_driver = {
 	.driver.name	= "dummy",
-	.probe		= dummy_nop,
-	.remove		= dummy_nop,
+	.probe		= dummy_probe,
+	.remove		= dummy_remove,
 };
 
 /**
--- linux-2.6.24-rc8.orig/drivers/rtc/rtc-ds1307.c	2008-01-21 08:47:05.000000000 +0100
+++ linux-2.6.24-rc8/drivers/rtc/rtc-ds1307.c	2008-01-21 09:12:25.000000000 +0100
@@ -326,7 +326,8 @@ static struct bin_attribute nvram = {
 
 static struct i2c_driver ds1307_driver;
 
-static int __devinit ds1307_probe(struct i2c_client *client)
+static int __devinit ds1307_probe(struct i2c_client *client,
+				  const struct i2c_device_id *id)
 {
 	struct ds1307		*ds1307;
 	int			err = -ENODEV;
--- linux-2.6.24-rc8.orig/drivers/rtc/rtc-ds1374.c	2008-01-21 08:47:05.000000000 +0100
+++ linux-2.6.24-rc8/drivers/rtc/rtc-ds1374.c	2008-01-21 09:12:25.000000000 +0100
@@ -355,7 +355,8 @@ static const struct rtc_class_ops ds1374
 	.ioctl = ds1374_ioctl,
 };
 
-static int ds1374_probe(struct i2c_client *client)
+static int ds1374_probe(struct i2c_client *client,
+			const struct i2c_device_id *id)
 {
 	struct ds1374 *ds1374;
 	int ret;
--- linux-2.6.24-rc8.orig/drivers/rtc/rtc-m41t80.c	2008-01-21 08:47:05.000000000 +0100
+++ linux-2.6.24-rc8/drivers/rtc/rtc-m41t80.c	2008-01-21 09:12:25.000000000 +0100
@@ -756,7 +756,8 @@ static struct notifier_block wdt_notifie
  *
  *****************************************************************************
  */
-static int m41t80_probe(struct i2c_client *client)
+static int m41t80_probe(struct i2c_client *client,
+			const struct i2c_device_id *id)
 {
 	int i, rc = 0;
 	struct rtc_device *rtc = NULL;
--- linux-2.6.24-rc8.orig/drivers/rtc/rtc-rs5c372.c	2008-01-21 08:47:05.000000000 +0100
+++ linux-2.6.24-rc8/drivers/rtc/rtc-rs5c372.c	2008-01-21 09:12:25.000000000 +0100
@@ -494,7 +494,8 @@ static void rs5c_sysfs_unregister(struct
 
 static struct i2c_driver rs5c372_driver;
 
-static int rs5c372_probe(struct i2c_client *client)
+static int rs5c372_probe(struct i2c_client *client,
+			 const struct i2c_device_id *id)
 {
 	int err = 0;
 	struct rs5c372 *rs5c372;
--- linux-2.6.24-rc8.orig/include/linux/i2c.h	2008-01-21 08:47:05.000000000 +0100
+++ linux-2.6.24-rc8/include/linux/i2c.h	2008-01-21 09:12:25.000000000 +0100
@@ -126,7 +126,7 @@ struct i2c_driver {
 	 * With the driver model, device enumeration is NEVER done by drivers;
 	 * it's done by infrastructure.  (NEW STYLE DRIVERS ONLY)
 	 */
-	int (*probe)(struct i2c_client *);
+	int (*probe)(struct i2c_client *, const struct i2c_device_id *id);
 	int (*remove)(struct i2c_client *);
 
 	/* driver model interfaces that don't relate to enumeration  */
@@ -140,11 +140,10 @@ struct i2c_driver {
 	int (*command)(struct i2c_client *client,unsigned int cmd, void *arg);
 
 	struct device_driver driver;
+	const struct i2c_device_id *id_table;
 };
 #define to_i2c_driver(d) container_of(d, struct i2c_driver, driver)
 
-#define I2C_NAME_SIZE	20
-
 /**
  * struct i2c_client - represent an I2C slave device
  * @flags: I2C_CLIENT_TEN indicates the device uses a ten bit chip address;
--- linux-2.6.24-rc8.orig/include/linux/mod_devicetable.h	2008-01-21 08:47:05.000000000 +0100
+++ linux-2.6.24-rc8/include/linux/mod_devicetable.h	2008-01-21 09:12:25.000000000 +0100
@@ -367,4 +367,17 @@ struct virtio_device_id {
 };
 #define VIRTIO_DEV_ANY_ID	0xffffffff
 
+/* i2c */
+
+/* These defines are used to separate PowerPC open firmware
+ * drivers into their own namespace */
+#define I2C_NAME_SIZE	20
+#define I2C_MODULE_PREFIX "i2c:"
+
+struct i2c_device_id {
+	char name[I2C_NAME_SIZE];
+	kernel_ulong_t driver_data;	/* Data private to the driver */
+};
+
+
 #endif /* LINUX_MOD_DEVICETABLE_H */
--- linux-2.6.24-rc8.orig/scripts/mod/file2alias.c	2008-01-21 08:47:05.000000000 +0100
+++ linux-2.6.24-rc8/scripts/mod/file2alias.c	2008-01-21 09:12:25.000000000 +0100
@@ -539,6 +539,15 @@ static int do_virtio_entry(const char *f
 	return 1;
 }
 
+/* Looks like: i2c:S */
+static int do_i2c_entry(const char *filename, struct i2c_device_id *id,
+			char *alias)
+{
+	sprintf(alias, I2C_MODULE_PREFIX "%s", id->name);
+
+	return 1;
+}
+
 /* Ignore any prefix, eg. v850 prepends _ */
 static inline int sym_is(const char *symbol, const char *name)
 {
@@ -669,6 +678,10 @@ void handle_moddevtable(struct module *m
 		do_table(symval, sym->st_size,
 			 sizeof(struct virtio_device_id), "virtio",
 			 do_virtio_entry, mod);
+	else if (sym_is(symname, "__mod_i2c_device_table"))
+		do_table(symval, sym->st_size,
+			 sizeof(struct i2c_device_id), "i2c",
+			 do_i2c_entry, mod);
 	free(zeros);
 }
 

-- 
Jean Delvare

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [PATCH 2/3] i2c: Convert all new-style drivers to use module aliasing
  2008-01-21 10:25 [PATCH 0/3] i2c: Use the standard, alias-based device/driver matching scheme Jean Delvare
  2008-01-21 10:39 ` [PATCH 1/3] i2c: Add support for device alias names Jean Delvare
@ 2008-01-21 10:41 ` Jean Delvare
  2008-01-21 16:50   ` Jon Smirl
  2008-01-27 18:40   ` David Brownell
  2008-01-21 10:43 ` [PATCH 3/3] i2c: Kill the old driver matching scheme Jean Delvare
  2008-01-21 10:49 ` [i2c] [PATCH 0/3] i2c: Use the standard, alias-based device/driver " Rudolf Marek
  3 siblings, 2 replies; 11+ messages in thread
From: Jean Delvare @ 2008-01-21 10:41 UTC (permalink / raw)
  To: Linux I2C; +Cc: David Brownell, linuxppc-dev

Based on earlier work by Jon Smirl.

Update all the new-style i2c drivers to use standard module aliasing
instead of the old driver_name/type driver matching scheme.

Signed-off-by: Jean Delvare <khali@linux-fr.org>
Cc: Jon Smirl <jonsmirl@gmail.com>
---
 arch/arm/mach-at91/board-csb337.c |    3 -
 arch/arm/mach-at91/board-dk.c     |    3 -
 arch/arm/mach-at91/board-eb9200.c |    3 -
 arch/arm/mach-iop32x/em7210.c     |    3 -
 arch/arm/mach-iop32x/n2100.c      |    4 -
 arch/arm/mach-omap1/board-h2.c    |    1 
 arch/arm/mach-omap1/board-h3.c    |    3 -
 arch/arm/mach-omap1/board-osk.c   |    1 
 arch/powerpc/sysdev/fsl_soc.c     |   27 +++++-------
 drivers/hwmon/f75375s.c           |   22 +++++-----
 drivers/i2c/busses/i2c-taos-evm.c |    3 -
 drivers/i2c/chips/ds1682.c        |    7 +++
 drivers/i2c/chips/menelaus.c      |    7 +++
 drivers/i2c/chips/tps65010.c      |   28 ++++---------
 drivers/i2c/chips/tsl2550.c       |    7 +++
 drivers/rtc/rtc-ds1307.c          |   36 ++++++-----------
 drivers/rtc/rtc-ds1374.c          |    7 +++
 drivers/rtc/rtc-m41t80.c          |   78 +++++++++----------------------------
 drivers/rtc/rtc-rs5c372.c         |   14 ++++++
 include/linux/i2c.h               |   12 ++---
 20 files changed, 120 insertions(+), 149 deletions(-)

--- linux-2.6.24-rc8.orig/arch/arm/mach-at91/board-csb337.c	2007-12-04 08:56:17.000000000 +0100
+++ linux-2.6.24-rc8/arch/arm/mach-at91/board-csb337.c	2008-01-20 18:08:16.000000000 +0100
@@ -85,8 +85,7 @@ static struct at91_udc_data __initdata c
 
 static struct i2c_board_info __initdata csb337_i2c_devices[] = {
 	{
-		I2C_BOARD_INFO("rtc-ds1307", 0x68),
-		.type	= "ds1307",
+		I2C_BOARD_INFO("ds1307", 0x68),
 	},
 };
 
--- linux-2.6.24-rc8.orig/arch/arm/mach-at91/board-dk.c	2007-12-04 08:56:17.000000000 +0100
+++ linux-2.6.24-rc8/arch/arm/mach-at91/board-dk.c	2008-01-20 18:08:35.000000000 +0100
@@ -132,8 +132,7 @@ static struct i2c_board_info __initdata 
 		I2C_BOARD_INFO("x9429", 0x28),
 	},
 	{
-		I2C_BOARD_INFO("at24c", 0x50),
-		.type	= "24c1024",
+		I2C_BOARD_INFO("24c1024", 0x50),
 	}
 };
 
--- linux-2.6.24-rc8.orig/arch/arm/mach-at91/board-eb9200.c	2007-12-04 08:56:17.000000000 +0100
+++ linux-2.6.24-rc8/arch/arm/mach-at91/board-eb9200.c	2008-01-20 18:08:05.000000000 +0100
@@ -93,8 +93,7 @@ static struct at91_mmc_data __initdata e
 
 static struct i2c_board_info __initdata eb9200_i2c_devices[] = {
 	{
-		I2C_BOARD_INFO("at24c", 0x50),
-		.type	= "24c512",
+		I2C_BOARD_INFO("24c512", 0x50),
 	},
 };
 
--- linux-2.6.24-rc8.orig/arch/arm/mach-iop32x/em7210.c	2007-10-10 09:58:10.000000000 +0200
+++ linux-2.6.24-rc8/arch/arm/mach-iop32x/em7210.c	2008-01-20 18:07:15.000000000 +0100
@@ -50,8 +50,7 @@ static struct sys_timer em7210_timer = {
  */
 static struct i2c_board_info __initdata em7210_i2c_devices[] = {
 	{
-		I2C_BOARD_INFO("rtc-rs5c372", 0x32),
-		.type = "rs5c372a",
+		I2C_BOARD_INFO("rs5c372a", 0x32),
 	},
 };
 
--- linux-2.6.24-rc8.orig/arch/arm/mach-iop32x/n2100.c	2007-11-17 10:26:25.000000000 +0100
+++ linux-2.6.24-rc8/arch/arm/mach-iop32x/n2100.c	2008-01-20 18:07:00.000000000 +0100
@@ -208,12 +208,10 @@ static struct f75375s_platform_data n210
 
 static struct i2c_board_info __initdata n2100_i2c_devices[] = {
 	{
-		I2C_BOARD_INFO("rtc-rs5c372", 0x32),
-		.type = "rs5c372b",
+		I2C_BOARD_INFO("rs5c372b", 0x32),
 	},
 	{
 		I2C_BOARD_INFO("f75375", 0x2e),
-		.type = "f75375",
 		.platform_data = &n2100_f75375s,
 	},
 };
--- linux-2.6.24-rc8.orig/arch/arm/mach-omap1/board-h2.c	2008-01-19 12:16:45.000000000 +0100
+++ linux-2.6.24-rc8/arch/arm/mach-omap1/board-h2.c	2008-01-20 18:07:37.000000000 +0100
@@ -347,7 +347,6 @@ static struct platform_device *h2_device
 static struct i2c_board_info __initdata h2_i2c_board_info[] = {
 	{
 		I2C_BOARD_INFO("tps65010", 0x48),
-		.type		= "tps65010",
 		.irq		= OMAP_GPIO_IRQ(58),
 	},
 	/* TODO when driver support is ready:
--- linux-2.6.24-rc8.orig/arch/arm/mach-omap1/board-h3.c	2008-01-19 12:16:45.000000000 +0100
+++ linux-2.6.24-rc8/arch/arm/mach-omap1/board-h3.c	2008-01-20 18:07:43.000000000 +0100
@@ -459,8 +459,7 @@ static struct omap_board_config_kernel h
 
 static struct i2c_board_info __initdata h3_i2c_board_info[] = {
 	{
-		I2C_BOARD_INFO("tps65010", 0x48),
-		.type		= "tps65013",
+		I2C_BOARD_INFO("tps65013", 0x48),
 		/* .irq		= OMAP_GPIO_IRQ(??), */
 	},
 	/* TODO when driver support is ready:
--- linux-2.6.24-rc8.orig/arch/arm/mach-omap1/board-osk.c	2008-01-19 12:16:45.000000000 +0100
+++ linux-2.6.24-rc8/arch/arm/mach-omap1/board-osk.c	2008-01-20 18:07:30.000000000 +0100
@@ -187,7 +187,6 @@ static struct platform_device *osk5912_d
 static struct i2c_board_info __initdata osk_i2c_board_info[] = {
 	{
 		I2C_BOARD_INFO("tps65010", 0x48),
-		.type		= "tps65010",
 		.irq		= OMAP_GPIO_IRQ(OMAP_MPUIO(1)),
 	},
 	/* TODO when driver support is ready:
--- linux-2.6.24-rc8.orig/arch/powerpc/sysdev/fsl_soc.c	2008-01-20 17:28:17.000000000 +0100
+++ linux-2.6.24-rc8/arch/powerpc/sysdev/fsl_soc.c	2008-01-20 17:29:13.000000000 +0100
@@ -322,22 +322,21 @@ arch_initcall(gfar_of_init);
 #include <linux/i2c.h>
 struct i2c_driver_device {
 	char	*of_device;
-	char	*i2c_driver;
 	char	*i2c_type;
 };
 
 static struct i2c_driver_device i2c_devices[] __initdata = {
-	{"ricoh,rs5c372a", "rtc-rs5c372", "rs5c372a",},
-	{"ricoh,rs5c372b", "rtc-rs5c372", "rs5c372b",},
-	{"ricoh,rv5c386",  "rtc-rs5c372", "rv5c386",},
-	{"ricoh,rv5c387a", "rtc-rs5c372", "rv5c387a",},
-	{"dallas,ds1307",  "rtc-ds1307",  "ds1307",},
-	{"dallas,ds1337",  "rtc-ds1307",  "ds1337",},
-	{"dallas,ds1338",  "rtc-ds1307",  "ds1338",},
-	{"dallas,ds1339",  "rtc-ds1307",  "ds1339",},
-	{"dallas,ds1340",  "rtc-ds1307",  "ds1340",},
-	{"stm,m41t00",     "rtc-ds1307",  "m41t00"},
-	{"dallas,ds1374",  "rtc-ds1374",  "rtc-ds1374",},
+	{"ricoh,rs5c372a", "rs5c372a",},
+	{"ricoh,rs5c372b", "rs5c372b",},
+	{"ricoh,rv5c386",  "rv5c386",},
+	{"ricoh,rv5c387a", "rv5c387a",},
+	{"dallas,ds1307",  "ds1307",},
+	{"dallas,ds1337",  "ds1337",},
+	{"dallas,ds1338",  "ds1338",},
+	{"dallas,ds1339",  "ds1339",},
+	{"dallas,ds1340",  "ds1340",},
+	{"stm,m41t00",     "m41t00"},
+	{"dallas,ds1374",  "rtc-ds1374",},
 };
 
 static int __init of_find_i2c_driver(struct device_node *node,
@@ -348,9 +347,7 @@ static int __init of_find_i2c_driver(str
 	for (i = 0; i < ARRAY_SIZE(i2c_devices); i++) {
 		if (!of_device_is_compatible(node, i2c_devices[i].of_device))
 			continue;
-		if (strlcpy(info->driver_name, i2c_devices[i].i2c_driver,
-			    KOBJ_NAME_LEN) >= KOBJ_NAME_LEN ||
-		    strlcpy(info->type, i2c_devices[i].i2c_type,
+		if (strlcpy(info->type, i2c_devices[i].i2c_type,
 			    I2C_NAME_SIZE) >= I2C_NAME_SIZE)
 			return -ENOMEM;
 		return 0;
--- linux-2.6.24-rc8.orig/drivers/hwmon/f75375s.c	2008-01-20 14:43:34.000000000 +0100
+++ linux-2.6.24-rc8/drivers/hwmon/f75375s.c	2008-01-20 18:55:18.000000000 +0100
@@ -129,12 +129,20 @@ static struct i2c_driver f75375_legacy_d
 	.detach_client = f75375_detach_client,
 };
 
+static const struct i2c_device_id f75375_id[] = {
+	{ "f75373", f75373 },
+	{ "f75375", f75375 },
+	{ },
+};
+MODULE_DEVICE_TABLE(i2c, f75375_id);
+
 static struct i2c_driver f75375_driver = {
 	.driver = {
 		.name = "f75375",
 	},
 	.probe = f75375_probe,
 	.remove = f75375_remove,
+	.id_table = f75375_id,
 };
 
 static inline int f75375_read8(struct i2c_client *client, u8 reg)
@@ -646,15 +654,6 @@ static int f75375_probe(struct i2c_clien
 	data->client = client;
 	mutex_init(&data->update_lock);
 
-	if (strcmp(client->name, "f75375") == 0)
-		data->kind = f75375;
-	else if (strcmp(client->name, "f75373") == 0)
-		data->kind = f75373;
-	else {
-		dev_err(&client->dev, "Unsupported device: %s\n", client->name);
-		return -ENODEV;
-	}
-
 	if ((err = sysfs_create_group(&client->dev.kobj, &f75375_group)))
 		goto exit_free;
 
@@ -714,6 +713,7 @@ static int f75375_detect(struct i2c_adap
 	u8 version = 0;
 	int err = 0;
 	const char *name = "";
+	struct i2c_device_id id;
 
 	if (!(client = kzalloc(sizeof(*client), GFP_KERNEL))) {
 		err = -ENOMEM;
@@ -750,7 +750,9 @@ static int f75375_detect(struct i2c_adap
 	if ((err = i2c_attach_client(client)))
 		goto exit_free;
 
-	if ((err = f75375_probe(client, NULL)) < 0)
+	strlcpy(id.name, name, I2C_NAME_SIZE);
+	id.driver_data = kind;
+	if ((err = f75375_probe(client, &id)) < 0)
 		goto exit_detach;
 
 	return 0;
--- linux-2.6.24-rc8.orig/drivers/i2c/busses/i2c-taos-evm.c	2007-10-10 09:58:24.000000000 +0200
+++ linux-2.6.24-rc8/drivers/i2c/busses/i2c-taos-evm.c	2008-01-20 19:38:20.000000000 +0100
@@ -51,7 +51,6 @@ struct taos_data {
 /* TAOS TSL2550 EVM */
 static struct i2c_board_info tsl2550_info = {
 	I2C_BOARD_INFO("tsl2550", 0x39),
-	.type	= "tsl2550",
 };
 
 /* Instantiate i2c devices based on the adapter name */
@@ -59,7 +58,7 @@ static struct i2c_client *taos_instantia
 {
 	if (!strncmp(adapter->name, "TAOS TSL2550 EVM", 16)) {
 		dev_info(&adapter->dev, "Instantiating device %s at 0x%02x\n",
-			tsl2550_info.driver_name, tsl2550_info.addr);
+			tsl2550_info.type, tsl2550_info.addr);
 		return i2c_new_device(adapter, &tsl2550_info);
 	}
 
--- linux-2.6.24-rc8.orig/drivers/i2c/chips/ds1682.c	2008-01-20 14:41:23.000000000 +0100
+++ linux-2.6.24-rc8/drivers/i2c/chips/ds1682.c	2008-01-20 18:49:07.000000000 +0100
@@ -235,12 +235,19 @@ static int ds1682_remove(struct i2c_clie
 	return 0;
 }
 
+static const struct i2c_device_id ds1682_id[] = {
+	{ "ds1682", 0 },
+	{ },
+};
+MODULE_DEVICE_TABLE(i2c, ds1682_id);
+
 static struct i2c_driver ds1682_driver = {
 	.driver = {
 		.name = "ds1682",
 	},
 	.probe = ds1682_probe,
 	.remove = ds1682_remove,
+	.id_table = ds1682_id,
 };
 
 static int __init ds1682_init(void)
--- linux-2.6.24-rc8.orig/drivers/i2c/chips/menelaus.c	2008-01-20 14:49:40.000000000 +0100
+++ linux-2.6.24-rc8/drivers/i2c/chips/menelaus.c	2008-01-20 18:49:25.000000000 +0100
@@ -1243,12 +1243,19 @@ static int __exit menelaus_remove(struct
 	return 0;
 }
 
+static const struct i2c_device_id menelaus_id[] = {
+	{ "menelaus", 0 },
+	{ },
+};
+MODULE_DEVICE_TABLE(i2c, menelaus_id);
+
 static struct i2c_driver menelaus_i2c_driver = {
 	.driver = {
 		.name		= DRIVER_NAME,
 	},
 	.probe		= menelaus_probe,
 	.remove		= __exit_p(menelaus_remove),
+	.id_table	= menelaus_id,
 };
 
 static int __init menelaus_init(void)
--- linux-2.6.24-rc8.orig/drivers/i2c/chips/tps65010.c	2008-01-20 14:41:09.000000000 +0100
+++ linux-2.6.24-rc8/drivers/i2c/chips/tps65010.c	2008-01-20 18:49:34.000000000 +0100
@@ -60,7 +60,6 @@ static struct i2c_driver tps65010_driver
  * as part of board setup by a bootloader.
  */
 enum tps_model {
-	TPS_UNKNOWN = 0,
 	TPS65010,
 	TPS65011,
 	TPS65012,
@@ -487,20 +486,6 @@ static int tps65010_probe(struct i2c_cli
 	INIT_DELAYED_WORK(&tps->work, tps65010_work);
 	tps->client = client;
 
-	if (strcmp(client->name, "tps65010") == 0)
-		tps->model = TPS65010;
-	else if (strcmp(client->name, "tps65011") == 0)
-		tps->model = TPS65011;
-	else if (strcmp(client->name, "tps65012") == 0)
-		tps->model = TPS65012;
-	else if (strcmp(client->name, "tps65013") == 0)
-		tps->model = TPS65013;
-	else {
-		dev_warn(&client->dev, "unknown chip '%s'\n", client->name);
-		status = -ENODEV;
-		goto fail1;
-	}
-
 	/* the IRQ is active low, but many gpio lines can't support that
 	 * so this driver uses falling-edge triggers instead.
 	 */
@@ -528,9 +513,6 @@ static int tps65010_probe(struct i2c_cli
 	case TPS65012:
 		tps->por = 1;
 		break;
-	case TPS_UNKNOWN:
-		printk(KERN_WARNING "%s: unknown TPS chip\n", DRIVER_NAME);
-		break;
 	/* else CHGCONFIG.POR is replaced by AUA, enabling a WAIT mode */
 	}
 	tps->chgconf = i2c_smbus_read_byte_data(client, TPS_CHGCONFIG);
@@ -584,12 +566,22 @@ fail1:
 	return status;
 }
 
+static const struct i2c_device_id tps65010_id[] = {
+	{ "tps65010", TPS65010 },
+	{ "tps65011", TPS65011 },
+	{ "tps65012", TPS65012 },
+	{ "tps65013", TPS65013 },
+	{ },
+};
+MODULE_DEVICE_TABLE(i2c, tps65010_id);
+
 static struct i2c_driver tps65010_driver = {
 	.driver = {
 		.name	= "tps65010",
 	},
 	.probe	= tps65010_probe,
 	.remove	= __exit_p(tps65010_remove),
+	.id_table = tps65010_id,
 };
 
 /*-------------------------------------------------------------------------*/
--- linux-2.6.24-rc8.orig/drivers/i2c/chips/tsl2550.c	2008-01-20 14:40:51.000000000 +0100
+++ linux-2.6.24-rc8/drivers/i2c/chips/tsl2550.c	2008-01-20 18:49:19.000000000 +0100
@@ -452,6 +452,12 @@ static int tsl2550_resume(struct i2c_cli
 
 #endif /* CONFIG_PM */
 
+static const struct i2c_device_id tsl2550_id[] = {
+	{ "tsl2550", 0 },
+	{ },
+};
+MODULE_DEVICE_TABLE(i2c, tsl2550_id);
+
 static struct i2c_driver tsl2550_driver = {
 	.driver = {
 		.name	= TSL2550_DRV_NAME,
@@ -461,6 +467,7 @@ static struct i2c_driver tsl2550_driver 
 	.resume	= tsl2550_resume,
 	.probe	= tsl2550_probe,
 	.remove	= __devexit_p(tsl2550_remove),
+	.id_table = tsl2550_id,
 };
 
 static int __init tsl2550_init(void)
--- linux-2.6.24-rc8.orig/drivers/rtc/rtc-ds1307.c	2008-01-20 17:26:58.000000000 +0100
+++ linux-2.6.24-rc8/drivers/rtc/rtc-ds1307.c	2008-01-20 19:03:48.000000000 +0100
@@ -102,42 +102,36 @@ struct chip_desc {
 	char			name[9];
 	unsigned		nvram56:1;
 	unsigned		alarm:1;
-	enum ds_type		type;
 };
 
 static const struct chip_desc chips[] = { {
 	.name		= "ds1307",
-	.type		= ds_1307,
 	.nvram56	= 1,
 }, {
 	.name		= "ds1337",
-	.type		= ds_1337,
 	.alarm		= 1,
 }, {
 	.name		= "ds1338",
-	.type		= ds_1338,
 	.nvram56	= 1,
 }, {
 	.name		= "ds1339",
-	.type		= ds_1339,
 	.alarm		= 1,
 }, {
 	.name		= "ds1340",
-	.type		= ds_1340,
 }, {
 	.name		= "m41t00",
-	.type		= m41t00,
 }, };
 
-static inline const struct chip_desc *find_chip(const char *s)
-{
-	unsigned i;
-
-	for (i = 0; i < ARRAY_SIZE(chips); i++)
-		if (strnicmp(s, chips[i].name, sizeof chips[i].name) == 0)
-			return &chips[i];
-	return NULL;
-}
+static const struct i2c_device_id ds1307_id[] = {
+	{ "ds1307", ds_1307 },
+	{ "ds1337", ds_1337 },
+	{ "ds1338", ds_1338 },
+	{ "ds1339", ds_1339 },
+	{ "ds1340", ds_1340 },
+	{ "m41t00", m41t00 },
+	{},
+};
+MODULE_DEVICE_TABLE(i2c, ds1307_id);
 
 static int ds1307_get_time(struct device *dev, struct rtc_time *t)
 {
@@ -335,12 +329,7 @@ static int __devinit ds1307_probe(struct
 	const struct chip_desc	*chip;
 	struct i2c_adapter	*adapter = to_i2c_adapter(client->dev.parent);
 
-	chip = find_chip(client->name);
-	if (!chip) {
-		dev_err(&client->dev, "unknown chip type '%s'\n",
-				client->name);
-		return -ENODEV;
-	}
+	chip = &chips[id->driver_data];
 
 	if (!i2c_check_functionality(adapter,
 			I2C_FUNC_I2C | I2C_FUNC_SMBUS_WRITE_BYTE_DATA))
@@ -362,7 +351,7 @@ static int __devinit ds1307_probe(struct
 	ds1307->msg[1].len = sizeof(ds1307->regs);
 	ds1307->msg[1].buf = ds1307->regs;
 
-	ds1307->type = chip->type;
+	ds1307->type = id->driver_data;
 
 	switch (ds1307->type) {
 	case ds_1337:
@@ -538,6 +527,7 @@ static struct i2c_driver ds1307_driver =
 	},
 	.probe		= ds1307_probe,
 	.remove		= __devexit_p(ds1307_remove),
+	.id_table	= ds1307_id,
 };
 
 static int __init ds1307_init(void)
--- linux-2.6.24-rc8.orig/drivers/rtc/rtc-ds1374.c	2008-01-20 17:26:58.000000000 +0100
+++ linux-2.6.24-rc8/drivers/rtc/rtc-ds1374.c	2008-01-20 19:04:10.000000000 +0100
@@ -41,6 +41,12 @@
 #define DS1374_REG_SR_AF	0x01 /* Alarm Flag */
 #define DS1374_REG_TCR		0x09 /* Trickle Charge */
 
+static const struct i2c_device_id ds1374_id[] = {
+	{ "ds1374", 0 },
+	{},
+};
+MODULE_DEVICE_TABLE(i2c, ds1374_id);
+
 struct ds1374 {
 	struct i2c_client *client;
 	struct rtc_device *rtc;
@@ -430,6 +436,7 @@ static struct i2c_driver ds1374_driver =
 	},
 	.probe = ds1374_probe,
 	.remove = __devexit_p(ds1374_remove),
+	.id_table = ds1374_id,
 };
 
 static int __init ds1374_init(void)
--- linux-2.6.24-rc8.orig/drivers/rtc/rtc-m41t80.c	2008-01-20 17:26:58.000000000 +0100
+++ linux-2.6.24-rc8/drivers/rtc/rtc-m41t80.c	2008-01-20 19:09:09.000000000 +0100
@@ -60,48 +60,21 @@
 
 #define DRV_VERSION "0.05"
 
-struct m41t80_chip_info {
-	const char *name;
-	u8 features;
-};
-
-static const struct m41t80_chip_info m41t80_chip_info_tbl[] = {
-	{
-		.name		= "m41t80",
-		.features	= 0,
-	},
-	{
-		.name		= "m41t81",
-		.features	= M41T80_FEATURE_HT,
-	},
-	{
-		.name		= "m41t81s",
-		.features	= M41T80_FEATURE_HT | M41T80_FEATURE_BL,
-	},
-	{
-		.name		= "m41t82",
-		.features	= M41T80_FEATURE_HT | M41T80_FEATURE_BL,
-	},
-	{
-		.name		= "m41t83",
-		.features	= M41T80_FEATURE_HT | M41T80_FEATURE_BL,
-	},
-	{
-		.name		= "m41st84",
-		.features	= M41T80_FEATURE_HT | M41T80_FEATURE_BL,
-	},
-	{
-		.name		= "m41st85",
-		.features	= M41T80_FEATURE_HT | M41T80_FEATURE_BL,
-	},
-	{
-		.name		= "m41st87",
-		.features	= M41T80_FEATURE_HT | M41T80_FEATURE_BL,
-	},
+static const struct i2c_device_id m41t80_id[] = {
+	{ "m41t80", 0 },
+	{ "m41t81", M41T80_FEATURE_HT },
+	{ "m41t81s", M41T80_FEATURE_HT | M41T80_FEATURE_BL },
+	{ "m41t82", M41T80_FEATURE_HT | M41T80_FEATURE_BL },
+	{ "m41t83", M41T80_FEATURE_HT | M41T80_FEATURE_BL },
+	{ "m41st84", M41T80_FEATURE_HT | M41T80_FEATURE_BL },
+	{ "m41st85", M41T80_FEATURE_HT | M41T80_FEATURE_BL },
+	{ "m41st87", M41T80_FEATURE_HT | M41T80_FEATURE_BL },
+	{},
 };
+MODULE_DEVICE_TABLE(i2c, m41t80_id);
 
 struct m41t80_data {
-	const struct m41t80_chip_info *chip;
+	u8 features;
 	struct rtc_device *rtc;
 };
 
@@ -208,7 +181,7 @@ static int m41t80_rtc_proc(struct device
 	struct m41t80_data *clientdata = i2c_get_clientdata(client);
 	u8 reg;
 
-	if (clientdata->chip->features & M41T80_FEATURE_BL) {
+	if (clientdata->features & M41T80_FEATURE_BL) {
 		reg = i2c_smbus_read_byte_data(client, M41T80_REG_FLAGS);
 		seq_printf(seq, "battery\t\t: %s\n",
 			   (reg & M41T80_FLAGS_BATT_LOW) ? "exhausted" : "ok");
@@ -759,10 +732,9 @@ static struct notifier_block wdt_notifie
 static int m41t80_probe(struct i2c_client *client,
 			const struct i2c_device_id *id)
 {
-	int i, rc = 0;
+	int rc = 0;
 	struct rtc_device *rtc = NULL;
 	struct rtc_time tm;
-	const struct m41t80_chip_info *chip;
 	struct m41t80_data *clientdata = NULL;
 
 	if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C
@@ -774,19 +746,6 @@ static int m41t80_probe(struct i2c_clien
 	dev_info(&client->dev,
 		 "chip found, driver version " DRV_VERSION "\n");
 
-	chip = NULL;
-	for (i = 0; i < ARRAY_SIZE(m41t80_chip_info_tbl); i++) {
-		if (!strcmp(m41t80_chip_info_tbl[i].name, client->name)) {
-			chip = &m41t80_chip_info_tbl[i];
-			break;
-		}
-	}
-	if (!chip) {
-		dev_err(&client->dev, "%s is not supported\n", client->name);
-		rc = -ENODEV;
-		goto exit;
-	}
-
 	clientdata = kzalloc(sizeof(*clientdata), GFP_KERNEL);
 	if (!clientdata) {
 		rc = -ENOMEM;
@@ -802,7 +761,7 @@ static int m41t80_probe(struct i2c_clien
 	}
 
 	clientdata->rtc = rtc;
-	clientdata->chip = chip;
+	clientdata->features = id->driver_data;
 	i2c_set_clientdata(client, clientdata);
 
 	/* Make sure HT (Halt Update) bit is cleared */
@@ -811,7 +770,7 @@ static int m41t80_probe(struct i2c_clien
 		goto ht_err;
 
 	if (rc & M41T80_ALHOUR_HT) {
-		if (chip->features & M41T80_FEATURE_HT) {
+		if (clientdata->features & M41T80_FEATURE_HT) {
 			m41t80_get_datetime(client, &tm);
 			dev_info(&client->dev, "HT bit was set!\n");
 			dev_info(&client->dev,
@@ -843,7 +802,7 @@ static int m41t80_probe(struct i2c_clien
 		goto exit;
 
 #ifdef CONFIG_RTC_DRV_M41T80_WDT
-	if (chip->features & M41T80_FEATURE_HT) {
+	if (clientdata->features & M41T80_FEATURE_HT) {
 		rc = misc_register(&wdt_dev);
 		if (rc)
 			goto exit;
@@ -879,7 +838,7 @@ static int m41t80_remove(struct i2c_clie
 	struct rtc_device *rtc = clientdata->rtc;
 
 #ifdef CONFIG_RTC_DRV_M41T80_WDT
-	if (clientdata->chip->features & M41T80_FEATURE_HT) {
+	if (clientdata->features & M41T80_FEATURE_HT) {
 		misc_deregister(&wdt_dev);
 		unregister_reboot_notifier(&wdt_notifier);
 	}
@@ -897,6 +856,7 @@ static struct i2c_driver m41t80_driver =
 	},
 	.probe = m41t80_probe,
 	.remove = m41t80_remove,
+	.id_table = m41t80_id,
 };
 
 static int __init m41t80_rtc_init(void)
--- linux-2.6.24-rc8.orig/drivers/rtc/rtc-rs5c372.c	2008-01-20 17:26:58.000000000 +0100
+++ linux-2.6.24-rc8/drivers/rtc/rtc-rs5c372.c	2008-01-20 19:04:22.000000000 +0100
@@ -69,6 +69,15 @@ enum rtc_type {
 	rtc_rv5c387a,
 };
 
+static const struct i2c_device_id rs5c372_id[] = {
+	{ "rs5c372a", rtc_rs5c372a },
+	{ "rs5c372b", rtc_rs5c372b },
+	{ "rv5c386", rtc_rv5c386 },
+	{ "rv5c387a", rtc_rv5c387a },
+	{},
+};
+MODULE_DEVICE_TABLE(i2c, rs5c372_id);
+
 /* REVISIT:  this assumes that:
  *  - we're in the 21st century, so it's safe to ignore the century
  *    bit for rv5c38[67] (REG_MONTH bit 7);
@@ -523,7 +532,9 @@ static int rs5c372_probe(struct i2c_clie
 	if (err < 0)
 		goto exit_kfree;
 
-	if (strcmp(client->name, "rs5c372a") == 0)
+	if (id)
+		rs5c372->type = id->driver_data;
+	else if (strcmp(client->name, "rs5c372a") == 0)
 		rs5c372->type = rtc_rs5c372a;
 	else if (strcmp(client->name, "rs5c372b") == 0)
 		rs5c372->type = rtc_rs5c372b;
@@ -652,6 +663,7 @@ static struct i2c_driver rs5c372_driver 
 	},
 	.probe		= rs5c372_probe,
 	.remove		= rs5c372_remove,
+	.id_table	= rs5c372_id,
 };
 
 static __init int rs5c372_init(void)
--- linux-2.6.24-rc8.orig/include/linux/i2c.h	2008-01-20 17:40:20.000000000 +0100
+++ linux-2.6.24-rc8/include/linux/i2c.h	2008-01-21 08:26:40.000000000 +0100
@@ -229,17 +229,17 @@ struct i2c_board_info {
 };
 
 /**
- * I2C_BOARD_INFO - macro used to list an i2c device and its driver
- * @driver: identifies the driver to use with the device
+ * I2C_BOARD_INFO - macro used to list an i2c device and its address
+ * @dev_type: identifies the device type
  * @dev_addr: the device's address on the bus.
  *
  * This macro initializes essential fields of a struct i2c_board_info,
  * declaring what has been provided on a particular board.  Optional
- * fields (such as the chip type, its associated irq, or device-specific
- * platform_data) are provided using conventional syntax.
+ * fields (such as associated irq, or device-specific platform_data)
+ * are provided using conventional syntax.
  */
-#define I2C_BOARD_INFO(driver,dev_addr) \
-	.driver_name = (driver), .addr = (dev_addr)
+#define I2C_BOARD_INFO(dev_type,dev_addr) \
+	.type = (dev_type), .addr = (dev_addr)
 
 
 /* Add-on boards should register/unregister their devices; e.g. a board

-- 
Jean Delvare

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [PATCH 3/3] i2c: Kill the old driver matching scheme
  2008-01-21 10:25 [PATCH 0/3] i2c: Use the standard, alias-based device/driver matching scheme Jean Delvare
  2008-01-21 10:39 ` [PATCH 1/3] i2c: Add support for device alias names Jean Delvare
  2008-01-21 10:41 ` [PATCH 2/3] i2c: Convert all new-style drivers to use module aliasing Jean Delvare
@ 2008-01-21 10:43 ` Jean Delvare
  2008-01-21 10:49 ` [i2c] [PATCH 0/3] i2c: Use the standard, alias-based device/driver " Rudolf Marek
  3 siblings, 0 replies; 11+ messages in thread
From: Jean Delvare @ 2008-01-21 10:43 UTC (permalink / raw)
  To: Linux I2C; +Cc: David Brownell, linuxppc-dev

Remove the old driver_name/type scheme for i2c driver matching. Only the
standard aliasing model will be used from now on.

Signed-off-by: Jean Delvare <khali@linux-fr.org>
Cc: Jon Smirl <jonsmirl@gmail.com>
---
 drivers/i2c/i2c-core.c |   36 ++++++++++++++----------------------
 include/linux/i2c.h    |    9 ++-------
 2 files changed, 16 insertions(+), 29 deletions(-)

--- linux-2.6.24-rc8.orig/drivers/i2c/i2c-core.c	2008-01-20 16:28:09.000000000 +0100
+++ linux-2.6.24-rc8/drivers/i2c/i2c-core.c	2008-01-20 19:36:48.000000000 +0100
@@ -74,10 +74,7 @@ static int i2c_device_match(struct devic
 	if (driver->id_table)
 		return i2c_match_id(driver->id_table, client) != NULL;
 
-	/* new style drivers use the same kind of driver matching policy
-	 * as platform devices or SPI:  compare device and driver IDs.
-	 */
-	return strcmp(client->driver_name, drv->name) == 0;
+	return 0;
 }
 
 #ifdef	CONFIG_HOTPLUG
@@ -91,14 +88,9 @@ static int i2c_device_uevent(struct devi
 	if (dev->driver)
 		return 0;
 
-	if (client->driver_name[0]) {
-		if (add_uevent_var(env, "MODALIAS=%s", client->driver_name))
-			return -ENOMEM;
-	} else {
-		if (add_uevent_var(env, "MODALIAS=%s%s",
-				   I2C_MODULE_PREFIX, client->name))
-			return -ENOMEM;
-	}
+	if (add_uevent_var(env, "MODALIAS=%s%s",
+			   I2C_MODULE_PREFIX, client->name))
+		return -ENOMEM;
 	dev_dbg(dev, "uevent\n");
 	return 0;
 }
@@ -202,9 +194,7 @@ static ssize_t show_client_name(struct d
 static ssize_t show_modalias(struct device *dev, struct device_attribute *attr, char *buf)
 {
 	struct i2c_client *client = to_i2c_client(dev);
-	return client->driver_name[0]
-		? sprintf(buf, "%s\n", client->driver_name)
-		: sprintf(buf, "%s%s\n", I2C_MODULE_PREFIX, client->name);
+	return sprintf(buf, "%s%s\n", I2C_MODULE_PREFIX, client->name);
 }
 
 static struct device_attribute i2c_dev_attrs[] = {
@@ -278,8 +268,6 @@ i2c_new_device(struct i2c_adapter *adap,
 	client->addr = info->addr;
 	client->irq = info->irq;
 
-	strlcpy(client->driver_name, info->driver_name,
-		sizeof(client->driver_name));
 	strlcpy(client->name, info->type, sizeof(client->name));
 
 	/* a new style driver may be bound to this device when we
@@ -323,6 +311,12 @@ void i2c_unregister_device(struct i2c_cl
 EXPORT_SYMBOL_GPL(i2c_unregister_device);
 
 
+static const struct i2c_device_id dummy_id[] = {
+	{ "dummy", 0 },
+	{ },
+};
+MODULE_DEVICE_TABLE(i2c, dummy_id);
+
 static int dummy_probe(struct i2c_client *client, const struct i2c_device_id *id)
 {
 	return 0;
@@ -337,13 +331,13 @@ static struct i2c_driver dummy_driver = 
 	.driver.name	= "dummy",
 	.probe		= dummy_probe,
 	.remove		= dummy_remove,
+	.id_table	= dummy_id,
 };
 
 /**
  * i2c_new_dummy - return a new i2c device bound to a dummy driver
  * @adapter: the adapter managing the device
  * @address: seven bit address to be used
- * @type: optional label used for i2c_client.name
  * Context: can sleep
  *
  * This returns an I2C client bound to the "dummy" driver, intended for use
@@ -359,15 +353,13 @@ static struct i2c_driver dummy_driver = 
  * i2c_unregister_device(); or NULL to indicate an error.
  */
 struct i2c_client *
-i2c_new_dummy(struct i2c_adapter *adapter, u16 address, const char *type)
+i2c_new_dummy(struct i2c_adapter *adapter, u16 address)
 {
 	struct i2c_board_info info = {
-		.driver_name	= "dummy",
+		.type		= "dummy",
 		.addr		= address,
 	};
 
-	if (type)
-		strlcpy(info.type, type, sizeof info.type);
 	return i2c_new_device(adapter, &info);
 }
 EXPORT_SYMBOL_GPL(i2c_new_dummy);
--- linux-2.6.24-rc8.orig/include/linux/i2c.h	2008-01-20 17:40:37.000000000 +0100
+++ linux-2.6.24-rc8/include/linux/i2c.h	2008-01-20 19:36:35.000000000 +0100
@@ -155,8 +155,6 @@ struct i2c_driver {
  * @driver: device's driver, hence pointer to access routines
  * @dev: Driver model device node for the slave.
  * @irq: indicates the IRQ generated by this device (if any)
- * @driver_name: Identifies new-style driver used with this device; also
- *	used as the module name for hotplug/coldplug modprobe support.
  * @list: list of active/busy clients (DEPRECATED)
  * @released: used to synchronize client releases & detaches and references
  *
@@ -174,7 +172,6 @@ struct i2c_client {
 	struct i2c_driver *driver;	/* and our access routines	*/
 	struct device dev;		/* the device structure		*/
 	int irq;			/* irq issued by device (or -1) */
-	char driver_name[KOBJ_NAME_LEN];
 	struct list_head list;		/* DEPRECATED */
 	struct completion released;
 };
@@ -200,8 +197,7 @@ static inline void i2c_set_clientdata (s
 
 /**
  * struct i2c_board_info - template for device creation
- * @driver_name: identifies the driver to be bound to the device
- * @type: optional chip type information, to initialize i2c_client.name
+ * @type: chip type, to initialize i2c_client.name
  * @flags: to initialize i2c_client.flags
  * @addr: stored in i2c_client.addr
  * @platform_data: stored in i2c_client.dev.platform_data
@@ -220,7 +216,6 @@ static inline void i2c_set_clientdata (s
  * with the adapter already known.
  */
 struct i2c_board_info {
-	char		driver_name[KOBJ_NAME_LEN];
 	char		type[I2C_NAME_SIZE];
 	unsigned short	flags;
 	unsigned short	addr;
@@ -262,7 +257,7 @@ i2c_new_probed_device(struct i2c_adapter
  * client handles for the extra addresses.
  */
 extern struct i2c_client *
-i2c_new_dummy(struct i2c_adapter *adap, u16 address, const char *type);
+i2c_new_dummy(struct i2c_adapter *adap, u16 address);
 
 extern void i2c_unregister_device(struct i2c_client *);
 

-- 
Jean Delvare

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [i2c] [PATCH 0/3] i2c: Use the standard, alias-based device/driver matching scheme
  2008-01-21 10:25 [PATCH 0/3] i2c: Use the standard, alias-based device/driver matching scheme Jean Delvare
                   ` (2 preceding siblings ...)
  2008-01-21 10:43 ` [PATCH 3/3] i2c: Kill the old driver matching scheme Jean Delvare
@ 2008-01-21 10:49 ` Rudolf Marek
  2008-01-21 12:34   ` Jean Delvare
  3 siblings, 1 reply; 11+ messages in thread
From: Rudolf Marek @ 2008-01-21 10:49 UTC (permalink / raw)
  To: Jean Delvare; +Cc: David Brownell, linuxppc-dev, Linux I2C

Hi Jean,

> Note: all the arm and powerpc stuff is untested.

We at http://sysgo.com have some demo server, where you can access embedded 
systems remotely (via VNC to a server with cross tools (ELinOS)  + serial console),
there is 2.6.22 kernel, but I think the i2c core can be replaced. I think some 
PPC and ARMs are connected there. I will ask if you can get access to it if you 
are interested.

Thanks,

Rudolf

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [i2c] [PATCH 0/3] i2c: Use the standard, alias-based device/driver  matching scheme
  2008-01-21 10:49 ` [i2c] [PATCH 0/3] i2c: Use the standard, alias-based device/driver " Rudolf Marek
@ 2008-01-21 12:34   ` Jean Delvare
  0 siblings, 0 replies; 11+ messages in thread
From: Jean Delvare @ 2008-01-21 12:34 UTC (permalink / raw)
  To: Rudolf Marek; +Cc: David Brownell, linuxppc-dev, Linux I2C

On Mon, 21 Jan 2008 11:49:43 +0100, Rudolf Marek wrote:
> > Note: all the arm and powerpc stuff is untested.
> 
> We at http://sysgo.com have some demo server, where you can access embedded 
> systems remotely (via VNC to a server with cross tools (ELinOS)  + serial console),
> there is 2.6.22 kernel, but I think the i2c core can be replaced. I think some 
> PPC and ARMs are connected there. I will ask if you can get access to it if you 
> are interested.

Thanks for the proposal, but in general I think it makes more sense
that people who are familiar with these architectures test the patches
themselves. That's less work for me, and they'll do a better job anyway.

-- 
Jean Delvare

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 2/3] i2c: Convert all new-style drivers to use module aliasing
  2008-01-21 10:41 ` [PATCH 2/3] i2c: Convert all new-style drivers to use module aliasing Jean Delvare
@ 2008-01-21 16:50   ` Jon Smirl
  2008-01-22 10:09     ` Jean Delvare
  2008-01-27 18:40   ` David Brownell
  1 sibling, 1 reply; 11+ messages in thread
From: Jon Smirl @ 2008-01-21 16:50 UTC (permalink / raw)
  To: Jean Delvare; +Cc: David Brownell, linuxppc-dev, Linux I2C

In my version of these patches new style drivers could be loaded with
both the driver_name/name scheme and the modalias. In these patches
new style drivers can only be loaded via modalias. Is that what you
intended? I'm all for making new style driver only use the modalias
scheme.

-- 
Jon Smirl
jonsmirl@gmail.com

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 2/3] i2c: Convert all new-style drivers to use module aliasing
  2008-01-21 16:50   ` Jon Smirl
@ 2008-01-22 10:09     ` Jean Delvare
  0 siblings, 0 replies; 11+ messages in thread
From: Jean Delvare @ 2008-01-22 10:09 UTC (permalink / raw)
  To: Jon Smirl; +Cc: David Brownell, linuxppc-dev, Linux I2C

Hi Jon,

On Mon, 21 Jan 2008 11:50:13 -0500, Jon Smirl wrote:
> In my version of these patches new style drivers could be loaded with
> both the driver_name/name scheme and the modalias. In these patches
> new style drivers can only be loaded via modalias. Is that what you
> intended? I'm all for making new style driver only use the modalias
> scheme.

Yes, this is what I intended. I see no point in having two ways to
achieve the same result, it makes things more complex, more costly and
possibly confusing.

I would reconsider if someone points out a very good reason to keep both
schemes in parallel.

-- 
Jean Delvare

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 2/3] i2c: Convert all new-style drivers to use module aliasing
  2008-01-21 10:41 ` [PATCH 2/3] i2c: Convert all new-style drivers to use module aliasing Jean Delvare
  2008-01-21 16:50   ` Jon Smirl
@ 2008-01-27 18:40   ` David Brownell
  2008-01-27 19:21     ` Jon Smirl
  2008-04-27 16:56     ` Jean Delvare
  1 sibling, 2 replies; 11+ messages in thread
From: David Brownell @ 2008-01-27 18:40 UTC (permalink / raw)
  To: Jean Delvare; +Cc: linuxppc-dev, Linux I2C

General comment:  if you're going to index arrays by enum
values, it's best to initialize them that way too.  Else
you're expecting a particular optional policy for how the
enums get grown...

- Dave


On Monday 21 January 2008, Jean Delvare wrote:
> --- linux-2.6.24-rc8.orig/drivers/rtc/rtc-ds1307.c	2008-01-20 17:26:58.000000000 +0100
> +++ linux-2.6.24-rc8/drivers/rtc/rtc-ds1307.c	2008-01-20 19:03:48.000000000 +0100
> @@ -102,42 +102,36 @@ struct chip_desc {
>  	char			name[9];
>  	unsigned		nvram56:1;
>  	unsigned		alarm:1;
> -	enum ds_type		type;
>  };
>  
>  static const struct chip_desc chips[] = { {
>  	.name		= "ds1307",
> -	.type		= ds_1307,
>  	.nvram56	= 1,
>  }, {

So tables like this would become

	[ds1307] = { ... },
	[ds1337] = { ... },

>  	.name		= "ds1337",
> -	.type		= ds_1337,
>  	.alarm		= 1,
>  }, {
>  	.name		= "ds1338",
> -	.type		= ds_1338,
>  	.nvram56	= 1,
>  }, {
>  	.name		= "ds1339",
> -	.type		= ds_1339,
>  	.alarm		= 1,
>  }, {
>  	.name		= "ds1340",
> -	.type		= ds_1340,
>  }, {
>  	.name		= "m41t00",
> -	.type		= m41t00,
>  }, };
>  
> -static inline const struct chip_desc *find_chip(const char *s)
> -{
> -	unsigned i;
> -
> -	for (i = 0; i < ARRAY_SIZE(chips); i++)
> -		if (strnicmp(s, chips[i].name, sizeof chips[i].name) == 0)
> -			return &chips[i];
> -	return NULL;
> -}
> +static const struct i2c_device_id ds1307_id[] = {
> +	{ "ds1307", ds_1307 },
> +	{ "ds1337", ds_1337 },
> +	{ "ds1338", ds_1338 },
> +	{ "ds1339", ds_1339 },
> +	{ "ds1340", ds_1340 },
> +	{ "m41t00", m41t00 },
> +	{},
> +};
> +MODULE_DEVICE_TABLE(i2c, ds1307_id);
>  
>  static int ds1307_get_time(struct device *dev, struct rtc_time *t)
>  {
> @@ -335,12 +329,7 @@ static int __devinit ds1307_probe(struct
>  	const struct chip_desc	*chip;
>  	struct i2c_adapter	*adapter = to_i2c_adapter(client->dev.parent);
>  
> -	chip = find_chip(client->name);
> -	if (!chip) {
> -		dev_err(&client->dev, "unknown chip type '%s'\n",
> -				client->name);
> -		return -ENODEV;
> -	}
> +	chip = &chips[id->driver_data];

... and that would *ensure* such lines always work right,
no matter how the enum values grow.

>  
>  	if (!i2c_check_functionality(adapter,
>  			I2C_FUNC_I2C | I2C_FUNC_SMBUS_WRITE_BYTE_DATA))

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 2/3] i2c: Convert all new-style drivers to use module aliasing
  2008-01-27 18:40   ` David Brownell
@ 2008-01-27 19:21     ` Jon Smirl
  2008-04-27 16:56     ` Jean Delvare
  1 sibling, 0 replies; 11+ messages in thread
From: Jon Smirl @ 2008-01-27 19:21 UTC (permalink / raw)
  To: David Brownell; +Cc: Jean Delvare, linuxppc-dev, Linux I2C

On 1/27/08, David Brownell <david-b@pacbell.net> wrote:
> General comment:  if you're going to index arrays by enum
> values, it's best to initialize them that way too.  Else
> you're expecting a particular optional policy for how the
> enums get grown...

Even better is the way the m41t80 driver does it. Can we get the base
patch set in first and then do driver clean up in later patches?

>
> - Dave
>
>
> On Monday 21 January 2008, Jean Delvare wrote:
> > --- linux-2.6.24-rc8.orig/drivers/rtc/rtc-ds1307.c    2008-01-20 17:26:58.000000000 +0100
> > +++ linux-2.6.24-rc8/drivers/rtc/rtc-ds1307.c 2008-01-20 19:03:48.000000000 +0100
> > @@ -102,42 +102,36 @@ struct chip_desc {
> >       char                    name[9];
> >       unsigned                nvram56:1;
> >       unsigned                alarm:1;
> > -     enum ds_type            type;
> >  };
> >
> >  static const struct chip_desc chips[] = { {
> >       .name           = "ds1307",
> > -     .type           = ds_1307,
> >       .nvram56        = 1,
> >  }, {
>
> So tables like this would become
>
>         [ds1307] = { ... },
>         [ds1337] = { ... },
>
> >       .name           = "ds1337",
> > -     .type           = ds_1337,
> >       .alarm          = 1,
> >  }, {
> >       .name           = "ds1338",
> > -     .type           = ds_1338,
> >       .nvram56        = 1,
> >  }, {
> >       .name           = "ds1339",
> > -     .type           = ds_1339,
> >       .alarm          = 1,
> >  }, {
> >       .name           = "ds1340",
> > -     .type           = ds_1340,
> >  }, {
> >       .name           = "m41t00",
> > -     .type           = m41t00,
> >  }, };
> >
> > -static inline const struct chip_desc *find_chip(const char *s)
> > -{
> > -     unsigned i;
> > -
> > -     for (i = 0; i < ARRAY_SIZE(chips); i++)
> > -             if (strnicmp(s, chips[i].name, sizeof chips[i].name) == 0)
> > -                     return &chips[i];
> > -     return NULL;
> > -}
> > +static const struct i2c_device_id ds1307_id[] = {
> > +     { "ds1307", ds_1307 },
> > +     { "ds1337", ds_1337 },
> > +     { "ds1338", ds_1338 },
> > +     { "ds1339", ds_1339 },
> > +     { "ds1340", ds_1340 },
> > +     { "m41t00", m41t00 },
> > +     {},
> > +};
> > +MODULE_DEVICE_TABLE(i2c, ds1307_id);
> >
> >  static int ds1307_get_time(struct device *dev, struct rtc_time *t)
> >  {
> > @@ -335,12 +329,7 @@ static int __devinit ds1307_probe(struct
> >       const struct chip_desc  *chip;
> >       struct i2c_adapter      *adapter = to_i2c_adapter(client->dev.parent);
> >
> > -     chip = find_chip(client->name);
> > -     if (!chip) {
> > -             dev_err(&client->dev, "unknown chip type '%s'\n",
> > -                             client->name);
> > -             return -ENODEV;
> > -     }
> > +     chip = &chips[id->driver_data];
>
> ... and that would *ensure* such lines always work right,
> no matter how the enum values grow.
>
> >
> >       if (!i2c_check_functionality(adapter,
> >                       I2C_FUNC_I2C | I2C_FUNC_SMBUS_WRITE_BYTE_DATA))
>


-- 
Jon Smirl
jonsmirl@gmail.com

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 2/3] i2c: Convert all new-style drivers to use module aliasing
  2008-01-27 18:40   ` David Brownell
  2008-01-27 19:21     ` Jon Smirl
@ 2008-04-27 16:56     ` Jean Delvare
  1 sibling, 0 replies; 11+ messages in thread
From: Jean Delvare @ 2008-04-27 16:56 UTC (permalink / raw)
  To: David Brownell; +Cc: linuxppc-dev, Linux I2C

On Sun, 27 Jan 2008 10:40:19 -0800, David Brownell wrote:
> General comment:  if you're going to index arrays by enum
> values, it's best to initialize them that way too.  Else
> you're expecting a particular optional policy for how the
> enums get grown...
> 
> - Dave
> 
> 
> On Monday 21 January 2008, Jean Delvare wrote:
> > --- linux-2.6.24-rc8.orig/drivers/rtc/rtc-ds1307.c	2008-01-20 17:26:58.000000000 +0100
> > +++ linux-2.6.24-rc8/drivers/rtc/rtc-ds1307.c	2008-01-20 19:03:48.000000000 +0100
> > @@ -102,42 +102,36 @@ struct chip_desc {
> >  	char			name[9];
> >  	unsigned		nvram56:1;
> >  	unsigned		alarm:1;
> > -	enum ds_type		type;
> >  };
> >  
> >  static const struct chip_desc chips[] = { {
> >  	.name		= "ds1307",
> > -	.type		= ds_1307,
> >  	.nvram56	= 1,
> >  }, {
> 
> So tables like this would become
> 
> 	[ds1307] = { ... },
> 	[ds1337] = { ... },
> 
> >  	.name		= "ds1337",
> > -	.type		= ds_1337,
> >  	.alarm		= 1,
> >  }, {
> >  	.name		= "ds1338",
> > -	.type		= ds_1338,
> >  	.nvram56	= 1,
> >  }, {
> >  	.name		= "ds1339",
> > -	.type		= ds_1339,
> >  	.alarm		= 1,
> >  }, {
> >  	.name		= "ds1340",
> > -	.type		= ds_1340,
> >  }, {
> >  	.name		= "m41t00",
> > -	.type		= m41t00,
> >  }, };
> >  
> > -static inline const struct chip_desc *find_chip(const char *s)
> > -{
> > -	unsigned i;
> > -
> > -	for (i = 0; i < ARRAY_SIZE(chips); i++)
> > -		if (strnicmp(s, chips[i].name, sizeof chips[i].name) == 0)
> > -			return &chips[i];
> > -	return NULL;
> > -}
> > +static const struct i2c_device_id ds1307_id[] = {
> > +	{ "ds1307", ds_1307 },
> > +	{ "ds1337", ds_1337 },
> > +	{ "ds1338", ds_1338 },
> > +	{ "ds1339", ds_1339 },
> > +	{ "ds1340", ds_1340 },
> > +	{ "m41t00", m41t00 },
> > +	{},
> > +};
> > +MODULE_DEVICE_TABLE(i2c, ds1307_id);
> >  
> >  static int ds1307_get_time(struct device *dev, struct rtc_time *t)
> >  {
> > @@ -335,12 +329,7 @@ static int __devinit ds1307_probe(struct
> >  	const struct chip_desc	*chip;
> >  	struct i2c_adapter	*adapter = to_i2c_adapter(client->dev.parent);
> >  
> > -	chip = find_chip(client->name);
> > -	if (!chip) {
> > -		dev_err(&client->dev, "unknown chip type '%s'\n",
> > -				client->name);
> > -		return -ENODEV;
> > -	}
> > +	chip = &chips[id->driver_data];
> 
> ... and that would *ensure* such lines always work right,
> no matter how the enum values grow.
> 
> >  
> >  	if (!i2c_check_functionality(adapter,
> >  			I2C_FUNC_I2C | I2C_FUNC_SMBUS_WRITE_BYTE_DATA))

Done, thanks for the suggestion and sorry for the delay.

-- 
Jean Delvare

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2008-04-27 16:56 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-01-21 10:25 [PATCH 0/3] i2c: Use the standard, alias-based device/driver matching scheme Jean Delvare
2008-01-21 10:39 ` [PATCH 1/3] i2c: Add support for device alias names Jean Delvare
2008-01-21 10:41 ` [PATCH 2/3] i2c: Convert all new-style drivers to use module aliasing Jean Delvare
2008-01-21 16:50   ` Jon Smirl
2008-01-22 10:09     ` Jean Delvare
2008-01-27 18:40   ` David Brownell
2008-01-27 19:21     ` Jon Smirl
2008-04-27 16:56     ` Jean Delvare
2008-01-21 10:43 ` [PATCH 3/3] i2c: Kill the old driver matching scheme Jean Delvare
2008-01-21 10:49 ` [i2c] [PATCH 0/3] i2c: Use the standard, alias-based device/driver " Rudolf Marek
2008-01-21 12:34   ` Jean Delvare

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).