* [PATCH 0/2] i2c: Add support for device alias names
@ 2008-04-28 9:30 Jean Delvare
2008-04-28 9:39 ` [PATCH 1/2] " Jean Delvare
` (2 more replies)
0 siblings, 3 replies; 12+ messages in thread
From: Jean Delvare @ 2008-04-28 9:30 UTC (permalink / raw)
To: Linux I2C
Cc: Laurent, Sievers, linuxppc-dev list, Paul Mundt, Scott Wood, Kay
Hi all,
This is an updated, minimal patchset to add support for device alias
names to the i2c subsystem. It is based on earlier work by Jon Smirl,
Jochen Friedrich and myself.
For 2.6.26-rc1 I'll only attempt to push the first two patches: the one
adding the support for alias names and the one converting the drivers
to make use of it. I've even excluded most of the video drivers from
this patch, as they are a bit more difficult to deal with and I don't
want to break them for rc1. This will come later, together with the
patch removing the old device/driver matching scheme.
I've fixed a number of bugs since the previous iteration, and added a
few missing chunks as well. I hope I caught all the pieces this time
but that's hard to tell given that much of the changes are in arch code
I can't even build. So I would like everyone interested in these two
patches getting in 2.6.26-rc1 to give them good testing on as many
systems as possible, and report to me, ideally by the end of the day.
Sorry for the short notice, but I did my best with the little spare
time I had.
Note that there are RTC patches pending for upstream merge, which will
conflict with my patches. Andrew Morton should push them to Linus
today, so that I can rebase my patches before I send them to Linus
(tomorrow). The current versions of the patches apply on top of
2.6.26-git11.
Thanks,
--
Jean Delvare
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH 1/2] i2c: Add support for device alias names
2008-04-28 9:30 [PATCH 0/2] i2c: Add support for device alias names Jean Delvare
@ 2008-04-28 9:39 ` Jean Delvare
2008-04-28 14:43 ` Jon Smirl
2008-04-28 15:07 ` Kay Sievers
2008-04-28 9:53 ` [PATCH 2/2] i2c: Convert most new-style drivers to use module aliasing Jean Delvare
2008-04-28 15:35 ` [i2c] [PATCH 0/2] i2c: Add support for device alias names Wolfram Sang
2 siblings, 2 replies; 12+ messages in thread
From: Jean Delvare @ 2008-04-28 9:39 UTC (permalink / raw)
To: Linux I2C
Cc: Laurent, Sievers, linuxppc-dev list, Paul Mundt, Scott Wood, Kay
Based on earlier work by Jon Smirl and Jochen Friedrich.
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: Jochen Friedrich <jochen@scram.de>
Cc: Jon Smirl <jonsmirl@gmail.com>
Cc: Kay Sievers <kay.sievers@vrfy.org>
---
One thing I am still not happy with is that the aliases created have a
trailing "*":
$ /sbin/modinfo lm90
filename: /lib/modules/2.6.25-git11/kernel/drivers/hwmon/lm90.ko
author: Jean Delvare <khali@linux-fr.org>
description: LM90/ADM1032 driver
license: GPL
vermagic: 2.6.25-git11 mod_unload
depends: hwmon
alias: i2c:lm90*
alias: i2c:adm1032*
alias: i2c:lm99*
alias: i2c:lm86*
alias: i2c:max6657*
alias: i2c:adt7461*
alias: i2c:max6680*
$
This would cause trouble if one I2C chip name matches the beginning of
another I2C chip name and both chips are supported by different
drivers. This has yet to be seen, but still, I'd like to see this
problem fixed quickly.
Documentation/i2c/writing-clients | 3 +
drivers/gpio/pca953x.c | 3 +
drivers/gpio/pcf857x.c | 3 +
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 | 51 +++++++++++++++++++++++-----
drivers/media/video/cs5345.c | 3 +
drivers/media/video/cs53l32a.c | 3 +
drivers/media/video/cx25840/cx25840-core.c | 3 +
drivers/media/video/m52790.c | 3 +
drivers/media/video/msp3400-driver.c | 2 -
drivers/media/video/mt9m001.c | 3 +
drivers/media/video/mt9v022.c | 3 +
drivers/media/video/saa7115.c | 3 +
drivers/media/video/saa7127.c | 3 +
drivers/media/video/saa717x.c | 3 +
drivers/media/video/tcm825x.c | 3 +
drivers/media/video/tlv320aic23b.c | 3 +
drivers/media/video/tuner-core.c | 3 +
drivers/media/video/tvaudio.c | 2 -
drivers/media/video/upd64031a.c | 3 +
drivers/media/video/upd64083.c | 3 +
drivers/media/video/v4l2-common.c | 5 +-
drivers/media/video/vp27smpx.c | 3 +
drivers/media/video/wm8739.c | 3 +
drivers/media/video/wm8775.c | 3 +
drivers/rtc/rtc-ds1307.c | 3 +
drivers/rtc/rtc-ds1374.c | 3 +
drivers/rtc/rtc-m41t80.c | 3 +
drivers/rtc/rtc-rs5c372.c | 3 +
drivers/rtc/rtc-s35390a.c | 3 +
include/linux/i2c.h | 5 +-
include/linux/mod_devicetable.h | 11 ++++++
include/media/v4l2-common.h | 4 +-
include/media/v4l2-i2c-drv-legacy.h | 2 -
include/media/v4l2-i2c-drv.h | 2 -
scripts/mod/file2alias.c | 13 +++++++
40 files changed, 141 insertions(+), 51 deletions(-)
--- linux-2.6.26-rc0.orig/Documentation/i2c/writing-clients 2008-04-27 22:05:00.000000000 +0200
+++ linux-2.6.26-rc0/Documentation/i2c/writing-clients 2008-04-27 22:09:29.000000000 +0200
@@ -164,7 +164,8 @@ I2C device drivers using this binding mo
kind of driver in Linux: they provide a probe() method to bind to
those devices, and a remove() method to unbind.
- static int foo_probe(struct i2c_client *client);
+ static int foo_probe(struct i2c_client *client,
+ const struct i2c_device_id *id);
static int foo_remove(struct i2c_client *client);
Remember that the i2c_driver does not create those client handles. The
--- linux-2.6.26-rc0.orig/drivers/gpio/pca953x.c 2008-04-27 22:05:00.000000000 +0200
+++ linux-2.6.26-rc0/drivers/gpio/pca953x.c 2008-04-27 22:09:29.000000000 +0200
@@ -191,7 +191,8 @@ static void pca953x_setup_gpio(struct pc
gc->label = chip->client->name;
}
-static int __devinit pca953x_probe(struct i2c_client *client)
+static int __devinit pca953x_probe(struct i2c_client *client,
+ const struct i2c_device_id *did)
{
struct pca953x_platform_data *pdata;
struct pca953x_chip *chip;
--- linux-2.6.26-rc0.orig/drivers/gpio/pcf857x.c 2008-04-27 22:05:00.000000000 +0200
+++ linux-2.6.26-rc0/drivers/gpio/pcf857x.c 2008-04-27 22:09:29.000000000 +0200
@@ -142,7 +142,8 @@ static void pcf857x_set16(struct gpio_ch
/*-------------------------------------------------------------------------*/
-static int pcf857x_probe(struct i2c_client *client)
+static int pcf857x_probe(struct i2c_client *client,
+ const struct i2c_device_id *id)
{
struct pcf857x_platform_data *pdata;
struct pcf857x *gpio;
--- linux-2.6.26-rc0.orig/drivers/hwmon/f75375s.c 2008-04-27 22:05:00.000000000 +0200
+++ linux-2.6.26-rc0/drivers/hwmon/f75375s.c 2008-04-27 22:09:29.000000000 +0200
@@ -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.26-rc0.orig/drivers/i2c/chips/ds1682.c 2008-04-27 22:05:00.000000000 +0200
+++ linux-2.6.26-rc0/drivers/i2c/chips/ds1682.c 2008-04-27 22:09:29.000000000 +0200
@@ -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.26-rc0.orig/drivers/i2c/chips/menelaus.c 2008-04-27 22:05:00.000000000 +0200
+++ linux-2.6.26-rc0/drivers/i2c/chips/menelaus.c 2008-04-27 22:09:29.000000000 +0200
@@ -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.26-rc0.orig/drivers/i2c/chips/tps65010.c 2008-04-27 22:08:10.000000000 +0200
+++ linux-2.6.26-rc0/drivers/i2c/chips/tps65010.c 2008-04-27 22:09:29.000000000 +0200
@@ -532,7 +532,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.26-rc0.orig/drivers/i2c/chips/tsl2550.c 2008-04-27 22:05:00.000000000 +0200
+++ linux-2.6.26-rc0/drivers/i2c/chips/tsl2550.c 2008-04-27 22:09:29.000000000 +0200
@@ -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.26-rc0.orig/drivers/i2c/i2c-core.c 2008-04-27 22:07:17.000000000 +0200
+++ linux-2.6.26-rc0/drivers/i2c/i2c-core.c 2008-04-27 22:09:29.000000000 +0200
@@ -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,13 +111,19 @@ 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;
int status;
if (!driver->probe)
return -ENODEV;
client->driver = driver;
dev_dbg(dev, "probe\n");
- status = driver->probe(client);
+
+ if (driver->id_table)
+ id = i2c_match_id(driver->id_table, client);
+ else
+ id = NULL;
+ status = driver->probe(client, id);
if (status)
client->driver = NULL;
return status;
@@ -179,9 +206,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[] = {
@@ -300,15 +327,21 @@ 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.26-rc0.orig/drivers/media/video/cs5345.c 2008-04-27 22:05:00.000000000 +0200
+++ linux-2.6.26-rc0/drivers/media/video/cs5345.c 2008-04-27 22:09:29.000000000 +0200
@@ -142,7 +142,8 @@ static int cs5345_command(struct i2c_cli
/* ----------------------------------------------------------------------- */
-static int cs5345_probe(struct i2c_client *client)
+static int cs5345_probe(struct i2c_client *client,
+ const struct i2c_device_id *id)
{
/* Check if the adapter supports the needed features */
if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA))
--- linux-2.6.26-rc0.orig/drivers/media/video/cs53l32a.c 2008-04-27 22:05:00.000000000 +0200
+++ linux-2.6.26-rc0/drivers/media/video/cs53l32a.c 2008-04-27 22:09:29.000000000 +0200
@@ -135,7 +135,8 @@ static int cs53l32a_command(struct i2c_c
* concerning the addresses: i2c wants 7 bit (without the r/w bit), so '>>1'
*/
-static int cs53l32a_probe(struct i2c_client *client)
+static int cs53l32a_probe(struct i2c_client *client,
+ const struct i2c_device_id *id)
{
int i;
--- linux-2.6.26-rc0.orig/drivers/media/video/cx25840/cx25840-core.c 2008-04-27 22:07:20.000000000 +0200
+++ linux-2.6.26-rc0/drivers/media/video/cx25840/cx25840-core.c 2008-04-27 22:09:29.000000000 +0200
@@ -1209,7 +1209,8 @@ static int cx25840_command(struct i2c_cl
/* ----------------------------------------------------------------------- */
-static int cx25840_probe(struct i2c_client *client)
+static int cx25840_probe(struct i2c_client *client,
+ const struct i2c_device_id *did)
{
struct cx25840_state *state;
u32 id;
--- linux-2.6.26-rc0.orig/drivers/media/video/m52790.c 2008-04-27 22:05:00.000000000 +0200
+++ linux-2.6.26-rc0/drivers/media/video/m52790.c 2008-04-27 22:09:29.000000000 +0200
@@ -126,7 +126,8 @@ static int m52790_command(struct i2c_cli
/* i2c implementation */
-static int m52790_probe(struct i2c_client *client)
+static int m52790_probe(struct i2c_client *client,
+ const struct i2c_device_id *id)
{
struct m52790_state *state;
--- linux-2.6.26-rc0.orig/drivers/media/video/msp3400-driver.c 2008-04-27 22:07:20.000000000 +0200
+++ linux-2.6.26-rc0/drivers/media/video/msp3400-driver.c 2008-04-27 22:09:29.000000000 +0200
@@ -805,7 +805,7 @@ static int msp_resume(struct i2c_client
/* ----------------------------------------------------------------------- */
-static int msp_probe(struct i2c_client *client)
+static int msp_probe(struct i2c_client *client, const struct i2c_device_id *id)
{
struct msp_state *state;
int (*thread_func)(void *data) = NULL;
--- linux-2.6.26-rc0.orig/drivers/media/video/mt9m001.c 2008-04-27 22:07:20.000000000 +0200
+++ linux-2.6.26-rc0/drivers/media/video/mt9m001.c 2008-04-27 22:09:29.000000000 +0200
@@ -620,7 +620,8 @@ static void mt9m001_video_remove(struct
soc_camera_video_stop(&mt9m001->icd);
}
-static int mt9m001_probe(struct i2c_client *client)
+static int mt9m001_probe(struct i2c_client *client,
+ const struct i2c_device_id *did)
{
struct mt9m001 *mt9m001;
struct soc_camera_device *icd;
--- linux-2.6.26-rc0.orig/drivers/media/video/mt9v022.c 2008-04-27 22:07:20.000000000 +0200
+++ linux-2.6.26-rc0/drivers/media/video/mt9v022.c 2008-04-27 22:09:29.000000000 +0200
@@ -745,7 +745,8 @@ static void mt9v022_video_remove(struct
soc_camera_video_stop(&mt9v022->icd);
}
-static int mt9v022_probe(struct i2c_client *client)
+static int mt9v022_probe(struct i2c_client *client,
+ const struct i2c_device_id *did)
{
struct mt9v022 *mt9v022;
struct soc_camera_device *icd;
--- linux-2.6.26-rc0.orig/drivers/media/video/saa7115.c 2008-04-27 22:07:20.000000000 +0200
+++ linux-2.6.26-rc0/drivers/media/video/saa7115.c 2008-04-27 22:09:29.000000000 +0200
@@ -1450,7 +1450,8 @@ static int saa7115_command(struct i2c_cl
/* ----------------------------------------------------------------------- */
-static int saa7115_probe(struct i2c_client *client)
+static int saa7115_probe(struct i2c_client *client,
+ const struct i2c_device_id *id)
{
struct saa711x_state *state;
int i;
--- linux-2.6.26-rc0.orig/drivers/media/video/saa7127.c 2008-04-27 22:05:00.000000000 +0200
+++ linux-2.6.26-rc0/drivers/media/video/saa7127.c 2008-04-27 22:09:29.000000000 +0200
@@ -661,7 +661,8 @@ static int saa7127_command(struct i2c_cl
/* ----------------------------------------------------------------------- */
-static int saa7127_probe(struct i2c_client *client)
+static int saa7127_probe(struct i2c_client *client,
+ const struct i2c_device_id *id)
{
struct saa7127_state *state;
struct v4l2_sliced_vbi_data vbi = { 0, 0, 0, 0 }; /* set to disabled */
--- linux-2.6.26-rc0.orig/drivers/media/video/saa717x.c 2008-04-27 22:07:20.000000000 +0200
+++ linux-2.6.26-rc0/drivers/media/video/saa717x.c 2008-04-27 22:09:29.000000000 +0200
@@ -1418,7 +1418,8 @@ static int saa717x_command(struct i2c_cl
/* i2c implementation */
/* ----------------------------------------------------------------------- */
-static int saa717x_probe(struct i2c_client *client)
+static int saa717x_probe(struct i2c_client *client,
+ const struct i2c_device_id *did)
{
struct saa717x_state *decoder;
u8 id = 0;
--- linux-2.6.26-rc0.orig/drivers/media/video/tcm825x.c 2008-04-27 22:07:20.000000000 +0200
+++ linux-2.6.26-rc0/drivers/media/video/tcm825x.c 2008-04-27 22:09:29.000000000 +0200
@@ -840,7 +840,8 @@ static struct v4l2_int_device tcm825x_in
},
};
-static int tcm825x_probe(struct i2c_client *client)
+static int tcm825x_probe(struct i2c_client *client,
+ const struct i2c_device_id *did)
{
struct tcm825x_sensor *sensor = &tcm825x;
int rval;
--- linux-2.6.26-rc0.orig/drivers/media/video/tlv320aic23b.c 2008-04-27 22:05:00.000000000 +0200
+++ linux-2.6.26-rc0/drivers/media/video/tlv320aic23b.c 2008-04-27 22:09:29.000000000 +0200
@@ -125,7 +125,8 @@ static int tlv320aic23b_command(struct i
* concerning the addresses: i2c wants 7 bit (without the r/w bit), so '>>1'
*/
-static int tlv320aic23b_probe(struct i2c_client *client)
+static int tlv320aic23b_probe(struct i2c_client *client,
+ const struct i2c_device_id *id)
{
struct tlv320aic23b_state *state;
--- linux-2.6.26-rc0.orig/drivers/media/video/tuner-core.c 2008-04-27 22:07:20.000000000 +0200
+++ linux-2.6.26-rc0/drivers/media/video/tuner-core.c 2008-04-27 22:09:29.000000000 +0200
@@ -1073,7 +1073,8 @@ static void tuner_lookup(struct i2c_adap
/* During client attach, set_type is called by adapter's attach_inform callback.
set_type must then be completed by tuner_probe.
*/
-static int tuner_probe(struct i2c_client *client)
+static int tuner_probe(struct i2c_client *client,
+ const struct i2c_device_id *id)
{
struct tuner *t;
struct tuner *radio;
--- linux-2.6.26-rc0.orig/drivers/media/video/tvaudio.c 2008-04-27 22:07:20.000000000 +0200
+++ linux-2.6.26-rc0/drivers/media/video/tvaudio.c 2008-04-27 22:09:29.000000000 +0200
@@ -1461,7 +1461,7 @@ static struct CHIPDESC chiplist[] = {
/* ---------------------------------------------------------------------- */
/* i2c registration */
-static int chip_probe(struct i2c_client *client)
+static int chip_probe(struct i2c_client *client, const struct i2c_device_id *id)
{
struct CHIPSTATE *chip;
struct CHIPDESC *desc;
--- linux-2.6.26-rc0.orig/drivers/media/video/upd64031a.c 2008-04-27 22:05:00.000000000 +0200
+++ linux-2.6.26-rc0/drivers/media/video/upd64031a.c 2008-04-27 22:09:29.000000000 +0200
@@ -195,7 +195,8 @@ static int upd64031a_command(struct i2c_
/* i2c implementation */
-static int upd64031a_probe(struct i2c_client *client)
+static int upd64031a_probe(struct i2c_client *client,
+ const struct i2c_device_id *id)
{
struct upd64031a_state *state;
int i;
--- linux-2.6.26-rc0.orig/drivers/media/video/upd64083.c 2008-04-27 22:05:00.000000000 +0200
+++ linux-2.6.26-rc0/drivers/media/video/upd64083.c 2008-04-27 22:09:29.000000000 +0200
@@ -172,7 +172,8 @@ static int upd64083_command(struct i2c_c
/* i2c implementation */
-static int upd64083_probe(struct i2c_client *client)
+static int upd64083_probe(struct i2c_client *client,
+ const struct i2c_device_id *id)
{
struct upd64083_state *state;
int i;
--- linux-2.6.26-rc0.orig/drivers/media/video/v4l2-common.c 2008-04-27 22:05:00.000000000 +0200
+++ linux-2.6.26-rc0/drivers/media/video/v4l2-common.c 2008-04-27 22:09:29.000000000 +0200
@@ -710,7 +710,8 @@ EXPORT_SYMBOL(v4l2_chip_ident_i2c_client
/* Helper function for I2C legacy drivers */
int v4l2_i2c_attach(struct i2c_adapter *adapter, int address, struct i2c_driver *driver,
- const char *name, int (*probe)(struct i2c_client *))
+ const char *name,
+ int (*probe)(struct i2c_client *, const struct i2c_device_id *))
{
struct i2c_client *client;
int err;
@@ -724,7 +725,7 @@ int v4l2_i2c_attach(struct i2c_adapter *
client->driver = driver;
strlcpy(client->name, name, sizeof(client->name));
- err = probe(client);
+ err = probe(client, NULL);
if (err == 0) {
i2c_attach_client(client);
} else {
--- linux-2.6.26-rc0.orig/drivers/media/video/vp27smpx.c 2008-04-27 22:05:00.000000000 +0200
+++ linux-2.6.26-rc0/drivers/media/video/vp27smpx.c 2008-04-27 22:09:29.000000000 +0200
@@ -121,7 +121,8 @@ static int vp27smpx_command(struct i2c_c
* concerning the addresses: i2c wants 7 bit (without the r/w bit), so '>>1'
*/
-static int vp27smpx_probe(struct i2c_client *client)
+static int vp27smpx_probe(struct i2c_client *client,
+ const struct i2c_device_id *id)
{
struct vp27smpx_state *state;
--- linux-2.6.26-rc0.orig/drivers/media/video/wm8739.c 2008-04-27 22:05:00.000000000 +0200
+++ linux-2.6.26-rc0/drivers/media/video/wm8739.c 2008-04-27 22:09:29.000000000 +0200
@@ -261,7 +261,8 @@ static int wm8739_command(struct i2c_cli
/* i2c implementation */
-static int wm8739_probe(struct i2c_client *client)
+static int wm8739_probe(struct i2c_client *client,
+ const struct i2c_device_id *id)
{
struct wm8739_state *state;
--- linux-2.6.26-rc0.orig/drivers/media/video/wm8775.c 2008-04-27 22:05:00.000000000 +0200
+++ linux-2.6.26-rc0/drivers/media/video/wm8775.c 2008-04-27 22:09:29.000000000 +0200
@@ -159,7 +159,8 @@ static int wm8775_command(struct i2c_cli
* concerning the addresses: i2c wants 7 bit (without the r/w bit), so '>>1'
*/
-static int wm8775_probe(struct i2c_client *client)
+static int wm8775_probe(struct i2c_client *client,
+ const struct i2c_device_id *id)
{
struct wm8775_state *state;
--- linux-2.6.26-rc0.orig/drivers/rtc/rtc-ds1307.c 2008-04-27 22:05:00.000000000 +0200
+++ linux-2.6.26-rc0/drivers/rtc/rtc-ds1307.c 2008-04-27 22:09:29.000000000 +0200
@@ -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.26-rc0.orig/drivers/rtc/rtc-ds1374.c 2008-04-27 22:05:00.000000000 +0200
+++ linux-2.6.26-rc0/drivers/rtc/rtc-ds1374.c 2008-04-27 22:09:29.000000000 +0200
@@ -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.26-rc0.orig/drivers/rtc/rtc-m41t80.c 2008-04-27 22:05:00.000000000 +0200
+++ linux-2.6.26-rc0/drivers/rtc/rtc-m41t80.c 2008-04-27 22:09:29.000000000 +0200
@@ -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.26-rc0.orig/drivers/rtc/rtc-rs5c372.c 2008-04-27 22:05:00.000000000 +0200
+++ linux-2.6.26-rc0/drivers/rtc/rtc-rs5c372.c 2008-04-27 22:09:29.000000000 +0200
@@ -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.26-rc0.orig/drivers/rtc/rtc-s35390a.c 2008-04-27 22:05:00.000000000 +0200
+++ linux-2.6.26-rc0/drivers/rtc/rtc-s35390a.c 2008-04-27 22:09:29.000000000 +0200
@@ -195,7 +195,8 @@ static const struct rtc_class_ops s35390
static struct i2c_driver s35390a_driver;
-static int s35390a_probe(struct i2c_client *client)
+static int s35390a_probe(struct i2c_client *client,
+ const struct i2c_device_id *id)
{
int err;
unsigned int i;
--- linux-2.6.26-rc0.orig/include/linux/i2c.h 2008-04-27 22:05:00.000000000 +0200
+++ linux-2.6.26-rc0/include/linux/i2c.h 2008-04-27 22:09:29.000000000 +0200
@@ -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 *);
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.26-rc0.orig/include/linux/mod_devicetable.h 2008-04-27 22:05:00.000000000 +0200
+++ linux-2.6.26-rc0/include/linux/mod_devicetable.h 2008-04-27 22:09:29.000000000 +0200
@@ -368,4 +368,15 @@ struct virtio_device_id {
};
#define VIRTIO_DEV_ANY_ID 0xffffffff
+/* i2c */
+
+#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.26-rc0.orig/include/media/v4l2-common.h 2008-04-27 22:05:00.000000000 +0200
+++ linux-2.6.26-rc0/include/media/v4l2-common.h 2008-04-27 22:09:29.000000000 +0200
@@ -107,9 +107,11 @@ int v4l2_chip_match_host(u32 id_type, u3
struct i2c_driver;
struct i2c_adapter;
struct i2c_client;
+struct i2c_device_id;
int v4l2_i2c_attach(struct i2c_adapter *adapter, int address, struct i2c_driver *driver,
- const char *name, int (*probe)(struct i2c_client *));
+ const char *name,
+ int (*probe)(struct i2c_client *, const struct i2c_device_id *));
/* ------------------------------------------------------------------------- */
--- linux-2.6.26-rc0.orig/include/media/v4l2-i2c-drv-legacy.h 2008-04-27 22:05:00.000000000 +0200
+++ linux-2.6.26-rc0/include/media/v4l2-i2c-drv-legacy.h 2008-04-27 22:09:29.000000000 +0200
@@ -25,7 +25,7 @@ struct v4l2_i2c_driver_data {
const char * const name;
int driverid;
int (*command)(struct i2c_client *client, unsigned int cmd, void *arg);
- int (*probe)(struct i2c_client *client);
+ int (*probe)(struct i2c_client *client, const struct i2c_device_id *id);
int (*remove)(struct i2c_client *client);
int (*suspend)(struct i2c_client *client, pm_message_t state);
int (*resume)(struct i2c_client *client);
--- linux-2.6.26-rc0.orig/include/media/v4l2-i2c-drv.h 2008-04-27 22:05:00.000000000 +0200
+++ linux-2.6.26-rc0/include/media/v4l2-i2c-drv.h 2008-04-27 22:09:29.000000000 +0200
@@ -30,7 +30,7 @@ struct v4l2_i2c_driver_data {
const char * const name;
int driverid;
int (*command)(struct i2c_client *client, unsigned int cmd, void *arg);
- int (*probe)(struct i2c_client *client);
+ int (*probe)(struct i2c_client *client, const struct i2c_device_id *id);
int (*remove)(struct i2c_client *client);
int (*suspend)(struct i2c_client *client, pm_message_t state);
int (*resume)(struct i2c_client *client);
--- linux-2.6.26-rc0.orig/scripts/mod/file2alias.c 2008-04-27 22:07:28.000000000 +0200
+++ linux-2.6.26-rc0/scripts/mod/file2alias.c 2008-04-27 22:09:29.000000000 +0200
@@ -576,6 +576,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)
{
@@ -704,6 +713,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] 12+ messages in thread
* [PATCH 2/2] i2c: Convert most new-style drivers to use module aliasing
2008-04-28 9:30 [PATCH 0/2] i2c: Add support for device alias names Jean Delvare
2008-04-28 9:39 ` [PATCH 1/2] " Jean Delvare
@ 2008-04-28 9:53 ` Jean Delvare
2008-04-28 15:35 ` [i2c] [PATCH 0/2] i2c: Add support for device alias names Wolfram Sang
2 siblings, 0 replies; 12+ messages in thread
From: Jean Delvare @ 2008-04-28 9:53 UTC (permalink / raw)
To: Linux I2C
Cc: Laurent, Sievers, linuxppc-dev list, Paul Mundt, Scott Wood, Kay
Based on earlier work by Jon Smirl and Jochen Friedrich.
Update most new-style i2c drivers to use standard module aliasing
instead of the old driver_name/type driver matching scheme. I've
left the video drivers apart (except for SoC camera drivers) as
they're a bit more diffcult to deal with, they'll have their own
patch later.
Signed-off-by: Jean Delvare <khali@linux-fr.org>
Cc: Jon Smirl <jonsmirl@gmail.com>
Cc: Jochen Friedrich <jochen@scram.de>
Cc: Kay Sievers <kay.sievers@vrfy.org>
---
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/glantank.c | 4 -
arch/arm/mach-iop32x/n2100.c | 4 -
arch/arm/mach-ixp4xx/dsmg600-setup.c | 2
arch/arm/mach-ixp4xx/nas100d-setup.c | 2
arch/arm/mach-ixp4xx/nslu2-setup.c | 2
arch/arm/mach-omap1/board-h2.c | 2
arch/arm/mach-omap1/board-h3.c | 3 -
arch/arm/mach-omap1/board-osk.c | 1
arch/arm/mach-orion5x/db88f5281-setup.c | 4 -
arch/arm/mach-orion5x/dns323-setup.c | 7 --
arch/arm/mach-orion5x/kurobox_pro-setup.c | 4 -
arch/arm/mach-orion5x/rd88f5182-setup.c | 4 -
arch/arm/mach-orion5x/ts209-setup.c | 3 -
arch/arm/mach-pxa/pcm990-baseboard.c | 5 -
arch/blackfin/mach-bf533/boards/stamp.c | 3 -
arch/blackfin/mach-bf537/boards/stamp.c | 3 -
arch/blackfin/mach-bf548/boards/ezkit.c | 2
arch/powerpc/sysdev/fsl_soc.c | 27 ++++------
arch/sh/boards/renesas/migor/setup.c | 3 -
arch/sh/boards/renesas/r7780rp/setup.c | 3 -
drivers/gpio/pca953x.c | 23 +-------
drivers/gpio/pcf857x.c | 33 +++++++-----
drivers/hwmon/f75375s.c | 23 ++++----
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 | 29 ++++------
drivers/i2c/chips/tsl2550.c | 7 ++
drivers/media/video/mt9m001.c | 7 ++
drivers/media/video/mt9v022.c | 7 ++
drivers/rtc/rtc-ds1307.c | 63 +++++++++--------------
drivers/rtc/rtc-ds1374.c | 7 ++
drivers/rtc/rtc-m41t80.c | 78 +++++++----------------------
drivers/rtc/rtc-rs5c372.c | 24 ++++----
drivers/rtc/rtc-s35390a.c | 7 ++
include/linux/i2c.h | 12 ++--
40 files changed, 190 insertions(+), 247 deletions(-)
--- linux-2.6.26-rc0.orig/arch/arm/mach-at91/board-csb337.c 2008-04-27 22:07:12.000000000 +0200
+++ linux-2.6.26-rc0/arch/arm/mach-at91/board-csb337.c 2008-04-27 22:09:48.000000000 +0200
@@ -79,8 +79,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.26-rc0.orig/arch/arm/mach-at91/board-dk.c 2008-04-27 22:04:59.000000000 +0200
+++ linux-2.6.26-rc0/arch/arm/mach-at91/board-dk.c 2008-04-27 22:09:48.000000000 +0200
@@ -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.26-rc0.orig/arch/arm/mach-at91/board-eb9200.c 2008-04-27 22:04:59.000000000 +0200
+++ linux-2.6.26-rc0/arch/arm/mach-at91/board-eb9200.c 2008-04-27 22:09:48.000000000 +0200
@@ -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.26-rc0.orig/arch/arm/mach-iop32x/em7210.c 2008-04-27 22:04:59.000000000 +0200
+++ linux-2.6.26-rc0/arch/arm/mach-iop32x/em7210.c 2008-04-27 22:09:48.000000000 +0200
@@ -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.26-rc0.orig/arch/arm/mach-iop32x/glantank.c 2008-04-27 22:04:59.000000000 +0200
+++ linux-2.6.26-rc0/arch/arm/mach-iop32x/glantank.c 2008-04-27 22:09:48.000000000 +0200
@@ -176,12 +176,10 @@ static struct f75375s_platform_data glan
static struct i2c_board_info __initdata glantank_i2c_devices[] = {
{
- I2C_BOARD_INFO("rtc-rs5c372", 0x32),
- .type = "rs5c372a",
+ I2C_BOARD_INFO("rs5c372a", 0x32),
},
{
I2C_BOARD_INFO("f75375", 0x2e),
- .type = "f75375",
.platform_data = &glantank_f75375s,
},
};
--- linux-2.6.26-rc0.orig/arch/arm/mach-iop32x/n2100.c 2008-04-27 22:04:59.000000000 +0200
+++ linux-2.6.26-rc0/arch/arm/mach-iop32x/n2100.c 2008-04-27 22:09:48.000000000 +0200
@@ -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.26-rc0.orig/arch/arm/mach-ixp4xx/dsmg600-setup.c 2008-04-27 22:04:59.000000000 +0200
+++ linux-2.6.26-rc0/arch/arm/mach-ixp4xx/dsmg600-setup.c 2008-04-27 22:09:48.000000000 +0200
@@ -65,7 +65,7 @@ static struct platform_device dsmg600_i2
static struct i2c_board_info __initdata dsmg600_i2c_board_info [] = {
{
- I2C_BOARD_INFO("rtc-pcf8563", 0x51),
+ I2C_BOARD_INFO("pcf8563", 0x51),
},
};
--- linux-2.6.26-rc0.orig/arch/arm/mach-ixp4xx/nas100d-setup.c 2008-04-27 22:04:59.000000000 +0200
+++ linux-2.6.26-rc0/arch/arm/mach-ixp4xx/nas100d-setup.c 2008-04-27 22:09:48.000000000 +0200
@@ -54,7 +54,7 @@ static struct platform_device nas100d_fl
static struct i2c_board_info __initdata nas100d_i2c_board_info [] = {
{
- I2C_BOARD_INFO("rtc-pcf8563", 0x51),
+ I2C_BOARD_INFO("pcf8563", 0x51),
},
};
--- linux-2.6.26-rc0.orig/arch/arm/mach-ixp4xx/nslu2-setup.c 2008-04-27 22:04:59.000000000 +0200
+++ linux-2.6.26-rc0/arch/arm/mach-ixp4xx/nslu2-setup.c 2008-04-27 22:09:48.000000000 +0200
@@ -57,7 +57,7 @@ static struct i2c_gpio_platform_data nsl
static struct i2c_board_info __initdata nslu2_i2c_board_info [] = {
{
- I2C_BOARD_INFO("rtc-x1205", 0x6f),
+ I2C_BOARD_INFO("x1205", 0x6f),
},
};
--- linux-2.6.26-rc0.orig/arch/arm/mach-omap1/board-h2.c 2008-04-27 22:04:59.000000000 +0200
+++ linux-2.6.26-rc0/arch/arm/mach-omap1/board-h2.c 2008-04-27 22:09:48.000000000 +0200
@@ -351,11 +351,9 @@ static void __init h2_init_smc91x(void)
static struct i2c_board_info __initdata h2_i2c_board_info[] = {
{
I2C_BOARD_INFO("tps65010", 0x48),
- .type = "tps65010",
.irq = OMAP_GPIO_IRQ(58),
}, {
I2C_BOARD_INFO("isp1301_omap", 0x2d),
- .type = "isp1301_omap",
.irq = OMAP_GPIO_IRQ(2),
},
};
--- linux-2.6.26-rc0.orig/arch/arm/mach-omap1/board-h3.c 2008-04-27 22:04:59.000000000 +0200
+++ linux-2.6.26-rc0/arch/arm/mach-omap1/board-h3.c 2008-04-27 22:09:48.000000000 +0200
@@ -473,8 +473,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(??), */
},
};
--- linux-2.6.26-rc0.orig/arch/arm/mach-omap1/board-osk.c 2008-04-27 22:07:12.000000000 +0200
+++ linux-2.6.26-rc0/arch/arm/mach-omap1/board-osk.c 2008-04-27 22:09:48.000000000 +0200
@@ -254,7 +254,6 @@ static struct tps65010_board tps_board =
static struct i2c_board_info __initdata osk_i2c_board_info[] = {
{
I2C_BOARD_INFO("tps65010", 0x48),
- .type = "tps65010",
.irq = OMAP_GPIO_IRQ(OMAP_MPUIO(1)),
.platform_data = &tps_board,
--- linux-2.6.26-rc0.orig/arch/arm/mach-orion5x/db88f5281-setup.c 2008-04-27 22:07:12.000000000 +0200
+++ linux-2.6.26-rc0/arch/arm/mach-orion5x/db88f5281-setup.c 2008-04-27 22:57:29.000000000 +0200
@@ -292,9 +292,7 @@ static struct mv643xx_eth_platform_data
* RTC DS1339 on I2C bus
****************************************************************************/
static struct i2c_board_info __initdata db88f5281_i2c_rtc = {
- .driver_name = "rtc-ds1307",
- .type = "ds1339",
- .addr = 0x68,
+ I2C_BOARD_INFO("ds1339", 0x68),
};
/*****************************************************************************
--- linux-2.6.26-rc0.orig/arch/arm/mach-orion5x/dns323-setup.c 2008-04-27 22:07:12.000000000 +0200
+++ linux-2.6.26-rc0/arch/arm/mach-orion5x/dns323-setup.c 2008-04-27 22:09:48.000000000 +0200
@@ -220,19 +220,16 @@ static struct platform_device *dns323_pl
static struct i2c_board_info __initdata dns323_i2c_devices[] = {
{
I2C_BOARD_INFO("g760a", 0x3e),
- .type = "g760a",
},
#if 0
/* this entry requires the new-style driver model lm75 driver,
* for the meantime "insmod lm75.ko force_lm75=0,0x48" is needed */
{
- I2C_BOARD_INFO("lm75", 0x48),
- .type = "g751",
+ I2C_BOARD_INFO("g751", 0x48),
},
#endif
{
- I2C_BOARD_INFO("rtc-m41t80", 0x68),
- .type = "m41t80",
+ I2C_BOARD_INFO("m41t80", 0x68),
}
};
--- linux-2.6.26-rc0.orig/arch/arm/mach-orion5x/kurobox_pro-setup.c 2008-04-27 22:07:12.000000000 +0200
+++ linux-2.6.26-rc0/arch/arm/mach-orion5x/kurobox_pro-setup.c 2008-04-27 22:56:59.000000000 +0200
@@ -162,9 +162,7 @@ static struct mv643xx_eth_platform_data
* RTC 5C372a on I2C bus
****************************************************************************/
static struct i2c_board_info __initdata kurobox_pro_i2c_rtc = {
- .driver_name = "rtc-rs5c372",
- .type = "rs5c372a",
- .addr = 0x32,
+ I2C_BOARD_INFO("rs5c372a", 0x32),
};
/*****************************************************************************
--- linux-2.6.26-rc0.orig/arch/arm/mach-orion5x/rd88f5182-setup.c 2008-04-27 22:07:12.000000000 +0200
+++ linux-2.6.26-rc0/arch/arm/mach-orion5x/rd88f5182-setup.c 2008-04-27 22:58:02.000000000 +0200
@@ -224,9 +224,7 @@ static struct mv643xx_eth_platform_data
* RTC DS1338 on I2C bus
****************************************************************************/
static struct i2c_board_info __initdata rd88f5182_i2c_rtc = {
- .driver_name = "rtc-ds1307",
- .type = "ds1338",
- .addr = 0x68,
+ I2C_BOARD_INFO("ds1338", 0x68),
};
/*****************************************************************************
--- linux-2.6.26-rc0.orig/arch/arm/mach-orion5x/ts209-setup.c 2008-04-27 22:07:12.000000000 +0200
+++ linux-2.6.26-rc0/arch/arm/mach-orion5x/ts209-setup.c 2008-04-27 22:58:52.000000000 +0200
@@ -276,8 +276,7 @@ static void __init ts209_find_mac_addr(v
#define TS209_RTC_GPIO 3
static struct i2c_board_info __initdata qnap_ts209_i2c_rtc = {
- .driver_name = "rtc-s35390a",
- .addr = 0x30,
+ I2C_BOARD_INFO("s35390a", 0x30),
.irq = 0,
};
--- linux-2.6.26-rc0.orig/arch/arm/mach-pxa/pcm990-baseboard.c 2008-04-27 22:07:12.000000000 +0200
+++ linux-2.6.26-rc0/arch/arm/mach-pxa/pcm990-baseboard.c 2008-04-27 22:09:48.000000000 +0200
@@ -320,16 +320,13 @@ static struct soc_camera_link iclink[] =
static struct i2c_board_info __initdata pcm990_i2c_devices[] = {
{
/* Must initialize before the camera(s) */
- I2C_BOARD_INFO("pca953x", 0x41),
- .type = "pca9536",
+ I2C_BOARD_INFO("pca9536", 0x41),
.platform_data = &pca9536_data,
}, {
I2C_BOARD_INFO("mt9v022", 0x48),
- .type = "mt9v022",
.platform_data = &iclink[0], /* With extender */
}, {
I2C_BOARD_INFO("mt9m001", 0x5d),
- .type = "mt9m001",
.platform_data = &iclink[0], /* With extender */
},
};
--- linux-2.6.26-rc0.orig/arch/blackfin/mach-bf533/boards/stamp.c 2008-04-27 22:07:12.000000000 +0200
+++ linux-2.6.26-rc0/arch/blackfin/mach-bf533/boards/stamp.c 2008-04-27 22:09:48.000000000 +0200
@@ -499,20 +499,17 @@ static struct i2c_board_info __initdata
#if defined(CONFIG_JOYSTICK_AD7142) || defined(CONFIG_JOYSTICK_AD7142_MODULE)
{
I2C_BOARD_INFO("ad7142_joystick", 0x2C),
- .type = "ad7142_joystick",
.irq = 39,
},
#endif
#if defined(CONFIG_TWI_LCD) || defined(CONFIG_TWI_LCD_MODULE)
{
I2C_BOARD_INFO("pcf8574_lcd", 0x22),
- .type = "pcf8574_lcd",
},
#endif
#if defined(CONFIG_TWI_KEYPAD) || defined(CONFIG_TWI_KEYPAD_MODULE)
{
I2C_BOARD_INFO("pcf8574_keypad", 0x27),
- .type = "pcf8574_keypad",
.irq = 39,
},
#endif
--- linux-2.6.26-rc0.orig/arch/blackfin/mach-bf537/boards/stamp.c 2008-04-27 22:07:12.000000000 +0200
+++ linux-2.6.26-rc0/arch/blackfin/mach-bf537/boards/stamp.c 2008-04-27 22:09:48.000000000 +0200
@@ -751,20 +751,17 @@ static struct i2c_board_info __initdata
#if defined(CONFIG_JOYSTICK_AD7142) || defined(CONFIG_JOYSTICK_AD7142_MODULE)
{
I2C_BOARD_INFO("ad7142_joystick", 0x2C),
- .type = "ad7142_joystick",
.irq = 55,
},
#endif
#if defined(CONFIG_TWI_LCD) || defined(CONFIG_TWI_LCD_MODULE)
{
I2C_BOARD_INFO("pcf8574_lcd", 0x22),
- .type = "pcf8574_lcd",
},
#endif
#if defined(CONFIG_TWI_KEYPAD) || defined(CONFIG_TWI_KEYPAD_MODULE)
{
I2C_BOARD_INFO("pcf8574_keypad", 0x27),
- .type = "pcf8574_keypad",
.irq = 72,
},
#endif
--- linux-2.6.26-rc0.orig/arch/blackfin/mach-bf548/boards/ezkit.c 2008-04-27 22:07:12.000000000 +0200
+++ linux-2.6.26-rc0/arch/blackfin/mach-bf548/boards/ezkit.c 2008-04-27 22:09:48.000000000 +0200
@@ -641,13 +641,11 @@ static struct i2c_board_info __initdata
#if defined(CONFIG_TWI_LCD) || defined(CONFIG_TWI_LCD_MODULE)
{
I2C_BOARD_INFO("pcf8574_lcd", 0x22),
- .type = "pcf8574_lcd",
},
#endif
#if defined(CONFIG_TWI_KEYPAD) || defined(CONFIG_TWI_KEYPAD_MODULE)
{
I2C_BOARD_INFO("pcf8574_keypad", 0x27),
- .type = "pcf8574_keypad",
.irq = 212,
},
#endif
--- linux-2.6.26-rc0.orig/arch/powerpc/sysdev/fsl_soc.c 2008-04-27 22:07:13.000000000 +0200
+++ linux-2.6.26-rc0/arch/powerpc/sysdev/fsl_soc.c 2008-04-27 22:09:48.000000000 +0200
@@ -418,22 +418,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,
@@ -444,9 +443,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.26-rc0.orig/arch/sh/boards/renesas/migor/setup.c 2008-04-27 22:07:13.000000000 +0200
+++ linux-2.6.26-rc0/arch/sh/boards/renesas/migor/setup.c 2008-04-27 22:09:48.000000000 +0200
@@ -199,8 +199,7 @@ static struct platform_device *migor_dev
static struct i2c_board_info __initdata migor_i2c_devices[] = {
{
- I2C_BOARD_INFO("rtc-rs5c372", 0x32),
- .type = "rs5c372b",
+ I2C_BOARD_INFO("rs5c372b", 0x32),
},
{
I2C_BOARD_INFO("migor_ts", 0x51),
--- linux-2.6.26-rc0.orig/arch/sh/boards/renesas/r7780rp/setup.c 2008-04-27 22:07:13.000000000 +0200
+++ linux-2.6.26-rc0/arch/sh/boards/renesas/r7780rp/setup.c 2008-04-27 22:09:48.000000000 +0200
@@ -199,8 +199,7 @@ static struct platform_device smbus_devi
static struct i2c_board_info __initdata highlander_i2c_devices[] = {
{
- I2C_BOARD_INFO("rtc-rs5c372", 0x32),
- .type = "r2025sd",
+ I2C_BOARD_INFO("r2025sd", 0x32),
},
};
--- linux-2.6.26-rc0.orig/drivers/gpio/pca953x.c 2008-04-27 22:09:29.000000000 +0200
+++ linux-2.6.26-rc0/drivers/gpio/pca953x.c 2008-04-27 22:09:48.000000000 +0200
@@ -23,13 +23,7 @@
#define PCA953X_INVERT 2
#define PCA953X_DIRECTION 3
-/* This is temporary - in 2.6.26 i2c_driver_data should replace it. */
-struct pca953x_desc {
- char name[I2C_NAME_SIZE];
- unsigned long driver_data;
-};
-
-static const struct pca953x_desc pca953x_descs[] = {
+static const struct i2c_device_id pca953x_id[] = {
{ "pca9534", 8, },
{ "pca9535", 16, },
{ "pca9536", 4, },
@@ -37,7 +31,9 @@ static const struct pca953x_desc pca953x
{ "pca9538", 8, },
{ "pca9539", 16, },
/* REVISIT several pca955x parts should work here too */
+ { }
};
+MODULE_DEVICE_TABLE(i2c, pca953x_id);
struct pca953x_chip {
unsigned gpio_start;
@@ -192,26 +188,16 @@ static void pca953x_setup_gpio(struct pc
}
static int __devinit pca953x_probe(struct i2c_client *client,
- const struct i2c_device_id *did)
+ const struct i2c_device_id *id)
{
struct pca953x_platform_data *pdata;
struct pca953x_chip *chip;
int ret, i;
- const struct pca953x_desc *id = NULL;
pdata = client->dev.platform_data;
if (pdata == NULL)
return -ENODEV;
- /* this loop vanishes when we get i2c_device_id */
- for (i = 0; i < ARRAY_SIZE(pca953x_descs); i++)
- if (!strcmp(pca953x_descs[i].name, client->name)) {
- id = pca953x_descs + i;
- break;
- }
- if (!id)
- return -ENODEV;
-
chip = kzalloc(sizeof(struct pca953x_chip), GFP_KERNEL);
if (chip == NULL)
return -ENOMEM;
@@ -291,6 +277,7 @@ static struct i2c_driver pca953x_driver
},
.probe = pca953x_probe,
.remove = pca953x_remove,
+ .id_table = pca953x_id,
};
static int __init pca953x_init(void)
--- linux-2.6.26-rc0.orig/drivers/gpio/pcf857x.c 2008-04-27 22:09:29.000000000 +0200
+++ linux-2.6.26-rc0/drivers/gpio/pcf857x.c 2008-04-27 22:09:48.000000000 +0200
@@ -26,6 +26,21 @@
#include <asm/gpio.h>
+static const struct i2c_device_id pcf857x_id[] = {
+ { "pcf8574", 8 },
+ { "pca8574", 8 },
+ { "pca9670", 8 },
+ { "pca9672", 8 },
+ { "pca9674", 8 },
+ { "pcf8575", 16 },
+ { "pca8575", 16 },
+ { "pca9671", 16 },
+ { "pca9673", 16 },
+ { "pca9675", 16 },
+ { }
+};
+MODULE_DEVICE_TABLE(i2c, pcf857x_id);
+
/*
* The pcf857x, pca857x, and pca967x chips only expose one read and one
* write register. Writing a "one" bit (to match the reset state) lets
@@ -172,13 +187,8 @@ static int pcf857x_probe(struct i2c_clie
*
* NOTE: we don't distinguish here between *4 and *4a parts.
*/
- if (strcmp(client->name, "pcf8574") == 0
- || strcmp(client->name, "pca8574") == 0
- || strcmp(client->name, "pca9670") == 0
- || strcmp(client->name, "pca9672") == 0
- || strcmp(client->name, "pca9674") == 0
- ) {
- gpio->chip.ngpio = 8;
+ gpio->chip.ngpio = id->driver_data;
+ if (gpio->chip.ngpio == 8) {
gpio->chip.direction_input = pcf857x_input8;
gpio->chip.get = pcf857x_get8;
gpio->chip.direction_output = pcf857x_output8;
@@ -198,13 +208,7 @@ static int pcf857x_probe(struct i2c_clie
*
* NOTE: we don't distinguish here between '75 and '75c parts.
*/
- } else if (strcmp(client->name, "pcf8575") == 0
- || strcmp(client->name, "pca8575") == 0
- || strcmp(client->name, "pca9671") == 0
- || strcmp(client->name, "pca9673") == 0
- || strcmp(client->name, "pca9675") == 0
- ) {
- gpio->chip.ngpio = 16;
+ } else if (gpio->chip.ngpio == 16) {
gpio->chip.direction_input = pcf857x_input16;
gpio->chip.get = pcf857x_get16;
gpio->chip.direction_output = pcf857x_output16;
@@ -313,6 +317,7 @@ static struct i2c_driver pcf857x_driver
},
.probe = pcf857x_probe,
.remove = pcf857x_remove,
+ .id_table = pcf857x_id,
};
static int __init pcf857x_init(void)
--- linux-2.6.26-rc0.orig/drivers/hwmon/f75375s.c 2008-04-27 22:09:29.000000000 +0200
+++ linux-2.6.26-rc0/drivers/hwmon/f75375s.c 2008-04-27 22:09:48.000000000 +0200
@@ -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)
@@ -645,15 +653,7 @@ static int f75375_probe(struct i2c_clien
i2c_set_clientdata(client, data);
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;
- }
+ data->kind = id->driver_data;
if ((err = sysfs_create_group(&client->dev.kobj, &f75375_group)))
goto exit_free;
@@ -714,6 +714,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 +751,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.26-rc0.orig/drivers/i2c/busses/i2c-taos-evm.c 2008-04-27 22:04:59.000000000 +0200
+++ linux-2.6.26-rc0/drivers/i2c/busses/i2c-taos-evm.c 2008-04-27 22:09:48.000000000 +0200
@@ -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.26-rc0.orig/drivers/i2c/chips/ds1682.c 2008-04-27 22:09:29.000000000 +0200
+++ linux-2.6.26-rc0/drivers/i2c/chips/ds1682.c 2008-04-27 22:09:48.000000000 +0200
@@ -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.26-rc0.orig/drivers/i2c/chips/menelaus.c 2008-04-27 22:09:29.000000000 +0200
+++ linux-2.6.26-rc0/drivers/i2c/chips/menelaus.c 2008-04-27 22:09:48.000000000 +0200
@@ -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.26-rc0.orig/drivers/i2c/chips/tps65010.c 2008-04-27 22:09:29.000000000 +0200
+++ linux-2.6.26-rc0/drivers/i2c/chips/tps65010.c 2008-04-27 22:09:48.000000000 +0200
@@ -64,7 +64,6 @@ static struct i2c_driver tps65010_driver
* as part of board setup by a bootloader.
*/
enum tps_model {
- TPS_UNKNOWN = 0,
TPS65010,
TPS65011,
TPS65012,
@@ -554,20 +553,7 @@ static int tps65010_probe(struct i2c_cli
mutex_init(&tps->lock);
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;
- }
+ tps->model = id->driver_data;
/* the IRQ is active low, but many gpio lines can't support that
* so this driver uses falling-edge triggers instead.
@@ -596,9 +582,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);
@@ -685,12 +668,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.26-rc0.orig/drivers/i2c/chips/tsl2550.c 2008-04-27 22:09:29.000000000 +0200
+++ linux-2.6.26-rc0/drivers/i2c/chips/tsl2550.c 2008-04-27 22:09:48.000000000 +0200
@@ -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.26-rc0.orig/drivers/media/video/mt9m001.c 2008-04-27 22:09:29.000000000 +0200
+++ linux-2.6.26-rc0/drivers/media/video/mt9m001.c 2008-04-27 22:09:48.000000000 +0200
@@ -697,12 +697,19 @@ static int mt9m001_remove(struct i2c_cli
return 0;
}
+static const struct i2c_device_id mt9m001_id[] = {
+ { "mt9m001", 0 },
+ { }
+};
+MODULE_DEVICE_TABLE(i2c, mt9m001_id);
+
static struct i2c_driver mt9m001_i2c_driver = {
.driver = {
.name = "mt9m001",
},
.probe = mt9m001_probe,
.remove = mt9m001_remove,
+ .id_table = mt9m001_id,
};
static int __init mt9m001_mod_init(void)
--- linux-2.6.26-rc0.orig/drivers/media/video/mt9v022.c 2008-04-27 22:09:29.000000000 +0200
+++ linux-2.6.26-rc0/drivers/media/video/mt9v022.c 2008-04-27 22:09:48.000000000 +0200
@@ -819,12 +819,19 @@ static int mt9v022_remove(struct i2c_cli
return 0;
}
+static const struct i2c_device_id mt9v022_id[] = {
+ { "mt9v022", 0 },
+ { }
+};
+MODULE_DEVICE_TABLE(i2c, mt9v022_id);
+
static struct i2c_driver mt9v022_i2c_driver = {
.driver = {
.name = "mt9v022",
},
.probe = mt9v022_probe,
.remove = mt9v022_remove,
+ .id_table = mt9v022_id,
};
static int __init mt9v022_mod_init(void)
--- linux-2.6.26-rc0.orig/drivers/rtc/rtc-ds1307.c 2008-04-27 22:09:29.000000000 +0200
+++ linux-2.6.26-rc0/drivers/rtc/rtc-ds1307.c 2008-04-28 09:26:39.000000000 +0200
@@ -99,45 +99,38 @@ struct ds1307 {
};
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,
+static const struct chip_desc chips[] = {
+[ds_1307] = {
.nvram56 = 1,
-}, {
- .name = "ds1337",
- .type = ds_1337,
+},
+[ds_1337] = {
.alarm = 1,
-}, {
- .name = "ds1338",
- .type = ds_1338,
+},
+[ds_1338] = {
.nvram56 = 1,
-}, {
- .name = "ds1339",
- .type = ds_1339,
+},
+[ds_1339] = {
.alarm = 1,
-}, {
- .name = "ds1340",
- .type = ds_1340,
-}, {
- .name = "m41t00",
- .type = m41t00,
+},
+[ds_1340] = {
+},
+[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)
{
@@ -332,16 +325,9 @@ static int __devinit ds1307_probe(struct
struct ds1307 *ds1307;
int err = -ENODEV;
int tmp;
- const struct chip_desc *chip;
+ const struct chip_desc *chip = &chips[id->driver_data];
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;
- }
-
if (!i2c_check_functionality(adapter,
I2C_FUNC_I2C | I2C_FUNC_SMBUS_WRITE_BYTE_DATA))
return -EIO;
@@ -362,7 +348,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:
@@ -551,6 +537,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.26-rc0.orig/drivers/rtc/rtc-ds1374.c 2008-04-27 22:09:29.000000000 +0200
+++ linux-2.6.26-rc0/drivers/rtc/rtc-ds1374.c 2008-04-27 22:09:48.000000000 +0200
@@ -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.26-rc0.orig/drivers/rtc/rtc-m41t80.c 2008-04-27 22:09:29.000000000 +0200
+++ linux-2.6.26-rc0/drivers/rtc/rtc-m41t80.c 2008-04-27 22:09:48.000000000 +0200
@@ -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.26-rc0.orig/drivers/rtc/rtc-rs5c372.c 2008-04-27 22:09:29.000000000 +0200
+++ linux-2.6.26-rc0/drivers/rtc/rtc-rs5c372.c 2008-04-27 22:09:48.000000000 +0200
@@ -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);
@@ -517,25 +526,13 @@ static int rs5c372_probe(struct i2c_clie
rs5c372->regs=&rs5c372->buf[1];
rs5c372->client = client;
+ rs5c372->type = id->driver_data;
i2c_set_clientdata(client, rs5c372);
err = rs5c_get_regs(rs5c372);
if (err < 0)
goto exit_kfree;
- if (strcmp(client->name, "rs5c372a") == 0)
- rs5c372->type = rtc_rs5c372a;
- else if (strcmp(client->name, "rs5c372b") == 0)
- rs5c372->type = rtc_rs5c372b;
- else if (strcmp(client->name, "rv5c386") == 0)
- rs5c372->type = rtc_rv5c386;
- else if (strcmp(client->name, "rv5c387a") == 0)
- rs5c372->type = rtc_rv5c387a;
- else {
- rs5c372->type = rtc_rs5c372b;
- dev_warn(&client->dev, "assuming rs5c372b\n");
- }
-
/* clock may be set for am/pm or 24 hr time */
switch (rs5c372->type) {
case rtc_rs5c372a:
@@ -652,6 +649,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.26-rc0.orig/drivers/rtc/rtc-s35390a.c 2008-04-27 22:09:29.000000000 +0200
+++ linux-2.6.26-rc0/drivers/rtc/rtc-s35390a.c 2008-04-28 08:44:20.000000000 +0200
@@ -34,6 +34,12 @@
#define S35390A_FLAG_RESET 0x80
#define S35390A_FLAG_TEST 0x01
+static const struct i2c_device_id s35390a_id[] = {
+ { "s35390a", 0 },
+ { }
+};
+MODULE_DEVICE_TABLE(i2c, s35390a_id);
+
struct s35390a {
struct i2c_client *client[8];
struct rtc_device *rtc;
@@ -297,6 +303,7 @@ static struct i2c_driver s35390a_driver
},
.probe = s35390a_probe,
.remove = s35390a_remove,
+ .id_table = s35390a_id,
};
static int __init s35390a_rtc_init(void)
--- linux-2.6.26-rc0.orig/include/linux/i2c.h 2008-04-27 22:09:29.000000000 +0200
+++ linux-2.6.26-rc0/include/linux/i2c.h 2008-04-28 08:44:20.000000000 +0200
@@ -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] 12+ messages in thread
* Re: [PATCH 1/2] i2c: Add support for device alias names
2008-04-28 9:39 ` [PATCH 1/2] " Jean Delvare
@ 2008-04-28 14:43 ` Jon Smirl
2008-04-28 15:42 ` Jean Delvare
2008-04-28 15:07 ` Kay Sievers
1 sibling, 1 reply; 12+ messages in thread
From: Jon Smirl @ 2008-04-28 14:43 UTC (permalink / raw)
To: Jean Delvare
Cc: Kay Sievers, linuxppc-dev list, Paul Mundt, Linux I2C, Scott Wood
On 4/28/08, Jean Delvare <khali@linux-fr.org> wrote:
> Based on earlier work by Jon Smirl and Jochen Friedrich.
>
> 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: Jochen Friedrich <jochen@scram.de>
> Cc: Jon Smirl <jonsmirl@gmail.com>
> Cc: Kay Sievers <kay.sievers@vrfy.org>
> ---
> One thing I am still not happy with is that the aliases created have a
> trailing "*":
>
> $ /sbin/modinfo lm90
> filename: /lib/modules/2.6.25-git11/kernel/drivers/hwmon/lm90.ko
> author: Jean Delvare <khali@linux-fr.org>
> description: LM90/ADM1032 driver
> license: GPL
> vermagic: 2.6.25-git11 mod_unload
> depends: hwmon
> alias: i2c:lm90*
> alias: i2c:adm1032*
> alias: i2c:lm99*
> alias: i2c:lm86*
> alias: i2c:max6657*
> alias: i2c:adt7461*
> alias: i2c:max6680*
> $
>
> This would cause trouble if one I2C chip name matches the beginning of
> another I2C chip name and both chips are supported by different
> drivers. This has yet to be seen, but still, I'd like to see this
> problem fixed quickly.
Trailing wildcard is always added by file2alias.c:
if (do_entry(mod->name, symval+i, alias)) {
/* Always end in a wildcard, for future extension */
if (alias[strlen(alias)-1] != '*')
strcat(alias, "*");
Can't the match order be controlled in the makefile? For example if
you had lm905* and lm90*, put lm905* into into the makefile first
which will cause it to appear in the alias file first. But that would
still cause problems if only lm90 was built and you had a lm905
device.
Alternatively you could change the code to append something like a
period to the name string.
sprintf(alias, I2C_MODULE_PREFIX "%s.", id->name);
I was using macros to alter the name strings to move the PowerPC names
into their own namespace.
--
Jon Smirl
jonsmirl@gmail.com
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH 1/2] i2c: Add support for device alias names
2008-04-28 9:39 ` [PATCH 1/2] " Jean Delvare
2008-04-28 14:43 ` Jon Smirl
@ 2008-04-28 15:07 ` Kay Sievers
2008-04-28 15:40 ` Jean Delvare
1 sibling, 1 reply; 12+ messages in thread
From: Kay Sievers @ 2008-04-28 15:07 UTC (permalink / raw)
To: Jean Delvare; +Cc: linuxppc-dev list, Paul Mundt, Scott Wood, Linux I2C
On Mon, 2008-04-28 at 11:39 +0200, Jean Delvare wrote:
> Based on earlier work by Jon Smirl and Jochen Friedrich.
>=20
> 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.
>=20
> Signed-off-by: Jean Delvare <khali@linux-fr.org>
> Cc: Jochen Friedrich <jochen@scram.de>
> Cc: Jon Smirl <jonsmirl@gmail.com>
> Cc: Kay Sievers <kay.sievers@vrfy.org>
> ---
> One thing I am still not happy with is that the aliases created have a
> trailing "*":
>=20
> $ /sbin/modinfo lm90
> filename: /lib/modules/2.6.25-git11/kernel/drivers/hwmon/lm90.ko
> author: Jean Delvare <khali@linux-fr.org>
> description: LM90/ADM1032 driver
> license: GPL
> vermagic: 2.6.25-git11 mod_unload
> depends: hwmon
> alias: i2c:lm90*
> alias: i2c:adm1032*
> alias: i2c:lm99*
> alias: i2c:lm86*
> alias: i2c:max6657*
> alias: i2c:adt7461*
> alias: i2c:max6680*
> $
>=20
> This would cause trouble if one I2C chip name matches the beginning of
> another I2C chip name and both chips are supported by different
> drivers. This has yet to be seen, but still, I'd like to see this
> problem fixed quickly.
=EF=BB=BFRight, the trailing "*" is not nice.
We should terminate the string, so the trailing "*" will not match
longer strings. The usual thing is to add a ":" to the end, which would
then show up as
alias: i2c:max6680:*
See DMI and ACPI:
alias dmi:*:svnFUJITSU:pnLifeBook*:pvr*:rvnFUJITSU:* apanel
alias acpi*:ASIM0000:* atlas_btns
If i2c device modaliases could ever contain multiple strings, it should
be:
alias: i2c*:max6680:*
=EF=BB=BFto match the module, regardless of the order of the strings in the
modalias:
Thanks,
Kay
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [i2c] [PATCH 0/2] i2c: Add support for device alias names
2008-04-28 9:30 [PATCH 0/2] i2c: Add support for device alias names Jean Delvare
2008-04-28 9:39 ` [PATCH 1/2] " Jean Delvare
2008-04-28 9:53 ` [PATCH 2/2] i2c: Convert most new-style drivers to use module aliasing Jean Delvare
@ 2008-04-28 15:35 ` Wolfram Sang
2008-04-28 20:24 ` Jochen Friedrich
2 siblings, 1 reply; 12+ messages in thread
From: Wolfram Sang @ 2008-04-28 15:35 UTC (permalink / raw)
To: Jean Delvare
Cc: Sievers, Laurent, linuxppc-dev list, Paul Mundt, Linux I2C, Kay,
Scott Wood
[-- Attachment #1: Type: text/plain, Size: 834 bytes --]
Hello Jean,
I tested on this hardware
MPC8260 (powerpc) + PCF8575 (io expander) + LM84 (sensor)
+ RS5C372 (rtc) + X24645 (eeprom)
the following software
2.6.25-git11 + your 2 patches + Patches 5-7 from Jochen's series
(for the CPM2-bus-driver)
The rtc and the eeprom were assigend through of-tree. The expander
and the sensor were assigned via the old-binding method using
force-parameters.
It builds fine, except for two warnings of redefinitions in Jochen's
patches. (I think they need a few updates anyhow). The output in
modules.alias and /sys make sense. I2C works flawlessly for all
devices.
Please let me know, if you need to more information.
All the best,
Wolfram
--
Dipl.-Ing. Wolfram Sang | http://www.pengutronix.de
Pengutronix - Linux Solutions for Science and Industry
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 189 bytes --]
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH 1/2] i2c: Add support for device alias names
2008-04-28 15:07 ` Kay Sievers
@ 2008-04-28 15:40 ` Jean Delvare
2008-04-28 16:16 ` Kay Sievers
0 siblings, 1 reply; 12+ messages in thread
From: Jean Delvare @ 2008-04-28 15:40 UTC (permalink / raw)
To: Kay Sievers; +Cc: linuxppc-dev list, Paul Mundt, Scott Wood, Jon, Linux I2C
Hi Kay,
On Mon, 28 Apr 2008 17:07:25 +0200, Kay Sievers wrote:
> On Mon, 2008-04-28 at 11:39 +0200, Jean Delvare wrote:
> > One thing I am still not happy with is that the aliases created have a
> > trailing "*":
> >=20
> > $ /sbin/modinfo lm90
> > filename: /lib/modules/2.6.25-git11/kernel/drivers/hwmon/lm90.ko
> > author: Jean Delvare <khali@linux-fr.org>
> > description: LM90/ADM1032 driver
> > license: GPL
> > vermagic: 2.6.25-git11 mod_unload
> > depends: hwmon
> > alias: i2c:lm90*
> > alias: i2c:adm1032*
> > alias: i2c:lm99*
> > alias: i2c:lm86*
> > alias: i2c:max6657*
> > alias: i2c:adt7461*
> > alias: i2c:max6680*
> > $
> >=20
> > This would cause trouble if one I2C chip name matches the beginning of
> > another I2C chip name and both chips are supported by different
> > drivers. This has yet to be seen, but still, I'd like to see this
> > problem fixed quickly.
>=20
> =EF=BB=BFRight, the trailing "*" is not nice.
>=20
> We should terminate the string, so the trailing "*" will not match
> longer strings. The usual thing is to add a ":" to the end, which would
> then show up as
> alias: i2c:max6680:*
>=20
> See DMI and ACPI:
> alias dmi:*:svnFUJITSU:pnLifeBook*:pvr*:rvnFUJITSU:* apanel
> alias acpi*:ASIM0000:* atlas_btns
I didn't know about these cases, thanks for the hint.
>=20
> If i2c device modaliases could ever contain multiple strings, it should
> be:
> alias: i2c*:max6680:*
> =EF=BB=BFto match the module, regardless of the order of the strings in t=
he
> modalias:
Why would i2c device modaliases ever contain multiple strings? A device
can't have multiple names, can it?
Adding a ":" at the end of the i2c device names solves the problem I
was mentioning, sure, but why don't we simply remove the trailing "*",
instead of trying to work around it? A trailing "*" simply makes no
sense for aliases which are simple device names. This is not only i2c
devices, but also platform devices, acpi, dmi, pnp... Looking at the
various device types handled by file2alias.c, it seems that most of
them don't need the trailing "*", and many of them have the problem I
was mentioning.
Can't we just stop handle_moddevtable() from adding a tailing "*"
automatically, and just let the device types which need it, add it on
their own?
Thanks,
--=20
Jean Delvare
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH 1/2] i2c: Add support for device alias names
2008-04-28 14:43 ` Jon Smirl
@ 2008-04-28 15:42 ` Jean Delvare
0 siblings, 0 replies; 12+ messages in thread
From: Jean Delvare @ 2008-04-28 15:42 UTC (permalink / raw)
To: Jon Smirl
Cc: Kay Sievers, linuxppc-dev list, Paul Mundt, Linux I2C, Scott Wood
Hi Jon,
On Mon, 28 Apr 2008 10:43:35 -0400, Jon Smirl wrote:
> On 4/28/08, Jean Delvare <khali@linux-fr.org> wrote:
> > One thing I am still not happy with is that the aliases created have a
> > trailing "*":
> >
> > $ /sbin/modinfo lm90
> > filename: /lib/modules/2.6.25-git11/kernel/drivers/hwmon/lm90.ko
> > author: Jean Delvare <khali@linux-fr.org>
> > description: LM90/ADM1032 driver
> > license: GPL
> > vermagic: 2.6.25-git11 mod_unload
> > depends: hwmon
> > alias: i2c:lm90*
> > alias: i2c:adm1032*
> > alias: i2c:lm99*
> > alias: i2c:lm86*
> > alias: i2c:max6657*
> > alias: i2c:adt7461*
> > alias: i2c:max6680*
> > $
> >
> > This would cause trouble if one I2C chip name matches the beginning of
> > another I2C chip name and both chips are supported by different
> > drivers. This has yet to be seen, but still, I'd like to see this
> > problem fixed quickly.
>
>
> Trailing wildcard is always added by file2alias.c:
>
> if (do_entry(mod->name, symval+i, alias)) {
> /* Always end in a wildcard, for future extension */
> if (alias[strlen(alias)-1] != '*')
> strcat(alias, "*");
>
>
> Can't the match order be controlled in the makefile? For example if
> you had lm905* and lm90*, put lm905* into into the makefile first
> which will cause it to appear in the alias file first. But that would
> still cause problems if only lm90 was built and you had a lm905
> device.
That's too trickly and fragile - I'd rather make sure that wrong
matches just can't happen.
>
> Alternatively you could change the code to append something like a
> period to the name string.
>
> sprintf(alias, I2C_MODULE_PREFIX "%s.", id->name);
Similar to what Kay proposed. It works and we'll do that if we have to,
but if we can just get rid of the "*" I'd rather do that.
>
> I was using macros to alter the name strings to move the PowerPC names
> into their own namespace.
>
--
Jean Delvare
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH 1/2] i2c: Add support for device alias names
2008-04-28 15:40 ` Jean Delvare
@ 2008-04-28 16:16 ` Kay Sievers
2008-05-01 8:04 ` Jean Delvare
0 siblings, 1 reply; 12+ messages in thread
From: Kay Sievers @ 2008-04-28 16:16 UTC (permalink / raw)
To: Jean Delvare; +Cc: linuxppc-dev list, Paul Mundt, Scott Wood, Linux I2C
On Mon, 2008-04-28 at 17:40 +0200, Jean Delvare wrote:
> On Mon, 28 Apr 2008 17:07:25 +0200, Kay Sievers wrote:
> > On Mon, 2008-04-28 at 11:39 +0200, Jean Delvare wrote:
> > > One thing I am still not happy with is that the aliases created have =
a
> > > trailing "*":
> > >=20
> > > $ /sbin/modinfo lm90
> > > filename: /lib/modules/2.6.25-git11/kernel/drivers/hwmon/lm90.k=
o
> > > author: Jean Delvare <khali@linux-fr.org>
> > > description: LM90/ADM1032 driver
> > > license: GPL
> > > vermagic: 2.6.25-git11 mod_unload
> > > depends: hwmon
> > > alias: i2c:lm90*
> > > alias: i2c:adm1032*
> > > alias: i2c:lm99*
> > > alias: i2c:lm86*
> > > alias: i2c:max6657*
> > > alias: i2c:adt7461*
> > > alias: i2c:max6680*
> > > $
> > >=20
> > > This would cause trouble if one I2C chip name matches the beginning o=
f
> > > another I2C chip name and both chips are supported by different
> > > drivers. This has yet to be seen, but still, I'd like to see this
> > > problem fixed quickly.
> >=20
> > =EF=BB=BFRight, the trailing "*" is not nice.
> >=20
> > We should terminate the string, so the trailing "*" will not match
> > longer strings. The usual thing is to add a ":" to the end, which would
> > then show up as
> > alias: i2c:max6680:*
> >=20
> > See DMI and ACPI:
> > alias dmi:*:svnFUJITSU:pnLifeBook*:pvr*:rvnFUJITSU:* apanel
> > alias acpi*:ASIM0000:* atlas_btns
>=20
> I didn't know about these cases, thanks for the hint.
>=20
> >=20
> > If i2c device modaliases could ever contain multiple strings, it should
> > be:
> > alias: i2c*:max6680:*
> > =EF=BB=BFto match the module, regardless of the order of the strings in=
the
> > modalias:
>=20
> Why would i2c device modaliases ever contain multiple strings? A device
> can't have multiple names, can it?
Like ACPI/PNP devices, which can have several compat id's, which means
that a single device can have "multiple names":
$ cat /sys/bus/pnp/devices/00:09/id
IBM0057
PNP0f13
> Adding a ":" at the end of the i2c device names solves the problem I
> was mentioning, sure, but why don't we simply remove the trailing "*",
> instead of trying to work around it? A trailing "*" simply makes no
> sense for aliases which are simple device names.
Sure, if there is only one single string, it's not useful.
> This is not only i2c
> devices, but also platform devices, acpi, dmi, pnp...
ACPI, DMI, PNP (PNP does not do modalias) needs to be able to match only
one string in a given list, so the trailing "*" is needed.
> Looking at the
> various device types handled by file2alias.c, it seems that most of
> them don't need the trailing "*", and many of them have the problem I
> was mentioning.
>=20
> Can't we just stop handle_moddevtable() from adding a tailing "*"
> automatically, and just let the device types which need it, add it on
> their own?
For a lot subsystems it's fine to have it appended, as there is a
defined list of identifiers, which must appear in the same order, and
new identifiers are appended to the end. So the "*" still matches
modules with possibly extended modalias strings.
We would also need to review all buses which export modalias, if they
need the "*" or not, and add them by hand, if needed.
I guess, it's easier to introduce an additional parameter to
file2alias::do_table() and suppress the trailing "*" for i2c?
Thanks,
Kay
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [i2c] [PATCH 0/2] i2c: Add support for device alias names
2008-04-28 15:35 ` [i2c] [PATCH 0/2] i2c: Add support for device alias names Wolfram Sang
@ 2008-04-28 20:24 ` Jochen Friedrich
0 siblings, 0 replies; 12+ messages in thread
From: Jochen Friedrich @ 2008-04-28 20:24 UTC (permalink / raw)
To: Wolfram Sang
Cc: Sievers, Laurent, Scott Wood, linuxppc-dev list, Paul Mundt,
Linux I2C, Kay, Jean Delvare
Hi Wolfram,
> I tested on this hardware
>
> MPC8260 (powerpc) + PCF8575 (io expander) + LM84 (sensor)
> + RS5C372 (rtc) + X24645 (eeprom)
It's also OK on dbox2 hardware: MPC823 (powerpc)
+ saa7127 (patch needed to add id_table) + dbox frontprocessor
(8051 controller with i2c interface).
Thanks,
Jochen
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH 1/2] i2c: Add support for device alias names
2008-04-28 16:16 ` Kay Sievers
@ 2008-05-01 8:04 ` Jean Delvare
2008-05-01 15:51 ` Kay Sievers
0 siblings, 1 reply; 12+ messages in thread
From: Jean Delvare @ 2008-05-01 8:04 UTC (permalink / raw)
To: Kay Sievers; +Cc: linuxppc-dev list, Paul Mundt, Scott Wood, Jon, Linux I2C
Hi Kay,
On Mon, 28 Apr 2008 18:16:17 +0200, Kay Sievers wrote:
> On Mon, 2008-04-28 at 17:40 +0200, Jean Delvare wrote:
> > Why would i2c device modaliases ever contain multiple strings? A device
> > can't have multiple names, can it?
>
> Like ACPI/PNP devices, which can have several compat id's, which means
> that a single device can have "multiple names":
> $ cat /sys/bus/pnp/devices/00:09/id
> IBM0057
> PNP0f13
Ah, I didn't know about this. Now I'm curious how it can work. Does it
mean that several drivers attempt to bind to this device?
> > Adding a ":" at the end of the i2c device names solves the problem I
> > was mentioning, sure, but why don't we simply remove the trailing "*",
> > instead of trying to work around it? A trailing "*" simply makes no
> > sense for aliases which are simple device names.
>
> Sure, if there is only one single string, it's not useful.
>
> > This is not only i2c
> > devices, but also platform devices, acpi, dmi, pnp...
>
> ACPI, DMI, PNP (PNP does not do modalias) needs to be able to match only
> one string in a given list, so the trailing "*" is needed.
OK, I get the idea.
> > Can't we just stop handle_moddevtable() from adding a tailing "*"
> > automatically, and just let the device types which need it, add it on
> > their own?
>
> For a lot subsystems it's fine to have it appended, as there is a
> defined list of identifiers, which must appear in the same order, and
> new identifiers are appended to the end. So the "*" still matches
> modules with possibly extended modalias strings.
I understand the logic, however I am skeptical how useful it is in
practice. If we add an identifier to the device aliases, then we also
update the corresponding modalias, so no in-tree driver can break. The
only case where it makes a difference, as far as I can see, is for
out-of-tree drivers. Am I correct? On top of that, I doubt that we
actually add new identifiers that frequently, do we?
> We would also need to review all buses which export modalias, if they
> need the "*" or not, and add them by hand, if needed.
>
> I guess, it's easier to introduce an additional parameter to
> file2alias::do_table() and suppress the trailing "*" for i2c?
That's one possibility, but I had a slightly different approach, which
is to just let the type-specific handlers add the trailing "*" by
themselves if they need it. This allows for optimization in a few
cases.
Subject: modpost: i2c aliases need no trailing wildcard
Not all device type aliases need a trailing wildcard, in particular
the i2c aliases don't. Don't add a wildcard by default in do_table(),
instead let each device type handler add it if needed.
Signed-off-by: Jean Delvare <khali@linux-fr.org>
---
scripts/mod/file2alias.c | 33 ++++++++++++++++++++++++---------
1 file changed, 24 insertions(+), 9 deletions(-)
--- linux-2.6.26-rc0.orig/scripts/mod/file2alias.c 2008-05-01 07:56:14.000000000 +0200
+++ linux-2.6.26-rc0/scripts/mod/file2alias.c 2008-05-01 09:39:37.000000000 +0200
@@ -51,6 +51,15 @@ do {
sprintf(str + strlen(str), "*"); \
} while(0)
+/* Always end in a wildcard, for future extension */
+static inline void add_wildcard(char *str)
+{
+ int len = strlen(str);
+
+ if (str[len - 1] != '*')
+ strcat(str + len, "*");
+}
+
unsigned int cross_build = 0;
/**
* Check that sizeof(device_id type) are consistent with size of section
@@ -133,9 +142,7 @@ static void do_usb_entry(struct usb_devi
id->match_flags&USB_DEVICE_ID_MATCH_INT_PROTOCOL,
id->bInterfaceProtocol);
- /* Always end in a wildcard, for future extension */
- if (alias[strlen(alias)-1] != '*')
- strcat(alias, "*");
+ add_wildcard(alias);
buf_printf(&mod->dev_table_buf,
"MODULE_ALIAS(\"%s\");\n", alias);
}
@@ -219,6 +226,7 @@ static int do_ieee1394_entry(const char
ADD(alias, "ver", id->match_flags & IEEE1394_MATCH_VERSION,
id->version);
+ add_wildcard(alias);
return 1;
}
@@ -261,6 +269,7 @@ static int do_pci_entry(const char *file
ADD(alias, "bc", baseclass_mask == 0xFF, baseclass);
ADD(alias, "sc", subclass_mask == 0xFF, subclass);
ADD(alias, "i", interface_mask == 0xFF, interface);
+ add_wildcard(alias);
return 1;
}
@@ -283,6 +292,7 @@ static int do_ccw_entry(const char *file
id->dev_type);
ADD(alias, "dm", id->match_flags&CCW_DEVICE_ID_MATCH_DEVICE_MODEL,
id->dev_model);
+ add_wildcard(alias);
return 1;
}
@@ -290,7 +300,7 @@ static int do_ccw_entry(const char *file
static int do_ap_entry(const char *filename,
struct ap_device_id *id, char *alias)
{
- sprintf(alias, "ap:t%02X", id->dev_type);
+ sprintf(alias, "ap:t%02X*", id->dev_type);
return 1;
}
@@ -309,6 +319,7 @@ static int do_serio_entry(const char *fi
ADD(alias, "id", id->id != SERIO_ANY, id->id);
ADD(alias, "ex", id->extra != SERIO_ANY, id->extra);
+ add_wildcard(alias);
return 1;
}
@@ -316,7 +327,7 @@ static int do_serio_entry(const char *fi
static int do_acpi_entry(const char *filename,
struct acpi_device_id *id, char *alias)
{
- sprintf(alias, "acpi*:%s:", id->id);
+ sprintf(alias, "acpi*:%s:*", id->id);
return 1;
}
@@ -324,7 +335,7 @@ static int do_acpi_entry(const char *fil
static int do_pnp_entry(const char *filename,
struct pnp_device_id *id, char *alias)
{
- sprintf(alias, "pnp:d%s", id->id);
+ sprintf(alias, "pnp:d%s*", id->id);
return 1;
}
@@ -409,6 +420,7 @@ static int do_pcmcia_entry(const char *f
ADD(alias, "pc", id->match_flags & PCMCIA_DEV_ID_MATCH_PROD_ID3, id->prod_id_hash[2]);
ADD(alias, "pd", id->match_flags & PCMCIA_DEV_ID_MATCH_PROD_ID4, id->prod_id_hash[3]);
+ add_wildcard(alias);
return 1;
}
@@ -432,6 +444,7 @@ static int do_of_entry (const char *file
if (isspace (*tmp))
*tmp = '_';
+ add_wildcard(alias);
return 1;
}
@@ -448,6 +461,7 @@ static int do_vio_entry(const char *file
if (isspace (*tmp))
*tmp = '_';
+ add_wildcard(alias);
return 1;
}
@@ -529,6 +543,7 @@ static int do_parisc_entry(const char *f
ADD(alias, "rev", id->hversion_rev != PA_HVERSION_REV_ANY_ID, id->hversion_rev);
ADD(alias, "sv", id->sversion != PA_SVERSION_ANY_ID, id->sversion);
+ add_wildcard(alias);
return 1;
}
@@ -544,6 +559,7 @@ static int do_sdio_entry(const char *fil
ADD(alias, "c", id->class != (__u8)SDIO_ANY_ID, id->class);
ADD(alias, "v", id->vendor != (__u16)SDIO_ANY_ID, id->vendor);
ADD(alias, "d", id->device != (__u16)SDIO_ANY_ID, id->device);
+ add_wildcard(alias);
return 1;
}
@@ -559,6 +575,7 @@ static int do_ssb_entry(const char *file
ADD(alias, "v", id->vendor != SSB_ANY_VENDOR, id->vendor);
ADD(alias, "id", id->coreid != SSB_ANY_ID, id->coreid);
ADD(alias, "rev", id->revision != SSB_ANY_REV, id->revision);
+ add_wildcard(alias);
return 1;
}
@@ -573,6 +590,7 @@ static int do_virtio_entry(const char *f
ADD(alias, "d", 1, id->device);
ADD(alias, "v", id->vendor != VIRTIO_DEV_ANY_ID, id->vendor);
+ add_wildcard(alias);
return 1;
}
@@ -612,9 +630,6 @@ static void do_table(void *symval, unsig
for (i = 0; i < size; i += id_size) {
if (do_entry(mod->name, symval+i, alias)) {
- /* Always end in a wildcard, for future extension */
- if (alias[strlen(alias)-1] != '*')
- strcat(alias, "*");
buf_printf(&mod->dev_table_buf,
"MODULE_ALIAS(\"%s\");\n", alias);
}
The patch only changes the i2c aliases, all the rest is the same as
before (unless I messed up somewhere, that is.) Do you think this would
be acceptable for upstream? If you think it's better to add a parameter
to do_table() and let it add the "*" as it did so far, that's also fine
with me, I can update the patch to do that.
Thanks,
--
Jean Delvare
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH 1/2] i2c: Add support for device alias names
2008-05-01 8:04 ` Jean Delvare
@ 2008-05-01 15:51 ` Kay Sievers
0 siblings, 0 replies; 12+ messages in thread
From: Kay Sievers @ 2008-05-01 15:51 UTC (permalink / raw)
To: Jean Delvare; +Cc: linuxppc-dev list, Paul Mundt, Scott Wood, Linux I2C
On Thu, 2008-05-01 at 10:04 +0200, Jean Delvare wrote:
> On Mon, 28 Apr 2008 18:16:17 +0200, Kay Sievers wrote:
> > On Mon, 2008-04-28 at 17:40 +0200, Jean Delvare wrote:
> > > Why would i2c device modaliases ever contain multiple strings? A devi=
ce
> > > can't have multiple names, can it?
> >=20
> > Like ACPI/PNP devices, which can have several compat id's, which means
> > that a single device can have "multiple names":
> > $ cat /sys/bus/pnp/devices/00:09/id
> > IBM0057
> > PNP0f13
>=20
> Ah, I didn't know about this. Now I'm curious how it can work. Does it
> mean that several drivers attempt to bind to this device?=20
=EF=BB=BFThey are usually all id's for the same type of device, and don't d=
escribe
multiple functions at the same time. In most cases the vendor id's, like
"IBM0057" here, do not match anything.
> > > Can't we just stop handle_moddevtable() from adding a tailing "*"
> > > automatically, and just let the device types which need it, add it on
> > > their own?
> >=20
> > For a lot subsystems it's fine to have it appended, as there is a
> > defined list of identifiers, which must appear in the same order, and
> > new identifiers are appended to the end. So the "*" still matches
> > modules with possibly extended modalias strings.
>=20
> I understand the logic, however I am skeptical how useful it is in
> practice. If we add an identifier to the device aliases, then we also
> update the corresponding modalias, so no in-tree driver can break. The
> only case where it makes a difference, as far as I can see, is for
> out-of-tree drivers. Am I correct?
=EF=BB=BFThat sounds correct, yes.
> On top of that, I doubt that we
> actually add new identifiers that frequently, do we?
Not that I know.
> > We would also need to review all buses which export modalias, if they
> > need the "*" or not, and add them by hand, if needed.
> >=20
> > I guess, it's easier to introduce an additional parameter to
> > file2alias::do_table() and suppress the trailing "*" for i2c?
>=20
> That's one possibility, but I had a slightly different approach, which
> is to just let the type-specific handlers add the trailing "*" by
> themselves if they need it. This allows for optimization in a few
> cases.
>=20
> Subject: modpost: i2c aliases need no trailing wildcard
>=20
> Not all device type aliases need a trailing wildcard, in particular
> the i2c aliases don't. Don't add a wildcard by default in do_table(),
> instead let each device type handler add it if needed.
...
> The patch only changes the i2c aliases, all the rest is the same as
> before (unless I messed up somewhere, that is.) Do you think this would
> be acceptable for upstream? If you think it's better to add a parameter
> to do_table() and let it add the "*" as it did so far, that's also fine
> with me, I can update the patch to do that.
Looks fine to me.
If the content of:
/lib/modules/$(uname -r)/modules.alias
looks correct after the patch, this should go in, I think.
Thanks,
Kay
^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2008-05-01 15:53 UTC | newest]
Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-04-28 9:30 [PATCH 0/2] i2c: Add support for device alias names Jean Delvare
2008-04-28 9:39 ` [PATCH 1/2] " Jean Delvare
2008-04-28 14:43 ` Jon Smirl
2008-04-28 15:42 ` Jean Delvare
2008-04-28 15:07 ` Kay Sievers
2008-04-28 15:40 ` Jean Delvare
2008-04-28 16:16 ` Kay Sievers
2008-05-01 8:04 ` Jean Delvare
2008-05-01 15:51 ` Kay Sievers
2008-04-28 9:53 ` [PATCH 2/2] i2c: Convert most new-style drivers to use module aliasing Jean Delvare
2008-04-28 15:35 ` [i2c] [PATCH 0/2] i2c: Add support for device alias names Wolfram Sang
2008-04-28 20:24 ` Jochen Friedrich
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).