diff options
| author | Pawel Moll <pawel.moll@arm.com> | 2014-04-23 13:27:05 -0400 |
|---|---|---|
| committer | Guenter Roeck <linux@roeck-us.net> | 2014-04-24 09:02:10 -0400 |
| commit | b2e5411ee26bff1deefd0b2c7beec9c133632e65 (patch) | |
| tree | fca94d153e37e215cd54e223c5f37c3e60c8ef8a | |
| parent | 52feaca5d685c07a4bc9812d16d84f5f7991bfe7 (diff) | |
hwmon: (vexpress) Avoid creating non-existing attributes
The 'label' attribute was always created but returned -ENOENT
if there is no label and such behaviour is undefined from
libsensors' point of view.
Fixed by providing is_visible method in the attributes group,
so the attribute is not created at all when unnecessary.
Reported-by: Guenter Roeck <linux@roeck-us.net>
Signed-off-by: Pawel Moll <pawel.moll@arm.com>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
| -rw-r--r-- | drivers/hwmon/vexpress.c | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/drivers/hwmon/vexpress.c b/drivers/hwmon/vexpress.c index 7f9690560f40..8242b75d96c8 100644 --- a/drivers/hwmon/vexpress.c +++ b/drivers/hwmon/vexpress.c | |||
| @@ -43,9 +43,6 @@ static ssize_t vexpress_hwmon_label_show(struct device *dev, | |||
| 43 | { | 43 | { |
| 44 | const char *label = of_get_property(dev->of_node, "label", NULL); | 44 | const char *label = of_get_property(dev->of_node, "label", NULL); |
| 45 | 45 | ||
| 46 | if (!label) | ||
| 47 | return -ENOENT; | ||
| 48 | |||
| 49 | return snprintf(buffer, PAGE_SIZE, "%s\n", label); | 46 | return snprintf(buffer, PAGE_SIZE, "%s\n", label); |
| 50 | } | 47 | } |
| 51 | 48 | ||
| @@ -84,6 +81,20 @@ static ssize_t vexpress_hwmon_u64_show(struct device *dev, | |||
| 84 | to_sensor_dev_attr(dev_attr)->index)); | 81 | to_sensor_dev_attr(dev_attr)->index)); |
| 85 | } | 82 | } |
| 86 | 83 | ||
| 84 | static umode_t vexpress_hwmon_attr_is_visible(struct kobject *kobj, | ||
| 85 | struct attribute *attr, int index) | ||
| 86 | { | ||
| 87 | struct device *dev = kobj_to_dev(kobj); | ||
| 88 | struct device_attribute *dev_attr = container_of(attr, | ||
| 89 | struct device_attribute, attr); | ||
| 90 | |||
| 91 | if (dev_attr->show == vexpress_hwmon_label_show && | ||
| 92 | !of_get_property(dev->of_node, "label", NULL)) | ||
| 93 | return 0; | ||
| 94 | |||
| 95 | return attr->mode; | ||
| 96 | } | ||
| 97 | |||
| 87 | static DEVICE_ATTR(name, S_IRUGO, vexpress_hwmon_name_show, NULL); | 98 | static DEVICE_ATTR(name, S_IRUGO, vexpress_hwmon_name_show, NULL); |
| 88 | 99 | ||
| 89 | #define VEXPRESS_HWMON_ATTRS(_name, _label_attr, _input_attr) \ | 100 | #define VEXPRESS_HWMON_ATTRS(_name, _label_attr, _input_attr) \ |
| @@ -105,6 +116,7 @@ static SENSOR_DEVICE_ATTR(in1_input, S_IRUGO, vexpress_hwmon_u32_show, | |||
| 105 | NULL, 1000); | 116 | NULL, 1000); |
| 106 | static VEXPRESS_HWMON_ATTRS(volt, in1_label, in1_input); | 117 | static VEXPRESS_HWMON_ATTRS(volt, in1_label, in1_input); |
| 107 | static struct attribute_group vexpress_hwmon_group_volt = { | 118 | static struct attribute_group vexpress_hwmon_group_volt = { |
| 119 | .is_visible = vexpress_hwmon_attr_is_visible, | ||
| 108 | .attrs = vexpress_hwmon_attrs_volt, | 120 | .attrs = vexpress_hwmon_attrs_volt, |
| 109 | }; | 121 | }; |
| 110 | static struct vexpress_hwmon_type vexpress_hwmon_volt = { | 122 | static struct vexpress_hwmon_type vexpress_hwmon_volt = { |
| @@ -121,6 +133,7 @@ static SENSOR_DEVICE_ATTR(curr1_input, S_IRUGO, vexpress_hwmon_u32_show, | |||
| 121 | NULL, 1000); | 133 | NULL, 1000); |
| 122 | static VEXPRESS_HWMON_ATTRS(amp, curr1_label, curr1_input); | 134 | static VEXPRESS_HWMON_ATTRS(amp, curr1_label, curr1_input); |
| 123 | static struct attribute_group vexpress_hwmon_group_amp = { | 135 | static struct attribute_group vexpress_hwmon_group_amp = { |
| 136 | .is_visible = vexpress_hwmon_attr_is_visible, | ||
| 124 | .attrs = vexpress_hwmon_attrs_amp, | 137 | .attrs = vexpress_hwmon_attrs_amp, |
| 125 | }; | 138 | }; |
| 126 | static struct vexpress_hwmon_type vexpress_hwmon_amp = { | 139 | static struct vexpress_hwmon_type vexpress_hwmon_amp = { |
| @@ -136,6 +149,7 @@ static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, vexpress_hwmon_u32_show, | |||
| 136 | NULL, 1000); | 149 | NULL, 1000); |
| 137 | static VEXPRESS_HWMON_ATTRS(temp, temp1_label, temp1_input); | 150 | static VEXPRESS_HWMON_ATTRS(temp, temp1_label, temp1_input); |
| 138 | static struct attribute_group vexpress_hwmon_group_temp = { | 151 | static struct attribute_group vexpress_hwmon_group_temp = { |
| 152 | .is_visible = vexpress_hwmon_attr_is_visible, | ||
| 139 | .attrs = vexpress_hwmon_attrs_temp, | 153 | .attrs = vexpress_hwmon_attrs_temp, |
| 140 | }; | 154 | }; |
| 141 | static struct vexpress_hwmon_type vexpress_hwmon_temp = { | 155 | static struct vexpress_hwmon_type vexpress_hwmon_temp = { |
| @@ -151,6 +165,7 @@ static SENSOR_DEVICE_ATTR(power1_input, S_IRUGO, vexpress_hwmon_u32_show, | |||
| 151 | NULL, 1); | 165 | NULL, 1); |
| 152 | static VEXPRESS_HWMON_ATTRS(power, power1_label, power1_input); | 166 | static VEXPRESS_HWMON_ATTRS(power, power1_label, power1_input); |
| 153 | static struct attribute_group vexpress_hwmon_group_power = { | 167 | static struct attribute_group vexpress_hwmon_group_power = { |
| 168 | .is_visible = vexpress_hwmon_attr_is_visible, | ||
| 154 | .attrs = vexpress_hwmon_attrs_power, | 169 | .attrs = vexpress_hwmon_attrs_power, |
| 155 | }; | 170 | }; |
| 156 | static struct vexpress_hwmon_type vexpress_hwmon_power = { | 171 | static struct vexpress_hwmon_type vexpress_hwmon_power = { |
| @@ -166,6 +181,7 @@ static SENSOR_DEVICE_ATTR(energy1_input, S_IRUGO, vexpress_hwmon_u64_show, | |||
| 166 | NULL, 1); | 181 | NULL, 1); |
| 167 | static VEXPRESS_HWMON_ATTRS(energy, energy1_label, energy1_input); | 182 | static VEXPRESS_HWMON_ATTRS(energy, energy1_label, energy1_input); |
| 168 | static struct attribute_group vexpress_hwmon_group_energy = { | 183 | static struct attribute_group vexpress_hwmon_group_energy = { |
| 184 | .is_visible = vexpress_hwmon_attr_is_visible, | ||
| 169 | .attrs = vexpress_hwmon_attrs_energy, | 185 | .attrs = vexpress_hwmon_attrs_energy, |
| 170 | }; | 186 | }; |
| 171 | static struct vexpress_hwmon_type vexpress_hwmon_energy = { | 187 | static struct vexpress_hwmon_type vexpress_hwmon_energy = { |
