|
@@ -1,5 +1,5 @@
|
|
|
/*
|
|
|
- * video.c - ACPI Video Driver ($Revision:$)
|
|
|
+ * video.c - ACPI Video Driver
|
|
|
*
|
|
|
* Copyright (C) 2004 Luming Yu <luming.yu@intel.com>
|
|
|
* Copyright (C) 2004 Bruno Ducrot <ducrot@poupinou.org>
|
|
@@ -88,7 +88,7 @@ module_param(allow_duplicates, bool, 0644);
|
|
|
static bool use_bios_initial_backlight = 1;
|
|
|
module_param(use_bios_initial_backlight, bool, 0644);
|
|
|
|
|
|
-static int register_count = 0;
|
|
|
+static int register_count;
|
|
|
static int acpi_video_bus_add(struct acpi_device *device);
|
|
|
static int acpi_video_bus_remove(struct acpi_device *device);
|
|
|
static void acpi_video_bus_notify(struct acpi_device *device, u32 event);
|
|
@@ -118,26 +118,26 @@ struct acpi_video_bus_flags {
|
|
|
};
|
|
|
|
|
|
struct acpi_video_bus_cap {
|
|
|
- u8 _DOS:1; /*Enable/Disable output switching */
|
|
|
- u8 _DOD:1; /*Enumerate all devices attached to display adapter */
|
|
|
- u8 _ROM:1; /*Get ROM Data */
|
|
|
- u8 _GPD:1; /*Get POST Device */
|
|
|
- u8 _SPD:1; /*Set POST Device */
|
|
|
- u8 _VPO:1; /*Video POST Options */
|
|
|
+ u8 _DOS:1; /* Enable/Disable output switching */
|
|
|
+ u8 _DOD:1; /* Enumerate all devices attached to display adapter */
|
|
|
+ u8 _ROM:1; /* Get ROM Data */
|
|
|
+ u8 _GPD:1; /* Get POST Device */
|
|
|
+ u8 _SPD:1; /* Set POST Device */
|
|
|
+ u8 _VPO:1; /* Video POST Options */
|
|
|
u8 reserved:2;
|
|
|
};
|
|
|
|
|
|
struct acpi_video_device_attrib {
|
|
|
u32 display_index:4; /* A zero-based instance of the Display */
|
|
|
- u32 display_port_attachment:4; /*This field differentiates the display type */
|
|
|
- u32 display_type:4; /*Describe the specific type in use */
|
|
|
- u32 vendor_specific:4; /*Chipset Vendor Specific */
|
|
|
- u32 bios_can_detect:1; /*BIOS can detect the device */
|
|
|
- u32 depend_on_vga:1; /*Non-VGA output device whose power is related to
|
|
|
+ u32 display_port_attachment:4; /* This field differentiates the display type */
|
|
|
+ u32 display_type:4; /* Describe the specific type in use */
|
|
|
+ u32 vendor_specific:4; /* Chipset Vendor Specific */
|
|
|
+ u32 bios_can_detect:1; /* BIOS can detect the device */
|
|
|
+ u32 depend_on_vga:1; /* Non-VGA output device whose power is related to
|
|
|
the VGA device. */
|
|
|
- u32 pipe_id:3; /*For VGA multiple-head devices. */
|
|
|
- u32 reserved:10; /*Must be 0 */
|
|
|
- u32 device_id_scheme:1; /*Device ID Scheme */
|
|
|
+ u32 pipe_id:3; /* For VGA multiple-head devices. */
|
|
|
+ u32 reserved:10; /* Must be 0 */
|
|
|
+ u32 device_id_scheme:1; /* Device ID Scheme */
|
|
|
};
|
|
|
|
|
|
struct acpi_video_enumerated_device {
|
|
@@ -174,19 +174,17 @@ struct acpi_video_device_flags {
|
|
|
};
|
|
|
|
|
|
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 _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 _BCQ:1; /* Some buggy BIOS uses _BCQ instead of _BQC */
|
|
|
- u8 _DDC:1; /*Return the EDID for this device */
|
|
|
+ u8 _DDC:1; /* Return the EDID for this device */
|
|
|
};
|
|
|
|
|
|
struct acpi_video_brightness_flags {
|
|
|
u8 _BCL_no_ac_battery_levels:1; /* no AC/Battery levels in _BCL */
|
|
|
- u8 _BCL_reversed:1; /* _BCL package is in a reversed order*/
|
|
|
- u8 _BCL_use_index:1; /* levels in _BCL are index values */
|
|
|
- u8 _BCM_use_index:1; /* input of _BCM is an index value */
|
|
|
+ u8 _BCL_reversed:1; /* _BCL package is in a reversed order */
|
|
|
u8 _BQC_use_index:1; /* _BQC returns an index value */
|
|
|
};
|
|
|
|
|
@@ -231,21 +229,22 @@ static int acpi_video_get_next_level(struct acpi_video_device *device,
|
|
|
static int acpi_video_switch_brightness(struct acpi_video_device *device,
|
|
|
int event);
|
|
|
|
|
|
-/*backlight device sysfs support*/
|
|
|
+/* backlight device sysfs support */
|
|
|
static int acpi_video_get_brightness(struct backlight_device *bd)
|
|
|
{
|
|
|
unsigned long long cur_level;
|
|
|
int i;
|
|
|
- struct acpi_video_device *vd =
|
|
|
- (struct acpi_video_device *)bl_get_data(bd);
|
|
|
+ struct acpi_video_device *vd = bl_get_data(bd);
|
|
|
|
|
|
if (acpi_video_device_lcd_get_level_current(vd, &cur_level, false))
|
|
|
return -EINVAL;
|
|
|
for (i = 2; i < vd->brightness->count; i++) {
|
|
|
if (vd->brightness->levels[i] == cur_level)
|
|
|
- /* The first two entries are special - see page 575
|
|
|
- of the ACPI spec 3.0 */
|
|
|
- return i-2;
|
|
|
+ /*
|
|
|
+ * The first two entries are special - see page 575
|
|
|
+ * of the ACPI spec 3.0
|
|
|
+ */
|
|
|
+ return i - 2;
|
|
|
}
|
|
|
return 0;
|
|
|
}
|
|
@@ -253,8 +252,7 @@ static int acpi_video_get_brightness(struct backlight_device *bd)
|
|
|
static int acpi_video_set_brightness(struct backlight_device *bd)
|
|
|
{
|
|
|
int request_level = bd->props.brightness + 2;
|
|
|
- struct acpi_video_device *vd =
|
|
|
- (struct acpi_video_device *)bl_get_data(bd);
|
|
|
+ struct acpi_video_device *vd = bl_get_data(bd);
|
|
|
|
|
|
return acpi_video_device_lcd_set_level(vd,
|
|
|
vd->brightness->levels[request_level]);
|
|
@@ -302,11 +300,11 @@ video_set_cur_state(struct thermal_cooling_device *cooling_dev, unsigned long st
|
|
|
struct acpi_video_device *video = acpi_driver_data(device);
|
|
|
int level;
|
|
|
|
|
|
- if ( state >= video->brightness->count - 2)
|
|
|
+ if (state >= video->brightness->count - 2)
|
|
|
return -EINVAL;
|
|
|
|
|
|
state = video->brightness->count - state;
|
|
|
- level = video->brightness->levels[state -1];
|
|
|
+ level = video->brightness->levels[state - 1];
|
|
|
return acpi_video_device_lcd_set_level(video, level);
|
|
|
}
|
|
|
|
|
@@ -316,9 +314,11 @@ static const struct thermal_cooling_device_ops video_cooling_ops = {
|
|
|
.set_cur_state = video_set_cur_state,
|
|
|
};
|
|
|
|
|
|
-/* --------------------------------------------------------------------------
|
|
|
- Video Management
|
|
|
- -------------------------------------------------------------------------- */
|
|
|
+/*
|
|
|
+ * --------------------------------------------------------------------------
|
|
|
+ * Video Management
|
|
|
+ * --------------------------------------------------------------------------
|
|
|
+ */
|
|
|
|
|
|
static int
|
|
|
acpi_video_device_lcd_query_levels(struct acpi_video_device *device,
|
|
@@ -345,7 +345,7 @@ acpi_video_device_lcd_query_levels(struct acpi_video_device *device,
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
- err:
|
|
|
+err:
|
|
|
kfree(buffer.pointer);
|
|
|
|
|
|
return status;
|
|
@@ -542,7 +542,7 @@ acpi_video_device_lcd_get_level_current(struct acpi_video_device *device,
|
|
|
if (device->brightness->levels[i] == *level) {
|
|
|
device->brightness->curr = *level;
|
|
|
return 0;
|
|
|
- }
|
|
|
+ }
|
|
|
/*
|
|
|
* BQC returned an invalid level.
|
|
|
* Stop using it.
|
|
@@ -552,7 +552,8 @@ acpi_video_device_lcd_get_level_current(struct acpi_video_device *device,
|
|
|
buf));
|
|
|
device->cap._BQC = device->cap._BCQ = 0;
|
|
|
} else {
|
|
|
- /* Fixme:
|
|
|
+ /*
|
|
|
+ * Fixme:
|
|
|
* should we return an error or ignore this failure?
|
|
|
* dev->brightness->curr is a cached value which stores
|
|
|
* the correct current backlight level in most cases.
|
|
@@ -611,8 +612,8 @@ acpi_video_device_EDID(struct acpi_video_device *device,
|
|
|
|
|
|
/*
|
|
|
* Arg:
|
|
|
- * video : video bus device pointer
|
|
|
- * bios_flag :
|
|
|
+ * video : video bus device pointer
|
|
|
+ * bios_flag :
|
|
|
* 0. The system BIOS should NOT automatically switch(toggle)
|
|
|
* the active display output.
|
|
|
* 1. The system BIOS should automatically switch (toggle) the
|
|
@@ -624,9 +625,9 @@ acpi_video_device_EDID(struct acpi_video_device *device,
|
|
|
* lcd_flag :
|
|
|
* 0. The system BIOS should automatically control the brightness level
|
|
|
* of the LCD when the power changes from AC to DC
|
|
|
- * 1. The system BIOS should NOT automatically control the brightness
|
|
|
+ * 1. The system BIOS should NOT automatically control the brightness
|
|
|
* level of the LCD when the power changes from AC to DC.
|
|
|
- * Return Value:
|
|
|
+ * Return Value:
|
|
|
* -EINVAL wrong arg.
|
|
|
*/
|
|
|
|
|
@@ -710,8 +711,8 @@ static int acpi_video_bqc_quirk(struct acpi_video_device *device,
|
|
|
|
|
|
|
|
|
/*
|
|
|
- * Arg:
|
|
|
- * device : video output device (LCD, CRT, ..)
|
|
|
+ * Arg:
|
|
|
+ * device : video output device (LCD, CRT, ..)
|
|
|
*
|
|
|
* Return Value:
|
|
|
* Maximum brightness level
|
|
@@ -799,16 +800,6 @@ acpi_video_init_brightness(struct acpi_video_device *device)
|
|
|
br->count = count;
|
|
|
device->brightness = br;
|
|
|
|
|
|
- /* Check the input/output of _BQC/_BCL/_BCM */
|
|
|
- if ((max_level < 100) && (max_level <= (count - 2)))
|
|
|
- br->flags._BCL_use_index = 1;
|
|
|
-
|
|
|
- /*
|
|
|
- * _BCM is always consistent with _BCL,
|
|
|
- * at least for all the laptops we have ever seen.
|
|
|
- */
|
|
|
- br->flags._BCM_use_index = br->flags._BCL_use_index;
|
|
|
-
|
|
|
/* _BQC uses INDEX while _BCL uses VALUE in some laptops */
|
|
|
br->curr = level = max_level;
|
|
|
|
|
@@ -870,7 +861,7 @@ out:
|
|
|
* device : video output device (LCD, CRT, ..)
|
|
|
*
|
|
|
* Return Value:
|
|
|
- * None
|
|
|
+ * None
|
|
|
*
|
|
|
* Find out all required AML methods defined under the output
|
|
|
* device.
|
|
@@ -900,7 +891,7 @@ static void acpi_video_device_find_cap(struct acpi_video_device *device)
|
|
|
acpi_handle acpi_parent;
|
|
|
struct device *parent = NULL;
|
|
|
int result;
|
|
|
- static int count = 0;
|
|
|
+ static int count;
|
|
|
char *name;
|
|
|
|
|
|
result = acpi_video_init_brightness(device);
|
|
@@ -969,11 +960,11 @@ static void acpi_video_device_find_cap(struct acpi_video_device *device)
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
- * Arg:
|
|
|
- * device : video output device (VGA)
|
|
|
+ * Arg:
|
|
|
+ * device : video output device (VGA)
|
|
|
*
|
|
|
* Return Value:
|
|
|
- * None
|
|
|
+ * None
|
|
|
*
|
|
|
* Find out all required AML methods defined under the video bus device.
|
|
|
*/
|
|
@@ -1012,7 +1003,8 @@ static int acpi_video_bus_check(struct acpi_video_bus *video)
|
|
|
return -ENODEV;
|
|
|
pci_dev_put(dev);
|
|
|
|
|
|
- /* Since there is no HID, CID and so on for VGA driver, we have
|
|
|
+ /*
|
|
|
+ * Since there is no HID, CID and so on for VGA driver, we have
|
|
|
* to check well known required nodes.
|
|
|
*/
|
|
|
|
|
@@ -1042,12 +1034,14 @@ static int acpi_video_bus_check(struct acpi_video_bus *video)
|
|
|
return status;
|
|
|
}
|
|
|
|
|
|
-/* --------------------------------------------------------------------------
|
|
|
- Driver Interface
|
|
|
- -------------------------------------------------------------------------- */
|
|
|
+/*
|
|
|
+ * --------------------------------------------------------------------------
|
|
|
+ * Driver Interface
|
|
|
+ * --------------------------------------------------------------------------
|
|
|
+ */
|
|
|
|
|
|
/* device interface */
|
|
|
-static struct acpi_video_device_attrib*
|
|
|
+static struct acpi_video_device_attrib *
|
|
|
acpi_video_get_device_attr(struct acpi_video_bus *video, unsigned long device_id)
|
|
|
{
|
|
|
struct acpi_video_enumerated_device *ids;
|
|
@@ -1085,7 +1079,7 @@ acpi_video_bus_get_one_device(struct acpi_device *device,
|
|
|
unsigned long long device_id;
|
|
|
int status, device_type;
|
|
|
struct acpi_video_device *data;
|
|
|
- struct acpi_video_device_attrib* attribute;
|
|
|
+ struct acpi_video_device_attrib *attribute;
|
|
|
|
|
|
status =
|
|
|
acpi_evaluate_integer(device->handle, "_ADR", NULL, &device_id);
|
|
@@ -1107,7 +1101,7 @@ acpi_video_bus_get_one_device(struct acpi_device *device,
|
|
|
|
|
|
attribute = acpi_video_get_device_attr(video, device_id);
|
|
|
|
|
|
- if((attribute != NULL) && attribute->device_id_scheme) {
|
|
|
+ if (attribute && attribute->device_id_scheme) {
|
|
|
switch (attribute->display_type) {
|
|
|
case ACPI_VIDEO_DISPLAY_CRT:
|
|
|
data->flags.crt = 1;
|
|
@@ -1125,24 +1119,24 @@ acpi_video_bus_get_one_device(struct acpi_device *device,
|
|
|
data->flags.unknown = 1;
|
|
|
break;
|
|
|
}
|
|
|
- if(attribute->bios_can_detect)
|
|
|
+ if (attribute->bios_can_detect)
|
|
|
data->flags.bios = 1;
|
|
|
} else {
|
|
|
/* Check for legacy IDs */
|
|
|
device_type = acpi_video_get_device_type(video, device_id);
|
|
|
/* Ignore bits 16 and 18-20 */
|
|
|
switch (device_type & 0xffe2ffff) {
|
|
|
- case ACPI_VIDEO_DISPLAY_LEGACY_MONITOR:
|
|
|
- data->flags.crt = 1;
|
|
|
- break;
|
|
|
- case ACPI_VIDEO_DISPLAY_LEGACY_PANEL:
|
|
|
- data->flags.lcd = 1;
|
|
|
- break;
|
|
|
- case ACPI_VIDEO_DISPLAY_LEGACY_TV:
|
|
|
- data->flags.tvout = 1;
|
|
|
- break;
|
|
|
- default:
|
|
|
- data->flags.unknown = 1;
|
|
|
+ case ACPI_VIDEO_DISPLAY_LEGACY_MONITOR:
|
|
|
+ data->flags.crt = 1;
|
|
|
+ break;
|
|
|
+ case ACPI_VIDEO_DISPLAY_LEGACY_PANEL:
|
|
|
+ data->flags.lcd = 1;
|
|
|
+ break;
|
|
|
+ case ACPI_VIDEO_DISPLAY_LEGACY_TV:
|
|
|
+ data->flags.tvout = 1;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ data->flags.unknown = 1;
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -1165,12 +1159,12 @@ acpi_video_bus_get_one_device(struct acpi_device *device,
|
|
|
|
|
|
/*
|
|
|
* Arg:
|
|
|
- * video : video bus device
|
|
|
+ * video : video bus device
|
|
|
*
|
|
|
* Return:
|
|
|
- * none
|
|
|
- *
|
|
|
- * Enumerate the video device list of the video bus,
|
|
|
+ * none
|
|
|
+ *
|
|
|
+ * Enumerate the video device list of the video bus,
|
|
|
* bind the ids with the corresponding video devices
|
|
|
* under the video bus.
|
|
|
*/
|
|
@@ -1189,13 +1183,13 @@ static void acpi_video_device_rebind(struct acpi_video_bus *video)
|
|
|
|
|
|
/*
|
|
|
* Arg:
|
|
|
- * video : video bus device
|
|
|
- * device : video output device under the video
|
|
|
- * bus
|
|
|
+ * video : video bus device
|
|
|
+ * device : video output device under the video
|
|
|
+ * bus
|
|
|
*
|
|
|
* Return:
|
|
|
- * none
|
|
|
- *
|
|
|
+ * none
|
|
|
+ *
|
|
|
* Bind the ids with the corresponding video devices
|
|
|
* under the video bus.
|
|
|
*/
|
|
@@ -1218,11 +1212,11 @@ acpi_video_device_bind(struct acpi_video_bus *video,
|
|
|
|
|
|
/*
|
|
|
* Arg:
|
|
|
- * video : video bus device
|
|
|
+ * video : video bus device
|
|
|
*
|
|
|
* Return:
|
|
|
- * < 0 : error
|
|
|
- *
|
|
|
+ * < 0 : error
|
|
|
+ *
|
|
|
* Call _DOD to enumerate all devices attached to display adapter
|
|
|
*
|
|
|
*/
|
|
@@ -1283,7 +1277,7 @@ static int acpi_video_device_enumerate(struct acpi_video_bus *video)
|
|
|
video->attached_array = active_list;
|
|
|
video->attached_count = count;
|
|
|
|
|
|
- out:
|
|
|
+out:
|
|
|
kfree(buffer.pointer);
|
|
|
return status;
|
|
|
}
|
|
@@ -1728,7 +1722,7 @@ static int acpi_video_bus_add(struct acpi_device *device)
|
|
|
if (!strcmp(device->pnp.bus_id, "VID")) {
|
|
|
if (instance)
|
|
|
device->pnp.bus_id[3] = '0' + instance;
|
|
|
- instance ++;
|
|
|
+ instance++;
|
|
|
}
|
|
|
/* a hack to fix the duplicate name "VGA" problem on Pa 3553 */
|
|
|
if (!strcmp(device->pnp.bus_id, "VGA")) {
|