diff options
author | Azael Avalos <coproscefalo@gmail.com> | 2015-02-10 23:09:17 -0500 |
---|---|---|
committer | Darren Hart <dvhart@linux.intel.com> | 2015-02-11 23:40:48 -0500 |
commit | 94477d4cfe6a579d88811221ee7198fa30f33a99 (patch) | |
tree | 7c09ec7b5e217769aeab78aee207d1e4390fca35 | |
parent | c6c68ff812ca730a3d6bac95a49d731b832a1460 (diff) |
toshiba_acpi: Add fan entry to sysfs
This patch adds a fan entry to sysfs, enabling the user to get and
set the fan status.
Signed-off-by: Azael Avalos <coproscefalo@gmail.com>
Signed-off-by: Darren Hart <dvhart@linux.intel.com>
-rw-r--r-- | drivers/platform/x86/toshiba_acpi.c | 51 |
1 files changed, 50 insertions, 1 deletions
diff --git a/drivers/platform/x86/toshiba_acpi.c b/drivers/platform/x86/toshiba_acpi.c index fe5987e80e66..47d47b507c5f 100644 --- a/drivers/platform/x86/toshiba_acpi.c +++ b/drivers/platform/x86/toshiba_acpi.c | |||
@@ -1533,6 +1533,11 @@ static const struct backlight_ops toshiba_backlight_data = { | |||
1533 | */ | 1533 | */ |
1534 | static ssize_t toshiba_version_show(struct device *dev, | 1534 | static ssize_t toshiba_version_show(struct device *dev, |
1535 | struct device_attribute *attr, char *buf); | 1535 | struct device_attribute *attr, char *buf); |
1536 | static ssize_t toshiba_fan_store(struct device *dev, | ||
1537 | struct device_attribute *attr, | ||
1538 | const char *buf, size_t count); | ||
1539 | static ssize_t toshiba_fan_show(struct device *dev, | ||
1540 | struct device_attribute *attr, char *buf); | ||
1536 | static ssize_t toshiba_kbd_bl_mode_store(struct device *dev, | 1541 | static ssize_t toshiba_kbd_bl_mode_store(struct device *dev, |
1537 | struct device_attribute *attr, | 1542 | struct device_attribute *attr, |
1538 | const char *buf, size_t count); | 1543 | const char *buf, size_t count); |
@@ -1586,6 +1591,8 @@ static ssize_t toshiba_usb_sleep_music_store(struct device *dev, | |||
1586 | const char *buf, size_t count); | 1591 | const char *buf, size_t count); |
1587 | 1592 | ||
1588 | static DEVICE_ATTR(version, S_IRUGO, toshiba_version_show, NULL); | 1593 | static DEVICE_ATTR(version, S_IRUGO, toshiba_version_show, NULL); |
1594 | static DEVICE_ATTR(fan, S_IRUGO | S_IWUSR, | ||
1595 | toshiba_fan_show, toshiba_fan_store); | ||
1589 | static DEVICE_ATTR(kbd_backlight_mode, S_IRUGO | S_IWUSR, | 1596 | static DEVICE_ATTR(kbd_backlight_mode, S_IRUGO | S_IWUSR, |
1590 | toshiba_kbd_bl_mode_show, toshiba_kbd_bl_mode_store); | 1597 | toshiba_kbd_bl_mode_show, toshiba_kbd_bl_mode_store); |
1591 | static DEVICE_ATTR(kbd_type, S_IRUGO, toshiba_kbd_type_show, NULL); | 1598 | static DEVICE_ATTR(kbd_type, S_IRUGO, toshiba_kbd_type_show, NULL); |
@@ -1611,6 +1618,7 @@ static DEVICE_ATTR(usb_sleep_music, S_IRUGO | S_IWUSR, | |||
1611 | 1618 | ||
1612 | static struct attribute *toshiba_attributes[] = { | 1619 | static struct attribute *toshiba_attributes[] = { |
1613 | &dev_attr_version.attr, | 1620 | &dev_attr_version.attr, |
1621 | &dev_attr_fan.attr, | ||
1614 | &dev_attr_kbd_backlight_mode.attr, | 1622 | &dev_attr_kbd_backlight_mode.attr, |
1615 | &dev_attr_kbd_type.attr, | 1623 | &dev_attr_kbd_type.attr, |
1616 | &dev_attr_available_kbd_modes.attr, | 1624 | &dev_attr_available_kbd_modes.attr, |
@@ -1638,6 +1646,45 @@ static ssize_t toshiba_version_show(struct device *dev, | |||
1638 | return sprintf(buf, "%s\n", TOSHIBA_ACPI_VERSION); | 1646 | return sprintf(buf, "%s\n", TOSHIBA_ACPI_VERSION); |
1639 | } | 1647 | } |
1640 | 1648 | ||
1649 | static ssize_t toshiba_fan_store(struct device *dev, | ||
1650 | struct device_attribute *attr, | ||
1651 | const char *buf, size_t count) | ||
1652 | { | ||
1653 | struct toshiba_acpi_dev *toshiba = dev_get_drvdata(dev); | ||
1654 | u32 result; | ||
1655 | int state; | ||
1656 | int ret; | ||
1657 | |||
1658 | ret = kstrtoint(buf, 0, &state); | ||
1659 | if (ret) | ||
1660 | return ret; | ||
1661 | |||
1662 | if (state != 0 && state != 1) | ||
1663 | return -EINVAL; | ||
1664 | |||
1665 | result = hci_write1(toshiba, HCI_FAN, state); | ||
1666 | if (result == TOS_FAILURE) | ||
1667 | return -EIO; | ||
1668 | else if (result == TOS_NOT_SUPPORTED) | ||
1669 | return -ENODEV; | ||
1670 | |||
1671 | return count; | ||
1672 | } | ||
1673 | |||
1674 | static ssize_t toshiba_fan_show(struct device *dev, | ||
1675 | struct device_attribute *attr, char *buf) | ||
1676 | { | ||
1677 | struct toshiba_acpi_dev *toshiba = dev_get_drvdata(dev); | ||
1678 | u32 value; | ||
1679 | int ret; | ||
1680 | |||
1681 | ret = get_fan_status(toshiba, &value); | ||
1682 | if (ret) | ||
1683 | return ret; | ||
1684 | |||
1685 | return sprintf(buf, "%d\n", value); | ||
1686 | } | ||
1687 | |||
1641 | static ssize_t toshiba_kbd_bl_mode_store(struct device *dev, | 1688 | static ssize_t toshiba_kbd_bl_mode_store(struct device *dev, |
1642 | struct device_attribute *attr, | 1689 | struct device_attribute *attr, |
1643 | const char *buf, size_t count) | 1690 | const char *buf, size_t count) |
@@ -2034,7 +2081,9 @@ static umode_t toshiba_sysfs_is_visible(struct kobject *kobj, | |||
2034 | struct toshiba_acpi_dev *drv = dev_get_drvdata(dev); | 2081 | struct toshiba_acpi_dev *drv = dev_get_drvdata(dev); |
2035 | bool exists = true; | 2082 | bool exists = true; |
2036 | 2083 | ||
2037 | if (attr == &dev_attr_kbd_backlight_mode.attr) | 2084 | if (attr == &dev_attr_fan.attr) |
2085 | exists = (drv->fan_supported) ? true : false; | ||
2086 | else if (attr == &dev_attr_kbd_backlight_mode.attr) | ||
2038 | exists = (drv->kbd_illum_supported) ? true : false; | 2087 | exists = (drv->kbd_illum_supported) ? true : false; |
2039 | else if (attr == &dev_attr_kbd_backlight_timeout.attr) | 2088 | else if (attr == &dev_attr_kbd_backlight_timeout.attr) |
2040 | exists = (drv->kbd_mode == SCI_KBD_MODE_AUTO) ? true : false; | 2089 | exists = (drv->kbd_mode == SCI_KBD_MODE_AUTO) ? true : false; |