Skip to content

Commit

Permalink
ACPI: asus_acpi: Add support for the generic backlight device
Browse files Browse the repository at this point in the history
Add support for the generic backlight interface below /sys/class/backlight.
Keep the procfs brightness handling for backward compatibility.

[[email protected]: backlight users need to select BACKLIGHT_CLASS_DEVICE]

Signed-off-by: Holger Macht <[email protected]>
Signed-off-by: Andy Whitcroft <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Len Brown <[email protected]>
  • Loading branch information
Holger Macht authored and lenb committed Oct 21, 2006
1 parent 8acb025 commit 2039a6e
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 16 deletions.
1 change: 1 addition & 0 deletions drivers/acpi/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -172,6 +172,7 @@ config ACPI_NUMA
config ACPI_ASUS
tristate "ASUS/Medion Laptop Extras"
depends on X86
select BACKLIGHT_CLASS_DEVICE
---help---
This driver provides support for extra features of ACPI-compatible
ASUS laptops. As some of Medion laptops are made by ASUS, it may also
Expand Down
62 changes: 46 additions & 16 deletions drivers/acpi/asus_acpi.c
Original file line number Diff line number Diff line change
Expand Up @@ -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>
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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;

Expand All @@ -801,21 +804,23 @@ 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) {
if (!write_acpi_int(hotk->handle, hotk->methods->brightness_set,
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 :
Expand All @@ -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
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit 2039a6e

Please sign in to comment.