Pull video into test branch
authorLen Brown <len.brown@intel.com>
Sat, 3 Feb 2007 03:42:02 +0000 (22:42 -0500)
committerLen Brown <len.brown@intel.com>
Sat, 3 Feb 2007 03:42:02 +0000 (22:42 -0500)
1  2 
drivers/acpi/Kconfig
drivers/acpi/video.c

diff --combined drivers/acpi/Kconfig
index f4f000abc4e9f497e08bb80c64af2a627e3bdb84,e3f77e2ce25fca95f34b16b1f234e0b495870694..50e295b08c94dfb23f266e83478455d4a3449cc0
@@@ -11,7 -11,7 +11,7 @@@ config ACP
        bool "ACPI Support"
        depends on IA64 || X86
        depends on PCI
 -      select PM
 +      depends on PM
        default y
        ---help---
          Advanced Configuration and Power Interface (ACPI) support for 
@@@ -97,7 -97,6 +97,7 @@@ config ACPI_BATTER
  
  config ACPI_BUTTON
        tristate "Button"
 +      depends on INPUT
        default y
        help
          This driver handles events on the power, sleep and lid buttons.
  
  config ACPI_VIDEO
        tristate "Video"
-       depends on X86
+       depends on X86 && BACKLIGHT_CLASS_DEVICE
        help
          This driver implement the ACPI Extensions For Display Adapters
          for integrated graphics devices on motherboard, as specified in
@@@ -225,6 -224,17 +225,6 @@@ config ACPI_IBM_DOC
  
          If you are not sure, say N here.
  
 -config ACPI_IBM_BAY
 -      bool "Legacy Removable Bay Support"
 -      depends on ACPI_IBM
 -      depends on ACPI_BAY=n
 -      default n
 -      ---help---
 -        Allows the ibm_acpi driver to handle removable bays.
 -        This support is obsoleted by CONFIG_ACPI_BAY.
 -
 -        If you are not sure, say N here.
 -
  config ACPI_TOSHIBA
        tristate "Toshiba Laptop Extras"
        depends on X86
diff --combined drivers/acpi/video.c
index 3d54680d0333c34464b1df9e5fe2631b63050079,4b09a021b434046232563d5e0573ad7bbbd5d7eb..cf60ca5515d2ac969a6413e005909735d27304f9
@@@ -32,6 -32,7 +32,7 @@@
  #include <linux/proc_fs.h>
  #include <linux/seq_file.h>
  
+ #include <linux/backlight.h>
  #include <asm/uaccess.h>
  
  #include <acpi/acpi_bus.h>
@@@ -56,6 -57,7 +57,7 @@@
  
  #define ACPI_VIDEO_HEAD_INVALID               (~0u - 1)
  #define ACPI_VIDEO_HEAD_END           (~0u)
+ #define MAX_NAME_LEN  20
  
  #define _COMPONENT            ACPI_VIDEO_COMPONENT
  ACPI_MODULE_NAME("acpi_video")
@@@ -142,11 -144,11 +144,11 @@@ struct acpi_video_device_cap 
        u8 _ADR:1;              /*Return the unique ID */
        u8 _BCL:1;              /*Query list of brightness control levels supported */
        u8 _BCM:1;              /*Set the brightness level */
+       u8 _BQC:1;              /* Get current brightness level */
        u8 _DDC:1;              /*Return the EDID for this device */
        u8 _DCS:1;              /*Return status of output device */
        u8 _DGS:1;              /*Query graphics state */
        u8 _DSS:1;              /*Device state set */
-       u8 _reserved:1;
  };
  
  struct acpi_video_device_brightness {
@@@ -163,6 -165,8 +165,8 @@@ struct acpi_video_device 
        struct acpi_video_bus *video;
        struct acpi_device *dev;
        struct acpi_video_device_brightness *brightness;
+       struct backlight_device *backlight;
+       struct backlight_properties *data;
  };
  
  /* bus */
@@@ -257,11 -261,35 +261,35 @@@ static void acpi_video_device_bind(stru
                                   struct acpi_video_device *device);
  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_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,
                                     u32 level_current, u32 event);
  static void acpi_video_switch_brightness(struct acpi_video_device *device,
                                         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
     -------------------------------------------------------------------------- */
@@@ -387,7 -415,7 +415,7 @@@ acpi_video_device_EDID(struct acpi_vide
        if (ACPI_FAILURE(status))
                return -ENODEV;
  
 -      obj = (union acpi_object *)buffer.pointer;
 +      obj = buffer.pointer;
  
        if (obj && obj->type == ACPI_TYPE_BUFFER)
                *edid = obj;
@@@ -499,6 -527,7 +527,7 @@@ static void acpi_video_device_find_cap(
        acpi_integer status;
        acpi_handle h_dummy1;
        int i;
+       u32 max_level = 0;
        union acpi_object *obj = NULL;
        struct acpi_video_device_brightness *br = NULL;
  
        if (ACPI_SUCCESS(acpi_get_handle(device->dev->handle, "_BCM", &h_dummy1))) {
                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))) {
                device->cap._DDC = 1;
        }
                int count = 0;
                union acpi_object *o;
  
 -              br = kmalloc(sizeof(*br), GFP_KERNEL);
 +              br = kzalloc(sizeof(*br), GFP_KERNEL);
                if (!br) {
                        printk(KERN_ERR "can't allocate memory\n");
                } else {
 -                      memset(br, 0, sizeof(*br));
                        br->levels = kmalloc(obj->package.count *
                                             sizeof *(br->levels), GFP_KERNEL);
                        if (!br->levels)
                                        continue;
                                }
                                br->levels[count] = (u32) o->integer.value;
+                               if (br->levels[count] > max_level)
+                                       max_level = br->levels[count];
                                count++;
                        }
                      out:
  
        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;
  }
  
@@@ -654,7 -719,8 +718,7 @@@ static struct proc_dir_entry *acpi_vide
  
  static int acpi_video_device_info_seq_show(struct seq_file *seq, void *offset)
  {
 -      struct acpi_video_device *dev =
 -          (struct acpi_video_device *)seq->private;
 +      struct acpi_video_device *dev = seq->private;
  
  
        if (!dev)
@@@ -687,7 -753,8 +751,7 @@@ acpi_video_device_info_open_fs(struct i
  static int acpi_video_device_state_seq_show(struct seq_file *seq, void *offset)
  {
        int status;
 -      struct acpi_video_device *dev =
 -          (struct acpi_video_device *)seq->private;
 +      struct acpi_video_device *dev = seq->private;
        unsigned long state;
  
  
@@@ -725,8 -792,8 +789,8 @@@ acpi_video_device_write_state(struct fi
                              size_t count, loff_t * data)
  {
        int status;
 -      struct seq_file *m = (struct seq_file *)file->private_data;
 -      struct acpi_video_device *dev = (struct acpi_video_device *)m->private;
 +      struct seq_file *m = file->private_data;
 +      struct acpi_video_device *dev = m->private;
        char str[12] = { 0 };
        u32 state = 0;
  
  static int
  acpi_video_device_brightness_seq_show(struct seq_file *seq, void *offset)
  {
 -      struct acpi_video_device *dev =
 -          (struct acpi_video_device *)seq->private;
 +      struct acpi_video_device *dev = seq->private;
        int i;
  
  
@@@ -781,8 -849,8 +845,8 @@@ acpi_video_device_write_brightness(stru
                                   const char __user * buffer,
                                   size_t count, loff_t * data)
  {
 -      struct seq_file *m = (struct seq_file *)file->private_data;
 -      struct acpi_video_device *dev = (struct acpi_video_device *)m->private;
 +      struct seq_file *m = file->private_data;
 +      struct acpi_video_device *dev = m->private;
        char str[4] = { 0 };
        unsigned int level = 0;
        int i;
  
  static int acpi_video_device_EDID_seq_show(struct seq_file *seq, void *offset)
  {
 -      struct acpi_video_device *dev =
 -          (struct acpi_video_device *)seq->private;
 +      struct acpi_video_device *dev = seq->private;
        int status;
        int i;
        union acpi_object *edid = NULL;
@@@ -862,7 -931,7 +926,7 @@@ static int acpi_video_device_add_fs(str
        if (!device)
                return -ENODEV;
  
 -      vid_dev = (struct acpi_video_device *)acpi_driver_data(device);
 +      vid_dev = acpi_driver_data(device);
        if (!vid_dev)
                return -ENODEV;
  
@@@ -927,7 -996,7 +991,7 @@@ static int acpi_video_device_remove_fs(
  {
        struct acpi_video_device *vid_dev;
  
 -      vid_dev = (struct acpi_video_device *)acpi_driver_data(device);
 +      vid_dev = acpi_driver_data(device);
        if (!vid_dev || !vid_dev->video || !vid_dev->video->dir)
                return -ENODEV;
  
  /* video bus */
  static int acpi_video_bus_info_seq_show(struct seq_file *seq, void *offset)
  {
 -      struct acpi_video_bus *video = (struct acpi_video_bus *)seq->private;
 +      struct acpi_video_bus *video = seq->private;
  
  
        if (!video)
@@@ -971,7 -1040,7 +1035,7 @@@ static int acpi_video_bus_info_open_fs(
  
  static int acpi_video_bus_ROM_seq_show(struct seq_file *seq, void *offset)
  {
 -      struct acpi_video_bus *video = (struct acpi_video_bus *)seq->private;
 +      struct acpi_video_bus *video = seq->private;
  
  
        if (!video)
@@@ -991,7 -1060,7 +1055,7 @@@ static int acpi_video_bus_ROM_open_fs(s
  
  static int acpi_video_bus_POST_info_seq_show(struct seq_file *seq, void *offset)
  {
 -      struct acpi_video_bus *video = (struct acpi_video_bus *)seq->private;
 +      struct acpi_video_bus *video = seq->private;
        unsigned long options;
        int status;
  
@@@ -1029,7 -1098,7 +1093,7 @@@ acpi_video_bus_POST_info_open_fs(struc
  
  static int acpi_video_bus_POST_seq_show(struct seq_file *seq, void *offset)
  {
 -      struct acpi_video_bus *video = (struct acpi_video_bus *)seq->private;
 +      struct acpi_video_bus *video = seq->private;
        int status;
        unsigned long id;
  
  
  static int acpi_video_bus_DOS_seq_show(struct seq_file *seq, void *offset)
  {
 -      struct acpi_video_bus *video = (struct acpi_video_bus *)seq->private;
 +      struct acpi_video_bus *video = seq->private;
  
  
        seq_printf(seq, "DOS setting: <%d>\n", video->dos_setting);
@@@ -1075,8 -1144,8 +1139,8 @@@ acpi_video_bus_write_POST(struct file *
                          size_t count, loff_t * data)
  {
        int status;
 -      struct seq_file *m = (struct seq_file *)file->private_data;
 -      struct acpi_video_bus *video = (struct acpi_video_bus *)m->private;
 +      struct seq_file *m = file->private_data;
 +      struct acpi_video_bus *video = m->private;
        char str[12] = { 0 };
        unsigned long opt, options;
  
@@@ -1115,8 -1184,8 +1179,8 @@@ acpi_video_bus_write_DOS(struct file *f
                         size_t count, loff_t * data)
  {
        int status;
 -      struct seq_file *m = (struct seq_file *)file->private_data;
 -      struct acpi_video_bus *video = (struct acpi_video_bus *)m->private;
 +      struct seq_file *m = file->private_data;
 +      struct acpi_video_bus *video = m->private;
        char str[12] = { 0 };
        unsigned long opt;
  
@@@ -1146,7 -1215,7 +1210,7 @@@ static int acpi_video_bus_add_fs(struc
        struct acpi_video_bus *video;
  
  
 -      video = (struct acpi_video_bus *)acpi_driver_data(device);
 +      video = acpi_driver_data(device);
  
        if (!acpi_device_dir(device)) {
                acpi_device_dir(device) = proc_mkdir(acpi_device_bid(device),
@@@ -1222,7 -1291,7 +1286,7 @@@ static int acpi_video_bus_remove_fs(str
        struct acpi_video_bus *video;
  
  
 -      video = (struct acpi_video_bus *)acpi_driver_data(device);
 +      video = acpi_driver_data(device);
  
        if (acpi_device_dir(device)) {
                remove_proc_entry("info", acpi_device_dir(device));
@@@ -1259,10 -1328,12 +1323,10 @@@ acpi_video_bus_get_one_device(struct ac
            acpi_evaluate_integer(device->handle, "_ADR", NULL, &device_id);
        if (ACPI_SUCCESS(status)) {
  
 -              data = kmalloc(sizeof(struct acpi_video_device), GFP_KERNEL);
 +              data = kzalloc(sizeof(struct acpi_video_device), GFP_KERNEL);
                if (!data)
                        return -ENOMEM;
  
 -              memset(data, 0, sizeof(struct acpi_video_device));
 -
                strcpy(acpi_device_name(device), ACPI_VIDEO_DEVICE_NAME);
                strcpy(acpi_device_class(device), ACPI_VIDEO_CLASS);
                acpi_driver_data(device) = data;
@@@ -1397,7 -1468,7 +1461,7 @@@ static int acpi_video_device_enumerate(
                return status;
        }
  
 -      dod = (union acpi_object *)buffer.pointer;
 +      dod = buffer.pointer;
        if (!dod || (dod->type != ACPI_TYPE_PACKAGE)) {
                ACPI_EXCEPTION((AE_INFO, status, "Invalid _DOD data"));
                status = -EFAULT;
  
        count = 0;
        for (i = 0; i < dod->package.count; i++) {
 -              obj = (union acpi_object *)&dod->package.elements[i];
 +              obj = &dod->package.elements[i];
  
                if (obj->type != ACPI_TYPE_INTEGER) {
                        printk(KERN_ERR PREFIX "Invalid _DOD data\n");
@@@ -1588,7 -1659,10 +1652,10 @@@ static int acpi_video_bus_put_one_devic
        status = acpi_remove_notify_handler(device->dev->handle,
                                            ACPI_DEVICE_NOTIFY,
                                            acpi_video_device_notify);
+       if (device->backlight){
+               backlight_device_unregister(device->backlight);
+               kfree(device->data);
+       }
        return 0;
  }
  
@@@ -1632,7 -1706,7 +1699,7 @@@ static int acpi_video_bus_stop_devices(
  
  static void acpi_video_bus_notify(acpi_handle handle, u32 event, void *data)
  {
 -      struct acpi_video_bus *video = (struct acpi_video_bus *)data;
 +      struct acpi_video_bus *video = data;
        struct acpi_device *device = NULL;
  
        printk("video bus notify\n");
  
  static void acpi_video_device_notify(acpi_handle handle, u32 event, void *data)
  {
 -      struct acpi_video_device *video_device =
 -          (struct acpi_video_device *)data;
 +      struct acpi_video_device *video_device = data;
        struct acpi_device *device = NULL;
  
 -
 -      printk("video device notify\n");
        if (!video_device)
                return;
  
@@@ -1713,9 -1790,10 +1780,9 @@@ static int acpi_video_bus_add(struct ac
        if (!device)
                return -EINVAL;
  
 -      video = kmalloc(sizeof(struct acpi_video_bus), GFP_KERNEL);
 +      video = kzalloc(sizeof(struct acpi_video_bus), GFP_KERNEL);
        if (!video)
                return -ENOMEM;
 -      memset(video, 0, sizeof(struct acpi_video_bus));
  
        video->device = device;
        strcpy(acpi_device_name(device), ACPI_VIDEO_BUS_NAME);
@@@ -1773,7 -1851,7 +1840,7 @@@ static int acpi_video_bus_remove(struc
        if (!device || !acpi_driver_data(device))
                return -EINVAL;
  
 -      video = (struct acpi_video_bus *)acpi_driver_data(device);
 +      video = acpi_driver_data(device);
  
        acpi_video_bus_stop_devices(video);