From patchwork Tue Nov 29 05:04:40 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: John Stultz X-Patchwork-Id: 84490 Delivered-To: patches@linaro.org Received: by 10.140.20.101 with SMTP id 92csp1452295qgi; Mon, 28 Nov 2016 21:04:53 -0800 (PST) X-Received: by 10.84.209.143 with SMTP id y15mr56727113plh.96.1480395893087; Mon, 28 Nov 2016 21:04:53 -0800 (PST) Return-Path: Received: from mail-pg0-x231.google.com (mail-pg0-x231.google.com. [2607:f8b0:400e:c05::231]) by mx.google.com with ESMTPS id r71si58263334pfe.287.2016.11.28.21.04.52 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 28 Nov 2016 21:04:53 -0800 (PST) Received-SPF: pass (google.com: domain of john.stultz@linaro.org designates 2607:f8b0:400e:c05::231 as permitted sender) client-ip=2607:f8b0:400e:c05::231; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org; spf=pass (google.com: domain of john.stultz@linaro.org designates 2607:f8b0:400e:c05::231 as permitted sender) smtp.mailfrom=john.stultz@linaro.org; dmarc=pass (p=NONE dis=NONE) header.from=linaro.org Received: by mail-pg0-x231.google.com with SMTP id f188so64837201pgc.3 for ; Mon, 28 Nov 2016 21:04:52 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=j6S/3acIyxRQeYjc51RBt6E42wGAXFnhjEmUtr6FoVU=; b=JHciRd0Lvc22DyTqW+ZVQ0B3g8byRnFcwlngk31yCnYNl9qgzwZKDw2wVXLfL9yOL8 aN43ArGrYa/EqpOUYVrqICzaRB5ALJIrYXUEcoIf9UWt6fay2Z/PeDDifUVko1eavI7O nDLTqPQ9sHRUaK/soSgKiOtxr14tGmwKIGeFY= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=j6S/3acIyxRQeYjc51RBt6E42wGAXFnhjEmUtr6FoVU=; b=DyqhzhKVIKkfFxPo4Bk9/UhbTuQSxf5FQSXEiF1YGovy2ukin5BogJ+vfj425P6vG9 nvzzhC5Wq39dAOgK69lFOPpEUJGTguXzH1NrVTUkjTEABKAvW0e0D5L7IKixpbKypjuo 8AzUNEyAobjNWA7BT0tMXsfZdGQpY7Y3huUoVugsOyra+toD5mtB+1XLJnQMa75aJLmf Fr2TR9unn8enX4JxAn1s6IIhwh03qnOsCTcQj7+GH8qBxd5dxRPKhpDvlI2QAQhOOEYE FXIJG1NKMhkyAh+ppInQQyO8MXRiuBHuXXf1yFjh6BPTUI3ouDQm3IAyY8CJinSRGsJr ObZQ== X-Gm-Message-State: AKaTC02vWsxU24xUHacwXZT4LWsVXX+Znh3n+MTQz1Q5igVg6m791HsF56YLb45iRyKfcHcZ2+o= X-Received: by 10.98.103.84 with SMTP id b81mr25719417pfc.6.1480395892806; Mon, 28 Nov 2016 21:04:52 -0800 (PST) Return-Path: Received: from localhost.localdomain ([2601:1c2:1002:83f0:4e72:b9ff:fe99:466a]) by smtp.gmail.com with ESMTPSA id b29sm73191498pgn.48.2016.11.28.21.04.51 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 28 Nov 2016 21:04:52 -0800 (PST) From: John Stultz To: lkml Cc: John Stultz , David Airlie , Archit Taneja , Wolfram Sang , Lars-Peter Clausen , Laurent Pinchart , dri-devel@lists.freedesktop.org Subject: [RFC][PATCH 1/5 v2] drm/bridge: adv7511: Use work_struct to defer hotplug handing to out of irq context Date: Mon, 28 Nov 2016 21:04:40 -0800 Message-Id: <1480395884-5471-2-git-send-email-john.stultz@linaro.org> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1480395884-5471-1-git-send-email-john.stultz@linaro.org> References: <1480395884-5471-1-git-send-email-john.stultz@linaro.org> 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 Cc: Archit Taneja Cc: Wolfram Sang Cc: Lars-Peter Clausen Cc: Laurent Pinchart Cc: dri-devel@lists.freedesktop.org Signed-off-by: John Stultz --- 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(-) -- 2.7.4 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; + 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); +} + + 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);