[Intel-gfx] [PATCH] drm/i915: Check and update LVDS connector status after receiving LID notification event

ykzhao yakui.zhao at intel.com
Thu Dec 10 01:46:55 CET 2009


On Wed, 2009-12-02 at 10:54 +0800, Zhao, Yakui wrote:
> From: Zhao Yakui <yakui.zhao at intel.com>

Hi, Eric
    Any comment about this patch?
    If we don't update the status of LVDS connector in time, maybe
nothing is displayed on LVDS panel after close/reopen the LID.

Thanks.
> 
> Now the LID state is used to check whether the LVDS is connected or
> disconnected. And when the LID is closed, it means that the LVDS is
> disconnected. When it is reopened, it means that the LVDS is connected.
> 
> At the same time on some distributions the LID event is also used to put
> the system into suspend state. When the LID is closed, the system will enter
> the suspend state. When the LID is reopened, the system will be resumed.
> 
> In such case when the LID is closed, the LVDS is detected as disconnected and
> then the system will enter the suspended state. When the LID is reopened, the
> system will be resumed. But as the LVDS status is not updated in course of
> resume, it will cause that the LVDS connector is marked as unused and
> disabled. Even when we try to configure the display mode for LVDS, it still
> can't work if we don't update the status of LVDS connector.
> 
> check and update the status of LVDS connector after receiving the LID
> notication event. Then after the system is resumed from suspended state, we
> can set the display mode for LVDS correctly.
> 
> Signed-off-by: Zhao Yakui <yakui.zhao at intel.com>
> Reported-by:  Dirk Hohndel <hohndel at infradead.org>
> ---
>  drivers/gpu/drm/i915/i915_drv.h   |    1 +
>  drivers/gpu/drm/i915/intel_lvds.c |    9 +++++++++
>  2 files changed, 10 insertions(+), 0 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
> index ca1ba42..cb97851 100644
> --- a/drivers/gpu/drm/i915/i915_drv.h
> +++ b/drivers/gpu/drm/i915/i915_drv.h
> @@ -551,6 +551,7 @@ typedef struct drm_i915_private {
>  	u16 orig_clock;
>  	int child_dev_num;
>  	struct child_device_config *child_dev;
> +	struct drm_connector *int_lvds_connector;
>  } drm_i915_private_t;
>  
>  /** driver private structure attached to each drm_gem_object */
> diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c
> index 02b813e..0eba2ea 100644
> --- a/drivers/gpu/drm/i915/intel_lvds.c
> +++ b/drivers/gpu/drm/i915/intel_lvds.c
> @@ -679,7 +679,14 @@ static int intel_lid_notify(struct notifier_block *nb, unsigned long val,
>  	struct drm_i915_private *dev_priv =
>  		container_of(nb, struct drm_i915_private, lid_notifier);
>  	struct drm_device *dev = dev_priv->dev;
> +	struct drm_connector *connector = dev_priv->int_lvds_connector;
>  
> +	/*
> +	 * check and update the status of LVDS connector after receiving
> +	 * the LID nofication event.
> +	 */
> +	if (connector)
> +		connector->status = connector->funcs->detect(connector);
>  	if (!acpi_lid_open()) {
>  		dev_priv->modeset_on_lid = 1;
>  		return NOTIFY_OK;
> @@ -1180,6 +1187,8 @@ out:
>  		DRM_DEBUG_KMS("lid notifier registration failed\n");
>  		dev_priv->lid_notifier.notifier_call = NULL;
>  	}
> +	/* keep the LVDS connector */
> +	dev_priv->int_lvds_connector = connector;
>  	drm_sysfs_connector_add(connector);
>  	return;
>  




More information about the Intel-gfx mailing list