Commit 2f3d000a authored by Yu Luming's avatar Yu Luming Committed by Len Brown

ACPI: Adds backlight sysfs support for acpi video driver.

Adds backlight sysfs support for acpi video driver.
signed-off-by: default avatarLuming Yu <Luming.yu@intel.com>
Signed-off-by: default avatarLen Brown <len.brown@intel.com>
parent a8274d57
...@@ -106,7 +106,7 @@ config ACPI_BUTTON ...@@ -106,7 +106,7 @@ config ACPI_BUTTON
config ACPI_VIDEO config ACPI_VIDEO
tristate "Video" tristate "Video"
depends on X86 depends on X86 && BACKLIGHT_CLASS_DEVICE
help help
This driver implement the ACPI Extensions For Display Adapters This driver implement the ACPI Extensions For Display Adapters
for integrated graphics devices on motherboard, as specified in for integrated graphics devices on motherboard, as specified in
......
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
#include <linux/proc_fs.h> #include <linux/proc_fs.h>
#include <linux/seq_file.h> #include <linux/seq_file.h>
#include <linux/backlight.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
#include <acpi/acpi_bus.h> #include <acpi/acpi_bus.h>
...@@ -56,6 +57,7 @@ ...@@ -56,6 +57,7 @@
#define ACPI_VIDEO_HEAD_INVALID (~0u - 1) #define ACPI_VIDEO_HEAD_INVALID (~0u - 1)
#define ACPI_VIDEO_HEAD_END (~0u) #define ACPI_VIDEO_HEAD_END (~0u)
#define MAX_NAME_LEN 20
#define _COMPONENT ACPI_VIDEO_COMPONENT #define _COMPONENT ACPI_VIDEO_COMPONENT
ACPI_MODULE_NAME("acpi_video") ACPI_MODULE_NAME("acpi_video")
...@@ -142,11 +144,11 @@ struct acpi_video_device_cap { ...@@ -142,11 +144,11 @@ struct acpi_video_device_cap {
u8 _ADR:1; /*Return the unique ID */ u8 _ADR:1; /*Return the unique ID */
u8 _BCL:1; /*Query list of brightness control levels supported */ u8 _BCL:1; /*Query list of brightness control levels supported */
u8 _BCM:1; /*Set the brightness level */ u8 _BCM:1; /*Set the brightness level */
u8 _BQC:1; /* Get current brightness level */
u8 _DDC:1; /*Return the EDID for this device */ u8 _DDC:1; /*Return the EDID for this device */
u8 _DCS:1; /*Return status of output device */ u8 _DCS:1; /*Return status of output device */
u8 _DGS:1; /*Query graphics state */ u8 _DGS:1; /*Query graphics state */
u8 _DSS:1; /*Device state set */ u8 _DSS:1; /*Device state set */
u8 _reserved:1;
}; };
struct acpi_video_device_brightness { struct acpi_video_device_brightness {
...@@ -163,6 +165,8 @@ struct acpi_video_device { ...@@ -163,6 +165,8 @@ struct acpi_video_device {
struct acpi_video_bus *video; struct acpi_video_bus *video;
struct acpi_device *dev; struct acpi_device *dev;
struct acpi_video_device_brightness *brightness; struct acpi_video_device_brightness *brightness;
struct backlight_device *backlight;
struct backlight_properties *data;
}; };
/* bus */ /* bus */
...@@ -257,11 +261,35 @@ static void acpi_video_device_bind(struct acpi_video_bus *video, ...@@ -257,11 +261,35 @@ static void acpi_video_device_bind(struct acpi_video_bus *video,
struct acpi_video_device *device); struct acpi_video_device *device);
static int acpi_video_device_enumerate(struct acpi_video_bus *video); static int acpi_video_device_enumerate(struct acpi_video_bus *video);
static int acpi_video_switch_output(struct acpi_video_bus *video, int event); static int acpi_video_switch_output(struct acpi_video_bus *video, int event);
static int acpi_video_device_lcd_set_level(struct acpi_video_device *device,
int level);
static int acpi_video_device_lcd_get_level_current(
struct acpi_video_device *device,
unsigned long *level);
static int acpi_video_get_next_level(struct acpi_video_device *device, static int acpi_video_get_next_level(struct acpi_video_device *device,
u32 level_current, u32 event); u32 level_current, u32 event);
static void acpi_video_switch_brightness(struct acpi_video_device *device, static void acpi_video_switch_brightness(struct acpi_video_device *device,
int event); int event);
/*backlight device sysfs support*/
static int acpi_video_get_brightness(struct backlight_device *bd)
{
unsigned long cur_level;
struct acpi_video_device *vd =
(struct acpi_video_device *)class_get_devdata(&bd->class_dev);
acpi_video_device_lcd_get_level_current(vd, &cur_level);
return (int) cur_level;
}
static int acpi_video_set_brightness(struct backlight_device *bd)
{
int request_level = bd->props->brightness;
struct acpi_video_device *vd =
(struct acpi_video_device *)class_get_devdata(&bd->class_dev);
acpi_video_device_lcd_set_level(vd, request_level);
return 0;
}
/* -------------------------------------------------------------------------- /* --------------------------------------------------------------------------
Video Management Video Management
-------------------------------------------------------------------------- */ -------------------------------------------------------------------------- */
...@@ -499,6 +527,7 @@ static void acpi_video_device_find_cap(struct acpi_video_device *device) ...@@ -499,6 +527,7 @@ static void acpi_video_device_find_cap(struct acpi_video_device *device)
acpi_integer status; acpi_integer status;
acpi_handle h_dummy1; acpi_handle h_dummy1;
int i; int i;
u32 max_level = 0;
union acpi_object *obj = NULL; union acpi_object *obj = NULL;
struct acpi_video_device_brightness *br = NULL; struct acpi_video_device_brightness *br = NULL;
...@@ -514,6 +543,8 @@ static void acpi_video_device_find_cap(struct acpi_video_device *device) ...@@ -514,6 +543,8 @@ static void acpi_video_device_find_cap(struct acpi_video_device *device)
if (ACPI_SUCCESS(acpi_get_handle(device->dev->handle, "_BCM", &h_dummy1))) { if (ACPI_SUCCESS(acpi_get_handle(device->dev->handle, "_BCM", &h_dummy1))) {
device->cap._BCM = 1; device->cap._BCM = 1;
} }
if (ACPI_SUCCESS(acpi_get_handle(device->dev->handle,"_BQC",&h_dummy1)))
device->cap._BQC = 1;
if (ACPI_SUCCESS(acpi_get_handle(device->dev->handle, "_DDC", &h_dummy1))) { if (ACPI_SUCCESS(acpi_get_handle(device->dev->handle, "_DDC", &h_dummy1))) {
device->cap._DDC = 1; device->cap._DDC = 1;
} }
...@@ -551,6 +582,8 @@ static void acpi_video_device_find_cap(struct acpi_video_device *device) ...@@ -551,6 +582,8 @@ static void acpi_video_device_find_cap(struct acpi_video_device *device)
continue; continue;
} }
br->levels[count] = (u32) o->integer.value; br->levels[count] = (u32) o->integer.value;
if (br->levels[count] > max_level)
max_level = br->levels[count];
count++; count++;
} }
out: out:
...@@ -569,6 +602,37 @@ static void acpi_video_device_find_cap(struct acpi_video_device *device) ...@@ -569,6 +602,37 @@ static void acpi_video_device_find_cap(struct acpi_video_device *device)
kfree(obj); kfree(obj);
if (device->cap._BCL && device->cap._BCM && device->cap._BQC){
unsigned long tmp;
static int count = 0;
char *name;
struct backlight_properties *acpi_video_data;
name = kzalloc(MAX_NAME_LEN, GFP_KERNEL);
if (!name)
return;
acpi_video_data = kzalloc(
sizeof(struct backlight_properties),
GFP_KERNEL);
if (!acpi_video_data){
kfree(name);
return;
}
acpi_video_data->owner = THIS_MODULE;
acpi_video_data->get_brightness =
acpi_video_get_brightness;
acpi_video_data->update_status =
acpi_video_set_brightness;
sprintf(name, "acpi_video%d", count++);
device->data = acpi_video_data;
acpi_video_data->max_brightness = max_level;
acpi_video_device_lcd_get_level_current(device, &tmp);
acpi_video_data->brightness = (int)tmp;
device->backlight = backlight_device_register(name,
NULL, device, acpi_video_data);
kfree(name);
}
return; return;
} }
...@@ -1595,7 +1659,10 @@ static int acpi_video_bus_put_one_device(struct acpi_video_device *device) ...@@ -1595,7 +1659,10 @@ static int acpi_video_bus_put_one_device(struct acpi_video_device *device)
status = acpi_remove_notify_handler(device->dev->handle, status = acpi_remove_notify_handler(device->dev->handle,
ACPI_DEVICE_NOTIFY, ACPI_DEVICE_NOTIFY,
acpi_video_device_notify); acpi_video_device_notify);
if (device->backlight){
backlight_device_unregister(device->backlight);
kfree(device->data);
}
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment