|
@@ -35,6 +35,7 @@
|
|
|
#include <linux/init.h>
|
|
|
#include <linux/types.h>
|
|
|
#include <linux/proc_fs.h>
|
|
|
+#include <linux/backlight.h>
|
|
|
#include <acpi/acpi_drivers.h>
|
|
|
#include <acpi/acpi_bus.h>
|
|
|
#include <asm/uaccess.h>
|
|
@@ -402,6 +403,8 @@ static struct model_data model_conf[END_MODEL] = {
|
|
|
/* procdir we use */
|
|
|
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,
|
|
|
* 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;
|
|
|
}
|
|
|
|
|
|
-static int read_brightness(void)
|
|
|
+static int read_brightness(struct backlight_device *bd)
|
|
|
{
|
|
|
int value;
|
|
|
|
|
@@ -801,9 +804,10 @@ static int read_brightness(void)
|
|
|
/*
|
|
|
* Change the brightness level
|
|
|
*/
|
|
|
-static void set_brightness(int value)
|
|
|
+static int set_brightness(int value)
|
|
|
{
|
|
|
acpi_status status = 0;
|
|
|
+ int ret = 0;
|
|
|
|
|
|
/* SPLV laptop */
|
|
|
if (hotk->methods->brightness_set) {
|
|
@@ -811,11 +815,12 @@ static void set_brightness(int value)
|
|
|
value, NULL))
|
|
|
printk(KERN_WARNING
|
|
|
"Asus ACPI: Error changing brightness\n");
|
|
|
- return;
|
|
|
+ ret = -EIO;
|
|
|
+ goto out;
|
|
|
}
|
|
|
|
|
|
/* No SPLV method if we are here, act as appropriate */
|
|
|
- value -= read_brightness();
|
|
|
+ value -= read_brightness(NULL);
|
|
|
while (value != 0) {
|
|
|
status = acpi_evaluate_object(NULL, (value > 0) ?
|
|
|
hotk->methods->brightness_up :
|
|
@@ -825,15 +830,22 @@ static void set_brightness(int value)
|
|
|
if (ACPI_FAILURE(status))
|
|
|
printk(KERN_WARNING
|
|
|
"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
|
|
|
proc_read_brn(char *page, char **start, off_t off, int count, int *eof,
|
|
|
void *data)
|
|
|
{
|
|
|
- return sprintf(page, "%d\n", read_brightness());
|
|
|
+ return sprintf(page, "%d\n", read_brightness(NULL));
|
|
|
}
|
|
|
|
|
|
static int
|
|
@@ -1333,6 +1345,26 @@ static int asus_hotk_remove(struct acpi_device *device, int type)
|
|
|
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)
|
|
|
{
|
|
|
int result;
|
|
@@ -1370,17 +1402,15 @@ static int __init asus_acpi_init(void)
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
- 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);
|
|
|
+ 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;
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
module_init(asus_acpi_init);
|