Commit c9263557 authored by Holger Macht's avatar Holger Macht Committed by Len Brown

ACPI: toshiba_acpi: Add support for the generic backlight device

Add support for the generic backlight interface below /sys/class/backlight.
Keep the procfs brightness handling for backward compatibility.

To achive this, add two generic functions get_lcd and set_lcd
to be used both by the procfs related and the sysfs related methods.

[apw@shadowen.org: backlight users need to select BACKLIGHT_CLASS_DEVICE]
Signed-off-by: default avatarHolger Macht <hmacht@suse.de>
Signed-off-by: default avatarAndy Whitcroft <apw@shadowen.org>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLen Brown <len.brown@intel.com>
parent 2039a6eb
...@@ -227,6 +227,7 @@ config ACPI_IBM_DOCK ...@@ -227,6 +227,7 @@ config ACPI_IBM_DOCK
config ACPI_TOSHIBA config ACPI_TOSHIBA
tristate "Toshiba Laptop Extras" tristate "Toshiba Laptop Extras"
depends on X86 depends on X86
select BACKLIGHT_CLASS_DEVICE
---help--- ---help---
This driver adds support for access to certain system settings This driver adds support for access to certain system settings
on "legacy free" Toshiba laptops. These laptops can be recognized by on "legacy free" Toshiba laptops. These laptops can be recognized by
......
...@@ -41,6 +41,8 @@ ...@@ -41,6 +41,8 @@
#include <linux/init.h> #include <linux/init.h>
#include <linux/types.h> #include <linux/types.h>
#include <linux/proc_fs.h> #include <linux/proc_fs.h>
#include <linux/backlight.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
#include <acpi/acpi_drivers.h> #include <acpi/acpi_drivers.h>
...@@ -210,6 +212,7 @@ static acpi_status hci_read1(u32 reg, u32 * out1, u32 * result) ...@@ -210,6 +212,7 @@ static acpi_status hci_read1(u32 reg, u32 * out1, u32 * result)
} }
static struct proc_dir_entry *toshiba_proc_dir /*= 0*/ ; static struct proc_dir_entry *toshiba_proc_dir /*= 0*/ ;
static struct backlight_device *toshiba_backlight_device;
static int force_fan; static int force_fan;
static int last_key_event; static int last_key_event;
static int key_event_valid; static int key_event_valid;
...@@ -271,14 +274,23 @@ dispatch_write(struct file *file, const char __user * buffer, ...@@ -271,14 +274,23 @@ dispatch_write(struct file *file, const char __user * buffer,
return result; return result;
} }
static char *read_lcd(char *p) static int get_lcd(struct backlight_device *bd)
{ {
u32 hci_result; u32 hci_result;
u32 value; u32 value;
hci_read1(HCI_LCD_BRIGHTNESS, &value, &hci_result); hci_read1(HCI_LCD_BRIGHTNESS, &value, &hci_result);
if (hci_result == HCI_SUCCESS) { if (hci_result == HCI_SUCCESS) {
value = value >> HCI_LCD_BRIGHTNESS_SHIFT; return (value >> HCI_LCD_BRIGHTNESS_SHIFT);
} else
return -EFAULT;
}
static char *read_lcd(char *p)
{
int value = get_lcd(NULL);
if (value >= 0) {
p += sprintf(p, "brightness: %d\n", value); p += sprintf(p, "brightness: %d\n", value);
p += sprintf(p, "brightness_levels: %d\n", p += sprintf(p, "brightness_levels: %d\n",
HCI_LCD_BRIGHTNESS_LEVELS); HCI_LCD_BRIGHTNESS_LEVELS);
...@@ -289,22 +301,34 @@ static char *read_lcd(char *p) ...@@ -289,22 +301,34 @@ static char *read_lcd(char *p)
return p; return p;
} }
static int set_lcd(int value)
{
u32 hci_result;
value = value << HCI_LCD_BRIGHTNESS_SHIFT;
hci_write1(HCI_LCD_BRIGHTNESS, value, &hci_result);
if (hci_result != HCI_SUCCESS)
return -EFAULT;
return 0;
}
static int set_lcd_status(struct backlight_device *bd)
{
return set_lcd(bd->props->brightness);
}
static unsigned long write_lcd(const char *buffer, unsigned long count) static unsigned long write_lcd(const char *buffer, unsigned long count)
{ {
int value; int value;
u32 hci_result; int ret = count;
if (sscanf(buffer, " brightness : %i", &value) == 1 && if (sscanf(buffer, " brightness : %i", &value) == 1 &&
value >= 0 && value < HCI_LCD_BRIGHTNESS_LEVELS) { value >= 0 && value < HCI_LCD_BRIGHTNESS_LEVELS)
value = value << HCI_LCD_BRIGHTNESS_SHIFT; ret = set_lcd(value);
hci_write1(HCI_LCD_BRIGHTNESS, value, &hci_result); else
if (hci_result != HCI_SUCCESS) ret = -EINVAL;
return -EFAULT; return ret;
} else {
return -EINVAL;
}
return count;
} }
static char *read_video(char *p) static char *read_video(char *p)
...@@ -506,6 +530,26 @@ static acpi_status __exit remove_device(void) ...@@ -506,6 +530,26 @@ static acpi_status __exit remove_device(void)
return AE_OK; return AE_OK;
} }
static struct backlight_properties toshiba_backlight_data = {
.owner = THIS_MODULE,
.get_brightness = get_lcd,
.update_status = set_lcd_status,
.max_brightness = HCI_LCD_BRIGHTNESS_LEVELS - 1,
};
static void __exit toshiba_acpi_exit(void)
{
if (toshiba_backlight_device)
backlight_device_unregister(toshiba_backlight_device);
remove_device();
if (toshiba_proc_dir)
remove_proc_entry(PROC_TOSHIBA, acpi_root_dir);
return;
}
static int __init toshiba_acpi_init(void) static int __init toshiba_acpi_init(void)
{ {
acpi_status status = AE_OK; acpi_status status = AE_OK;
...@@ -546,17 +590,15 @@ static int __init toshiba_acpi_init(void) ...@@ -546,17 +590,15 @@ static int __init toshiba_acpi_init(void)
remove_proc_entry(PROC_TOSHIBA, acpi_root_dir); remove_proc_entry(PROC_TOSHIBA, acpi_root_dir);
} }
return (ACPI_SUCCESS(status)) ? 0 : -ENODEV; toshiba_backlight_device = backlight_device_register("toshiba", NULL,
} &toshiba_backlight_data);
if (IS_ERR(toshiba_backlight_device)) {
static void __exit toshiba_acpi_exit(void) printk(KERN_ERR "Could not register toshiba backlight device\n");
{ toshiba_backlight_device = NULL;
remove_device(); toshiba_acpi_exit();
}
if (toshiba_proc_dir)
remove_proc_entry(PROC_TOSHIBA, acpi_root_dir);
return; return (ACPI_SUCCESS(status)) ? 0 : -ENODEV;
} }
module_init(toshiba_acpi_init); module_init(toshiba_acpi_init);
......
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