Some Toshiba laptops have the transflective LCD and toshset can control its backlight state. I brought this feature to the mainline. It was tested on a Toshiba Portege R500. Signed-off-by: Akio Idehara <zbe64533@xxxxxxxxx> --- drivers/platform/x86/toshiba_acpi.c | 43 ++++++++++++++++++++++++++++++++++- 1 files changed, 42 insertions(+), 1 deletions(-) diff --git a/drivers/platform/x86/toshiba_acpi.c b/drivers/platform/x86/toshiba_acpi.c index dcdc1f4..af3979c 100644 --- a/drivers/platform/x86/toshiba_acpi.c +++ b/drivers/platform/x86/toshiba_acpi.c @@ -51,6 +51,7 @@ #include <linux/input.h> #include <linux/input/sparse-keymap.h> #include <linux/leds.h> +#include <linux/fb.h> #include <linux/slab.h> #include <asm/uaccess.h> @@ -88,6 +89,7 @@ MODULE_LICENSE("GPL"); /* registers */ #define HCI_FAN 0x0004 +#define HCI_TR_BACKLIGHT 0x0005 #define HCI_SYSTEM_EVENT 0x0016 #define HCI_VIDEO_OUT 0x001c #define HCI_HOTKEY_EVENT 0x001e @@ -122,6 +124,7 @@ struct toshiba_acpi_dev { int video_supported:1; int fan_supported:1; int system_event_supported:1; + int tr_backlight_supported:1; struct mutex mutex; }; @@ -461,6 +464,22 @@ static const struct rfkill_ops toshiba_rfk_ops = { .poll = bt_rfkill_poll, }; +static int get_tr_backlight_status(struct toshiba_acpi_dev *dev, u32 *status) +{ + u32 hci_result; + + hci_read1(dev, HCI_TR_BACKLIGHT, status, &hci_result); + return hci_result == HCI_SUCCESS ? 0 : -EIO; +} + +static int set_tr_backlight_status(struct toshiba_acpi_dev *dev, int value) +{ + u32 hci_result; + + hci_write1(dev, HCI_TR_BACKLIGHT, value, &hci_result); + return hci_result == HCI_SUCCESS ? 0 : -EIO; +} + static struct proc_dir_entry *toshiba_proc_dir /*= 0*/ ; static int get_lcd(struct backlight_device *bd) @@ -512,8 +531,19 @@ static int set_lcd(struct toshiba_acpi_dev *dev, int value) static int set_lcd_status(struct backlight_device *bd) { + int ret; struct toshiba_acpi_dev *dev = bl_get_data(bd); - return set_lcd(dev, bd->props.brightness); + + ret = set_lcd(dev, bd->props.brightness); + if (ret) + return ret; + + if (dev->tr_backlight_supported) { + int value = (bd->props.power == FB_BLANK_UNBLANK) ? 1 : 0; + ret = set_tr_backlight_status(dev, value); + } + + return ret; } static ssize_t lcd_proc_write(struct file *file, const char __user *buf, @@ -938,6 +968,7 @@ static int __devinit toshiba_acpi_add(struct acpi_device *acpi_dev) const char *hci_method; u32 hci_result; u32 dummy; + u32 value; bool bt_present; int ret = 0; struct backlight_properties props; @@ -984,6 +1015,16 @@ static int __devinit toshiba_acpi_add(struct acpi_device *acpi_dev) } dev->backlight_dev->props.brightness = get_lcd(dev->backlight_dev); + /* Determine whether or not BIOS supports transflective backlight */ + ret = get_tr_backlight_status(dev, &value) ? false : true; + dev->tr_backlight_supported = ret; + if (ret) { + int power = value ? FB_BLANK_UNBLANK : FB_BLANK_POWERDOWN; + dev->backlight_dev->props.power = power; + } else { + dev->backlight_dev->props.power = FB_BLANK_UNBLANK; + } + /* Register rfkill switch for Bluetooth */ if (hci_get_bt_present(dev, &bt_present) == HCI_SUCCESS && bt_present) { dev->bt_rfk = rfkill_alloc("Toshiba Bluetooth", -- 1.7.7.6 -- To unsubscribe from this list: send the line "unsubscribe platform-driver-x86" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html