ACPI: asus_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.

[apw@shadowen.org: backlight users need to select BACKLIGHT_CLASS_DEVICE]

Signed-off-by: Holger Macht <hmacht@suse.de>
Signed-off-by: Andy Whitcroft <apw@shadowen.org>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Len Brown <len.brown@intel.com>
This commit is contained in:
Holger Macht 2006-10-20 14:30:29 -07:00 committed by Len Brown
parent 8acb025085
commit 2039a6eb72
2 changed files with 47 additions and 16 deletions

View File

@ -172,6 +172,7 @@ config ACPI_NUMA
config ACPI_ASUS config ACPI_ASUS
tristate "ASUS/Medion Laptop Extras" tristate "ASUS/Medion Laptop Extras"
depends on X86 depends on X86
select BACKLIGHT_CLASS_DEVICE
---help--- ---help---
This driver provides support for extra features of ACPI-compatible This driver provides support for extra features of ACPI-compatible
ASUS laptops. As some of Medion laptops are made by ASUS, it may also ASUS laptops. As some of Medion laptops are made by ASUS, it may also

View File

@ -35,6 +35,7 @@
#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 <acpi/acpi_drivers.h> #include <acpi/acpi_drivers.h>
#include <acpi/acpi_bus.h> #include <acpi/acpi_bus.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
@ -402,6 +403,8 @@ static struct model_data model_conf[END_MODEL] = {
/* procdir we use */ /* procdir we use */
static struct proc_dir_entry *asus_proc_dir; static struct proc_dir_entry *asus_proc_dir;
static struct backlight_device *asus_backlight_device;
/* /*
* This header is made available to allow proper configuration given model, * This header is made available to allow proper configuration given model,
* revision number , ... this info cannot go in struct asus_hotk because it is * revision number , ... this info cannot go in struct asus_hotk because it is
@ -779,7 +782,7 @@ proc_write_lcd(struct file *file, const char __user * buffer,
return rv; return rv;
} }
static int read_brightness(void) static int read_brightness(struct backlight_device *bd)
{ {
int value; int value;
@ -801,9 +804,10 @@ static int read_brightness(void)
/* /*
* Change the brightness level * Change the brightness level
*/ */
static void set_brightness(int value) static int set_brightness(int value)
{ {
acpi_status status = 0; acpi_status status = 0;
int ret = 0;
/* SPLV laptop */ /* SPLV laptop */
if (hotk->methods->brightness_set) { if (hotk->methods->brightness_set) {
@ -811,11 +815,12 @@ static void set_brightness(int value)
value, NULL)) value, NULL))
printk(KERN_WARNING printk(KERN_WARNING
"Asus ACPI: Error changing brightness\n"); "Asus ACPI: Error changing brightness\n");
return; ret = -EIO;
goto out;
} }
/* No SPLV method if we are here, act as appropriate */ /* No SPLV method if we are here, act as appropriate */
value -= read_brightness(); value -= read_brightness(NULL);
while (value != 0) { while (value != 0) {
status = acpi_evaluate_object(NULL, (value > 0) ? status = acpi_evaluate_object(NULL, (value > 0) ?
hotk->methods->brightness_up : hotk->methods->brightness_up :
@ -825,15 +830,22 @@ static void set_brightness(int value)
if (ACPI_FAILURE(status)) if (ACPI_FAILURE(status))
printk(KERN_WARNING printk(KERN_WARNING
"Asus ACPI: Error changing brightness\n"); "Asus ACPI: Error changing brightness\n");
ret = -EIO;
} }
return; out:
return ret;
}
static int set_brightness_status(struct backlight_device *bd)
{
return set_brightness(bd->props->brightness);
} }
static int static int
proc_read_brn(char *page, char **start, off_t off, int count, int *eof, proc_read_brn(char *page, char **start, off_t off, int count, int *eof,
void *data) void *data)
{ {
return sprintf(page, "%d\n", read_brightness()); return sprintf(page, "%d\n", read_brightness(NULL));
} }
static int static int
@ -1333,6 +1345,26 @@ static int asus_hotk_remove(struct acpi_device *device, int type)
return 0; return 0;
} }
static struct backlight_properties asus_backlight_data = {
.owner = THIS_MODULE,
.get_brightness = read_brightness,
.update_status = set_brightness_status,
.max_brightness = 15,
};
static void __exit asus_acpi_exit(void)
{
if (asus_backlight_device)
backlight_device_unregister(asus_backlight_device);
acpi_bus_unregister_driver(&asus_hotk_driver);
remove_proc_entry(PROC_ASUS, acpi_root_dir);
kfree(asus_info);
return;
}
static int __init asus_acpi_init(void) static int __init asus_acpi_init(void)
{ {
int result; int result;
@ -1370,18 +1402,16 @@ static int __init asus_acpi_init(void)
return result; return result;
} }
asus_backlight_device = backlight_device_register("asus", NULL,
&asus_backlight_data);
if (IS_ERR(asus_backlight_device)) {
printk(KERN_ERR "Could not register asus backlight device\n");
asus_backlight_device = NULL;
asus_acpi_exit();
}
return 0; return 0;
} }
static void __exit asus_acpi_exit(void)
{
acpi_bus_unregister_driver(&asus_hotk_driver);
remove_proc_entry(PROC_ASUS, acpi_root_dir);
kfree(asus_info);
return;
}
module_init(asus_acpi_init); module_init(asus_acpi_init);
module_exit(asus_acpi_exit); module_exit(asus_acpi_exit);