aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/platform/x86/toshiba_acpi.c
diff options
context:
space:
mode:
authorAzael Avalos <coproscefalo@gmail.com>2015-02-09 22:55:02 -0500
committerDarren Hart <dvhart@linux.intel.com>2015-02-09 23:21:02 -0500
commit98fc4ec64a211a9d301172dec2aed08f47964295 (patch)
treebaa714d1dc07320f97d7c1d129ced4acae767472 /drivers/platform/x86/toshiba_acpi.c
parent2a89d7c2e9ed61f5e032e41f9bf1d9e4fe9fd2ea (diff)
toshiba_acpi: Make toshiba_eco_mode_available more robust
Some Toshiba laptops do not come with the ECO led installed, however, the driver is registering support for it when it should not. This patch makes the toshiba_eco_mode_available function more robust in detecting ECO led capabilities, not registering the led on laptops that do not support it and registering the led when it really does. The ECO led function now returns 0x8e00 (Not Installed) by querying with in[3] = 0, whenever theres no physical LED installed, and returning 0x8300 (Input Data Error) when it is, however, there are some BIOSes that have stub function calls not returning anything and and the LED device was being registered too, hence the change of the default return value from 1 to 0. Signed-off-by: Azael Avalos <coproscefalo@gmail.com> Minor comment update, fixed a whitespace error, s/truly/actual/. Signed-off-by: Darren Hart <dvhart@linux.intel.com>
Diffstat (limited to 'drivers/platform/x86/toshiba_acpi.c')
-rw-r--r--drivers/platform/x86/toshiba_acpi.c27
1 files changed, 22 insertions, 5 deletions
diff --git a/drivers/platform/x86/toshiba_acpi.c b/drivers/platform/x86/toshiba_acpi.c
index 48c79b257178..a480fd089f81 100644
--- a/drivers/platform/x86/toshiba_acpi.c
+++ b/drivers/platform/x86/toshiba_acpi.c
@@ -108,6 +108,7 @@ MODULE_LICENSE("GPL");
108#define TOS_FIFO_EMPTY 0x8c00 108#define TOS_FIFO_EMPTY 0x8c00
109#define TOS_DATA_NOT_AVAILABLE 0x8d20 109#define TOS_DATA_NOT_AVAILABLE 0x8d20
110#define TOS_NOT_INITIALIZED 0x8d50 110#define TOS_NOT_INITIALIZED 0x8d50
111#define TOS_NOT_INSTALLED 0x8e00
111 112
112/* registers */ 113/* registers */
113#define HCI_FAN 0x0004 114#define HCI_FAN 0x0004
@@ -695,16 +696,32 @@ static int toshiba_touchpad_get(struct toshiba_acpi_dev *dev, u32 *state)
695static int toshiba_eco_mode_available(struct toshiba_acpi_dev *dev) 696static int toshiba_eco_mode_available(struct toshiba_acpi_dev *dev)
696{ 697{
697 acpi_status status; 698 acpi_status status;
698 u32 in[TCI_WORDS] = { HCI_GET, HCI_ECO_MODE, 0, 1, 0, 0 }; 699 u32 in[TCI_WORDS] = { HCI_GET, HCI_ECO_MODE, 0, 0, 0, 0 };
699 u32 out[TCI_WORDS]; 700 u32 out[TCI_WORDS];
700 701
701 status = tci_raw(dev, in, out); 702 status = tci_raw(dev, in, out);
702 if (ACPI_FAILURE(status) || out[0] == TOS_INPUT_DATA_ERROR) { 703 if (ACPI_FAILURE(status) || out[0] == TOS_FAILURE) {
703 pr_info("ACPI call to get ECO led failed\n"); 704 pr_err("ACPI call to get ECO led failed\n");
704 return 0; 705 } else if (out[0] == TOS_NOT_INSTALLED) {
706 pr_info("ECO led not installed");
707 } else if (out[0] == TOS_INPUT_DATA_ERROR) {
708 /* If we receive 0x8300 (Input Data Error), it means that the
709 * LED device is present, but that we just screwed the input
710 * parameters.
711 *
712 * Let's query the status of the LED to see if we really have a
713 * success response, indicating the actual presense of the LED,
714 * bail out otherwise.
715 */
716 in[3] = 1;
717 status = tci_raw(dev, in, out);
718 if (ACPI_FAILURE(status) || out[0] == TOS_FAILURE)
719 pr_err("ACPI call to get ECO led failed\n");
720 else if (out[0] == TOS_SUCCESS)
721 return 1;
705 } 722 }
706 723
707 return 1; 724 return 0;
708} 725}
709 726
710static enum led_brightness toshiba_eco_mode_get_status(struct led_classdev *cdev) 727static enum led_brightness toshiba_eco_mode_get_status(struct led_classdev *cdev)