aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorPawel Moll <pawel.moll@arm.com>2014-04-23 13:27:04 -0400
committerGuenter Roeck <linux@roeck-us.net>2014-04-24 09:01:59 -0400
commit52feaca5d685c07a4bc9812d16d84f5f7991bfe7 (patch)
treee08ee3ccbcc7b74c2f6bd5fb9c16509017e26df4 /drivers
parenta798c10faf62a505d24e5f6213fbaf904a39623f (diff)
hwmon: (vexpress) Use legal hwmon device names
The driver used to directly us a DT 'compatible' property for the 'name' attribute of the hwmon devices. Unfortunately it contains '-' which is illegal in this context. It messes up libsensors and thus every application using it. Fixed by providing equivalent (and simpler) name strings. 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>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/hwmon/vexpress.c61
1 files changed, 52 insertions, 9 deletions
diff --git a/drivers/hwmon/vexpress.c b/drivers/hwmon/vexpress.c
index d867e6bb2be1..7f9690560f40 100644
--- a/drivers/hwmon/vexpress.c
+++ b/drivers/hwmon/vexpress.c
@@ -27,15 +27,15 @@
27struct vexpress_hwmon_data { 27struct vexpress_hwmon_data {
28 struct device *hwmon_dev; 28 struct device *hwmon_dev;
29 struct vexpress_config_func *func; 29 struct vexpress_config_func *func;
30 const char *name;
30}; 31};
31 32
32static ssize_t vexpress_hwmon_name_show(struct device *dev, 33static ssize_t vexpress_hwmon_name_show(struct device *dev,
33 struct device_attribute *dev_attr, char *buffer) 34 struct device_attribute *dev_attr, char *buffer)
34{ 35{
35 const char *compatible = of_get_property(dev->of_node, "compatible", 36 struct vexpress_hwmon_data *data = dev_get_drvdata(dev);
36 NULL);
37 37
38 return sprintf(buffer, "%s\n", compatible); 38 return sprintf(buffer, "%s\n", data->name);
39} 39}
40 40
41static ssize_t vexpress_hwmon_label_show(struct device *dev, 41static ssize_t vexpress_hwmon_label_show(struct device *dev,
@@ -94,6 +94,11 @@ struct attribute *vexpress_hwmon_attrs_##_name[] = { \
94 NULL \ 94 NULL \
95} 95}
96 96
97struct vexpress_hwmon_type {
98 const char *name;
99 const struct attribute_group **attr_groups;
100};
101
97#if !defined(CONFIG_REGULATOR_VEXPRESS) 102#if !defined(CONFIG_REGULATOR_VEXPRESS)
98static DEVICE_ATTR(in1_label, S_IRUGO, vexpress_hwmon_label_show, NULL); 103static DEVICE_ATTR(in1_label, S_IRUGO, vexpress_hwmon_label_show, NULL);
99static SENSOR_DEVICE_ATTR(in1_input, S_IRUGO, vexpress_hwmon_u32_show, 104static SENSOR_DEVICE_ATTR(in1_input, S_IRUGO, vexpress_hwmon_u32_show,
@@ -102,6 +107,13 @@ static VEXPRESS_HWMON_ATTRS(volt, in1_label, in1_input);
102static struct attribute_group vexpress_hwmon_group_volt = { 107static struct attribute_group vexpress_hwmon_group_volt = {
103 .attrs = vexpress_hwmon_attrs_volt, 108 .attrs = vexpress_hwmon_attrs_volt,
104}; 109};
110static struct vexpress_hwmon_type vexpress_hwmon_volt = {
111 .name = "vexpress_volt",
112 .attr_groups = (const struct attribute_group *[]) {
113 &vexpress_hwmon_group_volt,
114 NULL,
115 },
116};
105#endif 117#endif
106 118
107static DEVICE_ATTR(curr1_label, S_IRUGO, vexpress_hwmon_label_show, NULL); 119static DEVICE_ATTR(curr1_label, S_IRUGO, vexpress_hwmon_label_show, NULL);
@@ -111,6 +123,13 @@ static VEXPRESS_HWMON_ATTRS(amp, curr1_label, curr1_input);
111static struct attribute_group vexpress_hwmon_group_amp = { 123static struct attribute_group vexpress_hwmon_group_amp = {
112 .attrs = vexpress_hwmon_attrs_amp, 124 .attrs = vexpress_hwmon_attrs_amp,
113}; 125};
126static struct vexpress_hwmon_type vexpress_hwmon_amp = {
127 .name = "vexpress_amp",
128 .attr_groups = (const struct attribute_group *[]) {
129 &vexpress_hwmon_group_amp,
130 NULL
131 },
132};
114 133
115static DEVICE_ATTR(temp1_label, S_IRUGO, vexpress_hwmon_label_show, NULL); 134static DEVICE_ATTR(temp1_label, S_IRUGO, vexpress_hwmon_label_show, NULL);
116static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, vexpress_hwmon_u32_show, 135static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, vexpress_hwmon_u32_show,
@@ -119,6 +138,13 @@ static VEXPRESS_HWMON_ATTRS(temp, temp1_label, temp1_input);
119static struct attribute_group vexpress_hwmon_group_temp = { 138static struct attribute_group vexpress_hwmon_group_temp = {
120 .attrs = vexpress_hwmon_attrs_temp, 139 .attrs = vexpress_hwmon_attrs_temp,
121}; 140};
141static struct vexpress_hwmon_type vexpress_hwmon_temp = {
142 .name = "vexpress_temp",
143 .attr_groups = (const struct attribute_group *[]) {
144 &vexpress_hwmon_group_temp,
145 NULL
146 },
147};
122 148
123static DEVICE_ATTR(power1_label, S_IRUGO, vexpress_hwmon_label_show, NULL); 149static DEVICE_ATTR(power1_label, S_IRUGO, vexpress_hwmon_label_show, NULL);
124static SENSOR_DEVICE_ATTR(power1_input, S_IRUGO, vexpress_hwmon_u32_show, 150static SENSOR_DEVICE_ATTR(power1_input, S_IRUGO, vexpress_hwmon_u32_show,
@@ -127,6 +153,13 @@ static VEXPRESS_HWMON_ATTRS(power, power1_label, power1_input);
127static struct attribute_group vexpress_hwmon_group_power = { 153static struct attribute_group vexpress_hwmon_group_power = {
128 .attrs = vexpress_hwmon_attrs_power, 154 .attrs = vexpress_hwmon_attrs_power,
129}; 155};
156static struct vexpress_hwmon_type vexpress_hwmon_power = {
157 .name = "vexpress_power",
158 .attr_groups = (const struct attribute_group *[]) {
159 &vexpress_hwmon_group_power,
160 NULL
161 },
162};
130 163
131static DEVICE_ATTR(energy1_label, S_IRUGO, vexpress_hwmon_label_show, NULL); 164static DEVICE_ATTR(energy1_label, S_IRUGO, vexpress_hwmon_label_show, NULL);
132static SENSOR_DEVICE_ATTR(energy1_input, S_IRUGO, vexpress_hwmon_u64_show, 165static SENSOR_DEVICE_ATTR(energy1_input, S_IRUGO, vexpress_hwmon_u64_show,
@@ -135,26 +168,33 @@ static VEXPRESS_HWMON_ATTRS(energy, energy1_label, energy1_input);
135static struct attribute_group vexpress_hwmon_group_energy = { 168static struct attribute_group vexpress_hwmon_group_energy = {
136 .attrs = vexpress_hwmon_attrs_energy, 169 .attrs = vexpress_hwmon_attrs_energy,
137}; 170};
171static struct vexpress_hwmon_type vexpress_hwmon_energy = {
172 .name = "vexpress_energy",
173 .attr_groups = (const struct attribute_group *[]) {
174 &vexpress_hwmon_group_energy,
175 NULL
176 },
177};
138 178
139static struct of_device_id vexpress_hwmon_of_match[] = { 179static struct of_device_id vexpress_hwmon_of_match[] = {
140#if !defined(CONFIG_REGULATOR_VEXPRESS) 180#if !defined(CONFIG_REGULATOR_VEXPRESS)
141 { 181 {
142 .compatible = "arm,vexpress-volt", 182 .compatible = "arm,vexpress-volt",
143 .data = &vexpress_hwmon_group_volt, 183 .data = &vexpress_hwmon_volt,
144 }, 184 },
145#endif 185#endif
146 { 186 {
147 .compatible = "arm,vexpress-amp", 187 .compatible = "arm,vexpress-amp",
148 .data = &vexpress_hwmon_group_amp, 188 .data = &vexpress_hwmon_amp,
149 }, { 189 }, {
150 .compatible = "arm,vexpress-temp", 190 .compatible = "arm,vexpress-temp",
151 .data = &vexpress_hwmon_group_temp, 191 .data = &vexpress_hwmon_temp,
152 }, { 192 }, {
153 .compatible = "arm,vexpress-power", 193 .compatible = "arm,vexpress-power",
154 .data = &vexpress_hwmon_group_power, 194 .data = &vexpress_hwmon_power,
155 }, { 195 }, {
156 .compatible = "arm,vexpress-energy", 196 .compatible = "arm,vexpress-energy",
157 .data = &vexpress_hwmon_group_energy, 197 .data = &vexpress_hwmon_energy,
158 }, 198 },
159 {} 199 {}
160}; 200};
@@ -165,6 +205,7 @@ static int vexpress_hwmon_probe(struct platform_device *pdev)
165 int err; 205 int err;
166 const struct of_device_id *match; 206 const struct of_device_id *match;
167 struct vexpress_hwmon_data *data; 207 struct vexpress_hwmon_data *data;
208 const struct vexpress_hwmon_type *type;
168 209
169 data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL); 210 data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL);
170 if (!data) 211 if (!data)
@@ -174,12 +215,14 @@ static int vexpress_hwmon_probe(struct platform_device *pdev)
174 match = of_match_device(vexpress_hwmon_of_match, &pdev->dev); 215 match = of_match_device(vexpress_hwmon_of_match, &pdev->dev);
175 if (!match) 216 if (!match)
176 return -ENODEV; 217 return -ENODEV;
218 type = match->data;
219 data->name = type->name;
177 220
178 data->func = vexpress_config_func_get_by_dev(&pdev->dev); 221 data->func = vexpress_config_func_get_by_dev(&pdev->dev);
179 if (!data->func) 222 if (!data->func)
180 return -ENODEV; 223 return -ENODEV;
181 224
182 err = sysfs_create_group(&pdev->dev.kobj, match->data); 225 err = sysfs_create_groups(&pdev->dev.kobj, type->attr_groups);
183 if (err) 226 if (err)
184 goto error; 227 goto error;
185 228