Message ID | 20240228113737.43434-1-aford173@gmail.com |
---|---|
State | New |
Headers |
Return-Path: <linux-kernel+bounces-84933-ouuuleilei=gmail.com@vger.kernel.org> Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:7300:a81b:b0:108:e6aa:91d0 with SMTP id bq27csp3293648dyb; Wed, 28 Feb 2024 03:56:44 -0800 (PST) X-Forwarded-Encrypted: i=3; AJvYcCUiRveJ2IB8IKWU0D74+tVRWWLaeptCFBdB9dmNQJIEldWQVGQlgxThrcFchyjM9jHYQnmnP8XOytfHC1IN3oNzzDkH9g== X-Google-Smtp-Source: AGHT+IGrIryH0etTRckv+Zo5S20A8G3RMm+DHwC9Bht/pqXFLvpEqLCIyFuTHsvFZRoRUCehb+rl X-Received: by 2002:a05:6808:11c1:b0:3c1:78b0:9ce1 with SMTP id p1-20020a05680811c100b003c178b09ce1mr5855748oiv.13.1709121404229; Wed, 28 Feb 2024 03:56:44 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1709121404; cv=pass; d=google.com; s=arc-20160816; b=YxzW0a7Wu08jn4KlZOT9KanCXJ90lX6REtA/raiq1cMZMmzczB/gorLxzLXWKiWthU zgPkpSVg+Ts8KIxFfvPRAurOryGwqq/G+uCX/pi8kEXtEnsBUesCsTJ+mwfTqzntv9DG 2fF1EUenM6dKwgZpGBynueSevl7OifG1DzkGF4V4YO6DqFFrP0j9OjcztbN5cNlwTtfR uPASyfvDMzpK8SYIXKrGr6C6eI6LndFOtaGnOcV90MnRMYfHG4kRutMc1Wtypk6R9PUD x98dtCbibsBUKEurQVLXZVVTQKiP92zIzApC+l0n30EYDmGIJA7ZG07HieyIPOtQnVgq hfSA== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:message-id:date:subject:cc:to :from:dkim-signature; bh=hFtrXUgWnMJ9NQ2PU+2dtB8bMmOfzlQTR6EQYNPIXm0=; fh=vkfo45ybK41+RRxVPHRXa/M8jNgQA3Q0PEC71Q8BKBU=; b=yP6qHdMkORGKiW50XylG/U6THvN7ey4Rtq4c5thMV1aSjn+/i0R8Yoi1VWTSdlhyZb nYiHLXBZEGx5SxvVAa+0NTn2josiOohr5+5KNI6njluvB8PRgI/Ayw7D8RB+RS51DIsw tlZkYsMvrHPCkjCLxNmcJ5I9LKyHzzeuVGdC8N6p5QtmvfwnB1hZTDg2e3W0YzA1QBJ+ jaxlyiO9jzEVgF9u64byoa0IFvPq3gfzaIlVjuMMNgj4IEbY3ifOW4rRu7GYEyBCLGM8 6e+51N079UqejzNevZoi4Yjeik86rub0NT2PVJBOGRfKi7KAyxQy4YRNepnx3iLUsdlx yvkQ==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@gmail.com header.s=20230601 header.b=E9U09kjr; arc=pass (i=1 spf=pass spfdomain=gmail.com dkim=pass dkdomain=gmail.com dmarc=pass fromdomain=gmail.com); spf=pass (google.com: domain of linux-kernel+bounces-84933-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:45e3:2400::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-84933-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from sv.mirrors.kernel.org (sv.mirrors.kernel.org. [2604:1380:45e3:2400::1]) by mx.google.com with ESMTPS id q29-20020aa7983d000000b006e55d7b6ebcsi1338676pfl.118.2024.02.28.03.56.44 for <ouuuleilei@gmail.com> (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 28 Feb 2024 03:56:44 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-84933-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:45e3:2400::1 as permitted sender) client-ip=2604:1380:45e3:2400::1; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20230601 header.b=E9U09kjr; arc=pass (i=1 spf=pass spfdomain=gmail.com dkim=pass dkdomain=gmail.com dmarc=pass fromdomain=gmail.com); spf=pass (google.com: domain of linux-kernel+bounces-84933-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:45e3:2400::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-84933-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sv.mirrors.kernel.org (Postfix) with ESMTPS id AD50728674D for <ouuuleilei@gmail.com>; Wed, 28 Feb 2024 11:45:28 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 5933415AAD8; Wed, 28 Feb 2024 11:37:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="E9U09kjr" Received: from mail-io1-f42.google.com (mail-io1-f42.google.com [209.85.166.42]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 449FE12CD87; Wed, 28 Feb 2024 11:37:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.166.42 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709120268; cv=none; b=n+w3HoWSfR/m1U+HuK6KLs26/nwe+8a5l49wvh/E5DgZj9J37h68tjCcQxsJhwzrxBQGSBf+V/tpvbNGI7LQ6NupWJS236ON8FTSTIstA7RfIuNRQwH1d6h5xap/tPYQwEmJ1anKGtnmslS3LI6P6WZEQfSRxEk9XXYc545gxm8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709120268; c=relaxed/simple; bh=WscMPhRz3gtDrK0zadY+NG7FINr3PhPGV9Yb7XNaQno=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=YXKqDTKDUDM6fabHxKLo6b8ccHLFYNOb3YLIxHXdqoiTdtgyNnmgLnqIe02U2TNkU7SjKfCHMOg1BN+GkRquskLoGqGD1L1MXc8lucSoUNPl73dfNO7lWmGsGV3+qVi2jXdWo+xDqfBb9Zj1sb/LHLpNpnwlHBfXapAfqy/hLJQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=E9U09kjr; arc=none smtp.client-ip=209.85.166.42 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Received: by mail-io1-f42.google.com with SMTP id ca18e2360f4ac-7c403dbf3adso285128639f.1; Wed, 28 Feb 2024 03:37:47 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1709120266; x=1709725066; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=hFtrXUgWnMJ9NQ2PU+2dtB8bMmOfzlQTR6EQYNPIXm0=; b=E9U09kjrxCnTAMKfM/3tQZcZAODujfQk0CiKqFQxS89kYTlhBX7j+nbbRxjKv6KKKx 01q2GrBCE2xE7bn+NOmR6pKqX6kJQNwKTNNLz0MbSNta6CxdRgWB5Z0NJkkMlC7M/BKc TLf5pRCwu9Lp9z14o7BEigk82g88cMSHiSPwboZ3EtJ+MoqQWMA6oMYbwP5RaXau1vAL hR3/OmpHHWXXncIlD/uxQkjCH9J+snDhbxpSPz2NFtRq09WqYjLNhmoUmeZZ88h3OKAt qH582CCx5WGMg5IaXL3poNF/Rr6Ovp6XQ4oFb8TeMdm9Epkszs1s7VlZJUNtAnr7nP/w Htxg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1709120266; x=1709725066; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=hFtrXUgWnMJ9NQ2PU+2dtB8bMmOfzlQTR6EQYNPIXm0=; b=NTtmiHqt28MPalLYpvduDbCdCtR6aqXwG9YaOx6eOFtpWj2Efte0/jSgSPGv680X1h 3xCOYn0p1naYvtjpFWCD0LC9Xe50+X/uL9VpIE4oFrOe4loBKhqUDJl7jUinVOSmbRge 7gtckZdrCF+Qi+OlNvGk7D8QkcqVonfE+qI33NSCeC1SjDaSZmN3PyKYykuNWbr3nIUd 09wXHlMc310Nk4wj+dF5laVwINR4UaxLRTmZulXuMwj1MqpG4LtCllm1SqBkjbYuM468 aBdPJPoHrDzuAAjY04gX+CTNXHXfoPXJquU7jkpdcgV4AHZ3n7dZnU30UG7JAoOTBP1w ejfg== X-Forwarded-Encrypted: i=1; AJvYcCUOVYczXvbTfxcz8Fp7gdJOEX+au7gMbSJJ0Q4ECrH+20uKklR4425RdMH/AiNSX9vSbGyAwsZJlAa3jrepbP81bCKLyAIv2Eikqm8mXqKtU5gWpraNrcTBEHEskV3Lw6a8ErWAwlkb0Q== X-Gm-Message-State: AOJu0Yxpb7Pef+BunyjDUWM3lB/PMx6JFycd3GjIrOOOPLCjoaqhU0zO FcnXokDKYPpO3c1Vr1TMQQg5OsuWfggsd2BU/LZM9a98PI0l+OeI X-Received: by 2002:a5e:8f01:0:b0:7c7:fc3e:6f1b with SMTP id c1-20020a5e8f01000000b007c7fc3e6f1bmr967586iok.7.1709120266374; Wed, 28 Feb 2024 03:37:46 -0800 (PST) Received: from aford-System-Version.lan ([2601:447:d002:5be:abe6:89f4:1061:8343]) by smtp.gmail.com with ESMTPSA id k6-20020a02c646000000b004747d876aefsm1833147jan.6.2024.02.28.03.37.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 28 Feb 2024 03:37:45 -0800 (PST) From: Adam Ford <aford173@gmail.com> To: dri-devel@lists.freedesktop.org, linux-arm-kernel@lists.infradead.org Cc: aford@beaconembedded.com, Adam Ford <aford173@gmail.com>, Rob Herring <robh@kernel.org>, Krzysztof Kozlowski <krzysztof.kozlowski+dt@linaro.org>, Conor Dooley <conor+dt@kernel.org>, Shawn Guo <shawnguo@kernel.org>, Sascha Hauer <s.hauer@pengutronix.de>, Pengutronix Kernel Team <kernel@pengutronix.de>, Fabio Estevam <festevam@gmail.com>, Andrzej Hajda <andrzej.hajda@intel.com>, Neil Armstrong <neil.armstrong@linaro.org>, Robert Foss <rfoss@kernel.org>, Laurent Pinchart <Laurent.pinchart@ideasonboard.com>, Jonas Karlman <jonas@kwiboo.se>, Jernej Skrabec <jernej.skrabec@gmail.com>, Maarten Lankhorst <maarten.lankhorst@linux.intel.com>, Maxime Ripard <mripard@kernel.org>, Thomas Zimmermann <tzimmermann@suse.de>, David Airlie <airlied@gmail.com>, Daniel Vetter <daniel@ffwll.ch>, devicetree@vger.kernel.org, imx@lists.linux.dev, linux-kernel@vger.kernel.org Subject: [PATCH 1/2] drm/bridge: adv7511: Allow IRQ to share GPIO pins Date: Wed, 28 Feb 2024 05:37:35 -0600 Message-ID: <20240228113737.43434-1-aford173@gmail.com> X-Mailer: git-send-email 2.43.0 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: <linux-kernel.vger.kernel.org> List-Subscribe: <mailto:linux-kernel+subscribe@vger.kernel.org> List-Unsubscribe: <mailto:linux-kernel+unsubscribe@vger.kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1792143685617366281 X-GMAIL-MSGID: 1792143685617366281 |
Series |
[1/2] drm/bridge: adv7511: Allow IRQ to share GPIO pins
|
|
Commit Message
Adam Ford
Feb. 28, 2024, 11:37 a.m. UTC
The IRQ registration currently assumes that the GPIO is
dedicated to it, but that may not necessarily be the case.
If the board has another device sharing the IRQ, it won't be
registered and the hot-plug detect fails. This is easily
fixed by add the IRQF_SHARED flag.
Signed-off-by: Adam Ford <aford173@gmail.com>
Comments
Hi Adam, Thank you for the patch. On Wed, Feb 28, 2024 at 05:37:35AM -0600, Adam Ford wrote: > The IRQ registration currently assumes that the GPIO is > dedicated to it, but that may not necessarily be the case. > If the board has another device sharing the IRQ, it won't be > registered and the hot-plug detect fails. This is easily > fixed by add the IRQF_SHARED flag. > > Signed-off-by: Adam Ford <aford173@gmail.com> > > diff --git a/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c b/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c > index b5518ff97165..21f08b2ae265 100644 > --- a/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c > +++ b/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c > @@ -1318,7 +1318,8 @@ static int adv7511_probe(struct i2c_client *i2c) > > ret = devm_request_threaded_irq(dev, i2c->irq, NULL, > adv7511_irq_handler, > - IRQF_ONESHOT, dev_name(dev), > + IRQF_ONESHOT | IRQF_SHARED, > + dev_name(dev), This looks fine, but the IRQ handler doesn't. static int adv7511_irq_process(struct adv7511 *adv7511, bool process_hpd) { unsigned int irq0, irq1; int ret; ret = regmap_read(adv7511->regmap, ADV7511_REG_INT(0), &irq0); if (ret < 0) return ret; ret = regmap_read(adv7511->regmap, ADV7511_REG_INT(1), &irq1); if (ret < 0) return ret; regmap_write(adv7511->regmap, ADV7511_REG_INT(0), irq0); regmap_write(adv7511->regmap, ADV7511_REG_INT(1), irq1); if (process_hpd && irq0 & ADV7511_INT0_HPD && adv7511->bridge.encoder) schedule_work(&adv7511->hpd_work); if (irq0 & ADV7511_INT0_EDID_READY || irq1 & ADV7511_INT1_DDC_ERROR) { adv7511->edid_read = true; if (adv7511->i2c_main->irq) wake_up_all(&adv7511->wq); } #ifdef CONFIG_DRM_I2C_ADV7511_CEC adv7511_cec_irq_process(adv7511, irq1); #endif return 0; } static irqreturn_t adv7511_irq_handler(int irq, void *devid) { struct adv7511 *adv7511 = devid; int ret; ret = adv7511_irq_process(adv7511, true); return ret < 0 ? IRQ_NONE : IRQ_HANDLED; } The function will return IRQ_HANDLED as long as the registers can be read, even if they don't report any interrupt. > adv7511); > if (ret) > goto err_unregister_audio;
On Wed, Feb 28, 2024 at 10:31 AM Laurent Pinchart <laurent.pinchart@ideasonboard.com> wrote: > > Hi Adam, > > Thank you for the patch. > > On Wed, Feb 28, 2024 at 05:37:35AM -0600, Adam Ford wrote: > > The IRQ registration currently assumes that the GPIO is > > dedicated to it, but that may not necessarily be the case. > > If the board has another device sharing the IRQ, it won't be > > registered and the hot-plug detect fails. This is easily > > fixed by add the IRQF_SHARED flag. > > > > Signed-off-by: Adam Ford <aford173@gmail.com> > > > > diff --git a/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c b/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c > > index b5518ff97165..21f08b2ae265 100644 > > --- a/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c > > +++ b/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c > > @@ -1318,7 +1318,8 @@ static int adv7511_probe(struct i2c_client *i2c) > > > > ret = devm_request_threaded_irq(dev, i2c->irq, NULL, > > adv7511_irq_handler, > > - IRQF_ONESHOT, dev_name(dev), > > + IRQF_ONESHOT | IRQF_SHARED, > > + dev_name(dev), > > This looks fine, but the IRQ handler doesn't. Thanks for the review. > > static int adv7511_irq_process(struct adv7511 *adv7511, bool process_hpd) > { > unsigned int irq0, irq1; > int ret; > > ret = regmap_read(adv7511->regmap, ADV7511_REG_INT(0), &irq0); > if (ret < 0) > return ret; > > ret = regmap_read(adv7511->regmap, ADV7511_REG_INT(1), &irq1); > if (ret < 0) > return ret; If I did a check here and returned if there was no IRQ to handle, would that be sufficient? --- a/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c +++ b/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c @@ -477,6 +477,11 @@ static int adv7511_irq_process(struct adv7511 *adv7511, bool process_hpd) if (ret < 0) return ret; + /* If there is no IRQ to handle, exit indicating no IRQ handled */ + if (!(irq0 & (ADV7511_INT0_HPD | ADV7511_INT0_EDID_READY)) && + !(irq1 & ADV7511_INT1_DDC_ERROR)) + return -1; + regmap_write(adv7511->regmap, ADV7511_REG_INT(0), irq0); regmap_write(adv7511->regmap, ADV7511_REG_INT(1), irq1); With this, I would expect adv7511_irq_handler to return IRQ_NONE. If you're OK with that approach, I can do that. If you want me to merge adv7511_irq_handler, and adv7511_irq_process, I can do that too to make the return codes a little more intuitive. adam > > regmap_write(adv7511->regmap, ADV7511_REG_INT(0), irq0); > regmap_write(adv7511->regmap, ADV7511_REG_INT(1), irq1); > > if (process_hpd && irq0 & ADV7511_INT0_HPD && adv7511->bridge.encoder) > schedule_work(&adv7511->hpd_work); > > if (irq0 & ADV7511_INT0_EDID_READY || irq1 & ADV7511_INT1_DDC_ERROR) { > adv7511->edid_read = true; > > if (adv7511->i2c_main->irq) > wake_up_all(&adv7511->wq); > } > > #ifdef CONFIG_DRM_I2C_ADV7511_CEC > adv7511_cec_irq_process(adv7511, irq1); > #endif > > return 0; > } > > static irqreturn_t adv7511_irq_handler(int irq, void *devid) > { > struct adv7511 *adv7511 = devid; > int ret; > > ret = adv7511_irq_process(adv7511, true); > return ret < 0 ? IRQ_NONE : IRQ_HANDLED; > } > > The function will return IRQ_HANDLED as long as the registers can be > read, even if they don't report any interrupt. > > > adv7511); > > if (ret) > > goto err_unregister_audio; > > -- > Regards, > > Laurent Pinchart
On Sun, Mar 03, 2024 at 09:44:03AM -0600, Adam Ford wrote: > On Wed, Feb 28, 2024 at 10:31 AM Laurent Pinchart wrote: > > On Wed, Feb 28, 2024 at 05:37:35AM -0600, Adam Ford wrote: > > > The IRQ registration currently assumes that the GPIO is > > > dedicated to it, but that may not necessarily be the case. > > > If the board has another device sharing the IRQ, it won't be > > > registered and the hot-plug detect fails. This is easily > > > fixed by add the IRQF_SHARED flag. > > > > > > Signed-off-by: Adam Ford <aford173@gmail.com> > > > > > > diff --git a/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c b/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c > > > index b5518ff97165..21f08b2ae265 100644 > > > --- a/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c > > > +++ b/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c > > > @@ -1318,7 +1318,8 @@ static int adv7511_probe(struct i2c_client *i2c) > > > > > > ret = devm_request_threaded_irq(dev, i2c->irq, NULL, > > > adv7511_irq_handler, > > > - IRQF_ONESHOT, dev_name(dev), > > > + IRQF_ONESHOT | IRQF_SHARED, > > > + dev_name(dev), > > > > This looks fine, but the IRQ handler doesn't. > > Thanks for the review. > > > static int adv7511_irq_process(struct adv7511 *adv7511, bool process_hpd) > > { > > unsigned int irq0, irq1; > > int ret; > > > > ret = regmap_read(adv7511->regmap, ADV7511_REG_INT(0), &irq0); > > if (ret < 0) > > return ret; > > > > ret = regmap_read(adv7511->regmap, ADV7511_REG_INT(1), &irq1); > > if (ret < 0) > > return ret; > > If I did a check here and returned if there was no IRQ to handle, > would that be sufficient? > > --- a/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c > +++ b/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c > @@ -477,6 +477,11 @@ static int adv7511_irq_process(struct adv7511 > *adv7511, bool process_hpd) > if (ret < 0) > return ret; > > + /* If there is no IRQ to handle, exit indicating no IRQ handled */ > + if (!(irq0 & (ADV7511_INT0_HPD | ADV7511_INT0_EDID_READY)) && > + !(irq1 & ADV7511_INT1_DDC_ERROR)) If these are the only interrupt sources that the driver enables, this is fine. > + return -1; Maybe a defined error code instead ? > + > regmap_write(adv7511->regmap, ADV7511_REG_INT(0), irq0); > regmap_write(adv7511->regmap, ADV7511_REG_INT(1), irq1); > > With this, I would expect adv7511_irq_handler to return IRQ_NONE. If > you're OK with that approach, I can do that. If you want me to merge > adv7511_irq_handler, and adv7511_irq_process, I can do that too to > make the return codes a little more intuitive. > > > > > regmap_write(adv7511->regmap, ADV7511_REG_INT(0), irq0); > > regmap_write(adv7511->regmap, ADV7511_REG_INT(1), irq1); > > > > if (process_hpd && irq0 & ADV7511_INT0_HPD && adv7511->bridge.encoder) > > schedule_work(&adv7511->hpd_work); > > > > if (irq0 & ADV7511_INT0_EDID_READY || irq1 & ADV7511_INT1_DDC_ERROR) { > > adv7511->edid_read = true; > > > > if (adv7511->i2c_main->irq) > > wake_up_all(&adv7511->wq); > > } > > > > #ifdef CONFIG_DRM_I2C_ADV7511_CEC > > adv7511_cec_irq_process(adv7511, irq1); > > #endif > > > > return 0; > > } > > > > static irqreturn_t adv7511_irq_handler(int irq, void *devid) > > { > > struct adv7511 *adv7511 = devid; > > int ret; > > > > ret = adv7511_irq_process(adv7511, true); > > return ret < 0 ? IRQ_NONE : IRQ_HANDLED; > > } > > > > The function will return IRQ_HANDLED as long as the registers can be > > read, even if they don't report any interrupt. > > > > > adv7511); > > > if (ret) > > > goto err_unregister_audio;
diff --git a/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c b/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c index b5518ff97165..21f08b2ae265 100644 --- a/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c +++ b/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c @@ -1318,7 +1318,8 @@ static int adv7511_probe(struct i2c_client *i2c) ret = devm_request_threaded_irq(dev, i2c->irq, NULL, adv7511_irq_handler, - IRQF_ONESHOT, dev_name(dev), + IRQF_ONESHOT | IRQF_SHARED, + dev_name(dev), adv7511); if (ret) goto err_unregister_audio;