From: khali@linux-fr.org (Jean Delvare)
To: lm-sensors@vger.kernel.org
Subject: [lm-sensors] [patch] hwmon: w83781d - check return code of
Date: Thu, 21 Sep 2006 08:54:52 +0000 [thread overview]
Message-ID: <20060921105452.b32bc488.khali@linux-fr.org> (raw)
In-Reply-To: <44F70D89.30409@gmail.com>
Hi Jim,
> add 2 attr-file groups (for base and model-specific attrs respectively),
> create the base group with single call to sysfs_create_group,
> check the return code on individual calls to device_create_file for each
> of the model-specific attr-files.
>
> Signed-off-by: Jim Cromie <jim.cromie at gmail.com>
>
> This is compile-tested only, needs validation on hardware, or
> very thorough inspection.
Thanks for working on this. I don't have a compatible chip either, but
I'll look for a tester (unless someone on the list can test?)
Can you set the mime-type of the attachement to text/plain rather than
plain/text next time? ;)
> diff -ruNp -X dontdiff -X exclude-diffs w83-1/drivers/hwmon/w83781d.c w83-rconly/drivers/hwmon/w83781d.c
> --- w83-1/drivers/hwmon/w83781d.c 2006-08-07 15:37:19.000000000 -0600
> +++ w83-rconly/drivers/hwmon/w83781d.c 2006-08-31 07:47:08.000000000 -0600
> @@ -40,6 +40,8 @@
> #include <linux/i2c.h>
> #include <linux/i2c-isa.h>
> #include <linux/hwmon.h>
> +#include <linux/hwmon-sysfs.h>
> +#include <linux/sysfs.h>
> #include <linux/hwmon-vid.h>
> #include <linux/err.h>
> #include <linux/mutex.h>
> @@ -360,11 +362,9 @@ sysfs_in_offsets(7);
> sysfs_in_offsets(8);
>
> #define device_create_file_in(client, offset) \
> -do { \
> -device_create_file(&client->dev, &dev_attr_in##offset##_input); \
> -device_create_file(&client->dev, &dev_attr_in##offset##_min); \
> -device_create_file(&client->dev, &dev_attr_in##offset##_max); \
> -} while (0)
> + device_create_file(&client->dev, &dev_attr_in##offset##_input) \
> + || device_create_file(&client->dev, &dev_attr_in##offset##_min) \
> + || device_create_file(&client->dev, &dev_attr_in##offset##_max) \
Can you please get rid of all these macros while you're here? I didn't
like them much before, but now it's even worse as they are never
functions not constants but random code exerpts, which is quite
misleading and could cause a lot of confusion later. This would also
let you return the error values properly.
>
> #define show_fan_reg(reg) \
> static ssize_t show_##reg (struct device *dev, char *buf, int nr) \
> @@ -421,10 +421,8 @@ sysfs_fan_offset(3);
> sysfs_fan_min_offset(3);
>
> #define device_create_file_fan(client, offset) \
> -do { \
> -device_create_file(&client->dev, &dev_attr_fan##offset##_input); \
> -device_create_file(&client->dev, &dev_attr_fan##offset##_min); \
> -} while (0)
> + device_create_file(&client->dev, &dev_attr_fan##offset##_input) \
> + || device_create_file(&client->dev, &dev_attr_fan##offset##_min)
>
> #define show_temp_reg(reg) \
> static ssize_t show_##reg (struct device *dev, char *buf, int nr) \
> @@ -497,11 +495,9 @@ sysfs_temp_offsets(2);
> sysfs_temp_offsets(3);
>
> #define device_create_file_temp(client, offset) \
> -do { \
> -device_create_file(&client->dev, &dev_attr_temp##offset##_input); \
> -device_create_file(&client->dev, &dev_attr_temp##offset##_max); \
> -device_create_file(&client->dev, &dev_attr_temp##offset##_max_hyst); \
> -} while (0)
> + device_create_file(&client->dev, &dev_attr_temp##offset##_input) \
> + || device_create_file(&client->dev, &dev_attr_temp##offset##_max) \
> + || device_create_file(&client->dev, &dev_attr_temp##offset##_max_hyst)
>
> static ssize_t
> show_vid_reg(struct device *dev, struct device_attribute *attr, char *buf)
> @@ -513,7 +509,7 @@ show_vid_reg(struct device *dev, struct
> static
> DEVICE_ATTR(cpu0_vid, S_IRUGO, show_vid_reg, NULL);
> #define device_create_file_vid(client) \
> -device_create_file(&client->dev, &dev_attr_cpu0_vid);
> +device_create_file(&client->dev, &dev_attr_cpu0_vid)
> static ssize_t
> show_vrm_reg(struct device *dev, struct device_attribute *attr, char *buf)
> {
> @@ -537,7 +533,7 @@ store_vrm_reg(struct device *dev, struct
> static
> DEVICE_ATTR(vrm, S_IRUGO | S_IWUSR, show_vrm_reg, store_vrm_reg);
> #define device_create_file_vrm(client) \
> -device_create_file(&client->dev, &dev_attr_vrm);
> +device_create_file(&client->dev, &dev_attr_vrm)
> static ssize_t
> show_alarms_reg(struct device *dev, struct device_attribute *attr, char *buf)
> {
> @@ -548,7 +544,7 @@ show_alarms_reg(struct device *dev, stru
> static
> DEVICE_ATTR(alarms, S_IRUGO, show_alarms_reg, NULL);
> #define device_create_file_alarms(client) \
> -device_create_file(&client->dev, &dev_attr_alarms);
> +device_create_file(&client->dev, &dev_attr_alarms)
> static ssize_t show_beep_mask (struct device *dev, struct device_attribute *attr, char *buf)
> {
> struct w83781d_data *data = w83781d_update_device(dev);
> @@ -615,10 +611,8 @@ sysfs_beep(ENABLE, enable);
> sysfs_beep(MASK, mask);
>
> #define device_create_file_beep(client) \
> -do { \
> -device_create_file(&client->dev, &dev_attr_beep_enable); \
> -device_create_file(&client->dev, &dev_attr_beep_mask); \
> -} while (0)
> + device_create_file(&client->dev, &dev_attr_beep_enable) \
> + || device_create_file(&client->dev, &dev_attr_beep_mask)
>
> static ssize_t
> show_fan_div_reg(struct device *dev, char *buf, int nr)
> @@ -686,9 +680,7 @@ sysfs_fan_div(2);
> sysfs_fan_div(3);
>
> #define device_create_file_fan_div(client, offset) \
> -do { \
> -device_create_file(&client->dev, &dev_attr_fan##offset##_div); \
> -} while (0)
> + device_create_file(&client->dev, &dev_attr_fan##offset##_div)
>
> static ssize_t
> show_pwm_reg(struct device *dev, char *buf, int nr)
> @@ -787,14 +779,10 @@ sysfs_pwm(3);
> sysfs_pwm(4);
>
> #define device_create_file_pwm(client, offset) \
> -do { \
> -device_create_file(&client->dev, &dev_attr_pwm##offset); \
> -} while (0)
> +device_create_file(&client->dev, &dev_attr_pwm##offset)
>
> #define device_create_file_pwmenable(client, offset) \
> -do { \
> -device_create_file(&client->dev, &dev_attr_pwm##offset##_enable); \
> -} while (0)
> +device_create_file(&client->dev, &dev_attr_pwm##offset##_enable)
>
> static ssize_t
> show_sensor_reg(struct device *dev, char *buf, int nr)
> @@ -865,9 +853,7 @@ sysfs_sensor(2);
> sysfs_sensor(3);
>
> #define device_create_file_sensor(client, offset) \
> -do { \
> -device_create_file(&client->dev, &dev_attr_temp##offset##_type); \
> -} while (0)
> +device_create_file(&client->dev, &dev_attr_temp##offset##_type)
>
> /* This function is called when:
> * w83781d_driver is inserted (when this module is loaded), for each
> @@ -993,6 +979,70 @@ ERROR_SC_0:
> return err;
> }
>
> +#define IN_UNIT_ATTRS(X) \
> + &dev_attr_in##X##_input.attr, \
> + &dev_attr_in##X##_min.attr, \
> + &dev_attr_in##X##_max.attr
> +
> +#define FAN_UNIT_ATTRS(X) \
> + &dev_attr_fan##X##_input.attr, \
> + &dev_attr_fan##X##_min.attr, \
> + &dev_attr_fan##X##_div.attr
> +
> +#define TEMP_UNIT_ATTRS(X) \
> + &dev_attr_temp##X##_input.attr, \
> + &dev_attr_temp##X##_max.attr, \
> + &dev_attr_temp##X##_max_hyst.attr
> +
> +static struct attribute *w83781d_attributes[] = {
> +
No blank line here please.
> + IN_UNIT_ATTRS(0),
> + IN_UNIT_ATTRS(2),
> + IN_UNIT_ATTRS(3),
> + IN_UNIT_ATTRS(4),
> + IN_UNIT_ATTRS(5),
> + IN_UNIT_ATTRS(6),
> +
> + FAN_UNIT_ATTRS(1),
> + FAN_UNIT_ATTRS(2),
> + FAN_UNIT_ATTRS(3),
> +
> + TEMP_UNIT_ATTRS(1),
> + TEMP_UNIT_ATTRS(2),
> +
> + &dev_attr_cpu0_vid.attr,
> + &dev_attr_vrm.attr,
> + &dev_attr_alarms.attr,
> + &dev_attr_beep_mask.attr,
> + &dev_attr_beep_enable.attr,
> +
Nor here.
> + NULL,
And no comma here.
> +};
> +static struct attribute_group w83781d_group = {
> + .attrs = w83781d_attributes,
> +};
> +
> +static struct attribute *w83781d_opt_attributes[] = {
> + IN_UNIT_ATTRS(1),
> + IN_UNIT_ATTRS(7),
> + IN_UNIT_ATTRS(8),
> + TEMP_UNIT_ATTRS(3),
> +
> + &dev_attr_pwm1.attr,
> + &dev_attr_pwm2.attr,
> + &dev_attr_pwm2_enable.attr,
> + &dev_attr_pwm3.attr,
> + &dev_attr_pwm4.attr,
> +
> + &dev_attr_temp1_type.attr, /* for sensor */
> + &dev_attr_temp2_type.attr,
> + &dev_attr_temp3_type.attr,
> + NULL,
> +};
> +static struct attribute_group w83781d_opt_group = {
> + .attrs = w83781d_opt_attributes,
> +};
Mark and I went for _group_opt and _attributes_opt suffixes. It's of
course arbitrary, but maybe you can do the same for consistency?
> +
> static int
> w83781d_detect(struct i2c_adapter *adapter, int address, int kind)
> {
> @@ -1211,64 +1261,57 @@ w83781d_detect(struct i2c_adapter *adapt
> data->pwmenable[i] = 1;
>
> /* Register sysfs hooks */
> - data->class_dev = hwmon_device_register(&new_client->dev);
> - if (IS_ERR(data->class_dev)) {
> - err = PTR_ERR(data->class_dev);
> - goto ERROR4;
> - }
> + if ((err = sysfs_create_group(&new_client->dev.kobj,
> + &w83781d_group)))
> + goto ERROR5;
>
> - device_create_file_in(new_client, 0);
> if (kind != w83783s)
> - device_create_file_in(new_client, 1);
> - device_create_file_in(new_client, 2);
> - device_create_file_in(new_client, 3);
> - device_create_file_in(new_client, 4);
> - device_create_file_in(new_client, 5);
> - device_create_file_in(new_client, 6);
> + if (device_create_file_in(new_client, 1))
> + goto ERROR5;
> +
> if (kind != as99127f && kind != w83781d && kind != w83783s) {
> - device_create_file_in(new_client, 7);
> - device_create_file_in(new_client, 8);
> + if (device_create_file_in(new_client, 7)
> + || device_create_file_in(new_client, 8))
> + goto ERROR5;
> }
>
> - device_create_file_fan(new_client, 1);
> - device_create_file_fan(new_client, 2);
> - device_create_file_fan(new_client, 3);
> -
> - device_create_file_temp(new_client, 1);
> - device_create_file_temp(new_client, 2);
> if (kind != w83783s)
> - device_create_file_temp(new_client, 3);
> -
> - device_create_file_vid(new_client);
> - device_create_file_vrm(new_client);
> -
> - device_create_file_fan_div(new_client, 1);
> - device_create_file_fan_div(new_client, 2);
> - device_create_file_fan_div(new_client, 3);
> -
> - device_create_file_alarms(new_client);
> -
> - device_create_file_beep(new_client);
> + if (device_create_file_temp(new_client, 3))
> + goto ERROR5;
>
> if (kind != w83781d && kind != as99127f) {
> - device_create_file_pwm(new_client, 1);
> - device_create_file_pwm(new_client, 2);
> - device_create_file_pwmenable(new_client, 2);
> + if (device_create_file_pwm(new_client, 1)
> + || device_create_file_pwm(new_client, 2)
> + || device_create_file_pwmenable(new_client, 2))
> + goto ERROR5;
> }
> if (kind = w83782d && !is_isa) {
> - device_create_file_pwm(new_client, 3);
> - device_create_file_pwm(new_client, 4);
> + if (device_create_file_pwm(new_client, 3)
> + || device_create_file_pwm(new_client, 4))
> + goto ERROR5;
> }
>
> if (kind != as99127f && kind != w83781d) {
> - device_create_file_sensor(new_client, 1);
> - device_create_file_sensor(new_client, 2);
> + if (device_create_file_sensor(new_client, 1)
> + || device_create_file_sensor(new_client, 2))
> + goto ERROR5;
> if (kind != w83783s)
> - device_create_file_sensor(new_client, 3);
> + if (device_create_file_sensor(new_client, 3))
> + goto ERROR5;
> + }
> +
> + data->class_dev = hwmon_device_register(&new_client->dev);
> + if (IS_ERR(data->class_dev)) {
> + err = PTR_ERR(data->class_dev);
> + goto ERROR5;
> }
>
> return 0;
>
> +ERROR5:
> + sysfs_remove_group(&new_client->dev.kobj, &w83781d_group);
> + sysfs_remove_group(&new_client->dev.kobj, &w83781d_opt_group);
> +
> ERROR4:
> if (data->lm75[1]) {
> i2c_detach_client(data->lm75[1]);
> @@ -1299,6 +1342,9 @@ w83781d_detach_client(struct i2c_client
> if (data)
> hwmon_device_unregister(data->class_dev);
>
> + sysfs_remove_group(&client->dev.kobj, &w83781d_group);
> + sysfs_remove_group(&client->dev.kobj, &w83781d_opt_group);
> +
This should be inside the if (data) conditional - subclients have no
sysfs files.
> if (i2c_is_isa_client(client))
> release_region(client->addr, W83781D_EXTENT);
>
>
Care to respin a patch? I'd like to have all these fixes in -mm soon.
Thanks,
--
Jean Delvare
next prev parent reply other threads:[~2006-09-21 8:54 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-08-31 16:25 [lm-sensors] [patch] hwmon: w83781d - check return code of Jim Cromie
2006-09-21 8:54 ` Jean Delvare [this message]
2006-09-22 4:31 ` Jim Cromie
2006-09-22 7:50 ` Jean Delvare
2006-09-22 22:25 ` Jim Cromie
2006-09-23 8:15 ` Jean Delvare
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20060921105452.b32bc488.khali@linux-fr.org \
--to=khali@linux-fr.org \
--cc=lm-sensors@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.