提交 2039a6eb 编写于 作者: H Holger Macht 提交者: Len Brown

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: NHolger Macht <hmacht@suse.de>
Signed-off-by: NAndy Whitcroft <apw@shadowen.org>
Signed-off-by: NAndrew Morton <akpm@osdl.org>
Signed-off-by: NLen Brown <len.brown@intel.com>
上级 8acb0250
...@@ -172,6 +172,7 @@ config ACPI_NUMA ...@@ -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
......
...@@ -35,6 +35,7 @@ ...@@ -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] = { ...@@ -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, ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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,17 +1402,15 @@ static int __init asus_acpi_init(void) ...@@ -1370,17 +1402,15 @@ static int __init asus_acpi_init(void)
return result; return result;
} }
return 0; asus_backlight_device = backlight_device_register("asus", NULL,
} &asus_backlight_data);
if (IS_ERR(asus_backlight_device)) {
static void __exit asus_acpi_exit(void) printk(KERN_ERR "Could not register asus backlight device\n");
{ asus_backlight_device = NULL;
acpi_bus_unregister_driver(&asus_hotk_driver); asus_acpi_exit();
remove_proc_entry(PROC_ASUS, acpi_root_dir); }
kfree(asus_info);
return; return 0;
} }
module_init(asus_acpi_init); module_init(asus_acpi_init);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册