f75375s: Add new style bindings
PATCH 1/1 f75375s: Add new style bindings
Unsuprisingly, the first version was plain ignored. So this patch had to be refreshed against 2.6.23...
Following the example of David Brownell's work on lm75:
- Create a second driver struct, using new-style driver binding methods.
- Rename the old driver struct as f75375_legacy_driver.
- Make the legacy bind/unbind logic delegate all its work.
--- drivers/hwmon/f75375s.c | 112 +++++++++++++++++++++++++++++++++++----------- 1 files changed, 85 insertions(+), 27 deletions(-)
drivers/hwmon/f75375s.c +85 -27
@@ -86,7 +86,7 @@ I2C_CLIENT_INSMOD_2(f75373, f75375);struct f75375_data {unsigned short addr; -struct i2c_client client; +struct i2c_client *client;struct device *hwmon_dev;const char *name;
@@ -116,15 +116,26 @@ 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_remove (struct i2c_client *client); -static struct i2c_driver f75375_driver = { +static struct i2c_driver f75375_legacy_driver = { .driver = { - .name ="f75375" , + .name ="f75375_legacy" , }, .attach_adapter = f75375_attach_adapter, .detach_client = f75375_detach_client, }; +static struct i2c_driver f75375_driver = { + .driver = { + .name ="f75375" , + }, + .probe = f75375_probe, + .remove = f75375_remove, +}; + +static inline int f75375_read8 (struct i2c_client *client,u8 reg) {return i2c_smbus_read_byte_data (client, reg);
@@ -580,12 +591,8 @@ static const struct attribute_group f75375_group = {static int f75375_detach_client (struct i2c_client *client) { -struct f75375_data *data =i2c_get_clientdata (client);int err; - -hwmon_device_unregister (data->hwmon_dev); -sysfs_remove_group (&client->dev.kobj, &f75375_group); - +f75375_remove (client); err =i2c_detach_client (client);if (err) { dev_err(&client->dev,
@@ -593,10 +600,64 @@ static int f75375_detach_client(struct i2c_client *client) "client not detached.\n");return err; } +kfree (client); +return 0 ; +} + +static int f75375_probe (struct i2c_client *client) +{ +struct f75375_data *data =i2c_get_clientdata (client); +int err; + +if (!i2c_check_functionality (client->adapter, +I2C_FUNC_SMBUS_BYTE_DATA )) +return -EIO ; +if (!(data =kzalloc (sizeof (struct f75375_data ),GFP_KERNEL ))) +return -ENOMEM ; + +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 ; + } + +if ((err =sysfs_create_group (&client->dev.kobj, &f75375_group))) + goto exit_free; + + data->hwmon_dev =hwmon_device_register (&client->dev); +if (IS_ERR (data->hwmon_dev)) { + err =PTR_ERR (data->hwmon_dev); + goto exit_remove; + } + +return 0 ; + +exit_remove: +sysfs_remove_group (&client->dev.kobj, &f75375_group); +exit_free:kfree (data); +i2c_set_clientdata (client,NULL ); +return err; +} + +static int f75375_remove (struct i2c_client *client) +{ +struct f75375_data *data =i2c_get_clientdata (client); +hwmon_device_unregister (data->hwmon_dev); +sysfs_remove_group (&client->dev.kobj, &f75375_group); +kfree (data); +i2c_set_clientdata (client,NULL );return 0 ; } +static int f75375_attach_adapter (struct i2c_adapter *adapter) {if (!(adapter->class &I2C_CLASS_HWMON ))
@@ -608,20 +669,17 @@ static int f75375_attach_adapter(struct i2c_adapter *adapter)static int f75375_detect (struct i2c_adapter *adapter,int address,int kind) {struct i2c_client *client; -struct f75375_data *data;u8 version =0 ;int err =0 ;const char *name ="" ; -if (!(data =kzalloc (sizeof (struct f75375_data ),GFP_KERNEL ))) { +if (!(client =kzalloc (sizeof (*client),GFP_KERNEL ))) { err = -ENOMEM ; goto exit; } - client = &data->client; -i2c_set_clientdata (client, data); client->addr = address; client->adapter = adapter; - client->driver = &f75375_driver; + client->driver = &f75375_legacy_driver;if (kind <0 ) {u16 vendid =f75375_read16 (client,F75375_REG_VENDOR );
@@ -644,42 +702,42 @@ static int f75375_detect(struct i2c_adapter *adapter, int address, int kind) }else if (kind = f75373) { name ="f75373" ; } -dev_info (&adapter->dev,"found %s version: %02X\n" , name, version);strlcpy (client->name, name,I2C_NAME_SIZE ); - data->kind = kind; -mutex_init (&data->update_lock); +if ((err =i2c_attach_client (client))) goto exit_free; -if ((err =sysfs_create_group (&client->dev.kobj, &f75375_group))) +if ((err =f75375_probe (client)) <0 ) goto exit_detach; - data->hwmon_dev =hwmon_device_register (&client->dev); -if (IS_ERR (data->hwmon_dev)) { - err =PTR_ERR (data->hwmon_dev); - goto exit_remove; - } -return 0 ; -exit_remove: -sysfs_remove_group (&client->dev.kobj, &f75375_group); exit_detach:i2c_detach_client (client); exit_free: -kfree (data); +kfree (client); exit:return err; }static int __init sensors_f75375_init (void ) { -return i2c_add_driver (&f75375_driver); +int status; + status =i2c_add_driver (&f75375_driver); +if (status <0 ) +return status; + + status =i2c_add_driver (&f75375_legacy_driver); +if (status <0 ) +i2c_del_driver (&f75375_driver); + +return status; } static void __exit sensors_f75375_exit(void) { +i2c_del_driver (&f75375_legacy_driver);i2c_del_driver (&f75375_driver); }
Signature · 10 lines
1.5.3.1 -- "rm -rf" only sounds scary if you don't have backups _______________________________________________ lm-sensors mailing list [email protected] http://lists.lm-sensors.org/mailman/listinfo/lm-sensors
Hi:
This is really nice. I only found a couple nits, so I just made the changes (inline below) and applied it to hwmon-2.6.git/testing; thanks.
Quoted 45 lines · Riku Voipio
Unsuprisingly, the first version was plain ignored. So this patch had to be refreshed against 2.6.23...
Following the example of David Brownell's work on lm75:
- Create a second driver struct, using new-style driver binding methods.
- Rename the old driver struct as
f75375_legacy_driver.- Make the legacy bind/unbind logic delegate all its work.
Signed-off-by Riku Voipio <[email protected]>--- drivers/hwmon/f75375s.c | 112 +++++++++++++++++++++++++++++++++++----------- 1 files changed, 85 insertions(+), 27 deletions(-)drivers/hwmon/f75375s.c +5
-3@@ -86,7 +86,7 @@ I2C_CLIENT_INSMOD_2(f75373, f75375);struct f75375_data {unsigned short addr; -struct i2c_client client; +struct i2c_client *client;struct device *hwmon_dev;const char *name;@@ -116,15 +116,26 @@ 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_remove (struct i2c_client *client); -static struct i2c_driver f75375_driver = { +static struct i2c_driver f75375_legacy_driver = { .driver = { - .name ="f75375" , + .name ="f75375_legacy" , }, .attach_adapter = f75375_attach_adapter, .detach_client = f75375_detach_client, };
drivers/hwmon/f75375s.c struct f75375_data { · line 138
Quoted 10 lines
drivers/hwmon/f75375s.c +9
-0+static struct i2c_driver f75375_driver = { + .driver = { + .name ="f75375" , + }, + .probe = f75375_probe, + .remove = f75375_remove, +}; + +
extra newline
drivers/hwmon/f75375s.c static const struct attribute_group f75375_group = { · line 588
Quoted 13 lines
drivers/hwmon/f75375s.c +0
-5static inline int f75375_read8 (struct i2c_client *client,u8 reg) {return i2c_smbus_read_byte_data (client, reg);@@ -580,12 +591,8 @@ static const struct attribute_group f75375_group = {static int f75375_detach_client (struct i2c_client *client) { -struct f75375_data *data =i2c_get_clientdata (client);int err; - -hwmon_device_unregister (data->hwmon_dev); -sysfs_remove_group (&client->dev.kobj, &f75375_group); -
added a newline here
Quoted 56 lines
drivers/hwmon/f75375s.c +48
-0+f75375_remove (client); err =i2c_detach_client (client);if (err) { dev_err(&client->dev,@@ -593,10 +600,64 @@ static int f75375_detach_client(struct i2c_client *client) "client not detached.\n");return err; } +kfree (client); +return 0 ; +} + +static int f75375_probe (struct i2c_client *client) +{ +struct f75375_data *data =i2c_get_clientdata (client); +int err; + +if (!i2c_check_functionality (client->adapter, +I2C_FUNC_SMBUS_BYTE_DATA )) +return -EIO ; +if (!(data =kzalloc (sizeof (struct f75375_data ),GFP_KERNEL ))) +return -ENOMEM ; + +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 ; + } + +if ((err =sysfs_create_group (&client->dev.kobj, &f75375_group))) + goto exit_free; + + data->hwmon_dev =hwmon_device_register (&client->dev); +if (IS_ERR (data->hwmon_dev)) { + err =PTR_ERR (data->hwmon_dev); + goto exit_remove; + } + +return 0 ; + +exit_remove: +sysfs_remove_group (&client->dev.kobj, &f75375_group); +exit_free:kfree (data); +i2c_set_clientdata (client,NULL ); +return err; +} + +static int f75375_remove (struct i2c_client *client)
drivers/hwmon/f75375s.c static int f75375_detach_client(struct i2c_client *client) · line 660
Quoted 10 lines
drivers/hwmon/f75375s.c +7
-0+{ +struct f75375_data *data =i2c_get_clientdata (client); +hwmon_device_unregister (data->hwmon_dev); +sysfs_remove_group (&client->dev.kobj, &f75375_group); +kfree (data); +i2c_set_clientdata (client,NULL );return 0 ; } +
extra newline
Quoted 58 lines
drivers/hwmon/f75375s.c +5
-18static int f75375_attach_adapter (struct i2c_adapter *adapter) {if (!(adapter->class &I2C_CLASS_HWMON ))@@ -608,20 +669,17 @@ static int f75375_attach_adapter(struct i2c_adapter *adapter)static int f75375_detect (struct i2c_adapter *adapter,int address,int kind) {struct i2c_client *client; -struct f75375_data *data;u8 version =0 ;int err =0 ;const char *name ="" ; -if (!(data =kzalloc (sizeof (struct f75375_data ),GFP_KERNEL ))) { +if (!(client =kzalloc (sizeof (*client),GFP_KERNEL ))) { err = -ENOMEM ; goto exit; } - client = &data->client; -i2c_set_clientdata (client, data); client->addr = address; client->adapter = adapter; - client->driver = &f75375_driver; + client->driver = &f75375_legacy_driver;if (kind <0 ) {u16 vendid =f75375_read16 (client,F75375_REG_VENDOR );@@ -644,42 +702,42 @@ static int f75375_detect(struct i2c_adapter *adapter, int address, int kind) }else if (kind = f75373) { name ="f75373" ; } -dev_info (&adapter->dev,"found %s version: %02X\n" , name, version);strlcpy (client->name, name,I2C_NAME_SIZE ); - data->kind = kind; -mutex_init (&data->update_lock); +if ((err =i2c_attach_client (client))) goto exit_free; -if ((err =sysfs_create_group (&client->dev.kobj, &f75375_group))) +if ((err =f75375_probe (client)) <0 ) goto exit_detach; - data->hwmon_dev =hwmon_device_register (&client->dev); -if (IS_ERR (data->hwmon_dev)) { - err =PTR_ERR (data->hwmon_dev); - goto exit_remove; - } -return 0 ; -exit_remove: -sysfs_remove_group (&client->dev.kobj, &f75375_group); exit_detach:i2c_detach_client (client); exit_free: -kfree (data); +kfree (client);
drivers/hwmon/f75375s.c static int f75375_detect(struct i2c_adapter *adapter, int address, int kind) · line 728
Quoted 10 lines
drivers/hwmon/f75375s.c +3
-1exit:return err; }static int __init sensors_f75375_init (void ) { -return i2c_add_driver (&f75375_driver); +int status; + status =i2c_add_driver (&f75375_driver); +if (status <0 )
if (status)
drivers/hwmon/f75375s.c static int f75375_detect(struct i2c_adapter *adapter, int address, int kind) · line 732
Quoted 4 lines
drivers/hwmon/f75375s.c +4
-0+return status; + + status =i2c_add_driver (&f75375_legacy_driver); +if (status <0 )
ditto
Quoted 13 lines
drivers/hwmon/f75375s.c +4
-0+i2c_del_driver (&f75375_driver); + +return status; } static void __exit sensors_f75375_exit(void) { +i2c_del_driver (&f75375_legacy_driver);i2c_del_driver (&f75375_driver); }Signature · 1 line
1.5.3.1
Signature · 8 lines
Mark M. Hoffman [email protected] _______________________________________________ lm-sensors mailing list [email protected] http://lists.lm-sensors.org/mailman/listinfo/lm-sensors