71 lines
2.1 KiB
Diff
71 lines
2.1 KiB
Diff
|
diff -up linux-2.6.33.noarch/drivers/gpu/drm/i915/i915_opregion.c.orig linux-2.6.33.noarch/drivers/gpu/drm/i915/i915_opregion.c
|
||
|
--- linux-2.6.33.noarch/drivers/gpu/drm/i915/i915_opregion.c.orig 2010-02-24 13:52:17.000000000 -0500
|
||
|
+++ linux-2.6.33.noarch/drivers/gpu/drm/i915/i915_opregion.c 2010-04-01 10:35:35.249121262 -0400
|
||
|
@@ -382,8 +382,54 @@ static void intel_didl_outputs(struct dr
|
||
|
struct drm_i915_private *dev_priv = dev->dev_private;
|
||
|
struct intel_opregion *opregion = &dev_priv->opregion;
|
||
|
struct drm_connector *connector;
|
||
|
+ acpi_handle handle;
|
||
|
+ struct acpi_device *acpi_dev, *acpi_cdev, *acpi_video_bus = NULL;
|
||
|
+ unsigned long long device_id;
|
||
|
+ acpi_status status;
|
||
|
int i = 0;
|
||
|
|
||
|
+ handle = DEVICE_ACPI_HANDLE(&dev->pdev->dev);
|
||
|
+ if (!handle || ACPI_FAILURE(acpi_bus_get_device(handle, &acpi_dev)))
|
||
|
+ return;
|
||
|
+
|
||
|
+ if (acpi_is_video_device(acpi_dev))
|
||
|
+ acpi_video_bus = acpi_dev;
|
||
|
+ else {
|
||
|
+ list_for_each_entry(acpi_cdev, &acpi_dev->children, node) {
|
||
|
+ if (acpi_is_video_device(acpi_cdev)) {
|
||
|
+ acpi_video_bus = acpi_cdev;
|
||
|
+ break;
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ if (!acpi_video_bus)
|
||
|
+ goto blind_set;
|
||
|
+
|
||
|
+ list_for_each_entry(acpi_cdev, &acpi_video_bus->children, node) {
|
||
|
+ if (i >= 8) {
|
||
|
+ dev_printk (KERN_ERR, &dev->pdev->dev,
|
||
|
+ "More than 8 outputs detected\n");
|
||
|
+ return;
|
||
|
+ }
|
||
|
+ status = acpi_evaluate_integer(acpi_cdev->handle, "_ADR",
|
||
|
+ NULL, &device_id);
|
||
|
+ if (ACPI_SUCCESS(status)) {
|
||
|
+ if (!device_id)
|
||
|
+ goto blind_set;
|
||
|
+ opregion->acpi->didl[i] = (u32)(device_id & 0x0f0f);
|
||
|
+ i++;
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+end:
|
||
|
+ /* If fewer than 8 outputs, the list must be null terminated */
|
||
|
+ if (i < 8)
|
||
|
+ opregion->acpi->didl[i] = 0;
|
||
|
+ return;
|
||
|
+
|
||
|
+blind_set:
|
||
|
+ i = 0;
|
||
|
list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
|
||
|
int output_type = ACPI_OTHER_OUTPUT;
|
||
|
if (i >= 8) {
|
||
|
@@ -416,10 +462,7 @@ static void intel_didl_outputs(struct dr
|
||
|
opregion->acpi->didl[i] |= (1<<31) | output_type | i;
|
||
|
i++;
|
||
|
}
|
||
|
-
|
||
|
- /* If fewer than 8 outputs, the list must be null terminated */
|
||
|
- if (i < 8)
|
||
|
- opregion->acpi->didl[i] = 0;
|
||
|
+ goto end;
|
||
|
}
|
||
|
|
||
|
int intel_opregion_init(struct drm_device *dev, int resume)
|