* [lm-sensors] [PATCH] f75375s: Add new style bindings
@ 2007-10-16 9:46 Riku Voipio
2007-10-25 11:21 ` Mark M. Hoffman
0 siblings, 1 reply; 2+ messages in thread
From: Riku Voipio @ 2007-10-16 9:46 UTC (permalink / raw)
To: lm-sensors
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 <riku.voipio@movial.fi>
---
drivers/hwmon/f75375s.c | 112 +++++++++++++++++++++++++++++++++++-----------
1 files changed, 85 insertions(+), 27 deletions(-)
diff --git a/drivers/hwmon/f75375s.c b/drivers/hwmon/f75375s.c
index 13a0413..0ac3fc2 100644
--- a/drivers/hwmon/f75375s.c
+++ b/drivers/hwmon/f75375s.c
@@ -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);
}
--
1.5.3.1
--
"rm -rf" only sounds scary if you don't have backups
_______________________________________________
lm-sensors mailing list
lm-sensors@lm-sensors.org
http://lists.lm-sensors.org/mailman/listinfo/lm-sensors
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [lm-sensors] [PATCH] f75375s: Add new style bindings
2007-10-16 9:46 [lm-sensors] [PATCH] f75375s: Add new style bindings Riku Voipio
@ 2007-10-25 11:21 ` Mark M. Hoffman
0 siblings, 0 replies; 2+ messages in thread
From: Mark M. Hoffman @ 2007-10-25 11:21 UTC (permalink / raw)
To: 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.
* Riku Voipio <riku.voipio@movial.fi> [2007-10-16 12:46:49 +0300]:
> 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 <riku.voipio@movial.fi>
> ---
> drivers/hwmon/f75375s.c | 112 +++++++++++++++++++++++++++++++++++-----------
> 1 files changed, 85 insertions(+), 27 deletions(-)
>
> diff --git a/drivers/hwmon/f75375s.c b/drivers/hwmon/f75375s.c
> index 13a0413..0ac3fc2 100644
> --- a/drivers/hwmon/f75375s.c
> +++ b/drivers/hwmon/f75375s.c
> @@ -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,
> +};
> +
> +
extra newline
> 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);
> -
added a newline here
> + 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;
> }
>
> +
extra newline
> 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)
if (status)
> + return status;
> +
> + status = i2c_add_driver(&f75375_legacy_driver);
> + if (status < 0)
ditto
> + 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);
> }
>
> --
> 1.5.3.1
--
Mark M. Hoffman
mhoffman@lightlink.com
_______________________________________________
lm-sensors mailing list
lm-sensors@lm-sensors.org
http://lists.lm-sensors.org/mailman/listinfo/lm-sensors
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2007-10-25 11:21 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-10-16 9:46 [lm-sensors] [PATCH] f75375s: Add new style bindings Riku Voipio
2007-10-25 11:21 ` Mark M. Hoffman
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.