All of lore.kernel.org
 help / color / mirror / Atom feed
From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
To: John Stultz <john.stultz@linaro.org>
Cc: lkml <linux-kernel@vger.kernel.org>,
	dri-devel@lists.freedesktop.org,
	Wolfram Sang <wsa+renesas@sang-engineering.com>
Subject: Re: [RFC][PATCH 1/5 v2] drm/bridge: adv7511: Use work_struct to defer hotplug handing to out of irq context
Date: Tue, 29 Nov 2016 08:46:44 +0200	[thread overview]
Message-ID: <3570409.tKEQBRfa3m@avalon> (raw)
In-Reply-To: <1480395884-5471-2-git-send-email-john.stultz@linaro.org>

Hi John,

Thank you for the patch.

On Monday 28 Nov 2016 21:04:40 John Stultz wrote:
> I was recently seeing issues with EDID probing, where
> the logic to wait for the EDID read bit to be set by the
> IRQ wasn't happening and the code would time out and fail.
> 
> Digging deeper, I found this was due to the fact that
> IRQs were disabled as we were running in IRQ context from
> the HPD signal.
> 
> Thus this patch changes the logic to handle the HPD signal
> via a work_struct so we can be out of irq context.
> 
> With this patch, the EDID probing on hotplug does not time
> out.
> 
> Cc: David Airlie <airlied@linux.ie>
> Cc: Archit Taneja <architt@codeaurora.org>
> Cc: Wolfram Sang <wsa+renesas@sang-engineering.com>
> Cc: Lars-Peter Clausen <lars@metafoo.de>
> Cc: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> Cc: dri-devel@lists.freedesktop.org
> Signed-off-by: John Stultz <john.stultz@linaro.org>
> ---
> v2: Reworked to properly fix the issue rather then
>     just delaying for 200ms
> 
>  drivers/gpu/drm/bridge/adv7511/adv7511.h     |  2 ++
>  drivers/gpu/drm/bridge/adv7511/adv7511_drv.c | 12 +++++++++++-
>  2 files changed, 13 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/bridge/adv7511/adv7511.h
> b/drivers/gpu/drm/bridge/adv7511/adv7511.h index 992d76c..2a1e722 100644
> --- a/drivers/gpu/drm/bridge/adv7511/adv7511.h
> +++ b/drivers/gpu/drm/bridge/adv7511/adv7511.h
> @@ -317,6 +317,8 @@ struct adv7511 {
>  	bool edid_read;
> 
>  	wait_queue_head_t wq;
> +	struct work_struct irq_work;
> +

I'd call this hpd_work.

>  	struct drm_bridge bridge;
>  	struct drm_connector connector;
> 
> diff --git a/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c
> b/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c index 8dba729..b38e743
> 100644
> --- a/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c
> +++ b/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c
> @@ -402,6 +402,14 @@ static bool adv7511_hpd(struct adv7511 *adv7511)
>  	return false;
>  }
> 
> +static void adv7511_irq_work(struct work_struct *work)
> +{
> +	struct adv7511 *adv7511 = container_of(work, struct adv7511, 
irq_work);
> +
> +	drm_helper_hpd_irq_event(adv7511->connector.dev);
> +}
> +
> +

One blank line is enough.

Apart from that,

Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>

>  static int adv7511_irq_process(struct adv7511 *adv7511, bool process_hpd)
>  {
>  	unsigned int irq0, irq1;
> @@ -419,7 +427,7 @@ static int adv7511_irq_process(struct adv7511 *adv7511,
> bool process_hpd) regmap_write(adv7511->regmap, ADV7511_REG_INT(1), irq1);
> 
>  	if (process_hpd && irq0 & ADV7511_INT0_HPD && adv7511->bridge.encoder)
> -		drm_helper_hpd_irq_event(adv7511->connector.dev);
> +		schedule_work(&adv7511->irq_work);
> 
>  	if (irq0 & ADV7511_INT0_EDID_READY || irq1 & ADV7511_INT1_DDC_ERROR) {
>  		adv7511->edid_read = true;
> @@ -1006,6 +1014,8 @@ static int adv7511_probe(struct i2c_client *i2c, const
> struct i2c_device_id *id) goto err_i2c_unregister_edid;
>  	}
> 
> +	INIT_WORK(&adv7511->irq_work, adv7511_irq_work);
> +
>  	if (i2c->irq) {
>  		init_waitqueue_head(&adv7511->wq);

-- 
Regards,

Laurent Pinchart

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

WARNING: multiple messages have this Message-ID (diff)
From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
To: John Stultz <john.stultz@linaro.org>
Cc: lkml <linux-kernel@vger.kernel.org>,
	David Airlie <airlied@linux.ie>,
	Archit Taneja <architt@codeaurora.org>,
	Wolfram Sang <wsa+renesas@sang-engineering.com>,
	Lars-Peter Clausen <lars@metafoo.de>,
	dri-devel@lists.freedesktop.org
Subject: Re: [RFC][PATCH 1/5 v2] drm/bridge: adv7511: Use work_struct to defer hotplug handing to out of irq context
Date: Tue, 29 Nov 2016 08:46:44 +0200	[thread overview]
Message-ID: <3570409.tKEQBRfa3m@avalon> (raw)
In-Reply-To: <1480395884-5471-2-git-send-email-john.stultz@linaro.org>

Hi John,

Thank you for the patch.

On Monday 28 Nov 2016 21:04:40 John Stultz wrote:
> I was recently seeing issues with EDID probing, where
> the logic to wait for the EDID read bit to be set by the
> IRQ wasn't happening and the code would time out and fail.
> 
> Digging deeper, I found this was due to the fact that
> IRQs were disabled as we were running in IRQ context from
> the HPD signal.
> 
> Thus this patch changes the logic to handle the HPD signal
> via a work_struct so we can be out of irq context.
> 
> With this patch, the EDID probing on hotplug does not time
> out.
> 
> Cc: David Airlie <airlied@linux.ie>
> Cc: Archit Taneja <architt@codeaurora.org>
> Cc: Wolfram Sang <wsa+renesas@sang-engineering.com>
> Cc: Lars-Peter Clausen <lars@metafoo.de>
> Cc: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> Cc: dri-devel@lists.freedesktop.org
> Signed-off-by: John Stultz <john.stultz@linaro.org>
> ---
> v2: Reworked to properly fix the issue rather then
>     just delaying for 200ms
> 
>  drivers/gpu/drm/bridge/adv7511/adv7511.h     |  2 ++
>  drivers/gpu/drm/bridge/adv7511/adv7511_drv.c | 12 +++++++++++-
>  2 files changed, 13 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/bridge/adv7511/adv7511.h
> b/drivers/gpu/drm/bridge/adv7511/adv7511.h index 992d76c..2a1e722 100644
> --- a/drivers/gpu/drm/bridge/adv7511/adv7511.h
> +++ b/drivers/gpu/drm/bridge/adv7511/adv7511.h
> @@ -317,6 +317,8 @@ struct adv7511 {
>  	bool edid_read;
> 
>  	wait_queue_head_t wq;
> +	struct work_struct irq_work;
> +

I'd call this hpd_work.

>  	struct drm_bridge bridge;
>  	struct drm_connector connector;
> 
> diff --git a/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c
> b/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c index 8dba729..b38e743
> 100644
> --- a/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c
> +++ b/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c
> @@ -402,6 +402,14 @@ static bool adv7511_hpd(struct adv7511 *adv7511)
>  	return false;
>  }
> 
> +static void adv7511_irq_work(struct work_struct *work)
> +{
> +	struct adv7511 *adv7511 = container_of(work, struct adv7511, 
irq_work);
> +
> +	drm_helper_hpd_irq_event(adv7511->connector.dev);
> +}
> +
> +

One blank line is enough.

Apart from that,

Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>

>  static int adv7511_irq_process(struct adv7511 *adv7511, bool process_hpd)
>  {
>  	unsigned int irq0, irq1;
> @@ -419,7 +427,7 @@ static int adv7511_irq_process(struct adv7511 *adv7511,
> bool process_hpd) regmap_write(adv7511->regmap, ADV7511_REG_INT(1), irq1);
> 
>  	if (process_hpd && irq0 & ADV7511_INT0_HPD && adv7511->bridge.encoder)
> -		drm_helper_hpd_irq_event(adv7511->connector.dev);
> +		schedule_work(&adv7511->irq_work);
> 
>  	if (irq0 & ADV7511_INT0_EDID_READY || irq1 & ADV7511_INT1_DDC_ERROR) {
>  		adv7511->edid_read = true;
> @@ -1006,6 +1014,8 @@ static int adv7511_probe(struct i2c_client *i2c, const
> struct i2c_device_id *id) goto err_i2c_unregister_edid;
>  	}
> 
> +	INIT_WORK(&adv7511->irq_work, adv7511_irq_work);
> +
>  	if (i2c->irq) {
>  		init_waitqueue_head(&adv7511->wq);

-- 
Regards,

Laurent Pinchart

  reply	other threads:[~2016-11-29  6:46 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-11-29  5:04 [RFC][PATCH 0/5 v2] adv7511 EDID probing improvements John Stultz
2016-11-29  5:04 ` John Stultz
2016-11-29  5:04 ` [RFC][PATCH 1/5 v2] drm/bridge: adv7511: Use work_struct to defer hotplug handing to out of irq context John Stultz
2016-11-29  5:04   ` John Stultz
2016-11-29  6:46   ` Laurent Pinchart [this message]
2016-11-29  6:46     ` Laurent Pinchart
2016-11-29 17:04     ` John Stultz
2016-11-29 17:04       ` John Stultz
2016-11-29  5:04 ` [RFC][PATCH 2/5 v2] drm/bridge: adv7511: Switch to using drm_kms_helper_hotplug_event() John Stultz
2016-11-29  5:04   ` John Stultz
2016-11-29  6:50   ` Laurent Pinchart
2016-11-29  6:50     ` Laurent Pinchart
2016-11-29 17:58     ` John Stultz
2016-11-29 17:58       ` John Stultz
2016-11-29  5:04 ` [RFC][PATCH 3/5 v2] drm/bridge: adv7511: Enable HPD interrupts to support hotplug and improve monitor detection John Stultz
2016-11-29  5:04   ` John Stultz
2016-11-29  5:04 ` [RFC][PATCH 4/5 v2] drm/bridge: adv7511: Rework adv7511_power_on/off() so they can be reused internally John Stultz
2016-11-29  5:04   ` John Stultz
2016-11-29  5:04 ` [RFC][PATCH 5/5 v2] drm/bridge: adv7511: Reuse __adv7511_power_on/off() when probing EDID John Stultz
2016-11-29  5:04   ` John Stultz
2016-11-30  4:42   ` Archit Taneja
2016-11-30  4:42     ` Archit Taneja
2016-12-12  8:40 ` [RFC][PATCH 0/5 v2] adv7511 EDID probing improvements Archit Taneja
2016-12-12  8:40   ` Archit Taneja
2016-12-12 19:06   ` John Stultz

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=3570409.tKEQBRfa3m@avalon \
    --to=laurent.pinchart@ideasonboard.com \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=john.stultz@linaro.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=wsa+renesas@sang-engineering.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.