diff options
Diffstat (limited to 'drivers/hwmon/it87.c')
| -rw-r--r-- | drivers/hwmon/it87.c | 46 |
1 files changed, 44 insertions, 2 deletions
diff --git a/drivers/hwmon/it87.c b/drivers/hwmon/it87.c index 25763d2223b6..f7701295937d 100644 --- a/drivers/hwmon/it87.c +++ b/drivers/hwmon/it87.c | |||
| @@ -259,6 +259,7 @@ struct it87_sio_data { | |||
| 259 | u8 revision; | 259 | u8 revision; |
| 260 | u8 vid_value; | 260 | u8 vid_value; |
| 261 | u8 beep_pin; | 261 | u8 beep_pin; |
| 262 | u8 internal; /* Internal sensors can be labeled */ | ||
| 262 | /* Features skipped based on config or DMI */ | 263 | /* Features skipped based on config or DMI */ |
| 263 | u8 skip_vid; | 264 | u8 skip_vid; |
| 264 | u8 skip_fan; | 265 | u8 skip_fan; |
| @@ -1194,6 +1195,22 @@ static ssize_t show_vid_reg(struct device *dev, struct device_attribute *attr, | |||
| 1194 | } | 1195 | } |
| 1195 | static DEVICE_ATTR(cpu0_vid, S_IRUGO, show_vid_reg, NULL); | 1196 | static DEVICE_ATTR(cpu0_vid, S_IRUGO, show_vid_reg, NULL); |
| 1196 | 1197 | ||
| 1198 | static ssize_t show_label(struct device *dev, struct device_attribute *attr, | ||
| 1199 | char *buf) | ||
| 1200 | { | ||
| 1201 | static const char *labels[] = { | ||
| 1202 | "+5V", | ||
| 1203 | "5VSB", | ||
| 1204 | "Vbat", | ||
| 1205 | }; | ||
| 1206 | int nr = to_sensor_dev_attr(attr)->index; | ||
| 1207 | |||
| 1208 | return sprintf(buf, "%s\n", labels[nr]); | ||
| 1209 | } | ||
| 1210 | static SENSOR_DEVICE_ATTR(in3_label, S_IRUGO, show_label, NULL, 0); | ||
| 1211 | static SENSOR_DEVICE_ATTR(in7_label, S_IRUGO, show_label, NULL, 1); | ||
| 1212 | static SENSOR_DEVICE_ATTR(in8_label, S_IRUGO, show_label, NULL, 2); | ||
| 1213 | |||
| 1197 | static ssize_t show_name(struct device *dev, struct device_attribute | 1214 | static ssize_t show_name(struct device *dev, struct device_attribute |
| 1198 | *devattr, char *buf) | 1215 | *devattr, char *buf) |
| 1199 | { | 1216 | { |
| @@ -1434,6 +1451,17 @@ static const struct attribute_group it87_group_vid = { | |||
| 1434 | .attrs = it87_attributes_vid, | 1451 | .attrs = it87_attributes_vid, |
| 1435 | }; | 1452 | }; |
| 1436 | 1453 | ||
| 1454 | static struct attribute *it87_attributes_label[] = { | ||
| 1455 | &sensor_dev_attr_in3_label.dev_attr.attr, | ||
| 1456 | &sensor_dev_attr_in7_label.dev_attr.attr, | ||
| 1457 | &sensor_dev_attr_in8_label.dev_attr.attr, | ||
| 1458 | NULL | ||
| 1459 | }; | ||
| 1460 | |||
| 1461 | static const struct attribute_group it87_group_label = { | ||
| 1462 | .attrs = it87_attributes_vid, | ||
| 1463 | }; | ||
| 1464 | |||
| 1437 | /* SuperIO detection - will change isa_address if a chip is found */ | 1465 | /* SuperIO detection - will change isa_address if a chip is found */ |
| 1438 | static int __init it87_find(unsigned short *address, | 1466 | static int __init it87_find(unsigned short *address, |
| 1439 | struct it87_sio_data *sio_data) | 1467 | struct it87_sio_data *sio_data) |
| @@ -1487,6 +1515,9 @@ static int __init it87_find(unsigned short *address, | |||
| 1487 | pr_info("it87: Found IT%04xF chip at 0x%x, revision %d\n", | 1515 | pr_info("it87: Found IT%04xF chip at 0x%x, revision %d\n", |
| 1488 | chip_type, *address, sio_data->revision); | 1516 | chip_type, *address, sio_data->revision); |
| 1489 | 1517 | ||
| 1518 | /* in8 (Vbat) is always internal */ | ||
| 1519 | sio_data->internal = (1 << 2); | ||
| 1520 | |||
| 1490 | /* Read GPIO config and VID value from LDN 7 (GPIO) */ | 1521 | /* Read GPIO config and VID value from LDN 7 (GPIO) */ |
| 1491 | if (sio_data->type == it87) { | 1522 | if (sio_data->type == it87) { |
| 1492 | /* The IT8705F doesn't have VID pins at all */ | 1523 | /* The IT8705F doesn't have VID pins at all */ |
| @@ -1540,9 +1571,9 @@ static int __init it87_find(unsigned short *address, | |||
| 1540 | pr_notice("it87: Routing internal VCCH to in7\n"); | 1571 | pr_notice("it87: Routing internal VCCH to in7\n"); |
| 1541 | } | 1572 | } |
| 1542 | if (reg & (1 << 0)) | 1573 | if (reg & (1 << 0)) |
| 1543 | pr_info("it87: in3 is VCC (+5V)\n"); | 1574 | sio_data->internal |= (1 << 0); |
| 1544 | if (reg & (1 << 1)) | 1575 | if (reg & (1 << 1)) |
| 1545 | pr_info("it87: in7 is VCCH (+5V Stand-By)\n"); | 1576 | sio_data->internal |= (1 << 1); |
| 1546 | 1577 | ||
| 1547 | sio_data->beep_pin = superio_inb(IT87_SIO_BEEP_PIN_REG) & 0x3f; | 1578 | sio_data->beep_pin = superio_inb(IT87_SIO_BEEP_PIN_REG) & 0x3f; |
| 1548 | } | 1579 | } |
| @@ -1600,6 +1631,7 @@ static void it87_remove_files(struct device *dev) | |||
| 1600 | } | 1631 | } |
| 1601 | if (!sio_data->skip_vid) | 1632 | if (!sio_data->skip_vid) |
| 1602 | sysfs_remove_group(&dev->kobj, &it87_group_vid); | 1633 | sysfs_remove_group(&dev->kobj, &it87_group_vid); |
| 1634 | sysfs_remove_group(&dev->kobj, &it87_group_label); | ||
| 1603 | } | 1635 | } |
| 1604 | 1636 | ||
| 1605 | static int __devinit it87_probe(struct platform_device *pdev) | 1637 | static int __devinit it87_probe(struct platform_device *pdev) |
| @@ -1725,6 +1757,16 @@ static int __devinit it87_probe(struct platform_device *pdev) | |||
| 1725 | goto ERROR4; | 1757 | goto ERROR4; |
| 1726 | } | 1758 | } |
| 1727 | 1759 | ||
| 1760 | /* Export labels for internal sensors */ | ||
| 1761 | for (i = 0; i < 3; i++) { | ||
| 1762 | if (!(sio_data->internal & (1 << i))) | ||
| 1763 | continue; | ||
| 1764 | err = sysfs_create_file(&dev->kobj, | ||
| 1765 | it87_attributes_label[i]); | ||
| 1766 | if (err) | ||
| 1767 | goto ERROR4; | ||
| 1768 | } | ||
| 1769 | |||
| 1728 | data->hwmon_dev = hwmon_device_register(dev); | 1770 | data->hwmon_dev = hwmon_device_register(dev); |
| 1729 | if (IS_ERR(data->hwmon_dev)) { | 1771 | if (IS_ERR(data->hwmon_dev)) { |
| 1730 | err = PTR_ERR(data->hwmon_dev); | 1772 | err = PTR_ERR(data->hwmon_dev); |
