i2c: Use the standard, alias-based device/driver matching scheme
Subsystems (12)
cover i2c: Use the standard, alias-based device/driver matching scheme
Hi all,
Here comes a patch set, based on earlier work by Jon Smirl, that updates the i2c subsystem to support and use the standard, alias-based device/driver matching scheme that most other subsystems are using. Contrary to Jon's patch set, this one only supports Linux names and not OF names, although it might be added later (just not sure how exactly.)
Patch 1/3 adds support for this standard matching scheme, patch 2/3 converts all the in-tree drivers to make use of it, and patch 3/3 removes the old driver_name/type matching scheme that has no users left at this point.
This new approach makes the i2c device drivers smaller in general (because the name matching code moved to i2c-core), the exception being drivers which support only one device, for which the device ID table adds a small overhead (88 bytes on x86_64).
The key benefit compared to the original matching scheme is that platform code no longer needs to know which driver supports which device. This means that support for a given device can move from one driver to another without changing the platform code.
Note: all the arm and powerpc stuff is untested.
Signature · 1 line
Jean Delvare
PATCH 1/3 i2c: Add support for device alias names
Based on earlier work by Jon Smirl.
This patch allows new-style i2c chip drivers to have alias names using the official kernel aliasing system and MODULE_DEVICE_TABLE(). At this point, the old i2c driver binding scheme (driver_name/type) is still supported.
--- drivers/hwmon/f75375s.c | 8 +++--- drivers/i2c/chips/ds1682.c | 3 +- drivers/i2c/chips/menelaus.c | 3 +- drivers/i2c/chips/tps65010.c | 3 +- drivers/i2c/chips/tsl2550.c | 3 +- drivers/i2c/i2c-core.c | 50 +++++++++++++++++++++++++++++++-------- drivers/rtc/rtc-ds1307.c | 3 +- drivers/rtc/rtc-ds1374.c | 3 +- drivers/rtc/rtc-m41t80.c | 3 +- drivers/rtc/rtc-rs5c372.c | 3 +- include/linux/i2c.h | 5 +-- include/linux/mod_devicetable.h | 13 ++++++++++ scripts/mod/file2alias.c | 13 ++++++++++ 13 files changed, 90 insertions(+), 23 deletions(-)
drivers/hwmon/f75375s.c +5 -3
@@ -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_adapif ((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 ;
drivers/i2c/chips/ds1682.c +2 -1
@@ -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;
drivers/i2c/chips/menelaus.c +2 -1
@@ -1149,7 +1149,8 @@ static inline void menelaus_rtc_init(strstatic 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;
drivers/i2c/chips/tps65010.c +2 -1
@@ -465,7 +465,8 @@ static int __exit tps65010_remove(structreturn 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;
drivers/i2c/chips/tsl2550.c +2 -1
@@ -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;
drivers/i2c/i2c-core.c +41 -9
100 lines not on this page · raw message
drivers/rtc/rtc-ds1307.c +2 -1
@@ -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 ;
drivers/rtc/rtc-ds1374.c +2 -1
@@ -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;
drivers/rtc/rtc-m41t80.c +2 -1
@@ -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 ;
drivers/rtc/rtc-rs5c372.c +2 -1
@@ -494,7 +494,8 @@ static void rs5c_sysfs_unregister(structstatic 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;
include/linux/i2c.h +2 -3
@@ -126,7 +126,7 @@ struct i2c_driver {* With the driver model, device enumeration is NEVER done by drivers; * it's done by infrastructure. (NEW STYLE DRIVERS ONLY) */ -int (*probe)(struct i2c_client *); +int (*probe)(struct i2c_client *,const struct i2c_device_id *id);int (*remove)(struct i2c_client *);/* driver model interfaces that don't relate to enumeration */
@@ -140,11 +140,10 @@ struct i2c_driver {int (*command)(struct i2c_client *client,unsigned int cmd,void *arg);struct device_driver driver; +const struct i2c_device_id *id_table; };#define to_i2c_driver (d) container_of(d, struct i2c_driver, driver) -#define I2C_NAME_SIZE 20 -/** * struct i2c_client - represent an I2C slave device * @flags: I2C_CLIENT_TEN indicates the device uses a ten bit chip address;
include/linux/mod_devicetable.h +13 -0
@@ -367,4 +367,17 @@ struct virtio_device_id { };#define VIRTIO_DEV_ANY_ID 0xffffffff +/* i2c */ + +/* These defines are used to separate PowerPC open firmware +* drivers into their own namespace */ +#define I2C_NAME_SIZE 20 +#define I2C_MODULE_PREFIX "i2c:" + +struct i2c_device_id { +char name[I2C_NAME_SIZE ]; +kernel_ulong_t driver_data;/* Data private to the driver */ +}; + +#endif /* LINUX_MOD_DEVICETABLE_H */
scripts/mod/file2alias.c +13 -0
@@ -539,6 +539,15 @@ static int do_virtio_entry(const char *freturn 1 ; } +/* Looks like: i2c:S */ +static int do_i2c_entry (const char *filename,struct i2c_device_id *id, +char *alias) +{ +sprintf (alias,I2C_MODULE_PREFIX "%s" , id->name); + +return 1 ; +} +/* Ignore any prefix, eg. v850 prepends _ */ static inline int sym_is (const char *symbol,const char *name) {
@@ -669,6 +678,10 @@ void handle_moddevtable(struct module *mdo_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 ); }
Signature · 1 line
Jean Delvare
PATCH 2/3 i2c: Convert all new-style drivers to use module aliasing
In reply to Jean DelvareBased on earlier work by Jon Smirl.
Update all the new-style i2c drivers to use standard module aliasing instead of the old driver_name/type driver matching scheme.
--- arch/arm/mach-at91/board-csb337.c | 3 - arch/arm/mach-at91/board-dk.c | 3 - arch/arm/mach-at91/board-eb9200.c | 3 - arch/arm/mach-iop32x/em7210.c | 3 - arch/arm/mach-iop32x/n2100.c | 4 - arch/arm/mach-omap1/board-h2.c | 1 arch/arm/mach-omap1/board-h3.c | 3 - arch/arm/mach-omap1/board-osk.c | 1 arch/powerpc/sysdev/fsl_soc.c | 27 +++++------- drivers/hwmon/f75375s.c | 22 +++++----- drivers/i2c/busses/i2c-taos-evm.c | 3 - drivers/i2c/chips/ds1682.c | 7 +++ drivers/i2c/chips/menelaus.c | 7 +++ drivers/i2c/chips/tps65010.c | 28 ++++--------- drivers/i2c/chips/tsl2550.c | 7 +++ drivers/rtc/rtc-ds1307.c | 36 ++++++----------- drivers/rtc/rtc-ds1374.c | 7 +++ drivers/rtc/rtc-m41t80.c | 78 +++++++++---------------------------- drivers/rtc/rtc-rs5c372.c | 14 ++++++ include/linux/i2c.h | 12 ++--- 20 files changed, 120 insertions(+), 149 deletions(-)
arch/arm/mach-at91/board-csb337.c +1 -2
@@ -85,8 +85,7 @@ static struct at91_udc_data __initdata cstatic struct i2c_board_info __initdata csb337_i2c_devices[] = { { -I2C_BOARD_INFO ("rtc-ds1307" ,0x68 ), - .type ="ds1307" , +I2C_BOARD_INFO ("ds1307" ,0x68 ), }, };
arch/arm/mach-at91/board-dk.c +1 -2
@@ -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), } };
arch/arm/mach-at91/board-eb9200.c +1 -2
@@ -93,8 +93,7 @@ static struct at91_mmc_data __initdata estatic struct i2c_board_info __initdata eb9200_i2c_devices[] = { { -I2C_BOARD_INFO ("at24c" ,0x50 ), - .type ="24c512" , +I2C_BOARD_INFO ("24c512" ,0x50 ), }, };
arch/arm/mach-iop32x/em7210.c +1 -2
@@ -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 ), }, };
arch/arm/mach-iop32x/n2100.c +1 -3
@@ -208,12 +208,10 @@ static struct f75375s_platform_data n210static 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, }, };
arch/arm/mach-omap1/board-h2.c +0 -1
@@ -347,7 +347,6 @@ static struct platform_device *h2_devicestatic struct i2c_board_info __initdata h2_i2c_board_info[] = { {I2C_BOARD_INFO ("tps65010" ,0x48 ), - .type ="tps65010" , .irq =OMAP_GPIO_IRQ (58 ), },/* TODO when driver support is ready:
arch/arm/mach-omap1/board-h3.c +1 -2
@@ -459,8 +459,7 @@ static struct omap_board_config_kernel hstatic struct i2c_board_info __initdata h3_i2c_board_info[] = { { -I2C_BOARD_INFO ("tps65010" ,0x48 ), - .type ="tps65013" , +I2C_BOARD_INFO ("tps65013" ,0x48 ),/* .irq = OMAP_GPIO_IRQ(??), */ },/* TODO when driver support is ready:
arch/arm/mach-omap1/board-osk.c +0 -1
@@ -187,7 +187,6 @@ static struct platform_device *osk5912_dstatic struct i2c_board_info __initdata osk_i2c_board_info[] = { {I2C_BOARD_INFO ("tps65010" ,0x48 ), - .type ="tps65010" , .irq =OMAP_GPIO_IRQ (OMAP_MPUIO (1 )), },/* TODO when driver support is ready:
arch/powerpc/sysdev/fsl_soc.c +12 -15
@@ -322,22 +322,21 @@ arch_initcall(gfar_of_init);#include <linux/i2c.h> struct i2c_driver_device {char *of_device; -char *i2c_driver;char *i2c_type; };static struct i2c_driver_device i2c_devices[]__initdata = { - {"ricoh,rs5c372a" ,"rtc-rs5c372" ,"rs5c372a" ,}, - {"ricoh,rs5c372b" ,"rtc-rs5c372" ,"rs5c372b" ,}, - {"ricoh,rv5c386" ,"rtc-rs5c372" ,"rv5c386" ,}, - {"ricoh,rv5c387a" ,"rtc-rs5c372" ,"rv5c387a" ,}, - {"dallas,ds1307" ,"rtc-ds1307" ,"ds1307" ,}, - {"dallas,ds1337" ,"rtc-ds1307" ,"ds1337" ,}, - {"dallas,ds1338" ,"rtc-ds1307" ,"ds1338" ,}, - {"dallas,ds1339" ,"rtc-ds1307" ,"ds1339" ,}, - {"dallas,ds1340" ,"rtc-ds1307" ,"ds1340" ,}, - {"stm,m41t00" ,"rtc-ds1307" ,"m41t00" }, - {"dallas,ds1374" ,"rtc-ds1374" ,"rtc-ds1374" ,}, + {"ricoh,rs5c372a" ,"rs5c372a" ,}, + {"ricoh,rs5c372b" ,"rs5c372b" ,}, + {"ricoh,rv5c386" ,"rv5c386" ,}, + {"ricoh,rv5c387a" ,"rv5c387a" ,}, + {"dallas,ds1307" ,"ds1307" ,}, + {"dallas,ds1337" ,"ds1337" ,}, + {"dallas,ds1338" ,"ds1338" ,}, + {"dallas,ds1339" ,"ds1339" ,}, + {"dallas,ds1340" ,"ds1340" ,}, + {"stm,m41t00" ,"m41t00" }, + {"dallas,ds1374" ,"rtc-ds1374" ,}, }; static int __init of_find_i2c_driver(struct device_node *node,
@@ -348,9 +347,7 @@ static int __init of_find_i2c_driver(strfor (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 ;
drivers/hwmon/f75375s.c +12 -10
@@ -129,12 +129,20 @@ static struct i2c_driver f75375_legacy_d .detach_client = f75375_detach_client, }; +static const struct i2c_device_id f75375_id[] = { + {"f75373" , f75373 }, + {"f75375" , f75375 }, + { }, +}; +MODULE_DEVICE_TABLE (i2c, f75375_id); +static struct i2c_driver f75375_driver = { .driver = { .name ="f75375" , }, .probe = f75375_probe, .remove = f75375_remove, + .id_table = f75375_id, };static inline int f75375_read8 (struct i2c_client *client,u8 reg)
@@ -646,15 +654,6 @@ static int f75375_probe(struct i2c_clien data->client = client;mutex_init (&data->update_lock); -if (strcmp (client->name,"f75375" ) ==0 ) - data->kind = f75375; -else if (strcmp (client->name,"f75373" ) ==0 ) - data->kind = f75373; -else { -dev_err (&client->dev,"Unsupported device: %s\n" , client->name); -return -ENODEV ; - } -if ((err =sysfs_create_group (&client->dev.kobj, &f75375_group))) goto exit_free;
@@ -714,6 +713,7 @@ static int f75375_detect(struct i2c_adapu8 version =0 ;int err =0 ;const char *name ="" ; +struct i2c_device_id id;if (!(client =kzalloc (sizeof (*client),GFP_KERNEL ))) { err = -ENOMEM ;
@@ -750,7 +750,9 @@ static int f75375_detect(struct i2c_adapif ((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 ;
drivers/i2c/busses/i2c-taos-evm.c +1 -2
@@ -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); }
drivers/i2c/chips/ds1682.c +7 -0
@@ -235,12 +235,19 @@ static int ds1682_remove(struct i2c_cliereturn 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 )
drivers/i2c/chips/menelaus.c +7 -0
@@ -1243,12 +1243,19 @@ static int __exit menelaus_remove(structreturn 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 )
drivers/i2c/chips/tps65010.c +10 -18
@@ -60,7 +60,6 @@ static struct i2c_driver tps65010_driver* as part of board setup by a bootloader. */ enum tps_model { -TPS_UNKNOWN =0 ,TPS65010 ,TPS65011 ,TPS65012 ,
@@ -487,20 +486,6 @@ static int tps65010_probe(struct i2c_cliINIT_DELAYED_WORK (&tps->work, tps65010_work); tps->client = client; -if (strcmp (client->name,"tps65010" ) ==0 ) - tps->model =TPS65010 ; -else if (strcmp (client->name,"tps65011" ) ==0 ) - tps->model =TPS65011 ; -else if (strcmp (client->name,"tps65012" ) ==0 ) - tps->model =TPS65012 ; -else if (strcmp (client->name,"tps65013" ) ==0 ) - tps->model =TPS65013 ; -else { -dev_warn (&client->dev,"unknown chip '%s'\n" , client->name); - status = -ENODEV ; - goto fail1; - } -/* the IRQ is active low, but many gpio lines can't support that * so this driver uses falling-edge triggers instead. */
@@ -528,9 +513,6 @@ static int tps65010_probe(struct i2c_clicase TPS65012 : tps->por =1 ;break ; -case TPS_UNKNOWN : -printk (KERN_WARNING "%s: unknown TPS chip\n" ,DRIVER_NAME ); -break ;/* else CHGCONFIG.POR is replaced by AUA, enabling a WAIT mode */ } tps->chgconf =i2c_smbus_read_byte_data (client,TPS_CHGCONFIG );
@@ -584,12 +566,22 @@ fail1:return status; } +static const struct i2c_device_id tps65010_id[] = { + {"tps65010" ,TPS65010 }, + {"tps65011" ,TPS65011 }, + {"tps65012" ,TPS65012 }, + {"tps65013" ,TPS65013 }, + { }, +}; +MODULE_DEVICE_TABLE (i2c, tps65010_id); +static struct i2c_driver tps65010_driver = { .driver = { .name ="tps65010" , }, .probe = tps65010_probe, .remove =__exit_p (tps65010_remove), + .id_table = tps65010_id, };/*-------------------------------------------------------------------------*/
drivers/i2c/chips/tsl2550.c +7 -0
@@ -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 )
drivers/rtc/rtc-ds1307.c +13 -23
@@ -102,42 +102,36 @@ struct chip_desc {char name[9 ]; unsigned nvram56:1; unsigned alarm:1; -enum ds_type type; };static const struct chip_desc chips[] = { { .name ="ds1307" , - .type = ds_1307, .nvram56 =1 , }, { .name ="ds1337" , - .type = ds_1337, .alarm =1 , }, { .name ="ds1338" , - .type = ds_1338, .nvram56 =1 , }, { .name ="ds1339" , - .type = ds_1339, .alarm =1 , }, { .name ="ds1340" , - .type = ds_1340, }, { .name ="m41t00" , - .type = m41t00, }, }; -static inline const struct chip_desc *find_chip (const char *s) -{ -unsigned i; - -for (i =0 ; i <ARRAY_SIZE (chips); i++) -if (strnicmp (s, chips[i].name,sizeof chips[i].name) ==0 ) -return &chips[i]; -return NULL ; -} +static const struct i2c_device_id ds1307_id[] = { + {"ds1307" , ds_1307 }, + {"ds1337" , ds_1337 }, + {"ds1338" , ds_1338 }, + {"ds1339" , ds_1339 }, + {"ds1340" , ds_1340 }, + {"m41t00" , m41t00 }, + {}, +}; +MODULE_DEVICE_TABLE (i2c, ds1307_id);static int ds1307_get_time (struct device *dev,struct rtc_time *t) {
@@ -335,12 +329,7 @@ static int __devinit ds1307_probe(structconst struct chip_desc *chip;struct i2c_adapter *adapter =to_i2c_adapter (client->dev.parent); - chip =find_chip (client->name); -if (!chip) { -dev_err (&client->dev,"unknown chip type '%s'\n" , - client->name); -return -ENODEV ; - } + chip = &chips[id->driver_data];if (!i2c_check_functionality (adapter,I2C_FUNC_I2C |I2C_FUNC_SMBUS_WRITE_BYTE_DATA ))
@@ -362,7 +351,7 @@ static int __devinit ds1307_probe(struct ds1307->msg[1 ].len =sizeof (ds1307->regs); ds1307->msg[1 ].buf = ds1307->regs; - ds1307->type = chip->type; + ds1307->type = id->driver_data;switch (ds1307->type) {case ds_1337:
@@ -538,6 +527,7 @@ static struct i2c_driver ds1307_driver = }, .probe = ds1307_probe, .remove = __devexit_p(ds1307_remove), + .id_table = ds1307_id, };static int __init ds1307_init (void )
drivers/rtc/rtc-ds1374.c +7 -0
@@ -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 )
drivers/rtc/rtc-m41t80.c +19 -59
137 lines not on this page · raw message
drivers/rtc/rtc-rs5c372.c +13 -1
@@ -69,6 +69,15 @@ enum rtc_type { rtc_rv5c387a, }; +static const struct i2c_device_id rs5c372_id[] = { + {"rs5c372a" , rtc_rs5c372a }, + {"rs5c372b" , rtc_rs5c372b }, + {"rv5c386" , rtc_rv5c386 }, + {"rv5c387a" , rtc_rv5c387a }, + {}, +}; +MODULE_DEVICE_TABLE (i2c, rs5c372_id); +/* REVISIT: this assumes that: * - we're in the 21st century, so it's safe to ignore the century * bit for rv5c38[67] (REG_MONTH bit 7);
@@ -523,7 +532,9 @@ static int rs5c372_probe(struct i2c_clieif (err <0 ) goto exit_kfree; -if (strcmp (client->name,"rs5c372a" ) ==0 ) +if (id) + rs5c372->type = id->driver_data; +else if (strcmp (client->name,"rs5c372a" ) ==0 ) rs5c372->type = rtc_rs5c372a;else if (strcmp (client->name,"rs5c372b" ) ==0 ) rs5c372->type = rtc_rs5c372b;
@@ -652,6 +663,7 @@ static struct i2c_driver rs5c372_driver }, .probe = rs5c372_probe, .remove = rs5c372_remove, + .id_table = rs5c372_id, };static __init int rs5c372_init (void )
include/linux/i2c.h +6 -6
@@ -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
Signature · 1 line
Jean Delvare
A message that is not in the archive (sent off-list or not yet received): [email protected]
Re: [PATCH 2/3] i2c: Convert all new-style drivers to use module aliasing
In my version of these patches new style drivers could be loaded with both the driver_name/name scheme and the modalias. In these patches new style drivers can only be loaded via modalias. Is that what you intended? I'm all for making new style driver only use the modalias scheme.
Signature · 7 lines
Jon Smirl [email protected] _______________________________________________ i2c mailing list [email protected] http://lists.lm-sensors.org/mailman/listinfo/i2c
Re: [PATCH 2/3] i2c: Convert all new-style drivers to use module aliasing
Hi Jon,
Quoted 5 lines · Jon Smirl
In my version of these patches new style drivers could be loaded with both the driver_name/name scheme and the modalias. In these patches new style drivers can only be loaded via modalias. Is that what you intended? I'm all for making new style driver only use the modalias scheme.
Yes, this is what I intended. I see no point in having two ways to achieve the same result, it makes things more complex, more costly and possibly confusing.
I would reconsider if someone points out a very good reason to keep both schemes in parallel.
Signature · 1 line
Jean Delvare
Re: [PATCH 2/3] i2c: Convert all new-style drivers to use module aliasing
In reply to Jean DelvareGeneral comment: if you're going to index arrays by enum values, it's best to initialize them that way too. Else you're expecting a particular optional policy for how the enums get grown...
- Dave
Quoted 4 lines · Jean Delvare
drivers/rtc/rtc-ds1307.c +0
-0@@ -102,42 +102,36 @@ struct chip_desc {char name[9 ];
drivers/rtc/rtc-ds1307.c struct chip_desc { · line 110
Quoted 10 lines
drivers/rtc/rtc-ds1307.c +0
-2unsigned nvram56:1; unsigned alarm:1; -enum ds_type type; };static const struct chip_desc chips[] = { { .name ="ds1307" , - .type = ds_1307, .nvram56 =1 , }, {
So tables like this would become
[ds1307] = { ... },
[ds1337] = { ... },Quoted 42 lines
drivers/rtc/rtc-ds1307.c +10
-14.name = "ds1337", - .type = ds_1337, .alarm = 1, }, { .name = "ds1338", - .type = ds_1338, .nvram56 = 1, }, { .name = "ds1339", - .type = ds_1339, .alarm = 1, }, { .name = "ds1340", - .type = ds_1340, }, { .name = "m41t00", - .type = m41t00, }, }; -static inline const struct chip_desc *find_chip(const char *s) -{ - unsigned i; - - for (i = 0; i < ARRAY_SIZE(chips); i++) - if (strnicmp(s, chips[i].name, sizeof chips[i].name) == 0) - return &chips[i]; - return NULL; -} +static const struct i2c_device_id ds1307_id[] = { + { "ds1307", ds_1307 }, + { "ds1337", ds_1337 }, + { "ds1338", ds_1338 }, + { "ds1339", ds_1339 }, + { "ds1340", ds_1340 }, + { "m41t00", m41t00 }, + {}, +}; +MODULE_DEVICE_TABLE(i2c, ds1307_id); static int ds1307_get_time(struct device *dev, struct rtc_time *t) {
drivers/rtc/rtc-ds1307.c static int __devinit ds1307_probe(struct · line 332
Quoted 10 lines
drivers/rtc/rtc-ds1307.c +1
-6@@ -335,12 +329,7 @@ static int __devinit ds1307_probe(structconst struct chip_desc *chip;struct i2c_adapter *adapter =to_i2c_adapter (client->dev.parent); - chip =find_chip (client->name); -if (!chip) { -dev_err (&client->dev,"unknown chip type '%s'\n" , - client->name); -return -ENODEV ; - } + chip = &chips[id->driver_data];
... and that would *ensure* such lines always work right, no matter how the enum values grow.
Quoted 3 lines
drivers/rtc/rtc-ds1307.c +0
-0if (!i2c_check_functionality (adapter,I2C_FUNC_I2C |I2C_FUNC_SMBUS_WRITE_BYTE_DATA ))
Re: [PATCH 2/3] i2c: Convert all new-style drivers to use module aliasing
Quoted 4 lines · David Brownell
General comment: if you're going to index arrays by enum values, it's best to initialize them that way too. Else you're expecting a particular optional policy for how the enums get grown...
Even better is the way the m41t80 driver does it. Can we get the base patch set in first and then do driver clean up in later patches?
Quoted 85 lines
- Dave
Quoted 4 lines · Jean Delvare
drivers/rtc/rtc-ds1307.c 2008-01-20 19:03:48.000000000 +0100 renamed from drivers/rtc/rtc-ds1307.c 2008-01-20 17:26:58.000000000 +0100 +0
-0@@ -102,42 +102,36 @@ struct chip_desc { char name[9];drivers/rtc/rtc-ds1307.c 2008-01-20 19:03:48.000000000 +0100 struct chip_desc { · line 110
Quoted 10 lines
drivers/rtc/rtc-ds1307.c 2008-01-20 19:03:48.000000000 +0100 renamed from drivers/rtc/rtc-ds1307.c 2008-01-20 17:26:58.000000000 +0100 +0
-2unsigned nvram56:1; unsigned alarm:1; - enum ds_type type; }; static const struct chip_desc chips[] = { { .name = "ds1307", - .type = ds_1307, .nvram56 = 1, }, {So tables like this would become
[ds1307] = { ... }, [ds1337] = { ... },Quoted 42 lines
drivers/rtc/rtc-ds1307.c 2008-01-20 19:03:48.000000000 +0100 renamed from drivers/rtc/rtc-ds1307.c 2008-01-20 17:26:58.000000000 +0100 +10
-14.name = "ds1337", - .type = ds_1337, .alarm = 1, }, { .name = "ds1338", - .type = ds_1338, .nvram56 = 1, }, { .name = "ds1339", - .type = ds_1339, .alarm = 1, }, { .name = "ds1340", - .type = ds_1340, }, { .name = "m41t00", - .type = m41t00, }, }; -static inline const struct chip_desc *find_chip(const char *s) -{ - unsigned i; - - for (i = 0; i < ARRAY_SIZE(chips); i++) - if (strnicmp(s, chips[i].name, sizeof chips[i].name) == 0) - return &chips[i]; - return NULL; -} +static const struct i2c_device_id ds1307_id[] = { + { "ds1307", ds_1307 }, + { "ds1337", ds_1337 }, + { "ds1338", ds_1338 }, + { "ds1339", ds_1339 }, + { "ds1340", ds_1340 }, + { "m41t00", m41t00 }, + {}, +}; +MODULE_DEVICE_TABLE(i2c, ds1307_id); static int ds1307_get_time(struct device *dev, struct rtc_time *t) {drivers/rtc/rtc-ds1307.c 2008-01-20 19:03:48.000000000 +0100 static int __devinit ds1307_probe(struct · line 332
Quoted 10 lines
drivers/rtc/rtc-ds1307.c 2008-01-20 19:03:48.000000000 +0100 renamed from drivers/rtc/rtc-ds1307.c 2008-01-20 17:26:58.000000000 +0100 +1
-6@@ -335,12 +329,7 @@ static int __devinit ds1307_probe(struct const struct chip_desc *chip; struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent); - chip = find_chip(client->name); - if (!chip) { - dev_err(&client->dev, "unknown chip type '%s'\n", - client->name); - return -ENODEV; - } + chip = &chips[id->driver_data];... and that would *ensure* such lines always work right, no matter how the enum values grow.
Quoted 3 lines
drivers/rtc/rtc-ds1307.c 2008-01-20 19:03:48.000000000 +0100 renamed from drivers/rtc/rtc-ds1307.c 2008-01-20 17:26:58.000000000 +0100 +0
-0if (!i2c_check_functionality(adapter, I2C_FUNC_I2C | I2C_FUNC_SMBUS_WRITE_BYTE_DATA))
Signature · 2 lines
Jon Smirl [email protected]
Re: [PATCH 2/3] i2c: Convert all new-style drivers to use module aliasing
In reply to David BrownellQuoted 74 lines · David Brownell
General comment: if you're going to index arrays by enum values, it's best to initialize them that way too. Else you're expecting a particular optional policy for how the enums get grown...
- Dave
Quoted 4 lines · Jean Delvare
drivers/rtc/rtc-ds1307.c +0
-0@@ -102,42 +102,36 @@ struct chip_desc {char name[9 ];drivers/rtc/rtc-ds1307.c struct chip_desc { · line 110
Quoted 10 lines
drivers/rtc/rtc-ds1307.c +0
-2unsigned nvram56:1; unsigned alarm:1; -enum ds_type type; };static const struct chip_desc chips[] = { { .name ="ds1307" , - .type = ds_1307, .nvram56 =1 , }, {So tables like this would become
[ds1307] = { ... }, [ds1337] = { ... },Quoted 45 lines
drivers/rtc/rtc-ds1307.c +10
-14.name = "ds1337", - .type = ds_1337, .alarm = 1, }, { .name = "ds1338", - .type = ds_1338, .nvram56 = 1, }, { .name = "ds1339", - .type = ds_1339, .alarm = 1, }, { .name = "ds1340", - .type = ds_1340, }, { .name = "m41t00", - .type = m41t00, }, }; -static inline const struct chip_desc *find_chip(const char *s) -{ - unsigned i; - - for (i = 0; i < ARRAY_SIZE(chips); i++) - if (strnicmp(s, chips[i].name, sizeof chips[i].name) == 0) - return &chips[i]; - return NULL; -} +static const struct i2c_device_id ds1307_id[] = { + { "ds1307", ds_1307 }, + { "ds1337", ds_1337 }, + { "ds1338", ds_1338 }, + { "ds1339", ds_1339 }, + { "ds1340", ds_1340 }, + { "m41t00", m41t00 }, + {}, +}; +MODULE_DEVICE_TABLE(i2c, ds1307_id); static int ds1307_get_time(struct device *dev, struct rtc_time *t) {@@ -335,12 +329,7 @@ static int __devinit ds1307_probe(structconst struct chip_desc *chip;struct i2c_adapter *adapter =to_i2c_adapter (client->dev.parent);
Quoted 14 lines
drivers/rtc/rtc-ds1307.c static int __devinit ds1307_probe(struct · line 332
Quoted 7 lines
drivers/rtc/rtc-ds1307.c +1
-6- chip =find_chip (client->name); -if (!chip) { -dev_err (&client->dev,"unknown chip type '%s'\n" , - client->name); -return -ENODEV ; - } + chip = &chips[id->driver_data];... and that would *ensure* such lines always work right, no matter how the enum values grow.
Quoted 3 lines
drivers/rtc/rtc-ds1307.c +0
-0if (!i2c_check_functionality (adapter,I2C_FUNC_I2C |I2C_FUNC_SMBUS_WRITE_BYTE_DATA ))
Done, thanks for the suggestion and sorry for the delay.
Signature · 1 line
Jean Delvare
A message that is not in the archive (sent off-list or not yet received): [email protected]
PATCH 3/3 i2c: Kill the old driver matching scheme
Remove the old driver_name/type scheme for i2c driver matching. Only the standard aliasing model will be used from now on.
--- drivers/i2c/i2c-core.c | 36 ++++++++++++++---------------------- include/linux/i2c.h | 9 ++------- 2 files changed, 16 insertions(+), 29 deletions(-)
drivers/i2c/i2c-core.c +14 -22
@@ -74,10 +74,7 @@ static int i2c_device_match(struct devicif (driver->id_table)return i2c_match_id (driver->id_table, client) !=NULL ; -/* new style drivers use the same kind of driver matching policy -* as platform devices or SPI: compare device and driver IDs. -*/ -return strcmp (client->driver_name, drv->name) ==0 ; +return 0 ; }#ifdef CONFIG_HOTPLUG
@@ -91,14 +88,9 @@ static int i2c_device_uevent(struct deviif (dev->driver)return 0 ; -if (client->driver_name[0 ]) { -if (add_uevent_var (env,"MODALIAS=%s" , client->driver_name)) -return -ENOMEM ; - }else { -if (add_uevent_var (env,"MODALIAS=%s%s" , -I2C_MODULE_PREFIX , client->name)) -return -ENOMEM ; - } +if (add_uevent_var (env,"MODALIAS=%s%s" , +I2C_MODULE_PREFIX , client->name)) +return -ENOMEM ;dev_dbg (dev,"uevent\n" );return 0 ; }
@@ -202,9 +194,7 @@ static ssize_t show_client_name(struct dstatic ssize_t show_modalias (struct device *dev,struct device_attribute *attr,char *buf) {struct i2c_client *client =to_i2c_client (dev); -return client->driver_name[0 ] - ?sprintf (buf,"%s\n" , client->driver_name) - :sprintf (buf,"%s%s\n" ,I2C_MODULE_PREFIX , client->name); +return sprintf (buf,"%s%s\n" ,I2C_MODULE_PREFIX , client->name); }static struct device_attribute i2c_dev_attrs[] = {
@@ -278,8 +268,6 @@ i2c_new_device(struct i2c_adapter *adap, client->addr = info->addr; client->irq = info->irq; -strlcpy (client->driver_name, info->driver_name, -sizeof (client->driver_name));strlcpy (client->name, info->type,sizeof (client->name));/* a new style driver may be bound to this device when we
@@ -323,6 +311,12 @@ void i2c_unregister_device(struct i2c_clEXPORT_SYMBOL_GPL (i2c_unregister_device); +static const struct i2c_device_id dummy_id[] = { + {"dummy" ,0 }, + { }, +}; +MODULE_DEVICE_TABLE (i2c, dummy_id); +static int dummy_probe (struct i2c_client *client,const struct i2c_device_id *id) {return 0 ;
@@ -337,13 +331,13 @@ static struct i2c_driver dummy_driver = .driver.name = "dummy", .probe = dummy_probe, .remove = dummy_remove, + .id_table = dummy_id, };/** * i2c_new_dummy - return a new i2c device bound to a dummy driver * @adapter: the adapter managing the device * @address: seven bit address to be used -* @type: optional label used for i2c_client.name * Context: can sleep * * This returns an I2C client bound to the "dummy" driver, intended for use
@@ -359,15 +353,13 @@ static struct i2c_driver dummy_driver =* i2c_unregister_device(); or NULL to indicate an error. */ struct i2c_client * -i2c_new_dummy (struct i2c_adapter *adapter,u16 address,const char *type) +i2c_new_dummy (struct i2c_adapter *adapter,u16 address) {struct i2c_board_info info = { - .driver_name ="dummy" , + .type ="dummy" , .addr = address, }; -if (type) -strlcpy (info.type, type,sizeof info.type);return i2c_new_device (adapter, &info); }EXPORT_SYMBOL_GPL (i2c_new_dummy);
include/linux/i2c.h +2 -7
@@ -155,8 +155,6 @@ struct i2c_driver {* @driver: device's driver, hence pointer to access routines * @dev: Driver model device node for the slave. * @irq: indicates the IRQ generated by this device (if any) -* @driver_name: Identifies new-style driver used with this device; also -* used as the module name for hotplug/coldplug modprobe support. * @list: list of active/busy clients (DEPRECATED) * @released: used to synchronize client releases & detaches and references *
@@ -174,7 +172,6 @@ struct i2c_client {struct i2c_driver *driver;/* and our access routines */ struct device dev;/* the device structure */ int irq;/* irq issued by device (or -1) */ -char driver_name[KOBJ_NAME_LEN ];struct list_head list;/* DEPRECATED */ struct completion released; };
@@ -200,8 +197,7 @@ static inline void i2c_set_clientdata (s/** * struct i2c_board_info - template for device creation -* @driver_name: identifies the driver to be bound to the device -* @type: optional chip type information, to initialize i2c_client.name +* @type: chip type, to initialize i2c_client.name * @flags: to initialize i2c_client.flags * @addr: stored in i2c_client.addr * @platform_data: stored in i2c_client.dev.platform_data
@@ -220,7 +216,6 @@ static inline void i2c_set_clientdata (s* with the adapter already known. */ struct i2c_board_info { -char driver_name[KOBJ_NAME_LEN ];char type[I2C_NAME_SIZE ];unsigned short flags;unsigned short addr;
@@ -262,7 +257,7 @@ i2c_new_probed_device(struct i2c_adapter* client handles for the extra addresses. */ extern struct i2c_client * -i2c_new_dummy (struct i2c_adapter *adap,u16 address,const char *type); +i2c_new_dummy (struct i2c_adapter *adap,u16 address);extern void i2c_unregister_device (struct i2c_client *);
Signature · 6 lines
Jean Delvare _______________________________________________ i2c mailing list [email protected] http://lists.lm-sensors.org/mailman/listinfo/i2c
Hi Jean,
Quoted 1 line
Note: all the arm and powerpc stuff is untested.
We at http://sysgo.com have some demo server, where you can access embedded systems remotely (via VNC to a server with cross tools (ELinOS) + serial console), there is 2.6.22 kernel, but I think the i2c core can be replaced. I think some PPC and ARMs are connected there. I will ask if you can get access to it if you are interested.
Thanks,
Rudolf
_______________________________________________
i2c mailing list
[email protected]
http://lists.lm-sensors.org/mailman/listinfo/i2c
Quoted 7 lines · Rudolf Marek
Quoted 1 line
Note: all the arm and powerpc stuff is untested.
We at http://sysgo.com have some demo server, where you can access embedded systems remotely (via VNC to a server with cross tools (ELinOS) + serial console), there is 2.6.22 kernel, but I think the i2c core can be replaced. I think some PPC and ARMs are connected there. I will ask if you can get access to it if you are interested.
Thanks for the proposal, but in general I think it makes more sense that people who are familiar with these architectures test the patches themselves. That's less work for me, and they'll do a better job anyway.
Signature · 1 line
Jean Delvare