From mboxrd@z Thu Jan 1 00:00:00 1970 From: John Stultz 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> References: <1480395884-5471-1-git-send-email-john.stultz@linaro.org> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail-pg0-x236.google.com (mail-pg0-x236.google.com [IPv6:2607:f8b0:400e:c05::236]) by gabe.freedesktop.org (Postfix) with ESMTPS id 52C6F6E359 for ; Tue, 29 Nov 2016 05:04:53 +0000 (UTC) Received: by mail-pg0-x236.google.com with SMTP id 3so65153189pgd.0 for ; Mon, 28 Nov 2016 21:04:53 -0800 (PST) In-Reply-To: <1480395884-5471-1-git-send-email-john.stultz@linaro.org> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: lkml Cc: dri-devel@lists.freedesktop.org, Wolfram Sang , Laurent Pinchart List-Id: dri-devel@lists.freedesktop.org SSB3YXMgcmVjZW50bHkgc2VlaW5nIGlzc3VlcyB3aXRoIEVESUQgcHJvYmluZywgd2hlcmUKdGhl IGxvZ2ljIHRvIHdhaXQgZm9yIHRoZSBFRElEIHJlYWQgYml0IHRvIGJlIHNldCBieSB0aGUKSVJR IHdhc24ndCBoYXBwZW5pbmcgYW5kIHRoZSBjb2RlIHdvdWxkIHRpbWUgb3V0IGFuZCBmYWlsLgoK RGlnZ2luZyBkZWVwZXIsIEkgZm91bmQgdGhpcyB3YXMgZHVlIHRvIHRoZSBmYWN0IHRoYXQKSVJR cyB3ZXJlIGRpc2FibGVkIGFzIHdlIHdlcmUgcnVubmluZyBpbiBJUlEgY29udGV4dCBmcm9tCnRo ZSBIUEQgc2lnbmFsLgoKVGh1cyB0aGlzIHBhdGNoIGNoYW5nZXMgdGhlIGxvZ2ljIHRvIGhhbmRs ZSB0aGUgSFBEIHNpZ25hbAp2aWEgYSB3b3JrX3N0cnVjdCBzbyB3ZSBjYW4gYmUgb3V0IG9mIGly cSBjb250ZXh0LgoKV2l0aCB0aGlzIHBhdGNoLCB0aGUgRURJRCBwcm9iaW5nIG9uIGhvdHBsdWcg ZG9lcyBub3QgdGltZQpvdXQuCgpDYzogRGF2aWQgQWlybGllIDxhaXJsaWVkQGxpbnV4LmllPgpD YzogQXJjaGl0IFRhbmVqYSA8YXJjaGl0dEBjb2RlYXVyb3JhLm9yZz4KQ2M6IFdvbGZyYW0gU2Fu ZyA8d3NhK3JlbmVzYXNAc2FuZy1lbmdpbmVlcmluZy5jb20+CkNjOiBMYXJzLVBldGVyIENsYXVz ZW4gPGxhcnNAbWV0YWZvby5kZT4KQ2M6IExhdXJlbnQgUGluY2hhcnQgPGxhdXJlbnQucGluY2hh cnRAaWRlYXNvbmJvYXJkLmNvbT4KQ2M6IGRyaS1kZXZlbEBsaXN0cy5mcmVlZGVza3RvcC5vcmcK U2lnbmVkLW9mZi1ieTogSm9obiBTdHVsdHogPGpvaG4uc3R1bHR6QGxpbmFyby5vcmc+Ci0tLQp2 MjogUmV3b3JrZWQgdG8gcHJvcGVybHkgZml4IHRoZSBpc3N1ZSByYXRoZXIgdGhlbgogICAganVz dCBkZWxheWluZyBmb3IgMjAwbXMKCiBkcml2ZXJzL2dwdS9kcm0vYnJpZGdlL2Fkdjc1MTEvYWR2 NzUxMS5oICAgICB8ICAyICsrCiBkcml2ZXJzL2dwdS9kcm0vYnJpZGdlL2Fkdjc1MTEvYWR2NzUx MV9kcnYuYyB8IDEyICsrKysrKysrKysrLQogMiBmaWxlcyBjaGFuZ2VkLCAxMyBpbnNlcnRpb25z KCspLCAxIGRlbGV0aW9uKC0pCgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2JyaWRnZS9h ZHY3NTExL2Fkdjc1MTEuaCBiL2RyaXZlcnMvZ3B1L2RybS9icmlkZ2UvYWR2NzUxMS9hZHY3NTEx LmgKaW5kZXggOTkyZDc2Yy4uMmExZTcyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2Jy aWRnZS9hZHY3NTExL2Fkdjc1MTEuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vYnJpZGdlL2Fkdjc1 MTEvYWR2NzUxMS5oCkBAIC0zMTcsNiArMzE3LDggQEAgc3RydWN0IGFkdjc1MTEgewogCWJvb2wg ZWRpZF9yZWFkOwogCiAJd2FpdF9xdWV1ZV9oZWFkX3Qgd3E7CisJc3RydWN0IHdvcmtfc3RydWN0 IGlycV93b3JrOworCiAJc3RydWN0IGRybV9icmlkZ2UgYnJpZGdlOwogCXN0cnVjdCBkcm1fY29u bmVjdG9yIGNvbm5lY3RvcjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2JyaWRnZS9h ZHY3NTExL2Fkdjc1MTFfZHJ2LmMgYi9kcml2ZXJzL2dwdS9kcm0vYnJpZGdlL2Fkdjc1MTEvYWR2 NzUxMV9kcnYuYwppbmRleCA4ZGJhNzI5Li5iMzhlNzQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dw dS9kcm0vYnJpZGdlL2Fkdjc1MTEvYWR2NzUxMV9kcnYuYworKysgYi9kcml2ZXJzL2dwdS9kcm0v YnJpZGdlL2Fkdjc1MTEvYWR2NzUxMV9kcnYuYwpAQCAtNDAyLDYgKzQwMiwxNCBAQCBzdGF0aWMg Ym9vbCBhZHY3NTExX2hwZChzdHJ1Y3QgYWR2NzUxMSAqYWR2NzUxMSkKIAlyZXR1cm4gZmFsc2U7 CiB9CiAKK3N0YXRpYyB2b2lkIGFkdjc1MTFfaXJxX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3 b3JrKQoreworCXN0cnVjdCBhZHY3NTExICphZHY3NTExID0gY29udGFpbmVyX29mKHdvcmssIHN0 cnVjdCBhZHY3NTExLCBpcnFfd29yayk7CisKKwlkcm1faGVscGVyX2hwZF9pcnFfZXZlbnQoYWR2 NzUxMS0+Y29ubmVjdG9yLmRldik7Cit9CisKKwogc3RhdGljIGludCBhZHY3NTExX2lycV9wcm9j ZXNzKHN0cnVjdCBhZHY3NTExICphZHY3NTExLCBib29sIHByb2Nlc3NfaHBkKQogewogCXVuc2ln bmVkIGludCBpcnEwLCBpcnExOwpAQCAtNDE5LDcgKzQyNyw3IEBAIHN0YXRpYyBpbnQgYWR2NzUx MV9pcnFfcHJvY2VzcyhzdHJ1Y3QgYWR2NzUxMSAqYWR2NzUxMSwgYm9vbCBwcm9jZXNzX2hwZCkK IAlyZWdtYXBfd3JpdGUoYWR2NzUxMS0+cmVnbWFwLCBBRFY3NTExX1JFR19JTlQoMSksIGlycTEp OwogCiAJaWYgKHByb2Nlc3NfaHBkICYmIGlycTAgJiBBRFY3NTExX0lOVDBfSFBEICYmIGFkdjc1 MTEtPmJyaWRnZS5lbmNvZGVyKQotCQlkcm1faGVscGVyX2hwZF9pcnFfZXZlbnQoYWR2NzUxMS0+ Y29ubmVjdG9yLmRldik7CisJCXNjaGVkdWxlX3dvcmsoJmFkdjc1MTEtPmlycV93b3JrKTsKIAog CWlmIChpcnEwICYgQURWNzUxMV9JTlQwX0VESURfUkVBRFkgfHwgaXJxMSAmIEFEVjc1MTFfSU5U MV9ERENfRVJST1IpIHsKIAkJYWR2NzUxMS0+ZWRpZF9yZWFkID0gdHJ1ZTsKQEAgLTEwMDYsNiAr MTAxNCw4IEBAIHN0YXRpYyBpbnQgYWR2NzUxMV9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqaTJj LCBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCiAJCQlnb3RvIGVycl9pMmNfdW5yZWdp c3Rlcl9lZGlkOwogCX0KIAorCUlOSVRfV09SSygmYWR2NzUxMS0+aXJxX3dvcmssIGFkdjc1MTFf aXJxX3dvcmspOworCiAJaWYgKGkyYy0+aXJxKSB7CiAJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmFk djc1MTEtPndxKTsKIAotLSAKMi43LjQKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fCmRyaS1kZXZlbCBtYWlsaW5nIGxpc3QKZHJpLWRldmVsQGxpc3RzLmZy ZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3Rp bmZvL2RyaS1kZXZlbAo= From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754870AbcK2FFF (ORCPT ); Tue, 29 Nov 2016 00:05:05 -0500 Received: from mail-pg0-f43.google.com ([74.125.83.43]:36366 "EHLO mail-pg0-f43.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752611AbcK2FEx (ORCPT ); Tue, 29 Nov 2016 00:04:53 -0500 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> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.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(-) 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); -- 2.7.4