From mboxrd@z Thu Jan 1 00:00:00 1970 From: John Stultz Subject: [PATCH 1/5 v3] drm/bridge: adv7511: Use work_struct to defer hotplug handing to out of irq context Date: Tue, 3 Jan 2017 11:41:38 -0800 Message-ID: <1483472502-16403-2-git-send-email-john.stultz@linaro.org> References: <1483472502-16403-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-x229.google.com (mail-pg0-x229.google.com [IPv6:2607:f8b0:400e:c05::229]) by gabe.freedesktop.org (Postfix) with ESMTPS id 3F8776E138 for ; Tue, 3 Jan 2017 19:41:52 +0000 (UTC) Received: by mail-pg0-x229.google.com with SMTP id f188so217813991pgc.3 for ; Tue, 03 Jan 2017 11:41:52 -0800 (PST) In-Reply-To: <1483472502-16403-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 UmV2aWV3ZWQtYnk6IExhdXJlbnQgUGluY2hhcnQgPGxhdXJlbnQucGluY2hhcnRAaWRlYXNvbmJv YXJkLmNvbT4KU2lnbmVkLW9mZi1ieTogSm9obiBTdHVsdHogPGpvaG4uc3R1bHR6QGxpbmFyby5v cmc+Ci0tLQp2MzogUmVuYW1lIGlycV93b3JrIHRvIGhwZF93b3JrIGFuZCByZW1vdmUgZXh0cmEg d2hpdGVzcGFjZSwgYXMKICAgIHN1Z2dlc3RlZCBieSBMYXVyZW50CgogZHJpdmVycy9ncHUvZHJt L2JyaWRnZS9hZHY3NTExL2Fkdjc1MTEuaCAgICAgfCAgMiArKwogZHJpdmVycy9ncHUvZHJtL2Jy aWRnZS9hZHY3NTExL2Fkdjc1MTFfZHJ2LmMgfCAxMSArKysrKysrKysrLQogMiBmaWxlcyBjaGFu Z2VkLCAxMiBpbnNlcnRpb25zKCspLCAxIGRlbGV0aW9uKC0pCgpkaWZmIC0tZ2l0IGEvZHJpdmVy cy9ncHUvZHJtL2JyaWRnZS9hZHY3NTExL2Fkdjc1MTEuaCBiL2RyaXZlcnMvZ3B1L2RybS9icmlk Z2UvYWR2NzUxMS9hZHY3NTExLmgKaW5kZXggOTkyZDc2Yy4uMDM5Njc5MSAxMDA2NDQKLS0tIGEv ZHJpdmVycy9ncHUvZHJtL2JyaWRnZS9hZHY3NTExL2Fkdjc1MTEuaAorKysgYi9kcml2ZXJzL2dw dS9kcm0vYnJpZGdlL2Fkdjc1MTEvYWR2NzUxMS5oCkBAIC0zMTcsNiArMzE3LDggQEAgc3RydWN0 IGFkdjc1MTEgewogCWJvb2wgZWRpZF9yZWFkOwogCiAJd2FpdF9xdWV1ZV9oZWFkX3Qgd3E7CisJ c3RydWN0IHdvcmtfc3RydWN0IGhwZF93b3JrOworCiAJc3RydWN0IGRybV9icmlkZ2UgYnJpZGdl OwogCXN0cnVjdCBkcm1fY29ubmVjdG9yIGNvbm5lY3RvcjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVy cy9ncHUvZHJtL2JyaWRnZS9hZHY3NTExL2Fkdjc1MTFfZHJ2LmMgYi9kcml2ZXJzL2dwdS9kcm0v YnJpZGdlL2Fkdjc1MTEvYWR2NzUxMV9kcnYuYwppbmRleCA4ZGJhNzI5Li40ZmNlYTQ0IDEwMDY0 NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vYnJpZGdlL2Fkdjc1MTEvYWR2NzUxMV9kcnYuYworKysg Yi9kcml2ZXJzL2dwdS9kcm0vYnJpZGdlL2Fkdjc1MTEvYWR2NzUxMV9kcnYuYwpAQCAtNDAyLDYg KzQwMiwxMyBAQCBzdGF0aWMgYm9vbCBhZHY3NTExX2hwZChzdHJ1Y3QgYWR2NzUxMSAqYWR2NzUx MSkKIAlyZXR1cm4gZmFsc2U7CiB9CiAKK3N0YXRpYyB2b2lkIGFkdjc1MTFfaHBkX3dvcmsoc3Ry dWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBhZHY3NTExICphZHY3NTExID0gY29u dGFpbmVyX29mKHdvcmssIHN0cnVjdCBhZHY3NTExLCBocGRfd29yayk7CisKKwlkcm1faGVscGVy X2hwZF9pcnFfZXZlbnQoYWR2NzUxMS0+Y29ubmVjdG9yLmRldik7Cit9CisKIHN0YXRpYyBpbnQg YWR2NzUxMV9pcnFfcHJvY2VzcyhzdHJ1Y3QgYWR2NzUxMSAqYWR2NzUxMSwgYm9vbCBwcm9jZXNz X2hwZCkKIHsKIAl1bnNpZ25lZCBpbnQgaXJxMCwgaXJxMTsKQEAgLTQxOSw3ICs0MjYsNyBAQCBz dGF0aWMgaW50IGFkdjc1MTFfaXJxX3Byb2Nlc3Moc3RydWN0IGFkdjc1MTEgKmFkdjc1MTEsIGJv b2wgcHJvY2Vzc19ocGQpCiAJcmVnbWFwX3dyaXRlKGFkdjc1MTEtPnJlZ21hcCwgQURWNzUxMV9S RUdfSU5UKDEpLCBpcnExKTsKIAogCWlmIChwcm9jZXNzX2hwZCAmJiBpcnEwICYgQURWNzUxMV9J TlQwX0hQRCAmJiBhZHY3NTExLT5icmlkZ2UuZW5jb2RlcikKLQkJZHJtX2hlbHBlcl9ocGRfaXJx X2V2ZW50KGFkdjc1MTEtPmNvbm5lY3Rvci5kZXYpOworCQlzY2hlZHVsZV93b3JrKCZhZHY3NTEx LT5ocGRfd29yayk7CiAKIAlpZiAoaXJxMCAmIEFEVjc1MTFfSU5UMF9FRElEX1JFQURZIHx8IGly cTEgJiBBRFY3NTExX0lOVDFfRERDX0VSUk9SKSB7CiAJCWFkdjc1MTEtPmVkaWRfcmVhZCA9IHRy dWU7CkBAIC0xMDA2LDYgKzEwMTMsOCBAQCBzdGF0aWMgaW50IGFkdjc1MTFfcHJvYmUoc3RydWN0 IGkyY19jbGllbnQgKmkyYywgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQogCQkJZ290 byBlcnJfaTJjX3VucmVnaXN0ZXJfZWRpZDsKIAl9CiAKKwlJTklUX1dPUksoJmFkdjc1MTEtPmhw ZF93b3JrLCBhZHY3NTExX2hwZF93b3JrKTsKKwogCWlmIChpMmMtPmlycSkgewogCQlpbml0X3dh aXRxdWV1ZV9oZWFkKCZhZHY3NTExLT53cSk7CiAKLS0gCjIuNy40CgpfX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpkcmktZGV2ZWwgbWFpbGluZyBsaXN0CmRy aS1kZXZlbEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5v cmcvbWFpbG1hbi9saXN0aW5mby9kcmktZGV2ZWwK From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S965738AbdACTmI (ORCPT ); Tue, 3 Jan 2017 14:42:08 -0500 Received: from mail-pg0-f53.google.com ([74.125.83.53]:34584 "EHLO mail-pg0-f53.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S935060AbdACTlw (ORCPT ); Tue, 3 Jan 2017 14:41:52 -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: [PATCH 1/5 v3] drm/bridge: adv7511: Use work_struct to defer hotplug handing to out of irq context Date: Tue, 3 Jan 2017 11:41:38 -0800 Message-Id: <1483472502-16403-2-git-send-email-john.stultz@linaro.org> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1483472502-16403-1-git-send-email-john.stultz@linaro.org> References: <1483472502-16403-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 Reviewed-by: Laurent Pinchart Signed-off-by: John Stultz --- v3: Rename irq_work to hpd_work and remove extra whitespace, as suggested by Laurent drivers/gpu/drm/bridge/adv7511/adv7511.h | 2 ++ drivers/gpu/drm/bridge/adv7511/adv7511_drv.c | 11 ++++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/bridge/adv7511/adv7511.h b/drivers/gpu/drm/bridge/adv7511/adv7511.h index 992d76c..0396791 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 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..4fcea44 100644 --- a/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c +++ b/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c @@ -402,6 +402,13 @@ static bool adv7511_hpd(struct adv7511 *adv7511) return false; } +static void adv7511_hpd_work(struct work_struct *work) +{ + struct adv7511 *adv7511 = container_of(work, struct adv7511, hpd_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 +426,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->hpd_work); if (irq0 & ADV7511_INT0_EDID_READY || irq1 & ADV7511_INT1_DDC_ERROR) { adv7511->edid_read = true; @@ -1006,6 +1013,8 @@ static int adv7511_probe(struct i2c_client *i2c, const struct i2c_device_id *id) goto err_i2c_unregister_edid; } + INIT_WORK(&adv7511->hpd_work, adv7511_hpd_work); + if (i2c->irq) { init_waitqueue_head(&adv7511->wq); -- 2.7.4