Commit 2039a6eb authored by Holger Macht's avatar Holger Macht Committed by Len Brown
Browse files

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: default avatarHolger Macht <hmacht@suse.de>
Signed-off-by: default avatarAndy Whitcroft <apw@shadowen.org>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLen Brown <len.brown@intel.com>
parent 8acb0250
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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
+46 −16
Original line number Diff line number Diff line
@@ -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;
	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();
	}

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;
	return 0;
}

module_init(asus_acpi_init);