From: Yashas D <y-d@ti.com>
To: Douglas Anderson <dianders@chromium.org>
Cc: 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>,
Luca Ceresoli <luca.ceresoli@bootlin.com>,
Maarten Lankhorst <maarten.lankhorst@linux.intel.com>,
Maxime Ripard <mripard@kernel.org>,
Thomas Zimmermann <tzimmermann@suse.de>,
David Airlie <airlied@gmail.com>, Simona Vetter <simona@ffwll.ch>,
<u-kumar1@ti.com>, <devarsht@ti.com>, <s-jain1@ti.com>,
<d-mittal@ti.com>, <b-padhi@ti.com>,
<dri-devel@lists.freedesktop.org>, <linux-kernel@vger.kernel.org>
Subject: [PATCH 1/2] drm/bridge: ti-sn65dsi86: improve HPD interrupt handling
Date: Fri, 14 Aug 2026 17:33:03 +0530 [thread overview]
Message-ID: <20260814120304.887993-2-y-d@ti.com> (raw)
In-Reply-To: <20260814120304.887993-1-y-d@ti.com>
Fix the interrupt handler to clear all three IRQ status registers
to fully de-assert the IRQ pin, enable replug event detection, and
use per-connector hotplug notification instead of polling all
connectors on every DP HPD event.
Signed-off-by: Yashas D <y-d@ti.com>
---
drivers/gpu/drm/bridge/ti-sn65dsi86.c | 34 ++++++++++++++++++++-------
1 file changed, 25 insertions(+), 9 deletions(-)
diff --git a/drivers/gpu/drm/bridge/ti-sn65dsi86.c b/drivers/gpu/drm/bridge/ti-sn65dsi86.c
index 48b83df9aed6..d9bd4ef8f0e2 100644
--- a/drivers/gpu/drm/bridge/ti-sn65dsi86.c
+++ b/drivers/gpu/drm/bridge/ti-sn65dsi86.c
@@ -113,14 +113,19 @@
#define SN_IRQ_EVENTS_EN_REG 0xE6
#define HPD_INSERTION_EN BIT(1)
#define HPD_REMOVAL_EN BIT(2)
+#define HPD_REPLUG_EN BIT(3)
#define SN_AUX_CMD_STATUS_REG 0xF4
#define AUX_IRQ_STATUS_AUX_RPLY_TOUT BIT(3)
#define AUX_IRQ_STATUS_AUX_SHORT BIT(5)
#define AUX_IRQ_STATUS_NAT_I2C_FAIL BIT(6)
#define SN_IRQ_STATUS_REG 0xF5
+#define HPD_REPLUG_STATUS BIT(3)
#define HPD_REMOVAL_STATUS BIT(2)
#define HPD_INSERTION_STATUS BIT(1)
+/* General IRQ status registers, write-1-to-clear */
+#define SN_IRQ_STATUS2_REG 0xF0
+#define SN_IRQ_STATUS3_REG 0xF2
#define MIN_DSI_CLK_FREQ_MHZ 40
@@ -1266,7 +1271,7 @@ static void ti_sn_bridge_hpd_enable(struct drm_bridge *bridge)
if (client->irq) {
ret = regmap_set_bits(pdata->regmap, SN_IRQ_EVENTS_EN_REG,
- HPD_REMOVAL_EN | HPD_INSERTION_EN);
+ HPD_REMOVAL_EN | HPD_INSERTION_EN | HPD_REPLUG_EN);
if (ret)
dev_err(pdata->dev, "Failed to enable HPD events: %d\n", ret);
}
@@ -1280,7 +1285,7 @@ static void ti_sn_bridge_hpd_disable(struct drm_bridge *bridge)
if (client->irq) {
ret = regmap_clear_bits(pdata->regmap, SN_IRQ_EVENTS_EN_REG,
- HPD_REMOVAL_EN | HPD_INSERTION_EN);
+ HPD_REMOVAL_EN | HPD_INSERTION_EN | HPD_REPLUG_EN);
if (ret)
dev_err(pdata->dev, "Failed to disable HPD events: %d\n", ret);
}
@@ -1376,7 +1381,6 @@ static int ti_sn_bridge_parse_dsi_host(struct ti_sn65dsi86 *pdata)
static irqreturn_t ti_sn_bridge_interrupt(int irq, void *private)
{
struct ti_sn65dsi86 *pdata = private;
- struct drm_device *dev = pdata->bridge.dev;
u8 status;
int ret;
bool hpd_event;
@@ -1387,23 +1391,35 @@ static irqreturn_t ti_sn_bridge_interrupt(int irq, void *private)
return IRQ_NONE;
}
- hpd_event = status & (HPD_REMOVAL_STATUS | HPD_INSERTION_STATUS);
+ hpd_event = status & (HPD_REMOVAL_STATUS | HPD_INSERTION_STATUS |
+ HPD_REPLUG_STATUS);
dev_dbg(pdata->dev, "(SN_IRQ_STATUS_REG = %#x)\n", status);
if (!status)
return IRQ_NONE;
- ret = regmap_write(pdata->regmap, SN_IRQ_STATUS_REG, status);
+ /*
+ * Clear all three IRQ status registers to fully de-assert
+ * the IRQ pin
+ */
+ ret = regmap_write(pdata->regmap, SN_IRQ_STATUS2_REG, 0xFF);
+ ret |= regmap_write(pdata->regmap, SN_IRQ_STATUS3_REG, 0xFF);
+ ret |= regmap_write(pdata->regmap, SN_IRQ_STATUS_REG, status);
if (ret) {
dev_err(pdata->dev, "Failed to clear IRQ status: %d\n", ret);
return IRQ_NONE;
}
- /* Only send the HPD event if we are bound with a device. */
+ /* Notify only the DP connector, not all connectors on the device. */
mutex_lock(&pdata->hpd_mutex);
- if (pdata->hpd_enabled && hpd_event)
- drm_kms_helper_hotplug_event(dev);
- mutex_unlock(&pdata->hpd_mutex);
+ if (pdata->hpd_enabled && hpd_event && pdata->bridge.hpd_data) {
+ struct drm_connector *connector =
+ (struct drm_connector *)pdata->bridge.hpd_data;
+ mutex_unlock(&pdata->hpd_mutex);
+ drm_connector_helper_hpd_irq_event(connector);
+ } else {
+ mutex_unlock(&pdata->hpd_mutex);
+ }
return IRQ_HANDLED;
}
--
2.34.1
next prev parent reply other threads:[~2026-08-14 12:04 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-14 12:03 [PATCH 0/2] Recover DP output after a cable replug Yashas D
2026-08-14 12:03 ` Yashas D [this message]
2026-08-14 12:19 ` [PATCH 1/2] drm/bridge: ti-sn65dsi86: improve HPD interrupt handling sashiko-bot
2026-08-14 12:03 ` [PATCH 2/2] drm/bridge: ti-sn65dsi86: retrain DP link directly on cable replug Yashas D
2026-08-14 12:14 ` sashiko-bot
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=20260814120304.887993-2-y-d@ti.com \
--to=y-d@ti.com \
--cc=Laurent.pinchart@ideasonboard.com \
--cc=airlied@gmail.com \
--cc=andrzej.hajda@intel.com \
--cc=b-padhi@ti.com \
--cc=d-mittal@ti.com \
--cc=devarsht@ti.com \
--cc=dianders@chromium.org \
--cc=dri-devel@lists.freedesktop.org \
--cc=jernej.skrabec@gmail.com \
--cc=jonas@kwiboo.se \
--cc=linux-kernel@vger.kernel.org \
--cc=luca.ceresoli@bootlin.com \
--cc=maarten.lankhorst@linux.intel.com \
--cc=mripard@kernel.org \
--cc=neil.armstrong@linaro.org \
--cc=rfoss@kernel.org \
--cc=s-jain1@ti.com \
--cc=simona@ffwll.ch \
--cc=tzimmermann@suse.de \
--cc=u-kumar1@ti.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.