From nobody Fri Oct 2 07:46:36 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 76CAF4302E7; Mon, 3 Aug 2026 18:05:06 +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=1785780308; cv=none; b=IQuKSbCzf1HTVHQPexLgnCtyiUso22nwqt6kF1LPSM/RYJhwNgl3W2mZ+Fp5L8zmQ37b7oYoBeH624kiwIC6zXIK4Y162Qz5JZuumnASPsnZXIOHWrSossPo0St2vNoXcwfBYDyVRV5JMhC9I4ymXJeAEA9iwd03GyGRwUZz6xI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785780308; c=relaxed/simple; bh=T9YLXYV9yscTLz/3RQjqOP1ZHffRl5hykzJn/q2OMQQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=FIkvbuFPYNYsSjWwTquFQAwLnvK7cdwwcbOo0QSmZf2LqRoYPyY2YE/lLNeorpKUUIDPEUJINQsVsOwzkUzSltJBz3dSnxr1SnWzD8i3aUU5N/ovMJb2Q41PNpWkYQ/mLcfzUm6m+vdPJzaZQ0oEdak2OLojVElGiK469/GQHZ0= 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=UaeMKjjp; 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="UaeMKjjp" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1785780303; bh=T9YLXYV9yscTLz/3RQjqOP1ZHffRl5hykzJn/q2OMQQ=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=UaeMKjjpvsbB+MglPm9psjHNT7kEOg880PmrCBE1lnlCbiab1gWTsKi+4EA60ir6w DmElKuWM01ZIkHuaQqTniMoc5EYopp06wtci/l6HsX1bjnl3oRHNFQtj+MqA2b4rCC yryBItRhq95Tl3I+FTocPCkfkZN6EXxkBK0K5kA6P3SspScfxEVI/kCq5G+8s7dNfs rCSoOKTzdyrXzVqxenwI9wrSfwCfOGBsl5ldVOuLJ34wpMGckOFg7xF2L1LXmZfa4C wp0HwSD8Y6IhD4Z7fe9hDiZpprugyMszWwUXz5X/ssohBVyJo3Q1Dgz0xSSdVPNGvP Hl2rF6siB2Syw== 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 BBC4317E0FCF; Mon, 03 Aug 2026 20:05:03 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 6218E480028; Mon, 03 Aug 2026 20:05:03 +0200 (CEST) From: Sebastian Reichel Date: Mon, 03 Aug 2026 20:05:02 +0200 Subject: [PATCH v9 01/22] 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: <20260803-synopsys-dw-dp-improvements-v9-1-2e6e46135312@collabora.com> References: <20260803-synopsys-dw-dp-improvements-v9-0-2e6e46135312@collabora.com> In-Reply-To: <20260803-synopsys-dw-dp-improvements-v9-0-2e6e46135312@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=T9YLXYV9yscTLz/3RQjqOP1ZHffRl5hykzJn/q2OMQQ=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGpw2E7OcysV0axgOUxitewZ83rSYK7f/9/SP cOhmsIGjQOxpYkCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqcNhOAAoJENju1/PI O/qaQUsP/1Pz+EdyzwF/+ss11FcXAATWNc4fjKH3boYBwy+X0/pJ1uDAZFmVc66fjrym9ttdoSC 7frbIZ9UTwwIQAENot0DGmaCIuZFfNe6gz9jnLA0ZzsoiijGvcTgC372HthbVxBmX10EwaBtpSA VxbsQrO/7XJf6EmucLLU8VtlTCUmWobJC4GKDGiZOkDLPqfJaUGyI7mLd2ipAJPh+DisYxQOt63 WYUjTQgwhjRC1knbTCgXq2bNnQdSFRJGKzwBNqu5IFRxXPc9LS1NjNSqRPYllaQsZUkADvGI/30 I1M6PxVhwoMC9fiUjqw4tigigdWKMRUlriSefKNbvO5LYkjQJatyRsm9Q6m6vhvByjF2PrqtfFL dUBjvzFIXFyCdKr1vL3qrFdiUCRKrT10+iA84J1FOqz21BYuHM54kUsKOwJxMyAcBMvLrG14jeH L2/2zOrJcrr4+EYfu4VfevYrpN4wCdkd73+oi7obO8kGwyB1JjHM2r5DVFpdo5IQPe95VmLQXbz cEKtoioxwwPIs6jn53cL1NL8FfQqM8RVZg9wpA3Sg+JpQxnifnJnkoUxrk0PGW/bbQbA2SGtXnc c/ZKNVZ2Q6ZPRifv/V6UUS+izPrBHtlwfTnj32mYKIdpq50ZLixvIADpCTw11PTBSHuxVsEubgq DvsV8uiNoe+uzrZssnV8pWg== 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 --- 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 3445c82e6f50..112a49911309 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, @@ -2044,20 +2073,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); @@ -2065,37 +2084,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 07:46:36 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 DFD7942DFFA; Mon, 3 Aug 2026 18:05:05 +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=1785780308; cv=none; b=sQ6dQ/CBPrd6zoly/Mfj4CAkrExyTOkOd/z+GaOev+c7O/0VrodYQbFlEqQlsG1R1qgr+uLj9a46AE/98uuPsHuCou0lWidoFOsoakQSUkWNvrI9JMwCmaunxfiCzEYsKjaXa0jdjHgJsIqfn2obSgq1ZvvyMMQZTW+b8zbzDOg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785780308; c=relaxed/simple; bh=H3sTv7TRVa7+bRLprdY4kHvgThLShUhT8npo6FiMQGM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=C6q4qi7KebXLQioWsmtjvciJ5YCrgQ2bKl3y+hYKhHL0DgOhCtUkL/5edZRmvQ0a9BuuZBGc3bCgKZlsREDIaffKYBeL4w7kmVAPgLbtWKxbO2VVHdzE6cJTrQVgfJM0qPebmur01eTd0EVjApanTlH5+B/wQ8YdCWdufMZyhOg= 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=Rlbvrc4t; 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="Rlbvrc4t" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1785780303; bh=H3sTv7TRVa7+bRLprdY4kHvgThLShUhT8npo6FiMQGM=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=Rlbvrc4tfRN4cUkzVILqCEinM82LOSw2E6wWOCgpvqWeun9UFAwOJprKLuqx5Lk68 kumGVG5owtiSn04AnLjICEn+f0O5VdT/8MpC/i+gQSYyIXeHvZpYEj82JZBjU4jt8J ifPTPLU6kJclIpJeJ3Aslv0vhMgXea+eN75GXmakbjiLnUrSSQORZUZuZxxP7hdNY7 PVyyQxe5Qlfd5wEfc+T3nZUYOKZixepnvHrDZZHiIZ4ESO0weV6hFIqIDR8eJ5XzG5 /Nj4F+8BrfQWKIXKyhZRETg3/03/czUif1varDL8VVU/LL82FXUMN4zBi3wVdOzLBp 8XVIOW1rdIx6A== 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 B7D6117E0235; Mon, 03 Aug 2026 20:05:03 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 6300748002C; Mon, 03 Aug 2026 20:05:03 +0200 (CEST) From: Sebastian Reichel Date: Mon, 03 Aug 2026 20:05:03 +0200 Subject: [PATCH v9 02/22] 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: <20260803-synopsys-dw-dp-improvements-v9-2-2e6e46135312@collabora.com> References: <20260803-synopsys-dw-dp-improvements-v9-0-2e6e46135312@collabora.com> In-Reply-To: <20260803-synopsys-dw-dp-improvements-v9-0-2e6e46135312@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=8921; i=sebastian.reichel@collabora.com; h=from:subject:message-id; bh=H3sTv7TRVa7+bRLprdY4kHvgThLShUhT8npo6FiMQGM=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGpw2E6IhlyvKBDtGoZuJDEZli3VQi5pIay3r Uro+aIrf8oz4YkCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqcNhOAAoJENju1/PI O/qaKuAP/3BJ6qrt+Lfsp7sIv90OAKaDhOIOz2AOVmo5+PM2rWUlVaDtlHv2bTkwUZutcsklxLM CeDiNvToPGHjirgNIBYzM+D22gB8SxHwZD0Edvwr8g/W59Qdu6CpOj8PdyD9xTFWbDilv/1WTfI xDpR0b0RmEVi0InrMIcPcFLZh/p2DqK3GXwdJwSQuf9dPjt3pd0vIrl59M5tBxooOXZiazKx1Fa M+lbnXngeyHEeX5fbIgQLgf6sJA1H5m/DOCyHuNeNI1TkoeDsUTDg6wRBmlFP1Xqo77Th/xn+RH FBUOYrovwVhzbiMaz52/QgmVR+KnfsogLbcK3iv7vgP+uDwB1y/0BotRmq9T8bvQlUpi7IFtc9c srUOs/pwvZxjMbXVIZk23aEPnbxHODaUGGLj2uljNlEeWLTjdHI/DVoju3BAT7qgf9Lh9QaHSqu iMIxtIghE1RwyYzL/rsdJcf6/y9gNAdGO3DgSHreWRkz40WzrhKJtZ9wnQyQQtg/PYsAprnrP55 01ZT+5/4awgnboAKfQXI87a5OOrXGU7AUuoQVEo1fBk5S0rr7rTJYJOwzyPfB2h4uLv9FPY9g1j 3BWyMK+sTapEm7TupEbFrcrKXAe7S2BDe7TPhdBubeHCe4Kp4+WnsMfcgBflb2DlTH8tKhpSMmV 5xzxCiELRJhPMGf1CNw0uhg== 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. Fixes: 86eecc3a9c2e ("drm/bridge: synopsys: Add DW DPTX Controller support = library") Reported-by: Sashiko Signed-off-by: Sebastian Reichel --- drivers/gpu/drm/bridge/synopsys/dw-dp.c | 72 +++++++++++++++++----------= ---- drivers/gpu/drm/rockchip/dw_dp-rockchip.c | 53 +++++++++++++---------- include/drm/bridge/dw_dp.h | 5 ++- 3 files changed, 74 insertions(+), 56 deletions(-) diff --git a/drivers/gpu/drm/bridge/synopsys/dw-dp.c b/drivers/gpu/drm/brid= ge/synopsys/dw-dp.c index 112a49911309..06997208945e 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-dp.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-dp.c @@ -1895,6 +1895,9 @@ static void dw_dp_hpd_work(struct work_struct *work) long_hpd =3D dp->hotplug.long_hpd; mutex_unlock(&dp->irq_lock); =20 + if (!dp->bridge.dev) + return; + dev_dbg(dp->dev, "[drm] Get hpd irq - %s\n", long_hpd ? "long" : "short"); =20 if (!long_hpd) { @@ -1983,6 +1986,26 @@ 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) +{ + struct drm_bridge *bridge =3D &dp->bridge; + struct device *dev =3D dp->dev; + int ret; + + ret =3D drm_bridge_attach(encoder, bridge, NULL, DRM_BRIDGE_ATTACH_NO_CON= NECTOR); + if (ret) + return dev_err_probe(dev, ret, "Failed to attach bridge\n"); + + return 0; +} +EXPORT_SYMBOL_GPL(dw_dp_bind); + +void dw_dp_unbind(struct dw_dp *dp) +{ + /* nothing to do */ +} +EXPORT_SYMBOL_GPL(dw_dp_unbind); + static void dw_dp_phy_exit(void *data) { struct dw_dp *dp =3D data; @@ -1990,13 +2013,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); @@ -2005,9 +2027,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); @@ -2064,21 +2085,6 @@ 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); - - 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"); - return ERR_PTR(ret); - } - dw_dp_init_hw(dp); =20 ret =3D phy_init(dp->phy); @@ -2091,11 +2097,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; + 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; + + 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 devm_request_threaded_irq(dev, dp->irq, NULL, dw_dp_irq, IRQF_ONESHOT, dev_name(dev), dp); @@ -2106,13 +2120,7 @@ struct dw_dp *dw_dp_bind(struct device *dev, struct = drm_encoder *encoder, =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..005938dc66c9 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 ret; =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 07:46:36 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 E423C42FCDE; Mon, 3 Aug 2026 18:05:05 +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=1785780307; cv=none; b=ml1UmVrTS7w71ZApWH0eisq/WAA+RSeUVgX9rB8Xv3UzbeUOOnbGyX1FFjHWxihZ8NFvpEnfhcTiHAPIiWnSlMvYLTcz6NADzIGqX2eqXndRo5NdJ4eYQh541acfyc7jfG/pjsKlDchqOUm6UOcHREMzztUF0Qo6VGx8IJ5shPI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785780307; c=relaxed/simple; bh=gsnLkYdJot6Z1ais3o8Gn5zKRKRHUmR6IXkylWaPyJE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=PF0kZnT1fD4ifoOGzyoRRwGt18TEqdtyFX9FLYGH9SCENZ1MPRiUwnnZwBHWXwzx50NPr9t/MVorLc3WeV/WKcTFXP1cD0I0Vhp8djBy3t/vfx30p6xfsgB71pQUVs0sNX1BuqK4L+2c5WW6WPjZa2JfHUktIKKxpxMX0IUDDgU= 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=XqBELNTG; 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="XqBELNTG" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1785780303; bh=gsnLkYdJot6Z1ais3o8Gn5zKRKRHUmR6IXkylWaPyJE=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=XqBELNTGDIR6Kn23VzSalnNY3N0Z3qALuVcDDGA6lM9LDt/j/3HNV2v0zLTipDjX6 q0AYBWNEKOfwhFAzqXjhPesBO5fNHOv/n1beAEJcjNLFRwy7Aqu6OIYZEHAcmtqcPP WYpUpvIddA2q1Cwzp0Rf6uL1eGd9qgbIDfvAuQjE4ifdUy3tFLOPXab/vKZ9RlaaBi rAhSZ/24s/YMjYUP5kZb/GkU73ojhT3bNZ+8Qzw+Q6nFdwmQGS6MG8VgDZEIpoNWvQ mo2g0k7y0dXx3UJE2iXHM81XEjSN8QXRoPqoz8+rr3zi1tlAYCU3aL8bVyBitqMGUD zjBwy82rAivWQ== 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 BA6D117E08E1; Mon, 03 Aug 2026 20:05:03 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 6473048002F; Mon, 03 Aug 2026 20:05:03 +0200 (CEST) From: Sebastian Reichel Date: Mon, 03 Aug 2026 20:05:04 +0200 Subject: [PATCH v9 03/22] drm/bridge: synopsys: dw-dp: Fix error handling in dw_dp_link_enable() 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: <20260803-synopsys-dw-dp-improvements-v9-3-2e6e46135312@collabora.com> References: <20260803-synopsys-dw-dp-improvements-v9-0-2e6e46135312@collabora.com> In-Reply-To: <20260803-synopsys-dw-dp-improvements-v9-0-2e6e46135312@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=1144; i=sebastian.reichel@collabora.com; h=from:subject:message-id; bh=gsnLkYdJot6Z1ais3o8Gn5zKRKRHUmR6IXkylWaPyJE=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGpw2E5RW8CHJOFx/ap2kREctC+xp44RGQRb9 3YHU9jsZxop0IkCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqcNhOAAoJENju1/PI O/qazc0P/jmxNEHDRPWvJ9vOHzDo2Pnelys/zqgKGjCVWSuCzKv6BxJ19dXi8Ur+m+P5h62Z6Ke BTz8r+dgEKl3BN7BEk4umBJlFxniNmFfqGP6zOB8VG+mNzzmIpKpcuKb15yGGEx4fERiSB1H9rf qGE+66Bd2fu7ISUTiIkEBKbEsB1t8n8KDoNhK+wwz4Ms8AJficCUawYDCfMVyWqJFaIMM3M6I7S EcW8x5X1Il+GXJLEX/LrnzuGjpLjSsHlIqaeKSv300Av59NUf2yf2qsU2YqPrvHd+S7oxvo/Jew y5i2XGnWADjUf7jZG1p6N2rQduwATvnYZRux+prwxRKA6Pb3IGrW8K/modMdK9BNfMLY9FTC8El Fz1rpzBQIyR8rWgNIQhSL4OYah2ISfz4JuzM+H+7XOroJZNDGXdrb3fictmOfhoiWV1oJ52hqV2 ckB5t7e/zAtCi8IbAZG//UvCHZJH3tFh0MISnNplviqnxKrMR2elY7aeLoNskE8VkYE3Euyt6Ge xoQHUF6Ijyf/4dTdq/VCgntDzX4zKNlyQz8DUQO2xOaUJEr32kNoiJVqi67DOgeHSN6scPn4Pah UkyKms2F6uzgS8qCD+F8hnux1uLyJ1QD5qrp5z2fTb//kTIEO2CMcWnxuwapx17r3HWfIIjKwij qSSuKrrsTm+r2A+xCK0swvA== X-Developer-Key: i=sebastian.reichel@collabora.com; a=openpgp; fpr=EF660D07463F8B726A795413D8EED7F3C83BFA9A Add missing error handling in dw_dp_link_enable(), which failed to release resources it already requested before hitting an error. Fixes: 86eecc3a9c2e ("drm/bridge: synopsys: Add DW DPTX Controller support = library") Reported-by: Sashiko Signed-off-by: Sebastian Reichel --- drivers/gpu/drm/bridge/synopsys/dw-dp.c | 11 ++++++++++- 1 file changed, 10 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 06997208945e..e332d66b8057 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-dp.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-dp.c @@ -1636,10 +1636,19 @@ 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; + + return 0; + +err_link_power_down: + drm_dp_link_power_down(&dp->aux, dp->link.revision); =20 +err_phy_power_off: + phy_power_off(dp->phy); return ret; } =20 --=20 2.53.0 From nobody Fri Oct 2 07:46:36 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 76D99430307; Mon, 3 Aug 2026 18:05:06 +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=1785780308; cv=none; b=auFUUkSMDUsQxmQg5h4OtluxFjPdkiJaBBjEO7a9fQUAsD9+P3MfRtaIpn8bXx7A6qEjOxofYQ2C9+mEBRJYTNWkC28FKNZh38GpA5QEP0REnuHhTy0OOXtoIfzwLfnxyMVq+mg/tAk1z61Crmz0RhWtSHqi5Rkjh+b1PaSk3PY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785780308; c=relaxed/simple; bh=H5ZUJOl/H1QOryuuNilUdPBhRk3UnTA7OI1VTUSXwiU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=tRhGknsl5n6Bwa60vjquy98HVDVcz+S1bEBV6D7dHjjtZKhWCQIzgdqBPcU+i3nImk1JrEagIqfrMbxwXiboEeG2UcmFZ1Z2LUnO4/GerYWJO82xoAZ4iax5kmKeHKM/Ds2Cr4H29UwzqhaCFm9KElhdibJmrBM9+T/CxGK/t2o= 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=kejvUvAK; 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="kejvUvAK" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1785780304; bh=H5ZUJOl/H1QOryuuNilUdPBhRk3UnTA7OI1VTUSXwiU=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=kejvUvAKUih5OClM7cUMIBL5lQgt+4P3oH+1t6L523e/hlGIQK0tMIYjRQRQtl83M wxi47eUppylZpr2e6F9qpFhT6UFcAuNh2sTqMRsO45vxqzh4rfNwOPqptNucI2GNnV mlekXq9WtvRYXaYMz4LQJC9NfZ1dW0p7c64h2tPbFsOH4i5L5iIQxzbamXsOUV4lfC k52B18AUWPuWNeRQ/M41G7BZ4edzQU9krE4sEYp857yEiPxr6f4/NtTNd3jrg5umN8 0yidLoK+HAuOU0aDTlbNZijwPCif9U5pOcf+kPDxu9ess6najQN1rQU2FBrITJKajx NwBSpy11lHLCw== 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 BCF1E17E107E; Mon, 03 Aug 2026 20:05:03 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 66089480030; Mon, 03 Aug 2026 20:05:03 +0200 (CEST) From: Sebastian Reichel Date: Mon, 03 Aug 2026 20:05:05 +0200 Subject: [PATCH v9 04/22] drm/bridge: synopsys: dw-dp: Cancel pending HPD work 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: <20260803-synopsys-dw-dp-improvements-v9-4-2e6e46135312@collabora.com> References: <20260803-synopsys-dw-dp-improvements-v9-0-2e6e46135312@collabora.com> In-Reply-To: <20260803-synopsys-dw-dp-improvements-v9-0-2e6e46135312@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=1740; i=sebastian.reichel@collabora.com; h=from:subject:message-id; bh=H5ZUJOl/H1QOryuuNilUdPBhRk3UnTA7OI1VTUSXwiU=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGpw2E4odgo8y7L0BhfmGTZQvmB5285+7lh85 8i3DqHO2o5+P4kCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqcNhOAAoJENju1/PI O/qaffUP/ArN/c6teqkaCXzww1gFCCj954fhfj9yFNCplV+OoZxLYBJdeemUzrxhyErVYRJ+85M 7cwjk8IFbpqbwwR903XZuG+q8/spForWmw5k3SnSE4eZ0KTVf1xs5t1aWhm/pLAJgagSxsVVkIO l3asIRk3FXpQjh8q1S9xxADa/mFDKgp43dmzNx8uf8umgV0J9Cn92m/KCrDJSbYedxDCtl90GNn GAcjx3jm5L9PuIiErxqzrf+8/oQQrBjPqSPOdyKTJEn7XKRzRrsnTLLVYGDksDuZCJgkK5LdgL4 hD0n+8+EkvawBJrMy+JWsMZ9E1ai7HqSg05s77UjZLgFm3p2nZnqu/Pv/jaE2DBMfolci7hBFPz gpT8bLKOgmcUCmWoASNTHjR4EDo5I+oy00uDXsoESbiGBBEvN+rCEFi+1qwEWpKpup8RpEMunqa J91TUZoIj1lREgafZTG1DC7S/h0+yZUcYrIr0303HEvIBkxgDwiOpnsUBsAooBHOchtnMoRkgQo Wwqo+Taz2KMxX3fJL7gFA5nBmofgFbR5btlHRwyY5pdcp02AM7kZQ6HWVNrMSi2JD1FLEwh2W7F oiQoawFP+V0tgQKicdTT+YNxzN15SBeotCSwiH1zdjTdW9hbGo6GjZfSZi+dYz0EDsZk0mzpu1z l+YhcbtopauuWvqjN8Ow0aw== X-Developer-Key: i=sebastian.reichel@collabora.com; a=openpgp; fpr=EF660D07463F8B726A795413D8EED7F3C83BFA9A There is a race condition during device removal: If the HPD interrupt started an HPD worker exactly when the device is removed, the worker thread might access invalid resources. Avoid this by stopping any pending work immediately after disabling the interrupt. Fixes: 86eecc3a9c2e ("drm/bridge: synopsys: Add DW DPTX Controller support = library") Reported-by: Sashiko Signed-off-by: Sebastian Reichel --- drivers/gpu/drm/bridge/synopsys/dw-dp.c | 6 +++++- 1 file changed, 5 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 e332d66b8057..278953a8549a 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-dp.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-dp.c @@ -8,6 +8,7 @@ */ #include #include +#include #include #include #include @@ -2039,7 +2040,6 @@ struct dw_dp *dw_dp_probe(struct platform_device *pde= v, const struct dw_dp_plat_ 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 res =3D devm_platform_ioremap_resource(pdev, 0); @@ -2120,6 +2120,10 @@ struct dw_dp *dw_dp_probe(struct platform_device *pd= ev, const struct dw_dp_plat_ if (dp->irq < 0) return ERR_PTR(dp->irq); =20 + ret =3D devm_work_autocancel(dev, &dp->hpd_work, dw_dp_hpd_work); + if (ret) + return ERR_PTR(ret); + ret =3D devm_request_threaded_irq(dev, dp->irq, NULL, dw_dp_irq, IRQF_ONESHOT, dev_name(dev), dp); if (ret) { --=20 2.53.0 From nobody Fri Oct 2 07:46:36 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 5BD3A437453; Mon, 3 Aug 2026 18:05:09 +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=1785780311; cv=none; b=AYeVopHBLYdofw5ejT9cOu0fODzY5/Wi0u9L0yEeijZl+HErFHlXEk3qNycwyUNvd2E2nCqVEL1IV/JFtner5ofyAC2vvJRgmq2r0gfrcRLGQt8AN91ejVXcsTHrWeBzeZH2pZJ+aXSrR/DjNf4d4thuRfeu3evu1gQqiOyc85s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785780311; c=relaxed/simple; bh=rOsKM/zjSq0X028wqv1+jYbJx233lxkUUgYLIiOgCtI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=fyhGP9AGcon7UdlBr6jNEi3eVHpjvMJ1+rDSg3Q4/AaiR7X+71XZsza2XkNtCOr5wTo/GS9Sg12Li2b0p8LkqIFPXBB6HOGhoPTJbEUKinBRP7O+ZisVmKY8TcCkQg8Qq8FonXa1xcCeDmOiApZhYwwxg3umSpKCA6xe1+yFxxg= 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=EGqnI01k; 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="EGqnI01k" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1785780304; bh=rOsKM/zjSq0X028wqv1+jYbJx233lxkUUgYLIiOgCtI=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=EGqnI01kLRHl1KnkP7reR/J1k7h/jzjOIdY6PRubiwSijQMK0K+d8edMumKJyrLls z9Go4yDZkLjfgjxYHa25yd47Sc7gm2rB4SBOnnNGb/04kg4gCtlQSxSlJvo8kb1Ujn h27pPsLIfFp5c9ccoLOhCxNSQz1+IU2pfl5iRdd4GGbCNkOXNXnEQVJKudpu3MtsUr fBX13dm7j0kdPWAib3UE+6DZ1jH6iq1PgjviNbC+S/30L1RMXhdqXFMabPqKR4BT7r jE1XKibWing8eXdlw1vssD4PjLh6ulh/pxp+ln/WIINWGybiwFug3rsFXYZplAKKEb Uq2WALngyR5ng== 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 1D1BC17E10B0; Mon, 03 Aug 2026 20:05:04 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 675E7480031; Mon, 03 Aug 2026 20:05:03 +0200 (CEST) From: Sebastian Reichel Date: Mon, 03 Aug 2026 20:05:06 +0200 Subject: [PATCH v9 05/22] 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: <20260803-synopsys-dw-dp-improvements-v9-5-2e6e46135312@collabora.com> References: <20260803-synopsys-dw-dp-improvements-v9-0-2e6e46135312@collabora.com> In-Reply-To: <20260803-synopsys-dw-dp-improvements-v9-0-2e6e46135312@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=rOsKM/zjSq0X028wqv1+jYbJx233lxkUUgYLIiOgCtI=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGpw2E73YZmyHNQTMHscrgEn/ryx/jJye3Bg7 HTzeyY3H/mc1okCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqcNhOAAoJENju1/PI O/qaAk8P/3TIk0vgVsZRQBIjRRmBfUF1pM6Kk+dFvWBQzOlbzMmY0e4kV17jV+mq7cdRL5aILhO ObnATdYlBKkHFIZ/DNghyT+nVG1ZnchQFwE7RlwRbgIFeMYY9NmFG63gzXsBqsh7YTw2CtqGKrv QhwmgFYW4pDigs1sNXSWEkR8UjszrMJ0n8ppB6sNSuk3p9jQiN7SwMXABlH2CAFTbd5PsgZBeqv TwgZV/6DH+hJo0CmYysit+zbsV6fkuWwGRRrxF/L3LxfngSNM+NIK6uGVnhvBF+mGcIz5CZo3A8 wyqXwdYAVVwXDeCgSMEsN+xNiSQDubh8BgMOemtEfqzDlsvjybyo+iPDs+ovxfOZqNfd/t8EHfD LwPw/Yc+T7l5LCGgjhCmhi2ZB6NjPc0ipg/c+aW+0Sm4U/L5pKQ60Lpco3B0MnIhCpthOViSX8v rV230PHH/x40d1xSOGbRQZBB4D2WtbAUD1cOxM9rpHpDOiqN7U8s1J/DD9GkAc3fF1GBkdttxPU z1yUuq64BZuzlAPEZ/kYMKOw8cxbNsipEOgTjwTkAwB3CVeBRrwaKDGenZnAbM0cNO09XRhx13M z/FGXIZ2gRWlheFrdJZj4h0vIJroIb2VSonBtZRrcJ6EJDZOK1hhIoAATmeW0zVhe2p+LwGctL0 mswTBlhR1004PqdPA34kjng== 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 --- 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 278953a8549a..facd1c479992 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-dp.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-dp.c @@ -2088,6 +2088,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 07:46:36 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 5BE41437456; Mon, 3 Aug 2026 18:05:09 +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=1785780311; cv=none; b=VaJyWy7qadOIKK3xcIH6qWVVrMJ7xuZm7UVyM2LytZWhbHeDcscYvEKUiik/XNurfCsKq6gTiJmjSR9B8/r7fc0839BC1BiqqppqAY1B21GltErpEJeOzn2TehueoaB+t8PHnL3ZhdS7F5c/G3QjheUpRX2v+j31d9fDWm+zwTs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785780311; c=relaxed/simple; bh=0v+PxdjpHW4h3oTbY1aMZqJNHKlUwANCX2XcVTK3J3I=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=WDDGKt7ccCXJvAmwqrh+MBkUk0UDWyfzE786P692UE850HtZlktD5t26kNXIKWyn0JT/xhw1yDObJtXTCMf2oVGzVcy9uGj6nQPRq6jqP8zARtOAJPGbjqIPoJwf7ZNMWCC0RrTA0TYS0UwIplSDOgoaOaHj+7m6evcDcpQmFY0= 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=EGDis56U; 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="EGDis56U" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1785780304; bh=0v+PxdjpHW4h3oTbY1aMZqJNHKlUwANCX2XcVTK3J3I=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=EGDis56UIC5qyG1cFE4oepqmAt3oPFfKE+y76TNPz0Xvax+Px3N4RMI+MPwTDA8zn 7F2fNus2Wbeno5CfnTCcYeO15fiBRssQnvG/ZSTY9VGClZc0TlVq8KZpiO/rLA0DcM aeeI7JXYiXSj4shagp4qF6Aa26oRfINARcEWujWuD0SAAXH1cAQxZyqDpZPyXDqRR7 ZOGnr2nluAVFG8+EEBZ0Ogij1Z42JTa4WwOGTrvHZHdrX2uVQV15a8Jyms7AYSI7Ky tI0pIkMTEVXtoWQmTwARZIGlSph1QNRxGJhShAKJZVHQvxHX5doKI0HYhQmqnA+DA5 X2B8aLolzD8KQ== 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 1FE9317E10BC; Mon, 03 Aug 2026 20:05:04 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 68EDB480035; Mon, 03 Aug 2026 20:05:03 +0200 (CEST) From: Sebastian Reichel Date: Mon, 03 Aug 2026 20:05:07 +0200 Subject: [PATCH v9 06/22] 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: <20260803-synopsys-dw-dp-improvements-v9-6-2e6e46135312@collabora.com> References: <20260803-synopsys-dw-dp-improvements-v9-0-2e6e46135312@collabora.com> In-Reply-To: <20260803-synopsys-dw-dp-improvements-v9-0-2e6e46135312@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=1120; i=sebastian.reichel@collabora.com; h=from:subject:message-id; bh=0v+PxdjpHW4h3oTbY1aMZqJNHKlUwANCX2XcVTK3J3I=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGpw2E5UBZDC904i2kVSP/eGlEpm3MrxGSNOY X8/9JRzs0Ajz4kCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqcNhOAAoJENju1/PI O/qaMscP/1bWEh7KpG7yuSW61iQTIMqOBJCO8vpY4xiyp/dG9lE8e8ZFZTJkYRjlJsygNJCyT8Z zwt+AuS3ZGRQ3WMzbjx3OnChdN/Go2lDOuDhS4As72n+zgx9N36z4fPXvqAejw0X81rnjs8XrZ1 U4X5F4rON8OzZI2ulwVGY85aLl4vASosRpZ1ItW2W+y3iWzu1QFrtroskJmt3hNtdkSDRkw/KqW x3eKprsLfeRRyv4b5TxGBC4vj6Rds7jjTxSuVKZ90efKz4b9dv0EjZpguUFOvP13EPH/JGDR5QD TN4tMrf/LUeTfrehLYeZ7WJ3+TzV02VdrAGfW5hzyr74ukEe/3v80jn7y6rjrfuI4cFKoBrcCQd ze0FXbxlbZKrooBoSfREUkfHJDqx2jsVKryAnqPFDCv9ekMBkYHzfAdOklZQr8jFc60Kp6sLdbg wX14XLkz/tk20hxnpU3zwy9aLyfDAkcJx/FMWEF5vW9flkKQ3OlWNS+7tGzkK/JZ93Jh4fLCdzA XSnEedys8OMFWDNrXRnIM0u4h5/GmH6NPmHul9o/rQ0qiH2PB5S4O8uY9ZaUorwLdAG6hQ8BTyA ByDl4kK/wqW6YCWh5o43CN5sWyraqWR14tNHeN+9COrPrmLJo1nV/dmJF2iK1mWL50pWSr9ZJ1h NLt6xhBqDIE+DfthGh7E5HQ== 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 --- 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 facd1c479992..af3fa7886429 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-dp.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-dp.c @@ -2039,9 +2039,12 @@ struct dw_dp *dw_dp_probe(struct platform_device *pd= ev, 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_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 07:46:36 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 DD3D7437841; Mon, 3 Aug 2026 18:05:09 +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=1785780312; cv=none; b=eminB+AvHBxzgL2eTBVd3MkbWJe7gBliqViHx2SrU9KwB3/5olGwQayv5pSMJFI7X1d+ko1IPZPqQZsZ94f0SqlDlpUeQTOHPHGmQL0V4+sDWomFBskXMjyB8VSkbEMTV9YUkEreO8cjAgM5YKklEcsYFQCAfMVtQkquR1HX0dI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785780312; c=relaxed/simple; bh=aj9xP0W371VTIzU9gNhnUVMhyeHDU8fdXzCypYpwkGw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=chka7S2WKwHy2E6j/h0+lLLCDchq4ah6GBfyDISz8zZsZZFn4Ko142ISzOUiXdH9PFUDev9/lldMPpP6ht6dt5V62/T62Zv5GwcYdMnZ4AkYjEvCLroT3DmG6sBc1mtwn/qOA3swlGwYsSHea6PrPL5x97M8wjR9Dg+dH+GpZf0= 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=IbqY1GQb; 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="IbqY1GQb" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1785780304; bh=aj9xP0W371VTIzU9gNhnUVMhyeHDU8fdXzCypYpwkGw=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=IbqY1GQbCns+vnR9slEACzRSCW7+JqeWt8FBinIUeMMc2uINkfJfa+ARKXmMhyxd7 GGcKIdu2dnn985lpVfTekaKqHN1geF+ztxnye8SQCsaUpuv5Ig/5P/6iQw3T8fm8Y1 CVYRoq8Fx1BaAxzTlfT7EFWPIP60U3eN0HOBoJByx7sPVfszmJmB59pdIr6sZr9b1j KYMc/5XyZLcYJygStkjgiJFCxbmhRv4NWgmIhbYpugvSCLChe4LTUPd3itebpjmNt4 3cIknqWSx7B8p9GDz2a90D7naBzrtIchvgJg8xqzEJbFNdNE++tCgfHBw/9MErT5cw nE9UiYVLLk5BQ== 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 23F0A17E10BE; Mon, 03 Aug 2026 20:05:04 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 6A5C0480038; Mon, 03 Aug 2026 20:05:03 +0200 (CEST) From: Sebastian Reichel Date: Mon, 03 Aug 2026 20:05:08 +0200 Subject: [PATCH v9 07/22] 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: <20260803-synopsys-dw-dp-improvements-v9-7-2e6e46135312@collabora.com> References: <20260803-synopsys-dw-dp-improvements-v9-0-2e6e46135312@collabora.com> In-Reply-To: <20260803-synopsys-dw-dp-improvements-v9-0-2e6e46135312@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=aj9xP0W371VTIzU9gNhnUVMhyeHDU8fdXzCypYpwkGw=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGpw2E54x3JL76iX+9q4bbSf0SnUU3yQk470g bUgir9qGbb4fYkCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqcNhOAAoJENju1/PI O/qavVAP/AkRZCWTWxGm2TIkh7QqZ6ZuPzGdq02N4mxf0mNHVBNTSxmXIJ2YipqiCqmVX+2/+qt SeRw4ctumoMspU5szxs9vx9PhcFTgxo/RdvqxaUj72+IE2o2a3sEBSx2ST6J1UIT3NrQKbzq8pE JaI3fmIl4qSpSqkYZNxK/8KgXFJ7Qv7mIofvyAlevEXosBj/QOJltpxjafOsT/ALLdj8+phNTYj 2GjjFfwC3EM6DKPHIXMI6O+6kHPQFEX+caMS6JjE3ZLlE2OzIw/KALrpFtDxC1ZCvbj3CD3lI3r QSzrzOzDxx2KW6l57m+QL0fnYeotTGetdF9YGJkPdhvJBEwcLaLUSI7rlYSRYyXRkGECc8ebSSY b3JJasGww5d+i+ZIGk/eoslgY2+9tB1qh4FvT55Qxl4N/HDIxGvtnhiUrLewpQuPjsirKLHUIFK 3mKNKnW+ljdyhgzpIB6a64Bfp6LiYd9H64OXPfQjYpw6IpkqRuKBUU80JmJvwFSf5ZnRwO6CwgU 428gkCE3lmdYjUMhVH5Fi9dcAUY0nUEkDQ0KUExzvsul++2mQja3bKVcBpkGH4HGMyKyeDHBBTd C0TNph83bz7WOxZyOenIwteba2pXSIKD/rjCSr7HOyI0HKgGI+DDS5d8GtWri8x6EQnXg/K8ZUg calKwoWZSRHt8Pn2LBrspOg== 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 --- 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 af3fa7886429..8b587a4c5e93 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 07:46:36 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 D5D37437476; Mon, 3 Aug 2026 18:05:09 +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=1785780313; cv=none; b=fzHAV6c04B6i0AcQS8LXMa+nteOwaKr0K+mhH4UpCa+t7FId1SlBoxuJROjJBNrpDm5z+k55AnclCKE9VND7lfxHYwYtOTIlUrD35MPbfu2V4cUejdjsRPsFul1fMpclj9Lyb7P1KuMt/fdcq0qPRhGaDr8cE3qAENJPayquKZ4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785780313; c=relaxed/simple; bh=+hvcTuzTih5vFZbymQZbCa4pv4dlmw/yOyTygYkYfXw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=MPS0l27qNiMhndaoHnDgVVqcZwDo7KFYD73EvCnpsZW/hEayCKaWBJYXFGemrn5uUoWuPScicpTnDylosi2EpDxiR4x/U3AkchyAJBtoebFbjun98VBPgsu0ISbTS0Dmwkir7obm9OH2dsidyGwQB1X4yMq7nwKLk3y4Y3QY0vg= 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=Rnnvvk+y; 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="Rnnvvk+y" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1785780304; bh=+hvcTuzTih5vFZbymQZbCa4pv4dlmw/yOyTygYkYfXw=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=Rnnvvk+y3ZEPNKGORxSUGqsg+mNaM9ua+oPmZXjTDX25nKW4ZrgKL8Id44CQgPeHd dgf1MDIyR5EeSgciebeVwtJcOAYxVp1bPzQdMLnZZpf+e6dxk2rjTJzmQDVKP6fexk ZzX4rtp67mur4VMN8fbrVlCnyKqeHLZwH6JYxiVr7N3cggCCFyqgX827oO5smSpPzs 5IEyqySgMeukcoOhnLsD2CsDwvqo79mkqUSKRuPNvDqatHOi7kQD54fN7YFYf8F9oF qrVuydhCTdkZac/DDPPeYCPgrwiWT+XOStGalRkexz7pDm0CDIHUewQOOqVkP+4WeO 6K2XG9c9MD1qg== 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 26D2117E10C0; Mon, 03 Aug 2026 20:05:04 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 6BE5748003A; Mon, 03 Aug 2026 20:05:03 +0200 (CEST) From: Sebastian Reichel Date: Mon, 03 Aug 2026 20:05:09 +0200 Subject: [PATCH v9 08/22] 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: <20260803-synopsys-dw-dp-improvements-v9-8-2e6e46135312@collabora.com> References: <20260803-synopsys-dw-dp-improvements-v9-0-2e6e46135312@collabora.com> In-Reply-To: <20260803-synopsys-dw-dp-improvements-v9-0-2e6e46135312@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=+hvcTuzTih5vFZbymQZbCa4pv4dlmw/yOyTygYkYfXw=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGpw2E4HoUBLboib/7pf45ZjmJMYsf9lGaA5k MEBu37ptA23aYkCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqcNhOAAoJENju1/PI O/qafVIP/i0EYv84rNRDGB2pCStUpY6g7dRwEFWxpysmcS5LJT9JlNgdro7n9hnfkPfb9s6d9xq u578ReQLD9ALqlP3eZJ40BNhpsttHkGd5JwdrReFpagivYXj/YUqBuyLB9BHK6/cqvRgQj7hAmO /Mj1NnRh0OYaUNxXb6r1yB2HkCNgcRThYTJDQ/30RxxaJOk4FcuIwKUg+yu9xpxO7pRrWGai9/B NX8azki7+v7KaSz5I8IFx3cbGEfbTR2dN/050CvJK1Ke+F/eUTXgRoMriDQSjPhs8XyFb/LL5h2 0AOO4ZJrqgYc2WOOfUgQAlhJfSeAvQQCktQB6paFggZ31CwslyAl+4rl+96a6ge3GFQ3HOdhqHq o9F67I6RhzGfmf/EQyuelWysXOw+04DOybo+riXGxjAduL9dQR19HkDlOd+iUTXFbLBWnveFavt PVPJ+1nuXV45uMJ2iWbOQdn1Ky9XTHLN0/ljyq+e8yIMaZIkc8B7LAyh6HenY5oFgrTG41Z/1ST XhooYxMaL6cqsU//gYkROd70I4AYvk6Xx/hpDtmtQQ+dtUKvpZRg4als8LJZ5EF8CR3cxv0CoC5 JIsymxjN/uxQC0+I3dR1GgxR2TUCxyXByzAfrvXZe9WkRV5r2g1ynmQJ13n5HeFHvBX8W4WX2yP +OOk8YazaXyw2nqh+mHsq1g== 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 --- 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 8b587a4c5e93..22a244de08aa 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 07:46:36 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 D787143747B; Mon, 3 Aug 2026 18:05:09 +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=1785780314; cv=none; b=WwYU31TBfRpcw7KcY5JmPKUWmj9yJLSztDrAklx76Xq+wuMvwqmtojvVZHYoqZFLkEeXPt+uiXTG20aCJj4/mq3su0kdBSDXbdxLY4H+eZm9NRSBpQS4Ot9oBAKXBkRmz1b/5gpLtwFaGmshV4DRDub6BMNNLzSP+9D/H5htHIA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785780314; c=relaxed/simple; bh=GcGQu+BFm9oPmZHzAujBqT6aIdDXQL2Hqtb6N/i0x7s=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=pGbb0N/9CRJeZ3GjhjDeZ7JL7Hmk37jYgi+f3kwddGW20eq9H2YEjBqOrzz9GDmKEUtkiF/n7jYTStodL/Ike+MQXOOmD03c5Tf7lTgDhccLAPkjj5ScSiytpJs8X+q7DW/EMPFvAHZNZ68dXUSa9M1uo9pGiya+gJXIJR33QrI= 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=EIl2wwhT; 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="EIl2wwhT" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1785780304; bh=GcGQu+BFm9oPmZHzAujBqT6aIdDXQL2Hqtb6N/i0x7s=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=EIl2wwhTJFInLF67eshJeFf4D5f2bGGjBhuP2tzdaKPQSKgNxIRO/uqv8H7AJUmCt R82EVIaeSOdwcgJj7OsJEzbSVQN0IBmeFP7aS6hISlUrmgXjtm9MTTpruoYtqwzSiK KhIZ0x/um63TfcG/BVcYhoUTVohhZpHtrRv+JcWy9QE3hKPLJeXcX4NoAUKunqhOUU u+JDZxO5U5AeBbj1kd+2BQGNMTw+JRkLLf3ztNKoiN4dUIcqFJOz+INH9zLKNCHQCo OihEEfsEz62XxahVs8HF+QDGls9hCieoChy7Z3N6s7rbNh47rSAYw5U6AhvJHjn6JI Z8h4gH6NOHxxQ== 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 3276617E1104; Mon, 03 Aug 2026 20:05:04 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 6D66848003D; Mon, 03 Aug 2026 20:05:03 +0200 (CEST) From: Sebastian Reichel Date: Mon, 03 Aug 2026 20:05:10 +0200 Subject: [PATCH v9 09/22] 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: <20260803-synopsys-dw-dp-improvements-v9-9-2e6e46135312@collabora.com> References: <20260803-synopsys-dw-dp-improvements-v9-0-2e6e46135312@collabora.com> In-Reply-To: <20260803-synopsys-dw-dp-improvements-v9-0-2e6e46135312@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=GcGQu+BFm9oPmZHzAujBqT6aIdDXQL2Hqtb6N/i0x7s=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGpw2E7yZyKT1Iv3rcOC2ucMejbG03+Qo3qdB TiKuy/dUbY314kCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqcNhOAAoJENju1/PI O/qabioP/2eHyDr5D6AtCEohMUlI7OWcgWD52MCFamJhFA+GnQUakQaBeIVvXGS05JVk9GSrRfP QXbYseD6JrAn+x8LnAJ2pIocmMf0KgldXpBtOItdehi4VB5hp4ZfnPuacIQ5WxYSD69oeIxlN6W Tu2PrsbgHY8BsNXzO8XriNocxRnnTGHZYQTSU+5aiGj2GNSHyHBpbYGw1KvkHgcUyPoY55d/jEt d3ud/jjWBMdwQdp1m0lk437BAnewmudgiUzk/BppE7E7hHC2R0M24JQmKxR1oM5myTnFb+24NmH M6heUed/v3ay0gjLvLKU4xexxfiY5laQrIk9i6C5ce0RcJKBZAjJ7gvbAi/fLhBleaX+hCRv+Ud hAahQClpR0iZxWOakqnRkv7vb9tdwJESXKQ0/ZpddW25P55EPff21MjDicIX7n+WcC3KdXTxA7/ PF62AiWP0AXpF8Dh51lYpAuTALvwg43retHD1zPLpiDoEhJKWpVab3nAoTzMBqjULC+Uiyjt7PT rL4gIA87eUTHj2cHMysZnClraOztkjoJG4XgKCPFk+CTtXQL9EidUdlRq25oeiX5uJKEgEF7qHV ar73mQqpBIenJoJXzvgly4uoIhfA0ljtsTePYa5SWlQC3wGqYZefTn1mKwmFgpb4JHEGoMY00Fb h1iflOrl3ocpMuwhCq/Au+A== 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 --- 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 22a244de08aa..bde938b0d116 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-dp.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-dp.c @@ -1813,6 +1813,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 07:46:36 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 DBA5F43747E; Mon, 3 Aug 2026 18:05:09 +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=1785780313; cv=none; b=bLrFj7x8ZveI0r47WlM5n3yl2eKwri+5TZWvFm8HY2n1oEInMsvUC9zwF4lfyGmzxdb3YfCTsTqloXdvKTfFq2OliybI49PEm6dZ4Iy/Iz18zVsulNmCiGt+2xMpARxVUYgHihPr0ciU9fiS8n7SG111qTSlX3dgjEI8uajd2is= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785780313; c=relaxed/simple; bh=31JR5ctnkUqP4a3j87tILTU3TX2Uxhcb2umS1hDJIJQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=NwTswOkzJ4P4nfTNETTdiCIwyLY+XFpz/uUnhmSYzvzeaT773eChoVAeFRnGlJ7CS4+Ktn5g6zGScvx3uOyeBbIg1EfeN4FilNBqKY5fnGpsSmRfKQAN8BL1J/wkB+Lu+uFEJWhsFdHQAhUcoLEBpIMF4IMz268UbaOW8P96P2U= 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=nlo+VO/Z; 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="nlo+VO/Z" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1785780304; bh=31JR5ctnkUqP4a3j87tILTU3TX2Uxhcb2umS1hDJIJQ=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=nlo+VO/ZpwSGnB6wBmvvOovbVmGV24hwBlsE5KK6LZOf99QAh2Tx4jZKK8o/GNKWE KUnExs1/wIgjdGdCplEqFcE92ijhG4+Pr1Dap0S64N3Bo53dmrl7w7okdZSZT29+Jo MqhZWdXAF3REAQqValYUg3ZKqCbE0RWf77i6mnQ5ByPpEb0bSKxgNEM2pbAX9tEu8A FXLeW1U86bMVTT8ao+ZLJ3OkmuipHHkjCGeN4L0hGGoFKRlEbrnYRBhq9fmZf2AXr1 ASzus5w+YZmBKd8syfvQnxayjpjvNSY+Yvdn7TyOANio94ES6DTKydOba1xzdcCCfT Nto8eAX4QuG5w== 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 309A617E10F1; Mon, 03 Aug 2026 20:05:04 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 6EF20480047; Mon, 03 Aug 2026 20:05:03 +0200 (CEST) From: Sebastian Reichel Date: Mon, 03 Aug 2026 20:05:11 +0200 Subject: [PATCH v9 10/22] 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: <20260803-synopsys-dw-dp-improvements-v9-10-2e6e46135312@collabora.com> References: <20260803-synopsys-dw-dp-improvements-v9-0-2e6e46135312@collabora.com> In-Reply-To: <20260803-synopsys-dw-dp-improvements-v9-0-2e6e46135312@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=31JR5ctnkUqP4a3j87tILTU3TX2Uxhcb2umS1hDJIJQ=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGpw2E4bb2zzi9LBFhHjbW/ufrdTLfaLwFXie 6Le8OjDbcF7WIkCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqcNhOAAoJENju1/PI O/qaKQAP+wbs7PMJsZNyNvIO84mv9Lzrvn6H5T+BX8VgravZYj7iOHodB3hHLBTLcmsntcqzRL4 Kr/JctFB31awnTylMiJ4hgsD9TiE37qZr5Zm8cOlnZ3zJgwmekOW6EDkxITv2T0ykYwr4/E9rVa rdid5dc8Wtmkrhx/JW/+LS1lZMq30RJgoZPmXcCkX1vsqHgT6tjoMec7ogyxSvrZhc8yUVka+i4 CZv/XX06+yuGv4t+CospUYCadL/hPY4ZdE0OhpKFUVk8lAixi1MgMoy+LF/WxXfrhk6mmsK0U9X yJaxEXe/4f+3l+H5eNrsame5q/B+lR+pfPRNCfLwrKPhmcbQo4jYiXz+ktcCUNP7gIgUkeatep9 M0lG8ykinrF5gMdXKP4xMXnZahEpJzHEmTL5G+rNaRNfSHT8G5kqY/MYGdGTii+UxAt35SSSfSE ilGxaYrywEHln3t/ZhnTmm9c+T1cGEXBDLKjAMpFMkt5ibcOgG1nUZkjUkyAz0s7srH+Y7KeHrN n2ofm+Wlo6CeuSJnODdCBlSH8aUrmoWziQhzK3Ej8FPFjQDyKXKuyq+OQ2JSmRteZQR/S2Opvgk +PIOfB1GwNOJ/EbL2tJcQb2rHzt7RpCdLYiT6NO13BoxY1HWeT6MaAWcMECAkPjCnG6NtOdrey1 oFcQVj+lVFW9ALAze8uE4cA== 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 --- 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 bde938b0d116..e60dab0d3b9d 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 @@ -1823,6 +1827,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; @@ -1869,7 +1899,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 07:46:36 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 D5C2542C513; Mon, 3 Aug 2026 18:05:09 +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=1785780313; cv=none; b=F3jdFT2yQVfmzWIQahMTpieHol1wUPiiRbmoaI8HDRvveSqXnKVCsYOEGdCLckDmP/RoscCoTl627IIBIScw04nhwv5eecyOHvvn5U86yX97a0hJ/ZJfCJb9kJ069IVSWy3+bCwrJprI/JnZh3oBpIRAn5W0HCE63wgLQBnHsBs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785780313; c=relaxed/simple; bh=vWHtus49X0hw1sn+NkpE62a91N52LNCAbMBD695LMik=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=PK+nTr8aSb8peDLR8G9Rf9ofzS4jigrJEVNi5tIyJQIoZaDfiFqsIonkSeJJW86aCCXM8Gu9Tt8DHK/f2XH/R7bJSM3o5wNg2Xd0TPzG6zAqKOuIUvEUHa4MewNNOrQKmrHfoMTFcSYNxOEMNlBoXloz3qbwHw61JaCVHzY20AE= 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=QgldZm3H; 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="QgldZm3H" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1785780304; bh=vWHtus49X0hw1sn+NkpE62a91N52LNCAbMBD695LMik=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=QgldZm3HZ596a7+ZAgIJJ3KGQ39ltqVuo+XHbifbcaGT30m5Bp3AgcNFzBG5UjjzW A3t5xQCsD7SC+XykgOXN2s2WxGhpisxx8e3RdF9Uo/JmKqtoAyIAo1uXf9mZ0tC1qj oHaJqGt/BzsFQPDeUDiqVAEN2z57vKnZpKjBswUvqCHEpxISe5K+IJo76jXLC31R47 vGG5LCePCudaPLUQy1DrwxpIFeMUHv/hkHIKgc090EqTwBVQ5y4PepnoeJnBZDvCGp yIYZ+UwxKRLgpWCdTlPOOhOOjGfzYpTxyAlcIIuv8B2OfcOR17JxuKJHRMv9QevLv1 fR6F4YNVzr8lA== 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 3BD6517E11E4; Mon, 03 Aug 2026 20:05:04 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 707A5480048; Mon, 03 Aug 2026 20:05:03 +0200 (CEST) From: Sebastian Reichel Date: Mon, 03 Aug 2026 20:05:12 +0200 Subject: [PATCH v9 11/22] 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: <20260803-synopsys-dw-dp-improvements-v9-11-2e6e46135312@collabora.com> References: <20260803-synopsys-dw-dp-improvements-v9-0-2e6e46135312@collabora.com> In-Reply-To: <20260803-synopsys-dw-dp-improvements-v9-0-2e6e46135312@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=2515; i=sebastian.reichel@collabora.com; h=from:subject:message-id; bh=vWHtus49X0hw1sn+NkpE62a91N52LNCAbMBD695LMik=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGpw2E6snqkjQpQJoi0luDT4tnhQYhv3lMHaf msTkh3eVHWWIIkCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqcNhOAAoJENju1/PI O/qaWfYQAI87lpMK3uwNe3zeQu6zC4e7IS7Ze6gpM3Sb0wAdWcSpxAHBGioyqZwT5c4rip0EYnM SfUP4Ll7zdO/n48x/BhlZ2r5w+GSKgk5jNc1XmHpDSYvg1DnD4kPcT5wiYTSsURRlvXFnBpEa5M JtxB8BytquQfx8PZsEsUjlZ73Kt2l/A+ydrNya3flif2DOe2SEoGDXVkihxUSi4iinjvC7xx4FM ffVOnDx4wjluznyMQmOwJyW/RERNSLIJ/GACJfmhnsddcAUbjk+lRonghpOe4oqZR4pEP23yr3H FHdvwLJ61BlRQ0h4O+uNz9pFXsgU9XML9/8uRiJNlaEsJf5nAAbDF9qFWBcuQHK4BXXRIEhwY/5 iOa/NFBB945//Z13Uddz+0V8QEMBPzkLLFy/dI+uPe26Sl7XxUlhW0qwGOqGw+/4jjqXS+tnLIL 2/c5Q/lsBm02Y4hYoMXsU/h/KMQ8lPmt6y+gKK8YnL8XRS3I7L8sHJP+4Vs3WU208VVDBP3ror0 ZkY2v3kDG1JIOpOwaMSmxzOpeMlDOzxQ5ftRwXtSeymWjJE0CdTZO+u10CHjY/tOfH8CBKwL2N/ Lhm8z9GIjT8V7H7EoA4rXi76rmimaIGYLBBZpmjzu5+pJ2VOcbUVDEtkKufuQzAWLigCjUdUFMc ZPmbz3BuUD86I1JTEzz4tIw== 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 --- drivers/gpu/drm/bridge/synopsys/dw-dp.c | 22 +++++++++++++++++++++- 1 file changed, 21 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 e60dab0d3b9d..577ec42c94a4 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 @@ -2049,13 +2051,31 @@ int dw_dp_bind(struct dw_dp *dp, struct drm_encoder= *encoder) if (ret) return dev_err_probe(dev, ret, "Failed to attach bridge\n"); =20 + dp->next_bridge =3D of_drm_get_bridge_by_endpoint(dev->of_node, 1, 0); + if (IS_ERR(dp->next_bridge)) { + ret =3D PTR_ERR(dp->next_bridge); + return dev_err_probe(dev, ret, "failed to get follow-up bridge.\n"); + } + + ret =3D drm_bridge_attach(encoder, dp->next_bridge, bridge, + DRM_BRIDGE_ATTACH_NO_CONNECTOR); + if (ret) { + dev_err_probe(dev, ret, "Failed to attach next bridge\n"); + goto put_next_bridge; + } + return 0; + +put_next_bridge: + drm_bridge_put(dp->next_bridge); + + return ret; } EXPORT_SYMBOL_GPL(dw_dp_bind); =20 void dw_dp_unbind(struct dw_dp *dp) { - /* nothing to do */ + drm_bridge_put(dp->next_bridge); } EXPORT_SYMBOL_GPL(dw_dp_unbind); =20 --=20 2.53.0 From nobody Fri Oct 2 07:46:36 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 D7B5343747C; Mon, 3 Aug 2026 18:05:09 +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=1785780313; cv=none; b=S1DDk6AzXEVYdTYM9s4JGNMNahR2RUAHLtujibj30K/LsgDzR8kLC2HKp5kyDK1E0FJWG94FWGCII/LC2WUWYh/WVvNZMlYZvNtWFJWmy5oZfkxhuVTqhZF/92t8P11LuFt1RhBd/u9F9nJ7Rzi+IY7MRroyUYbTABAAb2zBp4k= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785780313; c=relaxed/simple; bh=rAX8Gkdd0l2SvPThxGwSATdesygL1W5j4bmXRGpe4TM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=HdIAYuNF7uHH2kB5ZQlXZxdGxy0x02EQeIue51DyYnFC2Bm95dVys45Mu+un0k+8bAg4lm6bkvbGpikr8ptib7ODva+5k6Yip5gtUayTYKzxccyBxRFwLjXXWz4vSWDG3uY2Uc6PLyVRSMe+cZKU2KoIhxJIGfad2QPjONiPIFE= 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=S2vhX5pP; 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="S2vhX5pP" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1785780304; bh=rAX8Gkdd0l2SvPThxGwSATdesygL1W5j4bmXRGpe4TM=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=S2vhX5pPJZ6qsJ3dRVOK5hHZgtJzfoKxDf5BaktPx2ggykjXmaL66AcvrVoKB63We V74kytV/MNiI1fVkLbMobZbk2xKst3bkS3YvqQ2wVP2CCyhUvIMyKxDHy2bN2qAl6e jJrlxvsShbTYa4bsyYe/FUqA5zBlXHBzO90YRwPh3ej66Ow5X+d8+uUSbQp07UduLF HXhU/7QPt9Rxbm0T7QZas+TUUhaZDcJo5XK4hr57MPjlK6KGgwcNZtuBa6U01aSXEc 4Jc4hON6b0jJtnI+SU2NhR8xxC0EJkrwYZ4m/Sz3OD2Z+4T66QLDZHQDMwU/qaDjgE kVze0ae2K2Auw== 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 3D42D17E11E6; Mon, 03 Aug 2026 20:05:04 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 720A448004C; Mon, 03 Aug 2026 20:05:03 +0200 (CEST) From: Sebastian Reichel Date: Mon, 03 Aug 2026 20:05:13 +0200 Subject: [PATCH v9 12/22] 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: <20260803-synopsys-dw-dp-improvements-v9-12-2e6e46135312@collabora.com> References: <20260803-synopsys-dw-dp-improvements-v9-0-2e6e46135312@collabora.com> In-Reply-To: <20260803-synopsys-dw-dp-improvements-v9-0-2e6e46135312@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+poByyZiAGpw2E7TGTFviK0mQ23q8a18/F3gqxVuSqW3b VzN92r3UZUYD4kCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqcNhOAAoJENju1/PI O/qaDa4P/2lxII8SdFU+mCdan/NuG2rcTag+x2tacHOZ9vZQKrhFPYEZuSa1X/LSDFUVDuxadIe 3IyGY24aYpnBFfwcIJ8jNfVraCwWvF0EDZs3jjzWoBs5kjJ7myZJmu9zBvbck14pjCYVH7NkoZb 47qoYc1CCNR01Xyrh6RN+tAYQACR474rNbms8XROXTPRYu+or2AX0YQ/bb5KtmdWEx0B0zn8d/U 2hFG9xahJYx2yuvBPUhoZ/6Ig7lSsJT7ePdqh5fIXVv5EWZarX4kgyTXOHJQmvSDLW32iTzIw3P 356qWIE9mkgep+uwCed0210Nt/3kI/ZtISc6L2Nc2j8ksixK3FDbS+Xybva2nDD9rxMa8a255TQ ga0dQIfd1nvQZALi/ZPH2Qor3XnSJ8yxSpqBX7cwbCsciXdHTVlxGnZq59XXR3arbYiIuqhpfCX v5p9dXe2O0yc+tM5VR8NWHwxgfO1LjGjpU4ZDQDg7soVxjuL6bi3wyVDoxUYZ2c/JcGObvrTgXo +9Q2OObCT0Kqrp38fuG68MEh96MyZ04n1uLSeeK4IryBlWK1LNWPmcrLIf/Ity6E3FUkYx1WcjA rOAu+AmaFmAEBdCyjNKAqt7ZZvOoN3xSCQ19FixGc1AnNrfJQq/KU4GMhbJ5Pl6Q/DbsBBST7OO ILQceB+kaAS8ut0wAtwosig== 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 --- 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 07:46:36 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 0E3AB430CDC; Mon, 3 Aug 2026 18:05:10 +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=1785780313; cv=none; b=WfIzRH8cwMuqyXS0HMesnNIXsl8CqZbSWRr3I/5HiiN31VHjfS0hWNFW8c33IZkjYfV52i2PcgmDY4SE+u3yJ9mQdJwmrAlv8ammXThPJz0rOzJTSiq5ZuWjAqsRsV6FjUxgII6nzCoPWN/tZT1n5aC963JiUedJHDD/+iwoErk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785780313; c=relaxed/simple; bh=3bTbYsMSWqF5XgaTC49zBPKwudZfExbdC/3I2Nchkvs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=koDOnwbJRZE4XCRSb+GRw8CVc7W3asPiJgI/9FKbjcGDKr6xKcJcqOymV5LodmZOI8JNzFjv1R9udt6ABdrm9IwUAK2HN+yIiY2gmtD3P7KHM0IbOueZKI+jjWI6wEFWaeC9J7SrLG8PFyOBzuWFc5TJ8ZYSGspXYTZ1q4Qt6sU= 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=ICUmLR/X; 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="ICUmLR/X" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1785780304; bh=3bTbYsMSWqF5XgaTC49zBPKwudZfExbdC/3I2Nchkvs=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=ICUmLR/XfOBw9XphkA581gv712OasV97KqKyJIQsvYNZhryo5WGaRcNAp93UXXFB8 3uV5fB/x/oX6FfFsYrAJY9I5q7r7Wb9+ikVla+HZh7ewpNqFW5Shuykfs2mMnWfht+ H9Ewkc3MbJXHzeG8fEve1vWB5LpaLzc86c3qDVFr/6KeKhjs2EtHmnc8dyA3U1Itlq /Zv6yZC+NcqTaf8/zm89kTvET/o1S4XF6oheM2SOr70eX/Itq/4aiOeaNByPm5eMdQ MBhmYVxY+L00nrg6OsCsb45mWt+q/xRgXke0O3bkW65ekPlcZdq+yxH6N7oRSWv3RI ReUXbIHN9S0yA== 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 4602B17E11EA; Mon, 03 Aug 2026 20:05:04 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 7382348004E; Mon, 03 Aug 2026 20:05:03 +0200 (CEST) From: Sebastian Reichel Date: Mon, 03 Aug 2026 20:05:14 +0200 Subject: [PATCH v9 13/22] 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: <20260803-synopsys-dw-dp-improvements-v9-13-2e6e46135312@collabora.com> References: <20260803-synopsys-dw-dp-improvements-v9-0-2e6e46135312@collabora.com> In-Reply-To: <20260803-synopsys-dw-dp-improvements-v9-0-2e6e46135312@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=3664; i=sebastian.reichel@collabora.com; h=from:subject:message-id; bh=3bTbYsMSWqF5XgaTC49zBPKwudZfExbdC/3I2Nchkvs=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGpw2E66dD4QDdNyFLdlA2nglpsh842CtById LNusQT55ZS7V4kCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqcNhOAAoJENju1/PI O/qaqz4P+gOV3NggeaKXaGWPG30ykPxgN62VoiG8lm5ZoUsBzA8vy6YpjxpjPe3WHK7UKTKnXon HWexxX0+W9XDxZFrJMdL99Un8+ELgxNVEHJqgviWfE5ezSvR48eYdgMktlHVZM2p/9nXNarleTa eEJKsDeNa+4zc2935NEaY6kzsnJGvgrWG8JbkcdnWQGr77HtHy3LLgAvDsJUCvwWB7RqWUb4GbS l7i72jhXoQl+2qDX7y+Xrcu2NkR/y1ZhA62cV/OlgrFvIkzTpJQSiklmm4NOU5OyIsbk4kDvqem +ovC+yhSsvBCAs5Bh1vw8g5l1GXbhmTnF5XJKtOMMOmalTGR29BIb0FD+9Z5HkgiY47Y3EH8Xj4 vwVlTdFpHQY0bMnvmjHflqiv+HJ6fDRLXi9Hhq65aNfWAyjza8Jl4i/P7GTmBEqGEq2whG+Hgej 4OgdLp9o7fxzywcvEGBvnTws/1HgPKIy8iuOkyfmxToaRKK9wCo0FIrHyCk4KZNJVHVU4vJHO6N k0RXkgW+uFCDlAO6/hVHjPRTR3MXm2DCMTg96J9mjnJJdE97mS2V0WIz6CLm++hoZtO1qxEk7n6 mYW4PK/YFjJiyO/FLZJlPgixHOWcMhtBMpkME8eGCSVKz+IBVt9qjzpJDmdz9yDctKG4P3k0+ZX vfRBVMZrTv7FIiJP6pnwxaA== 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 --- 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 577ec42c94a4..7b8a9855ceae 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-dp.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-dp.c @@ -1895,6 +1895,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, @@ -1909,6 +1922,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) @@ -2041,6 +2055,19 @@ static const struct regmap_config dw_dp_regmap_confi= g =3D { .rd_table =3D &dw_dp_readable_table, }; =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"); +} + int dw_dp_bind(struct dw_dp *dp, struct drm_encoder *encoder) { struct drm_bridge *bridge =3D &dp->bridge; @@ -2064,6 +2091,13 @@ int dw_dp_bind(struct dw_dp *dp, struct drm_encoder = *encoder) goto put_next_bridge; } =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 put_next_bridge: @@ -2100,6 +2134,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_completion(&dp->complete); 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 07:46:36 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 8DF35438012; Mon, 3 Aug 2026 18:05:10 +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=1785780313; cv=none; b=sjmiZ/uxCdfdpP7Y+z7k5fkFd2vfblstzodOYviyL6NwAcoZ57uzLCBnDHOoH41barKthnlqXFFc3KPvS8rWmR+fhyMDzDuf/PmDO1aDdXz+dfkRSn8ioGoRny4+LGvkSDNlk46u0uXqw1SeOamS+DXzblynwjjgxSZamty5I7c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785780313; c=relaxed/simple; bh=K2BbWak3F9Q2jTvsGbkaNezEQtxpB/CTjje1XqI8cJs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=IDUgH/FBFYfO4DCmnrAFQdqEuJ9e88xPCg9e0URmz5kNQS4YdS5ebAz94WIxOdEZgn2s++ptKWOrdz5g5ip0wW8shKXnz43S5ztoz1FouH5shwCBdcSE1AXPYR2onf3ukztd5neP3jNRXqN9h0/gs9XcwDnHZ0lT5wnWuDcGwVQ= 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=AdW2g8Qm; 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="AdW2g8Qm" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1785780304; bh=K2BbWak3F9Q2jTvsGbkaNezEQtxpB/CTjje1XqI8cJs=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=AdW2g8Qm6Ao9hpd03D7EJlNaifp8hbHz8oxEGnPCXJeI7/4HduyZkemGMocwRzo+K 2qX5PVAHM0olpy63tm2xInaZT+iJq9PxwELlmTyAmfbMGamedz+6ZF4xsiJMNCnCDl eMPDXN0Z60KTxNNzZHqL0Tpng9D56pcp9MUnNrHA0E16U3rGDPfH8Qyvk3XGpAFEKA R5ZACfnwSr3AGMbjnHPd2mJ1DM8IsJFEprQBJIfgL5cgV4h7WTB6IMtX8ckrVvOVRs haNwxrbRGdl0pTu0n2+DPd4lMmRF4M4MNYgpqjGWtwsTa4IUG/3lCFJIPxELcY2XJS mXGFYrsJiTAwQ== 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 4974117E121B; Mon, 03 Aug 2026 20:05:04 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 750CC480052; Mon, 03 Aug 2026 20:05:03 +0200 (CEST) From: Sebastian Reichel Date: Mon, 03 Aug 2026 20:05:15 +0200 Subject: [PATCH v9 14/22] 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: <20260803-synopsys-dw-dp-improvements-v9-14-2e6e46135312@collabora.com> References: <20260803-synopsys-dw-dp-improvements-v9-0-2e6e46135312@collabora.com> In-Reply-To: <20260803-synopsys-dw-dp-improvements-v9-0-2e6e46135312@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=6400; i=sebastian.reichel@collabora.com; h=from:subject:message-id; bh=K2BbWak3F9Q2jTvsGbkaNezEQtxpB/CTjje1XqI8cJs=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGpw2E/yYjNBM+taLRJmdasUecujhJeZ8iIni KFTCBOp9DrzeokCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqcNhPAAoJENju1/PI O/qapdkP/2Jts3STiV+Ga2L2wRpzaROGnIaGbGlqZf802KPE7CmaHl0jk+ASxuVjZN7NK/yIoGg 8WmluSzAKlXNIPYGIcOxkCwAnmbfC8nDpD+20+gwSdo15KmdUe7eCJghi2fkHYPQm7iNqvUzJjA gW9WmYv8pYLtD6Sbb6Ev4e9iv2QmA8T7SWpMZQowGhvUG2jxMZalmkpCs1AQ2RhbG6Pa9OSZiVb ftcwNzZUSpQ+xZncJMly/L5dFSHgLeVjzptUwCmzxDtXAD2oBSAWKygRbOo5QuqjFzxZ+eOlK18 llypd49qMzeeQ3U7D7q9+8xyM4DGBPuJ0uok1GGL7Tmo+0JJeRb9MjlpZO87ITXZR9b6jPxGZqY 1/CeL7DGuHIAsvNHtcEHMoWOQLk9P2Vz6gpHrWh86FJ2gvq4ZQFUOisSbwQwMUExBeOuxpnAC7R 8YMa9+tePHh7Xfv93akhUzUZHKQ0L337Kelp3cNGIqE1LwJ1M/qTMxonKyVo2hC9rHnTnZjDN5C rTRKAU+eKlBc7eOdc2XVHVxQkUa/pAjNxIrOx92bpTOzHM4+AJ4mhNJnhx332jPd0Wp3AQkuxg6 13a/DTruq8RcA6zvTfpibC5T9rVDYcAhU2iqC2GdzbzCQpPnJgt16HVhPvrC9Ec8rCmjXb5jlul RXNOJxh3sMBK+J9VSYBYq3w== 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 enabled. 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 --- 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 005938dc66c9..d516b3910b51 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; + u32 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 07:46:36 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 7B4A6439904; Mon, 3 Aug 2026 18:05:13 +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=1785780317; cv=none; b=OJHyW4oOiFQdRNqhPqfpY82CLG/zxHti3VVsbPW4KXgvIaUNp2hgmIRQbM1laKjdLcTu9xqQr/H2SYV+GNr2gvW8y1xq0tUCCXCm+rfyVHZcvMjDxYJTQeje/LqBnYI71sPxepIJZw7Xxj4wD3h0qkFBY2WfnXVjy4/1LE+50Mo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785780317; c=relaxed/simple; bh=IGNH4yVISBHE4rmc5YtMF+b8znVZwlT7smSmILDU9AU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=TDTh7RpftQymk0hfaUNVUsd/zS1GrL2rgQYuJJIMlh6KDbd7OJRDfPo30QZInCi4YaNsB1d5OFH77xdLQTt+h9313FCFWIOL2GgIkLn/BD+iHvNLkwOVFayGFoa/8TCYT7/dJEbqryMsVCgH/4g+LIqTqHQgTSdQFTBAcDcv0X8= 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=GafNpU8Q; 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="GafNpU8Q" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1785780304; bh=IGNH4yVISBHE4rmc5YtMF+b8znVZwlT7smSmILDU9AU=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=GafNpU8Q6F8QC1jANUhszjUyBZziuUJal7vKyV31bT+e6jPW6Vp4/32KuHTIJSIcQ WbHH0aqYAk5ruvJb2GPRaYFErcNAUmVtqlSp7mMxvkQzFx4+xCmhk2i6v5U8NY7GqK x6FUyMZDnsWg5E1VXGYfQTuGK/QZu4ozEw9dHsZ1nTkVYKqs5nRtaOyZ94lWaB8BSI CdKGAU/OcHTGc4YuGX1xWSbJArxgUq+bW4Cjxk1oTZC20pxVIBHo78KdecsmGHO1AC A6jj8QQHSePCNseDueeZZhAzO6aJWkFrQHBghTTQSnTSd5dTPqTKR5jKaQn9OVNDrr u4rouBEPZXBFQ== 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 7313E17E121D; Mon, 03 Aug 2026 20:05:04 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 768FD480055; Mon, 03 Aug 2026 20:05:03 +0200 (CEST) From: Sebastian Reichel Date: Mon, 03 Aug 2026 20:05:16 +0200 Subject: [PATCH v9 15/22] 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: <20260803-synopsys-dw-dp-improvements-v9-15-2e6e46135312@collabora.com> References: <20260803-synopsys-dw-dp-improvements-v9-0-2e6e46135312@collabora.com> In-Reply-To: <20260803-synopsys-dw-dp-improvements-v9-0-2e6e46135312@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=13502; i=sebastian.reichel@collabora.com; h=from:subject:message-id; bh=IGNH4yVISBHE4rmc5YtMF+b8znVZwlT7smSmILDU9AU=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGpw2E8qGKKFENr8hDjjNLL5CvXBToCuStyEI uVjtvQSn2t77YkCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqcNhPAAoJENju1/PI O/qaVUAP/1D4D5cWOdkcN12zoKBhAPj92wPQqpY4t4JUjbWkchObOlKlVrSW+A5Z24Lzdi45lCH BmsOv4Ntt3qi523Ovt+oDzRQWvdOp2y7ljvXR82K0en82OICpsTL2pbyezl5RkBmjIBIstw/BPe Ia53Spc75FobEa0LMxMKgQGL416EmkaKTkeSskB3S6TrINTSRt8mjU8OW2UobwBRTdF+j3T19WU hOuQiffgUpSpNAobHNysDjy6URFzxxr02DUx1zueGnaH8jDOvZb5AO+t6pmGb9+Kfe1Smvvb74U 3mWtIetb7OCE3J2j3fEJ9ngIdtty1bMdLM5DxflOF69hNXH3d6pkvdeeeEfOLF5xRag9+62rLV6 dPahQi6kI35B4TwEPBNYRM/iJdN6n2c9+ji6aWvzjMpk5QfWbzTWvgFEngPH8B6SFOJGudN7MhD 5LuoZXzARQaoot/RqAXAgD3xwrZnqqmRS4D5MddneQV+DoREEEuBDXMYGUglVL07zZc6I8U5DTm pnMz1eT8sQpwSf1FdHuovh3V5BwM1iRfR3a3jqNaiLQVWgGQ24TPVHJolRyafNZR/StJP/yBZDh bnYutk2PboVBQqgFfDR3eQOgzMtrgQQ51IY/mm25B4reLGfm3+l08laLA7sPt57vb3dmWBrpyQd FScx3xy69ux/iwW0Mfqo04A== 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 --- drivers/gpu/drm/bridge/synopsys/dw-dp.c | 233 ++++++++++++++++++++++++++--= ---- include/drm/bridge/dw_dp.h | 7 +- 2 files changed, 201 insertions(+), 39 deletions(-) diff --git a/drivers/gpu/drm/bridge/synopsys/dw-dp.c b/drivers/gpu/drm/brid= ge/synopsys/dw-dp.c index 7b8a9855ceae..501b28abeca2 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) { @@ -1675,6 +1683,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"); @@ -1725,10 +1740,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) @@ -1749,6 +1769,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 @@ -1901,6 +1925,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); @@ -1960,6 +1992,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); @@ -2074,14 +2111,21 @@ int dw_dp_bind(struct dw_dp *dp, struct drm_encoder= *encoder) struct device *dev =3D dp->dev; int ret; =20 - ret =3D drm_bridge_attach(encoder, bridge, NULL, DRM_BRIDGE_ATTACH_NO_CON= NECTOR); + ret =3D pm_runtime_get_active(dp->dev, RPM_TRANSPARENT); if (ret) - return dev_err_probe(dev, ret, "Failed to attach bridge\n"); + return 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 put_runtime_pm; + } =20 dp->next_bridge =3D of_drm_get_bridge_by_endpoint(dev->of_node, 1, 0); if (IS_ERR(dp->next_bridge)) { ret =3D PTR_ERR(dp->next_bridge); - return dev_err_probe(dev, ret, "failed to get follow-up bridge.\n"); + dev_err_probe(dev, ret, "failed to get follow-up bridge.\n"); + goto put_runtime_pm; } =20 ret =3D drm_bridge_attach(encoder, dp->next_bridge, bridge, @@ -2091,11 +2135,15 @@ int dw_dp_bind(struct dw_dp *dp, struct drm_encoder= *encoder) goto put_next_bridge; } =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; @@ -2103,6 +2151,9 @@ int dw_dp_bind(struct dw_dp *dp, struct drm_encoder *= encoder) put_next_bridge: drm_bridge_put(dp->next_bridge); =20 +put_runtime_pm: + pm_runtime_put_autosuspend(dp->dev); + return ret; } EXPORT_SYMBOL_GPL(dw_dp_bind); @@ -2110,6 +2161,9 @@ EXPORT_SYMBOL_GPL(dw_dp_bind); void dw_dp_unbind(struct dw_dp *dp) { drm_bridge_put(dp->next_bridge); + + if (!dp->usbc_mode) + pm_runtime_put_autosuspend(dp->dev); } EXPORT_SYMBOL_GPL(dw_dp_unbind); =20 @@ -2120,76 +2174,125 @@ 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_irq_free(void *data) +{ + struct dw_dp *dp =3D data; + + /* ignore error as the interrupt needs to be free'd in any case */ + PM_RUNTIME_ACQUIRE_AUTOSUSPEND(dp->dev, pm); + + free_irq(dp->irq, dp); + dp->irq =3D -1; +} + +static int dw_dp_irq_request(struct dw_dp *dp, int irq) +{ + int ret; + + PM_RUNTIME_ACQUIRE_AUTOSUSPEND(dp->dev, pm); + + ret =3D PM_RUNTIME_ACQUIRE_ERR(&pm); + if (ret) + return ret; + + ret =3D request_threaded_irq(irq, NULL, dw_dp_irq, + IRQF_ONESHOT, dev_name(dp->dev), dp); + if (ret) + return dev_err_probe(dp->dev, ret, "failed to request irq\n"); + + dp->irq =3D irq; + + return devm_add_action_or_reset(dp->dev, dw_dp_irq_free, dp); +} + +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)) return ERR_CAST(dp); =20 dp->dev =3D dev; + dp->irq =3D -1; dp->pixel_mode =3D plat_data->pixel_mode; =20 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; + dp->plat_data.autosuspend_delay =3D plat_data->autosuspend_delay; =20 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 irq, 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 /* @@ -2199,20 +2302,34 @@ 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 - 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; @@ -2222,26 +2339,66 @@ struct dw_dp *dw_dp_probe(struct platform_device *p= dev, const struct dw_dp_plat_ =20 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); + return ret; =20 ret =3D devm_work_autocancel(dev, &dp->hpd_work, dw_dp_hpd_work); if (ret) - return ERR_PTR(ret); + return ret; + + irq =3D platform_get_irq(pdev, 0); + if (irq < 0) + return irq; + + return dw_dp_irq_request(dp, irq); +} +EXPORT_SYMBOL_GPL(dw_dp_probe); + +int dw_dp_runtime_suspend(struct dw_dp *dp) +{ + if (dp->irq >=3D 0) + 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 ret; =20 - ret =3D devm_request_threaded_irq(dev, dp->irq, NULL, dw_dp_irq, - IRQF_ONESHOT, dev_name(dev), dp); + ret =3D clk_prepare_enable(dp->aux_clk); if (ret) { - dev_err_probe(dev, ret, "failed to request irq\n"); - return ERR_PTR(ret); + clk_disable_unprepare(dp->apb_clk); + return ret; } =20 - return dp; + 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); + + if (dp->irq >=3D 0) { + /* + * HPD_HOT_PLUG bit is asserted only after the sink holds HPD + * high for at least 100ms. + */ + msleep(110); + + enable_irq(dp->irq); + } + + 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/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 07:46:36 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 513CD431A28; Mon, 3 Aug 2026 18:05:13 +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=1785780316; cv=none; b=rvyXexJZgFlzTYOeAbZb+QOukycGHdwbmExKbM7zHPYSPqTgWCIsu4Up/FgTD4PXVp3LgsmDC9Z8I20Sgh3MfC4MXdFtY82mtANKc9maRZQvc3EqkkOiNaHkln6H0uSnh1aNYmLYXHUc04ZCt5wLVE+8w/6273vR69yEkvn2za4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785780316; c=relaxed/simple; bh=8QSlSuWPiGUI9AoT3cgCttdenutXBFd4174AAf6FMNQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=e5aD1m14YPPIIBnrFWBuWNzISS1Uc6gfgZZUbKt2p6g6oQ55kAxWjXOs1k13+bSW4ybbcNzfSlfVDXQRFEOeJpUWDBkaSgU9KDFBBQwlgJyk7Q6GCdrCARdNEFmTBdMwykwUciw/UE+xv9Y/kyqH2ih/rlZbXBUDDhBsAQkLcMU= 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=GPK5u8x7; 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="GPK5u8x7" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1785780304; bh=8QSlSuWPiGUI9AoT3cgCttdenutXBFd4174AAf6FMNQ=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=GPK5u8x7ivnJImWzJ6RaMDQYWb7AFxErHP/Tvo+ENejQvg4F86iph2muOFonrSUUt nS69yWW81u1DouzN5kARgD2ppfF8Jywe++OZLBnn7Rwa8HqOybLUzNZYPxC8eoYx6C o+KdEPoo36skYpq5OGGPVHkjCmWbZIJafF6fXxp8ljaEZpWEcx6lXnU22suFua4GTK wWvv3NdC3hl4W24DobIq9uPu+cjSSsrbBUO4JEdS+aDxwkyhosvWvvSHmPI06nfl7h I1wCCOkgPrnu6koF13zAxK8vGJbG5j5BOPUDkn3cYvNbyBh8Jg+gC0mamEFW9F67ir 6bb6HEzTUrqSQ== 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 77CF917E1229; Mon, 03 Aug 2026 20:05:04 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 78096480061; Mon, 03 Aug 2026 20:05:03 +0200 (CEST) From: Sebastian Reichel Date: Mon, 03 Aug 2026 20:05:17 +0200 Subject: [PATCH v9 16/22] 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: <20260803-synopsys-dw-dp-improvements-v9-16-2e6e46135312@collabora.com> References: <20260803-synopsys-dw-dp-improvements-v9-0-2e6e46135312@collabora.com> In-Reply-To: <20260803-synopsys-dw-dp-improvements-v9-0-2e6e46135312@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=2728; i=sebastian.reichel@collabora.com; h=from:subject:message-id; bh=8QSlSuWPiGUI9AoT3cgCttdenutXBFd4174AAf6FMNQ=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGpw2E+r/JK6rbBd1bJ9mvGx4sWIcG9hMWAzL ogdh+35JamkGokCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqcNhPAAoJENju1/PI O/qaOZUP/3b9R5tMruY8nj7UyEnLFf4P8GQHm7Ep5EgQsyOlEZ/c08WCzZKziN+BpV43pBcbL/E Gmj0Ck0vagJwKBChFdc8mD9+BTAfqNCL4t0yPatigmgdXdim2x5Tomb0qEyc3ZvIW2atTrSLdWU jjiZ+mryQ1Cw21axGGSYUmcXQOjcjW+VJRA+eShVu1IBlxPAIcgL7N0RWCJxODCsTzfjx6Z9ExM +a9i6oj2AWNzysU019JxLTYRftHETmONWCQkGWP8+oAVX/a7UfuBvXozWj6JFwKLUVTBT+IXV4d lXOkafIRhvo9FAyyBu8ujX68nh252ccrtzVENanrztK49CVRkyWbloD/NLGbPXTbcNrdZSFibP4 t1IuAQnXggGvB0HhD57VMAYRXG+/nKSFLekF/ByM2vD0gb6PxaSUvlNIwjZZ3rHy7aUNS1OmkRZ UjQTnX4/1PDnohzW4nn+u+2H+A9bKJK8CiXrNGZkOCl0HoNj6zQPMO/KmOqQ537SmQnz/NxH92w qKKCKCM9cIuwUC0ny1HMa2CZ9ihoBvHFgybMv5aMFZKJgmL0GCmK9vOuy05NJkBrJdsYIBQcYW1 hio64vXAaHSpP9KrNdWYDVO9rsd03D/i/XMcnjrVL3jJw+NsHX0d9cXhHftBAAXbjdI8psWBiWo MQggY0cR0vavULlUqTO0qaw== 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 --- drivers/gpu/drm/rockchip/dw_dp-rockchip.c | 29 +++++++++++++++++++++++++++= -- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/rockchip/dw_dp-rockchip.c b/drivers/gpu/drm/ro= ckchip/dw_dp-rockchip.c index d516b3910b51..dde3881efad8 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 @@ -194,7 +195,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) @@ -231,16 +232,21 @@ static int dw_dp_rockchip_probe(struct platform_devic= e *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; 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 @@ -249,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}, @@ -283,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 07:46:36 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 48EC243031A; Mon, 3 Aug 2026 18:10:55 +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=1785780657; cv=none; b=YwIvk+FwPYNT2cz18pu71D4pw2kOw2RZAtsWo8zIzzZcRuOuml7WPhrq1IMc3IqX7yTlad1fDVglXxVO+IAcsvkydJhT/7zpso6wzZFNOQseEzz3X+/YNTCG6xGfGbiNr+AQ9PGaykkcXgKV6fsLtRQBLZXKb3pouxmYAMGigME= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785780657; c=relaxed/simple; bh=Aruh5826b4wtnxe+k2RSV4tTeWw4FEiWIslPr3Y+k4Y=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Cdf7199ApQBhF1dcy0TPAsVa1rqjRZnaPndflx+S+xJAK8QCrjyjVMRCQp+lnmZpNWteC84rxIugdTB1gVGluvdL5fYMB/C7y6fK9tmw0O4aR9t5RQ3H+9BCXJHraVK052zRJ5sHWKQwBskGfjGy80u7rhT+uOoILBXBcjPIvXA= 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=mSJ0pTHH; 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="mSJ0pTHH" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1785780653; bh=Aruh5826b4wtnxe+k2RSV4tTeWw4FEiWIslPr3Y+k4Y=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=mSJ0pTHHWVV8zTxw2HDA7G2WZ2FmevEUbcTX+haILU+Be7mpnV6tqNr6n1PMDE2Tz AlHH+WwgCPFmf1lYn+5Q4ThKWGXEWaRYvQh2BfnCD8yWx/hTmMK5h70Nilm++ZY6R1 fInBfBtGV95r/NIY2kdnABvdm9c8k5lwkBlZHg/LDBzs0uvRzZ6p6emEhGCZUVDlrn aLwiVs9xyLWf/v6ZGCZdAnErEHBBqcbZCjp1zFxc7MLREO4QD47FtW5z/Wejuh1gB7 w5mKtL1KePGwEm77lwpVgDnfVKitDYXwatM9jAnbtuC+vuaenDJrOZHp7cpDr7vQFD vQ0LLS+AFt8Rg== 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 489AC17E0235; Mon, 03 Aug 2026 20:10:53 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 79750480062; Mon, 03 Aug 2026 20:05:03 +0200 (CEST) From: Sebastian Reichel Date: Mon, 03 Aug 2026 20:05:18 +0200 Subject: [PATCH v9 17/22] 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: <20260803-synopsys-dw-dp-improvements-v9-17-2e6e46135312@collabora.com> References: <20260803-synopsys-dw-dp-improvements-v9-0-2e6e46135312@collabora.com> In-Reply-To: <20260803-synopsys-dw-dp-improvements-v9-0-2e6e46135312@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=Aruh5826b4wtnxe+k2RSV4tTeWw4FEiWIslPr3Y+k4Y=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGpw2E8yhIO8BZ7FGnbgyT2xSBAKvjm6mFpTL BuKe2JvfIqWLokCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqcNhPAAoJENju1/PI O/qalewP/3Aqct1OjEEN3uR0AqUaagiH4nkmlfmNLkdgMATAie4QKABebBRbo9LqcQexWr3KOUc 0vzosJEJgcOJ48kzuC6DqKwRBYtzrlXKJGkw2ofyQ0S7EQ1sNYzLgT/SomleK0qwHGaK178Gh/O TERFAKISEWmXm+9KLIMGkTryeeyRPl5pouhHI40nU3WzZvtcpYXZtgoenM7yr1BctmTd7W5hhYi C6ZDT/kgMcV/RGj534lrsEEIs8t5mMMB/sAZTMKcaa6XMR4VjCngEJhkjHBRtE8u8UqwYWXYoFm yLOJtKm7qCo1yoYcQ2fpp+Ek/st5O0HdUAHF0OxZAd6S2GjK9yIJGa/M7J9Jdc7lTlnKDL5HuBJ TcRTVjDGVxuQ4OEj7hKInq4AqVfMx6fRWWBDQQKVE3EasqZixFimO25Fsn6vMySl1MxZ/FqAlnP FtzGloXy28cTA3bEF+4JgvvQyfCf4V2YBfNUjV5yJt9j70geblLWQ5VR7mJHvHJo6E0XVvw4mSd 2acNR5QaY5I1bn5lyECe4UfQDRStrPy/wn8ON8Rflmm90qbv2Dj0aVhYBDYrSJjbyDUhg9Ye/Aa TxQ/2VubkmdyYGHytMNC7n7hSJIxfbChiSxhLfHk5MyU4ay9yrUK978Ekk0qmA3v2vEz0/0lkr9 H6VXUCdllBVLhDpRkrFwrcg== 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 --- 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 501b28abeca2..19b6c11f672f 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 @@ -1702,7 +1706,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) { @@ -1746,7 +1751,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); } @@ -2249,6 +2255,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 07:46:36 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 7B10B439903; Mon, 3 Aug 2026 18:05:13 +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=1785780316; cv=none; b=vAc8iaTb+sf/+6F1xBQX19r7kKw8oQLlR7JeVHrwYxdfLyq8Pkw3/RIAOudWiTIFqHIWchpRnc7O6PCkB1guzAjIdSiVno2iahOyuOyOv20MlJI+3bQzJ8VwrJRohT+LW627QYv77IFLApm82cU3+Reoc0D8b0K6iou0x739cgM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785780316; c=relaxed/simple; bh=UZcqrNKsjBQlMpMlDsv9U742mbV7pUWdVK538ZAWK+8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=aHNea3nxUL2jsvLGE9q16vbr5PfIC8ouy6ZDvtHu8PyVftG3Gs03b1azr2YS+qIeJ+/ZhnQk07c7YtUycBr6KjtRetlR6shtZ1t/e4uzorMA974v2rkUH7AGDqDBhPYVr3zuPhQfzPEPpCsYQ+acy8qkaxCTzzIJg7yNrhAmkX8= 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=gDjEx4Dy; 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="gDjEx4Dy" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1785780304; bh=UZcqrNKsjBQlMpMlDsv9U742mbV7pUWdVK538ZAWK+8=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=gDjEx4Dyc0RMF/uA/v+WjryvAbuRCnACbo9/jc9k7co2bWI8FHtXL4Fx96/vRAjK1 +6a1Wtx0cvox5Z/2qUZP3hJGXFtO0pLWpIB4OxxfqJNDZWbrZVNLuBlf+j0cDko6Qy G8n9bjdqKXPOLX2gO4vlUq/Yeeo2Aim4EinT1Ok3w8VtNy0qZwPgRHQwKBikhynM7r S9b05vlWjMgDJRFQ27HVoibCidWdiIA0Nr5TslkjZCK9vTmvSMPKnOVBq7TSfaWiCW CQW/ssnqz/0703how41LYtVRsBUQpfFV+NhNy6EDUZ5uQlNJhT93zJAQbPIDw29mF2 znZP3vYgA6a5g== 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 82C0817E1249; Mon, 03 Aug 2026 20:05:04 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 7AF34480064; Mon, 03 Aug 2026 20:05:03 +0200 (CEST) From: Sebastian Reichel Date: Mon, 03 Aug 2026 20:05:19 +0200 Subject: [PATCH v9 18/22] 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: <20260803-synopsys-dw-dp-improvements-v9-18-2e6e46135312@collabora.com> References: <20260803-synopsys-dw-dp-improvements-v9-0-2e6e46135312@collabora.com> In-Reply-To: <20260803-synopsys-dw-dp-improvements-v9-0-2e6e46135312@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=UZcqrNKsjBQlMpMlDsv9U742mbV7pUWdVK538ZAWK+8=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGpw2E8dd5JkKutzGxCcJHMtoE48rpgglTY14 V8gZBr8n5mGkokCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqcNhPAAoJENju1/PI O/qaNQUP/3zZ6GwcxV/wZqkxZuqU826U5aORfooZroHqJzPY9U6nkpXZgLN5XPYpKh0c5wdIqWE JzhRpPSAs3hlg2JfhuvUG5N9PThC4sp9I+4BsxvjH9vnR3vij9E5ItfqqVLY0kfn5EWrEle5t0e k/yeS29l8Cim/Pk8iDvl4feisZ1aN3nfb02blb05sI7pcwydLNPJDzviVVd/nKTSXkT4U+t19zi FRMJg699V3QTIy15Xp+kDIfiap/P3WBBd5A5flE5ZdPpYucfgFKoNekkbZtSB9JlJBo3wbZ4faL MxHUT7+XEqYdTa2CM0o81Tel0ZB1XKpcjljr5Y/o8YuPLty1Mnd5LtVzkz1jE0mawXkpo05vGYU Lc+fZl3uJlZ1ooRSe7/K0jHu5K8yFNUad8XefLsIjDNKc8EN1lWWxU94a8+MsKAWTJA/8+leG44 bP8oM0OFp92fJ2iNYFadamrho9E3MLi3Z/20o7NbEK3PIiiv7Hz0Bu0R27JvO00UiBcAxHfCGRr 6dXdV+z4DEn4xKB18V0mEYnBoA0ebTZqo4jK4FQNoLfcn3C628iueDnNbrOi7YmYq4Ud2T+1oqO H1cX5j+0aQYSKOTofql9znCnsufZOzpR3SFNx0dlbhONmPraPsQBj5T0CWRuysaSV6S7lvMS73S C6sinmmQKN0H15WBohSs5+A== 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 --- 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 19b6c11f672f..05d3485a4d8d 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-dp.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-dp.c @@ -1706,9 +1706,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 07:46:36 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 556594307AA; Mon, 3 Aug 2026 18:10:55 +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=1785780656; cv=none; b=CvoFKhCJUgYtlDjMgqB7dHtj2aHSK2vfjXKR+11+Gh1RxsmytFjaGgcXVChYWKWn78zYbKM+s+XaWqwSPmr/Qu0AMKQMtWt7/EZliNaiQsE/7L/LrJHMe27njhy/AC4jFhYxQsim+t5JdCTX+G4uNFgD4NS54OnZ2dIYHAx8VMQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785780656; c=relaxed/simple; bh=W1DWjzmrjuk3PygoGjrJSXgr4rE7/rYJZFBCfsWa26I=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ZCtpnWifMU0OawSuZYMA1Lb7QWc5yd7+gTuaDi6Dzqz7Q/yycLXaF+PsTaWUiiRbEyi7vfFrK3OzM+IzzElIsCwUPztYO3YbqfWEGhC/l6JevchQ84pMaENiN+EtbVZJdOPJNRdRe0ujQWrzngnb3pf6usHt37641HTio1pTTq4= 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=oAi3o9+f; 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="oAi3o9+f" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1785780653; bh=W1DWjzmrjuk3PygoGjrJSXgr4rE7/rYJZFBCfsWa26I=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=oAi3o9+faaEi7bKxXpxuoTxjKBou2jiMip3VO8ih429FrMxd0daozCvxmFyc/hgy2 vFvmXmkXG2IyjYbf9eywjX3z4YrXAzeOlX/oyW2L7HTpk4VERYq8Vgev3/E1VcDhjj 9ILfvd7rLyBCMPKRiEgBbqWWAqUPwUVHHMWIp/NOoFv9nAfbkOgH7wew/BjEDTbBiq zWwlsXlITzVbHh5xmyv6MieiDhBQrm+Q/4zWmg/DjEoRkTj0c7vfmLmbH2eSzyobKA h20GxuqV45zFHz5d8zR1+tE0KRXTBaRATpQ6b9CcObT/s3P7ltPk8/NQTWjCzuVOgg nl1Xo1m9RDjYg== 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 476B817E0053; Mon, 03 Aug 2026 20:10:53 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 7C735480065; Mon, 03 Aug 2026 20:05:03 +0200 (CEST) From: Sebastian Reichel Date: Mon, 03 Aug 2026 20:05:20 +0200 Subject: [PATCH v9 19/22] 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: <20260803-synopsys-dw-dp-improvements-v9-19-2e6e46135312@collabora.com> References: <20260803-synopsys-dw-dp-improvements-v9-0-2e6e46135312@collabora.com> In-Reply-To: <20260803-synopsys-dw-dp-improvements-v9-0-2e6e46135312@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=W1DWjzmrjuk3PygoGjrJSXgr4rE7/rYJZFBCfsWa26I=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGpw2E+Hx2rjRLnA+GIT79MVmOd7GYZL99ZGy TCsecRUbe29dokCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqcNhPAAoJENju1/PI O/qaOG4P/AmrVOf38b4+dUs3sNcSQT4T+2yhUJ4WXcHIOaFfxrwnlWPlc5AUP96IXEz9UnKFoMd Su62LwCPv+lXYSOH57h3HLEqZULNklQ1SZuKQy2dk+Y7pIU87SEJOkZ6JPUE4grVITrv1x2ll6J 7HFarseQjHwix9o+EyAbxLzlL0Os7+WCju91evyUP8VZTILKJC9xAJedpOXTpMVd8Wq6VeSt++t JrvY6ASNI1tZaOU+d4WAIcxAfPmxFhktr5DvxRZdOmN0NVzhJKpbzlGtRwSmmPbYF244yvcAPfs fYEj08hurUAjdi9j+aVrK3L7We9/q38G/yo+sRPM0xKFBtMn69kEQMtnEYUgPNuXJZ4tHaORv8E NGj61CfdlNgjOkObYyxXnl4uNlhGJlnLLO1GBqItRv5HrSVHM49pCJUHtPCwmvbMNoIz5hNUc+E roMZKDe0cjogs6LhyVzJiZ3ZGoD0DUiB1zVMOMKWTnfFb5DgtvHDpbLQdTY0xuJQJJX3v9vxsJW YqA4E4W+W9yyTFvqd6RmOzDvflqHt7JDk9eh6iYEZyeEh9POC3tsN1sNcE8aB5MrmTWKA9rqCIB XWlYy6/RogHjGqTHeo1oda3ywtNM7aYJOMLgIpFqy7jsEH+w1KNerpJyFxAgs5PdWv0kyzI+5yD DLQSNlL7oUnqpegaeTFUvtA== 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 --- 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 05d3485a4d8d..d8c6a99e93b8 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; } @@ -1748,8 +1761,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); } @@ -2338,6 +2355,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 07:46:36 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 7E2794399FD; Mon, 3 Aug 2026 18:05:14 +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=1785780317; cv=none; b=TIfqUCgIH/LKyhGIZTiZ5y9nsYLM9UuHuh6JfWmqyaGysunhkq2dTCQwoO7M8+JetdIlbNHt+IKG4dfgp1iXAN3qKbU64VWEo5Np4KOkZgbsFmbQctbgv3XIAYwSB9nYU8CDTEMDC1GGiAPloO3e6xfhD7TFA2RUgNzR6EIPxUw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785780317; c=relaxed/simple; bh=yZLykTAN6AQqRCp/IEz9fXVJbOyScQBTvpn7mrG0ZFs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=b4i/pVNjmCh9ApQrZyeJq3833N3eVh1oh4ebmdC9DbpR/Ww+iU9m9xouTrBgOfcpwTCWWo3rb/ZPOuS/xvqG2CdZS3glVwcwaDWZJJhHpkOY3mCi0f1ukd7qlLWVSZsu8s/Ckz3hkUqQGkl9kzTXgJGmQ19lxxlGMI+5hBCP93E= 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=b7otiZjW; 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="b7otiZjW" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1785780304; bh=yZLykTAN6AQqRCp/IEz9fXVJbOyScQBTvpn7mrG0ZFs=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=b7otiZjW6OVVvIWlYupsS/VkYvRIFI5GbKPasX3hsNhenBpvZqes/4HaUUptyCwXd AZkdP5QSVtUYhluNgV6p0m/MBOFnFAJKRy2NJmKDC8Hlg++3zuvznNCYj6CSbXirb/ EOOEzh30mm14dcNDv2dBqf3aGXY2sz5GNB+5Pn6ocrmuSvEekTouBLK1buhq9aQlO/ TyE8rxnGsxmgMNx7qn6XvHFvw5qaGpWfAhq/DlaZeCgcvT4Wa0RPTXaB/fpSsPg7lK XvBNwl4DwXofFGktDmH82+nJmO7EwTqWMBr5vfJ1uj0L18TjSQ8HDsKbXB/Vw4d8Dc DHBFMFq1/7zLw== 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 971E417E125C; Mon, 03 Aug 2026 20:05:04 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 7DF34480066; Mon, 03 Aug 2026 20:05:03 +0200 (CEST) From: Sebastian Reichel Date: Mon, 03 Aug 2026 20:05:21 +0200 Subject: [PATCH v9 20/22] 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: <20260803-synopsys-dw-dp-improvements-v9-20-2e6e46135312@collabora.com> References: <20260803-synopsys-dw-dp-improvements-v9-0-2e6e46135312@collabora.com> In-Reply-To: <20260803-synopsys-dw-dp-improvements-v9-0-2e6e46135312@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=yZLykTAN6AQqRCp/IEz9fXVJbOyScQBTvpn7mrG0ZFs=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGpw2E838xnyCpPYs/lfqW9PfzxPmMY4dTE6A PFN994EeZty2IkCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqcNhPAAoJENju1/PI O/qaQcwP+gPYook4xajED5bjNUiWuN7DK92L0yebsvXMlJvDhENy0lowzQaQSJnww+0IDpLCOz8 7b4SY/+BXBR4NXeA/AW1cbOw4YvY09MtGb7dEf3aFCgDjq5i9b3GyytqDRltf0dW0YniCAV2yg6 JJmrn2COdeE/0P3nyqn+yw7WV66YZZ4wF/Vdbj+inu6pZAuKQzkMDH0UMLmo1zMmxctT4BPve/I JbYNPDkeH/VcifPuAdhFXpW4P8JK4XQNVNE9JqAZufjkY3x5SqCles2Q54axkbKIxqxLsSu2Zyg Fj/qeuNXO6U2FH93zpgHo/+zpnqCXg1OyKnHnV54lX2tw+WnWltBobQeyNlMpNKBVN/fFOBbk4z /BfW6mOo10Q11Rvgx0KnR54iSIOENl4kiofc+z6m7lcDr4dFkF2f4pQW2xBkicQDuyvTliNktaM UkxWpaMMiZ8mVKBrI/toLD6gW88iN+Tgv2SPT06X3oQp44nV+vKlQXdQ7krfTvsSvpTQkl+o1R4 DjG1ld96J998Ri/okStcvkQfvwjZ9caM3f6Y6Ynw0xrk+46rbWu/2uwi7zF5kGu7StuYzDEO2ZA DIx5X9OYuNnOE59gfuGeSUkk0pLIxNFq9XUgfqgNN32kFVAVqU+8zILlfSpCzmo7la6w0Aksq0u 9c4yrPNNVcjeDJGSVlJk+vQ== 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 --- 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 d8c6a99e93b8..5d10a60d265d 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 07:46:36 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 48F684307A0; Mon, 3 Aug 2026 18:10:55 +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=1785780656; cv=none; b=C1mJJwwQcA6pDn5PMUaSHmg0Qxy+WYgZK7YFRzFzUqBRJOFQokS956UVq6y66NNO4Ckw+AHLTJHnV67OFdVv6Agnsw3eb4sWnFnR0arrBk0UK3HW1Pk3N2jbEPdTund12J01IhyaPfxlqbI/k1U3hZ5nVjvvI52pyLdx+G1yejQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785780656; c=relaxed/simple; bh=SwF3VHoRiI4Zsf33YHjX0UHR9rjLn/pkIELQ2nyar2c=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=IPwJ3FF3lh3LtasZd/gcQIfgYcioX12eUTqEYBb6oz/0CUIKXMg3JAZlBJ0O8prBMIc8aIGJz4WsDu8gXg2hdc7Z9YInsrz5aoRhi5k/mO9NlzO+/OA3GKFfiqg9i0Fm5TBVof++6QTw+ZLGIyMEsx9C1zZvk1s0EyUeuS6wSrQ= 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=Mk6PlTa3; 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="Mk6PlTa3" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1785780653; bh=SwF3VHoRiI4Zsf33YHjX0UHR9rjLn/pkIELQ2nyar2c=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=Mk6PlTa3pgWRgp6jXxlofN7jCJ+WTkNj4pU6H9aqm2BuXL+fk5mjcV7pzT3ugmmYC V1zWdLV2MlA2BVOHATBoY+oMC1+mPZWFPH8cOz8tkAjJE745Gxe6+mqYF9G3sJ4Lod tNmo5MhCKBgutgDniuXMeCZgiJCXSRmOc/0ddH5TgUmEXlLzQYrSq3ilrN4ni4tDEH G/53d7MsmWVPDK3iIQXJF0WfnIXC/CiLiuaLljf1QLz6fCMzdnf8QbCIGQeUoehbMj 0a7DdmWnkYKr5cpAu8QLN1pgvx6SVfcTjkrYnc17BB3PpFQIrFGFBgUpw8v7T6pbPX /ahDPpP40tZTg== 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 44AF217E0048; Mon, 03 Aug 2026 20:10:53 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 7F634480067; Mon, 03 Aug 2026 20:05:03 +0200 (CEST) From: Sebastian Reichel Date: Mon, 03 Aug 2026 20:05:22 +0200 Subject: [PATCH v9 21/22] 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: <20260803-synopsys-dw-dp-improvements-v9-21-2e6e46135312@collabora.com> References: <20260803-synopsys-dw-dp-improvements-v9-0-2e6e46135312@collabora.com> In-Reply-To: <20260803-synopsys-dw-dp-improvements-v9-0-2e6e46135312@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+poByyZiAGpw2E8X8/6ke5YGf2wLX23DQHWF7z3+T7N9U SvEmWNK9XTt7YkCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqcNhPAAoJENju1/PI O/qa7xAP/3pZJ+jglV4aS914Qd8fTI3HTRaYHMNJ4xdJAdLlRPH34gsOK0mFgaYNp1zUJ6XnONd fBbPwmwczsneWu002o9AqSvLh2GCPioBh0jcAF8eq/rHrz8g+Hg6J+NOLyiOg+234BBaIq+R2lU nGoEiVzjO2k8ljIfHhqNzqTwU5zpzPZ3nwQqozz4rNPBL8mQO084DGuUF2X/onFwuXEjGw8Vbwn YgNyYnjD8h7hl7rBx/SKc3O0qbKJb4MvqJRndMsWOQZ956DyyvprOOsbuxi+n/GpmYB+dtMgNCF MjEqgH9IYmZSq9zGY55dUFNOC0osANOYh8XFSgsDAmGtSof3Pjia8gcWXUM5pDUHtELHOt1CGhl eJkNRcOrvf4ZNxTASKQuwCzHx0pNYhjr+2aXK1+LvnhLy5zWx5Ieb6sUxvTVN82/NCPx6tyS3nn 6TBOZ+sPeow7OAOxlBlblG91a2Sfdr2MesmUd0A6Eh+Q/mqF3tCxDPq4qTHE1ZX7rvZqgV9KtZL eGWrB/UlkxkOCyYir5rTBpiPN31vz7CuwAHDXFcIMjRQgOZTAILyp9Nci2P7MWgNnA7xLKWzIgX MHco6sRm9NnaPOzmeleNzBNnuY4G/fES+xb04O5bc3nRG+YCDzpsqfUfNd4taaJlUCv1IH81Bv/ Ig+AKejGtMvzRuvviVGU1YQ== 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 --- .../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 07:46:36 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 79DAD4302E7; Mon, 3 Aug 2026 18:05:13 +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=1785780316; cv=none; b=sYQnbixfjiY4Th672XWLisLZ82V4zTdWWzIDlK6+eXOp3PhD0b3E3FCLf+0b7x7Q2zuc1IT8nEDF78vbArf2axzI+Ehfmsx7brbHRxVTB/ehruz2tjXB11aWDE8K5+by9qTA2d/FRSpfE8XeO8Hnz/j5pyvPm7taYyncxN0qT/Q= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785780316; c=relaxed/simple; bh=3MLJpN3FmcfZsVDMPyMUFtB6N5M4sc0LN5B7zP4SLtA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=DbqDRp0VZCsuH4+tAhBJXSPzdtCf8g2jWQJMKSPPgQrb8KYI7JnULpRWy1lsfKEiEwgpVYPD7FBL5/eLGn60CNXMdT9sJVImUMYKvzUrThXgCZ2p8dFtYtKNBkygBCyyZnKDbb4JOvgZAoNKFXq8+7T9PQHwYdl/KzhGQ1gjARo= 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=DZVF04je; 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="DZVF04je" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1785780304; bh=3MLJpN3FmcfZsVDMPyMUFtB6N5M4sc0LN5B7zP4SLtA=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=DZVF04je1fKbcWzwogBK33MyRRcez/CoWOabYq2iJuJLNZgdF/AqheQfDCOUrv+bF B0jXvz/Z4RsMm1HYLVpUa0cz0BVBBh2wdHSRPS3khnzlo2pDWMU1wwX4LMoV/hH+2q g/xXPNjb4BI1VWUOm6N/5N37OxnCx3naGysPPxU/cJuvbjyoAmMxhRYC9PCZSLktAV /LE7r212fxk93aRPNb5eXsZKo2+iZhvTO4qN60c9fdoQ4scu1yTSwotRndXoTTl8Dc n30ceFi0g82QaP2j6qgxrYksa/e3yCp7V4eMxgr9ZYAvfLRVUW8xV3lAuN768asaAG zvBSCAIqmInNA== 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 A0C0517E12A2; Mon, 03 Aug 2026 20:05:04 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 80EB4480068; Mon, 03 Aug 2026 20:05:03 +0200 (CEST) From: Sebastian Reichel Date: Mon, 03 Aug 2026 20:05:23 +0200 Subject: [PATCH v9 22/22] 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: <20260803-synopsys-dw-dp-improvements-v9-22-2e6e46135312@collabora.com> References: <20260803-synopsys-dw-dp-improvements-v9-0-2e6e46135312@collabora.com> In-Reply-To: <20260803-synopsys-dw-dp-improvements-v9-0-2e6e46135312@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=11916; i=sebastian.reichel@collabora.com; h=from:subject:message-id; bh=3MLJpN3FmcfZsVDMPyMUFtB6N5M4sc0LN5B7zP4SLtA=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGpw2E9y9DtWJCcnI0r6rptMFsTlZ8t/9wpW4 UEMANJMKbCWaYkCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqcNhPAAoJENju1/PI O/qaaqoP/3ei06OymPphaW4fb+KnwDt9G0nMIhYZCG7bne/6sQ6zdAOXlJtPTBmESEHd8qlHbMK yinfeuIIFsLIBgVhX6fV7bUlBRZP6X75OHo5T+nlzOn4+xBYODw7H+E+kLUFu+DihbvcDwpDhM+ gM9DDEzdEblwIYU8NKsSEwA+py7DlIs0WAuIZ/zh5x9Y+GouRtsPY0M67eJRxN32ynBerhVYWpJ ljd5SMhr0xSLJ3ccam2NrEJpS8a2uzLE4VMlyuv3oIalTlai2oX7St5AdDpu+g1uaBNMfZ6MCjg RN5qFRhvbRbk01Jk5UHx2QJ3Kg0pf/YplH9+Q9BJ3Ib3TSoWeRP3OReoYwVRhnLVDqT0A5rQnN5 e8UvdwHI923XGo51KtW0UiK3ELIpPOhoXSQ+J1kT0oEHqNKeY8ov6br5dxiNnKn7IEEcC8bEAq5 nXkPGmyvObk8foMN6WA6MUBRh66ByyCRHdHs39o4YsAJnO/HDHYhsnua6gIZIh6BMH30SSMcOib MqwVNg5gx5biPjibinXO3a1jcXK0gk/Ck42PEVDTZy1aPKgd+yWTvjqy6BXX9sO3bEY3yPVVk87 GoF7rLBNlZCVFczBUmTFh9E3yomVxKeepMj9+N4wTGFMq3RQI2xcaZAE+73dzMDSbAfjcfGqQKa mAUeQ7gJBygWPmq2521gt6Q== 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 --- drivers/gpu/drm/bridge/synopsys/dw-dp.c | 307 ++++++++++++++++++++++++++++= +++- 1 file changed, 306 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 5d10a60d265d..53f1863c46a0 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-dp.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-dp.c @@ -24,17 +24,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 @@ -111,6 +115,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 @@ -254,6 +262,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 @@ -1690,6 +1721,254 @@ 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_disable(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); + + 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) + 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) { @@ -1728,6 +2007,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) @@ -1973,6 +2260,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) @@ -2271,6 +2563,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); @@ -2354,12 +2650,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 ret =3D devm_drm_bridge_add(dev, bridge); if (ret) --=20 2.53.0