From nobody Fri Oct 2 01:13:04 2026 Received: from bali.collaboradmins.com (bali.collaboradmins.com [148.251.105.195]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 94DFA480DC9; Thu, 6 Aug 2026 17:02:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.251.105.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786035756; cv=none; b=kVD+YutNkHWpgB8g7YzbefTQ1Z0veQbIDDSJTXgLn2F7mvre8jQJgm6yOF/Nk8wmXISUTEWeBPw1cOk9YZE1lh2BSsn2aUeUF/UmP98ssNpddADHhC/Rb/qwtrsb8dsnlXFDkljT4riqB05dlU4GA5nBTOVLTH8EnV4l33HWU10= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786035756; c=relaxed/simple; bh=+kI5bMPxmKszrrlmZRhrrwGKt5vlPS+riQK99NPB3wM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Nn1Ul+UhQI8LL3tYmvl4adcjf1ItJo3uMg1mtd9jGxJTSo3Mx0mU0NrI0XZToM/SbqrR5M31wbZMRqL29PL0QYrru5uulQPkSTFU5mOCwjgwv53PYmfdHEC6a2X/iqoVdOygwxhfHyplyzFxQ5BrUFWAph5ifpytXmOFLFf6MDM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b=Wxigxzgj; arc=none smtp.client-ip=148.251.105.195 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=collabora.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="Wxigxzgj" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1786035745; bh=+kI5bMPxmKszrrlmZRhrrwGKt5vlPS+riQK99NPB3wM=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=WxigxzgjOEdfvfqAUaBwr6+cyQ6UbZVB+m1NJdTljCFDthWNj+6F7izNFE7t76Lmf GNiBWBXI1GlruQVzEoavgsdmu1xgW+VuMZ10sn1sDrVLAkf0ZDPKJcb46DpM6DXbHt Fh/wZZ7MhSYlydpB+Gt/xqxPUn0gXTX9GhsD9DJhkEUumAPGaWJnc9nvmtDc2EKlwK YZb0+EeYUzeupaYGOxGKOFUxz6sOSojijfV0T7tif6hPmIBLN4od7frV9SR8OcDwSZ Ht14q/m4HoWNXplMpJoB53mGkGkqnNZlT6RfBM0EEoe16N+tyFOPv2vVnlhJds45Ca +BJ1ISUR/fb9Q== Received: from jupiter.universe (unknown [100.64.1.62]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: sre) by bali.collaboradmins.com (Postfix) with ESMTPSA id 43E1B17E0967; Thu, 06 Aug 2026 19:02:25 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id EE235480028; Thu, 06 Aug 2026 19:02:24 +0200 (CEST) From: Sebastian Reichel Date: Thu, 06 Aug 2026 19:02:07 +0200 Subject: [PATCH v11 01/21] drm/bridge: synopsys: dw-dp: Register DP AUX on bridge attach Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260806-synopsys-dw-dp-improvements-v11-1-0d508505f383@collabora.com> References: <20260806-synopsys-dw-dp-improvements-v11-0-0d508505f383@collabora.com> In-Reply-To: <20260806-synopsys-dw-dp-improvements-v11-0-0d508505f383@collabora.com> To: Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Rob Herring , Krzysztof Kozlowski , Conor Dooley , David Airlie , Simona Vetter , Dmitry Baryshkov , Luca Ceresoli , Philipp Zabel Cc: Cristian Ciocaltea , Damon Ding , Dmitry Baryshkov , Alexey Charkov , dri-devel@lists.freedesktop.org, linux-rockchip@lists.infradead.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, kernel@collabora.com, linux-arm-kernel@lists.infradead.org, Sebastian Reichel , Sashiko X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=3652; i=sebastian.reichel@collabora.com; h=from:subject:message-id; bh=+kI5bMPxmKszrrlmZRhrrwGKt5vlPS+riQK99NPB3wM=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGp0viBYkgS88JgmurQUGfLsz3jzVSPVwXMCo P6PYTyUraqu5IkCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqdL4gAAoJENju1/PI O/qaEXUP/jdESHAMkmrA1PyAGWyGAvXRq3YiB2TCBK2nj9h/dJ8r4xNwjYJAuu8dpHzT2bX3C2d rowDBu2Sfa6RI9R5rR/RW/fJ+6qENWPGq/zDL31coEbm6tg7zH1M/ABoR/g1Nx8YCWE5sNvvhxt K225pHGo7Jaen25f1F8jvwLJ5nV9VU+Fy+PrNmvq6aVdWJ3Y4Le2sYWF2Xik63rpnN9dZu7j0S+ gcpnXDJXtGY2fg2ybFJ9XtTzhJuy9krIRdn1UUTOLX38SKQznSoiz+T64g1fHjbJO9BrX8PL6vy GVjKBdb52FVLql8ck2tXZwGJV70l9Sb5O4ALSQHig+I1n2BtIPfoNGYp3FGh4mwPolJsMISlxsz 3sSEmmyR3XsfjIPp3UarYpTs/4DjwR1Ifq3s6zehNZjUWXJ6GTIOLusmaVUseHshuOmWbMo8kVc JXtKt+4ir+iaXRxB0A7E/pxrakurSrtRgXEKwjjChMWEzQ3aryg5KMOI8jAdxlC2rqDtHNk0C5v nETw9sI4V5frhBf8v73HbSdEemuGYC7oF6KjPqf/R7xlPiQDeucUdggc88MVZgTHRaw4lUNioDf 9N+fRn8/Rylt1btr9uIo16pS/iutoeB6rM/5Ko3bjx/TQP+7jxABuO0vBdnDHWF25DocnWHYE7D T0rul8ij23C5JMU8tpxI4dA== X-Developer-Key: i=sebastian.reichel@collabora.com; a=openpgp; fpr=EF660D07463F8B726A795413D8EED7F3C83BFA9A Unregister the DP AUX device at the right spot as documented in the drm_dp_aux_register() function description. This helps that it is only accessed when the DRM device is ready and the bridge is powered and initialized (further fixes are required for that). Fixes: 86eecc3a9c2e ("drm/bridge: synopsys: Add DW DPTX Controller support = library") Reported-by: Sashiko Signed-off-by: Sebastian Reichel Tested-by: Igor Paunovic --- drivers/gpu/drm/bridge/synopsys/dw-dp.c | 55 +++++++++++++++++++++--------= ---- 1 file changed, 35 insertions(+), 20 deletions(-) diff --git a/drivers/gpu/drm/bridge/synopsys/dw-dp.c b/drivers/gpu/drm/brid= ge/synopsys/dw-dp.c index 8b8529e1723c..60feb3d1e14b 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-dp.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-dp.c @@ -1813,7 +1813,36 @@ static struct drm_bridge_state *dw_dp_bridge_atomic_= duplicate_state(struct drm_b return &state->base; } =20 +static int dw_dp_bridge_attach(struct drm_bridge *bridge, + struct drm_encoder *encoder, + enum drm_bridge_attach_flags flags) +{ + struct dw_dp *dp =3D bridge_to_dp(bridge); + struct device *dev =3D dp->dev; + int ret; + + dp->aux.dev =3D dev; + dp->aux.drm_dev =3D encoder->dev; + dp->aux.name =3D dev_name(dev); + dp->aux.transfer =3D dw_dp_aux_transfer; + + ret =3D drm_dp_aux_register(&dp->aux); + if (ret) + dev_err(dev, "Aux register failed: %d\n", ret); + + return ret; +} + +static void dw_dp_bridge_detach(struct drm_bridge *bridge) +{ + struct dw_dp *dp =3D bridge_to_dp(bridge); + + drm_dp_aux_unregister(&dp->aux); +} + static const struct drm_bridge_funcs dw_dp_bridge_funcs =3D { + .attach =3D dw_dp_bridge_attach, + .detach =3D dw_dp_bridge_detach, .atomic_duplicate_state =3D dw_dp_bridge_atomic_duplicate_state, .atomic_destroy_state =3D drm_atomic_helper_bridge_destroy_state, .atomic_create_state =3D drm_atomic_helper_bridge_create_state, @@ -2043,20 +2072,10 @@ struct dw_dp *dw_dp_bind(struct device *dev, struct= drm_encoder *encoder, if (ret) return ERR_PTR(ret); =20 - dp->aux.dev =3D dev; - dp->aux.drm_dev =3D encoder->dev; - dp->aux.name =3D dev_name(dev); - dp->aux.transfer =3D dw_dp_aux_transfer; - ret =3D drm_dp_aux_register(&dp->aux); - if (ret) { - dev_err_probe(dev, ret, "Aux register failed\n"); - return ERR_PTR(ret); - } - ret =3D drm_bridge_attach(encoder, bridge, NULL, DRM_BRIDGE_ATTACH_NO_CON= NECTOR); if (ret) { dev_err_probe(dev, ret, "Failed to attach bridge\n"); - goto unregister_aux; + return ERR_PTR(ret); } =20 dw_dp_init_hw(dp); @@ -2064,37 +2083,33 @@ struct dw_dp *dw_dp_bind(struct device *dev, struct= drm_encoder *encoder, ret =3D phy_init(dp->phy); if (ret) { dev_err_probe(dev, ret, "phy init failed\n"); - goto unregister_aux; + return ERR_PTR(ret); } =20 ret =3D devm_add_action_or_reset(dev, dw_dp_phy_exit, dp); if (ret) - goto unregister_aux; + return ERR_PTR(ret); =20 dp->irq =3D platform_get_irq(pdev, 0); if (dp->irq < 0) { ret =3D dp->irq; - goto unregister_aux; + return ERR_PTR(ret); } =20 ret =3D devm_request_threaded_irq(dev, dp->irq, NULL, dw_dp_irq, IRQF_ONESHOT, dev_name(dev), dp); if (ret) { dev_err_probe(dev, ret, "failed to request irq\n"); - goto unregister_aux; + return ERR_PTR(ret); } =20 return dp; - -unregister_aux: - drm_dp_aux_unregister(&dp->aux); - return ERR_PTR(ret); } EXPORT_SYMBOL_GPL(dw_dp_bind); =20 void dw_dp_unbind(struct dw_dp *dp) { - drm_dp_aux_unregister(&dp->aux); + /* nothing to do */ } EXPORT_SYMBOL_GPL(dw_dp_unbind); =20 --=20 2.53.0 From nobody Fri Oct 2 01:13:04 2026 Received: from bali.collaboradmins.com (bali.collaboradmins.com [148.251.105.195]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 94C65479882; Thu, 6 Aug 2026 17:02:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.251.105.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786035756; cv=none; b=H46A+iWzdCl9nb1vs/4f6LmS0B6QnjExKy3Ofix8+ZICeuSMXs21TfzHDlYhhbfCNLUBEn7bIMHBEA1LK7SX2HWA9W6VJZzdUWIEkyqnkPtsHsKFwD4bTFyafIlbZOGeT/afblwTiewygyoSDM3xPs24ijKOgSiv+3RkVUfNF+0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786035756; c=relaxed/simple; bh=0/orRffv/Cn+zND2DpEnzFi3gVTog7rNUSC9EJYlZpQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=HUFckSpCyXQUL5WsUBYBRokU7uik2wVzXYN+C82I0fSLr7yxH46xV7uiCuWEe1yDX/V9U+MO3ZdesGT86Npipp/ll4VIlvbyzvK7AdFlA2AQ2syGjVJRkkhya1p0RZfpI7IgpHNAap8KvoEfoYImCtV9OPMWcZbm/RBnHzatyLA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b=aKY0QhF+; arc=none smtp.client-ip=148.251.105.195 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=collabora.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="aKY0QhF+" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1786035745; bh=0/orRffv/Cn+zND2DpEnzFi3gVTog7rNUSC9EJYlZpQ=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=aKY0QhF+/O95SXEDbKxHc+QJ3l4pk24GRxzpX8kVw9UuDONO4tre92mypeCIJVNDT dTJKNi7oWfSRTikL4Yy3sSb4HqDZa/G4anwDcwVNquWRvbkcDqnlRhwDMDVQ68cIqy z1ZwZDKrbAY2BBS/j91bucbm4mffzNesMuNbaT8lCEs4tcJoErtBNjNx0Pxv55mzc9 em1WYJJTPTCimQLSDeZAinSxHXKszZGwh6lQoe3Gnp7ATvgbEXIOynUbggjzdsBbzY zFDTv5Nv4FBEbdtAL5c38kwUaZ7FSKN/Kh6AiaRGmKRyF/hikdNzoFjniPMIyigaty CexwCXK8qUHaw== Received: from jupiter.universe (unknown [100.64.1.62]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: sre) by bali.collaboradmins.com (Postfix) with ESMTPSA id 42B6E17E051A; Thu, 06 Aug 2026 19:02:25 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id EE8F748002B; Thu, 06 Aug 2026 19:02:24 +0200 (CEST) From: Sebastian Reichel Date: Thu, 06 Aug 2026 19:02:08 +0200 Subject: [PATCH v11 02/21] drm/bridge: synopsys: dw-dp: Fix incorrect resource lifetimes in bind callback Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260806-synopsys-dw-dp-improvements-v11-2-0d508505f383@collabora.com> References: <20260806-synopsys-dw-dp-improvements-v11-0-0d508505f383@collabora.com> In-Reply-To: <20260806-synopsys-dw-dp-improvements-v11-0-0d508505f383@collabora.com> To: Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Rob Herring , Krzysztof Kozlowski , Conor Dooley , David Airlie , Simona Vetter , Dmitry Baryshkov , Luca Ceresoli , Philipp Zabel Cc: Cristian Ciocaltea , Damon Ding , Dmitry Baryshkov , Alexey Charkov , dri-devel@lists.freedesktop.org, linux-rockchip@lists.infradead.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, kernel@collabora.com, linux-arm-kernel@lists.infradead.org, Sebastian Reichel , Sashiko X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=9399; i=sebastian.reichel@collabora.com; h=from:subject:message-id; bh=0/orRffv/Cn+zND2DpEnzFi3gVTog7rNUSC9EJYlZpQ=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGp0viC60fbYCR9t77uFVSo3QuoYBUqb0hm6a gezqtjGmU2pRIkCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqdL4gAAoJENju1/PI O/qa0H0P/1x0KC/MohJK4IxjS5g2DUtUQINxQcItJg0nQjwlY7naLYMwSYO9qxY+KXaORmg29aB 3XmOLk3PucCLsR652Tv6EnGW7lCGRK5vGEF5qw/IBrHtbykZHxJKwdspfmp3FIo9VnpFLdfdO9I TACfN2/SVAyVgN2oJI7+9pB+sJuyC9fBjp/IpOZN6H/yd9xGO/4UCf89x4SBvbU58iYkbGvLEgc Q/UCnfSHvIFtCeVv20gqw8VSU45dgMETqqJiz50gtcsFZUdsKVmiUsjeoudRAlsKOXimMRmeBms xFYN8n37X1PwWxxaOoG7C9BfA5ETTgWcwdQdkYCmpW41BZK2G1hrt7eWYmXbNDnD8Pw+oEQdlGr x6/Sa5OcJCb1MpnpKVH/VFy0nHNGtE1frrzyEE5GKwCanz7qVeWYGrnWX0DEfnV0BozqbprGCKb 3uwS33QSP7lV2Cq0pvURW07z1ESs+Kx3qbC8Yctwy+DYePchKiyMk7m8q/fbn1eeuIQgOExDxER 49+PHveAdaZpSyrcYgoboBqWiyhl2My/2cKMyljQfJSoq5q0XnbvbKQVh58xGhPpGvtN07HFyl8 FFzxGgVoRGhaDQMUsGPA3ork/SS6q/SqR74+ebalGrbaTcOME5kPLgX8UTLp7aUQ3ydrdE358B/ hkhmiK+GQAckeqgG4cFIixQ== X-Developer-Key: i=sebastian.reichel@collabora.com; a=openpgp; fpr=EF660D07463F8B726A795413D8EED7F3C83BFA9A Currently the Synopsys DesignWare DP controller driver's bind function requests lots of resources using device managed functions. These are free'd on driver removal instead of at unbind time. Fix this discrepancy by introducing a new probe helper function and moving over the whole bind function. This results in a fully functional DRM bridge once probe succeeded. The only thing still happening when the component is bound is the bridge attachment, which requires the encoder. The interrupt is kept disabled while the bridge is detached to ensure no spurious interrupts can arrive as the interrupt handler triggers a worker, which accesses the DRM device. Fixes: 86eecc3a9c2e ("drm/bridge: synopsys: Add DW DPTX Controller support = library") Reported-by: Sashiko Signed-off-by: Sebastian Reichel Tested-by: Igor Paunovic --- drivers/gpu/drm/bridge/synopsys/dw-dp.c | 73 ++++++++++++++++-----------= ---- drivers/gpu/drm/rockchip/dw_dp-rockchip.c | 53 ++++++++++++---------- include/drm/bridge/dw_dp.h | 5 ++- 3 files changed, 72 insertions(+), 59 deletions(-) diff --git a/drivers/gpu/drm/bridge/synopsys/dw-dp.c b/drivers/gpu/drm/brid= ge/synopsys/dw-dp.c index 60feb3d1e14b..d7945f7fe9f0 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-dp.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-dp.c @@ -1827,16 +1827,22 @@ static int dw_dp_bridge_attach(struct drm_bridge *b= ridge, dp->aux.transfer =3D dw_dp_aux_transfer; =20 ret =3D drm_dp_aux_register(&dp->aux); - if (ret) + if (ret) { dev_err(dev, "Aux register failed: %d\n", ret); + return ret; + } =20 - return ret; + enable_irq(dp->irq); + + return 0; } =20 static void dw_dp_bridge_detach(struct drm_bridge *bridge) { struct dw_dp *dp =3D bridge_to_dp(bridge); =20 + disable_irq(dp->irq); + cancel_work_sync(&dp->hpd_work); drm_dp_aux_unregister(&dp->aux); } =20 @@ -1982,6 +1988,18 @@ static const struct regmap_config dw_dp_regmap_confi= g =3D { .rd_table =3D &dw_dp_readable_table, }; =20 +int dw_dp_bind(struct dw_dp *dp, struct drm_encoder *encoder) +{ + return drm_bridge_attach(encoder, &dp->bridge, NULL, DRM_BRIDGE_ATTACH_NO= _CONNECTOR); +} +EXPORT_SYMBOL_GPL(dw_dp_bind); + +void dw_dp_unbind(struct dw_dp *dp) +{ + /* nothing to do as bridge is detached automatically */ +} +EXPORT_SYMBOL_GPL(dw_dp_unbind); + static void dw_dp_phy_exit(void *data) { struct dw_dp *dp =3D data; @@ -1989,13 +2007,12 @@ static void dw_dp_phy_exit(void *data) phy_exit(dp->phy); } =20 -struct dw_dp *dw_dp_bind(struct device *dev, struct drm_encoder *encoder, - const struct dw_dp_plat_data *plat_data) +struct dw_dp *dw_dp_probe(struct platform_device *pdev, const struct dw_dp= _plat_data *plat_data) { - struct platform_device *pdev =3D to_platform_device(dev); - struct dw_dp *dp; + struct device *dev =3D &pdev->dev; struct drm_bridge *bridge; void __iomem *res; + struct dw_dp *dp; int ret; =20 dp =3D devm_drm_bridge_alloc(dev, struct dw_dp, bridge, &dw_dp_bridge_fun= cs); @@ -2004,9 +2021,8 @@ struct dw_dp *dw_dp_bind(struct device *dev, struct d= rm_encoder *encoder, =20 dp->dev =3D dev; dp->pixel_mode =3D plat_data->pixel_mode; - dp->plat_data.max_link_rate =3D plat_data->max_link_rate; - bridge =3D &dp->bridge; + mutex_init(&dp->irq_lock); INIT_WORK(&dp->hpd_work, dw_dp_hpd_work); init_completion(&dp->complete); @@ -2063,18 +2079,14 @@ struct dw_dp *dw_dp_bind(struct device *dev, struct= drm_encoder *encoder, return ERR_CAST(dp->rstc); } =20 - bridge->of_node =3D dev->of_node; - bridge->ops =3D DRM_BRIDGE_OP_DETECT | DRM_BRIDGE_OP_EDID | DRM_BRIDGE_OP= _HPD; - bridge->type =3D DRM_MODE_CONNECTOR_DisplayPort; - bridge->ycbcr_420_allowed =3D true; - - ret =3D devm_drm_bridge_add(dev, bridge); - if (ret) - return ERR_PTR(ret); + dp->irq =3D platform_get_irq(pdev, 0); + if (dp->irq < 0) + return ERR_PTR(dp->irq); =20 - ret =3D drm_bridge_attach(encoder, bridge, NULL, DRM_BRIDGE_ATTACH_NO_CON= NECTOR); + ret =3D devm_request_threaded_irq(dev, dp->irq, NULL, dw_dp_irq, + IRQF_ONESHOT | IRQF_NO_AUTOEN, dev_name(dev), dp); if (ret) { - dev_err_probe(dev, ret, "Failed to attach bridge\n"); + dev_err_probe(dev, ret, "failed to request irq\n"); return ERR_PTR(ret); } =20 @@ -2090,28 +2102,19 @@ struct dw_dp *dw_dp_bind(struct device *dev, struct= drm_encoder *encoder, if (ret) return ERR_PTR(ret); =20 - dp->irq =3D platform_get_irq(pdev, 0); - if (dp->irq < 0) { - ret =3D dp->irq; - return ERR_PTR(ret); - } + bridge =3D &dp->bridge; + bridge->of_node =3D dev->of_node; + bridge->ops =3D DRM_BRIDGE_OP_DETECT | DRM_BRIDGE_OP_EDID | DRM_BRIDGE_OP= _HPD; + bridge->type =3D DRM_MODE_CONNECTOR_DisplayPort; + bridge->ycbcr_420_allowed =3D true; =20 - ret =3D devm_request_threaded_irq(dev, dp->irq, NULL, dw_dp_irq, - IRQF_ONESHOT, dev_name(dev), dp); - if (ret) { - dev_err_probe(dev, ret, "failed to request irq\n"); + ret =3D devm_drm_bridge_add(dev, bridge); + if (ret) return ERR_PTR(ret); - } =20 return dp; } -EXPORT_SYMBOL_GPL(dw_dp_bind); - -void dw_dp_unbind(struct dw_dp *dp) -{ - /* nothing to do */ -} -EXPORT_SYMBOL_GPL(dw_dp_unbind); +EXPORT_SYMBOL_GPL(dw_dp_probe); =20 MODULE_AUTHOR("Andy Yan "); MODULE_DESCRIPTION("DW DP Core Library"); diff --git a/drivers/gpu/drm/rockchip/dw_dp-rockchip.c b/drivers/gpu/drm/ro= ckchip/dw_dp-rockchip.c index b23efb153c9e..38e8fe75718e 100644 --- a/drivers/gpu/drm/rockchip/dw_dp-rockchip.c +++ b/drivers/gpu/drm/rockchip/dw_dp-rockchip.c @@ -26,7 +26,7 @@ struct rockchip_dw_dp { struct dw_dp *base; struct device *dev; - struct rockchip_encoder encoder; + struct rockchip_encoder *encoder; }; =20 static int dw_dp_encoder_atomic_check(struct drm_encoder *encoder, @@ -73,37 +73,28 @@ static const struct drm_encoder_helper_funcs dw_dp_enco= der_helper_funcs =3D { =20 static int dw_dp_rockchip_bind(struct device *dev, struct device *master, = void *data) { - struct platform_device *pdev =3D to_platform_device(dev); - const struct dw_dp_plat_data *plat_data; + struct rockchip_dw_dp *dp =3D dev_get_drvdata(dev); struct drm_device *drm_dev =3D data; - struct rockchip_dw_dp *dp; struct drm_encoder *encoder; struct drm_connector *connector; int ret; =20 - dp =3D drmm_kzalloc(drm_dev, sizeof(*dp), GFP_KERNEL); - if (!dp) + dp->encoder =3D drmm_kzalloc(drm_dev, sizeof(*dp->encoder), GFP_KERNEL); + if (!dp->encoder) return -ENOMEM; =20 - dp->dev =3D dev; - platform_set_drvdata(pdev, dp); - - plat_data =3D of_device_get_match_data(dev); - if (!plat_data) - return -ENODEV; - - encoder =3D &dp->encoder.encoder; + encoder =3D &dp->encoder->encoder; encoder->possible_crtcs =3D drm_of_find_possible_crtcs(drm_dev, dev->of_n= ode); - rockchip_drm_encoder_set_crtc_endpoint_id(&dp->encoder, dev->of_node, 0, = 0); + rockchip_drm_encoder_set_crtc_endpoint_id(dp->encoder, dev->of_node, 0, 0= ); =20 ret =3D drmm_encoder_init(drm_dev, encoder, NULL, DRM_MODE_ENCODER_TMDS, = NULL); if (ret) return ret; drm_encoder_helper_add(encoder, &dw_dp_encoder_helper_funcs); =20 - dp->base =3D dw_dp_bind(dev, encoder, plat_data); - if (IS_ERR(dp->base)) - return PTR_ERR(dp->base); + ret =3D dw_dp_bind(dp->base, encoder); + if (ret) + return dev_err_probe(dev, ret, "failed to bind DW-DP bridge\n"); =20 connector =3D drm_bridge_connector_init(drm_dev, encoder); if (IS_ERR(connector)) { @@ -128,12 +119,30 @@ static const struct component_ops dw_dp_rockchip_comp= onent_ops =3D { .unbind =3D dw_dp_rockchip_unbind, }; =20 -static int dw_dp_probe(struct platform_device *pdev) +static int dw_dp_rockchip_probe(struct platform_device *pdev) { + const struct dw_dp_plat_data *plat_data; + struct device *dev =3D &pdev->dev; + struct rockchip_dw_dp *dp; + + plat_data =3D of_device_get_match_data(dev); + if (!plat_data) + return -ENODEV; + + dp =3D devm_kzalloc(dev, sizeof(*dp), GFP_KERNEL); + if (!dp) + return -ENOMEM; + platform_set_drvdata(pdev, dp); + dp->dev =3D dev; + + dp->base =3D dw_dp_probe(pdev, plat_data); + if (IS_ERR(dp->base)) + return PTR_ERR(dp->base); + return component_add(&pdev->dev, &dw_dp_rockchip_component_ops); } =20 -static void dw_dp_remove(struct platform_device *pdev) +static void dw_dp_rockchip_remove(struct platform_device *pdev) { component_del(&pdev->dev, &dw_dp_rockchip_component_ops); } @@ -161,8 +170,8 @@ static const struct of_device_id dw_dp_of_match[] =3D { MODULE_DEVICE_TABLE(of, dw_dp_of_match); =20 struct platform_driver dw_dp_driver =3D { - .probe =3D dw_dp_probe, - .remove =3D dw_dp_remove, + .probe =3D dw_dp_rockchip_probe, + .remove =3D dw_dp_rockchip_remove, .driver =3D { .name =3D "dw-dp", .of_match_table =3D dw_dp_of_match, diff --git a/include/drm/bridge/dw_dp.h b/include/drm/bridge/dw_dp.h index 22105c3e8e4d..a82412a9e769 100644 --- a/include/drm/bridge/dw_dp.h +++ b/include/drm/bridge/dw_dp.h @@ -22,7 +22,8 @@ struct dw_dp_plat_data { u8 pixel_mode; }; =20 -struct dw_dp *dw_dp_bind(struct device *dev, struct drm_encoder *encoder, - const struct dw_dp_plat_data *plat_data); +int dw_dp_bind(struct dw_dp *dp, struct drm_encoder *encoder); void dw_dp_unbind(struct dw_dp *dp); + +struct dw_dp *dw_dp_probe(struct platform_device *pdev, const struct dw_dp= _plat_data *plat_data); #endif /* __DW_DP__ */ --=20 2.53.0 From nobody Fri Oct 2 01:13:04 2026 Received: from bali.collaboradmins.com (bali.collaboradmins.com [148.251.105.195]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 94B52477985; Thu, 6 Aug 2026 17:02:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.251.105.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786035755; cv=none; b=RyBsWRa5ceCi+rSb3H95sPtLjF8qLZEKeSF+f4/ggPDm+Qw6I2hNjvqfodsl94wp32vjjg3mX2EMyKqJKnDH7a5iWjhSfOVGl5ddaj++Q4mYuJdyFt3ZTw9bu5NyOKW53B3QtXi8ym+58yt16Iu5ut4yJ3Zht+7LIxPwsTgnhLc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786035755; c=relaxed/simple; bh=ZiVqmaGM3+H99exZj4TcN/QyJvPS1u6+KkUwem6kKEk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=LSUFBbKAh6ekhyK/Ekl+YhePb1oVf2iBPcCmk4rUHlW4ABKK8H5Hkk4FQpgtJLVfjPV6NLFXIu4T54cKIyWFgXQ8zshGPxJwbmX/z598abhwMpjccgWToGabZ7anip8HUJiu97t6V5kFuEbgUkgWFup89MKbiW7vDFJIhW/qM9o= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b=C3EMcZAq; arc=none smtp.client-ip=148.251.105.195 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=collabora.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="C3EMcZAq" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1786035745; bh=ZiVqmaGM3+H99exZj4TcN/QyJvPS1u6+KkUwem6kKEk=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=C3EMcZAqreml5h3m2Ml6fRxe0X3k2bu3WHtdMH1W1676QUWC/QS/6mj+CD0EiOjmM kzuE23Ch1ZPIOrSbtrLGPvsgdTFk6ItWtfOYR0prJG0mu0zezTW3YRPhU6zCtYTsRN b8Qolru8aAodz8ZjB8gwWGxlwaA8qAKTy8EjN6cboeI6+V5fwvKxAgI0V6tfDruFhE U1nJrf/q4S9cnK1qvSXl5aNaZBhfrQKsgfLciPXlPoX1LS8IfmZamq3GLKMN+lcvAf wRBeKZnXqQim2IywvifE3EyizY6Wkp1+s4VfFEvgj9rTOg3bFUo4PVQ/2ym8e+fQhb ZWiynw57noV4A== Received: from jupiter.universe (unknown [100.64.1.62]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: sre) by bali.collaboradmins.com (Postfix) with ESMTPSA id 4675717E0B39; Thu, 06 Aug 2026 19:02:25 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id F02D248002F; Thu, 06 Aug 2026 19:02:24 +0200 (CEST) From: Sebastian Reichel Date: Thu, 06 Aug 2026 19:02:09 +0200 Subject: [PATCH v11 03/21] drm/bridge: synopsys: dw-dp: Fix error handling for DP link enablement Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260806-synopsys-dw-dp-improvements-v11-3-0d508505f383@collabora.com> References: <20260806-synopsys-dw-dp-improvements-v11-0-0d508505f383@collabora.com> In-Reply-To: <20260806-synopsys-dw-dp-improvements-v11-0-0d508505f383@collabora.com> To: Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Rob Herring , Krzysztof Kozlowski , Conor Dooley , David Airlie , Simona Vetter , Dmitry Baryshkov , Luca Ceresoli , Philipp Zabel Cc: Cristian Ciocaltea , Damon Ding , Dmitry Baryshkov , Alexey Charkov , dri-devel@lists.freedesktop.org, linux-rockchip@lists.infradead.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, kernel@collabora.com, linux-arm-kernel@lists.infradead.org, Sebastian Reichel , Sashiko X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=2301; i=sebastian.reichel@collabora.com; h=from:subject:message-id; bh=ZiVqmaGM3+H99exZj4TcN/QyJvPS1u6+KkUwem6kKEk=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGp0viD9wrbCV2uQtPhobuEDk+7q82oZiJ99N Q6StU0enFhCb4kCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqdL4gAAoJENju1/PI O/qaeU4QAJejIz6YLbMl0+CJgjTL2X6u+TxIhEyh+NgWc+eLf9io6OPqZPWPNbSsrlKEofdAdrz LAmseWMGIPoQmvbyV7Q5JeqjLUzDufRBEtBOF33/2U2fGaU9RhZtho+p0Scw5e+L5bDnKvOkkYM oBb9e+2i+3ZlpB4TyjWZG3257Bq9NwaK4UBtUUdiiPgkarf2EjPyn755NZw8f//vGWnrQOwo/yW aFVZawEj/H4MGtO2HoR933ZOBbBk55Nju33ef69kZxHYL5ceVP1FxSIQYtQeCFmuSyOkpnhta/q /bRGQh2a4R59s0o421VpiNEARfcCndmhjUx1Z+KNiPt8ekn5V17OUht58bVfQOcKpTY1DOmjkiL CytknU1u3Fk7dkbyVGb3vjWzwlt0nO9yEIwc3RKhcTfbzNbntHCj8q+FTOKtWoSj/BBN8ekkxqF ClVxWbyH0pCqW0UUWU5DmiGS2ZH6Fk6WA5JpidaFqDQxV5Humr//WOIWv4iLhiQb/3IVid+q+xX zLwjOlxpQqRrpa2Hfrr9A9mAzH/MNzJullIxIEi1qzp+9l3pjyFiaKAyYvwy7mVoKSzo8fGit3/ dd6RUHbKy9CaVI0Ji/clU+xned40y9yoA9VWUw/5TRCr8iSRmYBOc9DlvLn3jdiHhzCO38O0jfC MLiOpMFTtBm8y0wiT/B4/gA== X-Developer-Key: i=sebastian.reichel@collabora.com; a=openpgp; fpr=EF660D07463F8B726A795413D8EED7F3C83BFA9A dw_dp_link_disable() may be called in atomic mode disable even when dw_dp_link_enable() (or an earlier step) failed during atomic mode enable as there is no error tracking. This would result in broken PHY power state. This is fixed by introducing a new enabled state in the link structure to ensure the link disabling only happens if it has been properly enabled in the first place. The patch also adds missing error handling in dw_dp_link_enable() itself to ensure the link enablement becomes an atomic operation. Fixes: 86eecc3a9c2e ("drm/bridge: synopsys: Add DW DPTX Controller support = library") Reported-by: Sashiko Signed-off-by: Sebastian Reichel Tested-by: Igor Paunovic --- drivers/gpu/drm/bridge/synopsys/dw-dp.c | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/bridge/synopsys/dw-dp.c b/drivers/gpu/drm/brid= ge/synopsys/dw-dp.c index d7945f7fe9f0..21d60e89126f 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-dp.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-dp.c @@ -280,6 +280,7 @@ struct dw_dp_link { unsigned char revision; unsigned int rate; unsigned int lanes; + bool enabled; u8 sink_count; u8 vsc_sdp_supported; struct dw_dp_link_caps caps; @@ -1615,6 +1616,9 @@ static void dw_dp_link_disable(struct dw_dp *dp) { struct dw_dp_link *link =3D &dp->link; =20 + if (!link->enabled) + return; + if (dw_dp_hpd_detect(dp)) drm_dp_link_power_down(&dp->aux, dp->link.revision); =20 @@ -1624,6 +1628,7 @@ static void dw_dp_link_disable(struct dw_dp *dp) =20 link->train.clock_recovered =3D false; link->train.channel_equalized =3D false; + link->enabled =3D false; } =20 static int dw_dp_link_enable(struct dw_dp *dp) @@ -1636,10 +1641,22 @@ static int dw_dp_link_enable(struct dw_dp *dp) =20 ret =3D drm_dp_link_power_up(&dp->aux, dp->link.revision); if (ret < 0) - return ret; + goto err_phy_power_off; =20 ret =3D dw_dp_link_train(dp); + if (ret < 0) + goto err_link_power_down; + + dp->link.enabled =3D true; =20 + return 0; + +err_link_power_down: + drm_dp_link_power_down(&dp->aux, dp->link.revision); + dw_dp_phy_xmit_enable(dp, 0); + +err_phy_power_off: + phy_power_off(dp->phy); return ret; } =20 --=20 2.53.0 From nobody Fri Oct 2 01:13:04 2026 Received: from bali.collaboradmins.com (bali.collaboradmins.com [148.251.105.195]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9464A442100; Thu, 6 Aug 2026 17:02:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.251.105.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786035755; cv=none; b=u9ZmPW9V3eost4aXbXiJISW6VWLyAl+TywCUXWeuefrgOWXQdRBDZPL79ZdA8jjv5y+0ojRyjOEkOd9eYtH7NQcqVDYWtx0rZSCmEnIQWB3QREFoc8gua+6s2y87hTPURdcCBwWEzoIVJA3SS5Dsaxt4avghUI6Wy0O+FWhizsQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786035755; c=relaxed/simple; bh=rc2RzDgpPH5o2b0zMeMdVVBwWMU2wvQAig61MwLzEiI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=A16+Ma4PxGibzS1nuLuTVQks08ja69tsQ45ER5zUobKmASX1xjwp2eLpc10cNbU51uzt0k+Q7Xz/jGTrI60NjqxKZEmhPDhHu5Eumo0rpmz8ezSzM31crVRRe34gvPfE5/KlcoT4/NTxLmsvSCPmLA+S0qwybljh/PSIgqPuMgk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b=b3U4Nl6c; arc=none smtp.client-ip=148.251.105.195 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=collabora.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="b3U4Nl6c" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1786035745; bh=rc2RzDgpPH5o2b0zMeMdVVBwWMU2wvQAig61MwLzEiI=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=b3U4Nl6c+AeRUP/1MKzyrGBPaqcmq8XgT5CbHXpys4p1fgsUCUg9GWxEsoWo/9TpQ W6T4lMIY/AosQH5WbvMHpxlCAVakxxTakPzAgEXn9dT6fplV74iBi9TJv9pBv8zPQt mzxEb84hnl58f8t4GB/rgHf5spRja5w0ToApQgNRNQqGWN1N7ZNMF8aW9wkhYDYvjx fQDl5+6bJJ/FbQ4bRkZLmS7FCCezsv3BB9eTu8+u5RfFiWyQwVL5zFS1OQp9RFvSw9 yxLV3sJK6oMLF9dhgkCS6YVPVe6czdz6akD+yntzOvWAgLroL3mIVXRqRdemg/BiwW rqjITrI/hftBA== Received: from jupiter.universe (unknown [100.64.1.62]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: sre) by bali.collaboradmins.com (Postfix) with ESMTPSA id 482E517E0F83; Thu, 06 Aug 2026 19:02:25 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id F1B02480030; Thu, 06 Aug 2026 19:02:24 +0200 (CEST) From: Sebastian Reichel Date: Thu, 06 Aug 2026 19:02:10 +0200 Subject: [PATCH v11 04/21] drm/bridge: synopsys: dw-dp: Document missing reset line deassert Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260806-synopsys-dw-dp-improvements-v11-4-0d508505f383@collabora.com> References: <20260806-synopsys-dw-dp-improvements-v11-0-0d508505f383@collabora.com> In-Reply-To: <20260806-synopsys-dw-dp-improvements-v11-0-0d508505f383@collabora.com> To: Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Rob Herring , Krzysztof Kozlowski , Conor Dooley , David Airlie , Simona Vetter , Dmitry Baryshkov , Luca Ceresoli , Philipp Zabel Cc: Cristian Ciocaltea , Damon Ding , Dmitry Baryshkov , Alexey Charkov , dri-devel@lists.freedesktop.org, linux-rockchip@lists.infradead.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, kernel@collabora.com, linux-arm-kernel@lists.infradead.org, Sebastian Reichel , Sashiko X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1609; i=sebastian.reichel@collabora.com; h=from:subject:message-id; bh=rc2RzDgpPH5o2b0zMeMdVVBwWMU2wvQAig61MwLzEiI=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGp0viDr4+NxDx8KwqSZwqspKCl31BaCO23/t GBa3Dx6nqomkokCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqdL4gAAoJENju1/PI O/qaj+sP/2YoP9r+VyQViNtrzlwAZePbVge3GnDl6TfX2LdjmQUJ/FxLiiH/Wjdwax/dGHeSVC/ KjxWit02cp8y2bO9DF1zEbwxM+2Cc/Q/mlFbw/NIvTyyrfw+vFVfgLokxqJn+7B+8MURkPQL9TV mkTRpMj44BIY9dO0Q5GHGE1TFWBhTaE7W14uHwOKq5EwtxdHBzO/EKoBzxgrk+HidPZSdyXzZwb 87rro5R2kg6oTwJtiacbALGJ/7cFnML2Pacyd/mYK1ih3ooglx2wq3yxxduYDGTPNisFKVV2nJ4 fFW1CNTRdASdxcvxhdWS2fw0FbCEeQID+SChYCTlHxawFLO+Bt9Qcd8cDRmxiouWjS4UBQb7lJD pJWxg0QaGNc0DclD6bZmQ62WYQGoB11UQO9hzG5BOGVoHNzoQQN/C+SqlcaZ8HTHRucZr88sOuB Ssp8qApgCQNftyk7tiIovux01RwMoEqVS+Xfjt73uhJa4utEfQegDBWNtiBWbisQAc6NHlXltG2 cG9+ruj3ILFkoGI8DhoUaXRSpgwFzdJ8ajFAMKJY1Keoik44+Pn1hY2CL6eLZ5Wc2w97Y5B8chm 6shYSyyN5coP3MIe/NAOw4nGikCpyFYQxRCL3HZkpEiavXWBBj+ULbtK5qVRyj3sx2PGTwh8Smr SYPMOxptmxLLbWUYixysqPQ== X-Developer-Key: i=sebastian.reichel@collabora.com; a=openpgp; fpr=EF660D07463F8B726A795413D8EED7F3C83BFA9A If the driver uses devm_reset_control_get_exclusive_deasserted() instead of devm_reset_control_get() and thus automatically deasserts during probe, the SoC will hang when the device is unbound. This does not happen, when runtime PM is being used (not yet supported in mainline), which suggests the power-domain involved requires this reset line to be deasserted. Even with runtime PM there is no gurantee that the power-domain is disabled as it is shared. Considering the power-domain does not have the reset dependency described in DT, document the problem but leave things in the current state until a better solution is found as the reset line is deasserted by default on all supported platforms. Reported-by: Sashiko Signed-off-by: Sebastian Reichel Tested-by: Igor Paunovic --- drivers/gpu/drm/bridge/synopsys/dw-dp.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/drivers/gpu/drm/bridge/synopsys/dw-dp.c b/drivers/gpu/drm/brid= ge/synopsys/dw-dp.c index 21d60e89126f..52e3b37259a6 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-dp.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-dp.c @@ -2090,6 +2090,10 @@ struct dw_dp *dw_dp_probe(struct platform_device *pd= ev, const struct dw_dp_plat_ return ERR_CAST(dp->hdcp_clk); } =20 + /* + * This reset line is deasserted by default; asserting it hangs the SoC i= f the + * related power-domain is still active. + */ dp->rstc =3D devm_reset_control_get(dev, NULL); if (IS_ERR(dp->rstc)) { dev_err_probe(dev, PTR_ERR(dp->rstc), "failed to get reset control\n"); --=20 2.53.0 From nobody Fri Oct 2 01:13:04 2026 Received: from bali.collaboradmins.com (bali.collaboradmins.com [148.251.105.195]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4D62E48A2A9; Thu, 6 Aug 2026 17:02:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.251.105.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786035760; cv=none; b=T+2S45U92ZTlPOzseu0XMNFnw6Ut0+sw/sVfmBE8xQrM5wotLNHMRs1j28G7IeR1zEiXDwMQ2fJ5kkR3l01dsfUkI0jAK1R2yaLCUBE4BX1pZsbDsKqhZ0EvHD5/XHRYcwnNrkadXV9+nEmb+tZF42abCj0W5NYcdCTvZnOWXmM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786035760; c=relaxed/simple; bh=z3MvIWasYELAai6HO3er+8XiHnoakmXomvsc7NcTsdk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=eR+6qxx0IofIfqxdjcngLyI406KDXLuHkfZazqb6iI263IX5vVezNV7+iNUrnipdX4AAbNERZVOAvCOzOSw4o4FGOxef4as5G9F3Dn+Fg5lvI2pkusyZOFbNdCMapfpvQjsCGG/AbTGePuUM7XaRwIM0uExjleWhlMZ0dUePido= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b=RI9OHvEv; arc=none smtp.client-ip=148.251.105.195 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=collabora.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="RI9OHvEv" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1786035745; bh=z3MvIWasYELAai6HO3er+8XiHnoakmXomvsc7NcTsdk=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=RI9OHvEvhVNX9locRwSkziAadcxYiqTyGBD6spHUiqTTGhnV9AGVKXv3invUW9QB0 JU9ps3D4b9XSQcZ9Fe3RQuPR/t4gV+LQ64Yoagqy06KPqbU3fZxjxpSh+UXlwsRTVG wQXlCF2zycM6LNydLeKffrZw3bgrG2BqPD+l0F8LExAGg79JpPPi5yleNbDpt0xQas lvj31PJG0u2Ai5u7dVIn8oFbfcrAEQeA2/2Z/vtmsvUSSQgvV6IeaFzKLQzmlmLJZ+ T6RKagkVyaSpVJqFQiJDASjideJEVrUjO3vUxgPVXhDVr0pWQYeAFHbL0q9fqOkUdO gu/MxIC8JGYCw== Received: from jupiter.universe (unknown [100.64.1.62]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519) (No client certificate requested) (Authenticated sender: sre) by bali.collaboradmins.com (Postfix) with ESMTPSA id 954E017E107E; Thu, 06 Aug 2026 19:02:25 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id F34ED480031; Thu, 06 Aug 2026 19:02:24 +0200 (CEST) From: Sebastian Reichel Date: Thu, 06 Aug 2026 19:02:11 +0200 Subject: [PATCH v11 05/21] drm/bridge: synopsys: dw-dp: Add missing mutex cleanups on module removal Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260806-synopsys-dw-dp-improvements-v11-5-0d508505f383@collabora.com> References: <20260806-synopsys-dw-dp-improvements-v11-0-0d508505f383@collabora.com> In-Reply-To: <20260806-synopsys-dw-dp-improvements-v11-0-0d508505f383@collabora.com> To: Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Rob Herring , Krzysztof Kozlowski , Conor Dooley , David Airlie , Simona Vetter , Dmitry Baryshkov , Luca Ceresoli , Philipp Zabel Cc: Cristian Ciocaltea , Damon Ding , Dmitry Baryshkov , Alexey Charkov , dri-devel@lists.freedesktop.org, linux-rockchip@lists.infradead.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, kernel@collabora.com, linux-arm-kernel@lists.infradead.org, Sebastian Reichel , Sashiko X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1166; i=sebastian.reichel@collabora.com; h=from:subject:message-id; bh=z3MvIWasYELAai6HO3er+8XiHnoakmXomvsc7NcTsdk=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGp0viBW6sz1S0JiZrIACnfpwmyyq09ddK444 lv/NdCZw4Ct/4kCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqdL4gAAoJENju1/PI O/qa+JwP/jmE3uFPI8XGt2YYAv04xx6V8D36pd/Cq4rb96Jgt5SrU/fz9MI8bc54IZoPSHea3sG TnXmqpwxnnVP3WZ+J8s6puJPBPF92tSwtmDbdEOeZIwMscYs5miNOXvVBMxbaIbsoQdj+hZp3qJ RN4A7WpYppvTJC4MSfAvDYP9s6ubZeiQo8hyux5F7ZCxlTqAYSYYyAv/sMYoFxEmsw/6mgcrXlY SfLnoFSDKjKiLJgnohF3ouJWVDeM0uPeQJrNgxrPCk5HaIFbajP1B4/bndDKiKVZdsEuSm8FA4K bUZwIqi+k9ajw6yc1Xc3Sk2AUKtp8pW/ejNKDU1JtBgpVDhsOGZg2yMMO/wWGAHhjuqj/sJ+5Kc m40N70Ex2rk+4n8/PZ8VEL8BdSI6S/vLAfx42oufkZNwbZQAOlk6EToHDVWdGi0FD1I6uwrpjD/ X9Ce4LNFA/0fLqY5zV7VL2XsO+ZOjxA2oM98UGQ3ffZ+xLLiCbP6iNDKMp6so69r6eLGFPh8Hfs AuLtrYVRw9obu2fnZqZRBk8Tu+AontANWZKRYOGXYUIAIutbDSKTBFMA5WXMc1RhCo9f22Zx7UU ScZxr2EcTou/eJCX7QwZ6pjMkfmuoHYv4SPnSgGGMIQlWBmPfszWuUHhmW4c+zjm6lQOG86n/DG A0pWmKMnjJvHe35aJqsIuMg== X-Developer-Key: i=sebastian.reichel@collabora.com; a=openpgp; fpr=EF660D07463F8B726A795413D8EED7F3C83BFA9A The driver is currently missing to fully clean up after itself. Ensure that the mutex is cleaned up. Fixes: 86eecc3a9c2e ("drm/bridge: synopsys: Add DW DPTX Controller support = library") Reported-by: Sashiko Signed-off-by: Sebastian Reichel Tested-by: Igor Paunovic --- drivers/gpu/drm/bridge/synopsys/dw-dp.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/bridge/synopsys/dw-dp.c b/drivers/gpu/drm/brid= ge/synopsys/dw-dp.c index 52e3b37259a6..b1856418f441 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-dp.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-dp.c @@ -2040,10 +2040,13 @@ struct dw_dp *dw_dp_probe(struct platform_device *p= dev, const struct dw_dp_plat_ dp->pixel_mode =3D plat_data->pixel_mode; dp->plat_data.max_link_rate =3D plat_data->max_link_rate; =20 - mutex_init(&dp->irq_lock); INIT_WORK(&dp->hpd_work, dw_dp_hpd_work); init_completion(&dp->complete); =20 + ret =3D devm_mutex_init(dev, &dp->irq_lock); + if (ret) + return ERR_PTR(ret); + res =3D devm_platform_ioremap_resource(pdev, 0); if (IS_ERR(res)) return ERR_CAST(res); --=20 2.53.0 From nobody Fri Oct 2 01:13:04 2026 Received: from bali.collaboradmins.com (bali.collaboradmins.com [148.251.105.195]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4D73C48A2AA; Thu, 6 Aug 2026 17:02:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.251.105.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786035762; cv=none; b=TewXZJ4R9oYGdP8K9t9YXIpaPyaQyPplzrcGDNLKoEJvMW+l8C+UeaigCdC517t/dBJGJgA2JeCU/OsGkVkq03A6ieCr9CdCzXRhs5XzNRJJORXdJQQbccLi7ulGXbvLr1aXGJTaCo6WalnrVyPz4bw4b1OMcrLOgVnwPc903hU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786035762; c=relaxed/simple; bh=NCHXRPy+LHmwXdxbgtDdQU4HjaaTIm7gCF0WSF5xKIE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=YPgy9O8HozRC5IjZr0UwbsEUBNxi+hPfXUzIO43inpjRNwGndY1eeXhCRxqJsHoyf6cny8kk4rUrAINzkokSvbyftS1iZEJZW5F4AaXFKSdIaMhIxZbo8fshgFB0Ueg1Mac8xtaxyYCFIehuI2UQQfFXFfKicKItyZNWJCz2rqQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b=kclgAkry; arc=none smtp.client-ip=148.251.105.195 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=collabora.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="kclgAkry" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1786035745; bh=NCHXRPy+LHmwXdxbgtDdQU4HjaaTIm7gCF0WSF5xKIE=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=kclgAkryddi/ggeMDdOFR0axFmRaZO+maq3eUJXUlC/LQ90NNxjoBU54CKnsHR5pp Eny4QMmlDwxY5yc60c8fOc95iWNIxRdXvgsYqp67wOO609i28fbSys6DfgWeTJrPfU 3mfDxFtnVdc3knnbhtZq9SEaKNaeOJBYo/r6/Vh6SfLquGYgBnBXuEAGJIAKDLTDqP +CDINSGalGF3SOWVSMxAoYwGx1f33/9ko23myMYTs0/vn8Rb0apvGDreIb1hnAgIxs BE1EFe3O93empM0YNIqHRg8hyXxHrEMPrqyIcRLSsUYcxnlnz20UZgiMx9G2/gfovG yORqFSXs5SxOg== Received: from jupiter.universe (unknown [100.64.1.62]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519) (No client certificate requested) (Authenticated sender: sre) by bali.collaboradmins.com (Postfix) with ESMTPSA id 9628317E10B0; Thu, 06 Aug 2026 19:02:25 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 00A6E480035; Thu, 06 Aug 2026 19:02:25 +0200 (CEST) From: Sebastian Reichel Date: Thu, 06 Aug 2026 19:02:12 +0200 Subject: [PATCH v11 06/21] drm/bridge: synopsys: dw-dp: Fix AUX transfer timeout race condition Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260806-synopsys-dw-dp-improvements-v11-6-0d508505f383@collabora.com> References: <20260806-synopsys-dw-dp-improvements-v11-0-0d508505f383@collabora.com> In-Reply-To: <20260806-synopsys-dw-dp-improvements-v11-0-0d508505f383@collabora.com> To: Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Rob Herring , Krzysztof Kozlowski , Conor Dooley , David Airlie , Simona Vetter , Dmitry Baryshkov , Luca Ceresoli , Philipp Zabel Cc: Cristian Ciocaltea , Damon Ding , Dmitry Baryshkov , Alexey Charkov , dri-devel@lists.freedesktop.org, linux-rockchip@lists.infradead.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, kernel@collabora.com, linux-arm-kernel@lists.infradead.org, Sebastian Reichel , Sashiko X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=2162; i=sebastian.reichel@collabora.com; h=from:subject:message-id; bh=NCHXRPy+LHmwXdxbgtDdQU4HjaaTIm7gCF0WSF5xKIE=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGp0viCLK9cau+WT/e4i2y7zVBrDCfqPauJIP u9RypZzTrONF4kCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqdL4gAAoJENju1/PI O/qaydIP/ixE6hIA212y0LRKuoC22VvVGE2JVyrPpjAYlG3QJKiAKFD8ZSoKFL9XJ9pCIBCyk2i R5ukXp4bNnParCTKl3uu4K5o9R6u/ZOfnrP8ZviL/zLM3EsC3+kfxsPVnEXpgtDFFeXbfZnfsu+ qK4x9Dtx2qOXtZ7888G2WGWGMqDpXWKrqWOET23MrbV+qh6N07fFbSEEjuTzpC2Ncxk8fma7A/6 bK+Uhn+SqO6+YhY2+pJV8ygRwaHdlO5WD69OIRFBYKaIEvcfDWriBkLEh+Jq95B9Ewekl6fOXp6 LxbOuHE0YqbvME+Pvxi2xSEwwN6fpCwaQNXZc+cv6XIWuto/zxtByhYP3fc9kt97j6yc5Uz1f9a qKK6A8lDlyxSmswC0g8+2pGkTGD1M0jeKujSi54up9+HztAjQ9/BU3exDdUzy5YZWIzQ29t35NS 9Inoy8WKUQPzk/aHjRDXixfYnF4HGwN9VsCViWhYD1cLdStyKzvzQKbNTE75G/lvY3o8wFaAUr1 t9HVVTGbThtFf3aZey7mSX4cl2syLd3OUW5vaV7QTcb+O9z4g74i8bHaNCGpKPqkUMsuMwIvAa8 aq5tkghJ+E2rcr4ji02kf4PkPCizRXNJr055DqVgCqmPlzde0N06Zp6mTXoQX1653kEiTqGwvIR GEwFAnkI3PWmeP3W/RVE2AQ== X-Developer-Key: i=sebastian.reichel@collabora.com; a=openpgp; fpr=EF660D07463F8B726A795413D8EED7F3C83BFA9A The DP AUX transfer method uses a completion triggered by an interrupt, which can timeout. If the function runs into the timeout and the interrupt fires afterwards, the following DP aux transfer completion would trigger immediately without waiting for the interrupt. This in turn means the next one would also be broken and so on. Fix this potential issue by re-initializing the completion directly before sending the AUX command. As this is racy (the interrupt might arrive between the completion re-init and the new command being programmed), also reset the AUX controller on timeouts and synchronize pending interrupts to gurantee that there are no pending AUX transfers when the dw_dp_aux_transfer() returns. Due to lack of a sink, which generates AUX timeouts, this change is effectively untested. Reported-by: Sashiko Fixes: 86eecc3a9c2e ("drm/bridge: synopsys: Add DW DPTX Controller support = library") Signed-off-by: Sebastian Reichel Tested-by: Igor Paunovic --- drivers/gpu/drm/bridge/synopsys/dw-dp.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/drivers/gpu/drm/bridge/synopsys/dw-dp.c b/drivers/gpu/drm/brid= ge/synopsys/dw-dp.c index b1856418f441..2573ea2bb574 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-dp.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-dp.c @@ -1466,6 +1466,8 @@ static ssize_t dw_dp_aux_transfer(struct drm_dp_aux *= aux, if (WARN_ON(msg->size > 16)) return -E2BIG; =20 + reinit_completion(&dp->complete); + switch (msg->request & ~DP_AUX_I2C_MOT) { case DP_AUX_NATIVE_WRITE: case DP_AUX_I2C_WRITE: @@ -1492,6 +1494,12 @@ static ssize_t dw_dp_aux_transfer(struct drm_dp_aux = *aux, status =3D wait_for_completion_timeout(&dp->complete, timeout); if (!status) { dev_err(dp->dev, "timeout waiting for AUX reply\n"); + regmap_update_bits(dp->regmap, DW_DP_SOFT_RESET_CTRL, + AUX_RESET, FIELD_PREP(AUX_RESET, 1)); + usleep_range(10, 20); + regmap_update_bits(dp->regmap, DW_DP_SOFT_RESET_CTRL, + AUX_RESET, FIELD_PREP(AUX_RESET, 0)); + synchronize_irq(dp->irq); return -ETIMEDOUT; } =20 --=20 2.53.0 From nobody Fri Oct 2 01:13:04 2026 Received: from bali.collaboradmins.com (bali.collaboradmins.com [148.251.105.195]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 34F68488DAE; Thu, 6 Aug 2026 17:02:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.251.105.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786035761; cv=none; b=F3WxEuJNFXkOdS97BV907VUPgut/rZRzEL/+FyYYtHDlQid5NMHuJL0hhDe5M5HTTxNOMWdTpy4C9uWeM0H/r84KUEpBU6A8MY9X1f1X1Ldoq6iuf0yf2J9j4WVG77+OhR2Hcky9dLH4JnpmnDuls4NQFMWpZiNmtgBfq9sqtd4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786035761; c=relaxed/simple; bh=Wq0t6zadtzVfczUZxnimhZ2697Ml6eWsrsvM4IRkEqA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=AJx1njqtP0H0gJkbUjbcX/dKaQcoF2R6zBWN1AnZN1xGe7GINBWeEajpVznMM5yHd09zMjtgOfy9PDgctMSjDpSsEdbbZXGOw4DCeNXjaa3+p3Tz3l85fcMT/UF60ZoWFqzBtL0brUuf9/y4ntTyOrUt334hwzYVJ2I5B3QdeoM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b=qgdplyni; arc=none smtp.client-ip=148.251.105.195 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=collabora.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="qgdplyni" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1786035745; bh=Wq0t6zadtzVfczUZxnimhZ2697Ml6eWsrsvM4IRkEqA=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=qgdplyniZWudnlpCHdAe/URJjdKKHgYxho32lI/YBytXc1ZKc9H6k+GnFptr9Vrpo P2LmOHy6JU1EGfXpclK9GTQWX/SV4h5bxHY1OAxQB40e01u687mNHj9uQd0IMhCNRD lyREf8Bq1KvjXHBYC+K3qBB71Rj+WbRtCz99hRh36FB5MHH7GmSef5vHG0VrrqY5CV Se4oW6YzTmuEseH5/jyl4Iyx46JdSx+riKMhvOWTlu/7xvdw/m36bDRFubP7szYHCL TmJDZYn58o7hCqMMgYsvSYoJw45mu1wFDq9+ylD04NTNtGTfVyFj8SbFpl7kygrfJS I4Muez4lNelPg== Received: from jupiter.universe (unknown [100.64.1.62]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519) (No client certificate requested) (Authenticated sender: sre) by bali.collaboradmins.com (Postfix) with ESMTPSA id 9E41C17E10C0; Thu, 06 Aug 2026 19:02:25 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 021C5480038; Thu, 06 Aug 2026 19:02:25 +0200 (CEST) From: Sebastian Reichel Date: Thu, 06 Aug 2026 19:02:13 +0200 Subject: [PATCH v11 07/21] drm/bridge: synopsys: dw-dp: Fix support for short I2C reads Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260806-synopsys-dw-dp-improvements-v11-7-0d508505f383@collabora.com> References: <20260806-synopsys-dw-dp-improvements-v11-0-0d508505f383@collabora.com> In-Reply-To: <20260806-synopsys-dw-dp-improvements-v11-0-0d508505f383@collabora.com> To: Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Rob Herring , Krzysztof Kozlowski , Conor Dooley , David Airlie , Simona Vetter , Dmitry Baryshkov , Luca Ceresoli , Philipp Zabel Cc: Cristian Ciocaltea , Damon Ding , Dmitry Baryshkov , Alexey Charkov , dri-devel@lists.freedesktop.org, linux-rockchip@lists.infradead.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, kernel@collabora.com, linux-arm-kernel@lists.infradead.org, Sebastian Reichel , Sashiko X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1481; i=sebastian.reichel@collabora.com; h=from:subject:message-id; bh=Wq0t6zadtzVfczUZxnimhZ2697Ml6eWsrsvM4IRkEqA=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGp0viD/SwIKGDa2Ylbx0PCEGnkRYct+Kci6b wLO36pEPuNHyIkCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqdL4gAAoJENju1/PI O/qaK7YQAJFSR2laobDWJ0Eow2zYbYu6d29M/QzqZqMcNS9+CjgbnHsPtHwBhtFnQFAN0jBKysY WOO9nBP/bh95lcBz7/Ux5l7Vn4M0GJuuQrFpgDrOPpXsY+oAnhuewtN8BmDWykYjS3G9S/4xA+a Hv0kSorH5gm7dnKMAuHwsHHSokViGqSyBnRELPChYnE8kT2YRRcqCzfJvnkdVAXA5w9wQ8x7KFY Fwa5GOu+T5HSwC+5vRpYuPLT+Z1jbO37NtBzQLpeMxIArFlAEmUqbvVBS7nzQ05UhslCyxF/chX usMrsW51QdDm34Jv3n5BMdt7ALyIh9AbpxqIBCdDldBcDVnLAkKk0H1Sf8c2qHjfCkywVgoLD6C AnEiXJc2orQwWbaIv6hToCqhnq6k9Y8a9wll5b+w5vdkqOD9pHS5IOQSdedHEp2i81e1gI2OtzO Ups1x1FWo7oQxnOGNVsnUmu6kDfFnHOHsGk0YNBKgswbY/kAXJFb7sltG+KKgVzQw+rkFoti6L+ k7RgjEaqh7NkXOy14otyhyXKa4DzctWP2Ab6pVKhvO5BjvC+rodAthGP6u6Y644dPSCeeHtRoEU LMlxuNIA97pcKZzSIZdCijv5coYtcgTdSCr701xEXnzL1fnK0nQ7fd0C4C54W2KVC3DeiKRyQXn Z/Do0WW6s/YaoNMGA/xwjCQ== X-Developer-Key: i=sebastian.reichel@collabora.com; a=openpgp; fpr=EF660D07463F8B726A795413D8EED7F3C83BFA9A The transfer functions returns the amount of bytes read for DP_AUX_I2C_READ. By returning -EBUSY for short reads, the caller has less information available what is going wrong and possibly simply resends the read request. On sinks not supporting long reads, this will simply run into the same issue again. Instead it makes more sense to return the data from the short read with the length information, which allows drm_dp_i2c_do_msg() to read data in smaller chunks and succeed in the end. Due to lack of a sink, which only supports short reads, this change is effectively untested. Fixes: 86eecc3a9c2e ("drm/bridge: synopsys: Add DW DPTX Controller support = library") Reported-by: Sashiko Signed-off-by: Sebastian Reichel Tested-by: Igor Paunovic --- drivers/gpu/drm/bridge/synopsys/dw-dp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/gpu/drm/bridge/synopsys/dw-dp.c b/drivers/gpu/drm/brid= ge/synopsys/dw-dp.c index 2573ea2bb574..8ceb139f1a72 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-dp.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-dp.c @@ -1513,7 +1513,7 @@ static ssize_t dw_dp_aux_transfer(struct drm_dp_aux *= aux, if (msg->request & DP_AUX_I2C_READ) { size_t count =3D FIELD_GET(AUX_BYTES_READ, value) - 1; =20 - if (count !=3D msg->size) + if (!count || count > msg->size) return -EBUSY; =20 ret =3D dw_dp_aux_read_data(dp, msg->buffer, count); --=20 2.53.0 From nobody Fri Oct 2 01:13:04 2026 Received: from bali.collaboradmins.com (bali.collaboradmins.com [148.251.105.195]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A2CD7488755; Thu, 6 Aug 2026 17:02:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.251.105.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786035759; cv=none; b=VUytye5C2QMWU7dUBQjvfZNSRdBLzQgIfNKpOl7rruYVlJJvlzTGHPGYFv5c8n9VA9MGkKI+SS6iN9/5fuliztenYVvbw4SPpgXr/d7Ji5rugaz2dvJeIQNyzsQU03tzpsry4lnGfjGkXsXiCFpMhm/Iqwm+vUBi+kPyXccqLKI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786035759; c=relaxed/simple; bh=/lgBpexnadALM8qH0IRqFvISL085+4oJ6MSwbA/prjw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=DvxEW22v7QsYpk51mTVqehcblqNIxJ7P3G5WwS7B5RjEfNuOiM8sQ5ubiUWB9m0QJKLL1b5NY+EALR26U+zrOJ7M+zI6Re43MGqvEG1zGfujTXjSWWKOiBhlRtNbKvVvI+26FK7KfNC5wi+ppRRTqBgwt3x5LeRz8r+J3g/9PAc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b=Dl4BiTmB; arc=none smtp.client-ip=148.251.105.195 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=collabora.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="Dl4BiTmB" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1786035745; bh=/lgBpexnadALM8qH0IRqFvISL085+4oJ6MSwbA/prjw=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=Dl4BiTmBokojrQFAJ+KNC2cWeneWlQRkZFPyeZ9W0YWx8BdaHmnqkI+3JEruFpHyu SwD4X90LRPV+M3U+mOcIseX1JlZi5JMrTSlcCEaPOjVh5JOsGON+KYyJ6qrRpnX7Rz 4bXVV5Q+DyRx3J0y31fbZFPM0KBRy1dWmcA+TcyryYEUbeNu09XwEEhs8IwWkAvcRp OD6lc96qILa1Mi9w+YNYh8jUxR+i9qnFJNuNDax8vCvVM2c0pWukdJL6kLxTeGoWuv ZCwvuF5P+BcKmRzZNhA0uLn8Cpti6KIfx+5ZFcYNRPhDjCWXRn3cB2TK5aDLn2mAfu Mvji9MM9m9faw== Received: from jupiter.universe (unknown [100.64.1.62]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519) (No client certificate requested) (Authenticated sender: sre) by bali.collaboradmins.com (Postfix) with ESMTPSA id A022417E1104; Thu, 06 Aug 2026 19:02:25 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 03AF348003A; Thu, 06 Aug 2026 19:02:25 +0200 (CEST) From: Sebastian Reichel Date: Thu, 06 Aug 2026 19:02:14 +0200 Subject: [PATCH v11 08/21] drm/bridge: synopsys: dw-dp: Free output_fmts when none are valid Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260806-synopsys-dw-dp-improvements-v11-8-0d508505f383@collabora.com> References: <20260806-synopsys-dw-dp-improvements-v11-0-0d508505f383@collabora.com> In-Reply-To: <20260806-synopsys-dw-dp-improvements-v11-0-0d508505f383@collabora.com> To: Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Rob Herring , Krzysztof Kozlowski , Conor Dooley , David Airlie , Simona Vetter , Dmitry Baryshkov , Luca Ceresoli , Philipp Zabel Cc: Cristian Ciocaltea , Damon Ding , Dmitry Baryshkov , Alexey Charkov , dri-devel@lists.freedesktop.org, linux-rockchip@lists.infradead.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, kernel@collabora.com, linux-arm-kernel@lists.infradead.org, Sebastian Reichel , Sashiko X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1057; i=sebastian.reichel@collabora.com; h=from:subject:message-id; bh=/lgBpexnadALM8qH0IRqFvISL085+4oJ6MSwbA/prjw=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGp0viBJeHTihB6rTSVJOQPkad+CcXtFBwZQU 2YBrUW0ZeE6lIkCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqdL4gAAoJENju1/PI O/qau1IP/3lYGxq+/czWfeaJnqNvkT5jdwpaQg8ewclxUgoqe5A16+1c/9bcSdX3ddyzsIrmDaq VWW+hax0/gAeXR4AomcNFkgf8EBlTJ2iuzTCVZ2hrsCgPZpS7Z9DwkwO+ALfUUyIQ+Crg7Z7diE QChoH8CJkm9GLoxbnK4gOZd/yREd5ntFNEN5Po+MbOu3Bq3PoTM00q/NoFn3npGw0wNkdJvCdL9 HoPbm+zGz4zf9pjmLKzBhotGKMiwTVAD48LX67ka16Fcptzxvz1hiESz52mln8ZRdFXcLyAdyjh GD++lMdLW/LJIzxDPehPKLMtlScP64ZN4+hJfERc4yBvDucRHfJwXq5ke4EN/lBYQaRjKr+4RVj ZawLsRronY/WrWqzRagbEMJB2koy7tELkoRlvkxEPos0r9nYQ8TyAakGw5hPZ5WakphOHnwGikF npO/6Dm4VfjCIpcdNOCjGS4z1t8ch/K+GNfp/fBkiLQgCF5OUlcV8ORG+eGfT5TXQCPaeUwLNAL Tu2sys+vEZXCwwe+YG3H7Hoeu1iNyY8GEIgjJiympR9jXc9yrifZeEPWw10AZgYzIhUbxvXJsHY Zk5cyDACWbh+aarpe/jOrbiEMwlsvKYHFWbNsKhOEEGwYA7/KL5mBZfgnKxFdYWJQafv9cm7R65 BdhXzKXyvUe8FxMfSZnEjPg== X-Developer-Key: i=sebastian.reichel@collabora.com; a=openpgp; fpr=EF660D07463F8B726A795413D8EED7F3C83BFA9A If dw_dp_bandwidth_ok() returns false for all formats, *num_output_fmts might end up becoming 0. In this case functions calling it assume that nothing needs to be free'd, so free output_fmts within the function to avoid leaking memory. Fixes: 86eecc3a9c2e ("drm/bridge: synopsys: Add DW DPTX Controller support = library") Reported-by: Sashiko Signed-off-by: Sebastian Reichel Tested-by: Igor Paunovic --- drivers/gpu/drm/bridge/synopsys/dw-dp.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/drivers/gpu/drm/bridge/synopsys/dw-dp.c b/drivers/gpu/drm/brid= ge/synopsys/dw-dp.c index 8ceb139f1a72..d35dcd4a413f 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-dp.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-dp.c @@ -1820,6 +1820,11 @@ static u32 *dw_dp_bridge_atomic_get_output_bus_fmts(= struct drm_bridge *bridge, output_fmts[j++] =3D fmt->bus_format; } =20 + if (j =3D=3D 0) { + kfree(output_fmts); + output_fmts =3D NULL; + } + *num_output_fmts =3D j; =20 return output_fmts; --=20 2.53.0 From nobody Fri Oct 2 01:13:04 2026 Received: from bali.collaboradmins.com (bali.collaboradmins.com [148.251.105.195]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A2DCA488762; Thu, 6 Aug 2026 17:02:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.251.105.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786035761; cv=none; b=j0dpDjB6wY/3ygQ4Dh/TeGTDQJ8/B1yPvk9XpkpNflQqgAUSQglbl2R3cQSXspA1+y8H4Xp3O5Ve430mlw5UM6DnfzkXbmUMy3GGUhAQrlzFtQq9IXwpxKy0zMnR0nEcm2bOQn44I1Q0KA+YWik0boD7tpEScgl048AvHqLs2l4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786035761; c=relaxed/simple; bh=6qZ7A1oz5Axgnpp4GtqPS8WNzAaEjziX3V59HPLoil0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=aIaSeIWGgVlYuvd6qmbOZoC/1W5KtL/x0nBkDkFQEEsUQf83NL39ZAvEL7j4NnEZNun6bn7g9YdSBKB/V0g6EImQ5SO7QT14CHfljairDR1i3xecz26qrzjQMEyPN0lbMUF1PABW7uI/6NDWxB9gb9P4hy+s+Cx/XtTHVqVr6L8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b=IL84RrKq; arc=none smtp.client-ip=148.251.105.195 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=collabora.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="IL84RrKq" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1786035745; bh=6qZ7A1oz5Axgnpp4GtqPS8WNzAaEjziX3V59HPLoil0=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=IL84RrKq9Qn/9nDJ4RKZCLffv8gFO4UGPPvekqyqJhxtl6uQ94/+qymqu0bYnOEoo Qin9UyUEhqzizwv47DjWM/oAOF+fIvydI8TMosmvnTrIhV+cKUVgOrMENA8eg96pPV yA10c4ASs388BDAKgwGCnKIW7UYl8vpXLAvN4x60dQIyUnbZMNd4gN7yxYG8eF3864 9Wra/WX7SfrNzVAzQtu+7VZogU4KBu0zYrZo3uOubTPxAUtcJBlQ2R1WorlmwBYR5u 1ZJetLcu4jxaqNoZSQG2XgXh4jRaLmYNVzUQjXPPsnDVMTVXEd0gj+Za/+kNla+A7A YagArL2WqcXiA== Received: from jupiter.universe (unknown [100.64.1.62]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519) (No client certificate requested) (Authenticated sender: sre) by bali.collaboradmins.com (Postfix) with ESMTPSA id A6D2017E11E4; Thu, 06 Aug 2026 19:02:25 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 0545348003D; Thu, 06 Aug 2026 19:02:25 +0200 (CEST) From: Sebastian Reichel Date: Thu, 06 Aug 2026 19:02:15 +0200 Subject: [PATCH v11 09/21] drm/bridge: synopsys: dw-dp: Support MEDIA_BUS_FMT_FIXED Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260806-synopsys-dw-dp-improvements-v11-9-0d508505f383@collabora.com> References: <20260806-synopsys-dw-dp-improvements-v11-0-0d508505f383@collabora.com> In-Reply-To: <20260806-synopsys-dw-dp-improvements-v11-0-0d508505f383@collabora.com> To: Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Rob Herring , Krzysztof Kozlowski , Conor Dooley , David Airlie , Simona Vetter , Dmitry Baryshkov , Luca Ceresoli , Philipp Zabel Cc: Cristian Ciocaltea , Damon Ding , Dmitry Baryshkov , Alexey Charkov , dri-devel@lists.freedesktop.org, linux-rockchip@lists.infradead.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, kernel@collabora.com, linux-arm-kernel@lists.infradead.org, Sebastian Reichel X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=3804; i=sebastian.reichel@collabora.com; h=from:subject:message-id; bh=6qZ7A1oz5Axgnpp4GtqPS8WNzAaEjziX3V59HPLoil0=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGp0viA2oLTbGPrfeF1fSUlY7wWRiqYYBQYG3 0WQreawGeBxuIkCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqdL4gAAoJENju1/PI O/qacpQQAIAY+/RYcFy6YpPeU+CddLaw7vJg7XEWrOkvs4azi4PWuRJfEp8Hms61aQKA+qkil3o IijWR/tCOaiuSxiC8ylonyUL6vk6GOOvTol/4OiP5/QVq3tSMqFcAwtLAhvVfJRt9gA5mZJtDkX evidxQH5Tl2QJo2avPmVf02bydluGMSd2SzfRUbY2/Bjoo9kj4WukkkA0XdroatEoBmldJvrVyJ ydcexKFc1wVTd8t6kjpZarz4RzhBVlj+CyEovJUliRIKW7PITeQn50dZo0DepGsly7dO8j7Sq4P +ZntC0rAzcsqFsuAUSCY5VkDZjIrqKMpDOPKN1xw3BotzboH+uicTOXXamzJhuGEet7iHz79oMW bJxr9mCZ0Ec6n+QOLzu9+MRugdl33Q+xuzHdr/m5kH+A58aORd1JXnrfODhmB18NZ6F2j36X0GA Sl0Xx4FmGLxSroo3xL4moMFtMDoyOXNPcnH2IjYsZlIVHGrtbOCYXqLS8XI8yjEfCsuseYBwSFW MlkTSrjyER4/nphyvKfFtjFO5P3DgascOboRFMzp+7wE/H0+MteZqEXoGLckyrgliUnhyH7DmDG yWqQchJeaY59j/UCpwGCBbSigmK+Dcb2PyrQboIikKGMLWgvyC3L/R4LOYq/gB/VKXoGtnjQdzC C0Fe34cXu4FOfYatoqv8zMg== X-Developer-Key: i=sebastian.reichel@collabora.com; a=openpgp; fpr=EF660D07463F8B726A795413D8EED7F3C83BFA9A Add support for MEDIA_BUS_FMT_FIXED, which is e.g. requested for USB-C DP chains as the last bridge in the chain (aux-hpd-bridge) does not implement atomic_get_output_bus_fmts(), which results in the generic drm_atomic_bridge_chain_select_bus_fmts() code using MEDIA_BUS_FMT_FIXED instead. For decent support of this, two areas are changed: 1. In atomic_check, resolving MEDIA_BUS_FMT_FIXED output format by using the negotiated input format. 2. Implementing a custom .atomic_get_input_bus_fmts hook that, on MEDIA_BUS_FMT_FIXED, advertises all bandwidth-validated formats from dw_dp_bridge_atomic_get_output_bus_fmts(). This lets the upstream encoder negotiate the best mutually supported format. Signed-off-by: Sebastian Reichel Tested-by: Igor Paunovic --- drivers/gpu/drm/bridge/synopsys/dw-dp.c | 34 +++++++++++++++++++++++++++++= ++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/bridge/synopsys/dw-dp.c b/drivers/gpu/drm/brid= ge/synopsys/dw-dp.c index d35dcd4a413f..b9864a17c01d 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-dp.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-dp.c @@ -1537,6 +1537,7 @@ static int dw_dp_bridge_atomic_check(struct drm_bridg= e *bridge, struct drm_connector_state *conn_state) { struct drm_display_mode *adjusted_mode =3D &crtc_state->adjusted_mode; + unsigned int out_bus_format =3D bridge_state->output_bus_cfg.format; struct dw_dp *dp =3D bridge_to_dp(bridge); struct dw_dp_bridge_state *state; const struct dw_dp_output_format *fmt; @@ -1547,7 +1548,10 @@ static int dw_dp_bridge_atomic_check(struct drm_brid= ge *bridge, state =3D to_dw_dp_bridge_state(bridge_state); mode =3D &state->mode; =20 - fmt =3D dw_dp_get_output_format(bridge_state->output_bus_cfg.format); + if (out_bus_format =3D=3D MEDIA_BUS_FMT_FIXED) + out_bus_format =3D bridge_state->input_bus_cfg.format; + + fmt =3D dw_dp_get_output_format(out_bus_format); if (!fmt) return -EINVAL; =20 @@ -1830,6 +1834,32 @@ static u32 *dw_dp_bridge_atomic_get_output_bus_fmts(= struct drm_bridge *bridge, return output_fmts; } =20 +static u32 * +dw_dp_bridge_atomic_get_input_bus_fmts(struct drm_bridge *bridge, + struct drm_bridge_state *bridge_state, + struct drm_crtc_state *crtc_state, + struct drm_connector_state *conn_state, + u32 output_fmt, + unsigned int *num_input_fmts) +{ + /* + * MEDIA_BUS_FMT_FIXED means the downstream bridge does not constrain + * the bus format. In that case, advertise all formats supported by the + * DP link so the upstream encoder can negotiate the best match. + */ + if (output_fmt =3D=3D MEDIA_BUS_FMT_FIXED) + return dw_dp_bridge_atomic_get_output_bus_fmts(bridge, + bridge_state, + crtc_state, + conn_state, + num_input_fmts); + + return drm_atomic_helper_bridge_propagate_bus_fmt(bridge, bridge_state, + crtc_state, conn_state, + output_fmt, + num_input_fmts); +} + static struct drm_bridge_state *dw_dp_bridge_atomic_duplicate_state(struct= drm_bridge *bridge) { struct dw_dp_bridge_state *state; @@ -1882,7 +1912,7 @@ static const struct drm_bridge_funcs dw_dp_bridge_fun= cs =3D { .atomic_duplicate_state =3D dw_dp_bridge_atomic_duplicate_state, .atomic_destroy_state =3D drm_atomic_helper_bridge_destroy_state, .atomic_create_state =3D drm_atomic_helper_bridge_create_state, - .atomic_get_input_bus_fmts =3D drm_atomic_helper_bridge_propagate_bus_fmt, + .atomic_get_input_bus_fmts =3D dw_dp_bridge_atomic_get_input_bus_fmts, .atomic_get_output_bus_fmts =3D dw_dp_bridge_atomic_get_output_bus_fmts, .atomic_check =3D dw_dp_bridge_atomic_check, .mode_valid =3D dw_dp_bridge_mode_valid, --=20 2.53.0 From nobody Fri Oct 2 01:13:04 2026 Received: from bali.collaboradmins.com (bali.collaboradmins.com [148.251.105.195]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 361CF488DAF; Thu, 6 Aug 2026 17:02:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.251.105.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786035761; cv=none; b=FZGoMd5SSUuAysHuK3oOozgnx80NsESJRlOdEOLy3DIbRmpbtyF7EUVUl5xUCatekjvOy+wQHSxIZlo2Msv0jeo2NKJTYIzw9upWLwBoLzC2o3uDT4SXytjHRdQVTFZHidNVJ8CpX17ikXe7y8+6AdJyDdczV9iixefXX04/jm4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786035761; c=relaxed/simple; bh=txePxYwdFmmkXwiXxafgQt3MgLfgj0QplEgG4SoSLks=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=U/EgDGM2zcxEnEu4K5CaLF3SHWKXWhF+guxsx7Go9QLZ2x1ZFVtwNfE2aA8csPlT4Vc90JtRVM23JQwe0UzBlsSD3v2a8g+u4QdzytF7Z4LIRayJjhPOqXTiQoQvcynoaMnDAcZQF/ULTdKRWIWo9ahYpSV4/KM+i7bkcCWOxjc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b=RZ9mtBBg; arc=none smtp.client-ip=148.251.105.195 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=collabora.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="RZ9mtBBg" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1786035745; bh=txePxYwdFmmkXwiXxafgQt3MgLfgj0QplEgG4SoSLks=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=RZ9mtBBg6RV9apCkQJI6wu2VgN0IbivyR14qhQ9+ffnWBABiUaLTXcCdoaBESf+x5 qGZFC4hcKyjRQdEpgVaRCDyUreGm0c45QH4IxYEhBKtBaLV3AJAVzvZNZotPnEFDa+ ZYqJ9FQAA5yivdDu+vyEIlnmSTrKrspSiN6DxfGx73q2so5CeO325wlLG1VXtJxMeJ Z1g5V17yXfq+iM2J+j3ywUT5wdCp3FCgmdDYP9/qOmH7CqVxKEdgHQReY5k3vnacet ZMcKWz05rthnc7VM6IVx2nRJooz57HbwsZAS3gSxRWFMPqbv/AKXCAgaOWtEpyn4mk I1x7XKHOp4XKA== Received: from jupiter.universe (unknown [100.64.1.62]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519) (No client certificate requested) (Authenticated sender: sre) by bali.collaboradmins.com (Postfix) with ESMTPSA id AB1AC17E11E6; Thu, 06 Aug 2026 19:02:25 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 06A40480047; Thu, 06 Aug 2026 19:02:25 +0200 (CEST) From: Sebastian Reichel Date: Thu, 06 Aug 2026 19:02:16 +0200 Subject: [PATCH v11 10/21] drm/bridge: synopsys: dw-dp: Add follow-up bridge support Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260806-synopsys-dw-dp-improvements-v11-10-0d508505f383@collabora.com> References: <20260806-synopsys-dw-dp-improvements-v11-0-0d508505f383@collabora.com> In-Reply-To: <20260806-synopsys-dw-dp-improvements-v11-0-0d508505f383@collabora.com> To: Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Rob Herring , Krzysztof Kozlowski , Conor Dooley , David Airlie , Simona Vetter , Dmitry Baryshkov , Luca Ceresoli , Philipp Zabel Cc: Cristian Ciocaltea , Damon Ding , Dmitry Baryshkov , Alexey Charkov , dri-devel@lists.freedesktop.org, linux-rockchip@lists.infradead.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, kernel@collabora.com, linux-arm-kernel@lists.infradead.org, Sebastian Reichel X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=3017; i=sebastian.reichel@collabora.com; h=from:subject:message-id; bh=txePxYwdFmmkXwiXxafgQt3MgLfgj0QplEgG4SoSLks=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGp0viALByinijk1o/bDaiGRhFLpnvzN1yAnp FZRZBagCca5SYkCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqdL4gAAoJENju1/PI O/qahEYP+wccCQMpIU4jFcMT0PcwZlmt71631i2RBhQDp3znJdPa6E4eQpTsBxCrZH2rwPeTCya O7CV02gRZZ9DYUvR59kzH3VTxyOf0EbO+akq7dHzSiwRZ2PtJhTvUgRYvRkLBaFol/Y/I/XP7Ss 4WrW4mDUNIcpxOCqrpyU0iH/3MJKhhTXHQ0rxlQr26h/SfgACs+xQZSgKBx9ol3uuMVJtH4VLz5 0NOa/8Fe7oKFmYH0mQac7Wh9m08Y4bmH4VRryewLisqIowetUNA/q79wFFEoriuExB59SfRft1b nkqkp1p09Jt57O5uhtDFs2pQWr8TMrO1fpbC/AQUrQtUU4AoZDZye/BVQId75nBEhvwJwdBwcDu 0yymk8NeGn4/fc1bMZ7WlptqecCogPWKxiwx8XHf0vL7J6o4Vx6IZaNleRUMhxA4Q8Ql2WzmJ47 pRN/tsfGWD5uYN33Bz9S9ljKpAE9kKBy69rVb80Qt93LxIctk5N0e82zagJi7+iT6H24oYiHjKn La276iOiest4wCftuJhHwsmFPPR824L1TtvJL4NML5mhXXYRlLjBM5HRzMdp+LZHqaKZdm464YK 2pziLS03IhZ7P6+1LHdpi8t2oMM/DCG3fHHcftB0yBJKj7CsHbpRbzFvV7oL1uAkb32Ea85W3p8 GwzL6LPACWuYga0t55hwrEg== X-Developer-Key: i=sebastian.reichel@collabora.com; a=openpgp; fpr=EF660D07463F8B726A795413D8EED7F3C83BFA9A Add support to use USB-C connectors with the DP altmode helper code on devicetree based platforms. To get this working there must be a DRM bridge chain from the DisplayPort controller to the USB-C connector. E.g. on Rockchip RK3576: root@rk3576 # cat /sys/kernel/debug/dri/0/encoder-0/bridges bridge[0]: dw_dp_bridge_funcs refcount: 7 type: [10] DP OF: /soc/dp@27e40000:rockchip,rk3576-dp ops: [0x47] detect edid hpd bridge[1]: drm_aux_bridge_funcs refcount: 4 type: [0] Unknown OF: /soc/phy@2b010000:rockchip,rk3576-usbdp-phy ops: [0x0] bridge[2]: drm_aux_hpd_bridge_funcs refcount: 5 type: [10] DP OF: /soc/i2c@2ac50000/typec-portc@22/connector:usb-c-connector ops: [0x4] hpd It's fine to fatally error out when there is no follow-up bridge as the Rockchip Designware Displayport controller is the only user of the bridge helper and has the port marked as required in its binding. Signed-off-by: Sebastian Reichel Reviewed-by: Chaoyi Chen Tested-by: Igor Paunovic --- drivers/gpu/drm/bridge/synopsys/dw-dp.c | 34 +++++++++++++++++++++++++++++= ++++ 1 file changed, 34 insertions(+) diff --git a/drivers/gpu/drm/bridge/synopsys/dw-dp.c b/drivers/gpu/drm/brid= ge/synopsys/dw-dp.c index b9864a17c01d..a6099f7ddc87 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-dp.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-dp.c @@ -330,6 +330,8 @@ struct dw_dp { struct dw_dp_plat_data plat_data; u8 pixel_mode; =20 + struct drm_bridge *next_bridge; + DECLARE_BITMAP(sdp_reg_bank, SDP_REG_BANK_SIZE); }; =20 @@ -1894,7 +1896,22 @@ static int dw_dp_bridge_attach(struct drm_bridge *br= idge, =20 enable_irq(dp->irq); =20 + ret =3D drm_bridge_attach(encoder, dp->next_bridge, bridge, + DRM_BRIDGE_ATTACH_NO_CONNECTOR); + if (ret) { + dev_err(dev, "Failed to attach next bridge: %d\n", ret); + goto err_disable_irq; + } + return 0; + +err_disable_irq: + disable_irq(dp->irq); + cancel_work_sync(&dp->hpd_work); + + drm_dp_aux_unregister(&dp->aux); + + return ret; } =20 static void dw_dp_bridge_detach(struct drm_bridge *bridge) @@ -2060,6 +2077,13 @@ void dw_dp_unbind(struct dw_dp *dp) } EXPORT_SYMBOL_GPL(dw_dp_unbind); =20 +static void dw_dp_put_next_bridge(void *data) +{ + struct dw_dp *dp =3D data; + + drm_bridge_put(dp->next_bridge); +} + static void dw_dp_phy_exit(void *data) { struct dw_dp *dp =3D data; @@ -2157,6 +2181,16 @@ struct dw_dp *dw_dp_probe(struct platform_device *pd= ev, const struct dw_dp_plat_ return ERR_PTR(ret); } =20 + dp->next_bridge =3D of_drm_get_bridge_by_endpoint(dev->of_node, 1, 0); + if (IS_ERR(dp->next_bridge)) { + dev_err_probe(dev, PTR_ERR(dp->next_bridge), "failed to get follow-up br= idge\n"); + return ERR_CAST(dp->next_bridge); + } + + ret =3D devm_add_action_or_reset(dev, dw_dp_put_next_bridge, dp); + if (ret) + return ERR_PTR(ret); + dw_dp_init_hw(dp); =20 ret =3D phy_init(dp->phy); --=20 2.53.0 From nobody Fri Oct 2 01:13:04 2026 Received: from bali.collaboradmins.com (bali.collaboradmins.com [148.251.105.195]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A2AED483BDD; Thu, 6 Aug 2026 17:02:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.251.105.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786035759; cv=none; b=uqgwbRdVvC0B4yhLZZZ3v1XVb13mVIvVtiByx4xRxyoh8gGaNK2GT2bf8XjAy3lgXHBxEUaHiIq0ChZJHkhSi4i/AYgig3GMxbfWfPeyzNVyXrGD0m4fft/zXN8vyoJNMGv9qcjJ5WEwoAiqrcWnrd4wr0Nj9vH6cSMzYKRBr9k= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786035759; c=relaxed/simple; bh=rAX8Gkdd0l2SvPThxGwSATdesygL1W5j4bmXRGpe4TM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=OEf6xwys5+/wNHvN0DgPptdwL7LupkkAOWwoGYqL37450Z2DAly67nEmFNwtLNo4U9LQT3RALrE3U87pelhUmBpCULZB+e/JTcxKVLpJQGW8FKpF3ghbQt3wNk+wzEMKCNof43WBUcTkFuJiWoYMYmZ/FYJ8uMI3moqnjtEU/kg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b=YKszsNd5; arc=none smtp.client-ip=148.251.105.195 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=collabora.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="YKszsNd5" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1786035746; bh=rAX8Gkdd0l2SvPThxGwSATdesygL1W5j4bmXRGpe4TM=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=YKszsNd57LBFMgg6RmSH7eBUG2J9Uy+T2nVzGghiQxr2m8TI3qzAimrUcm36m/blw B8310f5slxWUyW+QNKSBZMMmEFWxObZooZFDVHsZZW4ONy8ahTLpLU/ZWkgBGaImPG iXFf0+eyAxPD8zpcsfGrNmrrTiwJpVCvPs/2pIyZd263YXrjmBvCtMQKrl26+u3Vot bUkAoFJw+VM6TxdguWhnbSJjUXJkgtkVLy3EWjimc9gzQFVLK2/SS9/CcsjMcz0nLv CSLBiwe3A5T5s/JjvSe9852nYf5JmblFPLmMfE7a+ill59DpH4oIJrL1C6u/r52RI5 DBgekpEJqsnHw== Received: from jupiter.universe (unknown [100.64.1.62]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519) (No client certificate requested) (Authenticated sender: sre) by bali.collaboradmins.com (Postfix) with ESMTPSA id B12FE17E11EA; Thu, 06 Aug 2026 19:02:25 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 08163480048; Thu, 06 Aug 2026 19:02:25 +0200 (CEST) From: Sebastian Reichel Date: Thu, 06 Aug 2026 19:02:17 +0200 Subject: [PATCH v11 11/21] drm/bridge: Add out-of-band HPD notify handler Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260806-synopsys-dw-dp-improvements-v11-11-0d508505f383@collabora.com> References: <20260806-synopsys-dw-dp-improvements-v11-0-0d508505f383@collabora.com> In-Reply-To: <20260806-synopsys-dw-dp-improvements-v11-0-0d508505f383@collabora.com> To: Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Rob Herring , Krzysztof Kozlowski , Conor Dooley , David Airlie , Simona Vetter , Dmitry Baryshkov , Luca Ceresoli , Philipp Zabel Cc: Cristian Ciocaltea , Damon Ding , Dmitry Baryshkov , Alexey Charkov , dri-devel@lists.freedesktop.org, linux-rockchip@lists.infradead.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, kernel@collabora.com, linux-arm-kernel@lists.infradead.org, Sebastian Reichel X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=2377; i=sebastian.reichel@collabora.com; h=from:subject:message-id; bh=rAX8Gkdd0l2SvPThxGwSATdesygL1W5j4bmXRGpe4TM=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGp0viBOEovsgmLL5J734CoosVWpih7btQnop 6iZAdW40N1SCYkCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqdL4gAAoJENju1/PI O/qaa2oP/16SxJH80ZYkQowF/nlkGFrxxMQOlgFEm0DjslvzLev47fpfsc4tX6dB+JXaJOs28XX qXC6Y4Jg0guyLJSrtma+VeE1NWg060sPCE1Dc1TWprnNXKbMEi+ir8vbBUc3NYSi/nrIo66b4gH 6WXRjZ/dO3UBzB6iHqp+EEQt2liZEPhU1nEIqspzj1RTKWHhjlGsZGxNFPDrLzCTddTUKlv+NNH cWM1EWE/qEh4twvwNdiHzzP0gfIQA6fLSA7oYREs52C6HLji7AgiZtsAPxKGKQ5o0Zc0o2lNmcs GGNc7OZ1yKTtuFkv+rDNlJocoJI/pDvqOBFjSPUmIO3Z6vwD3ywrY21+JBZOePWy4nfKUB+k+FE yYOakRWvLlqa/q8YUzuz7Igh5ext+t9d17aRNCwB0U3BJXIk20fohVfeg61zjktbI4gyoOeIGNl Jmy95ooJ6ptqJvThbt7zLpNwcgnJ0vGivJ9kDuDs+zsLMa2eP90LaEJHGnu5x4VFGFDxwpo/72u v/X3qzPyATJLS/zTzXZKB4p79HXyR6qBRaKBzqb0ExGJwC8qFSi2jZl5yMY8w8KfphYMFT6HwmG O0CXOvJ7fcWreaF0WG1FPykDdvi9mpb1ydAdAlJRdOSBNK6Fr8J8j2AV199SzgLgbSGY+C20B+z PJ+qQR7+sCEnEd6xLr2s3Wg== X-Developer-Key: i=sebastian.reichel@collabora.com; a=openpgp; fpr=EF660D07463F8B726A795413D8EED7F3C83BFA9A For DP bridges, that can be used for DP AltMode, it might be necessary to enforce HPD status. There is an existing ->oob_hotplug_event() on the DRM connector, but it currently just calls into hpd_notify(). As DP bridge drivers usually also implement .detect and that also generates calls into hpd_notify, this is a bad place to force the HPD status as the follow-up detect call might force it off again resulting in all follow-up calls to the detection routine also failing. Avoid this by having a dedicated function for OOB events. Signed-off-by: Sebastian Reichel Tested-by: Igor Paunovic --- drivers/gpu/drm/display/drm_bridge_connector.c | 6 ++++++ include/drm/drm_bridge.h | 14 ++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/drivers/gpu/drm/display/drm_bridge_connector.c b/drivers/gpu/d= rm/display/drm_bridge_connector.c index 8b54069fa53a..632cc3ae3b54 100644 --- a/drivers/gpu/drm/display/drm_bridge_connector.c +++ b/drivers/gpu/drm/display/drm_bridge_connector.c @@ -180,6 +180,12 @@ static void drm_bridge_connector_oob_hotplug_event(str= uct drm_connector *connect struct drm_bridge_connector *bridge_connector =3D to_drm_bridge_connector(connector); =20 + /* Notify all bridges in the pipeline of hotplug events. */ + drm_for_each_bridge_in_chain(bridge_connector->encoder, bridge) { + if (bridge->funcs->oob_notify) + bridge->funcs->oob_notify(bridge, connector, status); + } + drm_bridge_connector_handle_hpd(bridge_connector, status); } =20 diff --git a/include/drm/drm_bridge.h b/include/drm/drm_bridge.h index 58fff047f43b..713652fca033 100644 --- a/include/drm/drm_bridge.h +++ b/include/drm/drm_bridge.h @@ -540,6 +540,20 @@ struct drm_bridge_funcs { */ void (*hpd_disable)(struct drm_bridge *bridge); =20 + /** + * @oob_notify: + * + * Notify the bridge of out of band hot plug detection. + * + * This callback is optional, it may be implemented by bridges that + * need to be notified of display connection or disconnection for + * internal reasons. One use case is to force the DP controllers HPD + * signal for USB-C DP AltMode. + */ + void (*oob_notify)(struct drm_bridge *bridge, + struct drm_connector *connector, + enum drm_connector_status status); + /** * @hdmi_tmds_char_rate_valid: * --=20 2.53.0 From nobody Fri Oct 2 01:13:04 2026 Received: from bali.collaboradmins.com (bali.collaboradmins.com [148.251.105.195]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A2C1A48874D; Thu, 6 Aug 2026 17:02:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.251.105.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786035761; cv=none; b=RZTFyQ4Kal88YrQipJ47WmAGp2ydJ8KUL7Ud/s+QG9Mr1mM8BFEmU7fgylZNW5ezBy2wM212+dFfo7dSQfhcFIh831BWYOmKsAcLeBtFkqg1jk1ZwtcJCy8g2KQQiBUQf+I1D/lltjE9Zeh1CzeVkAFG11OJbAd32QKosOsNnlg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786035761; c=relaxed/simple; bh=Vi2DWBLkp7BA7pxSSPHO/Gv/jDm6EqjBm8PNB7RSSxM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=DZdz4JMDNxHle+AfQGxldQnzfIVfVdEEXoVhxYBps2fWlEFyT8DMSCtWzDXQ31vYBp/XGG/ZsmtYFjiVlCEkoyLu7j7WmPDwI2C4Yahn77Z8aGPFffx6O5GDMOyOePFtVadt5yZu9Rz5uWsKTlWx8R5BClNALU9SeuORwZA+ciM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b=a4HLd9t1; arc=none smtp.client-ip=148.251.105.195 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=collabora.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="a4HLd9t1" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1786035745; bh=Vi2DWBLkp7BA7pxSSPHO/Gv/jDm6EqjBm8PNB7RSSxM=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=a4HLd9t1f1WVhNO+Y2lsrsXPIR2Dg2iE+/EAqbTTefiZH4XCz7LGOY6YS663L2GR/ ITxug1FzaU1goqHJJiXBLbZDdNO0IK5qgZu2UNjY7+JfVWUjIUiRR32O0L5+xeO1WR nrdFeIsCqp9HZbQVp2myyxUpREN5Xm6XLXZZj8ED1czGHql67cZBVv17Nr/tbQteVY Qms7BM6Wbaope/2KboW9rSPFLrFRlGyzgOEhDWvF7odZpMDccVyIXi0cbxV4zR24g7 D4GcHEWYleeRm24sSN97CsmerbTqsXbHZ+/X/87ANnwG3sTCKL/LCEkK8hqspEoFiX DoliuOB0vrL+A== Received: from jupiter.universe (unknown [100.64.1.62]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519) (No client certificate requested) (Authenticated sender: sre) by bali.collaboradmins.com (Postfix) with ESMTPSA id B5BA317E121B; Thu, 06 Aug 2026 19:02:25 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 096BE48004C; Thu, 06 Aug 2026 19:02:25 +0200 (CEST) From: Sebastian Reichel Date: Thu, 06 Aug 2026 19:02:18 +0200 Subject: [PATCH v11 12/21] drm/bridge: synopsys: dw-dp: Support software triggered OOB HPD Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260806-synopsys-dw-dp-improvements-v11-12-0d508505f383@collabora.com> References: <20260806-synopsys-dw-dp-improvements-v11-0-0d508505f383@collabora.com> In-Reply-To: <20260806-synopsys-dw-dp-improvements-v11-0-0d508505f383@collabora.com> To: Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Rob Herring , Krzysztof Kozlowski , Conor Dooley , David Airlie , Simona Vetter , Dmitry Baryshkov , Luca Ceresoli , Philipp Zabel Cc: Cristian Ciocaltea , Damon Ding , Dmitry Baryshkov , Alexey Charkov , dri-devel@lists.freedesktop.org, linux-rockchip@lists.infradead.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, kernel@collabora.com, linux-arm-kernel@lists.infradead.org, Sebastian Reichel X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=3715; i=sebastian.reichel@collabora.com; h=from:subject:message-id; bh=Vi2DWBLkp7BA7pxSSPHO/Gv/jDm6EqjBm8PNB7RSSxM=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGp0viB3bwBopZcY3L9Pn+/IzYyAUNUHYrKn1 gdvIX4WpJ2coIkCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqdL4gAAoJENju1/PI O/qa2PUP/A1O6uIOHjQA65v1LL//7YdVhisyfqxIVCoXbbNg2V4Pdz6mBDm+ixFoxdVnyOjScl3 0Dn0HEFSl93MfFe1mzbs2fkxPrI+IXiP5JCZSaNITbrrxnjMLBNMz3EcHjQ1Ax7qn7i+538pDKf 6FqNJ6TmZDoigAdTECNhImBiX3zRg5qsp1S6vr4848qtyXKSJApS17VF5N86Chboa6x+Oicq2St DZ71drDgM7mHRZ9y/VdcD+++RFnAO9TLJXazkMHqLlKqLXaGEpRt5Jvpc1AiKd4VU3ZCr9lMm5W 84Tbzw1us+SSnmiWLHhAGvm6TxfUY1NBjBVYoaUA+RkBb/M6KTZFBVlrw4W/EcKeSbI1IzYO9Rn X7UNOsHzsmDA/2coIUVzjB0IxCSLwhBEuzUdgTIKvf4TjVE6KA3ja0GwAyJuGhMwEsPv/v5r+YV JQ85v7NJv34s61SNlTUt1+byncvu+mHy8pE6cVqt86ZRPAgw1XUcYvvutGkc8P4JoqAjFjKOaGP ZrpjRvocEqHefsOK1z2d2l7BrZ2uZjQz86gjoDalGJbvbUYK1tG4gm4EHVgi6aGFhHrUtzehdur 968ViOfrYEI7Mtke4ED1TdelIe0Qh8HRWuaWSdQkqPiWDm3PXxPowY81LRO9OMdl2kWYtbkvBTb jeoVmTiDaELdSXhLyN/AqBA== X-Developer-Key: i=sebastian.reichel@collabora.com; a=openpgp; fpr=EF660D07463F8B726A795413D8EED7F3C83BFA9A Add support for USB-C DP AltMode out-of-band hotplug handling. The handling itself is implemented in the platform specific driver as the registers to force HPD state are not part of the Designware DisplayPort IP itself. Instead the platform integration might provide the necessary functionality to mux the HPD signal. Signed-off-by: Sebastian Reichel Tested-by: Igor Paunovic --- drivers/gpu/drm/bridge/synopsys/dw-dp.c | 38 +++++++++++++++++++++++++++++= ++++ include/drm/bridge/dw_dp.h | 3 +++ 2 files changed, 41 insertions(+) diff --git a/drivers/gpu/drm/bridge/synopsys/dw-dp.c b/drivers/gpu/drm/brid= ge/synopsys/dw-dp.c index a6099f7ddc87..3af5b1f643c1 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-dp.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-dp.c @@ -1875,6 +1875,19 @@ static struct drm_bridge_state *dw_dp_bridge_atomic_= duplicate_state(struct drm_b return &state->base; } =20 +static bool dw_dp_is_routed_to_usb_c(struct drm_encoder *encoder) +{ + struct drm_bridge *last_bridge __free(drm_bridge_put) =3D NULL; + struct fwnode_handle *fwnode; + + last_bridge =3D drm_bridge_chain_get_last_bridge(encoder); + if (!last_bridge) + return false; + + fwnode =3D of_fwnode_handle(last_bridge->of_node); + return fwnode_device_is_compatible(fwnode, "usb-c-connector"); +} + static int dw_dp_bridge_attach(struct drm_bridge *bridge, struct drm_encoder *encoder, enum drm_bridge_attach_flags flags) @@ -1903,6 +1916,13 @@ static int dw_dp_bridge_attach(struct drm_bridge *br= idge, goto err_disable_irq; } =20 + if (dw_dp_is_routed_to_usb_c(encoder)) { + dev_dbg(dev, "USB-C mode\n"); + + if (dp->plat_data.hpd_sw_sel) + dp->plat_data.hpd_sw_sel(dp->plat_data.data, 1); + } + return 0; =20 err_disable_irq: @@ -1923,6 +1943,19 @@ static void dw_dp_bridge_detach(struct drm_bridge *b= ridge) drm_dp_aux_unregister(&dp->aux); } =20 +static void dw_dp_bridge_oob_notify(struct drm_bridge *bridge, + struct drm_connector *connector, + enum drm_connector_status status) +{ + bool hpd_high =3D status !=3D connector_status_disconnected; + struct dw_dp *dp =3D bridge_to_dp(bridge); + + if (dp->plat_data.hpd_sw_cfg) + dp->plat_data.hpd_sw_cfg(dp->plat_data.data, hpd_high); + else + dev_err_once(dp->dev, "Missing platform handler for OOB HPD handling\n"); +} + static const struct drm_bridge_funcs dw_dp_bridge_funcs =3D { .attach =3D dw_dp_bridge_attach, .detach =3D dw_dp_bridge_detach, @@ -1937,6 +1970,7 @@ static const struct drm_bridge_funcs dw_dp_bridge_fun= cs =3D { .atomic_disable =3D dw_dp_bridge_atomic_disable, .detect =3D dw_dp_bridge_detect, .edid_read =3D dw_dp_bridge_edid_read, + .oob_notify =3D dw_dp_bridge_oob_notify, }; =20 static int dw_dp_link_retrain(struct dw_dp *dp) @@ -2105,6 +2139,10 @@ struct dw_dp *dw_dp_probe(struct platform_device *pd= ev, const struct dw_dp_plat_ =20 dp->dev =3D dev; dp->pixel_mode =3D plat_data->pixel_mode; + + dp->plat_data.hpd_sw_sel =3D plat_data->hpd_sw_sel; + dp->plat_data.hpd_sw_cfg =3D plat_data->hpd_sw_cfg; + dp->plat_data.data =3D plat_data->data; dp->plat_data.max_link_rate =3D plat_data->max_link_rate; =20 INIT_WORK(&dp->hpd_work, dw_dp_hpd_work); diff --git a/include/drm/bridge/dw_dp.h b/include/drm/bridge/dw_dp.h index a82412a9e769..79b2cdf0df99 100644 --- a/include/drm/bridge/dw_dp.h +++ b/include/drm/bridge/dw_dp.h @@ -20,6 +20,9 @@ enum { struct dw_dp_plat_data { u32 max_link_rate; u8 pixel_mode; + void *data; + void (*hpd_sw_sel)(void *data, bool hpd); + void (*hpd_sw_cfg)(void *data, bool hpd); }; =20 int dw_dp_bind(struct dw_dp *dp, struct drm_encoder *encoder); --=20 2.53.0 From nobody Fri Oct 2 01:13:04 2026 Received: from bali.collaboradmins.com (bali.collaboradmins.com [148.251.105.195]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 22D5848A2DF; Thu, 6 Aug 2026 17:02:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.251.105.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786035762; cv=none; b=IrWcX8nAf5gd1BkqzQuCeY36TgsTBp6E9P2rsrg2jvuAPHGWQgv3xJCJOWUs5ZUX0fspCzQb+0Kizl+wyYe7usuroMKjnssFnqQqFykZm/Np0T2XONMgD5EgX6VlbtA49V0sOVzDgHZAFH55hj6QGyX5FA5OX8StEzoTSOI93Jo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786035762; c=relaxed/simple; bh=8AzTw6Q7BgLg8qygPB9irNWnzZO5bZlDFBZ2JLmp7kk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=X7jyTtXYGTHkj97ScH0JQoTb+u8oZCu7tSxyNcHocBjBUbvriCpmNSJX6zP3uzdTLnDqzSs3JgGjC2MHPjjV4NhexUYgFleFAGzbNSJGIgfx3HhR36TjkzhctLezjI7eXlXwIVshKmmb5sjrllXLy3UYv3Ilt+9DxC9lDleei2M= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b=frpr5RoL; arc=none smtp.client-ip=148.251.105.195 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=collabora.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="frpr5RoL" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1786035746; bh=8AzTw6Q7BgLg8qygPB9irNWnzZO5bZlDFBZ2JLmp7kk=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=frpr5RoLTdZ48juveo8BvEgkXDQ88GcjAnJTLp+ha4DWbrtk2wBlnSykEgsPnGp6L Ve7007hwaZci32CIHKDlWUEV1xOikA1DNgK5JIJ4fVwd7OlTOJRKIxpAtHAZySiv7B 99kh6CdgLhmtP/8xB/SuUHAYVSFieaspNONXevpcp4Iw+ml9wdTmYA8WSnB33mawbP QzBenYTUW4Z1Ly3jWIaZiFkVtfCNoZzNsiBFr1FdqqLFN/tXWlYxKNve0+g+amnvBO OuOvuFrtbxlENFcNYxpzc24MGflh832YZ7iekBxQm+qDCe1OmiKHrzcDN1ZnAQHSo5 YC7rg61dQ8yYA== Received: from jupiter.universe (unknown [100.64.1.62]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519) (No client certificate requested) (Authenticated sender: sre) by bali.collaboradmins.com (Postfix) with ESMTPSA id BBBEB17E121D; Thu, 06 Aug 2026 19:02:25 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 0AD3348004E; Thu, 06 Aug 2026 19:02:25 +0200 (CEST) From: Sebastian Reichel Date: Thu, 06 Aug 2026 19:02:19 +0200 Subject: [PATCH v11 13/21] drm/rockchip: dw_dp: Implement out-of-band HPD handling Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260806-synopsys-dw-dp-improvements-v11-13-0d508505f383@collabora.com> References: <20260806-synopsys-dw-dp-improvements-v11-0-0d508505f383@collabora.com> In-Reply-To: <20260806-synopsys-dw-dp-improvements-v11-0-0d508505f383@collabora.com> To: Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Rob Herring , Krzysztof Kozlowski , Conor Dooley , David Airlie , Simona Vetter , Dmitry Baryshkov , Luca Ceresoli , Philipp Zabel Cc: Cristian Ciocaltea , Damon Ding , Dmitry Baryshkov , Alexey Charkov , dri-devel@lists.freedesktop.org, linux-rockchip@lists.infradead.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, kernel@collabora.com, linux-arm-kernel@lists.infradead.org, Sebastian Reichel X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=6435; i=sebastian.reichel@collabora.com; h=from:subject:message-id; bh=8AzTw6Q7BgLg8qygPB9irNWnzZO5bZlDFBZ2JLmp7kk=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGp0viCYPQTnASeQnQg6C6MedD/ncl7bqKxUg BhCyIgIOhrd6IkCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqdL4gAAoJENju1/PI O/qaE1oQAJHN3RjzdL1PAV3pwLfdr9Bmy+nvpSHiWUEUfy3Ze3oMO+cLgdFZuSFKD8nw/d8MD/Q g4GVE6PJ/PBgkEMiLJQGf6U2OO5toMqnnBR65F+nVnABT5CQHjh4snWEy0kEfBJBK4kmTIeOOkW NswUAB+RNOnVCBNaGFNgkEQSk2d/aGwP1TwXYJcIUCA91/SOjWfh67MvvUf+sNd6gz/kSm0ftoh 0bcGt+/F1R3YZRQJeZOIs4gTXNr3UPtd2b70Gn2n6XXeVnS9vaxLP4R3ILfXuIKUFV32nxPeJqi wfiniWMe234QOv8HCve4Vh7debVAirJTAiCXyFYh6jIVC+HUJq5weLcEABTJosRYTGiqBzwa51L b3aKxP2Jw8423EPwkbLnrZn+cbrsfQh+VCTfp6HiMSobAS+pTiyui4VVIyaxcZfSzOvnkkKXBiE mkE47oeB0bli+4G+SNQF7AUVjL67CA8sKOIs9VidPDxsB38zsqkAjy1hb4VnC2ZEwhRRbsnoZbQ K9DIpqxPrXJfGvHFOt6x3raI9PXIRjkLKzPdbRJZoC4uKOsMaSq9lbaqQsKfRxdiWt7ilapF/dd lwRVwh45msRyHzvOAhnrL+qMUZ/D0lCZNnHb/5jatLNcat5KFhqw7R+Li78TNguvy+IpNJ55Hvl JQCMxd7+PzF0xi6tAtAopig== X-Developer-Key: i=sebastian.reichel@collabora.com; a=openpgp; fpr=EF660D07463F8B726A795413D8EED7F3C83BFA9A Implement out-of-band hotplug handling, which will be used to receive external hotplug information from the USB-C state machine. This is currently handled by the USBDP PHY, which brings quite some trouble as the register being accessed requires the power-domain from the DP controller. Thus this patch prevents massive SError problems once runtime PM is implemented (and enabled) in the DP driver. Apart from that it avoids custom TypeC HPD info parsing in the USBDP PHY driver. In contrast to the USBDP PHY this does not just enable the hotplug signal when a DP AltMode capable adapter is plugged in, but instead properly detects if a cable is plugged in for things like USB-C to HDMI adapters. Signed-off-by: Sebastian Reichel Tested-by: Igor Paunovic --- drivers/gpu/drm/rockchip/dw_dp-rockchip.c | 118 ++++++++++++++++++++++++++= ++-- 1 file changed, 113 insertions(+), 5 deletions(-) diff --git a/drivers/gpu/drm/rockchip/dw_dp-rockchip.c b/drivers/gpu/drm/ro= ckchip/dw_dp-rockchip.c index 38e8fe75718e..9e49e7dbf420 100644 --- a/drivers/gpu/drm/rockchip/dw_dp-rockchip.c +++ b/drivers/gpu/drm/rockchip/dw_dp-rockchip.c @@ -7,9 +7,12 @@ */ =20 #include +#include #include +#include #include #include +#include #include =20 #include @@ -23,12 +26,48 @@ =20 #include "rockchip_drm_drv.h" =20 +#define ROCKCHIP_MAX_CTRLS 2 + +#define ROCKCHIP_VO_GRF_DP_SINK_HPD_SEL BIT(10) +#define ROCKCHIP_VO_GRF_DP_SINK_HPD_CFG BIT(11) + +struct rockchip_dw_dp_plat_data { + u8 num_ctrls; + u64 ctrl_ids[ROCKCHIP_MAX_CTRLS]; + u32 max_link_rate; + u8 pixel_mode; + u32 hpd_reg[ROCKCHIP_MAX_CTRLS]; +}; + struct rockchip_dw_dp { struct dw_dp *base; struct device *dev; + const struct rockchip_dw_dp_plat_data *pdata; + struct regmap *vo_grf; struct rockchip_encoder *encoder; + int id; }; =20 +static void dw_dp_rockchip_hpd_sw_sel(void *data, bool force_hpd_from_sw) +{ + struct rockchip_dw_dp *dp =3D data; + u32 hpd_reg =3D dp->pdata->hpd_reg[dp->id]; + + regmap_write(dp->vo_grf, hpd_reg, + FIELD_PREP_WM16(ROCKCHIP_VO_GRF_DP_SINK_HPD_SEL, force_hpd_from_sw)= ); +} + +static void dw_dp_rockchip_hpd_sw_cfg(void *data, bool hpd) +{ + struct rockchip_dw_dp *dp =3D data; + u32 hpd_reg =3D dp->pdata->hpd_reg[dp->id]; + + dev_dbg(dp->dev, "Force HPD connected=3D%s\n", str_yes_no(hpd)); + + regmap_write(dp->vo_grf, hpd_reg, + FIELD_PREP_WM16(ROCKCHIP_VO_GRF_DP_SINK_HPD_CFG, hpd)); +} + static int dw_dp_encoder_atomic_check(struct drm_encoder *encoder, struct drm_crtc_state *crtc_state, struct drm_connector_state *conn_state) @@ -71,6 +110,35 @@ static const struct drm_encoder_helper_funcs dw_dp_enco= der_helper_funcs =3D { .atomic_check =3D dw_dp_encoder_atomic_check, }; =20 +static struct regmap *dw_dp_rockchip_get_vo_grf(struct rockchip_dw_dp *dp) +{ + struct device_node *np =3D dev_of_node(dp->dev); + struct of_phandle_args args; + struct regmap *regmap; + int ret; + + ret =3D of_parse_phandle_with_args(np, "phys", "#phy-cells", 0, &args); + if (ret) + return ERR_PTR(-ENODEV); + + /* + * Limit this workaround to RK3576 and RK3588, potential future platforms + * reusing the driver should just add a VO GRF phandle in the DisplayPort + * controller DT node. + */ + if (!of_device_is_compatible(args.np, "rockchip,rk3576-usbdp-phy") && + !of_device_is_compatible(args.np, "rockchip,rk3588-usbdp-phy")) { + regmap =3D ERR_PTR(-ENODEV); + goto out_put_node; + } + + regmap =3D syscon_regmap_lookup_by_phandle(args.np, "rockchip,vo-grf"); + +out_put_node: + of_node_put(args.np); + return regmap; +} + static int dw_dp_rockchip_bind(struct device *dev, struct device *master, = void *data) { struct rockchip_dw_dp *dp =3D dev_get_drvdata(dev); @@ -121,19 +189,53 @@ static const struct component_ops dw_dp_rockchip_comp= onent_ops =3D { =20 static int dw_dp_rockchip_probe(struct platform_device *pdev) { - const struct dw_dp_plat_data *plat_data; + const struct rockchip_dw_dp_plat_data *plat_data_const; + struct dw_dp_plat_data *plat_data; struct device *dev =3D &pdev->dev; struct rockchip_dw_dp *dp; + struct resource *res; + int id; =20 - plat_data =3D of_device_get_match_data(dev); - if (!plat_data) + plat_data_const =3D device_get_match_data(dev); + if (!plat_data_const) return -ENODEV; =20 + plat_data =3D devm_kzalloc(dev, sizeof(*plat_data), GFP_KERNEL); + if (!plat_data) + return -ENOMEM; + dp =3D devm_kzalloc(dev, sizeof(*dp), GFP_KERNEL); if (!dp) return -ENOMEM; platform_set_drvdata(pdev, dp); dp->dev =3D dev; + dp->pdata =3D plat_data_const; + + res =3D platform_get_mem_or_io(pdev, 0); + if (!res) + return -ENODEV; + + /* find the DisplayPort ID from the io address */ + dp->id =3D -ENODEV; + for (id =3D 0; id < plat_data_const->num_ctrls; id++) { + if (res->start =3D=3D plat_data_const->ctrl_ids[id]) { + dp->id =3D id; + break; + } + } + + if (dp->id < 0) + return dp->id; + + dp->vo_grf =3D dw_dp_rockchip_get_vo_grf(dp); + if (IS_ERR(dp->vo_grf)) + return PTR_ERR(dp->vo_grf); + + plat_data->max_link_rate =3D plat_data_const->max_link_rate; + plat_data->pixel_mode =3D plat_data_const->pixel_mode; + plat_data->hpd_sw_sel =3D dw_dp_rockchip_hpd_sw_sel; + plat_data->hpd_sw_cfg =3D dw_dp_rockchip_hpd_sw_cfg; + plat_data->data =3D dp; =20 dp->base =3D dw_dp_probe(pdev, plat_data); if (IS_ERR(dp->base)) @@ -147,14 +249,20 @@ static void dw_dp_rockchip_remove(struct platform_dev= ice *pdev) component_del(&pdev->dev, &dw_dp_rockchip_component_ops); } =20 -static const struct dw_dp_plat_data rk3588_dp_plat_data =3D { +static const struct rockchip_dw_dp_plat_data rk3588_dp_plat_data =3D { + .num_ctrls =3D 2, + .ctrl_ids =3D {0xfde50000, 0xfde60000}, .max_link_rate =3D 810000, .pixel_mode =3D DW_DP_MP_QUAD_PIXEL, + .hpd_reg =3D {0x0000, 0x0008}, }; =20 -static const struct dw_dp_plat_data rk3576_dp_plat_data =3D { +static const struct rockchip_dw_dp_plat_data rk3576_dp_plat_data =3D { + .num_ctrls =3D 1, + .ctrl_ids =3D {0x27e40000}, .max_link_rate =3D 810000, .pixel_mode =3D DW_DP_MP_DUAL_PIXEL, + .hpd_reg =3D {0x0000}, }; =20 static const struct of_device_id dw_dp_of_match[] =3D { --=20 2.53.0 From nobody Fri Oct 2 01:13:04 2026 Received: from bali.collaboradmins.com (bali.collaboradmins.com [148.251.105.195]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D766A486B82; Thu, 6 Aug 2026 17:02:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.251.105.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786035762; cv=none; b=mLwcEbl1D7CbqV0oUVlGfScrNhjfv3XL9HwS5l/S2zMkFAgR9knZc2eDlQNiwufHIL+JG6PGDRRBvus/OmiGZ4MFGef82u/fyn7gJOTzRCB4Igc5bBWmR3pcSO6kcLkcNWkRiaiqR+mxJBM5PP5OfRSrMB0Msqv/YEDaXBRmN/s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786035762; c=relaxed/simple; bh=I7poDKSKPMzXXn8t7sSPwPMoTrnfInMT4oF80628hT4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=DoQf4RgcmFoK2bL9mbosT+X+8lnrudQvLT5QgMc6UsCPBCpvSTQ/o7pmaHVyjC3rm+pdNtqnmULHhHC9B1PTA5EWpDfDUIE7ugt0BMxWtXgsR5XH534UAONu/F7JDbV1TaV88tuosusjipWIUht9vfjHHmmHjDZ+CKsxX/DNyrw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b=CcG23XWu; arc=none smtp.client-ip=148.251.105.195 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=collabora.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="CcG23XWu" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1786035746; bh=I7poDKSKPMzXXn8t7sSPwPMoTrnfInMT4oF80628hT4=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=CcG23XWuJNiQAHpLThIQ32lrtI+Ig0tNAkbdX8+VoS1q7r0jeTVbwukWDbCTi7RNz 8wH2o2o8unD78Z34ovyBrzXs2CiQzpqw8gj4gW8F7OMMBxjNOPvRz/5wU8XpNfL+0K z8otTlIVdVuufH4/0tNGyoZ9D64D/sebRan2f73RiOMACxyaaCWUxj/GrW6EsdpLPl 7pg9DcnsZg7NrNfCHv0Fkv4nWS8FMFYrWuLQm3nphN3e74j9ZZDtY9GV7nxKULEAlg RkTx3Ghsh9PRTwqnj3yoP6JoUXyM9ivQGWmqYh8jQzRFxFC2/tLzwQqeAXeazDVwzo ljXCiN1z+0/Tw== Received: from jupiter.universe (unknown [100.64.1.62]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519) (No client certificate requested) (Authenticated sender: sre) by bali.collaboradmins.com (Postfix) with ESMTPSA id C27FC17E1229; Thu, 06 Aug 2026 19:02:25 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 0C2EB480052; Thu, 06 Aug 2026 19:02:25 +0200 (CEST) From: Sebastian Reichel Date: Thu, 06 Aug 2026 19:02:20 +0200 Subject: [PATCH v11 14/21] drm/bridge: synopsys: dw-dp: Add Runtime PM support Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260806-synopsys-dw-dp-improvements-v11-14-0d508505f383@collabora.com> References: <20260806-synopsys-dw-dp-improvements-v11-0-0d508505f383@collabora.com> In-Reply-To: <20260806-synopsys-dw-dp-improvements-v11-0-0d508505f383@collabora.com> To: Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Rob Herring , Krzysztof Kozlowski , Conor Dooley , David Airlie , Simona Vetter , Dmitry Baryshkov , Luca Ceresoli , Philipp Zabel Cc: Cristian Ciocaltea , Damon Ding , Dmitry Baryshkov , Alexey Charkov , dri-devel@lists.freedesktop.org, linux-rockchip@lists.infradead.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, kernel@collabora.com, linux-arm-kernel@lists.infradead.org, Sebastian Reichel X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=14214; i=sebastian.reichel@collabora.com; h=from:subject:message-id; bh=I7poDKSKPMzXXn8t7sSPwPMoTrnfInMT4oF80628hT4=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGp0viCLtXuK3ppUwIvbXKCOh2S9bvJe89Oqx m/miRw/IBEL8IkCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqdL4gAAoJENju1/PI O/qaXvEP/REop4tyzNTyzegI5SCg4wDGkbZlg/+MLO6oq/Ny0ZjEAylQ1HSMFrFWERTqT0vg6Cy d7RUFu9rZ3gB2ehvyC725KAbXLbqfkA7DCOQ7Sj0c7j0oc+UgZ80lE56jJLPaQig3ehDCVCAmtR mBM9dyYt8YSwk/4/lA2Z/+phwHVsOB7KouZ93vWMySu4xvYbVOUO1gsNdX2J4NVwwJTDT2dZnbL M3zHPA2UvlndS6iSj/fMf/ZwhlrO1GQefllj6u6G5rRpRWSrlkqGoQ7iIUOX2Tejsu4zscjInMi VY9PEXGDyQd0xaJwW1RvaSNsg1r0t8ChTgR4mISMuKZKWYCSjqjWL8M4+k1RMkoVsraXnBqN4LI Hr/vTuVQ48kBvfJHPQcX34wEeRrlF/zvyGvIW4fxdrxAzZvArXnfba12ZK2hZHfz+BEZdhU5vKA 7Gw4ZWT3Gpqe7kTJqOys+vu+U3L4V/v4UXrQjvlMOvlMvW5Md92vCGQWJnAgHCKgHa6/zInNe4T Rcr5Gx4TfJtveCvlQ+cHj1KD97HiekLKHFf5qSE3QZwpN/mHmERok7CpUXW5++Ivuq3lA1fy47B ihytsLNqoTM3ilww9khKbu1Yfca9g5ltMMuTMvMQxzR0pr2mB34MNn3Fre3Fp0BxjmkYSUdmbvr k7AoVH7lV/66ueQzyvIk0UA== X-Developer-Key: i=sebastian.reichel@collabora.com; a=openpgp; fpr=EF660D07463F8B726A795413D8EED7F3C83BFA9A Add runtime PM stubs to the Synopsys DesignWare DisplayPort bridge driver. Support is not enabled automatically and must be hooked up in the platform specific glue code. The early bits of the dw_dp_probe function are split into a new function called dw_dp_alloc, so that the platform driver can assign it before running dw_dp_probe. This is necessary because the runtime PM resume/suspend events land at the platform driver and must be forwarded to the helper once runtime PM is enabled in the middle of the probe function. Signed-off-by: Sebastian Reichel Tested-by: Igor Paunovic --- drivers/gpu/drm/bridge/synopsys/dw-dp.c | 205 +++++++++++++++++++++++++-= ---- drivers/gpu/drm/rockchip/dw_dp-rockchip.c | 8 +- include/drm/bridge/dw_dp.h | 7 +- 3 files changed, 185 insertions(+), 35 deletions(-) diff --git a/drivers/gpu/drm/bridge/synopsys/dw-dp.c b/drivers/gpu/drm/brid= ge/synopsys/dw-dp.c index 3af5b1f643c1..31f944e143ea 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-dp.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-dp.c @@ -329,6 +329,9 @@ struct dw_dp { struct dw_dp_link link; struct dw_dp_plat_data plat_data; u8 pixel_mode; + bool usbc_mode; + bool usbc_hpd; + bool pm_active; =20 struct drm_bridge *next_bridge; =20 @@ -1468,6 +1471,11 @@ static ssize_t dw_dp_aux_transfer(struct drm_dp_aux = *aux, if (WARN_ON(msg->size > 16)) return -E2BIG; =20 + PM_RUNTIME_ACQUIRE_AUTOSUSPEND(dp->dev, pm); + ret =3D PM_RUNTIME_ACQUIRE_ERR(&pm); + if (ret) + return ret; + reinit_completion(&dp->complete); =20 switch (msg->request & ~DP_AUX_I2C_MOT) { @@ -1682,6 +1690,13 @@ static void dw_dp_bridge_atomic_enable(struct drm_br= idge *bridge, struct drm_connector_state *conn_state; int ret; =20 + ret =3D pm_runtime_get_active(dp->dev, RPM_TRANSPARENT); + if (ret) { + dev_err(dp->dev, "runtime PM failure\n"); + return; + } + dp->pm_active =3D true; + connector =3D drm_atomic_get_new_connector_for_encoder(state, bridge->enc= oder); if (!connector) { dev_err(dp->dev, "failed to get connector\n"); @@ -1732,10 +1747,15 @@ static void dw_dp_bridge_atomic_disable(struct drm_= bridge *bridge, { struct dw_dp *dp =3D bridge_to_dp(bridge); =20 + if (!dp->pm_active) + return; + dp->pm_active =3D false; + dw_dp_video_disable(dp); dw_dp_link_disable(dp); bitmap_zero(dp->sdp_reg_bank, SDP_REG_BANK_SIZE); dw_dp_reset(dp); + pm_runtime_put_autosuspend(dp->dev); } =20 static bool dw_dp_hpd_detect_link(struct dw_dp *dp, struct drm_connector *= connector) @@ -1756,6 +1776,10 @@ static enum drm_connector_status dw_dp_bridge_detect= (struct drm_bridge *bridge, { struct dw_dp *dp =3D bridge_to_dp(bridge); =20 + PM_RUNTIME_ACQUIRE_AUTOSUSPEND(dp->dev, pm); + if (PM_RUNTIME_ACQUIRE_ERR(&pm)) + return connector_status_disconnected; + if (!dw_dp_hpd_detect(dp)) return connector_status_disconnected; =20 @@ -1896,6 +1920,10 @@ static int dw_dp_bridge_attach(struct drm_bridge *br= idge, struct device *dev =3D dp->dev; int ret; =20 + ret =3D pm_runtime_get_active(dp->dev, RPM_TRANSPARENT); + if (ret) + return ret; + dp->aux.dev =3D dev; dp->aux.drm_dev =3D encoder->dev; dp->aux.name =3D dev_name(dev); @@ -1904,7 +1932,7 @@ static int dw_dp_bridge_attach(struct drm_bridge *bri= dge, ret =3D drm_dp_aux_register(&dp->aux); if (ret) { dev_err(dev, "Aux register failed: %d\n", ret); - return ret; + goto err_runtime_pm_put; } =20 enable_irq(dp->irq); @@ -1916,11 +1944,15 @@ static int dw_dp_bridge_attach(struct drm_bridge *b= ridge, goto err_disable_irq; } =20 - if (dw_dp_is_routed_to_usb_c(encoder)) { - dev_dbg(dev, "USB-C mode\n"); + dp->usbc_mode =3D dw_dp_is_routed_to_usb_c(encoder); + + if (dp->plat_data.hpd_sw_sel) + dp->plat_data.hpd_sw_sel(dp->plat_data.data, dp->usbc_mode); =20 - if (dp->plat_data.hpd_sw_sel) - dp->plat_data.hpd_sw_sel(dp->plat_data.data, 1); + /* USB-C has out-of-band hotplug detection, so device may runtime suspend= */ + if (dp->usbc_mode) { + dev_dbg(dev, "USB-C mode\n"); + pm_runtime_put_autosuspend(dp->dev); } =20 return 0; @@ -1931,6 +1963,9 @@ static int dw_dp_bridge_attach(struct drm_bridge *bri= dge, =20 drm_dp_aux_unregister(&dp->aux); =20 +err_runtime_pm_put: + pm_runtime_put_autosuspend(dp->dev); + return ret; } =20 @@ -1941,6 +1976,9 @@ static void dw_dp_bridge_detach(struct drm_bridge *br= idge) disable_irq(dp->irq); cancel_work_sync(&dp->hpd_work); drm_dp_aux_unregister(&dp->aux); + + if (!dp->usbc_mode) + pm_runtime_put_autosuspend(dp->dev); } =20 static void dw_dp_bridge_oob_notify(struct drm_bridge *bridge, @@ -1949,6 +1987,14 @@ static void dw_dp_bridge_oob_notify(struct drm_bridg= e *bridge, { bool hpd_high =3D status !=3D connector_status_disconnected; struct dw_dp *dp =3D bridge_to_dp(bridge); + int ret; + + dp->usbc_hpd =3D hpd_high; + + PM_RUNTIME_ACQUIRE_AUTOSUSPEND(dp->dev, pm); + ret =3D PM_RUNTIME_ACQUIRE_ERR(&pm); + if (ret) + return; =20 if (dp->plat_data.hpd_sw_cfg) dp->plat_data.hpd_sw_cfg(dp->plat_data.data, hpd_high); @@ -2008,6 +2054,11 @@ static void dw_dp_hpd_work(struct work_struct *work) bool long_hpd; int ret; =20 + PM_RUNTIME_ACQUIRE_AUTOSUSPEND(dp->dev, pm); + ret =3D PM_RUNTIME_ACQUIRE_ERR(&pm); + if (ret) + return; + mutex_lock(&dp->irq_lock); long_hpd =3D dp->hotplug.long_hpd; mutex_unlock(&dp->irq_lock); @@ -2125,13 +2176,24 @@ static void dw_dp_phy_exit(void *data) phy_exit(dp->phy); } =20 -struct dw_dp *dw_dp_probe(struct platform_device *pdev, const struct dw_dp= _plat_data *plat_data) +static void dw_dp_manual_suspend(void *data) +{ + struct dw_dp *dp =3D data; + + dw_dp_runtime_suspend(dp); +} + +static void dw_dp_enable_irq(void *data) +{ + struct dw_dp *dp =3D data; + + enable_irq(dp->irq); +} + +struct dw_dp *dw_dp_alloc(struct platform_device *pdev, const struct dw_dp= _plat_data *plat_data) { struct device *dev =3D &pdev->dev; - struct drm_bridge *bridge; - void __iomem *res; struct dw_dp *dp; - int ret; =20 dp =3D devm_drm_bridge_alloc(dev, struct dw_dp, bridge, &dw_dp_bridge_fun= cs); if (IS_ERR(dp)) @@ -2144,58 +2206,71 @@ struct dw_dp *dw_dp_probe(struct platform_device *p= dev, const struct dw_dp_plat_ dp->plat_data.hpd_sw_cfg =3D plat_data->hpd_sw_cfg; dp->plat_data.data =3D plat_data->data; dp->plat_data.max_link_rate =3D plat_data->max_link_rate; + dp->plat_data.autosuspend_delay =3D plat_data->autosuspend_delay; =20 INIT_WORK(&dp->hpd_work, dw_dp_hpd_work); init_completion(&dp->complete); =20 + return dp; +} +EXPORT_SYMBOL_GPL(dw_dp_alloc); + +int dw_dp_probe(struct dw_dp *dp) +{ + struct device *dev =3D dp->dev; + struct platform_device *pdev =3D to_platform_device(dev); + struct drm_bridge *bridge; + void __iomem *res; + int ret; + ret =3D devm_mutex_init(dev, &dp->irq_lock); if (ret) - return ERR_PTR(ret); + return ret; =20 res =3D devm_platform_ioremap_resource(pdev, 0); if (IS_ERR(res)) - return ERR_CAST(res); + return PTR_ERR(res); =20 dp->regmap =3D devm_regmap_init_mmio(dev, res, &dw_dp_regmap_config); if (IS_ERR(dp->regmap)) { dev_err_probe(dev, PTR_ERR(dp->regmap), "failed to create regmap\n"); - return ERR_CAST(dp->regmap); + return PTR_ERR(dp->regmap); } =20 dp->phy =3D devm_of_phy_get(dev, dev->of_node, NULL); if (IS_ERR(dp->phy)) { dev_err_probe(dev, PTR_ERR(dp->phy), "failed to get phy\n"); - return ERR_CAST(dp->phy); + return PTR_ERR(dp->phy); } =20 - dp->apb_clk =3D devm_clk_get_enabled(dev, "apb"); + dp->apb_clk =3D devm_clk_get(dev, "apb"); if (IS_ERR(dp->apb_clk)) { dev_err_probe(dev, PTR_ERR(dp->apb_clk), "failed to get apb clock\n"); - return ERR_CAST(dp->apb_clk); + return PTR_ERR(dp->apb_clk); } =20 - dp->aux_clk =3D devm_clk_get_enabled(dev, "aux"); + dp->aux_clk =3D devm_clk_get(dev, "aux"); if (IS_ERR(dp->aux_clk)) { dev_err_probe(dev, PTR_ERR(dp->aux_clk), "failed to get aux clock\n"); - return ERR_CAST(dp->aux_clk); + return PTR_ERR(dp->aux_clk); } =20 dp->i2s_clk =3D devm_clk_get_optional(dev, "i2s"); if (IS_ERR(dp->i2s_clk)) { dev_err_probe(dev, PTR_ERR(dp->i2s_clk), "failed to get i2s clock\n"); - return ERR_CAST(dp->i2s_clk); + return PTR_ERR(dp->i2s_clk); } =20 dp->spdif_clk =3D devm_clk_get_optional(dev, "spdif"); if (IS_ERR(dp->spdif_clk)) { dev_err_probe(dev, PTR_ERR(dp->spdif_clk), "failed to get spdif clock\n"= ); - return ERR_CAST(dp->spdif_clk); + return PTR_ERR(dp->spdif_clk); } =20 dp->hdcp_clk =3D devm_clk_get(dev, "hdcp"); if (IS_ERR(dp->hdcp_clk)) { dev_err_probe(dev, PTR_ERR(dp->hdcp_clk), "failed to get hdcp clock\n"); - return ERR_CAST(dp->hdcp_clk); + return PTR_ERR(dp->hdcp_clk); } =20 /* @@ -2205,41 +2280,67 @@ struct dw_dp *dw_dp_probe(struct platform_device *p= dev, const struct dw_dp_plat_ dp->rstc =3D devm_reset_control_get(dev, NULL); if (IS_ERR(dp->rstc)) { dev_err_probe(dev, PTR_ERR(dp->rstc), "failed to get reset control\n"); - return ERR_CAST(dp->rstc); + return PTR_ERR(dp->rstc); } =20 dp->irq =3D platform_get_irq(pdev, 0); if (dp->irq < 0) - return ERR_PTR(dp->irq); + return dp->irq; =20 ret =3D devm_request_threaded_irq(dev, dp->irq, NULL, dw_dp_irq, IRQF_ONESHOT | IRQF_NO_AUTOEN, dev_name(dev), dp); if (ret) { dev_err_probe(dev, ret, "failed to request irq\n"); - return ERR_PTR(ret); + return ret; } =20 + /* + * Disable IRQ a second time; this ensures the interrupt is only + * enabled when the bridge is attached AND runtime PM is enabled. + * Also register a devm action to restore the correct balance during + * device removal. + */ + disable_irq(dp->irq); + + ret =3D devm_add_action_or_reset(dev, dw_dp_enable_irq, dp); + if (ret) + return ret; + dp->next_bridge =3D of_drm_get_bridge_by_endpoint(dev->of_node, 1, 0); if (IS_ERR(dp->next_bridge)) { dev_err_probe(dev, PTR_ERR(dp->next_bridge), "failed to get follow-up br= idge\n"); - return ERR_CAST(dp->next_bridge); + return PTR_ERR(dp->next_bridge); } =20 ret =3D devm_add_action_or_reset(dev, dw_dp_put_next_bridge, dp); if (ret) - return ERR_PTR(ret); + return ret; =20 - dw_dp_init_hw(dp); + if (dp->plat_data.autosuspend_delay > 0) { + pm_runtime_use_autosuspend(dev); + pm_runtime_set_autosuspend_delay(dev, dp->plat_data.autosuspend_delay); + ret =3D devm_pm_runtime_enable(dev); + if (ret) + return ret; + } + + if (!pm_runtime_enabled(dev)) { + dw_dp_runtime_resume(dp); + + ret =3D devm_add_action_or_reset(dev, dw_dp_manual_suspend, dp); + if (ret) + return ret; + } =20 ret =3D phy_init(dp->phy); if (ret) { dev_err_probe(dev, ret, "phy init failed\n"); - return ERR_PTR(ret); + return ret; } =20 ret =3D devm_add_action_or_reset(dev, dw_dp_phy_exit, dp); if (ret) - return ERR_PTR(ret); + return ret; =20 bridge =3D &dp->bridge; bridge->of_node =3D dev->of_node; @@ -2247,13 +2348,53 @@ struct dw_dp *dw_dp_probe(struct platform_device *p= dev, const struct dw_dp_plat_ bridge->type =3D DRM_MODE_CONNECTOR_DisplayPort; bridge->ycbcr_420_allowed =3D true; =20 - ret =3D devm_drm_bridge_add(dev, bridge); + return devm_drm_bridge_add(dev, bridge); +} +EXPORT_SYMBOL_GPL(dw_dp_probe); + +int dw_dp_runtime_suspend(struct dw_dp *dp) +{ + disable_irq(dp->irq); + + clk_disable_unprepare(dp->aux_clk); + clk_disable_unprepare(dp->apb_clk); + + return 0; +} +EXPORT_SYMBOL_GPL(dw_dp_runtime_suspend); + +int dw_dp_runtime_resume(struct dw_dp *dp) +{ + int ret; + + ret =3D clk_prepare_enable(dp->apb_clk); if (ret) - return ERR_PTR(ret); + return ret; =20 - return dp; + ret =3D clk_prepare_enable(dp->aux_clk); + if (ret) { + clk_disable_unprepare(dp->apb_clk); + return ret; + } + + if (dp->plat_data.hpd_sw_sel) + dp->plat_data.hpd_sw_sel(dp->plat_data.data, dp->usbc_mode); + if (dp->plat_data.hpd_sw_cfg) + dp->plat_data.hpd_sw_cfg(dp->plat_data.data, dp->usbc_hpd); + + dw_dp_init_hw(dp); + + enable_irq(dp->irq); + + /* + * HPD_HOT_PLUG bit is asserted only after the sink holds HPD + * high for at least 100ms. + */ + msleep(110); + + return 0; } -EXPORT_SYMBOL_GPL(dw_dp_probe); +EXPORT_SYMBOL_GPL(dw_dp_runtime_resume); =20 MODULE_AUTHOR("Andy Yan "); MODULE_DESCRIPTION("DW DP Core Library"); diff --git a/drivers/gpu/drm/rockchip/dw_dp-rockchip.c b/drivers/gpu/drm/ro= ckchip/dw_dp-rockchip.c index 9e49e7dbf420..ffcfb887d0d2 100644 --- a/drivers/gpu/drm/rockchip/dw_dp-rockchip.c +++ b/drivers/gpu/drm/rockchip/dw_dp-rockchip.c @@ -194,7 +194,7 @@ static int dw_dp_rockchip_probe(struct platform_device = *pdev) struct device *dev =3D &pdev->dev; struct rockchip_dw_dp *dp; struct resource *res; - int id; + int id, ret; =20 plat_data_const =3D device_get_match_data(dev); if (!plat_data_const) @@ -237,10 +237,14 @@ static int dw_dp_rockchip_probe(struct platform_devic= e *pdev) plat_data->hpd_sw_cfg =3D dw_dp_rockchip_hpd_sw_cfg; plat_data->data =3D dp; =20 - dp->base =3D dw_dp_probe(pdev, plat_data); + dp->base =3D dw_dp_alloc(pdev, plat_data); if (IS_ERR(dp->base)) return PTR_ERR(dp->base); =20 + ret =3D dw_dp_probe(dp->base); + if (ret) + return ret; + return component_add(&pdev->dev, &dw_dp_rockchip_component_ops); } =20 diff --git a/include/drm/bridge/dw_dp.h b/include/drm/bridge/dw_dp.h index 79b2cdf0df99..1e23180b565e 100644 --- a/include/drm/bridge/dw_dp.h +++ b/include/drm/bridge/dw_dp.h @@ -18,6 +18,7 @@ enum { }; =20 struct dw_dp_plat_data { + int autosuspend_delay; u32 max_link_rate; u8 pixel_mode; void *data; @@ -28,5 +29,9 @@ struct dw_dp_plat_data { int dw_dp_bind(struct dw_dp *dp, struct drm_encoder *encoder); void dw_dp_unbind(struct dw_dp *dp); =20 -struct dw_dp *dw_dp_probe(struct platform_device *pdev, const struct dw_dp= _plat_data *plat_data); +struct dw_dp *dw_dp_alloc(struct platform_device *pdev, const struct dw_dp= _plat_data *plat_data); +int dw_dp_probe(struct dw_dp *dp); + +int dw_dp_runtime_suspend(struct dw_dp *dp); +int dw_dp_runtime_resume(struct dw_dp *dp); #endif /* __DW_DP__ */ --=20 2.53.0 From nobody Fri Oct 2 01:13:04 2026 Received: from bali.collaboradmins.com (bali.collaboradmins.com [148.251.105.195]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A8A5C48CD7F; Thu, 6 Aug 2026 17:02:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.251.105.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786035765; cv=none; b=iTAIf1qoMwgow3ExVdmHGMhiRfB7b0s46+GFW6EvTZqzN4uAdKlB+zcoQCwbB/Ef3gQu1MyDB56ZxBsQYGmwrRqPGo291KnchTJLnJWWwRYfDnnf9eHu7Ca476lj7/jW5aCRCg4QIvhQxvP9HfDcdGmvMTJ+7E62gi7E88HPdG8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786035765; c=relaxed/simple; bh=oRTwAEvsdtAdQ3xeWlEgRs01pA0QwvbbaxWZXaVnR4M=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=DIbBZRMU+XsCttmJVV46SEykUAYRGT/t5UxPB5XWkE2DZDK23Z6ZehC5TlV3YyIyMrMAiLBM0vkHMHP5TIrwrXKXzFtLn4R7+1fGs06eXjgWEA92cQ8d0MoPamEU+N87UW6+Qrt6dGPcaOMOCp8ExwfhrnlAEN5seBu8wikFF6o= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b=NVITPhUP; arc=none smtp.client-ip=148.251.105.195 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=collabora.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="NVITPhUP" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1786035746; bh=oRTwAEvsdtAdQ3xeWlEgRs01pA0QwvbbaxWZXaVnR4M=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=NVITPhUPm+E2bCAxfubkWxeXY6au6qJQc4/dYj2IOKnvPdF1D8ziM+nN/8vv2pcss en44xonxTBT/Je/GsLqGaP+jcvXmTsrZoLf/YY46l6TPRVYezrVWEBha3/QghPgBLy lbjCaNUuqkdhHlGtn0XyQ1lKAJ0gk27G+n9oFin/+ycPQ0TJXsOTDKprR/WdRW4DSI 7VMOxC+amjJr/FRZBGRiEJ4EyCmtsfW2ATnbe56NAYd/hjUa8qOhvhGtKf6ILEvPjd XlBvXZHj+v3jbdTdwXOT9NFr5Q+OCgdWyanxt5awG+PnCEfodiP1S7g2SiraSbwbzJ K96MWQSGLetWA== Received: from jupiter.universe (unknown [100.64.1.62]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519) (No client certificate requested) (Authenticated sender: sre) by bali.collaboradmins.com (Postfix) with ESMTPSA id E377817E1249; Thu, 06 Aug 2026 19:02:25 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 0DD36480055; Thu, 06 Aug 2026 19:02:25 +0200 (CEST) From: Sebastian Reichel Date: Thu, 06 Aug 2026 19:02:21 +0200 Subject: [PATCH v11 15/21] drm/rockchip: dw_dp: Add runtime PM support Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260806-synopsys-dw-dp-improvements-v11-15-0d508505f383@collabora.com> References: <20260806-synopsys-dw-dp-improvements-v11-0-0d508505f383@collabora.com> In-Reply-To: <20260806-synopsys-dw-dp-improvements-v11-0-0d508505f383@collabora.com> To: Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Rob Herring , Krzysztof Kozlowski , Conor Dooley , David Airlie , Simona Vetter , Dmitry Baryshkov , Luca Ceresoli , Philipp Zabel Cc: Cristian Ciocaltea , Damon Ding , Dmitry Baryshkov , Alexey Charkov , dri-devel@lists.freedesktop.org, linux-rockchip@lists.infradead.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, kernel@collabora.com, linux-arm-kernel@lists.infradead.org, Sebastian Reichel X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=2058; i=sebastian.reichel@collabora.com; h=from:subject:message-id; bh=oRTwAEvsdtAdQ3xeWlEgRs01pA0QwvbbaxWZXaVnR4M=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGp0viBugf7kmffLWiX1OgyTdCwCTPaeyaUDs rciieB6Y4JvmYkCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqdL4gAAoJENju1/PI O/qaszIP/0DAaR/hYLDvWsgM90fNgIUOCUVWdLpAdJLvjbDTehiuKy4XldYAXULqubgYEu0ksLC NYoQht5odetpFfbog3Nh5oaUhw7D4qLD+JbH2ECP/01GNOVnr7w1Y6GThw1EdMIdVtlfe5f1XgI aZHssLkz//cq88AFQNbzaAu+uoeTyOadH7siM4tZMrP0YUZbZRxKvAiZReVClHeUHWDJT9X9hS6 7KK36K+W9zgYbiczVOfI73NMWDwQze3SgXCHR9dW3cAxhJlHigiUINny3tVHwZnoupf/n5xQhOA z8704oHlJEGs1l7UMHWxEk7PHHbjqa02akAeOQi5gTAtbJQhfGMqdoDItsdmgprVy3pIq/j2uRg 11JZaY9dGBluIJHBQKs/uFxNb/5CzpbWkluKiMiN/IGdo3+OKTLTRuHmit/mPquKCspOhB6Uy5Q PjPjGjT+/yTIfx1LqMpsPVbchVlrSoHObFNy/Lt35IekwbzgAQcVezJDAmrOVHlbEWrOiSfhAyo CUteyvi4iGwTuIHjlMVwSsqUNx2nBZDdH9zABAVaZPfF7BfmHhtBa6PEWSOykwCz4khKNaxoyQY /3YeUGZDAhwg/sjUQd5gRn+cTtQkvsQutP3YbP+nluoeWEe9bCjdKulynzspdxju0sCFhRZ4JUM UGTTi7UKOvD03O+hZbWcquQ== X-Developer-Key: i=sebastian.reichel@collabora.com; a=openpgp; fpr=EF660D07463F8B726A795413D8EED7F3C83BFA9A Add support for runtime PM to the Rockchip RK3576/3588 Synopsys DesignWare DisplayPort driver. Signed-off-by: Sebastian Reichel Tested-by: Igor Paunovic --- drivers/gpu/drm/rockchip/dw_dp-rockchip.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/drivers/gpu/drm/rockchip/dw_dp-rockchip.c b/drivers/gpu/drm/ro= ckchip/dw_dp-rockchip.c index ffcfb887d0d2..770ab042a187 100644 --- a/drivers/gpu/drm/rockchip/dw_dp-rockchip.c +++ b/drivers/gpu/drm/rockchip/dw_dp-rockchip.c @@ -12,6 +12,7 @@ #include #include #include +#include #include #include =20 @@ -231,6 +232,7 @@ static int dw_dp_rockchip_probe(struct platform_device = *pdev) if (IS_ERR(dp->vo_grf)) return PTR_ERR(dp->vo_grf); =20 + plat_data->autosuspend_delay =3D 500; plat_data->max_link_rate =3D plat_data_const->max_link_rate; plat_data->pixel_mode =3D plat_data_const->pixel_mode; plat_data->hpd_sw_sel =3D dw_dp_rockchip_hpd_sw_sel; @@ -253,6 +255,24 @@ static void dw_dp_rockchip_remove(struct platform_devi= ce *pdev) component_del(&pdev->dev, &dw_dp_rockchip_component_ops); } =20 +static int dw_dp_rockchip_runtime_suspend(struct device *dev) +{ + struct rockchip_dw_dp *dp =3D dev_get_drvdata(dev); + + return dw_dp_runtime_suspend(dp->base); +} + +static int dw_dp_rockchip_runtime_resume(struct device *dev) +{ + struct rockchip_dw_dp *dp =3D dev_get_drvdata(dev); + + return dw_dp_runtime_resume(dp->base); +} + +static const struct dev_pm_ops dw_dp_pm_ops =3D { + RUNTIME_PM_OPS(dw_dp_rockchip_runtime_suspend, dw_dp_rockchip_runtime_res= ume, NULL) +}; + static const struct rockchip_dw_dp_plat_data rk3588_dp_plat_data =3D { .num_ctrls =3D 2, .ctrl_ids =3D {0xfde50000, 0xfde60000}, @@ -287,5 +307,6 @@ struct platform_driver dw_dp_driver =3D { .driver =3D { .name =3D "dw-dp", .of_match_table =3D dw_dp_of_match, + .pm =3D pm_ptr(&dw_dp_pm_ops), }, }; --=20 2.53.0 From nobody Fri Oct 2 01:13:04 2026 Received: from bali.collaboradmins.com (bali.collaboradmins.com [148.251.105.195]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A81EB48CD7E; Thu, 6 Aug 2026 17:02:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.251.105.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786035765; cv=none; b=W+ca4yD3KErphikfB4aBr6GKeO7O1hzfmBgiucfz7qxaqtALl29mHe4rpzYF4ss7q6KCLupFntnRxzTfjgffH4JoFtgaGbCGf4WCEV2xAac/iCBMM5RaSFOihZDb1qzX3/BfVTNjmDOddc9tvyfm2C9EUzcUsX4y2HkrWSZaPPY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786035765; c=relaxed/simple; bh=jaeHYjvxDvN5MYMlI1b+NKWwckplfWJLIL504dhs+48=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ilPfBfiI1lIWcC25M5yheKRzOL5fi0jNUQjTBHrD4aNTedl+LwBfaMGRBV9wsujmpKAvDEwgn1MLxEI/MHI/alsPrX9+xzVCDUu+KjdkysjySLnjXrsrx9Bg/qfDONGk1Lll8TmhZWFoccfGn4h1If3gSgnoGXSHooXBDTh9rC8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b=CJI4LHmA; arc=none smtp.client-ip=148.251.105.195 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=collabora.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="CJI4LHmA" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1786035746; bh=jaeHYjvxDvN5MYMlI1b+NKWwckplfWJLIL504dhs+48=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=CJI4LHmArxM/Fcq7RYQsrMfnzKu4bD+Lk4GP2TokKl/b8eyFpMKbfEi/xFGOixFnd vvYApO+AeAEXJ0vGomyX4D+pTnTx0wIVEBp6Pw+wqNnwDdMwkZoHgWib20PeniFHkP 1EmbQH6psgu5odrh6YNqShbEy5Axogb52mA/b7v6i/2bSfzZljiSfAf6xArhVF/Yo9 oTkNNY4vhbiVHPH+6GngyEXezlnCAh4UQrer3wuvBU9Z3CkyTpQY1JdpTI+qoNGucq e1uw0JFn+UDwUhzsYBmhYQZn1Linvj9moLzHNF8AAbMAt/+q2NiwscLaPQixdt+90y RlBCBnaqUpePQ== Received: from jupiter.universe (unknown [100.64.1.62]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519) (No client certificate requested) (Authenticated sender: sre) by bali.collaboradmins.com (Postfix) with ESMTPSA id E720417E125C; Thu, 06 Aug 2026 19:02:25 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 0F76E480061; Thu, 06 Aug 2026 19:02:25 +0200 (CEST) From: Sebastian Reichel Date: Thu, 06 Aug 2026 19:02:22 +0200 Subject: [PATCH v11 16/21] drm/bridge: synopsys: dw-dp: Protect sdp_reg_bank from concurrent access Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260806-synopsys-dw-dp-improvements-v11-16-0d508505f383@collabora.com> References: <20260806-synopsys-dw-dp-improvements-v11-0-0d508505f383@collabora.com> In-Reply-To: <20260806-synopsys-dw-dp-improvements-v11-0-0d508505f383@collabora.com> To: Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Rob Herring , Krzysztof Kozlowski , Conor Dooley , David Airlie , Simona Vetter , Dmitry Baryshkov , Luca Ceresoli , Philipp Zabel Cc: Cristian Ciocaltea , Damon Ding , Dmitry Baryshkov , Alexey Charkov , dri-devel@lists.freedesktop.org, linux-rockchip@lists.infradead.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, kernel@collabora.com, linux-arm-kernel@lists.infradead.org, Sebastian Reichel X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=2378; i=sebastian.reichel@collabora.com; h=from:subject:message-id; bh=jaeHYjvxDvN5MYMlI1b+NKWwckplfWJLIL504dhs+48=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGp0viA2wGszaznDWsbGdZj82hZjJEvwWXdzJ rmcRsQKkag9hIkCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqdL4gAAoJENju1/PI O/qaO6sP/joabeMEXY/hL4a9DczVI2MyXnBUbrRfhKigTFzS+WJbBjU5wbrZzLj+PYYsI+AvaaO YPtkGmO0R8b2sauIMnTKG00SOY0BqDC2QlC+u9ckPU79xYvcMsxsYNnt1Agfah71ckd3JX4GLTD bBK/bP2osq11LiQvVF5pe0USN1eGtFgJuaDf3BtBH8k9oBNwd+hGiM3A7XLKxSgjZVdZiPUpE+9 4cZ2IHyDBwZuko3umw06FhymOg+m8vDRVlMwaRAtpK648b/B6GB/cj8ByuZSQajHRvBs5D6BpDd PeZeJxRljhjyfn4GLIj+WWPcNCSyFfuRntlX8f17oln7iyclflwDZl3Pbwm6NWPXn+9J+/Eb02/ 4PRpOkat3jnCyNm2/Pubx3xJAlDn2wwbul4bhXqzBmzAsV00GjSyWf77bFzGl44yavrbUF6868v WNIbifV6DWH6GbScEsaond91GWiGh1M2HWk95giksiLIP0LXuhbI2uzwT69Carjr7f9vvBIfSvv CjJpb++p7bukrJrVT99VFKwuldKuurm1Muod7HUKN/F43r5AdVR5zUMg7NW5A1ji2DjldpVc85i hhwXu/KrSYsD7FbRKTtA0MfCf0rXQbcuhXOsPMEUXSvddRInRuALLF9N76inNqRjanC0enSXDPR fDE4O1bi2jRAOlMNCvyEzEg== X-Developer-Key: i=sebastian.reichel@collabora.com; a=openpgp; fpr=EF660D07463F8B726A795413D8EED7F3C83BFA9A Right now sdp_reg_bank is only used during atomic enable/disable and thus there is no risk of two threads accidently claiming the same bit. This changes once more SDP users (like audio support) are added, so introduce a mutex to protect concurrent access to the bitmap. Signed-off-by: Sebastian Reichel Tested-by: Igor Paunovic --- drivers/gpu/drm/bridge/synopsys/dw-dp.c | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/drivers/gpu/drm/bridge/synopsys/dw-dp.c b/drivers/gpu/drm/brid= ge/synopsys/dw-dp.c index 31f944e143ea..31495a813e40 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-dp.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-dp.c @@ -323,6 +323,8 @@ struct dw_dp { struct dw_dp_hotplug hotplug; /* Serialize hpd status access */ struct mutex irq_lock; + /* Serialize sdp_reg_bank access */ + struct mutex sdp_lock; =20 struct drm_dp_aux aux; =20 @@ -1048,11 +1050,13 @@ static int dw_dp_send_sdp(struct dw_dp *dp, struct = dw_dp_sdp *sdp) u32 reg; int i, nr; =20 - nr =3D find_first_zero_bit(dp->sdp_reg_bank, SDP_REG_BANK_SIZE); - if (nr < SDP_REG_BANK_SIZE) - set_bit(nr, dp->sdp_reg_bank); - else - return -EBUSY; + scoped_guard(mutex, &dp->sdp_lock) { + nr =3D find_first_zero_bit(dp->sdp_reg_bank, SDP_REG_BANK_SIZE); + if (nr < SDP_REG_BANK_SIZE) + set_bit(nr, dp->sdp_reg_bank); + else + return -EBUSY; + } =20 reg =3D DW_DP_SDP_REGISTER_BANK + nr * 9 * 4; =20 @@ -1709,7 +1713,8 @@ static void dw_dp_bridge_atomic_enable(struct drm_bri= dge *bridge, return; } =20 - set_bit(0, dp->sdp_reg_bank); + scoped_guard(mutex, &dp->sdp_lock) + set_bit(0, dp->sdp_reg_bank); =20 ret =3D dw_dp_link_enable(dp); if (ret < 0) { @@ -1753,7 +1758,8 @@ static void dw_dp_bridge_atomic_disable(struct drm_br= idge *bridge, =20 dw_dp_video_disable(dp); dw_dp_link_disable(dp); - bitmap_zero(dp->sdp_reg_bank, SDP_REG_BANK_SIZE); + scoped_guard(mutex, &dp->sdp_lock) + bitmap_zero(dp->sdp_reg_bank, SDP_REG_BANK_SIZE); dw_dp_reset(dp); pm_runtime_put_autosuspend(dp->dev); } @@ -2227,6 +2233,10 @@ int dw_dp_probe(struct dw_dp *dp) if (ret) return ret; =20 + ret =3D devm_mutex_init(dev, &dp->sdp_lock); + if (ret) + return ret; + res =3D devm_platform_ioremap_resource(pdev, 0); if (IS_ERR(res)) return PTR_ERR(res); --=20 2.53.0 From nobody Fri Oct 2 01:13:04 2026 Received: from bali.collaboradmins.com (bali.collaboradmins.com [148.251.105.195]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id AA201364059; Thu, 6 Aug 2026 17:11:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.251.105.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786036277; cv=none; b=NjRW6Q1lMH8r9wT7aBv2y5KvA5O37W7vsOuU1hQoM1MIPy1/058dnlmQBNqIOkr9iIx3hAMoC+CvCFLsfNxQHfw5FV8Yy/2/tLOH+QfVgyUoGOVxuMICSEdqviZOD5O2Ur7B6h+pG9473Y0fuIYTlu+bBQfADIR1kSDR9UADleo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786036277; c=relaxed/simple; bh=s1hZgDXLqbyiz5DUeUQwLn7ax3yO4EnYmxwrae79gCo=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Yb/JXdBKT/jDaW9m4v55J/IZcz7k+DudBciK81r9DvZylNg8ZLUVolPW6qlapUAao2B+GjzMa9HyaAodL3+Yfjyv3XV7HykZO5wK7CNltyGWr2XBk/onQ+ro4xyev5pweKVxT/SuxnLB7DE+rgLOwMEDTpKR0a/vXeC7C//vzxw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b=WirvFm+R; arc=none smtp.client-ip=148.251.105.195 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=collabora.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="WirvFm+R" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1786036273; bh=s1hZgDXLqbyiz5DUeUQwLn7ax3yO4EnYmxwrae79gCo=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=WirvFm+RiFTu0g9N6PYyyoEDVGBf3ahkeemyMnrf86kTn8SLbBqsdw8aGsPy7Pyi4 KUclVAdkWwGEzZe47tjCH5aVL/ltDuUM18LNGsB86NMDgPcof1d18/2Nlw+ad2AJN/ f7ikQIzv1LtyxJN1Ubn5nlQl2LBPLX4IpktlMUUFFYZQFUDvXtMlJYfnnoAjMr+iWb XpEFnm8cQC6t6wxjB8d5SY/nbRwzdlvj+rGLeoeh0rzlXXEd2rklq/iMbwrkE2mHGS Bb+uFXd+h1yZDuyu9nfuBkvlS2gHjTY2EyryHL4/iInoCLcqy+NcmQ3+DK1VDBDf6l jAVFnwQKoSdsQ== Received: from jupiter.universe (unknown [100.64.1.62]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519) (No client certificate requested) (Authenticated sender: sre) by bali.collaboradmins.com (Postfix) with ESMTPSA id 79DBC17E0110; Thu, 06 Aug 2026 19:11:13 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 10DB5480062; Thu, 06 Aug 2026 19:02:25 +0200 (CEST) From: Sebastian Reichel Date: Thu, 06 Aug 2026 19:02:23 +0200 Subject: [PATCH v11 17/21] drm/bridge: synopsys: dw-dp: Drop useless reservation of first slot Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260806-synopsys-dw-dp-improvements-v11-17-0d508505f383@collabora.com> References: <20260806-synopsys-dw-dp-improvements-v11-0-0d508505f383@collabora.com> In-Reply-To: <20260806-synopsys-dw-dp-improvements-v11-0-0d508505f383@collabora.com> To: Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Rob Herring , Krzysztof Kozlowski , Conor Dooley , David Airlie , Simona Vetter , Dmitry Baryshkov , Luca Ceresoli , Philipp Zabel Cc: Cristian Ciocaltea , Damon Ding , Dmitry Baryshkov , Alexey Charkov , dri-devel@lists.freedesktop.org, linux-rockchip@lists.infradead.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, kernel@collabora.com, linux-arm-kernel@lists.infradead.org, Sebastian Reichel X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1300; i=sebastian.reichel@collabora.com; h=from:subject:message-id; bh=s1hZgDXLqbyiz5DUeUQwLn7ax3yO4EnYmxwrae79gCo=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGp0viDeDCrcqe3xFH7Ml1Fvih4SvSx6fB36l LeDp6SlArrrSokCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqdL4gAAoJENju1/PI O/qagycP+QGDG9sRV0ehMVE29lObtT8rRU+RPEVABIH1rhf7J04J8EztEjPvIkgCM+ckgFlaUVz ed5rmMfbmffqrBKnMMo4zHJ6Gj4Q6nEJ9bZNZvqcIPvzaMT+EsMXKIdBe2GhIejsKXMu2LlGLYI jSHNuFsqVnk8M+F0nj2xnijnxmjPWDMNMf2ElaeBg/xeMpON2lUOoyUQ3Hk+B1vyTZnueog+206 hus7H2KgFyLW85TEnd8P+DRGIgWv2t5HFDmCqABhC5yQ6i9C08JqpZII0zQMHCXDaqm506eg72z Bdojs5fun+4S4lz6q9gRP60ffAJO3eOXeEvrFA8Ji9dCXkPmHNqs8aQsC04OjYKa6a0awXCe+Kd BurOV364IvW5LdWgO8Eb7nR/EsqlY6iis31FJ0xKvRrjBfHFBy/+E6pYHhIWoDRbVZipN9vyqM2 7+6M6l45jrqqXNI8/L8JujNZZA194GJmfoINW7Iuf3gBnU9U096obX+uBsMsNRLSEvIbP8wu47o iRJwM1i9rcB0V71gVat8iz/BMsMvTBNb94mRpGDMAwxbm4xzgjBWAFARY0I/VyPn7C9AVH6jEMp bRdx8n9BkNDDOXlaTs/5JaNBUK3PF4n8rir/cTmEo+VNZtgCyrNB6bVC+rfmHo5xEmB6gUjXO2N iOQpII00KZDQyaPP1xfct3g== X-Developer-Key: i=sebastian.reichel@collabora.com; a=openpgp; fpr=EF660D07463F8B726A795413D8EED7F3C83BFA9A The origin of this reservation is unclear, but it is a problem in the atomic_enable code since it potentially races with the audio SDP reservation once that feature is added. I suppose it was either meant to be bitmap_zero(), but that is obviously not needed (and would also be a problem for audio support) or some left-over development code before the VSC SDP slot was allocated automatically. From my tests SDP slot 0 works fine and can be used. If SDP slot 0 really needs to be reserved for some reason, the bit should be set in the probe function to ensure there are no race conditions. Signed-off-by: Sebastian Reichel Tested-by: Igor Paunovic --- drivers/gpu/drm/bridge/synopsys/dw-dp.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/drivers/gpu/drm/bridge/synopsys/dw-dp.c b/drivers/gpu/drm/brid= ge/synopsys/dw-dp.c index 31495a813e40..d8682ccdfec8 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-dp.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-dp.c @@ -1713,9 +1713,6 @@ static void dw_dp_bridge_atomic_enable(struct drm_bri= dge *bridge, return; } =20 - scoped_guard(mutex, &dp->sdp_lock) - set_bit(0, dp->sdp_reg_bank); - ret =3D dw_dp_link_enable(dp); if (ret < 0) { dev_err(dp->dev, "failed to enable link: %d\n", ret); --=20 2.53.0 From nobody Fri Oct 2 01:13:04 2026 Received: from bali.collaboradmins.com (bali.collaboradmins.com [148.251.105.195]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BFF89371D05; Thu, 6 Aug 2026 17:11:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.251.105.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786036278; cv=none; b=f23FCnxBdTQVWZWIN2PlcI99ZoXcy4Rnkitk0LKUFSw+re/u5CNSe+W85duUP0RSWeNjPSiJPlHqtPCESdXpJVxx9ONXT8Q8Wbq0RTc9lS02Iu+SJMxxRttX/mEDiWhdWFIqPlcAffiESrShhdLsVylyEaBrQRyVMrwaDDKV8s4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786036278; c=relaxed/simple; bh=JD88w8teGMGJhjYFcaBdeCra3Vbfn/1k/AlbKAvT/vA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=erj5VTDe9wnkYLf04sII85RoJtKCwuKSf5t5RiS5ES5V/aMtNzUit1l9VTxmCUesx7f5fwo2Ho2os0x0spvoQia5FV1ubZUt0akFwOTE3M+B91GSX7SrTNYn/Cs+0GaixGkS76BE1jQKTGsVQQGHhwot9CkecMEXR6ID47PO7BM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b=p+BljBTx; arc=none smtp.client-ip=148.251.105.195 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=collabora.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="p+BljBTx" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1786036273; bh=JD88w8teGMGJhjYFcaBdeCra3Vbfn/1k/AlbKAvT/vA=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=p+BljBTxL+XjBB8RLPLOfa5AI4WNo5Iz2Kn92mLg2C2Qns2dI2/cc0gJirou8Q6/F VY1AeXklyqCNFp4IUBCBqG23DET74CsDbz77j4Bn2MtZDi5F1taGHN3vIUjg6fuy0m MmxGx3ZTVuJsPVFyM9z4POhz921X5XPIPDuvTQhFyOcww2dlhKj2EhkFDz38R49CY8 fswRwYQ8ctNqfbS8yZHvM5A1Z17Qt/azORs7s+9x9NMHZTOEgFTOVaVpXpH6E1htvy BoQLoP2rNtb+/Pds7+3ZYfjeUVN3rMMOBER9Hx24ZYw31lnq4DuT6CxlrahtAviezT 9CtZ4mbfBDkWQ== Received: from jupiter.universe (unknown [100.64.1.62]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519) (No client certificate requested) (Authenticated sender: sre) by bali.collaboradmins.com (Postfix) with ESMTPSA id 7B87E17E051A; Thu, 06 Aug 2026 19:11:13 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 126DB480064; Thu, 06 Aug 2026 19:02:25 +0200 (CEST) From: Sebastian Reichel Date: Thu, 06 Aug 2026 19:02:24 +0200 Subject: [PATCH v11 18/21] drm/bridge: synopsys: dw-dp: Clear only enabled SDPs on atomic disable Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260806-synopsys-dw-dp-improvements-v11-18-0d508505f383@collabora.com> References: <20260806-synopsys-dw-dp-improvements-v11-0-0d508505f383@collabora.com> In-Reply-To: <20260806-synopsys-dw-dp-improvements-v11-0-0d508505f383@collabora.com> To: Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Rob Herring , Krzysztof Kozlowski , Conor Dooley , David Airlie , Simona Vetter , Dmitry Baryshkov , Luca Ceresoli , Philipp Zabel Cc: Cristian Ciocaltea , Damon Ding , Dmitry Baryshkov , Alexey Charkov , dri-devel@lists.freedesktop.org, linux-rockchip@lists.infradead.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, kernel@collabora.com, linux-arm-kernel@lists.infradead.org, Sebastian Reichel X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=2746; i=sebastian.reichel@collabora.com; h=from:subject:message-id; bh=JD88w8teGMGJhjYFcaBdeCra3Vbfn/1k/AlbKAvT/vA=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGp0viCbYaHiWG8DwHONme1EUDHgeIK2gbHEs febCX8XcQn0v4kCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqdL4gAAoJENju1/PI O/qaweYP/At5atQ0smgY+XI+uJyLeDTNGGfHFGk0UCnMKhoCrMSzfoqw+ZS70c5BiIZxpkHlb6I c/qj/9b+hM0vqBYpLk7jwfFuFNp4ijcaYNLkYSWWf97Qk6c+sHA+brxuczgumk+z0WUKbO6p5aN 5HCcDDiiG4YQsrcc1lukM5DwrPDfXhx6kNXg1nFtcQJ/JC5Ym5mTzreFYf79KUilLUHTkhelOjN HFTubo0nhm5tO3XOonewX88us+qhBDnd4b38xlGpwTKUCysRxLNW1dTp7P90QiW0CDmaePZn6ZB 0SOeBazTAxPDDi1W+Q+WA+fRguS2KETTV9R09KGqa8DZnkzbJbSC2i9lW761JZ4SPCd+ZYxVB9C kPTYf/Ilu79VA7FFsrk24Uc0OAKU6HRUI1/mJiR0ddaYEgwIiGsSU1P2sB7RP8jNSlY7GF3WK3A mMe+no68c9z/Tm6otll6P5mfoaJZcP6hkdKf3X/KsWmZC4+bKVgmm+QsnJ3/VMnYaulFSrniZiQ 7wXfEq2FuURFO3SaoHDt9BZx6ylIadbIji7Dr7r8LA9otPwE169U7CyTs4BiamWaWhprCeXHZBZ bOLX6JS3TJz6QQEXGH3q2PIdp5nIVPpW16xLFPEsPR3DTZGEONP89BwMSN31dLt//nLYVzoer1O 0wdiEOrFnEPIJnEdYAog2ew== X-Developer-Key: i=sebastian.reichel@collabora.com; a=openpgp; fpr=EF660D07463F8B726A795413D8EED7F3C83BFA9A dw_dp_bridge_atomic_disable() bulk-cleared the whole SDP register bank allocation bitmap via bitmap_zero() resulting in the loss of all tracking information. This results in a slot potentially being handed out again by dw_dp_send_sdp(), which is still considered to be held by the previous owner. Then the previous owner might free up the wrong SDP later on. Instead of bulk clearing the tracking information, the new implementation only clears the SDPs actually configured during dw_dp_bridge_atomic_enable() instead of the entire bank. The introduced functionality for that will also be used by the to-be-added audio infrastructure. Signed-off-by: Sebastian Reichel Tested-by: Igor Paunovic --- drivers/gpu/drm/bridge/synopsys/dw-dp.c | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/bridge/synopsys/dw-dp.c b/drivers/gpu/drm/brid= ge/synopsys/dw-dp.c index d8682ccdfec8..39e21524a965 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-dp.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-dp.c @@ -337,6 +337,7 @@ struct dw_dp { =20 struct drm_bridge *next_bridge; =20 + int vsc_sdp_nr; DECLARE_BITMAP(sdp_reg_bank, SDP_REG_BANK_SIZE); }; =20 @@ -1078,7 +1079,19 @@ static int dw_dp_send_sdp(struct dw_dp *dp, struct d= w_dp_sdp *sdp) EN_HORIZONTAL_SDP << nr, EN_HORIZONTAL_SDP << nr); =20 - return 0; + return nr; +} + +static void dw_dp_clear_sdp(struct dw_dp *dp, int nr) +{ + regmap_clear_bits(dp->regmap, DW_DP_SDP_VERTICAL_CTRL, + EN_VERTICAL_SDP << nr); + + regmap_clear_bits(dp->regmap, DW_DP_SDP_HORIZONTAL_CTRL, + EN_HORIZONTAL_SDP << nr); + + scoped_guard(mutex, &dp->sdp_lock) + clear_bit(nr, dp->sdp_reg_bank); } =20 static int dw_dp_send_vsc_sdp(struct dw_dp *dp) @@ -1396,7 +1409,7 @@ static int dw_dp_video_enable(struct dw_dp *dp) FIELD_PREP(VIDEO_STREAM_ENABLE, 1)); =20 if (dw_dp_video_need_vsc_sdp(dp)) - dw_dp_send_vsc_sdp(dp); + dp->vsc_sdp_nr =3D dw_dp_send_vsc_sdp(dp); =20 return 0; } @@ -1755,8 +1768,12 @@ static void dw_dp_bridge_atomic_disable(struct drm_b= ridge *bridge, =20 dw_dp_video_disable(dp); dw_dp_link_disable(dp); - scoped_guard(mutex, &dp->sdp_lock) - bitmap_zero(dp->sdp_reg_bank, SDP_REG_BANK_SIZE); + + if (dp->vsc_sdp_nr >=3D 0) { + dw_dp_clear_sdp(dp, dp->vsc_sdp_nr); + dp->vsc_sdp_nr =3D -1; + } + dw_dp_reset(dp); pm_runtime_put_autosuspend(dp->dev); } @@ -2349,6 +2366,8 @@ int dw_dp_probe(struct dw_dp *dp) if (ret) return ret; =20 + dp->vsc_sdp_nr =3D -1; + bridge =3D &dp->bridge; bridge->of_node =3D dev->of_node; bridge->ops =3D DRM_BRIDGE_OP_DETECT | DRM_BRIDGE_OP_EDID | DRM_BRIDGE_OP= _HPD; --=20 2.53.0 From nobody Fri Oct 2 01:13:04 2026 Received: from bali.collaboradmins.com (bali.collaboradmins.com [148.251.105.195]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 65DE748AE00; Thu, 6 Aug 2026 17:02:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.251.105.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786035765; cv=none; b=HutJwlZvtBYqmQ+zhhBoPthRX11YcyWiWtvyyAm/2H8MO9ADnz8d4kOjYrJwTNVW7Dce5qkQSqLXqvdQ5kYBzfFHTCR8jI3XSelIIuBVVDgJDW7z6LIsQ0lE/dQXibwcvSDFbKwESaMPDZYuDQDIs5kjNMUMDfeVsUB7PuHKLAA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786035765; c=relaxed/simple; bh=HJ4BFYGE+BpWSg5pZ0L+h8cPm9Opa0kg25ZJyYX3+8o=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=KtqaZsy+gCfO8xVmaEBDtw6BLBPTAY2/upOSPyhHCy/Niwmm7QpgnUwita5OdQgt+KlU+qfcCDMraINKCduGfzALg6S628qtBhQmhxWzlu7hF4KlPQKm4ku/HZU1vnj0/F1LkbuS5oVasogLwIr3nh7JqIPbsOC0JBqHm05Ipqg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b=BDGHBD4s; arc=none smtp.client-ip=148.251.105.195 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=collabora.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="BDGHBD4s" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1786035746; bh=HJ4BFYGE+BpWSg5pZ0L+h8cPm9Opa0kg25ZJyYX3+8o=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=BDGHBD4svxhT6TLZPCNKHZQ21TQdz7sAqGDBo9nZbEaP/Rm9PKzMv+9+4jlH+EI4P sbUT6T9naqBl2xRVqGOqvT5vUQsqqgNmvjSpIpfDCVx0zJ1qKL7iCl/aTX7k8e0613 M86pXTB87PcxmWQwa46RU+koT6mUTzs/fpZ5RSFWW6e8KkDKYkRNMfw3P+mDg4LaYW eHhEaEFwZS9prK80/4vHOR0tPfZ5H5Z7rM62M1lstzpMN/r2dm0Apq4FP4+rWxca+T l+eaWZ1Yhlf9JRSjKWkQwwZDAb3tDs1warnr+Ojr85tx5MPGYiTU3iX01lHqSU4uJ4 mrPWnFX1ssfEQ== Received: from jupiter.universe (unknown [100.64.1.62]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519) (No client certificate requested) (Authenticated sender: sre) by bali.collaboradmins.com (Postfix) with ESMTPSA id 06BF017E12A2; Thu, 06 Aug 2026 19:02:26 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 13FB0480065; Thu, 06 Aug 2026 19:02:25 +0200 (CEST) From: Sebastian Reichel Date: Thu, 06 Aug 2026 19:02:25 +0200 Subject: [PATCH v11 19/21] drm/bridge: synopsys: dw-dp: Use regmap_set_bits in dw_dp_send_sdp Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260806-synopsys-dw-dp-improvements-v11-19-0d508505f383@collabora.com> References: <20260806-synopsys-dw-dp-improvements-v11-0-0d508505f383@collabora.com> In-Reply-To: <20260806-synopsys-dw-dp-improvements-v11-0-0d508505f383@collabora.com> To: Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Rob Herring , Krzysztof Kozlowski , Conor Dooley , David Airlie , Simona Vetter , Dmitry Baryshkov , Luca Ceresoli , Philipp Zabel Cc: Cristian Ciocaltea , Damon Ding , Dmitry Baryshkov , Alexey Charkov , dri-devel@lists.freedesktop.org, linux-rockchip@lists.infradead.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, kernel@collabora.com, linux-arm-kernel@lists.infradead.org, Sebastian Reichel X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1255; i=sebastian.reichel@collabora.com; h=from:subject:message-id; bh=HJ4BFYGE+BpWSg5pZ0L+h8cPm9Opa0kg25ZJyYX3+8o=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGp0viBeQd4T3g+Pzh1w/HSWJWhpMgYegO+Iy +9eatZnJLF9lokCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqdL4gAAoJENju1/PI O/qaLTEP/jVCr7EepydxLo/fMD/IdC1O0pgOGN9qsBbUljW+VAJ/GsyuKlQrhzvOXjBdaqJBOAG EE2kyD2KlLdPNd7RXU70h7NthOt/H3oiIA5rtRZsaXzGbGmnhT+kxNIKiEORLHQnK4iQQ/WSN9l LpH/bVfKyWJv49sDL8B0iLb0FS4YasU0LjK/nlhZoKizqZmJ3u59ZtqJq2bpz5ZnijRhrK7IQFe M37ZouER21fd/0esH0V8up7JkPk9lJGfNpgP0tR0X5tjFs8UXEr0rgP53ykJS3Lb0o9O8IFr/S6 bnusAf+i38UEJF1APuGlW8eaArlJ8j228zcDip58D0DekagNGE+SHW+CVFbSeEQR33+u1tLt0VP uw84JdCBJ/mNpvx5P/mHkCpptCSH87GQxRBLqF/u9i9gb1u82WJR1lMYxTbMEP0dC1PY4n7nAjY 30/yfHuUTktTH6Sdb41x6yP4neBpyKR512ppIEiyM5NVhkq/VWR1ZLtqWF5Oi+Ij9k5TAJvFDJV DE+j3QIIUiyMwX6W4erupPzOe1aMIdFaurTNufu1UBTMXaiOOQf2mo5YCCMWRiVn5YGC+RE/T30 U1+1ZqrSd0BdandxE191wmQQ59I3gC4TAZMxW+hPXEK/xlf7Eqp9qr1K3S3SzhPSbCPokskxATE PHLtFwpn42sgWaLKTvv0oEw== X-Developer-Key: i=sebastian.reichel@collabora.com; a=openpgp; fpr=EF660D07463F8B726A795413D8EED7F3C83BFA9A Simplify dw_dp_send_sdp() a little bit by making use of regmap_set_bits. No functional change intended. Signed-off-by: Sebastian Reichel Tested-by: Igor Paunovic --- drivers/gpu/drm/bridge/synopsys/dw-dp.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/drivers/gpu/drm/bridge/synopsys/dw-dp.c b/drivers/gpu/drm/brid= ge/synopsys/dw-dp.c index 39e21524a965..b610abf76ef7 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-dp.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-dp.c @@ -1070,14 +1070,12 @@ static int dw_dp_send_sdp(struct dw_dp *dp, struct = dw_dp_sdp *sdp) FIELD_PREP(SDP_REGS, get_unaligned_le32(payload))); =20 if (sdp->flags & DW_DP_SDP_VERTICAL_INTERVAL) - regmap_update_bits(dp->regmap, DW_DP_SDP_VERTICAL_CTRL, - EN_VERTICAL_SDP << nr, - EN_VERTICAL_SDP << nr); + regmap_set_bits(dp->regmap, DW_DP_SDP_VERTICAL_CTRL, + EN_VERTICAL_SDP << nr); =20 if (sdp->flags & DW_DP_SDP_HORIZONTAL_INTERVAL) - regmap_update_bits(dp->regmap, DW_DP_SDP_HORIZONTAL_CTRL, - EN_HORIZONTAL_SDP << nr, - EN_HORIZONTAL_SDP << nr); + regmap_set_bits(dp->regmap, DW_DP_SDP_HORIZONTAL_CTRL, + EN_HORIZONTAL_SDP << nr); =20 return nr; } --=20 2.53.0 From nobody Fri Oct 2 01:13:04 2026 Received: from bali.collaboradmins.com (bali.collaboradmins.com [148.251.105.195]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id AA28C36655C; Thu, 6 Aug 2026 17:11:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.251.105.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786036277; cv=none; b=bQBmOowEGO7EXt6Ny7pzRkjrBaEiT3pMbPLvwadHmGvNEY/xbfG7PDJq2mgaEaEAVdlOejJ1DZYBn1G75gSkS1mJsJZDAK0zyxWqhCvnNNjYOEfo5S2WXRPAmcD0XzrgKPr/Sz+FiHhe8zA4fBL6JrN1kfjQfDC36VcucoqSy7c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786036277; c=relaxed/simple; bh=SwF3VHoRiI4Zsf33YHjX0UHR9rjLn/pkIELQ2nyar2c=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=n6wC2nG6Z/Yk/mwttfuN7OopG8v69Wk6pKw6qRG5vM+zP8LIAJ7LbIwzX6omqPca5l5Ssrq3hZQDpod9RDzBceRVUMWpaQaLxo/0Yq0++vxqjS0oOvAPx8U12TkHnTdLj4PVkJHR+yIq9S7hW0gh6s1q7O4a2e4alNPdusrlCQg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b=Wcmv+tXk; arc=none smtp.client-ip=148.251.105.195 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=collabora.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="Wcmv+tXk" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1786036273; bh=SwF3VHoRiI4Zsf33YHjX0UHR9rjLn/pkIELQ2nyar2c=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=Wcmv+tXk6Fb4ukbTjux//eab/6XloiLv47xLSu0piBtALKGWuCCTULgT9Q7o04xrd 1yHIrbzwBhubUZFovR+tXIeNpXQnjkU4EFOPpu546R7lFUofycGGMvfbt1UlxABzyE p147C0aJaiaqMws4cxpEUxoQloGfJXgJ9eR49jlrC6b3gf95ym7wZMB53iGmp+dz8c xZQMALcA+GgJ+EHqO4jSYbcSa9SvBvPOkJDSlTvXvNE8AF5tyYhx1ZypamOzFHoDt2 el6q6y72xxf7U6iuBMp3TaHe6RdC0wx4YhqjSQG70qr+ZmJ+ytkRz8TUb2WEXWYIUA aPkuQgPC8RgqA== Received: from jupiter.universe (unknown [100.64.1.62]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519) (No client certificate requested) (Authenticated sender: sre) by bali.collaboradmins.com (Postfix) with ESMTPSA id 7CB5917E0742; Thu, 06 Aug 2026 19:11:13 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 156D5480066; Thu, 06 Aug 2026 19:02:25 +0200 (CEST) From: Sebastian Reichel Date: Thu, 06 Aug 2026 19:02:26 +0200 Subject: [PATCH v11 20/21] dt-bindings: display: rockchip: dw-dp: Fix sound DAI cells Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260806-synopsys-dw-dp-improvements-v11-20-0d508505f383@collabora.com> References: <20260806-synopsys-dw-dp-improvements-v11-0-0d508505f383@collabora.com> In-Reply-To: <20260806-synopsys-dw-dp-improvements-v11-0-0d508505f383@collabora.com> To: Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Rob Herring , Krzysztof Kozlowski , Conor Dooley , David Airlie , Simona Vetter , Dmitry Baryshkov , Luca Ceresoli , Philipp Zabel Cc: Cristian Ciocaltea , Damon Ding , Dmitry Baryshkov , Alexey Charkov , dri-devel@lists.freedesktop.org, linux-rockchip@lists.infradead.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, kernel@collabora.com, linux-arm-kernel@lists.infradead.org, Sebastian Reichel , Krzysztof Kozlowski X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=3153; i=sebastian.reichel@collabora.com; h=from:subject:message-id; bh=SwF3VHoRiI4Zsf33YHjX0UHR9rjLn/pkIELQ2nyar2c=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGp0viCnbkq6Wdxp1KnetBT7jAFranUwSZgwO jTSOmd9xnPw2okCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqdL4gAAoJENju1/PI O/qa3xcP/AkCAroNp68tJsgQXtw8A4H0ygxyK4SeKuD+dXMnpu0NmDnfkYb5QXdjPrGMy58s7mc ClCTEFQX4AgeyH5wPpAVA+W/bL/JOI3dv94lo5pT0EZuJo2LX/LfpXla7jNdHbqdCFbFdc9kUk0 Nb0yCugXzpvY/eXaYT6Xq/UtTNc858js6R0Ie6Wn1hqU1iBgjbiBenIAVP8fo1zIo8hfV5i6sCN zeTANt5gx9BwXB85ty6siLwTsZjzBMnq5GPs/3BPgaZB5I+PmHKWs4yP/ZSUOfUcRriKEX1H2e+ TkWwReae0wjGZVk1d3ReUYZzZc2zO18xyAsMVk9ePkeFEiCVBL0DgPOcIj0G62Jx56nv2yX2/8m eaY26CvFo8a8OblOPcsON+cF5YHPZ1q0z0hgwxVwuh6rCEqRpxLP4UkObXr1rC0IGCic1hBgreG GMRj0z9UEfobIXc3XGA54Uz2Lzagnc/L9ypk9SOwskkACbtnmyTCF3/LqwjkwGNG98+C5NQ53Xv 9Sxq0ETJkRlJAGNq7SwHVkuxZKuseyWhJV4S6iWNvFLJlFY6xkYhQGt+fy/u+aL1/LNwauXx/Zk Ea+kf3CFWI4NLGRU27qiXkjutEowg7crG+4bqYMoPwGZJQGW13Qsy6Cvj6fqULZxCGJKmDs4CG4 O5GBbq6Ldyp6jnG3M3RgoPQ== X-Developer-Key: i=sebastian.reichel@collabora.com; a=openpgp; fpr=EF660D07463F8B726A795413D8EED7F3C83BFA9A The RK3588 and RK3576 DesignWare DisplayPort controllers both have two possible DAI interfaces: I2S and S/PDIF. Thus an argument is needed to to select the right interface. In addition to that the RK3576 DisplayPort controller is configured with Multi Stream Transport (MST) enabled for up to 3 displays and thus has a total of 6 DAI interfaces (I2S and S/PDIF for each possible stream). Meanwhile the RK3588 does not support MST and thus has only 2 DAI interfaces. The binding update from this patch has only been tested with the simple single stream transport (SST) setup as the Linux driver does not yet support MST. Once MST support is added, the plan is to simply add more numbers to the argument, so that it looks like this for RK3576: 0 =3D I2S on stream 0, 1 =3D S/PDIF on stream 0 2 =3D I2S on stream 1, 3 =3D S/PDIF on stream 1 4 =3D I2S on stream 2, 5 =3D S/PDIF on stream 2 As the arguments are not part of the binding itself the audio side is also ready for MST after this change. Switching '#sound-dai-cells' from 0 to 1 without keeping compatibility is an ABI break. The rationale for going that way is, that there is not a single known driver implementation for the current binding. It's also unclear how the current binding would be used (only support I2S or S/PDIF for stream 0?). The mainline rk3588 DTS include sets it to 0, but does not have any soundcard using the DAI. This will be fixed up separately. The RK3576 does not set it at all. Reviewed-by: Krzysztof Kozlowski Signed-off-by: Sebastian Reichel Tested-by: Igor Paunovic --- .../devicetree/bindings/display/rockchip/rockchip,dw-dp.yaml | 9 +++++= ---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Documentation/devicetree/bindings/display/rockchip/rockchip,dw= -dp.yaml b/Documentation/devicetree/bindings/display/rockchip/rockchip,dw-d= p.yaml index 2b0d9e23e943..c4f8959dd65d 100644 --- a/Documentation/devicetree/bindings/display/rockchip/rockchip,dw-dp.yaml +++ b/Documentation/devicetree/bindings/display/rockchip/rockchip,dw-dp.yaml @@ -25,7 +25,7 @@ description: | * Supports up to 8/10 bits per color component * Supports RBG, YCbCr4:4:4, YCbCr4:2:2, YCbCr4:2:0 * Pixel clock up to 594MHz - * I2S, SPDIF audio interface + * I2S, S/PDIF audio interface =20 properties: compatible: @@ -46,7 +46,7 @@ properties: - description: DisplayPort AUX clock - description: HDCP clock - description: I2S interface clock - - description: SPDIF interfce clock + - description: S/PDIF interfce clock =20 clock-names: minItems: 3 @@ -83,7 +83,8 @@ properties: maxItems: 1 =20 "#sound-dai-cells": - const: 0 + const: 1 + description: 0 for I2S, 1 for S/PDIF =20 required: - compatible @@ -144,7 +145,7 @@ examples: resets =3D <&cru SRST_DP0>; phys =3D <&usbdp_phy0 PHY_TYPE_DP>; power-domains =3D <&power RK3588_PD_VO0>; - #sound-dai-cells =3D <0>; + #sound-dai-cells =3D <1>; =20 ports { #address-cells =3D <1>; --=20 2.53.0 From nobody Fri Oct 2 01:13:04 2026 Received: from bali.collaboradmins.com (bali.collaboradmins.com [148.251.105.195]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A9BEC48D862; Thu, 6 Aug 2026 17:02:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.251.105.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786035766; cv=none; b=Vz8pTpWrpKd/+M/rylsrhENztviwp0iNuD06SiH3cVbny1HskMYzayTKr3anrvDbD+a7tlvgq/dnNG7VGMQjXN9vLagui2qwk0WhDUUbyCq1l244TUDCOdID13oCz81wvCW0DruiFT2MbLeIM8syQ3xv1SnCtOKKZJmrwlMwURM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786035766; c=relaxed/simple; bh=rUTz7CK3p/p2jbkH5eKhbQMALWCMFHw5vsivpEJ3pwQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=TQ9uRKOF/7aFxYZqVE01zInXul8ZRpUxuo9BpSwjA7uib/SDCt1Mjt6uStKQbTXs75E2SSuRVe0WZ7A/BjrlQq7V34nCh9nRKFMix8Vt60eiU2Gg3qZzryjfgxOVAVI6udw6WyEHajL7a66ZdQSHiQkVfG5DmVrHC9FHQw2DnDs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b=lcW9nXzl; arc=none smtp.client-ip=148.251.105.195 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=collabora.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="lcW9nXzl" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1786035746; bh=rUTz7CK3p/p2jbkH5eKhbQMALWCMFHw5vsivpEJ3pwQ=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=lcW9nXzlKeKucAMDXDRybejHCaRVN9fawy6j+qBitfB1l+cFI348QCuueOOPOiONy 25xQVdBxNeTrWuxc6lF6Rv4+QsKVJkXAQOhu8OcxDCs3bWvBdikVfXTdBFD/A5CVqJ O0BVSvrHnU1TXxeyIwQeBAbus2NSCQl018jwX75jxNhEnyJZ6IO+7WVRLwnRQiQOCg wCp9mHbzWBv10pfczuqEX25JKKRePl+DihOFpBAsZyKZKH63wLdQe/Frpcld9jUoMH pCQBDlpgKoQvxyOw/LIH4ovNaHWnRj/3LY8tpNxjrkoAZ9dHqeXhRiXGCItamkGBh9 FRJg4LMjW7YCg== Received: from jupiter.universe (unknown [100.64.1.62]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519) (No client certificate requested) (Authenticated sender: sre) by bali.collaboradmins.com (Postfix) with ESMTPSA id 1189017E12AE; Thu, 06 Aug 2026 19:02:26 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 16E65480067; Thu, 06 Aug 2026 19:02:25 +0200 (CEST) From: Sebastian Reichel Date: Thu, 06 Aug 2026 19:02:27 +0200 Subject: [PATCH v11 21/21] drm/bridge: synopsys: dw-dp: Add audio support Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260806-synopsys-dw-dp-improvements-v11-21-0d508505f383@collabora.com> References: <20260806-synopsys-dw-dp-improvements-v11-0-0d508505f383@collabora.com> In-Reply-To: <20260806-synopsys-dw-dp-improvements-v11-0-0d508505f383@collabora.com> To: Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Rob Herring , Krzysztof Kozlowski , Conor Dooley , David Airlie , Simona Vetter , Dmitry Baryshkov , Luca Ceresoli , Philipp Zabel Cc: Cristian Ciocaltea , Damon Ding , Dmitry Baryshkov , Alexey Charkov , dri-devel@lists.freedesktop.org, linux-rockchip@lists.infradead.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, kernel@collabora.com, linux-arm-kernel@lists.infradead.org, Sebastian Reichel X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=12060; i=sebastian.reichel@collabora.com; h=from:subject:message-id; bh=rUTz7CK3p/p2jbkH5eKhbQMALWCMFHw5vsivpEJ3pwQ=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGp0viCmTmD+Df9ExnIlzRsALD/ImSzw/8caf KMHYlneHVOnbIkCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqdL4gAAoJENju1/PI O/qapQEQAIVoNi5dICimyRYUXb6uAlfXDWEZdB28aPjUBH4KjqYuYJrdhVDzFwAq8snEaMMInl2 yGs7kKdlUxzTktQGbNmA3ZoTALo18Dumue7GUeiz4GEl4tQPPhzFK9JKaQLK+Q8uNaGNXOA/J79 xHxFCHSZvHLnl2Df44iO5mP5wamwAp84m3801jtX5lEeHc13fyMRwDxfzQVdCdnN+C7p7hsJSw7 X9TRCY3gO8xv7tfunsmnYR5JiVVaPX8j1YqJM3IUUzExUjuMdJqH45EOVdYMrX/MVISoR7afskG C6OKXwtoHyK/HIb+mZQqUx/ToiDVq++vPKhGwP6C8UEZDoi2P4BCB9qLl0PVL5MuxoHFuTiB3Lz H3SLgZooNHV8AKseIdeRZg8kCunfhAAIb32hwlXENRfrRr8rc4KUpE1Bn+N9T1V90B1MOPIqfIC rqupjSH81B597gpJQJAP00yIG3i0Td97qkf0Pj4n8puoGcbYrpBFq1g3aLGxh5zE6hUjW8wwVYX PL2c5BOPlywY9cJpUab/nsuZaMuNxky8HUrZdCPSOq77knmSSltTDr8rBkaIxttFqia7Un9xFxu RbJJwQIXZ8Wcfee0s9oQ1rMpYpvpdyUPaXsql6C3YM8vEmyOx6LzsNf3qvkEvrDoDpR3BN+d5va Knjg+uzqKLsI+lTaRfUMqGA== X-Developer-Key: i=sebastian.reichel@collabora.com; a=openpgp; fpr=EF660D07463F8B726A795413D8EED7F3C83BFA9A Implement audio support for the Synopsys DesignWare DisplayPort controller. Signed-off-by: Sebastian Reichel Tested-by: Igor Paunovic --- drivers/gpu/drm/bridge/synopsys/dw-dp.c | 314 ++++++++++++++++++++++++++++= +++- 1 file changed, 313 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/bridge/synopsys/dw-dp.c b/drivers/gpu/drm/brid= ge/synopsys/dw-dp.c index b610abf76ef7..df149c52fce0 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-dp.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-dp.c @@ -23,17 +23,21 @@ #include #include #include +#include #include #include #include #include #include =20 +#include + #define DW_DP_VERSION_NUMBER 0x0000 #define DW_DP_VERSION_TYPE 0x0004 #define DW_DP_ID 0x0008 =20 #define DW_DP_CONFIG_REG1 0x0100 +#define AUDIO_SELECT GENMASK(2, 1) #define DW_DP_CONFIG_REG2 0x0104 #define DW_DP_CONFIG_REG3 0x0108 =20 @@ -110,6 +114,10 @@ #define HBR_MODE_ENABLE BIT(10) #define AUDIO_DATA_WIDTH GENMASK(9, 5) #define AUDIO_DATA_IN_EN GENMASK(4, 1) +#define AUDIO_DATA_IN_EN_CHANNEL12 BIT(0) +#define AUDIO_DATA_IN_EN_CHANNEL34 BIT(1) +#define AUDIO_DATA_IN_EN_CHANNEL56 BIT(2) +#define AUDIO_DATA_IN_EN_CHANNEL78 BIT(3) #define AUDIO_INF_SELECT BIT(0) =20 #define DW_DP_SDP_VERTICAL_CTRL 0x0500 @@ -253,6 +261,8 @@ =20 #define SDP_REG_BANK_SIZE 16 =20 +#define DW_DP_SDP_VERSION 0x12 + struct dw_dp_link_caps { bool enhanced_framing; bool tps3_supported; @@ -306,6 +316,19 @@ struct dw_dp_hotplug { bool long_hpd; }; =20 +enum dw_dp_audio_interface_support { + DW_DP_AUDIO_I2S_ONLY =3D 0, + DW_DP_AUDIO_SPDIF_ONLY =3D 1, + DW_DP_AUDIO_I2S_AND_SPDIF =3D 2, + DW_DP_AUDIO_NONE =3D 3, +}; + +enum dw_dp_audio_interface { + DW_DP_AUDIO_I2S =3D 0, + DW_DP_AUDIO_SPDIF =3D 1, + DW_DP_AUDIO_UNUSED, +}; + struct dw_dp { struct drm_bridge bridge; struct device *dev; @@ -321,10 +344,18 @@ struct dw_dp { int irq; struct work_struct hpd_work; struct dw_dp_hotplug hotplug; + enum dw_dp_audio_interface audio_interface; + int audio_channels; + int audio_channel_allocation; + int audio_sample_width; + bool audio_muted; + int audio_sdp_nr; /* Serialize hpd status access */ struct mutex irq_lock; /* Serialize sdp_reg_bank access */ struct mutex sdp_lock; + /* Serialize audio state */ + struct mutex audio_lock; =20 struct drm_dp_aux aux; =20 @@ -1697,6 +1728,261 @@ static int dw_dp_link_enable(struct dw_dp *dp) return ret; } =20 +static int dw_dp_audio_infoframe_send(struct dw_dp *dp) +{ + struct hdmi_audio_infoframe frame; + struct dw_dp_sdp sdp; + int ret; + + ret =3D hdmi_audio_infoframe_init(&frame); + if (ret < 0) + return ret; + + frame.coding_type =3D HDMI_AUDIO_CODING_TYPE_STREAM; + frame.sample_frequency =3D HDMI_AUDIO_SAMPLE_FREQUENCY_STREAM; + frame.sample_size =3D HDMI_AUDIO_SAMPLE_SIZE_STREAM; + frame.channels =3D dp->audio_channels; + frame.channel_allocation =3D dp->audio_channel_allocation; + + ret =3D hdmi_audio_infoframe_pack_for_dp(&frame, &sdp.base, DW_DP_SDP_VER= SION); + if (ret < 0) + return ret; + + sdp.flags =3D DW_DP_SDP_VERTICAL_INTERVAL; + + return dw_dp_send_sdp(dp, &sdp); +} + +static void dw_dp_audio_infoframe_clear(struct dw_dp *dp) +{ + if (dp->audio_sdp_nr >=3D 0) { + dw_dp_clear_sdp(dp, dp->audio_sdp_nr); + dp->audio_sdp_nr =3D -1; + } + + regmap_clear_bits(dp->regmap, DW_DP_SDP_VERTICAL_CTRL, + EN_AUDIO_STREAM_SDP | EN_AUDIO_TIMESTAMP_SDP); + regmap_clear_bits(dp->regmap, DW_DP_SDP_HORIZONTAL_CTRL, + EN_AUDIO_STREAM_SDP); + + regmap_clear_bits(dp->regmap, DW_DP_AUD_CONFIG1, AUDIO_DATA_IN_EN); +} + +static void __dw_dp_audio_disable(struct dw_dp *dp) +{ + dw_dp_audio_infoframe_clear(dp); + + if (dp->audio_interface =3D=3D DW_DP_AUDIO_SPDIF) + clk_disable_unprepare(dp->spdif_clk); + else if (dp->audio_interface =3D=3D DW_DP_AUDIO_I2S) + clk_disable_unprepare(dp->i2s_clk); + + dp->audio_interface =3D DW_DP_AUDIO_UNUSED; +} + +static int __dw_dp_audio_enable(struct dw_dp *dp) +{ + u8 audio_data_in_en; + + switch (dp->audio_channels) { + case 1: + case 2: + audio_data_in_en =3D AUDIO_DATA_IN_EN_CHANNEL12; + break; + case 8: + audio_data_in_en =3D AUDIO_DATA_IN_EN_CHANNEL12 | + AUDIO_DATA_IN_EN_CHANNEL34 | + AUDIO_DATA_IN_EN_CHANNEL56 | + AUDIO_DATA_IN_EN_CHANNEL78; + break; + default: + return -EINVAL; + } + + regmap_update_bits(dp->regmap, DW_DP_AUD_CONFIG1, + AUDIO_DATA_IN_EN | NUM_CHANNELS | AUDIO_DATA_WIDTH | + AUDIO_INF_SELECT | HBR_MODE_ENABLE | AUDIO_MUTE, + FIELD_PREP(AUDIO_DATA_IN_EN, audio_data_in_en) | + FIELD_PREP(NUM_CHANNELS, dp->audio_channels - 1) | + FIELD_PREP(AUDIO_DATA_WIDTH, dp->audio_sample_width) | + FIELD_PREP(AUDIO_INF_SELECT, dp->audio_interface) | + FIELD_PREP(HBR_MODE_ENABLE, 0) | + FIELD_PREP(AUDIO_MUTE, dp->audio_muted)); + + /* Wait for inf switch */ + usleep_range(20, 40); + + /* + * Send audio stream during vertical and horizontal blanking periods. + * Send out audio timestamp SDP once per video frame during the vertical + * blanking period + */ + regmap_update_bits(dp->regmap, DW_DP_SDP_VERTICAL_CTRL, + EN_AUDIO_STREAM_SDP | EN_AUDIO_TIMESTAMP_SDP, + FIELD_PREP(EN_AUDIO_STREAM_SDP, 1) | + FIELD_PREP(EN_AUDIO_TIMESTAMP_SDP, 1)); + regmap_update_bits(dp->regmap, DW_DP_SDP_HORIZONTAL_CTRL, + EN_AUDIO_STREAM_SDP, + FIELD_PREP(EN_AUDIO_STREAM_SDP, 1)); + + if (dp->audio_sdp_nr >=3D 0) { + dw_dp_clear_sdp(dp, dp->audio_sdp_nr); + dp->audio_sdp_nr =3D -1; + } + + dp->audio_sdp_nr =3D dw_dp_audio_infoframe_send(dp); + if (dp->audio_sdp_nr < 0) { + dw_dp_audio_infoframe_clear(dp); + return dp->audio_sdp_nr; + } + + return 0; +} + +static int dw_dp_audio_startup(struct drm_bridge *bridge, + struct drm_connector *connector) +{ + struct dw_dp *dp =3D bridge_to_dp(bridge); + + dev_dbg(dp->dev, "audio startup\n"); + + return pm_runtime_get_active(dp->dev, RPM_TRANSPARENT); +} + +static void dw_dp_audio_unprepare(struct drm_bridge *bridge, + struct drm_connector *connector) +{ + struct dw_dp *dp =3D bridge_to_dp(bridge); + + guard(mutex)(&dp->audio_lock); + + __dw_dp_audio_disable(dp); +} + +static int dw_dp_audio_prepare(struct drm_bridge *bridge, + struct drm_connector *connector, + struct hdmi_codec_daifmt *daifmt, + struct hdmi_codec_params *params) +{ + struct dw_dp *dp =3D bridge_to_dp(bridge); + u8 supported_audio_interfaces; + enum dw_dp_audio_interface audio_interface; + u32 cfg1; + int ret; + + guard(mutex)(&dp->audio_lock); + + /* + * prepare might be called multiple times, so release the clocks + * from previous calls to keep the calls in balance. + */ + if (dp->audio_interface !=3D DW_DP_AUDIO_UNUSED) + __dw_dp_audio_disable(dp); + + /* The hardware is limited to 1,2 or 8 channels */ + switch (params->cea.channels) { + case 1: + case 2: + case 8: + break; + default: + dev_err(dp->dev, "invalid audio channels %d\n", params->cea.channels); + return -EINVAL; + } + + if (params->sample_width < 16 || params->sample_width > 24) { + dev_err(dp->dev, "invalid data sample width %d\n", params->sample_width); + return -EINVAL; + } + + switch (daifmt->fmt) { + case HDMI_SPDIF: + audio_interface =3D DW_DP_AUDIO_SPDIF; + break; + case HDMI_I2S: + /* + * It is recommended to use SPDIF instead of I2S, since I2S mode requires + * manually inserting PCUV control bits from userspace and this is done + * automatically in hardware for SPDIF mode. + */ + audio_interface =3D DW_DP_AUDIO_I2S; + break; + default: + dev_err(dp->dev, "invalid DAI format %d\n", daifmt->fmt); + return -EINVAL; + } + + regmap_read(dp->regmap, DW_DP_CONFIG_REG1, &cfg1); + supported_audio_interfaces =3D FIELD_GET(AUDIO_SELECT, cfg1); + + if (supported_audio_interfaces !=3D DW_DP_AUDIO_I2S_AND_SPDIF && + supported_audio_interfaces !=3D audio_interface) { + dev_err(dp->dev, "unsupported DAI %d\n", daifmt->fmt); + return -EINVAL; + } + + ret =3D clk_prepare_enable(dp->spdif_clk); + if (ret) + return ret; + + ret =3D clk_prepare_enable(dp->i2s_clk); + if (ret) { + clk_disable_unprepare(dp->spdif_clk); + return ret; + } + + if (audio_interface =3D=3D DW_DP_AUDIO_I2S) + clk_disable_unprepare(dp->spdif_clk); + else if (audio_interface =3D=3D DW_DP_AUDIO_SPDIF) + clk_disable_unprepare(dp->i2s_clk); + + dp->audio_channels =3D params->cea.channels; + dp->audio_channel_allocation =3D params->cea.channel_allocation; + dp->audio_sample_width =3D params->sample_width; + dp->audio_interface =3D audio_interface; + + ret =3D __dw_dp_audio_enable(dp); + if (ret < 0) { + dev_err(dp->dev, "failed to enable audio\n"); + __dw_dp_audio_disable(dp); + return ret; + } + + dev_dbg(dp->dev, "audio prepare with %d channels using DAI=3D%d\n", + dp->audio_channels, dp->audio_interface); + + return 0; +} + +static void dw_dp_audio_shutdown(struct drm_bridge *bridge, + struct drm_connector *connector) +{ + struct dw_dp *dp =3D bridge_to_dp(bridge); + + dev_dbg(dp->dev, "audio shutdown\n"); + + dw_dp_audio_unprepare(bridge, connector); + pm_runtime_put_autosuspend(dp->dev); +} + +static int dw_dp_audio_mute_stream(struct drm_bridge *bridge, + struct drm_connector *connector, + bool enable, int direction) +{ + struct dw_dp *dp =3D bridge_to_dp(bridge); + + dev_dbg(dp->dev, "audio %smute\n", enable ? "" : "un"); + + guard(mutex)(&dp->audio_lock); + + dp->audio_muted =3D enable; + + regmap_update_bits(dp->regmap, DW_DP_AUD_CONFIG1, AUDIO_MUTE, + FIELD_PREP(AUDIO_MUTE, enable)); + + return 0; +} + static void dw_dp_bridge_atomic_enable(struct drm_bridge *bridge, struct drm_atomic_commit *state) { @@ -1735,6 +2021,14 @@ static void dw_dp_bridge_atomic_enable(struct drm_br= idge *bridge, dev_err(dp->dev, "failed to enable video: %d\n", ret); return; } + + scoped_guard(mutex, &dp->audio_lock) { + if (dp->audio_interface !=3D DW_DP_AUDIO_UNUSED) { + ret =3D __dw_dp_audio_enable(dp); + if (ret < 0) + dev_err(dp->dev, "failed to restore audio: %d\n", ret); + } + } } =20 static void dw_dp_reset(struct dw_dp *dp) @@ -2035,6 +2329,11 @@ static const struct drm_bridge_funcs dw_dp_bridge_fu= ncs =3D { .detect =3D dw_dp_bridge_detect, .edid_read =3D dw_dp_bridge_edid_read, .oob_notify =3D dw_dp_bridge_oob_notify, + + .dp_audio_startup =3D dw_dp_audio_startup, + .dp_audio_prepare =3D dw_dp_audio_prepare, + .dp_audio_shutdown =3D dw_dp_audio_shutdown, + .dp_audio_mute_stream =3D dw_dp_audio_mute_stream, }; =20 static int dw_dp_link_retrain(struct dw_dp *dp) @@ -2249,6 +2548,10 @@ int dw_dp_probe(struct dw_dp *dp) if (ret) return ret; =20 + ret =3D devm_mutex_init(dev, &dp->audio_lock); + if (ret) + return ret; + res =3D devm_platform_ioremap_resource(pdev, 0); if (IS_ERR(res)) return PTR_ERR(res); @@ -2365,12 +2668,21 @@ int dw_dp_probe(struct dw_dp *dp) return ret; =20 dp->vsc_sdp_nr =3D -1; + dp->audio_interface =3D DW_DP_AUDIO_UNUSED; + dp->audio_sdp_nr =3D -1; =20 bridge =3D &dp->bridge; bridge->of_node =3D dev->of_node; - bridge->ops =3D DRM_BRIDGE_OP_DETECT | DRM_BRIDGE_OP_EDID | DRM_BRIDGE_OP= _HPD; + bridge->ops =3D DRM_BRIDGE_OP_DP_AUDIO | + DRM_BRIDGE_OP_DETECT | + DRM_BRIDGE_OP_EDID | + DRM_BRIDGE_OP_HPD; bridge->type =3D DRM_MODE_CONNECTOR_DisplayPort; bridge->ycbcr_420_allowed =3D true; + bridge->hdmi_audio_dev =3D dev; + bridge->hdmi_audio_max_i2s_playback_channels =3D 8; + bridge->hdmi_audio_dai_port =3D 1; + bridge->hdmi_audio_spdif_playback =3D true; =20 return devm_drm_bridge_add(dev, bridge); } --=20 2.53.0