aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/hwmon
diff options
context:
space:
mode:
authorGuenter Roeck <linux@roeck-us.net>2014-05-12 14:03:47 -0400
committerGuenter Roeck <linux@roeck-us.net>2014-05-21 19:02:24 -0400
commit03f49f641ab70b2ceea674e666f5b933e3bc5d27 (patch)
tree30d0b6bf539480839590394699f2d525ee5f7cf2 /drivers/hwmon
parentd8850c19b589bd364d3c7cd1273193e6dfe83fd9 (diff)
hwmon: (emc1403) Add support for alarm and diode fault status on EMC14x2
Alarm and fault status register on EMC1402, EMC1412, and EMC1422 is reported in a different register than with other chips. Add support for it. Signed-off-by: Guenter Roeck <linux@roeck-us.net>
Diffstat (limited to 'drivers/hwmon')
-rw-r--r--drivers/hwmon/emc1403.c36
1 files changed, 36 insertions, 0 deletions
diff --git a/drivers/hwmon/emc1403.c b/drivers/hwmon/emc1403.c
index 9acd5bfcfa01..f76e5503b89a 100644
--- a/drivers/hwmon/emc1403.c
+++ b/drivers/hwmon/emc1403.c
@@ -299,6 +299,39 @@ static const struct attribute_group emc1404_group = {
299 .attrs = emc1404_attrs, 299 .attrs = emc1404_attrs,
300}; 300};
301 301
302/*
303 * EMC14x2 uses a different register and different bits to report alarm and
304 * fault status. For simplicity, provide a separate attribute group for this
305 * chip series.
306 * Since we can not re-use the same attribute names, create a separate attribute
307 * array.
308 */
309static struct sensor_device_attribute_2 emc1402_alarms[] = {
310 SENSOR_ATTR_2(temp1_min_alarm, S_IRUGO, show_bit, NULL, 0x02, 0x20),
311 SENSOR_ATTR_2(temp1_max_alarm, S_IRUGO, show_bit, NULL, 0x02, 0x40),
312 SENSOR_ATTR_2(temp1_crit_alarm, S_IRUGO, show_bit, NULL, 0x02, 0x01),
313
314 SENSOR_ATTR_2(temp2_fault, S_IRUGO, show_bit, NULL, 0x02, 0x04),
315 SENSOR_ATTR_2(temp2_min_alarm, S_IRUGO, show_bit, NULL, 0x02, 0x08),
316 SENSOR_ATTR_2(temp2_max_alarm, S_IRUGO, show_bit, NULL, 0x02, 0x10),
317 SENSOR_ATTR_2(temp2_crit_alarm, S_IRUGO, show_bit, NULL, 0x02, 0x02),
318};
319
320static struct attribute *emc1402_alarm_attrs[] = {
321 &emc1402_alarms[0].dev_attr.attr,
322 &emc1402_alarms[1].dev_attr.attr,
323 &emc1402_alarms[2].dev_attr.attr,
324 &emc1402_alarms[3].dev_attr.attr,
325 &emc1402_alarms[4].dev_attr.attr,
326 &emc1402_alarms[5].dev_attr.attr,
327 &emc1402_alarms[6].dev_attr.attr,
328 NULL,
329};
330
331static const struct attribute_group emc1402_alarm_group = {
332 .attrs = emc1402_alarm_attrs,
333};
334
302static int emc1403_detect(struct i2c_client *client, 335static int emc1403_detect(struct i2c_client *client,
303 struct i2c_board_info *info) 336 struct i2c_board_info *info)
304{ 337{
@@ -395,6 +428,9 @@ static int emc1403_probe(struct i2c_client *client,
395 data->groups[0] = &emc1402_group; 428 data->groups[0] = &emc1402_group;
396 } 429 }
397 430
431 if (id->driver_data == emc1402)
432 data->groups[1] = &emc1402_alarm_group;
433
398 hwmon_dev = devm_hwmon_device_register_with_groups(&client->dev, 434 hwmon_dev = devm_hwmon_device_register_with_groups(&client->dev,
399 client->name, data, 435 client->name, data,
400 data->groups); 436 data->groups);