forked from luck/tmp_suning_uos_patched
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:
parent
8acb025085
commit
2039a6eb72
@ -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 @@
|
|||||||
#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);
|
||||||
|
Loading…
Reference in New Issue
Block a user