Commit 200453bf authored by Jani Nikula's avatar Jani Nikula

drm/i915/opregion: fill in the CADL from connector list, not DIDL

This is essentially the same thing as duplicating DIDL now that the
connector list has the ACPI device IDs.

Cc: Peter Wu <peter@lekensteyn.nl>
Cc: Rainer Koenig <Rainer.Koenig@ts.fujitsu.com>
Cc: Jan-Marek Glogowski <glogow@fbihome.de>
Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Cc: Marcos Paulo de Souza <marcos.souza.org@gmail.com>
Cc: Paolo Stivanin <paolostivanin@fastmail.fm>
Tested-by: default avatarRainer Koenig <Rainer.Koenig@ts.fujitsu.com>
Tested-by: default avatarPaolo Stivanin <paolostivanin@fastmail.fm>
Tested-by: default avatarMarcos Paulo de Souza <marcos.souza.org@gmail.com>
Reviewed-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
Signed-off-by: default avatarJani Nikula <jani.nikula@intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/ea0a052fa99a4cb56b559a815866434bcfef853d.1479295490.git.jani.nikula@intel.com
parent 8e1b56a4
...@@ -642,24 +642,6 @@ static struct notifier_block intel_opregion_notifier = { ...@@ -642,24 +642,6 @@ static struct notifier_block intel_opregion_notifier = {
* (version 3) * (version 3)
*/ */
static u32 get_did(struct intel_opregion *opregion, int i)
{
u32 did;
if (i < ARRAY_SIZE(opregion->acpi->didl)) {
did = opregion->acpi->didl[i];
} else {
i -= ARRAY_SIZE(opregion->acpi->didl);
if (WARN_ON(i >= ARRAY_SIZE(opregion->acpi->did2)))
return 0;
did = opregion->acpi->did2[i];
}
return did;
}
static void set_did(struct intel_opregion *opregion, int i, u32 val) static void set_did(struct intel_opregion *opregion, int i, u32 val)
{ {
if (i < ARRAY_SIZE(opregion->acpi->didl)) { if (i < ARRAY_SIZE(opregion->acpi->didl)) {
...@@ -762,19 +744,28 @@ static void intel_didl_outputs(struct drm_i915_private *dev_priv) ...@@ -762,19 +744,28 @@ static void intel_didl_outputs(struct drm_i915_private *dev_priv)
static void intel_setup_cadls(struct drm_i915_private *dev_priv) static void intel_setup_cadls(struct drm_i915_private *dev_priv)
{ {
struct intel_opregion *opregion = &dev_priv->opregion; struct intel_opregion *opregion = &dev_priv->opregion;
struct intel_connector *connector;
int i = 0; int i = 0;
u32 disp_id;
/*
/* Initialize the CADL field by duplicating the DIDL values. * Initialize the CADL field from the connector device ids. This is
* Technically, this is not always correct as display outputs may exist, * essentially the same as copying from the DIDL. Technically, this is
* but not active. This initialization is necessary for some Clevo * not always correct as display outputs may exist, but not active. This
* laptops that check this field before processing the brightness and * initialization is necessary for some Clevo laptops that check this
* display switching hotkeys. Just like DIDL, CADL is NULL-terminated if * field before processing the brightness and display switching hotkeys.
* there are less than eight devices. */ *
do { * Note that internal panels should be at the front of the connector
disp_id = get_did(opregion, i); * list already, ensuring they're not left out.
opregion->acpi->cadl[i] = disp_id; */
} while (++i < 8 && disp_id != 0); for_each_intel_connector(&dev_priv->drm, connector) {
if (i >= ARRAY_SIZE(opregion->acpi->cadl))
break;
opregion->acpi->cadl[i++] = connector->acpi_device_id;
}
/* If fewer than 8 active devices, the list must be null terminated */
if (i < ARRAY_SIZE(opregion->acpi->cadl))
opregion->acpi->cadl[i] = 0;
} }
void intel_opregion_register(struct drm_i915_private *dev_priv) void intel_opregion_register(struct drm_i915_private *dev_priv)
......
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