Subject:[DRM/I915]: Use the LID device to decide whether the LVDS should be initialized From: Zhao Yakui On some boxes the mobile chipset is used and there is no LVDS device. In such case we had better not initialize the LVDS output device so that one pipe can be used for other output device. For example: E-TOP. But unfortunately the LVDS device is still initialized on the boxes based on mobile chipset in KMS mode. It brings that this pipe occupied by LVDS can't be used for other output device. After checking the acpidump we find that there is no LID device on such boxes. In such case we can use the LID device to decide whether the LVDS device should be initialized. If there is no LID device, we can think that there is no LVDS device. It is unnecessary to initialize the LVDS output device. If there exists the LID device, it will continue the current flowchart. Maybe on some boxes there is no LVDS device but the LID device is found. In such case it had better be added to the quirk table. http://bugs.freedesktop.org/show_bug.cgi?id=21496 Signed-off-by: Zhao Yakui --- drivers/gpu/drm/i915/intel_lvds.c | 65 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) Index: linux-2.6/drivers/gpu/drm/i915/intel_lvds.c =================================================================== --- linux-2.6.orig/drivers/gpu/drm/i915/intel_lvds.c 2009-06-11 15:27:07.000000000 +0800 +++ linux-2.6/drivers/gpu/drm/i915/intel_lvds.c 2009-06-11 16:39:32.000000000 +0800 @@ -36,6 +36,7 @@ #include "intel_drv.h" #include "i915_drm.h" #include "i915_drv.h" +#include /** * Sets the backlight level. @@ -505,6 +506,59 @@ }; /** + * check_lid_device -- check whether it is ACPI LID device. + * @dev: the ACPI device + * @data: the number of LID device + * + * check whether it is a LID device by comparing the HID. If it is, + * increase the number of LID device. + */ +static int check_lid_device(struct device *dev, void *data) +{ +#define ACPI_HID_LID "PNP0C0D" + struct acpi_device *acpi_dev; + int *p_lid = (int *)data; + + acpi_dev = to_acpi_device(dev); + if (!strncmp(acpi_device_hid(acpi_dev), ACPI_HID_LID, 7)) { + /* + * compare the device HID with "PNP0C0D". If it is equal, the + * LID device is found. Increase the count + */ + (*p_lid)++; + } + return 0; +} +/** + * check whether there exists the ACPI LID device by enumerating the ACPI + * device tree. + * If ACPI is disabled, there is no ACPI device tree. 0 is returned. + * If the LID device is found, it will return zero. + * If no LID device is found, it will return -ENODEV. + */ +static int intel_lvds_find_lid(void) +{ + int lid_count = 0; + + if (acpi_disabled) { + /* + * if ACPI is disabled, there is no ACPI device tree. And + * we don't know whether there exists the LID device. + * In such case we will return 0. + */ + return 0; + } + + bus_for_each_dev(&acpi_bus_type, NULL, &lid_count, check_lid_device); + + if (!lid_count) { + /* No LID device is not found. Return -ENODEV */ + return -ENODEV; + } + + return 0; +} +/** * intel_lvds_init - setup LVDS connectors on this device * @dev: drm device * @@ -526,6 +580,17 @@ if (dmi_check_system(intel_no_lvds)) return; + if (intel_lvds_find_lid()) { + /* If there is no LID device, we can think that there is + * no LVDS output device. In such case it is unnecessary to + * create the LVDS output device. + * But maybe on some boxes there is no LVDS device while the + * LID device is found. If so, it had better be added to + * the quirk list. + */ + return; + } + if (IS_IGDNG(dev)) { if ((I915_READ(PCH_LVDS) & LVDS_DETECTED) == 0) return;