From nobody Fri Oct 2 12:25:27 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 8816442DA57; Fri, 31 Jul 2026 14:42:11 +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=1785508933; cv=none; b=ii3lbOJtyvW6ExjpXkbMHX4kPz4KkIIpYWdNfaS0JrS1jSsQGYZwpDw+BBTBS3VanCbZivPQbSd7rDJ9hQKr3mb+UKKR/3T1Vsq7fUMMjgRhKgT/WIm7WvJnjhgZ8fB7vZeilH4ft1XjneDDtvzUDVdBwLV75BEPtuzLy9sKyJE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785508933; c=relaxed/simple; bh=T9YLXYV9yscTLz/3RQjqOP1ZHffRl5hykzJn/q2OMQQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=IwhsB1ROjnlZgL1cvQNtP1oVSMTwPdu8RsFr80U/AAbBDJ9iNdfR80CIg5qRuZYVeKhkdKU2cpUxvnHZfLT+u/o14z1Xng6bvkWMIMJ9hu6ekzFtaenE41cDIvtScCEQz5S7QiUHxR43kBa683MoYnUyRoUqPKzCRGFqPST2+Fo= 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=nMZ1J49U; 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="nMZ1J49U" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1785508929; bh=T9YLXYV9yscTLz/3RQjqOP1ZHffRl5hykzJn/q2OMQQ=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=nMZ1J49UmJSiylL5ZMc1qaXItfkl7/0AR6+pUUAPTp2pkBXfa+4cIYEFLeVl9p07b XJF8SDTTv0o+9+wrH3VqvZNIMgSCr4TWzuZrBFrz4pi6Mv4MV9oQTOMLyqQcagiWE6 /2CY8istQMlyDwKxkhKHRLsXyJ+9KoXImfU15IMcjWQxgDxlrPHoRGDomVp5WpJ5ow VxZoDCuayhm8e1ZYwjOMENZd1ktW0cmotVSqfOKdHUUtzbD+0GDI5KkazDkgMjy2Bn aINwEP48LyQmPxZJ/14JLOoX4EZ1QOtCWHhp0KUXfO1ophYpDlb6Yw0qjv//XQx3C/ /HF7W6lugRyzQ== 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 45C9A17E0700; Fri, 31 Jul 2026 16:42:09 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id F1962480028; Fri, 31 Jul 2026 16:42:08 +0200 (CEST) From: Sebastian Reichel Date: Fri, 31 Jul 2026 16:42:06 +0200 Subject: [PATCH v8 01/21] drm/bridge: synopsys: dw-dp: Register DP AUX on bridge attach Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260731-synopsys-dw-dp-improvements-v8-1-ac1e6a75782f@collabora.com> References: <20260731-synopsys-dw-dp-improvements-v8-0-ac1e6a75782f@collabora.com> In-Reply-To: <20260731-synopsys-dw-dp-improvements-v8-0-ac1e6a75782f@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+poByyZiAGpstED9e8dRXL1rkVWGQsXRgfrnozRvuB2FI PW9+Ga/uMwZ4IkCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqbLRAAAoJENju1/PI O/qavBkP+gOGNM24u6tNqQ+04hmuwpnFz9zKA3QM7dc0Y9nLYbeSeRDj8VP31IwUlSq9f6xiKdS Na0Aek7k4whkZIw98cOC7lvOjNjh72XsfMyTbHr/NdpEEBy2IKnfyXkvB//0QMk5+6XODoFrBOR ZO7JEkLqyAiQ9ZXu92m+qNkvPh7lJI5Yd+B0sjTvfwB5Roj+wkG/m9oj5g1e/YPWjCmHN7Hwjti RVNxpCwLBTLdcOxjNgJdiZYYPofpLbZ0JsA2olrFeeOevR3aiG6eWXfr6YspGJc60aIDGbSJJ7K Pm4/So1LHLF1cnyOS/jgGESu8PXadOk7pQCsQmRH868y8qANkAN+92HxuE79a3mcpPYLx5bfJ/l QefdizrJmysgB+pgqmgJjWOj/a/F16IJS9WyGrZJs+/G7EOVQ1hla2iG4T9NYizJA+jSfCRiTp3 JJTdgUJKki25x6NfrpmuGeBG4VIlOhKgkomyj+m2sk9CEXxfjaRlyHotL5P00ONcGymh3FT6FQG 2KloQ7mvKZCwcFSVaCK+u/yFKSQq2cWhXruJswHD+oPcJMhFAf1U+KBir7h/7oReHNV57rr1nse ThyJbyeCd2GNvbc8uTeR91Q8sSIfTNY0DViWvyYKWKgQfR/deTAnq1NZlTd1Z97YooBjUQrauSt 21nWsYca5kTnGz5VDh6I0mA== 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 12:25:27 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 A591C23E358; Fri, 31 Jul 2026 14:42:11 +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=1785508933; cv=none; b=B4HriYngpnMnEfZjmNWNpLDYnySsu/a27L62Q/QNT+m7F2EdZnu2oKBP6Zu73JqDYVArqHpTyTsr/YTO3PtKsRP6onbGfRiztBFQ9bYfDO5YzymxC6xcRS0pnSebuZFV1G4zI7ML1phbjDo43qbYc/MLNyNXBT2/lzv7mEexznc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785508933; c=relaxed/simple; bh=5RiVael6HHEh6JuPjEiFyPWoooHPpfwPc2C2XiM5rWg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=KGBNImOe3rYAmXFjmSiPpqfrMUPxDaeSY7ULGCQgN3oF/pNQutQDXbyiHJ/3OT6+NFH7/TAdBU+aYAnWfAWrBBgCEASj2REUVJKI8go8DyOsMtzqY4Mde2ODH4fJhTeijukijYiG4Okq0fwqPtXlKhgOazPnma0HV4tlbF+w6og= 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=kzNA7k4r; 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="kzNA7k4r" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1785508929; bh=5RiVael6HHEh6JuPjEiFyPWoooHPpfwPc2C2XiM5rWg=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=kzNA7k4ryklUc9EMMl2wAHFUUl3sPQuXVds7eUhSmtzjWxWcQOavtCae+iVGwut+b 32QFTB7kl2C47MsDw8PwrjclQmP52bGi+UdejfMpgVIwNLsFMqtWd8bWHXaPJV7g4k EgHsrzQUlTwRqPNZUGIo2dwR6/nD82FzP1oJax5b2FkMb4tFTtIHCPLzC9Sjyi58GI 8vNHC6U5HnJQGNgXEklAIpYerdxZstoRp5BvCldAm8TidfV0Rcsrdfanin/UFWWUDv UoR0Zch4KNg9Wl5Qr8gkWvR6xHtnp/u3pGkIDuKLBBpgqO/mAqnyh1zlGgTD1k+8dI u5TyTtUHwNSIQ== 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 470BB17E08E0; Fri, 31 Jul 2026 16:42:09 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id F285C48002C; Fri, 31 Jul 2026 16:42:08 +0200 (CEST) From: Sebastian Reichel Date: Fri, 31 Jul 2026 16:42:07 +0200 Subject: [PATCH v8 02/21] drm/bridge: synopsys: dw-dp: Fix incorrect resource lifetimes in bind callback Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260731-synopsys-dw-dp-improvements-v8-2-ac1e6a75782f@collabora.com> References: <20260731-synopsys-dw-dp-improvements-v8-0-ac1e6a75782f@collabora.com> In-Reply-To: <20260731-synopsys-dw-dp-improvements-v8-0-ac1e6a75782f@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=8635; i=sebastian.reichel@collabora.com; h=from:subject:message-id; bh=5RiVael6HHEh6JuPjEiFyPWoooHPpfwPc2C2XiM5rWg=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGpstEDCcEdMRIYnng2eKLoNbhnASyTU2SkRD zEjYZvXlX6dpokCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqbLRAAAoJENju1/PI O/qaA/gP/inv1v8tHaQ1Q7K4qq4fXE65HDAEcwClgu6gRxLMx7s2pHXQILbj+WTQuWsOnu//icZ 6vFRAoFJMOEpwuddu/NNJGyvBCZZxxprdRcNJit56wSea+OsL/qubMScGg7m9n1Z4BTwck+4ZCJ KPGD9RT39aS3G2Ch4hSEoBWHYNufne9kHaUf9N8YmjCQvU7JQFovEUU2qnsOg4FhjUeo9suoVwk ibPH3UJkU6HBPDvqYL0ZWGeSlaODnRRQgYsgibKhuMJ4GzaYhjZJw+x6kGjtMn1XmboNSrrK322 xztMPR8cbI5Qd0aTcZvhfgkIfiSh3l49iRBTrP6XC7U65Ja6py0MCdOff4Cz5RcNAbi6yOXMik8 lmGw9XkkJkxLFVpIWAjMCVzOnGL23ldDPmoS0DklJRtbqbqhzSbE8faZDSVI5ads2Dfry6hC79U FxTopgAQrm10jp+fMhbNeVDiU96Tw6nFD+V+yicgSpTdMw/AQPWR6My+pRWOYNah8NbaaDobZfg +vbcdPynE0mchN3M81rfXYqFgDspcb7H/LwBnePgWMZ/WyV39W97MSw9/6WNlCCEX5XcuVSRuYl UrXNvEIWk4fBQiheSP0UGFjXZVvHwV3D+aEzneGy9kCsXxG6+wchefSrOcp4npUAYg5ntzMu6X1 TFAVAaB/mU59JTOD5aoQj5g== 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 | 69 +++++++++++++++++----------= ---- drivers/gpu/drm/rockchip/dw_dp-rockchip.c | 53 ++++++++++++++---------- include/drm/bridge/dw_dp.h | 5 ++- 3 files changed, 71 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..7f8249514171 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-dp.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-dp.c @@ -1983,6 +1983,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 +2010,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 +2024,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 +2082,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 +2094,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 +2117,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 12:25:27 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 889FA42EEA4; Fri, 31 Jul 2026 14:42:11 +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=1785508933; cv=none; b=i7/NMoFPyuy8g4KbsrYdOo/3HEMiTxZwDIhZn9E8iCsuLCdGmT9Y4gtwVfXLWBB1Iyb5cLQJxTf6rvYahljc8ygsf2g0gj4m0JB3EWHToblbeCWq3WMwtmXpQJuekpI0TjzW9RS5klomVXpe8geQqnmTq4shFlFYucjJVFCu/SY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785508933; c=relaxed/simple; bh=6Zd4OqerlwYFnaNKsaEfTrdLQVTFpRQ12tFpK/5BhJY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=kz4eAUvuL9N+AjIt/11x+QWD5FFIXevjLCbmX72/R8fZ0DS305bHzO3SUM74PpQBEwnhJcfaQWBw06qJE5eFQOgqvqK7r0zDSAag2o8vzjte2ZlD07FaJQqGllH77O1O/H1fDW/MKYoZIIQMQPsH9kV/jAWnGXOr0iAtZ+zpPZA= 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=hyc8x1Bb; 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="hyc8x1Bb" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1785508929; bh=6Zd4OqerlwYFnaNKsaEfTrdLQVTFpRQ12tFpK/5BhJY=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=hyc8x1Bb8PPLWTsAgZxGikygGIa0kC307sPMe8wTnCma5Duv0TCDIO25KLaAjMHik sZbWMCeTJTFbNSpUH5LxSFFrlmySEZHGFhhQz6LP8DhzxBfhNkXdBjJ/fqDY9RBabF Lma4xBt6CGDN4PvX48iL/fD1d3wSdVVa7whnF+b8b7uH9GfrhMy+pcO6YGfUdd0azz DuGpWUCMmElWRPCdVcdxECcEshzsiOwxPCPrIDCq8+HrE3Aa4UwQz1A/fLTgM2TlXG EPxK5a5a7qnvqVyo+bG8MSx2VO65p6Wbxj98yQHQj41FSB72apQYS+eelRMkGA3I7C jBFHIDnTExg9A== 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 484F617E08E9; Fri, 31 Jul 2026 16:42:09 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 0007E48002F; Fri, 31 Jul 2026 16:42:08 +0200 (CEST) From: Sebastian Reichel Date: Fri, 31 Jul 2026 16:42:08 +0200 Subject: [PATCH v8 03/21] 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: <20260731-synopsys-dw-dp-improvements-v8-3-ac1e6a75782f@collabora.com> References: <20260731-synopsys-dw-dp-improvements-v8-0-ac1e6a75782f@collabora.com> In-Reply-To: <20260731-synopsys-dw-dp-improvements-v8-0-ac1e6a75782f@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=6Zd4OqerlwYFnaNKsaEfTrdLQVTFpRQ12tFpK/5BhJY=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGpstECUSFS0UuATzDi49K5jfLrdgHALtoP6U ERnDnCO7PzboIkCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqbLRAAAoJENju1/PI O/qa0EoP/iALzEtnGFHT7YRM+2ilE/+NXt37lixuptbvRSq2xnNObsWOq+yvBKlpiXGlI/Cucyt Eqy/hTkj39yc9m6ugwoA8vUx+L2650+31UJlXnq58H+yVYh2LBp7hGUQoutnTzKEC92sxUCdiaK HytSk8rRUBtrSnFewwsTqZ5c+/2zZM8LdaDBN2GInFBhAFgIi7pIMVcUrXGJeUfAUmJUfqYLpfY mYIkhHerxofXidru1yeJnonO3Hgax2eNnNVB7bug1PfiOf3j5vwUHQNMrr5Fnj/BDbRlOGO32gM gPb+ydDE98rrOZg8itEHeryM/fzUOHF5QMYOc5SaeOdd+cJ4iVqid7GJypZ5svc16gwa3mfRiMy nat/2bXmU6HMEEVp1bTm0eVccY4pS7C30bpqkR9AFatSwsmBta+nlFPABo2N71Maf3lUgRDQS3s 51McPGRdntPCTw7CKqeSgjX46M9H9psLgQODgdL8JB0+E2XYZNFErExr90pgSrntCGfXZVVREWI g36VgIjedisNopholbLYN6qM9DxVqOkx1bHX6cJJGKvCevvCOjIPhaEe0+4a/Kulccla2dVbjBP Pt7IErXG4zw72KzC9B2wr9kZ/NKzoH6keayUZ+kN7E1rVYrpIG4MEVKkMYls/Dm7D9SCNUXJoyW Fzo/Rnc1yHnC5ugEmWfUz7w== 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 7f8249514171..6289ed06e231 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 @@ -2027,7 +2028,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); @@ -2108,6 +2108,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 12:25:27 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 DEEC042F6ED; Fri, 31 Jul 2026 14:42:11 +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=1785508934; cv=none; b=CNeWJQ/o+zeYcweEEHQqPsGyvM/6/Uuka0ta4OLgG/ogr4AO6+yoS+nKqO3MU4ayZEVW2glO2FvAeeMtP6vvaznnwrzTcJS1FbvzvsuVsWcI/ilFJP8FMERx744UA1rxbYX1FErR/oVIx9HGk2HnpFxguSGSZiW1XDQI0/+rFxw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785508934; c=relaxed/simple; bh=67aod2y/NN3Z0/tR+63bhBBILIefJK85gRwCSfTU17o=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=s9Ez6BU/ZgblN9r5EviDlSRcOKvj+r1MtNXctLproF+KKcdb5KaxajBnJBHSMQQ4BUvyaUUPq7nx3gG7hF7I0coEdTG7B+55V5E2OpLPlagfnJYUmxWRAOJ5TYiXcf2dq5G+15jcLJO011C2E5YVZIa4j9TDkCrEwF/CUxFmL24= 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=lCZ8Q7sI; 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="lCZ8Q7sI" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1785508929; bh=67aod2y/NN3Z0/tR+63bhBBILIefJK85gRwCSfTU17o=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=lCZ8Q7sIO6icNPa1zc1qNzM8EBaOkmXd1Hhw6YsHpN1kFpzWNtehuXU7SVdXsi3Zl /H7T/DMe1gz9+mHNZXTSgZmkMRFABqORMMTjqH7Dg8Mk/qwmQ4dtsDdJbGAlI+k6f9 n9meeF642LcNnAB9GkofSECWnnacz50qVXqd3cVrpyiqNy4O/cPICzvt+m4HxhkfNV iNU1PPsPogL0bzLvS35wJ9+Y5ceLnVrOiOODoc3Y9yVJAhrG0D92vbGu/4KBtKLNwl RUONywN5wKlRDIadZol1xX1NNGDiwLw7WFOtackLY/suT8uorvZd30HhiQLQca0wPS mqw/TFs9U1teg== 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 4991217E08EB; Fri, 31 Jul 2026 16:42:09 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 01AF1480030; Fri, 31 Jul 2026 16:42:09 +0200 (CEST) From: Sebastian Reichel Date: Fri, 31 Jul 2026 16:42:09 +0200 Subject: [PATCH v8 04/21] drm/bridge: synopsys: dw-dp: Document missing reset line deassert Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260731-synopsys-dw-dp-improvements-v8-4-ac1e6a75782f@collabora.com> References: <20260731-synopsys-dw-dp-improvements-v8-0-ac1e6a75782f@collabora.com> In-Reply-To: <20260731-synopsys-dw-dp-improvements-v8-0-ac1e6a75782f@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=67aod2y/NN3Z0/tR+63bhBBILIefJK85gRwCSfTU17o=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGpstEAiiDNAYe6ydxJrk23XOS90RTpqdTZAV 3w6vGf3yhnmhokCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqbLRAAAoJENju1/PI O/qaESEP/RGU/Si0lmndkxUhc6ydkA6dgLRS1ot5p+2zBwW0Tz/CtyF+vPWVasjkkQAq7BNnP2B 8GfsS8dwfx808J3IUFhnGQku/4wClW9Lz5vhOfUrKDV0KIS9IUiC5K0jandniEzH5j/F3BJCWrP Dm8LrSiSO+9xseV4ziLz5cOTVL7HbwaA4PJvZWcVE81jRuuTNq/b/sZ+ablD/FQKWl8iW69ykOs 0KJC4M+RU5tD8yxyfsjC9KzxtFdeT1bJNG5LwS8286ueiqzMmxZi3TQ9DRyblBAVs6stJdIvjEk ulsKS/U5kBpuNqf4+nUFZCtOUot1V08Mdqm1wUFiy3s+EfdS+DtNpThwnoVFoHan376/9XyA2yZ AL8Ii0d6aek9tyXk3qgKdKav+HArBeqbnj/9vQkzEMNQsTQCKpGM1AL2cfttwSxt5rs8WIMi4xX QS+9E0WYuqtxylHq9PMIEmh//sDWIqFLgmxcjbCHu/2H/8V0zxuQ3ypUycYOzeKVaF28JLdcsj/ a5o14hD/IA/peyOcw3qSwYg/fTceEoWuZ/lPdz5ryavs6XZfPOXIHb5OJKyKi0UFDqKDG6kVpLq bBA1qgd4ZYldfO/cRsP2ES/7G2t25lSFL6S+mTt3TlpoFKw+ygZfAbFDAb1XIdF1p5t0OksYN/Q dC5bkNt3Hu+vOu5RBvHcpRw== 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 6289ed06e231..a8ae13cf91d6 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-dp.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-dp.c @@ -2076,6 +2076,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 12:25:27 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 CF18C432E8D; Fri, 31 Jul 2026 14:42: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=1785508936; cv=none; b=UHjYGSko1PMW6DwcJsHGG3xYSNZdccS55+dcEv3cuAX/Vj8W5dockUCpHA8CzeJBjRkZ0N79g27o29qOLAGs/SSYzlrlyBOtlF4ObJgIodVY75ja1NY6WXkoDNt/7PyFNljqXRqGCOwT3jh4l583s/dDkcFMILmvkkiHR5WBgCY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785508936; c=relaxed/simple; bh=HDp7nK6Q5ULqvUMHN4amMM3wrIPnRYnDAFvGiKrp42s=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=cdpXTe7CJ4rHSvPzCSUNUCQVF3U5ecI/aEYHxvdcIMoes3D14HU5iFLSd2LGDcl5Q3pf19WeKZ2FqRZPso0DKx1jEb2u3jKl3XqknDp6si5/xPs/ssnG7omTI3LngGV+OgP+TmSw1VIggQUmDST1YpCjMXqgWDnXtsOurBrNlTk= 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=e2aehKyE; 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="e2aehKyE" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1785508929; bh=HDp7nK6Q5ULqvUMHN4amMM3wrIPnRYnDAFvGiKrp42s=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=e2aehKyEQY+4Pa1UgvmiWPKcLp4256XZKpKB0paebi6pC/DcRla2osyTHxKR9jHQB TOQaaoEOrNJAiN6pTAzFuqJvyLCPwwdEwRkpI7ztCEfkZiwZw1n1Faf6IFOQF9BlzI jFeWUsP5g8FlLNJ62lZbxZlX3zzybwTKl1+KYX2PaKxugjLR6F/ft8zkvSyhpKB290 yGEhxIw/Lovd5icy2XSCO0VIHzuKAAh+QtqcuQqbjpTgpwDxe51IjPAdgRjbS/olHo Eif4EbzbutUUWSjb0uXQh1Gb1ko6FjtBfvHmLvm+MPqH5SGfbbzcOehyjcAkyAnQ6b ZBoXmhJwvCy/w== 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 96BD817E08F7; Fri, 31 Jul 2026 16:42:09 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 03481480031; Fri, 31 Jul 2026 16:42:09 +0200 (CEST) From: Sebastian Reichel Date: Fri, 31 Jul 2026 16:42:10 +0200 Subject: [PATCH v8 05/21] drm/bridge: synopsys: dw-dp: Add missing mutex cleanups on module removal Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260731-synopsys-dw-dp-improvements-v8-5-ac1e6a75782f@collabora.com> References: <20260731-synopsys-dw-dp-improvements-v8-0-ac1e6a75782f@collabora.com> In-Reply-To: <20260731-synopsys-dw-dp-improvements-v8-0-ac1e6a75782f@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=HDp7nK6Q5ULqvUMHN4amMM3wrIPnRYnDAFvGiKrp42s=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGpstEDr/fxLc89mjUc98AaCNJ+R3wFwdbd1g 5YktnJKiGPykokCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqbLRAAAoJENju1/PI O/qaLZkQAJF3b9OgbX6/HNQnij3d5sKUhgT+KGEksimXz70PoXQclAtTFt3QnRhLps/UPkvOPDF 0gDVfuK6jbzfhuyfYC0dQYwJUbEchXBdJTbfk4nhnZMYzS1hb24e6+eyhJvMIwUQQNtmIqT4X+3 3DRM7QkA8o0qq3YNbfgTSJIPLpTeVqJzQmlMtnmiF26yP4tifuWCLvylBq/DBv11Mb7onHUdOFr bHTvKdAoA5bOlMX5N4ErPMEdNVl4WZe+zzsN5M1mqMpHRCmoDwB3ZrPahLPMuGKS+w0cEAsGZN3 gDfoZqCWVrb7rBrsaN4i9e1QYQ5Nr6x6jKWIN5o9pCkhJ9AaPKALJ2ytF0BdtjA/4Q9wsOYhM39 IzA0uPhELX+WLr53L7BgIIN8cPZi8Wr6N5puxkQqe9WJALTZ9Rb9omsMCboyUdZndG6HV9CIX1P SwpuYoeRuavkWvC1YMNWvv6U3yTRKPMCTvpl2ayxSYvBFo1yTVVYpGXprRwCDgKDozheO2N/Uxq ZdIavjoAMmToUGhEBWdt1OCz46JGE4oI29VAqip2gH+eSUoSOXZ1rYi09Pt+2RnalIJFSdEa3rH 6xlWluXORSh90Bo+Ch3xzJisamG3ozH3Vn0/aKNRcQM/8nX2iCB7iihpX6hXg+vdOgkDiGeKW2C 3JU2D6EMDR80+H4nrlsglBg== 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 a8ae13cf91d6..f373643a9cc1 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-dp.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-dp.c @@ -2027,9 +2027,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 12:25:27 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 CEF84432E75; Fri, 31 Jul 2026 14:42: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=1785508937; cv=none; b=etCZajNIpb7ruC0vu81wFyjAVbDzC82TKL06slh1D+QBjC25viTAOs15u7lhS83D5kuvNOyFBrFpa/ak7wB1Q86PGd9O+X+YlwvFR3d1NSTeu1yXSoJGfcp1WLwczff/nuyt0rCz7dxxoow3+Mquf0ttmgTwP/k1QvIhfTQcOVQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785508937; c=relaxed/simple; bh=qKOIeTSTf8d+lTXYraYHloW+e1z63oJfKmMqqagcn9M=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=r9HcULHL787frW7bPCYtJsTS5Yl3LNWyZ1r4etoEdpRUgaiO1f7c8r12xFqbo1yoZGXd5L1oY7kx8wewKHkla//Wf4z0+wrjlzXI1iS7tT9hHqfUWl5t69OpkvwPpj1IVkqISZeFnewL+pGYFTrI1BVop5WR2nKpQ18OCQkEMtM= 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=o6NjRxWv; 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="o6NjRxWv" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1785508929; bh=qKOIeTSTf8d+lTXYraYHloW+e1z63oJfKmMqqagcn9M=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=o6NjRxWv46+ke9429PxNetR6kEBdRO4BMdI43VXAwKXowxjnD25CDj3iQMV3KHFkR tt1ozoGkpz/u9C9E86nW7hHbJNhQ0I/3HRRFEihEu3Ream4j+p64wtynZscKHdqCDh wWZXT7xzdCXDlUsZqnd7yvwp1feOXEyZ8k0L/lPAWFgVw0kyRmywWnq6Q1vvxbBks9 Ze43fFzLSF6UCaa9ZI44k9SDXL0aYqpK7whGSbqP3+2Evi7/l+bEAVuOmTfnTm40cp JUgi7woXX2f7Peo6aMY/SjLFFN6YovSH3WDW/+lJdNTnIbro29YWn30VjiAmodxkLL Kt0/RogKy39rQ== 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 98B7717E0906; Fri, 31 Jul 2026 16:42:09 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 04D6D480035; Fri, 31 Jul 2026 16:42:09 +0200 (CEST) From: Sebastian Reichel Date: Fri, 31 Jul 2026 16:42:11 +0200 Subject: [PATCH v8 06/21] drm/bridge: synopsys: dw-dp: Fix AUX transfer timeout race condition Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260731-synopsys-dw-dp-improvements-v8-6-ac1e6a75782f@collabora.com> References: <20260731-synopsys-dw-dp-improvements-v8-0-ac1e6a75782f@collabora.com> In-Reply-To: <20260731-synopsys-dw-dp-improvements-v8-0-ac1e6a75782f@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=qKOIeTSTf8d+lTXYraYHloW+e1z63oJfKmMqqagcn9M=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGpstEBHFUicZhlEOUlcLoXNvcbdHQ8Ia8/U3 26C1/s7TwXqH4kCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqbLRAAAoJENju1/PI O/qaQo8P/Ax6UgFmWEB04GySPwCrM/CC0JyUTEr4hliFpEDpB/oGY73cNyfxv2F89YhEdImGble zQ7F8HvkyROWzjSG/auWIMe3TgFTakkGgIYnI+6/58gbvq5u17tTHAXckHjUI50hAOrWKpvAHDZ Am4n3Z0D2gQTAdOVn9yygXUZ3yaDazn62yjrs/orfOp1x3J+nf4mvkVOCIxQtsnzBPhfTUbtyu3 9v1QnOSLAyef9R6+Oy8g3zDMVBu4SbEXnMDDhtNNfBhMUIiXI+gtVzc9hf29RApfVGGqvQEDZFh 50TJZppomSZllSi8hKKG4qwNJlraCpGpo1Kyv5zvdR1fx8ZoWnNeVa7WjHj6YrErQfgf8kZSe6f YTAp/YtvnrpT5kzdbsSLy5hb6q9ROR0ti/mZSD1MfDaoGLdNYSloFvIYq31a+8d9u6nlbnuDb1/ HlrtqXZJpy5EGWoHUMZQbXNckh+QF4eFHpn09KlKYkqbWGRSpS4FHhdVD7m4kK3wd8tKRJVokSg nQPLvmiUiBonI0sW5TUdWw6K7JPgSRhbkZbVvttzPknCuisH34y4IrUjoelakb5RA8VXaOFGb8b 9gJpJPAtnWe73Wcf9CfAvNCL9eOmLbog2pMD+41qIBZFp6zX+MOLnoMvo1u98osS0mKG50xtQ+G fgnYHDBLqDOgDqUUTSDEwIg== 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 f373643a9cc1..57b6a8fc98d0 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 12:25:27 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 CF025432E89; Fri, 31 Jul 2026 14:42: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=1785508936; cv=none; b=L3ilLBzIJ1yrRUoA5Mbkb2AbJVMQFSIdkJgcquzwBlx9fX9Wkp4Bk5vZ0Yx6WUp3240QGV2W6wje1cTMeIU6YW8AgAbsfjLvpaaC1dEXg/EOIMY8nsNnjjCqQijIaL7BgqrS4LlGqyLkSLXOkeKg1Zd8mn7K7ZlP0XArKZnHLXM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785508936; c=relaxed/simple; bh=xXEUBll9y6OuU/YT7UswjnBGnWHXZmw9kG8eQXnPYWI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Q3TQeM4qzUdv+hcMoN36fE+1MCshyPsTxX38z364ioVXKyJMxlKxgSgWzYWVernYPWwcThaK6Mpk+WS60NUSrw5Kbv6F0qnCI7LB55PCNwnn47zvi5psya8BerPkyOJZ7GaZuUvsAnrjA0My2q5RkrF+t+Byhz10VR2sO+Oe67o= 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=XLA3w7Es; 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="XLA3w7Es" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1785508929; bh=xXEUBll9y6OuU/YT7UswjnBGnWHXZmw9kG8eQXnPYWI=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=XLA3w7EsLv1eu9smNNJYgjge7nU9o5A50HUxaNsZCwgrMx3mAvp8/rCw3hxU8WGAu pm//pYgbgP/sImpcMJQ29bxCqFQNgCllems7uGnTnUZh6+zSblj2uNHMjvzmKKtGOW Q+h7lCQbwQouX/BvHhDUomgyXxbynOum1w+OnajehkdGXQcfuMY2bpDyiFKvzrwlas 3zPey4wSqR/486gMst7e2DEYecyhCK4iaIcK339+0doUdUhWwmobljFTBgbTZ0ybIn e8JPz8p4u77gj9NQvL0wia1N4aw9pZoio86DLiAI6GW0JzQtjAtNdbJeBhuWNPcz70 XUgJU++4DVE6Q== 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 A0A8317E0916; Fri, 31 Jul 2026 16:42:09 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 067C6480038; Fri, 31 Jul 2026 16:42:09 +0200 (CEST) From: Sebastian Reichel Date: Fri, 31 Jul 2026 16:42:12 +0200 Subject: [PATCH v8 07/21] drm/bridge: synopsys: dw-dp: Fix support for short I2C reads Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260731-synopsys-dw-dp-improvements-v8-7-ac1e6a75782f@collabora.com> References: <20260731-synopsys-dw-dp-improvements-v8-0-ac1e6a75782f@collabora.com> In-Reply-To: <20260731-synopsys-dw-dp-improvements-v8-0-ac1e6a75782f@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=1460; i=sebastian.reichel@collabora.com; h=from:subject:message-id; bh=xXEUBll9y6OuU/YT7UswjnBGnWHXZmw9kG8eQXnPYWI=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGpstEAQh2CtbiplgbxQz6tO/3/UYpXFPgoF1 UXjkdynUMWlN4kCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqbLRAAAoJENju1/PI O/qayy0P/RpgiiOe96OD0ClUPwcrk8cEbEZs79HOcyfv5EdIxLptw1aqgzBHMUROMJ+Sc4SGPWu bGrzIT4zyoQDFmubk6rme/zStA/H41lGHcT5tyvV1wxGY+MoeFsN4SEwfGAfpt+2RvLOcalPt4Q nFlXx/ZtLb7ei2FlwyBqaom8slIGtkRrSrwtUWj5BsU95K0T0x4XKttlsqCTt5Y2LdSuhN9fzZ7 qBmoYBDB7RauxdcQTF+djEOaIqLhLJbyl0eIh3BAtBP6lzV5zRNieOe5yLZJYOd/CgaXLZbS4eH 1gDwGKUnWyLelj64PWNhqMvLRIC+YT6HIUEjLNItyLdGOAO/ZQEgA2dVSjzeqkU+sokmTbex6Q8 TkOaptX1I+mIuNFtRAFDK4QmHQ0MS11pXQ1/ThS5qbuSv3rpnpv2QUxYTUOE+LDHvLJWwcSBO8N Y5V6e6bhlxJHuDMihr3PiHGUpFWeJTk/76F9fYAxorlAApW1kZkajgj7jANQe0I17SaXHTUAMw0 Qtdq5jtzs3ypK1NXwB8n5F2X/wCOWKHBDHAUgvx4cUnnnztYZx30NzLI/jm5lYW8PjONPyXdUPM Tq6E2JcV199aRKGOWdlIH3mUe8O80It4JhP700qG3B0Y5lbdAK7WEj5keJpyEgpXtrriGJKigiD M58GeXDACH91sCnmqstIqGg== 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 57b6a8fc98d0..760e1e0f8234 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) return -EBUSY; =20 ret =3D dw_dp_aux_read_data(dp, msg->buffer, count); --=20 2.53.0 From nobody Fri Oct 2 12:25:27 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 AB9F9432E68; Fri, 31 Jul 2026 14:42: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=1785508936; cv=none; b=s0HflwztKwslxBuxeT1Hvj7PIhbIhK9JcbROb6zQply1cVMRUHDN+eeQ26ARD5uzVPrDFcmr8aPiPgvA9cK8VuPm2YbiBlT1nDDFpVjVs9hGRNSBvmDPxhJRyopwwW75wXvbS/SV6I6ltknAZ/9oASqQELR6eutVAHLDCXPCYPY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785508936; c=relaxed/simple; bh=jYYG820tXshJx3PU/SOR9UtrbIPIC5j6ESqL4oAQw7w=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Pve+Q2E+zhYD3HEORaNy1BdM7Cqo/4ehexz9wV5TYxKc6rP2RdPp5zUfV96hRhgZ1PBLBl/BXBOlHZx7zhpRJcq1f2soK4lwmwgcAxWRWNcF4FDP7BtYDp9AJqbNN+w9zzROJWX0uYA2gN+8ra9sIE2nxC6iwTRCT9KV6NEp5nQ= 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=oODs5DBh; 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="oODs5DBh" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1785508929; bh=jYYG820tXshJx3PU/SOR9UtrbIPIC5j6ESqL4oAQw7w=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=oODs5DBhfuTo8yal0/bXsNktyEo+arQ5MyiNiwH6Sf3r2NEVJYL5GVKz/HD7mbQIR 0df2h4uPY1dZNu7dSkMZAh/xYcbPum8j3uP0QlNYmez/YIJWfotmuqLsEKIieggEc/ 0SZQPGZa+kKUumZFe8Uqxr5tLF7VEngyOARCzsrt1rQ2a3vlnSaVtdf1YdfhPpxyT4 VXOhRUIyUNahyva3Y7BdB6GwBcruCPu8CImcGHloTH1OG1bjUCakSO3XGAX9UQwXBe nkopTGajh+GptE/Da7ZgD+fJbgFdayJfifENeywnDogP+K2NhlQAyYTVSjeaYlchTw woXfbRiGRnrMA== 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 A081D17E090B; Fri, 31 Jul 2026 16:42:09 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 0807348003A; Fri, 31 Jul 2026 16:42:09 +0200 (CEST) From: Sebastian Reichel Date: Fri, 31 Jul 2026 16:42:13 +0200 Subject: [PATCH v8 08/21] drm/bridge: synopsys: dw-dp: Free output_fmts when none are valid Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260731-synopsys-dw-dp-improvements-v8-8-ac1e6a75782f@collabora.com> References: <20260731-synopsys-dw-dp-improvements-v8-0-ac1e6a75782f@collabora.com> In-Reply-To: <20260731-synopsys-dw-dp-improvements-v8-0-ac1e6a75782f@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=jYYG820tXshJx3PU/SOR9UtrbIPIC5j6ESqL4oAQw7w=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGpstEBUYn0qI1l1hWaSDOKwxLop5NMwGr6PE JvmW35WJcUQYYkCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqbLRAAAoJENju1/PI O/qav8MP/RPO40ojodunQiZWBRnnkJ0/Ozwbu3sYPnpj0AvBVBHWVlDNo1AQB662oMAW15qc/89 fb5uamVVzKo41QZVuzEmDswVcdd6Hy6I5Xy5Zn67VsPB1CU1EyWDQ3oZdq7oN/GSe2tWigzfp82 ZJC4XdlcuRlJ78Zn5gB3Pul/fUwk1UgD3EchgjGTpOJiG+rHbwYo4sOb8k87g6FpiRpN+TbWRU0 x2onZk38LyzNdHj8rEid2I/uNdxs3WsZ8m1JP2EFG/+KYliy+enXUqhaL3to5XNuag+SXIyK1tK 2r6EIukRyOUunAc8jx2fN/PCIdofxV5V6Q/bQdNrLwcZHO3kCFCkCOmG4w6CyCofOzoiMN95OgA BFBARWLwFpcnxPYlMWbzx79vT9LiE/nZ9bJ9Q8Xy+l5+E1PORpjwyLUxxMQ++dvIVz246bE3K6J Zsz0VbcrVk3I5stANjFUyQNndgHC4fzEY7ZnGAMNTMXriv6dXchPC0F0nsxk1k/xkQ+9Zxb+nRq rL33qrKu4MtkDnynXAf26egv0EwURTG7LJ3Wjm/s+1q0Bwglwq8oGA4SHWYI+4f97s5b/cpondy cmJyxxZ0m/ns7P88G57obiFqx2M9fiSMExnmidWyFX5QVJiW1KCaq5Nfh5OnRyvECNnAHuP8aw7 zQXy4Q13pfjBXcjIYEZQwMA== 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 760e1e0f8234..7127928c2650 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-dp.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-dp.c @@ -1804,6 +1804,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 12:25:27 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 43EEE4322E7; Fri, 31 Jul 2026 14:42:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.251.105.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785508941; cv=none; b=BJsTqFrxc9ejsAoKFsXxk8jaTuh8yNzje/fYiFQZNRYJJCPlQVPA2x+JdYYP+zbAhyGTTF0SbCXv/NsR0dSAOUH71NpLjZpn5DgbaCwjTbIBRSJICtu58Gz+PpzHJXw1NdlG/19cXnfQ5tpSmkDbQvQ0XGkw2iwcBQjUKQmro3Y= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785508941; c=relaxed/simple; bh=xnajaehGeKqaSKIiYJaOEGQ01W5URX41oCYdG+inSws=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=nLzbbGFRbbbjphQLczE/T1uRUJptyM72KgVyaqXMFEonmBY7w4ocqm6V9TdmswdzkD5ds5QRQoH1N3l9y1b0w6kYE66MEAc8STSnmx+Y4NblnTFZsSWwdcgMw5rLcYoigk35R0TZD24lN479fTW5L7Gl43UcxBu6L8OO2FykfYA= 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=iWBZ9U48; 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="iWBZ9U48" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1785508929; bh=xnajaehGeKqaSKIiYJaOEGQ01W5URX41oCYdG+inSws=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=iWBZ9U48IBmQ+EunYX6JEJrXwp/0+0vrsYnpy1J9I9dqHmVLEJWeVCLo+A8nrYHR9 3qXYo7ImnGLb8Amiw+de0txge5GZiLuBqf3EPPd1sKKyFwZXRU8mV8Mu6nq56mmqzj 9Pf564FY23HCqDemuRbP8xBzyOs5n+PrbIdmoBz96wfvk6SRruT29nMWStm255k8Ab +Gia+SothP1qSQe0SrOo6xRbObSO9FquGkmHX4xBWh4VEXSdMiqikg1EIlgaefqyxY /OBmY+4yAhgkl8/9geZHcetdawWsQngF4ajCxqU3qdTGmukZdQrHYU9vBRzWvmnKuL doOS3wPQkIIZg== 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 A6A5317E091F; Fri, 31 Jul 2026 16:42:09 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 0995C48003D; Fri, 31 Jul 2026 16:42:09 +0200 (CEST) From: Sebastian Reichel Date: Fri, 31 Jul 2026 16:42:14 +0200 Subject: [PATCH v8 09/21] drm/bridge: synopsys: dw-dp: Support MEDIA_BUS_FMT_FIXED Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260731-synopsys-dw-dp-improvements-v8-9-ac1e6a75782f@collabora.com> References: <20260731-synopsys-dw-dp-improvements-v8-0-ac1e6a75782f@collabora.com> In-Reply-To: <20260731-synopsys-dw-dp-improvements-v8-0-ac1e6a75782f@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=xnajaehGeKqaSKIiYJaOEGQ01W5URX41oCYdG+inSws=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGpstEDF/O6nFlXMYotmPi7Paj6gydxBGAsAO cht73WLYlT1n4kCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqbLRAAAoJENju1/PI O/qaLFcP/1NC9hlZH+xFFCRuPhGo40b81NgQEFjg7VgSzHTOlAX7cm/aDlzbW+MOhEhSzmrRlh3 wkhlZVDKHv+rDvT1/7XM2Z1k+S3jL3W/DZRPhlNljW8H90QThXOG2UAgUJFRDiccO9+eq28lWNF qF68qxLGuM3EXcqXASkqkyVnQhc59ji0eIYfR25tQIGSNjtQ0jRyujdQSwtYKClawWnyMQnkyCZ djhNrcygXjBd3yosDHEfoqUkaPW7UmQzfi5f1d9fPN4HGTUuLhc0ziRqM5UTfEqFSAkyS+4Il7j ujwXiN/l7ergMQfziHbmCzRmvUosCiRx0ukoVejCVteNC7jrcKGvvfXOrGtgiXS6vGnL7WBGXHu U3wUQLkIhYzB28oyrIExfBLEbbsxXqpnQvIG/do6uBBod1VJ9DI5dkjocgrNVzQV8WA3plYPkP0 TfmM4Tsh/QogHJfEddh8KpI/vZw0rVGJqq9J8g5IWTZ2A19e7gy0SuaLiLPOTYtdcM/a9BYqLgo t9bT98mk9+/MdyG0g8mqoAZ9Yf7XGtorN5jlOFFOC9uadvEf9wVMAMHaZTbsoBiQyCgYnCWJaue /k0J00we/MKM2ZB5+PIw2+KbMTpqAq02NDDdmSb+j2vq7gq2JMBFjsf2Sch7ThJ06y4ZEXY9iup JvuwrAqldq1BtzQf7FxwySQ== 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 7127928c2650..42927335f0fd 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 @@ -1814,6 +1818,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; @@ -1860,7 +1890,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 12:25:27 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 43D8E42FCB5; Fri, 31 Jul 2026 14:42:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.251.105.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785508939; cv=none; b=C3bvrZu+Ig6KfffRZ0UVDptwGLqBNWTiB9idQCtnDt3iwfopzsueOBKPD8qMXKufe3oQqKA9vduYFa2aUhm+y/xAx++3ngNQSey63lbW2R/JGzUiEwwUY6LRSRCw87zdiSPQkPqiBdi+yQO7UelQV+ilqc5Msxw5e/r59YrjBkg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785508939; c=relaxed/simple; bh=rrt5YOOAgulVloGhA8XYLb7XVQPmqKwIeo2+VJPjwtM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Sw2Jhsx79K0+bEKGZMvAH4t0XF/pskhyTQTK9j6UIqp0bj6hLkq0/TNBuyLOBkYOSAqkC2+yWVJ6IzfzCS9d7VWTLdEWfK0CtHiGMjDEbw8EIaqvjvXsVqGW59aibOXhwiQFtjkAxTs5rR9EAv8TycJPHxgLX1QlnET+9wOYEzQ= 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=MtNpxYUi; 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="MtNpxYUi" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1785508929; bh=rrt5YOOAgulVloGhA8XYLb7XVQPmqKwIeo2+VJPjwtM=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=MtNpxYUi9XbAo1fed4Wm2aqPkXCznUo6OhXX301G+SJSaRxPb0e3l9XeKWoH652dy Gpx7Fan3FW1D61d5RrMh/dWO7wK5e5b+3HtdtrjpsK+yTxOtkCeRZe/zzk/hLCI/Qi Byox237ZWOF+p1Frn/AAvUbWe0ItliE4h2qjGB+yuLcpHzwQRFSp9IJ3tVUM6Hl3ax z0fa8bnJZZjCnqg5K/bio+7PUdOD3EVWM06U3nCA2hJNUMn20g8z2YdJNjx7JHNVAF VCspQwGXQDVMvhMhdI9epD26zPBhvYMW+co6O4uBSk32fEm4MPeTcDZmFkdIlw2gsR xba/81lqTiUKQ== 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 AB91817E092C; Fri, 31 Jul 2026 16:42:09 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 0B18A480047; Fri, 31 Jul 2026 16:42:09 +0200 (CEST) From: Sebastian Reichel Date: Fri, 31 Jul 2026 16:42:15 +0200 Subject: [PATCH v8 10/21] drm/bridge: synopsys: dw-dp: Add follow-up bridge support Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260731-synopsys-dw-dp-improvements-v8-10-ac1e6a75782f@collabora.com> References: <20260731-synopsys-dw-dp-improvements-v8-0-ac1e6a75782f@collabora.com> In-Reply-To: <20260731-synopsys-dw-dp-improvements-v8-0-ac1e6a75782f@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=rrt5YOOAgulVloGhA8XYLb7XVQPmqKwIeo2+VJPjwtM=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGpstECb1PZQPHkTUx0coHpDEhRO5v68sVK7Y xlXtNAk2100hokCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqbLRAAAoJENju1/PI O/qa47gP/2cAZf9HKtm/2zrGPQmMiKs1452MaG+YQ7iDQ/J0w3uIbSckJDW0bVkFtGEmOw3CSYc 9jDj0jFAljkb3viMlQnTvYaoCRXC94fPk88n19MfqILfD1+0LlhZnEsi0ulzTp67gSWNtPrRder nYDOu5P+fAJtjTTbtiep0yV6gz58BL9HRPzDDz1KgsD6EIu0wMqFk2MFxW61NUvo2jquZo6WyLJ Ybm6nlwM8c4JCoc9paTDOq/fZsP0sMe9uxnT6SPiW+2wNYpALLFkIwB3EdZoJwL8XLJQPwoJSqD h2B1AhQ+gEs1fQrgDy4tBBt9RhW7KYmXHDCfqm6BDt75pEK1jbZbKOKB/raIkr5anZgLXgc6ip8 REx8MGSff0EPL8zxhtecJUkpcF62o6axLsZnE2kveIzJ8duJZbYqydrt9PlmRiSzgdGX6wV4Plv yoveYAlhUVk2R6iq3oemJEmYveTY7xxKjK5KRCxFItT7pijzjl+gnZzxZFuDtxrwY2Nipk9wATS 9ebnEs9RR84UnAEfrQFSMzO1r3A6xbEk5wORNpg8KmFKfzr9cobeKTBnZ4bsVHYAn1t2x8qeTrn r4zlZh9KgiYwItaWjdQLjsjMJ2hcp+Rv1+YwC/dxtgu6f9kfLKbjGr2oON7KdvT32M/Tpz5uOJS tUgET7ma0mfDVukWFNvUuig== 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 42927335f0fd..7d42067df2cf 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 @@ -2037,13 +2039,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 12:25:27 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 4BA0043305A; Fri, 31 Jul 2026 14:42:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.251.105.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785508938; cv=none; b=HhpwXcWLvY8vOIs1P0exhTKAfOHF0uPKLZ6wj+us3HUir1TjoVYIojJ31TGYRdXfLdz+dj9hWBk1ahmAqD34SK38XPysaiatsq7kfmZiwL2O/JJNWHNZFC+pZUzQpdyFQp3sfQqIapr4h8sSBcjzSx061Rg00s0eKg2hNpH/X9c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785508938; c=relaxed/simple; bh=rAX8Gkdd0l2SvPThxGwSATdesygL1W5j4bmXRGpe4TM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=rw1h0s3ARBt1V8O2PaxzQr3VnUAnrLQlaxFo7wGl2+dPbmkoyLp6RblbPVI/Y3xqEv+66hKgBxfsu/sh4aUXZ8qaBltKbbsokRcbgNQeUyjcMKqCanzRM5CHwseDa/u9Y6+lrbAKyfz9FXZCFjJWVMcXcb2wW2nNAx0QDbxu5f4= 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=BzgoTAZu; 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="BzgoTAZu" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1785508930; bh=rAX8Gkdd0l2SvPThxGwSATdesygL1W5j4bmXRGpe4TM=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=BzgoTAZuLpIhChG1z9LFKGCcE9eLeJYj72GNPrzr2X4PfsrqY/ijCqUgTG/2dswUH f+Y4yU0y8SAfqfyth5rN3KZo973UXA+RIGdhcxtrtRHLiw6c3UO6uOvtfS8BJ1JbxO Q3Fzg87kyQeck5OATxVnPpXFmOsczJfXUnIGTgcTRbSscVovFbgLNZBSOWvSj43SKt hXj7W25MBgaWP5s2oVO9ihZo6k8Fj2jWph0YbJ0VMSUj2r/tJQUI6HzT/wKIKqW4bL 9A4QS6D+Ag5fakCfdOZKmCO+kDl1CAuJMi2wPhEDOrwPdsdyawCQc0J9TyXx42BL/u yjUUygFzcAL/g== 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 B348317E092F; Fri, 31 Jul 2026 16:42:09 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 0CA3C480048; Fri, 31 Jul 2026 16:42:09 +0200 (CEST) From: Sebastian Reichel Date: Fri, 31 Jul 2026 16:42:16 +0200 Subject: [PATCH v8 11/21] drm/bridge: Add out-of-band HPD notify handler Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260731-synopsys-dw-dp-improvements-v8-11-ac1e6a75782f@collabora.com> References: <20260731-synopsys-dw-dp-improvements-v8-0-ac1e6a75782f@collabora.com> In-Reply-To: <20260731-synopsys-dw-dp-improvements-v8-0-ac1e6a75782f@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+poByyZiAGpstEABLQDVMHJP/uS0OCzQUhxcaVi2JD9G7 61Rlu6ekPGfI4kCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqbLRAAAoJENju1/PI O/qabekP/02yh/jX7Z0sGPbbBmuCzOV7MMLqYfCl52UKQubyh23VuD82JslrDfbwbUNgzkTO61K JNEmH0aPVS3ngw6uedOIA4cJkX8gZmpNi45VQoMZQVglQcbCHptbyXxy6yP0fjbMAP04WkYGdWt I7xp0ywcY0mbmuKm0x7k3KJ5Eupagaj8+JyPTYynqHZfu2YKFc2FMVUCftvdIXO9DLSn4Gv2bRF M0B9zTNtcU0uRXpk+gd4gKfnvifMaLuSgExTkbIc45e8Z41IM/sk3W41iUZsZxCKOYyojPgMflS HQEvzNjbYZ2EX/O/XTJUIQYP0cS3EsXRSkcn2IWs/k5WRPsAsv1M+g6qz1EGdJveZVC92yVx3V3 Jt4ywSomCwgkUyqgJtxDCWRIYgJfOtly18utZawWreoQVtsijlyv+0o2bnCQYfP4nLUy+B1oifX 7KQR0FEDmTn2WN9C9PHrj1Vu5MO1HEhO9Stc+EQcqKC7Wp4/r1JK44KkipwQIHzBF/dhX7IaQLr jlmOQvgYdwUkQMWuGuWmnoFo79phQf+pX+zdouNOFhKzNAQFqEwg2n31ey/4Wf+L9a1hLVbLZ9V K6K3xBsKY2gYJ2LA/wQxLKq216vNH3nQIqDxUjJ2nD8BNEpmr+HuYMjaBzcI2LUOnvvGtutZw72 YK7s1fNDOtTa++NvGq2o0eg== 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 12:25:27 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 615354334A0; Fri, 31 Jul 2026 14:42:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.251.105.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785508938; cv=none; b=TG9l3PHAUfe5Ww18icP9Amr2ojIxsgYSczQ7ddZR007TBVFU0XReDGTlaUReF5XXfhj3w2ebR6d9q6ZMGl1g+yl/aPmX+i/Yol4LfP1I1iduGIMl3leJoMqqIMY52imppB/FD1BWGn1OzFKyT8NF0WKMb7cFO/gS3GK5SA0bJzo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785508938; c=relaxed/simple; bh=s0iHqJtCl7lHUc951fQ4n1fmrQDHo0lvrZa1beqvgZE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=qFHJXl4Q2ZzH17bzQobYLAE1BmzLIiQx+wSYonEo/sYGWauDz3cbN8MNc1EvVND1ii8d1f9vXnj5/x8xpeNqxuWmm42FZjXTFaYU6Nf5dJPhq3++2U3hMJuT68Rp4O2pADUQIhTwgcqRFyAS7xHn1GzIFErv9nOHPAjIYus5ZfA= 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=mPnBPsuu; 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="mPnBPsuu" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1785508929; bh=s0iHqJtCl7lHUc951fQ4n1fmrQDHo0lvrZa1beqvgZE=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=mPnBPsuuXKu1STq0MIALYNjxznzPeBM28tUsAmkIxszH1CrShUJg6gSb15HkrkuXw uivp4ofMflCoirCyU8flHifQMjy8RDVW0fhoD1t7mtVX/bwQf77m+bEEDqX8h8EvrP PkfUNpStH4Ax4orNHq507voXO2bKOXdTaKnwUXK/LyVGjOLNFWlSqT7ffSFXWk0TwM 8IYykMzw/5UkIq1EEKTa2m05SpZP/X+UwVXLJ0UAsYZhgLBS3VRiJytV0wo+bsczFa l3CfuLMAT38VZXsQpFlNPeahVZJj5kcLsMV+5o25vcAa5Bf2bSVpAdqR4rhK47GoFZ qHhgZxbz327Dg== 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 B62FB17E0934; Fri, 31 Jul 2026 16:42:09 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 0E40B48004C; Fri, 31 Jul 2026 16:42:09 +0200 (CEST) From: Sebastian Reichel Date: Fri, 31 Jul 2026 16:42:17 +0200 Subject: [PATCH v8 12/21] drm/bridge: synopsys: dw-dp: Support software triggered OOB HPD Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260731-synopsys-dw-dp-improvements-v8-12-ac1e6a75782f@collabora.com> References: <20260731-synopsys-dw-dp-improvements-v8-0-ac1e6a75782f@collabora.com> In-Reply-To: <20260731-synopsys-dw-dp-improvements-v8-0-ac1e6a75782f@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=s0iHqJtCl7lHUc951fQ4n1fmrQDHo0lvrZa1beqvgZE=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGpstEA0rFKIsgnd0TVUKFCZj1dJzQnqTW3Pd NHuVGV58AUu7okCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqbLRAAAoJENju1/PI O/qarwAP/3BUyiZTCwFR6gYSiArPzmybwlAhXjvRURMhVCj8/sLe72jsaj2AAc22qrhjQY6SzYO 0p9t2mB5OaxGQ3NnU4auDp8Fx0RxzkGyu+ZfxIjoeMP0QGoBj5A/BD7aMPYeLYsPzJ2NS81Lipu 7Vxnww48Sh9jeJqpdYwKVkYoBufoLQgjTQVck69n3cPzGwRzsAFf2QRye6kF5bja8L5hAyYFOms dipiAzH3iKX7p5MeWDpB2lcqrKrn5xCFnnrfNJcNUbYB9/jbJhkt+o+igCgY3BBl9e7kKSJ+f2B 0Vv57RYwe7ulkK0ovbd2QiTERoCeYL4UAQlV3UnoGLF2vyXPR+l1MeqnHv9K/9RH0S66KTayW8e YciLZE7fv4zBMPpWpmvR3MXdkRKMp6cTZXh3oKI/nuexpHOj3GzlUFq2g7bGPT/I1VrQUDU90Bn ao5j+iuyH7VWhtBZmoZAZ818Vu2nMVtxWzMR8RfwHJHHKp6eL2rTRQIFcNFd3WfvRm06ovDy/ii /Kh+wtkfuryo3JOQYDDnrjrEL064c9uh6F/JSrQ9qtGI7Bx3v/VxlJgU0lvmXcZon6JMJmNHB86 /4aA+Rolk5D2iHs+DYAdz8a8/5mGUc1sXhTUUnf7k2yobpZeeyPB+qmC8k8VYOnNiZ6DQxF1aVD tbRIyCze8Y2h4Oa6GfRgzFA== 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 7d42067df2cf..b21c2016dbd2 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-dp.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-dp.c @@ -1886,6 +1886,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, @@ -1900,6 +1913,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) @@ -2029,6 +2043,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; @@ -2052,6 +2079,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: @@ -2088,6 +2122,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 12:25:27 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 106FF2874E6; Fri, 31 Jul 2026 14:42:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.251.105.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785508938; cv=none; b=DmvxI/Yhtd1Jh7BhgNqlpLTQiLSjnQRg60kvKHBmpNgDE5aO/0HFX46PtEpaD+Cd64Dx6JZymv+1HksoZjE6vQ/fb9a9Dh4mA/MQvooPGi1+5ObBqqm3eiYUd3aoJe2ZyFZHnxN157ePgNjryAt+8t9Ribw1w99Itw566YV6pEk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785508938; c=relaxed/simple; bh=K2BbWak3F9Q2jTvsGbkaNezEQtxpB/CTjje1XqI8cJs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=C0P+Uw+VGBpXG3m4S2kXmrm/TCUwAvUK7zWffO6pJENiD1zplh1/ToLtPJKlENaNgDGaJOQwdA1Pu9Wz65qAS+s06jcvPtPOsF4VOekEOI2IiKnHsRUHEJdJQhPW+CQc1JlLE2Oi0y9v/Xz6D26QeFF3DrS6StiIJzMr8T2V1XQ= 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=XIbnfTov; 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="XIbnfTov" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1785508930; bh=K2BbWak3F9Q2jTvsGbkaNezEQtxpB/CTjje1XqI8cJs=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=XIbnfTov8CI+zFJE3Wez1sHO3FnU9QAdCZrQYxhWe871ioseaolSozp/xJT5qdu4+ HKDiI442lAa8OJkkzq8xG8Bl20oeQg/ml5qjUD2uX9DkEBOZVlXSUEMyPFDPsfeAVB LMexNAGAFvHkKw9r5UG04hDTMH3ifv2SVc5xejvHFE8Rcu58ZYRJI3mx/dwbuYTelm UesTKr64sip90qR93s75PBWki5F4SvKy3o+3mhwhIEx+/uWm1KrHGHLQpJArckU36N uhnq45XuBIF7t91iogNSMB3SAbrE9/TPl4cIX2QbAdXpdyR8w7d2pki6rh4rQBAWkd tXVpGO1p5IAjQ== 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 BCF5B17E0936; Fri, 31 Jul 2026 16:42:09 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 0FEDF48004E; Fri, 31 Jul 2026 16:42:09 +0200 (CEST) From: Sebastian Reichel Date: Fri, 31 Jul 2026 16:42:18 +0200 Subject: [PATCH v8 13/21] drm/rockchip: dw_dp: Implement out-of-band HPD handling Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260731-synopsys-dw-dp-improvements-v8-13-ac1e6a75782f@collabora.com> References: <20260731-synopsys-dw-dp-improvements-v8-0-ac1e6a75782f@collabora.com> In-Reply-To: <20260731-synopsys-dw-dp-improvements-v8-0-ac1e6a75782f@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+poByyZiAGpstEDljVLC02Lqn2tjeIrZLlrea05+8fIh6 1zOAqXphftG5YkCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqbLRAAAoJENju1/PI O/qamFsQAJeteMyuKwBjytLtNtYJsgKiMPyHh2dC+gvDgkWkh3hSmzmnYRSnN0wt8I6wGjAnUxz fQDU30n5XOdHrkOuwoAfXEbyXhuJBNVMYlWhYg/shcWvUltlZQ3p+zgs6mqy64BIRh089DZA+AK Wb7JSJc2d1LUvP2BUM5naGp7LqiIiNvb8hyW/uoEsVl101kGh2u2+GDdSQyTMq473oixbcIvML5 tOrAZNkGnCNj2uw8YT5kayqmIzq4/pPoIXWSH3TzLP4QBh//LhNYf7xNXtzoe0dLZxDjQOLFaaG fEaUt8bpR0jVcf70HWpz+bEFixMWbwGGTrkVLZtYiJb9bMLs2JF1X7kTqTxvr01xsy1V+DOQYbO trWSGu1g2zXj7vKhCGqR5dDN/fTLQ1+CnhkfMZzMg3LM9fvNfzL/8AG0NI6512ztmNt7xV9J3Fa i7ZdoNeenjZ6NT8n2EZSOq3E5rhWX383axejUIAssTeBaglKXuwKgn0XgM8eAlQC0J7qOLjfhEG m6nunzmflC/bmNYWyW+zTcrsNzECOgeb/Ij7ZTOSIHTcSbhm8oGuOF9T+If2sNovQLiDFnhZ/K+ ojmVCNo2oMM610GN0rieinTLg2UAYSUlDG8065L511KKDKbYhKKNDNnACPbL0tx8Tvc9j8pygAQ amRtfAqhz0afwtHBH/cg3Ug== 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 12:25:27 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 F2A5F4334C6; Fri, 31 Jul 2026 14:42:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.251.105.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785508939; cv=none; b=bwLxjlzxfftg7w4jV5R1w98w4gQk5fTZrb7tiFFWRAvPQFE0uGtM5/TvkAa2N/sbdG57qyAoaypcenabHcpEBw+a7gMNvt9+YMdrwYm+pBInMipjsv/clVYzWs9MhjG4p9dHhCas9akVO+X4pwSi+ub9WkKWzCouzrfeXvPGri0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785508939; c=relaxed/simple; bh=Xrr78L9inY1ao+TGuIfSIsLe06DKCT3tq2pIYXzKzXw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=FQDD8QdLtt/2Wzg3EgJ1PdgADfbEGlKYdtxijJe2AkFJtznrC3H/UZRMulujU34dkDUwEt2Bqkpqt+hjpDUPE968C9cy1gTj3qb/Eul9pkPgoEgfWaS5kRg9PHh3XhU7mNmKgVtM7ksUcMnBtSYCzu8RG1alaecR8DkyG7wjrO8= 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=Hl2lEDCV; 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="Hl2lEDCV" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1785508930; bh=Xrr78L9inY1ao+TGuIfSIsLe06DKCT3tq2pIYXzKzXw=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=Hl2lEDCVQ9snBBUTnZdhZ87Tb8cmxDOm/fwmdWRpm0YXiZSXGdgrqzTW05K+qKEOp TbY1RLgRmqmjENKalGyrWXjITc1vWMvaRy/nq4mBZIS69PsEM41Y5n+zcwpJKoAC1D cb6wgg5PePxUMoWfo4rUAY3e3EfSgY/t2/BpnXpL1zlvbkxcmyOnLIhFDXJPmjhqFR fUsuSyZ3MBymovgBJXdrD0Gbs1zLuESQcqBquhxzIPhYSAuvDjrciSCNjDTRlLaud9 fZ4Cm5WxJB3q9F5kSd9eH5XLo7Sdq2qhSx7vsGLH7rtZbiff9K4dG56aAvvJoHGK8w WMhTzWW12LNcA== 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 C31D917E0937; Fri, 31 Jul 2026 16:42:09 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 1178D480052; Fri, 31 Jul 2026 16:42:09 +0200 (CEST) From: Sebastian Reichel Date: Fri, 31 Jul 2026 16:42:19 +0200 Subject: [PATCH v8 14/21] drm/bridge: synopsys: dw-dp: Add Runtime PM support Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260731-synopsys-dw-dp-improvements-v8-14-ac1e6a75782f@collabora.com> References: <20260731-synopsys-dw-dp-improvements-v8-0-ac1e6a75782f@collabora.com> In-Reply-To: <20260731-synopsys-dw-dp-improvements-v8-0-ac1e6a75782f@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=Xrr78L9inY1ao+TGuIfSIsLe06DKCT3tq2pIYXzKzXw=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGpstECBy/wZbx5hVJCBED9H97aYuiPHWfM4p kC827wzX/QhuIkCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqbLRAAAoJENju1/PI O/qasQEP+wbQfOuxm49YDaTYqx720xQKVFFMol+5tfKsP1W6UyMd6BkOpcNwHKm+GGlqDjEuzxm IhrCVE6U9yHjb4dFvGjCCvZrGyUAzVQVvDrUFhaqzYNbVJeeKwwVJEhpSpHRtPX523Fd1tUUvhR lCsSqmUtqJixTl6eITfl0WtcmVBM2Ugwk4EYPbOm3YLgKYMOda/yyez59XX7qqcSpae7CDppTCe iz6ffjrtwQpTxSOvEB2UATPahFNcB8quqUADfWdkIb1nhtD4WOoQPRfuYRDNGna/jX9kk4hDw72 EPPVHEs8IWgExanw8eL+soFvj9/WPnfDgoifE49AnVJ4GSDvO0guRQLvezdi8rOsudvuBJOKr01 jCGr+msHdoIZ/XwgzHNMZb5uLW8FXWWtDIEfJ/AgRoHdcOYwAJPM/rZ/lXg9EnLwuWBoBExd+R4 s5/TAt9OHy4p71nsY0Oj4m2q8SH2A7mAlrc0FJCJzIR2pbZ3e8KSlop03OG5x1Mj1H072A4jq8m xf1Rocgm6skqgjyur07V1cxI0bVqFdFZJ5WUgugeBrWEkMDE4ygEEqGXcuInRMw6oAm8kcdV8G5 5n35hz9JnN4bGgkxI+p1Qrauc+dFir/VD7O6zRuGsyhYoQXZuPFZfc0kPy2LI0JZf0DZRBNepfO 0Nd9J5y9SHzWCjNusXL0dYQ== 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 b21c2016dbd2..c24a5436e8fe 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) { @@ -1666,6 +1674,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"); @@ -1716,10 +1731,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) @@ -1740,6 +1760,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 @@ -1892,6 +1916,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); @@ -1951,6 +1983,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); @@ -2062,14 +2099,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, @@ -2079,11 +2123,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; @@ -2091,6 +2139,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); @@ -2098,6 +2149,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 @@ -2108,76 +2162,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 /* @@ -2187,20 +2290,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; @@ -2210,26 +2327,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 12:25:27 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 95022437845; Fri, 31 Jul 2026 14:42:18 +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=1785508942; cv=none; b=AgL9W1wqWj2YhnTzcR7KX2JiaeHgyQT+LhqMKIzm/FBNMF43h1f9ltzrNCk6t5ykWPAgYDk5EIgQ6DnPXRMzgaqi+L26bm0QktulXZD8OC0FtlLjXtL2OZMgF0JbGsphN8t+OLFyGriND7ciK+yXOwCgkrS1Nr7zAsJ+NturRgs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785508942; c=relaxed/simple; bh=8QSlSuWPiGUI9AoT3cgCttdenutXBFd4174AAf6FMNQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=n5akw6NBOeh6KU96rSdXLKUiqKAGuGa39Dqlbk/NMKLPid0o3y68Wgy+p+JXVTokA/SW1E/SI3DK3RoT6ftBaRAvkB0mS9BVvbFGnaAi1gsb0+jSanfN8bPqSPJ1wLcazXayUWRTQNvaauxOYBXKJV2InlZUJF8mUYnWbWXRDiY= 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=RpW6soXF; 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="RpW6soXF" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1785508930; bh=8QSlSuWPiGUI9AoT3cgCttdenutXBFd4174AAf6FMNQ=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=RpW6soXFZ0C9d03s4tSeUnq6+zSO5T4qevnJFNf5yd2UOeCXf2+/jserYjLYkpOop Fep0wM3IneQ/36dT0LWWzAE0/6v74igOcF2atNqXQhCMljcAr4qhiTMfidl31fHtLx KpWZwm2W2jNOzPQA3Kg+nkUCdUOfD9Z4bTvaRj/qan3bPVHAkgj1nlDsHm9QrAsiIH 97Ru5eCrLL97dCSjjesddQ4B82MoCBPqfuFJEeDeAYUZDgJR48MCP0UVwXiBv0RQye 85RTCwLudJQops3qc/OAky1m9mxFb8snff4rIvPQJH0n3uMH3qLnr22GlExwLY3QF+ OenY+Vvq6ySUw== 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 E3FD717E093B; Fri, 31 Jul 2026 16:42:09 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 1301E480055; Fri, 31 Jul 2026 16:42:09 +0200 (CEST) From: Sebastian Reichel Date: Fri, 31 Jul 2026 16:42:20 +0200 Subject: [PATCH v8 15/21] drm/rockchip: dw_dp: Add runtime PM support Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260731-synopsys-dw-dp-improvements-v8-15-ac1e6a75782f@collabora.com> References: <20260731-synopsys-dw-dp-improvements-v8-0-ac1e6a75782f@collabora.com> In-Reply-To: <20260731-synopsys-dw-dp-improvements-v8-0-ac1e6a75782f@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+poByyZiAGpstEBAgFnkmOejF0+fy0EQb6cQC2uag2yRm tTPH3UlrUBdEYkCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqbLRAAAoJENju1/PI O/qaEhcP/09V+tpEFBCZRdA1zOBOVXyqkKpazKAPKX7rxFtNP2+2FOuyDSRYXvhsa0kfnLpuShz xpGMp4IRTkPTK0ySK4/ScsvcxODAWPMw+xHtc9Pbd6dKiU3dPfwKR1RjxpcYZlkVAhIqTjeyQd+ TbCr1XmQN0goqFuJZA4wtvmLwiJl12dMvWJv+WW1GuU1d8IeZdMV8lvqByOWcCi6yPmeM0hRHhT mHUIrQw6bTdqm/jT0Ij0JfRDAERKnyjfbcMGvfRgUgEQFyfiT1FM4ogd8VDqAsclkyg1GZkejh/ /EVYfTIWouW0agFqikTur4f+jWwpSU428fpsVZiZygDdrTsLBli3Q7PYeec+2QCC6BLapX4wbM/ I9ewKooiNBJ+2M61AdZiChz3i0PoVS4Qaul3jc5JKv2bCwuQ4bhZo+uQaVXUwJYsDm35zo6wjmW hgg59Nj2IwDl3/xsm5llAXVhzSuoeTpI/+mYbP3ZP0i+CemUpvyNc6bSDvaX7hlkMOKntVbPV5O K1k4ytSNTlyVsskLp0h1D9cIa2pMqa/zNj2Yl5lo590bZsxr6EGcN99mCb0qHKT5E6XxdhjnwsN YoVgoNTdaydQ4snFZ9ON6NGUswWOuTD+hf/h9tL8kj6YEm7+9hlq2EOGRJmo6ts53kmK6a1NNtl OEbkWc1GYDSooSS1F6xItkA== 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 12:25:27 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 95C85437849; Fri, 31 Jul 2026 14:42:18 +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=1785508940; cv=none; b=pEMQtX+hc5h4ziBMdai2ah4Uoj8ppBoaAcKz8Byg482nz7EML3RPWBj/3uzpogH7slz/BFqABq7j/Sr/9Fajc0/AQVO4sxoJQawSQyMRsGTuE+4dyGLaEo+rh2kljR64brQ6vVJwEE8zcJC3yOcGrf4w6PoDThVTo/Aoy8MiDlI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785508940; c=relaxed/simple; bh=kcGvaktytxMdj3Fa+4RFfDfEbkxVhoP/sR/X/1jGUzU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=nhsJuo2AGdRnAx6cNfSuA7Bvq6tywm+SW3avGtlsVchU3zMSxRfTsTWihHDId3HHf8NEqNf9vhDMoBeqQYzaLHjC/6F2TotewU4IGyH/6VQXDOTT5StMRh84NuJOwMUmN5jjfgBlPtjm4UWnD+OV6mRunhoqs7ROIWcJZhdiJoA= 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=N27ufUO9; 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="N27ufUO9" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1785508930; bh=kcGvaktytxMdj3Fa+4RFfDfEbkxVhoP/sR/X/1jGUzU=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=N27ufUO98XhH1nMkUDS+wHMp6VNNcWoO0gdc5IrWwOPNaC+I+xaYfLk9Yhz4WWbfW AZR1V2ej94d1lEBp5tDP9jkb2LLaHSjxvkiSCcHz+y3njhKw5cLmN4WHrcCgnT+/Se GEIvAI9hd5VDLv/0RryeVxImZEpUDlJTTn3xh+kQPC3wenJUcBC9xsKtKnXCCU43Mi bERRSba4slIyO1VgboJYQf00e9Mei5baJmnJuUiLrebCd2lXi9yjd3dhFf7hWINkAf z2o4dv31zOIBgObgBcLXc0Y4LvLtC3lu4RQw+wY+PnE+JmgjEbNUtIyFc2M8ofnGZc 3lNQE/1E809kw== 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 EA1F217E093D; Fri, 31 Jul 2026 16:42:09 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 14739480061; Fri, 31 Jul 2026 16:42:09 +0200 (CEST) From: Sebastian Reichel Date: Fri, 31 Jul 2026 16:42:21 +0200 Subject: [PATCH v8 16/21] drm/bridge: synopsys: dw-dp: Protect sdp_reg_bank from concurrent access Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260731-synopsys-dw-dp-improvements-v8-16-ac1e6a75782f@collabora.com> References: <20260731-synopsys-dw-dp-improvements-v8-0-ac1e6a75782f@collabora.com> In-Reply-To: <20260731-synopsys-dw-dp-improvements-v8-0-ac1e6a75782f@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=kcGvaktytxMdj3Fa+4RFfDfEbkxVhoP/sR/X/1jGUzU=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGpstEC2qoQmjtDwD9we6yoS8xgMssFVPw7LU I9qXoDwMEnQn4kCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqbLRAAAoJENju1/PI O/qacP4P/2YTglCuOW39W/Jjy2SvJa0kH1Eydj16rB+7HH3lDF0n3DTNQnXFHSPbKaEEx/+q+Np hvj/wbIRI1bleLTq41R2CSE++10iO6A06IF/hA4VEmtgrj6OwhUGWUYgomQsmB2thFZClE7UzT4 q+1VUfisMAuzow8H/aGhBsDA88+ZLLoBWx/j0ul4uuIWg9E6Do4BflNbfaZli5f28fxT9c0xlEe dJNVsPX0DebyqY/UEsyIN1aYpeIZykfvE70aiPuyM1CjklXsfpxum1/N5zSArp/ieh4IANYEdS3 vzHzGBILl6axp9wzAT/2vDBOLWFUA1utvq50QcpbbsD9nMFiY2AVdGd3woSeHp9f/733/ScL8wV ZvKrBsLq0VhtH5LkXQCjxiYIK4rbKPyshUcheWT06Ec5Vd4DAuR7sCL44fouN451VqyTJIF3PrY kCmdOUtIuiR2EeyHEFnhpRcKFWkkVFcLPiKHLNpAl1wUepH78QDyUc2reLLxBBppynGFK7xt5MM HKdzqtu2NbAhXokQ2aDoikgw9XUVxj6qiLwiIDXUCWt3SxPJ0uJw8oJR2FP9oRUyyNn4sFZ6tww 62UUFRaDugDi76uyJUNGawED5EADh8Y+zC/IhV7/FTkt/iu5a1byKuAI9I+JS+FHKv4cOu65lnf aw1j4ixIBCc+QUjoavYEigQ== 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 c24a5436e8fe..4d4af6a388b1 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 @@ -1693,7 +1697,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) { @@ -1737,7 +1742,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); } @@ -2237,6 +2243,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 12:25:27 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 DEF393BC69D; Fri, 31 Jul 2026 14:47:01 +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=1785509223; cv=none; b=b86nWGH4ZhHGQg60an25B5aUlD5hd7kKX0cqXLEZ0oW3GjIdrB1W7AZvkkjNHbZz+vsI7t2TC8Z+ldmqpCqAt9Wk4m5IPazbKPKu4bgl3JdwmYf+cY3yUa98iE/vOUc+DLB1gAjvhsmCHx7sv0Q8E71DPFrG7GV3WQxtO1LCNtg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785509223; c=relaxed/simple; bh=291eDcvGr6NzZPipwAOdXZWL9zpP+JQBfcKpB6JNiFY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=sC2HCMOpy56AXtGiiURvAYCg7tWGYUMQ8FitGczu5YcqZ0k8pjJ75xJ83pil6afpaiGS+xET8AUr0bHfAyuo2EPv1jdopZnC3c5MWBwnOLegzRNfYKxZNlMocP2/cceaKjdQvAlq6U/ILMr2JFrGTwHR/gV/JCYhl6TLluLzy0U= 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=Xlgse8Ex; 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="Xlgse8Ex" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1785509219; bh=291eDcvGr6NzZPipwAOdXZWL9zpP+JQBfcKpB6JNiFY=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=Xlgse8ExsLItHJ7/ZngrwxVXDGDYnnN3aPuE8+O/mXWQWVMyLH2wKfx1Jw+ZiUgia Mqfvwc5ZQZtcJJ1yzciebtTE3043Fp8cymhs11fgnpaBBIn4Br2RkSmxGTgBD7Kup/ 3L88lXRySR0gBTrl9SCLGWy4mCpTsYIOP6CAPfgFIPpYzDOg3KUtlJh0WTQTpdqihB Gl9FWAgdsd/g6jmWAWtS4W4TZp9RXlXvP94WI0e7YMfWFJEwid8ky5lzsbFoKAGS8E 9Oc6wZuiQXDn77X9ymRJbkcjo3LN7GHLMs8CXiTnPKZJDewUf/T1mTkQFIO4QjmBxv 7sjVtNqk3mbtQ== 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 998F417E06D8; Fri, 31 Jul 2026 16:46:59 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 15F50480062; Fri, 31 Jul 2026 16:42:09 +0200 (CEST) From: Sebastian Reichel Date: Fri, 31 Jul 2026 16:42:22 +0200 Subject: [PATCH v8 17/21] drm/bridge: synopsys: dw-dp: Drop useless reservation of first slot Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260731-synopsys-dw-dp-improvements-v8-17-ac1e6a75782f@collabora.com> References: <20260731-synopsys-dw-dp-improvements-v8-0-ac1e6a75782f@collabora.com> In-Reply-To: <20260731-synopsys-dw-dp-improvements-v8-0-ac1e6a75782f@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=291eDcvGr6NzZPipwAOdXZWL9zpP+JQBfcKpB6JNiFY=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGpstECRcF8yghVwi11OGpqkglQ2n0saSKxyA xu1ypbNo+tnSIkCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqbLRAAAoJENju1/PI O/qambgQAIpyTZjW/tGa2a6VBawOydNjwDFJ/IBENWuxp8P8xPn88zVcCgX643v/eFwGxTNOlo1 V5yAx+WBtYiVPSpKFwQyMpoSvVnbdsRuQpqgjpS9UH0QFgaRLknB9KI+ZXbmwncG8lPHjT7BQsN 7ZyrzRZzJ34ZW6a2xStQVSAjC7j7sIyOspilwJLb3JpX7HpAJ3Pu98e4E87B64QrPa4tkeSuXNg z1mxADA64qtAwjfKNjJLA9pmw6XSBoHN2qn7vBY5FF2H7+/57JmoIKpBl9jExrlDgqWxNJAab8/ ekoQ69lVydYtV4yaO+6cVN8tBvensL/qcVy9noYbDSp8pVzCwVIXtXo4J7J1uxjnYNzjaMQU3GC 99alH824bEJlJM3t2J+A2L/OEceNG4xd1FqWMNBAlL6obbMmrrwY+Xs5/uxAON+n48oP/3mCc9M oh7uVpPc5XO8/DeKmMWqfTN8jw6YOjoFLdxlHb7UVfFC74thC7ma7E5ZzJTF/eS8van3fOTkAkj qeUFy0arZg02pD+KaxSxLlu9VJNDJo9krf54de6ieZg5MplFTppUYC4dXWNJMIEUnBRt0VQ7NRn z6G9J1F5XPoqFeB60kkQSCiUJNxZzlAsBpTgYwElgmqM6b8iZmzCeEbGFCR2y507E0eIshiRcWW mJi8rOCMG0C7hzw5VB5kubA== 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 4d4af6a388b1..193816126e44 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-dp.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-dp.c @@ -1697,9 +1697,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 12:25:27 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 DEEA23B19CF; Fri, 31 Jul 2026 14:47:01 +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=1785509223; cv=none; b=hqXbu2M6mhPdQt8dpncHED133K+BRv8oYO+ol+urPwxbLEvoZW7x7OLtJSl4MAQDF01MOXleYxcDDiJIk8bZcS8iaNUjsGSPZo5m/Tc0NSAiDfuKMTC9qSmz7KyzxG6bTOapW9TDC4kLB0CpFWXOEmXEmHocCccKCy8fyVdzhRA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785509223; c=relaxed/simple; bh=sA6n2KnvSEaGkPQa1ltQhKRPY6bSR9ZrwCTs622Bkcg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=JTCR0+nJ9Xhj53ft/rgR02cs4GDbFFsNWARLMqfoUS/MlsebiWmZTouFXKCfLTie4FLphtyauVfykRW/q5D0WsELYU8Vh72BSagTj0dxNg7CrJ2pCfiBFeRYFpFuIUsTMoTSyuWV34DrNSYPJK19nmRJidt9/SESrcwlLPElCEw= 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=QKjctK5w; 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="QKjctK5w" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1785509219; bh=sA6n2KnvSEaGkPQa1ltQhKRPY6bSR9ZrwCTs622Bkcg=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=QKjctK5wplc07k/8nJcHHK8bCY5yzBHDVVIK4wk7mIfxDzO5leJP1i1c9kJ9VOJ87 XshCPgB5ETOClVzmD1N0K5hgxAY0klFm2lX516J/DIqr6qIUhOFKgsY8eUGSCyfR67 pkMKhIgp7+b1i660BccvvWEnOe8lUIqUw7N78ONJIRrMZah6r3fumnQjnydel4BKaw wz2tLFmCYDo0wLhAfi5uB0BZjjPLwK77Km0QoBPTxatbStyeSU8csic2uOM+HCE6HG kaAR3nyTTHoBLopj9gw4y9dLj1PcgXXiYgrz9IVsnr8dbuGQBaMzJ6YnO83ew3Pxh1 7An9eRoAGQSCg== 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 9ABB017E0700; Fri, 31 Jul 2026 16:46:59 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 17802480064; Fri, 31 Jul 2026 16:42:09 +0200 (CEST) From: Sebastian Reichel Date: Fri, 31 Jul 2026 16:42:23 +0200 Subject: [PATCH v8 18/21] drm/bridge: synopsys: dw-dp: Clear only enabled SDPs on atomic disable Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260731-synopsys-dw-dp-improvements-v8-18-ac1e6a75782f@collabora.com> References: <20260731-synopsys-dw-dp-improvements-v8-0-ac1e6a75782f@collabora.com> In-Reply-To: <20260731-synopsys-dw-dp-improvements-v8-0-ac1e6a75782f@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=sA6n2KnvSEaGkPQa1ltQhKRPY6bSR9ZrwCTs622Bkcg=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGpstEBR9IwxpVYWBl9gXgbpZ7kyXR8qYdMhe KXEeU8r/3IHcYkCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqbLRAAAoJENju1/PI O/qaq0oP+gPvxR6ppz4VoOZhM5y+b6HNwr9SCItrGYwBXHj+ke9h4M535bpLUkCSJO8M1UDiq7z 4tG/jy+fBrxooAXxDqHyWAX4QD3uM4cXNWW+mAGFiC2bv3HlM5cp8XQipiJQuy8cq0kuZ7+Kc9o fCLVywbWPKDX1JKk6O1FnxOEYPsWW2aGtBc1tmU/yexIzWdNUMpBxHWWYO//7uBBl/UzOSySo8W KBu6pn4RON8lUPA/gq+7AQUU6ivYWKIwAOi5PDuGP0plAIkqh1jxMOkxdeY7AN9E/cjDtUAQMxJ Mms+MfCM9Ook3KGF4Qndg6q7KtwXUx65KFjQKKhi0k7caFMxwZApANfjfw568esYHMfIST09xCa NAMSjL9sh1lV+UWhVIr7jfxMeEzsIsUyf3xxxlT2gx5HvjlE2ByFDxqIdd+Nwa1Y+uuTEor8a2R 2T62XUafV8vjv3c3yBmGjwXL7PG2JHXGr5p/kNrKAj+Ksxpg1k+vz5A3b7maK5Rj5HSCT7/i7mi JbjY5ur0BAp5rTNViSvzVlrYvN/wOuoIzRGO2GtsJuK/mGQnsJFUbsI64qm3XIi40cW1GpS/0LK PxQ3J5AIfW1HgILOLUyCLhScNLPCnvLobTbyRpDOghUcnhSNJ4wwHrYvGA+1vrOyFn2C6mF2IoM yIJXZSzjgfb2sXjwVTPorqw== 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 193816126e44..9b9c6d7c8cd2 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; } @@ -1739,8 +1752,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); } @@ -2326,6 +2343,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 12:25:27 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 71416437471; Fri, 31 Jul 2026 14:42:18 +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=1785508940; cv=none; b=Kk/XLIVJzqJ1FKoVjA1iN261ivUpz2KICxGqL3URYWrbMzdP42VMoupHrk+dUokkWT0C3VlXQFL65bRIDcAPG4GByHraMuIOZw5zImLfvdDfpKjGl3WAADFlDCm6ex1YB2Tbqs8lNhTApgP/0r7xg6bCLeR1DyVBT4vmiEeQmMk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785508940; c=relaxed/simple; bh=n3IX51tkpkD21CL9ldfkAQVrSezJGEvz0u6xDi+nsPQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=J8vldu1A8DZCOXdtCo/l6Zqg5uSL+kmsRQUrnC977L/nMf/25v1YEznrPFy/WK4m8VfYAkSxDdqPsDFX4eLDIzG6vye41prlHXrGSQS5U/nUX9TRHcXtYRLRMRZpFy8tx41NpprmrqH2t8dHahD5by97RyzvdTHoB+hea31INio= 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=lHv9n2hw; 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="lHv9n2hw" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1785508930; bh=n3IX51tkpkD21CL9ldfkAQVrSezJGEvz0u6xDi+nsPQ=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=lHv9n2hwdRdQoN0Bo/tqsTZlMVvMTTSuOQvSSm5wBb03pfBNBnoaKMO09HQs5A8dJ MZ4Les7Rkbre+soRFK+bg1AWo+rszQJLoHS6iNeCAvvXDANITqmv31sB9tbnr7rkwE 7MEsarqOOpwsCa5VSDZs1CPGjYzlkpc3Ft2Zsw4G46LShhbpecaywE1MT8RCQwvLkz Iox7f4iK+vAtiFXcBwVJDi2LXuJ+cOo+/BqbJtskeTWYGnVgIRIakUpkY5fceNYvoF m9iGt2iO3An1yHRf+w/zNA596XpotkCV72+NvCq4aPKq0ze5mMEpLoiYnLtQinfHux 1xZm7GbWZF1nA== 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 0749117E093E; Fri, 31 Jul 2026 16:42:10 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 18F9F480065; Fri, 31 Jul 2026 16:42:09 +0200 (CEST) From: Sebastian Reichel Date: Fri, 31 Jul 2026 16:42:24 +0200 Subject: [PATCH v8 19/21] drm/bridge: synopsys: dw-dp: Use regmap_set_bits in dw_dp_send_sdp Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260731-synopsys-dw-dp-improvements-v8-19-ac1e6a75782f@collabora.com> References: <20260731-synopsys-dw-dp-improvements-v8-0-ac1e6a75782f@collabora.com> In-Reply-To: <20260731-synopsys-dw-dp-improvements-v8-0-ac1e6a75782f@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=n3IX51tkpkD21CL9ldfkAQVrSezJGEvz0u6xDi+nsPQ=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGpstEAmiM7hQO4fCiWUrvhcE6MZZ8yW06xhO 5kR02XdGvBSKYkCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqbLRAAAoJENju1/PI O/qaWB0P+wVbj2Bigh3YaBXj9ndVlegoqd65W527nQuLfIfUk77oZ3boc5IEACZUUyZP6+L2nO2 24GjPuchJylG4ZD9q14QppCilHy/MmceXAHZlBLMpZpb+wCqXBcdwmHx1VaN9hi2VoYnByLfjmp RCz23aH+jH40O6/rTstUUDQupp01043mtnGRm1lezIIiNxfiFtwU6fXjPnAzjxzNzBQJE21xmHO ygHpqzahSg4N6Ns2VTp14X0pIOtaGlgHFRnv3ArHJQ1zy0TNjDLkn9x7Ei46FTr9Zamu1wBddUS QBg6juVu1iJg8PJ/KNRdwWDBeWNEjVcwWAfW3QfsYqz6mVFR9QoMd3KJ6nNB6p5qGeX4mFDbSKR QZnNrV395ncr9sHCO9XTZeXAe0Em+wfro+cmvR+bS5BN6yd+Y8WWSQGEArBvkU5B/jGoe57teAL e3x/uyiWxhg735dnSIgjAmK8Mt7HwcMmkynMbNuAU150UOkRC9AMPsMXy/FyXQz5FYnUFqErsK8 +CI2t4b2zyPdV3VjbBpLDJz2b+xgrBm6prpNhE3Pe+0s095DjHxxKzO9tPeEw1MKE6CIB9981hn yJ+z5BHtSHsugxNOnGDmWV3ULZnCLyWJSv4EY3EUN2fyz1qSh+YExoCRTrDzj3nLmEf7sJjesSY gayIny0WuzwW26dS+jKE2eA== 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 9b9c6d7c8cd2..a39007f13a05 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 12:25:27 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 9704D437858; Fri, 31 Jul 2026 14:42:18 +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=1785508941; cv=none; b=bnw45O/JnkfuWskPcZ6gCQq0pIvlPO4hyqwUFdh3PD/TF3MMNKNQzPAP/klfCRedulOmEz3ymErFL7Kj0XPwKl3VU7eKre3E/lDRnIWcIcxRuXrAyXWtX2Jca9rlgqFBMMD2hirDwAEA24eMT+0WChMmkynJJBS/DENV7ARjPRU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785508941; c=relaxed/simple; bh=SwF3VHoRiI4Zsf33YHjX0UHR9rjLn/pkIELQ2nyar2c=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=m0FZCwcTZVMF9Se7yuSCsBnk8jj4+mz3AQZ7ZyVOruvXiZzC6SlQgqcD0zkr2foT7kjt1ZLeL9jFHmimPwde7/nn6Xtue5LWcinujI3dqO3U8dNffOQP8aJwr6u80RVUsWGoowtzLWH3lApM6VTsg/JTg3jp/rz7IK7FrLXLO/A= 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=PGDQJE1w; 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="PGDQJE1w" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1785508930; bh=SwF3VHoRiI4Zsf33YHjX0UHR9rjLn/pkIELQ2nyar2c=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=PGDQJE1wu2rTNVK74o1BVXRR3bMbRPM5Bioi046QI8KtxOQRgnjeuHnd1BZfSCAxG 4HgbnQOtPHnu0lXnde4KqnT1TnKQJTFMQBpHdaMBLuMb6mch1keS6X6dy+MgB3asKz pl+lEnkJzV38935Y/bD5UyXBmLw4CJSGYgESB3zefxNo5xkxYqYCl5/5nlmG2Y8ok+ 4GCeRmHI5yGbMbw1rXeI/DSv9dthUcfS1ZkVMiDHCxG1nYtRv3Ux1lg8RqQ2K8vLWo ulIlQEGAM+SrM7FKYBQOwAo/bnz+i2ddBYpxyt/AkdDhp0OJohTVItwfobSShFxRSU qvki9UvBwB3kQ== 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 11EBB17E0943; Fri, 31 Jul 2026 16:42:10 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 1A515480066; Fri, 31 Jul 2026 16:42:09 +0200 (CEST) From: Sebastian Reichel Date: Fri, 31 Jul 2026 16:42:25 +0200 Subject: [PATCH v8 20/21] dt-bindings: display: rockchip: dw-dp: Fix sound DAI cells Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260731-synopsys-dw-dp-improvements-v8-20-ac1e6a75782f@collabora.com> References: <20260731-synopsys-dw-dp-improvements-v8-0-ac1e6a75782f@collabora.com> In-Reply-To: <20260731-synopsys-dw-dp-improvements-v8-0-ac1e6a75782f@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+poByyZiAGpstEBuVYmo/gc1yooRF7Q5pSqVy6ElAigaE 1JVGu8Ic88DK4kCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqbLRAAAoJENju1/PI O/qahrEP/2S/ojkgdjhY+A+syYFVUzDN01FYSgajyDOj9MoPlp+tQ6lb1Ig+z5a3jgqm27nP5BS AVhF2Ca4uK4NmKt82ZGHFuZun8tIky7tkqNgbt0h3A4IFS/OOoIXYZN1UkaFHzGcjL1ip7vpODZ KRmmyoi87GRpMppXv5zPhWSgMjYtjDJDx5ZUCOnr1YWbgXOZc4fFky7VxX4N6j9AG/NJCgFGis2 OudqwDCScH8d+HDsubNnTdQrfv74rcHSwSfn6hT3wzfQduD+BXWz5mBfgaKMc3FjKCVDC9O5hDb b/F7B//giitBCnYvAf+ncP2UerKbskD2bFc+psk87AaiZcu6GywsXWwQAH95rsvyqqO9jC/B+0S wU+uqBzFs5p1wcH6nJB7NoklGiR3qf0bIRf5plyZ4ZzQvlJn5VrjdZzqNSWjEJht/0p00HI6pdx n/rlez2VkFAsMeNkNO39D0omxpz27RXp+OJYux96BfpCQiA/D9UZAm3/kTNndkmVnDvIsLLYvhq q4H1CSrP2mgJJnAMR6MTXJajtAQPvMHIfrjpEWYjCrck6LofVJ45V4gYvWh8y1h2ZhiLKuuVefs 4aDbvgkoGj/Z5KWpM6HkCJwX3pODMoL4r0gRdGuJJh1qvi7vdBYdYNvVu7rQLaIILvuNLWYf/QP 09v22i26WMSpmityxKxAvwg== 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 12:25:27 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 A78173546C3; Fri, 31 Jul 2026 14:47:01 +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=1785509223; cv=none; b=NoOcAhWnUnonnLukKt9qGw+Xq2+m9f8JpyBa/uHe70pkcO8fZz5g0/WmAumnDuQurbWeGwIxNK48p0oiBLI0NYcEvYyLBQNAPh3EcFeXzQk7uhXMwEy8KpHsDq4Mx4YRi4uFmvjbQTpGLd1CbRSEkcz1i4dOVgeoFaCWATVKrGw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785509223; c=relaxed/simple; bh=+s2j1RmaFG+GnT5Tf+KSig25vVLZBCaUGSWzNu7tZN0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=lDpKqh4HOE9avm4mbd6J4uSmjKNf0iFPpUat5nzAKcFYHgtx24HeKYzMWG95yEeRzHK64fDJE8bwnJqUI2xYCngoeft/mjzcyVFJByZVz0GQFaGmtK5hOmf6nJBSHwVNVLKKpmq6QPJ/n2WVUwxsdxkcSUabBxTXpiUznYk/RmA= 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=GlKEIfzk; 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="GlKEIfzk" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1785509219; bh=+s2j1RmaFG+GnT5Tf+KSig25vVLZBCaUGSWzNu7tZN0=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=GlKEIfzkIOd1T7zeGsFu6eaHpTLc7DR+sPo40SXpuJOgCcechu88XLgcljF4rDVTI iw4BCQciIR35rrgJRJA8kAuncwfoIc8caGropdhyoPlzLuWuRpJHM02y+x6gG59zkI e5NuPB3cWkzFfYE2xnWQg4wTPSgRIWX1dR1FxCyEtkjo1So8D2quJTg/50VtKfA4V0 rOzEGj5GalpTFjhZqwOOhxP54gCFasE7uZFFBPETK+xYmcKoUe2deszQIU0i7zQUN4 viYgC4jPp9BXWms8JKvdIDvC/IcBSX5ZAGbbcobuKXvBMB4igoYemyP2PHimIYXg5D LBvyl2fTc/OtA== 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 982CE17E063E; Fri, 31 Jul 2026 16:46:59 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 1BE9F480067; Fri, 31 Jul 2026 16:42:09 +0200 (CEST) From: Sebastian Reichel Date: Fri, 31 Jul 2026 16:42:26 +0200 Subject: [PATCH v8 21/21] drm/bridge: synopsys: dw-dp: Add audio support Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260731-synopsys-dw-dp-improvements-v8-21-ac1e6a75782f@collabora.com> References: <20260731-synopsys-dw-dp-improvements-v8-0-ac1e6a75782f@collabora.com> In-Reply-To: <20260731-synopsys-dw-dp-improvements-v8-0-ac1e6a75782f@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=11879; i=sebastian.reichel@collabora.com; h=from:subject:message-id; bh=+s2j1RmaFG+GnT5Tf+KSig25vVLZBCaUGSWzNu7tZN0=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGpstEAl02NzUAiPWbbrQNABr1BYUPZvJj2oG jxY3jyDYVMwtIkCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqbLRAAAoJENju1/PI O/qaqEkP/3H7Rq6clIK5p0OU5xGBlly+DX7I/Ik1KWKiV0X8u2NY7xdx28Ti2I4yFtP2a/2ZQzO NHas32Jo0JxERNzcoMc49KGipA1FIzDsD3EYNh1JdHEqVETKmbQyz01yTCLyiBvo/tz3u3UpW76 OA8Tsq0sXE3gcjjFOUBVmwk2GVJcO6qCkLlgx5+B/nFxvSLW6trLuayIBOnSkdICZ9zy5QgI2Yg q6vAO3GUFPvr5X/uQfuSPgi5DrYueDY5a4JbcyHxmH9+57GQTZJ92wx6kJsrTeJkVX/gYMY97F/ MJUViH16AdKW7l6lWS0t7Fn1V4BZMSjki0VYEydstCE6QhN4rhyhPSCdyx4wnHeiC1lhsm06RMy MSf4JwHFFuRuF6PP72ydX0bDSflnKAR1F1C/3mOlWmcBylxWf3tZNYqPnKRkMGJitVTL+uUF82S n4EEVgMjMOMA9Svh7GBWWuOMC8Ayuxzdi/QRPtK4yumgTTjc6L2hMIipTM06GZ4CSZn6lopzPEE H1fThIjWbuE2cAKfkzZw1OJ0N/vhezksOQFSt+EE5xABN6iNLY4ji+UfU+UJksyZcW8X6g03rpJ 39xo6hFWk5C4eB4Aec1zpbRgi8/EDGkYV6ftnYKHM6Xu/48+w1kIYVizmYgoevTFuvQgrp05USD rfdCJcTyPMcZTgTen3uUoJg== 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 | 305 ++++++++++++++++++++++++++++= +++- 1 file changed, 304 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 a39007f13a05..a62fca20ac2f 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 @@ -1681,6 +1712,252 @@ 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"); + + 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) { @@ -1719,6 +1996,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) @@ -1964,6 +2249,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) @@ -2259,6 +2549,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); @@ -2342,12 +2636,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