diff options
Diffstat (limited to 'drivers/platform/x86/toshiba_acpi.c')
| -rw-r--r-- | drivers/platform/x86/toshiba_acpi.c | 71 |
1 files changed, 62 insertions, 9 deletions
diff --git a/drivers/platform/x86/toshiba_acpi.c b/drivers/platform/x86/toshiba_acpi.c index 17a259eb3eed..37f5f64976f1 100644 --- a/drivers/platform/x86/toshiba_acpi.c +++ b/drivers/platform/x86/toshiba_acpi.c | |||
| @@ -150,9 +150,10 @@ MODULE_LICENSE("GPL"); | |||
| 150 | #define SCI_KBD_MODE_OFF 0x10 | 150 | #define SCI_KBD_MODE_OFF 0x10 |
| 151 | #define SCI_KBD_TIME_MAX 0x3c001a | 151 | #define SCI_KBD_TIME_MAX 0x3c001a |
| 152 | #define SCI_USB_CHARGE_MODE_MASK 0xff | 152 | #define SCI_USB_CHARGE_MODE_MASK 0xff |
| 153 | #define SCI_USB_CHARGE_DISABLED 0x30000 | 153 | #define SCI_USB_CHARGE_DISABLED 0x00 |
| 154 | #define SCI_USB_CHARGE_ALTERNATE 0x30009 | 154 | #define SCI_USB_CHARGE_ALTERNATE 0x09 |
| 155 | #define SCI_USB_CHARGE_AUTO 0x30021 | 155 | #define SCI_USB_CHARGE_TYPICAL 0x11 |
| 156 | #define SCI_USB_CHARGE_AUTO 0x21 | ||
| 156 | #define SCI_USB_CHARGE_BAT_MASK 0x7 | 157 | #define SCI_USB_CHARGE_BAT_MASK 0x7 |
| 157 | #define SCI_USB_CHARGE_BAT_LVL_OFF 0x1 | 158 | #define SCI_USB_CHARGE_BAT_LVL_OFF 0x1 |
| 158 | #define SCI_USB_CHARGE_BAT_LVL_ON 0x4 | 159 | #define SCI_USB_CHARGE_BAT_LVL_ON 0x4 |
| @@ -177,6 +178,7 @@ struct toshiba_acpi_dev { | |||
| 177 | int kbd_mode; | 178 | int kbd_mode; |
| 178 | int kbd_time; | 179 | int kbd_time; |
| 179 | int usbsc_bat_level; | 180 | int usbsc_bat_level; |
| 181 | int usbsc_mode_base; | ||
| 180 | int hotkey_event_type; | 182 | int hotkey_event_type; |
| 181 | 183 | ||
| 182 | unsigned int illumination_supported:1; | 184 | unsigned int illumination_supported:1; |
| @@ -800,6 +802,54 @@ static int toshiba_accelerometer_get(struct toshiba_acpi_dev *dev, | |||
| 800 | } | 802 | } |
| 801 | 803 | ||
| 802 | /* Sleep (Charge and Music) utilities support */ | 804 | /* Sleep (Charge and Music) utilities support */ |
| 805 | static void toshiba_usb_sleep_charge_available(struct toshiba_acpi_dev *dev) | ||
| 806 | { | ||
| 807 | u32 in[TCI_WORDS] = { SCI_GET, SCI_USB_SLEEP_CHARGE, 0, 0, 0, 0 }; | ||
| 808 | u32 out[TCI_WORDS]; | ||
| 809 | acpi_status status; | ||
| 810 | |||
| 811 | /* Set the feature to "not supported" in case of error */ | ||
| 812 | dev->usb_sleep_charge_supported = 0; | ||
| 813 | |||
| 814 | if (!sci_open(dev)) | ||
| 815 | return; | ||
| 816 | |||
| 817 | status = tci_raw(dev, in, out); | ||
| 818 | if (ACPI_FAILURE(status) || out[0] == TOS_FAILURE) { | ||
| 819 | pr_err("ACPI call to get USB Sleep and Charge mode failed\n"); | ||
| 820 | sci_close(dev); | ||
| 821 | return; | ||
| 822 | } else if (out[0] == TOS_NOT_SUPPORTED) { | ||
| 823 | pr_info("USB Sleep and Charge not supported\n"); | ||
| 824 | sci_close(dev); | ||
| 825 | return; | ||
| 826 | } else if (out[0] == TOS_SUCCESS) { | ||
| 827 | dev->usbsc_mode_base = out[4]; | ||
| 828 | } | ||
| 829 | |||
| 830 | in[5] = SCI_USB_CHARGE_BAT_LVL; | ||
| 831 | status = tci_raw(dev, in, out); | ||
| 832 | if (ACPI_FAILURE(status) || out[0] == TOS_FAILURE) { | ||
| 833 | pr_err("ACPI call to get USB Sleep and Charge mode failed\n"); | ||
| 834 | sci_close(dev); | ||
| 835 | return; | ||
| 836 | } else if (out[0] == TOS_NOT_SUPPORTED) { | ||
| 837 | pr_info("USB Sleep and Charge not supported\n"); | ||
| 838 | sci_close(dev); | ||
| 839 | return; | ||
| 840 | } else if (out[0] == TOS_SUCCESS) { | ||
| 841 | dev->usbsc_bat_level = out[2]; | ||
| 842 | /* | ||
| 843 | * If we reach this point, it means that the laptop has support | ||
| 844 | * for this feature and all values are initialized. | ||
| 845 | * Set it as supported. | ||
| 846 | */ | ||
| 847 | dev->usb_sleep_charge_supported = 1; | ||
| 848 | } | ||
| 849 | |||
| 850 | sci_close(dev); | ||
| 851 | } | ||
| 852 | |||
| 803 | static int toshiba_usb_sleep_charge_get(struct toshiba_acpi_dev *dev, | 853 | static int toshiba_usb_sleep_charge_get(struct toshiba_acpi_dev *dev, |
| 804 | u32 *mode) | 854 | u32 *mode) |
| 805 | { | 855 | { |
| @@ -1976,17 +2026,21 @@ static ssize_t usb_sleep_charge_store(struct device *dev, | |||
| 1976 | * 0 - Disabled | 2026 | * 0 - Disabled |
| 1977 | * 1 - Alternate (Non USB conformant devices that require more power) | 2027 | * 1 - Alternate (Non USB conformant devices that require more power) |
| 1978 | * 2 - Auto (USB conformant devices) | 2028 | * 2 - Auto (USB conformant devices) |
| 2029 | * 3 - Typical | ||
| 1979 | */ | 2030 | */ |
| 1980 | if (state != 0 && state != 1 && state != 2) | 2031 | if (state != 0 && state != 1 && state != 2 && state != 3) |
| 1981 | return -EINVAL; | 2032 | return -EINVAL; |
| 1982 | 2033 | ||
| 1983 | /* Set the USB charging mode to internal value */ | 2034 | /* Set the USB charging mode to internal value */ |
| 2035 | mode = toshiba->usbsc_mode_base; | ||
| 1984 | if (state == 0) | 2036 | if (state == 0) |
| 1985 | mode = SCI_USB_CHARGE_DISABLED; | 2037 | mode |= SCI_USB_CHARGE_DISABLED; |
| 1986 | else if (state == 1) | 2038 | else if (state == 1) |
| 1987 | mode = SCI_USB_CHARGE_ALTERNATE; | 2039 | mode |= SCI_USB_CHARGE_ALTERNATE; |
| 1988 | else if (state == 2) | 2040 | else if (state == 2) |
| 1989 | mode = SCI_USB_CHARGE_AUTO; | 2041 | mode |= SCI_USB_CHARGE_AUTO; |
| 2042 | else if (state == 3) | ||
| 2043 | mode |= SCI_USB_CHARGE_TYPICAL; | ||
| 1990 | 2044 | ||
| 1991 | ret = toshiba_usb_sleep_charge_set(toshiba, mode); | 2045 | ret = toshiba_usb_sleep_charge_set(toshiba, mode); |
| 1992 | if (ret) | 2046 | if (ret) |
| @@ -2756,8 +2810,7 @@ static int toshiba_acpi_add(struct acpi_device *acpi_dev) | |||
| 2756 | ret = toshiba_accelerometer_supported(dev); | 2810 | ret = toshiba_accelerometer_supported(dev); |
| 2757 | dev->accelerometer_supported = !ret; | 2811 | dev->accelerometer_supported = !ret; |
| 2758 | 2812 | ||
| 2759 | ret = toshiba_usb_sleep_charge_get(dev, &dummy); | 2813 | toshiba_usb_sleep_charge_available(dev); |
| 2760 | dev->usb_sleep_charge_supported = !ret; | ||
| 2761 | 2814 | ||
| 2762 | ret = toshiba_usb_rapid_charge_get(dev, &dummy); | 2815 | ret = toshiba_usb_rapid_charge_get(dev, &dummy); |
| 2763 | dev->usb_rapid_charge_supported = !ret; | 2816 | dev->usb_rapid_charge_supported = !ret; |
