Commit 763ff32f authored by Azael Avalos's avatar Azael Avalos Committed by Darren Hart

toshiba_acpi: Add support for cooling method feature

This patch adds support to query and set the "Cooling Method" feature,
which basically changes how the system fan behaves, depending on the
supported cooling methods.

Depending on the laptop model, these are the (so far...) available
cooling methods:
- Maximum Performance
- Performance
- Battery Optimized
Signed-off-by: default avatarAzael Avalos <coproscefalo@gmail.com>
Signed-off-by: default avatarDarren Hart <dvhart@linux.intel.com>
parent 15c75626
...@@ -117,6 +117,7 @@ MODULE_LICENSE("GPL"); ...@@ -117,6 +117,7 @@ MODULE_LICENSE("GPL");
#define HCI_LCD_BRIGHTNESS 0x002a #define HCI_LCD_BRIGHTNESS 0x002a
#define HCI_WIRELESS 0x0056 #define HCI_WIRELESS 0x0056
#define HCI_ACCELEROMETER 0x006d #define HCI_ACCELEROMETER 0x006d
#define HCI_COOLING_METHOD 0x007f
#define HCI_KBD_ILLUMINATION 0x0095 #define HCI_KBD_ILLUMINATION 0x0095
#define HCI_ECO_MODE 0x0097 #define HCI_ECO_MODE 0x0097
#define HCI_ACCELEROMETER2 0x00a6 #define HCI_ACCELEROMETER2 0x00a6
...@@ -186,6 +187,7 @@ struct toshiba_acpi_dev { ...@@ -186,6 +187,7 @@ struct toshiba_acpi_dev {
int usbsc_bat_level; int usbsc_bat_level;
int usbsc_mode_base; int usbsc_mode_base;
int hotkey_event_type; int hotkey_event_type;
int max_cooling_method;
unsigned int illumination_supported:1; unsigned int illumination_supported:1;
unsigned int video_supported:1; unsigned int video_supported:1;
...@@ -205,6 +207,7 @@ struct toshiba_acpi_dev { ...@@ -205,6 +207,7 @@ struct toshiba_acpi_dev {
unsigned int panel_power_on_supported:1; unsigned int panel_power_on_supported:1;
unsigned int usb_three_supported:1; unsigned int usb_three_supported:1;
unsigned int wwan_supported:1; unsigned int wwan_supported:1;
unsigned int cooling_method_supported:1;
unsigned int sysfs_created:1; unsigned int sysfs_created:1;
unsigned int special_functions; unsigned int special_functions;
...@@ -1194,6 +1197,53 @@ static int toshiba_wwan_set(struct toshiba_acpi_dev *dev, u32 state) ...@@ -1194,6 +1197,53 @@ static int toshiba_wwan_set(struct toshiba_acpi_dev *dev, u32 state)
return out[0] == TOS_SUCCESS ? 0 : -EIO; return out[0] == TOS_SUCCESS ? 0 : -EIO;
} }
/* Cooling Method */
static void toshiba_cooling_method_available(struct toshiba_acpi_dev *dev)
{
u32 in[TCI_WORDS] = { HCI_GET, HCI_COOLING_METHOD, 0, 0, 0, 0 };
u32 out[TCI_WORDS];
acpi_status status;
dev->cooling_method_supported = 0;
dev->max_cooling_method = 0;
status = tci_raw(dev, in, out);
if (ACPI_FAILURE(status))
pr_err("ACPI call to get Cooling Method failed\n");
if (out[0] != TOS_SUCCESS && out[0] != TOS_SUCCESS2)
return;
dev->cooling_method_supported = 1;
dev->max_cooling_method = out[3];
}
static int toshiba_cooling_method_get(struct toshiba_acpi_dev *dev, u32 *state)
{
u32 result = hci_read(dev, HCI_COOLING_METHOD, state);
if (result == TOS_FAILURE)
pr_err("ACPI call to get Cooling Method failed\n");
if (result == TOS_NOT_SUPPORTED)
return -ENODEV;
return (result == TOS_SUCCESS || result == TOS_SUCCESS2) ? 0 : -EIO;
}
static int toshiba_cooling_method_set(struct toshiba_acpi_dev *dev, u32 state)
{
u32 result = hci_write(dev, HCI_COOLING_METHOD, state);
if (result == TOS_FAILURE)
pr_err("ACPI call to get Cooling Method failed\n");
if (result == TOS_NOT_SUPPORTED)
return -ENODEV;
return (result == TOS_SUCCESS || result == TOS_SUCCESS2) ? 0 : -EIO;
}
/* Transflective Backlight */ /* Transflective Backlight */
static int get_tr_backlight_status(struct toshiba_acpi_dev *dev, u32 *status) static int get_tr_backlight_status(struct toshiba_acpi_dev *dev, u32 *status)
{ {
...@@ -2779,6 +2829,8 @@ static void print_supported_features(struct toshiba_acpi_dev *dev) ...@@ -2779,6 +2829,8 @@ static void print_supported_features(struct toshiba_acpi_dev *dev)
pr_cont(" usb3"); pr_cont(" usb3");
if (dev->wwan_supported) if (dev->wwan_supported)
pr_cont(" wwan"); pr_cont(" wwan");
if (dev->cooling_method_supported)
pr_cont(" cooling-method");
pr_cont("\n"); pr_cont("\n");
} }
...@@ -2963,6 +3015,8 @@ static int toshiba_acpi_add(struct acpi_device *acpi_dev) ...@@ -2963,6 +3015,8 @@ static int toshiba_acpi_add(struct acpi_device *acpi_dev)
if (dev->wwan_supported) if (dev->wwan_supported)
toshiba_acpi_setup_wwan_rfkill(dev); toshiba_acpi_setup_wwan_rfkill(dev);
toshiba_cooling_method_available(dev);
print_supported_features(dev); print_supported_features(dev);
ret = sysfs_create_group(&dev->acpi_dev->dev.kobj, ret = sysfs_create_group(&dev->acpi_dev->dev.kobj,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment