From nobody Fri Oct 2 02:36: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 EF94634F497; Thu, 6 Aug 2026 00:39:12 +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=1785976754; cv=none; b=XKcEGW56ylLy7I1qXP2QW8bPVwLLZ5d2xAOeorB2l9uJKCyhISUmTL30SM+xSuKIrfI4M6DR20Htdo8DK0pwWGT/R8kypUYePx5Gq6wKNA/wMf7fF/yPwj8z3lzBa3bgWwZCUld4O15yRRATdBaYq3EhMBDKu2xT2SL2dy8SNwg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785976754; c=relaxed/simple; bh=+kI5bMPxmKszrrlmZRhrrwGKt5vlPS+riQK99NPB3wM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=n0fwRwqOi1iZVYNMoZ8TF3DdnfQGHBfzz1cq9Qft7BXivCMiRuj07NkvWjb1ovRf6XjW70J/ipfuN5wuQVjIT9H5Xq/7JNst1N4iVLRtH7byvil6Es5w0r1IXlAlgAdMxaokN7U5c96+Nak1lfQSmZPEbsVr/7mKJdFVQagfFnI= 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=QAy2JK5k; 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="QAy2JK5k" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1785976750; bh=+kI5bMPxmKszrrlmZRhrrwGKt5vlPS+riQK99NPB3wM=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=QAy2JK5kux4tSxZVKkdlsIDYAt7+WrjtAEZEmG7zWFvKVCZhfyXLKtKdaZ7hmrAbI 6Zl5yn4lGVeCEtbusiDza0XLFhx3oiT4wZpoKCuRjqxA43477vYfHgLCJeZEcRQZlR zAUg8cdIbCaq+D/kledrJrK0+6JJs/nLPhE1vl3zR+mktG7lO9Oo4GvGjpnxNAAA9r JPjlwFMr10VXhKs125Rno7ibhXhvooix3YaWuYx7Hge9KcrAKVKbU9oxrHD8NgaCdg SJfO0BnJqs5J2A/OubrbYh1cKeF64Eq7G6MCcEsoxAd5DGLBVPM1od5FTeIkti/JGE 6ppiV8naz62oQ== 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 D29D517E052F; Thu, 06 Aug 2026 02:39:10 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 87D1E480028; Thu, 06 Aug 2026 02:39:10 +0200 (CEST) From: Sebastian Reichel Date: Thu, 06 Aug 2026 02:39:07 +0200 Subject: [PATCH v10 01/21] drm/bridge: synopsys: dw-dp: Register DP AUX on bridge attach Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260806-synopsys-dw-dp-improvements-v10-1-d84a26c303d6@collabora.com> References: <20260806-synopsys-dw-dp-improvements-v10-0-d84a26c303d6@collabora.com> In-Reply-To: <20260806-synopsys-dw-dp-improvements-v10-0-d84a26c303d6@collabora.com> To: Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Rob Herring , Krzysztof Kozlowski , Conor Dooley , David Airlie , Simona Vetter , Dmitry Baryshkov , Luca Ceresoli , Philipp Zabel Cc: Cristian Ciocaltea , Damon Ding , Dmitry Baryshkov , Alexey Charkov , dri-devel@lists.freedesktop.org, linux-rockchip@lists.infradead.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, kernel@collabora.com, linux-arm-kernel@lists.infradead.org, Sebastian Reichel , Sashiko X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=3652; i=sebastian.reichel@collabora.com; h=from:subject:message-id; bh=+kI5bMPxmKszrrlmZRhrrwGKt5vlPS+riQK99NPB3wM=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGpz161XxASkSlzZQXOp8/+GsmxmqBn+xiC0U 8UxrMEnInKOXIkCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqc9etAAoJENju1/PI O/qa4y4QAIFJsqPdLNa8OBIaOQF6MJkQIkC8pcs6SK/c4+xA023pmhhGsLWhhj/khwNfrxnNJ3s iEODziZZIezGptie9elbk12yG/rGOnyfC9f0XL9j+GZVXtpQUGcU67q0UvOWl3V0o8JvsdFr0UV 9KdTzWv3X5BSPWSOfFSUNSNt5XZ3gytoOPJzfJyE81EG7nzKqPuD6O3buyMi0/vyo/kvcqC3yhN gzKLEntc/h0Ct8+sWFtPWSo0Hn+zuCbnTIxfZuKMnL9hZ4U3L4nGIIPkEpKC2pCaIp4XuRR9xbF SgnGLgMG6sJ8uR7n8hEX04UpCJBis6ectLD/2yR7j9CH+NyyrlXnwMbFywJ6BG8JnwXv/LGh4OV RUfb0lbPYWGYW/r6ls2KPCOM20RJna2QIZlFYGUZo1Upzu1D85Mu/LDR8MP1zj2osV18G98AnTU 5Z34W7rr3BHZMvtpFcCbOd9pJDnCi4JKZkwWEWRxcmeDnk1bjwygfy99kmzm6eVqiaVeugaeo4W kehok619CAuHlga9+l5WLGDFdmTCGzYoOiNumryEO+Fsj8F+maytlnHASNcBnm5lV6Y/8dNMcpP r+/ZQSu9QkVECHhRjbFXWmRawNSRU2KSh4wD8ZLr1yANMYdMSXtzuEnR4yfU8y0Hn53o2dKeOpJ ZCCiL1kOu6GJ7mD6femcy7A== 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 8b8529e1723c..60feb3d1e14b 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-dp.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-dp.c @@ -1813,7 +1813,36 @@ static struct drm_bridge_state *dw_dp_bridge_atomic_= duplicate_state(struct drm_b return &state->base; } =20 +static int dw_dp_bridge_attach(struct drm_bridge *bridge, + struct drm_encoder *encoder, + enum drm_bridge_attach_flags flags) +{ + struct dw_dp *dp =3D bridge_to_dp(bridge); + struct device *dev =3D dp->dev; + int ret; + + dp->aux.dev =3D dev; + dp->aux.drm_dev =3D encoder->dev; + dp->aux.name =3D dev_name(dev); + dp->aux.transfer =3D dw_dp_aux_transfer; + + ret =3D drm_dp_aux_register(&dp->aux); + if (ret) + dev_err(dev, "Aux register failed: %d\n", ret); + + return ret; +} + +static void dw_dp_bridge_detach(struct drm_bridge *bridge) +{ + struct dw_dp *dp =3D bridge_to_dp(bridge); + + drm_dp_aux_unregister(&dp->aux); +} + static const struct drm_bridge_funcs dw_dp_bridge_funcs =3D { + .attach =3D dw_dp_bridge_attach, + .detach =3D dw_dp_bridge_detach, .atomic_duplicate_state =3D dw_dp_bridge_atomic_duplicate_state, .atomic_destroy_state =3D drm_atomic_helper_bridge_destroy_state, .atomic_create_state =3D drm_atomic_helper_bridge_create_state, @@ -2043,20 +2072,10 @@ struct dw_dp *dw_dp_bind(struct device *dev, struct= drm_encoder *encoder, if (ret) return ERR_PTR(ret); =20 - dp->aux.dev =3D dev; - dp->aux.drm_dev =3D encoder->dev; - dp->aux.name =3D dev_name(dev); - dp->aux.transfer =3D dw_dp_aux_transfer; - ret =3D drm_dp_aux_register(&dp->aux); - if (ret) { - dev_err_probe(dev, ret, "Aux register failed\n"); - return ERR_PTR(ret); - } - ret =3D drm_bridge_attach(encoder, bridge, NULL, DRM_BRIDGE_ATTACH_NO_CON= NECTOR); if (ret) { dev_err_probe(dev, ret, "Failed to attach bridge\n"); - goto unregister_aux; + return ERR_PTR(ret); } =20 dw_dp_init_hw(dp); @@ -2064,37 +2083,33 @@ struct dw_dp *dw_dp_bind(struct device *dev, struct= drm_encoder *encoder, ret =3D phy_init(dp->phy); if (ret) { dev_err_probe(dev, ret, "phy init failed\n"); - goto unregister_aux; + return ERR_PTR(ret); } =20 ret =3D devm_add_action_or_reset(dev, dw_dp_phy_exit, dp); if (ret) - goto unregister_aux; + return ERR_PTR(ret); =20 dp->irq =3D platform_get_irq(pdev, 0); if (dp->irq < 0) { ret =3D dp->irq; - goto unregister_aux; + return ERR_PTR(ret); } =20 ret =3D devm_request_threaded_irq(dev, dp->irq, NULL, dw_dp_irq, IRQF_ONESHOT, dev_name(dev), dp); if (ret) { dev_err_probe(dev, ret, "failed to request irq\n"); - goto unregister_aux; + return ERR_PTR(ret); } =20 return dp; - -unregister_aux: - drm_dp_aux_unregister(&dp->aux); - return ERR_PTR(ret); } EXPORT_SYMBOL_GPL(dw_dp_bind); =20 void dw_dp_unbind(struct dw_dp *dp) { - drm_dp_aux_unregister(&dp->aux); + /* nothing to do */ } EXPORT_SYMBOL_GPL(dw_dp_unbind); =20 --=20 2.53.0 From nobody Fri Oct 2 02:36: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 89E1F3783D5; Thu, 6 Aug 2026 00:39:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.251.105.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785976755; cv=none; b=Q35nVtKWnb+0TEPRF0qIkNPqa+vb1YnmOv2Trkq7hv7HHKwK07H3z5iBFxt4LwsInWjf48JYybp1Axl+BmW/h/op5RFN71KlxF1UdbZOAKHvPfbBqS8KAtT+WTHT5aTLWGehYuQ7OL1yMPd92dYNChGcEHJhgC2+JfikFYDTl5I= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785976755; c=relaxed/simple; bh=3y9XVGsi3/yyJycZN6gmewCagZkhDdkl6EYAyiUDdyc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=FdACIte6XCawXkMzxq2YeHr5I+rlmoLMpH5szQWAs30vkbtoEjNY1/67h0crKVNeyux8oXqABSoa1euhcdk+OfPwq1w3S2aweOa9OX0z1Fz/92EI6VzomOWe64PDV8zcCcjQkCQPI4ekRS5fxrBg8m/F9mq5EXeQl9q8a6zSG94= 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=XYUDFpn/; 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="XYUDFpn/" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1785976751; bh=3y9XVGsi3/yyJycZN6gmewCagZkhDdkl6EYAyiUDdyc=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=XYUDFpn/LtzuFa3Ui69kkIMeNP2BHuYwj9C0EnC1bcahv6DdT7IZUJjduRvRYuCGJ rzTPnCs0I6HfrBfv40VCII/FsD2AGubbSYEdqjSWSQTCkFY+PCZHw/ShHYMu2C5E+L 28u/TnCGc1EwVmjLrbFbfMxYe0EUTwjImPQTy5VRjKGSpZi+NX5gL96WCiZDqHCGCp Q7oTi/y39P7RBp51zQM7RCmz0/oYIbvfyMpHi9pS+2tCLYT0kWra6j/DueOjD1u5EJ KJjBMF5fxLKe0fm7zIxYLFGy94JGQX+wB1fMJ6yeyJtHbs2h1trZVbNNqv+ytkZ7Un vevG0nlVwE5xQ== 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 D53F417E079B; Thu, 06 Aug 2026 02:39:10 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 8899E48002C; Thu, 06 Aug 2026 02:39:10 +0200 (CEST) From: Sebastian Reichel Date: Thu, 06 Aug 2026 02:39:08 +0200 Subject: [PATCH v10 02/21] drm/bridge: synopsys: dw-dp: Fix incorrect resource lifetimes in bind callback Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260806-synopsys-dw-dp-improvements-v10-2-d84a26c303d6@collabora.com> References: <20260806-synopsys-dw-dp-improvements-v10-0-d84a26c303d6@collabora.com> In-Reply-To: <20260806-synopsys-dw-dp-improvements-v10-0-d84a26c303d6@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=9602; i=sebastian.reichel@collabora.com; h=from:subject:message-id; bh=3y9XVGsi3/yyJycZN6gmewCagZkhDdkl6EYAyiUDdyc=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGpz161CY0zjpg9WgkGfvF1LyQ1dj5dWuP03D VNwNCLdGZWYCokCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqc9etAAoJENju1/PI O/qavNoQAJasShfAIdumucg4tWQBCq4cXp3WNDgmefML/vOJ961PxOEBX1wxPIU1rdUTK+/+jox 8L4WaScW0UgftMmrRxO+1tB3pnQmAEwtiVW1FizqH8Lt4/jal/EQoxzmAN3ADDDkr1S6KDTGE+F 4K3ym9fSySAAw78EcrIab4C6WOEQjNg/E5ilng2ZFJh6o9xKpwYBiLBK076zsvD0DdzUB9/SII4 fmoJK+mRGAG7/DsbX9ua0QQRDHZkjPHlqpM9WffL0yBxZTNNLW3r02aeMR3GBhwf2S4fPITgVZh hHcRTYEodg75Ctkt2LIVbAXUHKc+kyxAzqeWlIvCDAFEQiexnq+n7o600hjsfaOw1VwANu3OZHW ayN4pWVyZY5cdKgt4bn+0YCe5tIk2n6kH6shjXf8+pBSVc44FisRSXa0w59dBwUr1Lr2udXGAfP n3lwcpzE3HNp/jrraGfEVcOVLPgBa5rMnoiODLqeIDma9tkSKtXm1tXggLPEFKyfH/RaXWnJFfB f67qoKYgPky33BYavs7ZUPQitWGYuj9A1tY1BdjxZAEYUkSx2fpMAe4N/Nwm3a8xtqhZqg9n8sy eq1we2UiYtcchUAFwGGXrvwK3+jt2vcdDNYYXB3Bb4wHEmwW2gaphAQ2feT4qnD2/6W7Ae8DJRV COfYG+70nCFR+PE3qljwncA== X-Developer-Key: i=sebastian.reichel@collabora.com; a=openpgp; fpr=EF660D07463F8B726A795413D8EED7F3C83BFA9A Currently the Synopsys DesignWare DP controller driver's bind function requests lots of resources using device managed functions. These are free'd on driver removal instead of at unbind time. Fix this discrepancy by introducing a new probe helper function and moving over the whole bind function. This results in a fully functional DRM bridge once probe succeeded. The only thing still happening when the component is bound is the bridge attachment, which requires the encoder. The interrupt is kept disabled while the bridge is detached to ensure no spurious interrupts can arrive as the interrupt handler triggers a worker, which accesses the DRM device. Fixes: 86eecc3a9c2e ("drm/bridge: synopsys: Add DW DPTX Controller support = library") Reported-by: Sashiko Signed-off-by: Sebastian Reichel --- drivers/gpu/drm/bridge/synopsys/dw-dp.c | 76 +++++++++++++++++----------= ---- drivers/gpu/drm/rockchip/dw_dp-rockchip.c | 53 ++++++++++++--------- include/drm/bridge/dw_dp.h | 5 +- 3 files changed, 76 insertions(+), 58 deletions(-) diff --git a/drivers/gpu/drm/bridge/synopsys/dw-dp.c b/drivers/gpu/drm/brid= ge/synopsys/dw-dp.c index 60feb3d1e14b..9ed335244442 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-dp.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-dp.c @@ -1826,10 +1826,19 @@ static int dw_dp_bridge_attach(struct drm_bridge *b= ridge, dp->aux.name =3D dev_name(dev); dp->aux.transfer =3D dw_dp_aux_transfer; =20 + enable_irq(dp->irq); + ret =3D drm_dp_aux_register(&dp->aux); - if (ret) + if (ret) { dev_err(dev, "Aux register failed: %d\n", ret); + goto err_disable_irq; + } + + return 0; =20 +err_disable_irq: + disable_irq(dp->irq); + cancel_work_sync(&dp->hpd_work); return ret; } =20 @@ -1838,6 +1847,8 @@ static void dw_dp_bridge_detach(struct drm_bridge *br= idge) struct dw_dp *dp =3D bridge_to_dp(bridge); =20 drm_dp_aux_unregister(&dp->aux); + disable_irq(dp->irq); + cancel_work_sync(&dp->hpd_work); } =20 static const struct drm_bridge_funcs dw_dp_bridge_funcs =3D { @@ -1982,6 +1993,18 @@ static const struct regmap_config dw_dp_regmap_confi= g =3D { .rd_table =3D &dw_dp_readable_table, }; =20 +int dw_dp_bind(struct dw_dp *dp, struct drm_encoder *encoder) +{ + return drm_bridge_attach(encoder, &dp->bridge, NULL, DRM_BRIDGE_ATTACH_NO= _CONNECTOR); +} +EXPORT_SYMBOL_GPL(dw_dp_bind); + +void dw_dp_unbind(struct dw_dp *dp) +{ + /* nothing to do as bridge is detached automatically */ +} +EXPORT_SYMBOL_GPL(dw_dp_unbind); + static void dw_dp_phy_exit(void *data) { struct dw_dp *dp =3D data; @@ -1989,13 +2012,12 @@ static void dw_dp_phy_exit(void *data) phy_exit(dp->phy); } =20 -struct dw_dp *dw_dp_bind(struct device *dev, struct drm_encoder *encoder, - const struct dw_dp_plat_data *plat_data) +struct dw_dp *dw_dp_probe(struct platform_device *pdev, const struct dw_dp= _plat_data *plat_data) { - struct platform_device *pdev =3D to_platform_device(dev); - struct dw_dp *dp; + struct device *dev =3D &pdev->dev; struct drm_bridge *bridge; void __iomem *res; + struct dw_dp *dp; int ret; =20 dp =3D devm_drm_bridge_alloc(dev, struct dw_dp, bridge, &dw_dp_bridge_fun= cs); @@ -2004,9 +2026,8 @@ struct dw_dp *dw_dp_bind(struct device *dev, struct d= rm_encoder *encoder, =20 dp->dev =3D dev; dp->pixel_mode =3D plat_data->pixel_mode; - dp->plat_data.max_link_rate =3D plat_data->max_link_rate; - bridge =3D &dp->bridge; + mutex_init(&dp->irq_lock); INIT_WORK(&dp->hpd_work, dw_dp_hpd_work); init_completion(&dp->complete); @@ -2063,18 +2084,14 @@ struct dw_dp *dw_dp_bind(struct device *dev, struct= drm_encoder *encoder, return ERR_CAST(dp->rstc); } =20 - bridge->of_node =3D dev->of_node; - bridge->ops =3D DRM_BRIDGE_OP_DETECT | DRM_BRIDGE_OP_EDID | DRM_BRIDGE_OP= _HPD; - bridge->type =3D DRM_MODE_CONNECTOR_DisplayPort; - bridge->ycbcr_420_allowed =3D true; - - ret =3D devm_drm_bridge_add(dev, bridge); - if (ret) - return ERR_PTR(ret); + dp->irq =3D platform_get_irq(pdev, 0); + if (dp->irq < 0) + return ERR_PTR(dp->irq); =20 - ret =3D drm_bridge_attach(encoder, bridge, NULL, DRM_BRIDGE_ATTACH_NO_CON= NECTOR); + ret =3D devm_request_threaded_irq(dev, dp->irq, NULL, dw_dp_irq, + IRQF_ONESHOT | IRQF_NO_AUTOEN, dev_name(dev), dp); if (ret) { - dev_err_probe(dev, ret, "Failed to attach bridge\n"); + dev_err_probe(dev, ret, "failed to request irq\n"); return ERR_PTR(ret); } =20 @@ -2090,28 +2107,19 @@ struct dw_dp *dw_dp_bind(struct device *dev, struct= drm_encoder *encoder, if (ret) return ERR_PTR(ret); =20 - dp->irq =3D platform_get_irq(pdev, 0); - if (dp->irq < 0) { - ret =3D dp->irq; - return ERR_PTR(ret); - } + bridge =3D &dp->bridge; + bridge->of_node =3D dev->of_node; + bridge->ops =3D DRM_BRIDGE_OP_DETECT | DRM_BRIDGE_OP_EDID | DRM_BRIDGE_OP= _HPD; + bridge->type =3D DRM_MODE_CONNECTOR_DisplayPort; + bridge->ycbcr_420_allowed =3D true; =20 - ret =3D devm_request_threaded_irq(dev, dp->irq, NULL, dw_dp_irq, - IRQF_ONESHOT, dev_name(dev), dp); - if (ret) { - dev_err_probe(dev, ret, "failed to request irq\n"); + ret =3D devm_drm_bridge_add(dev, bridge); + if (ret) return ERR_PTR(ret); - } =20 return dp; } -EXPORT_SYMBOL_GPL(dw_dp_bind); - -void dw_dp_unbind(struct dw_dp *dp) -{ - /* nothing to do */ -} -EXPORT_SYMBOL_GPL(dw_dp_unbind); +EXPORT_SYMBOL_GPL(dw_dp_probe); =20 MODULE_AUTHOR("Andy Yan "); MODULE_DESCRIPTION("DW DP Core Library"); diff --git a/drivers/gpu/drm/rockchip/dw_dp-rockchip.c b/drivers/gpu/drm/ro= ckchip/dw_dp-rockchip.c index b23efb153c9e..38e8fe75718e 100644 --- a/drivers/gpu/drm/rockchip/dw_dp-rockchip.c +++ b/drivers/gpu/drm/rockchip/dw_dp-rockchip.c @@ -26,7 +26,7 @@ struct rockchip_dw_dp { struct dw_dp *base; struct device *dev; - struct rockchip_encoder encoder; + struct rockchip_encoder *encoder; }; =20 static int dw_dp_encoder_atomic_check(struct drm_encoder *encoder, @@ -73,37 +73,28 @@ static const struct drm_encoder_helper_funcs dw_dp_enco= der_helper_funcs =3D { =20 static int dw_dp_rockchip_bind(struct device *dev, struct device *master, = void *data) { - struct platform_device *pdev =3D to_platform_device(dev); - const struct dw_dp_plat_data *plat_data; + struct rockchip_dw_dp *dp =3D dev_get_drvdata(dev); struct drm_device *drm_dev =3D data; - struct rockchip_dw_dp *dp; struct drm_encoder *encoder; struct drm_connector *connector; int ret; =20 - dp =3D drmm_kzalloc(drm_dev, sizeof(*dp), GFP_KERNEL); - if (!dp) + dp->encoder =3D drmm_kzalloc(drm_dev, sizeof(*dp->encoder), GFP_KERNEL); + if (!dp->encoder) return -ENOMEM; =20 - dp->dev =3D dev; - platform_set_drvdata(pdev, dp); - - plat_data =3D of_device_get_match_data(dev); - if (!plat_data) - return -ENODEV; - - encoder =3D &dp->encoder.encoder; + encoder =3D &dp->encoder->encoder; encoder->possible_crtcs =3D drm_of_find_possible_crtcs(drm_dev, dev->of_n= ode); - rockchip_drm_encoder_set_crtc_endpoint_id(&dp->encoder, dev->of_node, 0, = 0); + rockchip_drm_encoder_set_crtc_endpoint_id(dp->encoder, dev->of_node, 0, 0= ); =20 ret =3D drmm_encoder_init(drm_dev, encoder, NULL, DRM_MODE_ENCODER_TMDS, = NULL); if (ret) return ret; drm_encoder_helper_add(encoder, &dw_dp_encoder_helper_funcs); =20 - dp->base =3D dw_dp_bind(dev, encoder, plat_data); - if (IS_ERR(dp->base)) - return PTR_ERR(dp->base); + ret =3D dw_dp_bind(dp->base, encoder); + if (ret) + return dev_err_probe(dev, ret, "failed to bind DW-DP bridge\n"); =20 connector =3D drm_bridge_connector_init(drm_dev, encoder); if (IS_ERR(connector)) { @@ -128,12 +119,30 @@ static const struct component_ops dw_dp_rockchip_comp= onent_ops =3D { .unbind =3D dw_dp_rockchip_unbind, }; =20 -static int dw_dp_probe(struct platform_device *pdev) +static int dw_dp_rockchip_probe(struct platform_device *pdev) { + const struct dw_dp_plat_data *plat_data; + struct device *dev =3D &pdev->dev; + struct rockchip_dw_dp *dp; + + plat_data =3D of_device_get_match_data(dev); + if (!plat_data) + return -ENODEV; + + dp =3D devm_kzalloc(dev, sizeof(*dp), GFP_KERNEL); + if (!dp) + return -ENOMEM; + platform_set_drvdata(pdev, dp); + dp->dev =3D dev; + + dp->base =3D dw_dp_probe(pdev, plat_data); + if (IS_ERR(dp->base)) + return PTR_ERR(dp->base); + return component_add(&pdev->dev, &dw_dp_rockchip_component_ops); } =20 -static void dw_dp_remove(struct platform_device *pdev) +static void dw_dp_rockchip_remove(struct platform_device *pdev) { component_del(&pdev->dev, &dw_dp_rockchip_component_ops); } @@ -161,8 +170,8 @@ static const struct of_device_id dw_dp_of_match[] =3D { MODULE_DEVICE_TABLE(of, dw_dp_of_match); =20 struct platform_driver dw_dp_driver =3D { - .probe =3D dw_dp_probe, - .remove =3D dw_dp_remove, + .probe =3D dw_dp_rockchip_probe, + .remove =3D dw_dp_rockchip_remove, .driver =3D { .name =3D "dw-dp", .of_match_table =3D dw_dp_of_match, diff --git a/include/drm/bridge/dw_dp.h b/include/drm/bridge/dw_dp.h index 22105c3e8e4d..a82412a9e769 100644 --- a/include/drm/bridge/dw_dp.h +++ b/include/drm/bridge/dw_dp.h @@ -22,7 +22,8 @@ struct dw_dp_plat_data { u8 pixel_mode; }; =20 -struct dw_dp *dw_dp_bind(struct device *dev, struct drm_encoder *encoder, - const struct dw_dp_plat_data *plat_data); +int dw_dp_bind(struct dw_dp *dp, struct drm_encoder *encoder); void dw_dp_unbind(struct dw_dp *dp); + +struct dw_dp *dw_dp_probe(struct platform_device *pdev, const struct dw_dp= _plat_data *plat_data); #endif /* __DW_DP__ */ --=20 2.53.0 From nobody Fri Oct 2 02:36: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 3E3C43783B5; Thu, 6 Aug 2026 00:39:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.251.105.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785976754; cv=none; b=F0QEoftjMtwtWHvpnAUwqE/z2uHi29snAk67VmwSHNqSn+hL90uzK1zjBMhNnDY+4iBGLBkcNwtB8XJq6GzxlRyVmcIgo5MhKMGRLOQLdv8m60pXFfwWSWoKJLbZxW93j2Csn07zQl+4o1ub85L0UV5GpIsBYlPa04O5jpc9oCw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785976754; c=relaxed/simple; bh=AP7eZHdio4vr1je90N8ZUEV+jwBf45eOCcTIFRIldAQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=P/BGhZZKFI8bsFUEo2ggtl223PPoLSHEzbbfLsyG7jhEbfm/FkEggN6DK1VjOwUerVSov0DnTlV316sj+r2PmhygCmujjA3zkbAEkWuATSAHu2PH/wTzSp0E1O7UYIr3pj4SC9JKjv2piyQvjlBTqtFbQTKYI6Nj2D+FoO3USkQ= 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=i0HgLfHC; 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="i0HgLfHC" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1785976751; bh=AP7eZHdio4vr1je90N8ZUEV+jwBf45eOCcTIFRIldAQ=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=i0HgLfHCRm7qYesBa3vPxul0ZC8HHSXHfQbJGnHP2v3n7KmbYsjquR0nj8+GcXmwg pnrjl64R7KH7zjskpP0VIvFi+tQbpV4O31oSddeVN6gS/G9KRNJdZBo7OAZVJTZOSf 0/vxvMORqygzSEdSHoN2dJgRXGZbGg2T5qcnjD/nkQUukZ0onmEU36AAxdvDBx3FpW gpu9c2TJFd7W+UmNWOA5KTcha9QX8lTJsiwGDHlBgMNYCoXMihVY1WNA7AsbqXKuwC WRf9enJW+xcyGCCUJy0Gq2AVGFT8Hyr9eDQgc+ccj7JpmloKAFupUqwCN4ngZZaCKa qc5y9o74XGrdw== 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 D682017E07B2; Thu, 06 Aug 2026 02:39:10 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 8A08D48002F; Thu, 06 Aug 2026 02:39:10 +0200 (CEST) From: Sebastian Reichel Date: Thu, 06 Aug 2026 02:39:09 +0200 Subject: [PATCH v10 03/21] drm/bridge: synopsys: dw-dp: Fix error handling for DP link enablement Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260806-synopsys-dw-dp-improvements-v10-3-d84a26c303d6@collabora.com> References: <20260806-synopsys-dw-dp-improvements-v10-0-d84a26c303d6@collabora.com> In-Reply-To: <20260806-synopsys-dw-dp-improvements-v10-0-d84a26c303d6@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=2267; i=sebastian.reichel@collabora.com; h=from:subject:message-id; bh=AP7eZHdio4vr1je90N8ZUEV+jwBf45eOCcTIFRIldAQ=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGpz161UODfVa+7Q+fOqoYnv8CPLiO/f3EaSA 88OV5aDIwyRTYkCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqc9etAAoJENju1/PI O/qa/LUP/AjRSyKo+9xZHWecuS69Qf0FQqlO9W4NU0R7iNDWwVvwkfMsSM9xFtqj+1ZZrHMpAem yQSd15+PUeKtoo49aVJZ3KMAWFuoCxChdrCchd5/QW6gjDNJV+xKIG0Ikhp+/MCfXR9hEboPgjd Nji0lljpQ5Nny/+Vp/Syvwls0FqIThV0GUVWroICEGk8V14bl1ji2okDlQHdKXlTRnFofuNihhk GqMIfcb0EjdezOMUf8BqANOh3RnQU3DmoXiR0LQKi/B8N/K4oqEra0O+4aqtDBp1SsrsEBxlrvb o8L6t8E4d+Y7YNpLQ2Olntd/yhMJmWCG3NxBqbBt3xdZatul+UCeAMcqINwk7h8Zk9GUy2kgWDX y+AKEC4xI2iEyM9CHGV591T9y8zItU8IvG/Udf6dRwatXwWxouvaTvmhHELMi1pOYyZW8JaJtf6 z1jllC0NMRXX0yIVurAYoBYHQxSF82Ovh9tpuHNAKWh9kXDCiz6Z2A9k2Wjv3YYJpK5OqGPQrWX foWjCrNpxB5BhRkNPoVfoTEAKFI/veWTfA+N3ZjAg690jlJ36mAZ7zWYGnVhvi/3BkRrId0X9fl QiXRa7uuAgtFHUxvBIyoZJ7LN8lBVyL19VTmJaHFkZlObR8+VFrQa/YlITboGfgAhNeGS4b6qCT c6zzL/0kgEkavkN33aYwugw== X-Developer-Key: i=sebastian.reichel@collabora.com; a=openpgp; fpr=EF660D07463F8B726A795413D8EED7F3C83BFA9A dw_dp_link_disable() may be called in atomic mode disable even when dw_dp_link_enable() (or an earlier step) failed during atomic mode enable as there is no error tracking. This would result in broken PHY power state. This is fixed by introducing a new enabled state in the link structure to ensure the link disabling only happens if it has been properly enabled in the first place. The patch also adds missing error handling in dw_dp_link_enable() itself to ensure the link enablement becomes an atomic operation. Fixes: 86eecc3a9c2e ("drm/bridge: synopsys: Add DW DPTX Controller support = library") Reported-by: Sashiko Signed-off-by: Sebastian Reichel --- drivers/gpu/drm/bridge/synopsys/dw-dp.c | 18 +++++++++++++++++- 1 file changed, 17 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 9ed335244442..9d46927ead4d 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-dp.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-dp.c @@ -280,6 +280,7 @@ struct dw_dp_link { unsigned char revision; unsigned int rate; unsigned int lanes; + bool enabled; u8 sink_count; u8 vsc_sdp_supported; struct dw_dp_link_caps caps; @@ -1615,6 +1616,9 @@ static void dw_dp_link_disable(struct dw_dp *dp) { struct dw_dp_link *link =3D &dp->link; =20 + if (!link->enabled) + return; + if (dw_dp_hpd_detect(dp)) drm_dp_link_power_down(&dp->aux, dp->link.revision); =20 @@ -1624,6 +1628,7 @@ static void dw_dp_link_disable(struct dw_dp *dp) =20 link->train.clock_recovered =3D false; link->train.channel_equalized =3D false; + link->enabled =3D false; } =20 static int dw_dp_link_enable(struct dw_dp *dp) @@ -1636,10 +1641,21 @@ static int dw_dp_link_enable(struct dw_dp *dp) =20 ret =3D drm_dp_link_power_up(&dp->aux, dp->link.revision); if (ret < 0) - return ret; + goto err_phy_power_off; =20 ret =3D dw_dp_link_train(dp); + if (ret < 0) + goto err_link_power_down; + + dp->link.enabled =3D true; =20 + return 0; + +err_link_power_down: + drm_dp_link_power_down(&dp->aux, dp->link.revision); + +err_phy_power_off: + phy_power_off(dp->phy); return ret; } =20 --=20 2.53.0 From nobody Fri Oct 2 02:36: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 3E4613783C3; Thu, 6 Aug 2026 00:39:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.251.105.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785976754; cv=none; b=J2l8M9SrfAiOLCUJ4mNBL9J0DBcmqfQaZBIg/P06+CK4k/C5WJKbexml8F0Sz1TfeAcxB++w6+8aEqfjh00iUyE4TScrk+0r5LyY/2xGeuhnNAajNPsSgIkl+nT97/rOqocmpI09dqTzHP2kFJ32yFprswZOAx4RY4rVJk7LQzI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785976754; c=relaxed/simple; bh=kXoRBBebvYIox0oNXN0VuZO24XXYD428JSoKN6soJ4A=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=bigJJWqFwJn+cXFom45v4BWHZbvObBxQJosvbvWFfPUSYnUpMpzBnfsq6Od2CBWDeek0L6DW8PSCXRcPIL1Ud/YiyBZ6O4Marv6p4ixBi/w8cr1feMrPWW6ZLvI7ZnzNdPoWp/SbjC+3QvbmAlF1eexDHcoh+/lXqkLmY0ygLbw= 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=mP10COIA; 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="mP10COIA" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1785976751; bh=kXoRBBebvYIox0oNXN0VuZO24XXYD428JSoKN6soJ4A=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=mP10COIAyj2NaBjzWj0e8vDOj22SHY2533M6Sub5SGaEDvu2nFJLyxIpJlFzXu1GJ TB7LILix/vRTxTrbr3N6hsCLU46UdHQR8ES7WvyE/cvGEEjtLQYUYbG5waJmpATE3o k/Er67OCfFnzajAZd5swowTSIKRPU1qBKf/3AgvVhgqbIwcpz7HM1Ut23/ZN27xsLe S3jSFbujTQV5L9xGmcq77MAmE4Z20Tx/RV56U9SGbJ1mWJ0pOR0veg3a5oWAUmgkxS BXOFGJI+9M8PR0PtHVHXZ6Rs+50FheyQI7hSLEr1q8lx97UJtuqcg7QA94NjryfYfU 6CHOFmkSaCG1Q== 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 D7D0717E07B5; Thu, 06 Aug 2026 02:39:10 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 8BB6F480030; Thu, 06 Aug 2026 02:39:10 +0200 (CEST) From: Sebastian Reichel Date: Thu, 06 Aug 2026 02:39:10 +0200 Subject: [PATCH v10 04/21] drm/bridge: synopsys: dw-dp: Document missing reset line deassert Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260806-synopsys-dw-dp-improvements-v10-4-d84a26c303d6@collabora.com> References: <20260806-synopsys-dw-dp-improvements-v10-0-d84a26c303d6@collabora.com> In-Reply-To: <20260806-synopsys-dw-dp-improvements-v10-0-d84a26c303d6@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=kXoRBBebvYIox0oNXN0VuZO24XXYD428JSoKN6soJ4A=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGpz1611MdQU6XuU4EOBdIMThZhdenvp6Xc6q d60Ul5IMtG6aIkCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqc9etAAoJENju1/PI O/qa9X4P/3z14InEcW0zDYd450FemoZtBW2eH6iMu7XxXhuvVKcZgYEo9YBahsTiWhaO1z6Mw65 KEeLiTKLilF0fpyqd/KiFB7jsckouq3SPm4NgnIj2O56ZijRRlzQXpdH+YcWmg/hty1VqU4e/Ds hy8yIQNd5f4KnDzqLovAFuTASkBwbAmwstIwCbBaIRB9KkI7JkXcANWZuLp35CnXgi2GvSzSLfw OIMZxIQi/3S/zjgwVmTKpZjFRvZ3/+B/h5S59ovbprlSzXcI/dqjTa9XuI1qtPsv5wQBabrZ/e/ 3o2YZTXwsguFCiyWl5oLcAkWTgCQW2WrZUxMRCG4ECmo8zy+/ZerbjMVFhQt3VmKeFX9R0A+/NR 72J0hbj8vgxEK1vTFC/4zt5ASXl2BG/EMoW3zCnNHVIq+PNzal5n5pMRyfD9MptRA7A99utGJBa KMaigXgX06aTI5dtmXd6Xwnsm0O2Sl0fci3qowztr+GlCR6NOb6ZnPtamAyvooEri8iZOV4/NvB rIsTSsbWAGQkQAUfTw0Vt6UlD4y5L4D0hQU3YzY+YyMaMa/Sk4TIeRZ2QK9gax7PWGZQcAzc+WU T8VxpDCTEiBHNKF94HJbdYrQYTqrSbFjnSxx+6ToDTsAPGAJn8kFUhERzeYfG3UfId+ZQDIOzdm 6EIPhUtI94FVgqGcXEJYsRg== 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 9d46927ead4d..d3f93e9ba60a 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-dp.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-dp.c @@ -2094,6 +2094,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 02:36: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 581253839BD; Thu, 6 Aug 2026 00:39:16 +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=1785976758; cv=none; b=BXJwJraA8fE8fdqhiLDJBJEEBy54y/EHsDgAWFKpfto+uBKcNrHtA9IVFXpmK5ZyXtHbuO9Yh++4wLoZTDxhx9ANpYnMMFpVtxckZNgDel73ogirb8ajr7+K5bbGFlxrG5uUTsQDjPQ8Wqzxutt2ra/DhDlLPG/RrF2PRlgU9ok= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785976758; c=relaxed/simple; bh=0LdXuxOKKs318XAl4WSr1g2oS54qVCij4xOtaVQvuVc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=OR+XcKtuP3PJw1MwUfEWL9sUXqb2yiEH0fysrHtA6ZJx39EAv+jjLLUWBHqn0fvK/6JzVrgKtLcAsxIa+6G+Tc5E2DFchkcVvFimJy3BVHVLpyBu8+aIwCn3G2bHhyaoM+3a4rKk5zEekHGLr1JKxXNeiADOpQUMPlD8KuRXxGg= 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=aygFU4mT; 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="aygFU4mT" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1785976751; bh=0LdXuxOKKs318XAl4WSr1g2oS54qVCij4xOtaVQvuVc=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=aygFU4mTDp+1SH72m5Ofw2/O47G50wrn7yD2XKs/A11vSoSMZZMo/JMa1h4R8wbYZ rFRQfjV3usR/Z6jIrCfrGVS3SuuNE94hUVy8Umvvt5fUuzT+cRJOyVmf+4A1/AiS4v lebHUUGFOUpT3em/h19j99wAWTPBMD70QsRCwjYeYtKLxKVRvOZIVdfQQpmh5PINwA o1W8Y8xO7FVHgjkuFuAUvmj0E1ru8xfeqGpKE3BE4FwWu1T47uikEfnZwA65LWP+By f8TzwWcfEJ6el8PKldIcGu+VPN2EPNNaPOZMyqbMM5NBnw6hWltFXZjz81IW9LB6YL 6HEVpwbMWleEg== 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 310AF17E07B6; Thu, 06 Aug 2026 02:39:11 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 8DE08480031; Thu, 06 Aug 2026 02:39:10 +0200 (CEST) From: Sebastian Reichel Date: Thu, 06 Aug 2026 02:39:11 +0200 Subject: [PATCH v10 05/21] drm/bridge: synopsys: dw-dp: Add missing mutex cleanups on module removal Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260806-synopsys-dw-dp-improvements-v10-5-d84a26c303d6@collabora.com> References: <20260806-synopsys-dw-dp-improvements-v10-0-d84a26c303d6@collabora.com> In-Reply-To: <20260806-synopsys-dw-dp-improvements-v10-0-d84a26c303d6@collabora.com> To: Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Rob Herring , Krzysztof Kozlowski , Conor Dooley , David Airlie , Simona Vetter , Dmitry Baryshkov , Luca Ceresoli , Philipp Zabel Cc: Cristian Ciocaltea , Damon Ding , Dmitry Baryshkov , Alexey Charkov , dri-devel@lists.freedesktop.org, linux-rockchip@lists.infradead.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, kernel@collabora.com, linux-arm-kernel@lists.infradead.org, Sebastian Reichel , Sashiko X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1166; i=sebastian.reichel@collabora.com; h=from:subject:message-id; bh=0LdXuxOKKs318XAl4WSr1g2oS54qVCij4xOtaVQvuVc=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGpz163sM+axQnALjM17B31DOPMOywcgc+uEE MIxnCsxa0zQK4kCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqc9etAAoJENju1/PI O/qaLkQP/3yDnfT+ooSc0Fwcb/3ddyFGyD/pZJVslRSQJiX2xlE8WwBwQ1/Mid9Uk7D+ra0WSJX sfI2jj24o9TYu8sA8k2EUVqu+r+aaMMdJArzS+O8O/sruf5t/HbjaItaEiRn6wa42M8abA9x+IE six14RXAw8wm0wCCH8JAUVSqfOVqew1yH59XlWr1SMmrTNYTSbcP99d6wShkKruCB/Df//eG73f Hf0tYk6oVcvV3tbPC5Tspp8qYSWGv11gKy0Ta+W8DTNOL7WoCsDd5WTUiUZ6Dgbuac5KmV6DVV+ KzX5OPxuPWewIV1ZjBGZFNturruA/7RihZX4kV19qSAUSDolijCWEk3uwOKlg9t/uoOtvH+ydWM rPKUPgJh0VdNrks+FqRR3W5iuAli+Qhqni2gpq5FYtiHk1SdzSC6hKSFUC1dJJKLD5WsdFR6G/X BXsKmh5bgZX8bAOAWWJqS2a2ErbqorrD+SAVrJz4NXaKannT7mdTHDANXB/0dUvfmxa15iI1duk E7XnVimY49fD1z0ZEnn0BDUfHQa/y0OKXnuyn8x5jEHCZ9fnnCDUMFTKLwvRD7HnPCR2NYqUCUu zOHdaeMjtba8QltnN1XhnDwEmr3TQFJAjySt1flCX332MI56Ixm4xutw8fBnivyJLEbQLuoa3pB FLnupPlmt077YApYJR6Mp3A== 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 d3f93e9ba60a..7bd4befd84c8 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-dp.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-dp.c @@ -2044,10 +2044,13 @@ struct dw_dp *dw_dp_probe(struct platform_device *p= dev, const struct dw_dp_plat_ dp->pixel_mode =3D plat_data->pixel_mode; dp->plat_data.max_link_rate =3D plat_data->max_link_rate; =20 - mutex_init(&dp->irq_lock); INIT_WORK(&dp->hpd_work, dw_dp_hpd_work); init_completion(&dp->complete); =20 + ret =3D devm_mutex_init(dev, &dp->irq_lock); + if (ret) + return ERR_PTR(ret); + res =3D devm_platform_ioremap_resource(pdev, 0); if (IS_ERR(res)) return ERR_CAST(res); --=20 2.53.0 From nobody Fri Oct 2 02:36: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 51A82382F23; Thu, 6 Aug 2026 00:39:16 +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=1785976760; cv=none; b=X4uMw2v5DJYYi8zchHbdDpHYzeX0xiT2qF6XpNSz/bIyYYAMymg23JhOBwvunpq7ea3tprUrgTgnedBrb3iBNxqPBCVFionGzZapSR5Vf1RmBBqua90syBt/g8rvcm1BsFvsJxKEh1B+faMH+yqmDjR3e5Q4EVammthtqYqpY1g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785976760; c=relaxed/simple; bh=YtwSpdUg10a+Zh7F9mpv53UF1+K0mBdt/GcnkH2c5S0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=vEetDdoIsGasjwBAgImyjvx7V3mXEWeZqwRxRab8trxamICdXI0/08M3IJqpt7beG/XmwTovxUosRtRCZIqmoG8wYNYm7fjoFbWs6ieLDOnhvCPeqZ48LXvCW3mnS7nsl0nwbfS5TDxz7PpTZtDlZCmFyEI74daB87/ixOTdfLw= 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=YrSVKIBs; 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="YrSVKIBs" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1785976751; bh=YtwSpdUg10a+Zh7F9mpv53UF1+K0mBdt/GcnkH2c5S0=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=YrSVKIBsL3UAzH4iyqz9towasTAvvNikfrQYgw6Mp0B4DlEX57dwv45xO6+8oFzLV Ok3YpkEa9os6EDtYgzN/E8bfRUfgA3kNsr/BpR+92XCe0zPTYUkX7RdyDPz/+DAOV9 KGjWdrwZTj2l2yKhVERsOwkaHM1xduPP+IgZ4vV/5pkck60B74lBXetKDufPi7GquE 3nsJtD4VX0L8l75aRTkwIvU0X8FzgEqJPawf0vyArzlXSoTDjEQ2of2mDb9EQuaZZk 6OrC14seQ2yQVchynAU4Xy82EKtT3Tl6aSGOQIM89BUTlbkEEiiL3Mk2FHMa62VSxK ob4WH8hVgio/A== Received: from jupiter.universe (unknown [100.64.1.62]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519) (No client certificate requested) (Authenticated sender: sre) by bali.collaboradmins.com (Postfix) with ESMTPSA id 3402F17E07C0; Thu, 06 Aug 2026 02:39:11 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 8F68A480035; Thu, 06 Aug 2026 02:39:10 +0200 (CEST) From: Sebastian Reichel Date: Thu, 06 Aug 2026 02:39:12 +0200 Subject: [PATCH v10 06/21] drm/bridge: synopsys: dw-dp: Fix AUX transfer timeout race condition Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260806-synopsys-dw-dp-improvements-v10-6-d84a26c303d6@collabora.com> References: <20260806-synopsys-dw-dp-improvements-v10-0-d84a26c303d6@collabora.com> In-Reply-To: <20260806-synopsys-dw-dp-improvements-v10-0-d84a26c303d6@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=YtwSpdUg10a+Zh7F9mpv53UF1+K0mBdt/GcnkH2c5S0=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGpz162dHmPHSH5OwKJMuULkSdkV4R/oh1Wwa hHaP8SVhQj8yYkCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqc9etAAoJENju1/PI O/qak4MP/ihUzR/v3EZRGp9uA69x1hROIypOCp8djBQxs6Yt4oFJL64X1GbAVno1vaHfatvAzoN Z50MD/jofo01ZVO7ykVvkPggQwv6XeDJYw29rkCAHOaIemxmGXkVIZ3Dx33ecZ9OEyeCLmoQt0v K/BXg84DM7SwRHf05UDY4r+N4RV74xX26UfmBK5xpHHObsTWt8oIxwLRh8m9T/2xDA0ysm+UwU0 7F4XXUXe/wrVK9bKxel/a4wFObGsWhD1qCouX6kIzcxXX2phFLlhiqoMRpX/YxbMQTPZP60xXTZ Gaf20e2imPi0HBvad84ldOWwM/lfDuUCn1N/hFWVG5JNlbUVu0bCHYId33SROgNF6kVf9vz236u guPnJAFAMf7QKmT9jt3bD/fOIyudzxtmE1z86belUZ0zgNNUZ2wA3+11BbFHNCC6V4QwgWjYr8c AH/0Tpm1BF/1mzMS32ehpQKH3b1pL2A+qscl1QqoQptSVC42hrmuFc+CZunDANbZsPEpgRL8AT3 3PqH24414R70Z1MbuyQCmION/70nNrSNranGhD/++9dxUccEBhKsg0oAizJup0hrX2nvIs/7nLv EZK2hwgYBwXo84ZTHXW+zCdGCSBfs219SxNnYCs5KZad6OW7SbFUgKgUSck49RK26h9XXnrQwcj Z3W/QEiRhT247o0JIpWgn4A== 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 7bd4befd84c8..f82330640380 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 02:36: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 5800038332F; Thu, 6 Aug 2026 00:39:16 +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=1785976759; cv=none; b=QQHyuotuXBnwhKsMkx5iENcEFX7uLMdvechSbvuUn99RK2+8XYBBsJQclknhiOq/aUFWZ8mwW5bDkpvFt5CSFCNCclp/8ijcZJmgDgXiIi81wSoPSA6J1Pq3OzEdz+a7rVdI64LrQ3lsFu0SeKwLHJpdLFLuKNtd3V8HGgxZEpg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785976759; c=relaxed/simple; bh=MXKziEXcaaAN5ybtaER2wtFJ0oAuG2XANzY2ZyvyAkY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Xb+IEHY187rG3kHFUeI+3CgUM3B0CpVPhkev01d9euqQ29AyV3mc/2VTyLuu51kdD6Ut03VI5a+E4LDf6cn2puVmwc32n09+hhesP0SI0uWRYenRM/SWwGECa5GKLfCxCp7CBrE2DNMUquOV7WZHakH9i6H0u+eku//RdXojUJ8= 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=pd0JrudD; 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="pd0JrudD" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1785976751; bh=MXKziEXcaaAN5ybtaER2wtFJ0oAuG2XANzY2ZyvyAkY=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=pd0JrudD5AruG37n9hLi6TvmBVyi2CytLsF+1KW/N/+fGmWCabDEYc+GGVRLTH5HX VKRyIH3XoBY2jN8o2w99ihmwynFmuhF8s9lSPu2hBLW1J7jzI8/s9PPGSLgH/accI6 wfw7/amWJCS1AQOq/CSGjQcOrVVGTtsbMDmjmoMFbwGG4bM6K/VhhF1lPff9qtnmda Uoik+Lg1LY+7wJYZqOMMiSK3Amd8BsoMJ02FAd7atIGGd/ls2Su6fjFlPQDPdITOKo xwsXU5u/4opT3jdC/rJerQ5DnYXoInOhmzXZAkD8eA+7QyGkwu6Ey0i42X+y5fBe4y vaAp91EFZhpzw== 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 3B5AF17E07C2; Thu, 06 Aug 2026 02:39:11 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 90E95480038; Thu, 06 Aug 2026 02:39:10 +0200 (CEST) From: Sebastian Reichel Date: Thu, 06 Aug 2026 02:39:13 +0200 Subject: [PATCH v10 07/21] drm/bridge: synopsys: dw-dp: Fix support for short I2C reads Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260806-synopsys-dw-dp-improvements-v10-7-d84a26c303d6@collabora.com> References: <20260806-synopsys-dw-dp-improvements-v10-0-d84a26c303d6@collabora.com> In-Reply-To: <20260806-synopsys-dw-dp-improvements-v10-0-d84a26c303d6@collabora.com> To: Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Rob Herring , Krzysztof Kozlowski , Conor Dooley , David Airlie , Simona Vetter , Dmitry Baryshkov , Luca Ceresoli , Philipp Zabel Cc: Cristian Ciocaltea , Damon Ding , Dmitry Baryshkov , Alexey Charkov , dri-devel@lists.freedesktop.org, linux-rockchip@lists.infradead.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, kernel@collabora.com, linux-arm-kernel@lists.infradead.org, Sebastian Reichel , Sashiko X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1481; i=sebastian.reichel@collabora.com; h=from:subject:message-id; bh=MXKziEXcaaAN5ybtaER2wtFJ0oAuG2XANzY2ZyvyAkY=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGpz162etrcu/cgKVHRD+LGKL9qoeXu0fBeiB O2H7LxOJTXW6YkCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqc9etAAoJENju1/PI O/qaMNIQAItcvqeLuS53smgADmTjbGA4wJK0Ar54lPJk+2fh6p/TRB/tgGTLLt3qj9+Ui7RCDpd 7nON6eUnKnO2FH1qxXpQPBVJqvazg+S4MO1PGoRK61N2oeauYRTiTLsCLbDJF85dlwwbCxD9nti qL/qzV5axKXZ6fWJKK507XK0kEhD3NTQ9QNcppsWVOMv0q5Rq5GZAcKhvSNRr8ImhfPTWCJTVRm IEHyb1T3VuDpddXPlor20VGYzxCpdIzLRoVaOn6hhoXil3eabG6oS2PcigIHVrioRmuooMqBaSR 0Bs8kZIDMYiG8X2rQA4FkKWB4RariHiUvDu4/yBea+hep1U7MhSZopLeDtGzmdHN+k7QUg+14du K8QYc4kdwgjGCjgj48Gyqg4fs3zBMY+oypqymG/bEEHUCgiqx6dhpVg5qcBA1UGEiwZoWVnFfSe 81IY2oEiivWZCj6NfCYR1ajCiaK1IZnRe09W577a7T3LGMfxLrTR/DIDcGKRk9TCe1XBLOW9GhR 6y7nRRkBS+bNIgSQelfj5PrXJMZEvyS3ZGSdgBJRnYofJAz1vM3bAQlorD69y4JxvWKyz84ZsYB 3DUhby2J1vxGc1Qy4YYNSYkNTSVFrk/cTWlurKusOztFheEv7viuavavMtu9WyUs51/IH+WqdTU 8qwPJQB1xuUGRQBA3dgYkOg== 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 f82330640380..696cdef279fb 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-dp.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-dp.c @@ -1513,7 +1513,7 @@ static ssize_t dw_dp_aux_transfer(struct drm_dp_aux *= aux, if (msg->request & DP_AUX_I2C_READ) { size_t count =3D FIELD_GET(AUX_BYTES_READ, value) - 1; =20 - if (count !=3D msg->size) + if (!count || count > msg->size) return -EBUSY; =20 ret =3D dw_dp_aux_read_data(dp, msg->buffer, count); --=20 2.53.0 From nobody Fri Oct 2 02:36: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 5808F383987; Thu, 6 Aug 2026 00:39:16 +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=1785976758; cv=none; b=iN437/C2joK4fh4Fn7JgaVEaeWbaCl7mSlI/zztKPq5EXvVAhwEt0i33J8t8cM+n9lZiFHY78YAiTYAMr7Q7mn4hgGKSd2oKrVA6pWpizW/SNf3/4EiH+BCGas8YmXBi13yV9gqAefa+/dmMz6GgwZtXFrrprTVLCYzQdJzR8AM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785976758; c=relaxed/simple; bh=ducKjBPCYJYhSfXplJWCZV3LtVZN3hY3HVjvA1+pg2k=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=IolK+xpkCMlMJ70kN3cIiik8GfF5Tehjg9WbSho39J1MQlK819QVTFMP2whE7xPgclJ/3nf8oamanLGhn0x3L1wGx7ygfb0u5EUF8myPLh0+Z9lFKuP+OFSfQqBH8/vXT+MbxkIH1vKpuJ9MFc87H5EEF1OA/eg+B0vd1KWqhVI= 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=HvYcU6fC; 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="HvYcU6fC" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1785976751; bh=ducKjBPCYJYhSfXplJWCZV3LtVZN3hY3HVjvA1+pg2k=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=HvYcU6fCohJEk7cHcudq+QcBz95gMwuLoNFMlVCCL8CXDg14LzxdTQ3C1fkNScd9A eY7PMFiDwjtGpL4vSF7KLs9mKnB8I4ArVBJQLti5zGav3PXPrGj40A3eOy5K9RcxWH 33MUNhiWQdNjgnj3jsyKs7w2nXlGRx4DsYiea1Yl7Zwku44MW0UAKDKu1ychTX/QOV uu+YHn7YOZ2iV+EGFnKP8DuXTXCTOBW/RdPvpEbalO9upCaZvANXO+QXW/xn3sVke+ 0uqs66JKQHErslQ3UGkThkzYQ/6Zh4ECKlDX/f54qLjwyVgN/9DcxA8JkGKlvgaCw+ kbY/HW0vxm1AQ== 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 3BEDC17E07C4; Thu, 06 Aug 2026 02:39:11 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 9260848003A; Thu, 06 Aug 2026 02:39:10 +0200 (CEST) From: Sebastian Reichel Date: Thu, 06 Aug 2026 02:39:14 +0200 Subject: [PATCH v10 08/21] drm/bridge: synopsys: dw-dp: Free output_fmts when none are valid Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260806-synopsys-dw-dp-improvements-v10-8-d84a26c303d6@collabora.com> References: <20260806-synopsys-dw-dp-improvements-v10-0-d84a26c303d6@collabora.com> In-Reply-To: <20260806-synopsys-dw-dp-improvements-v10-0-d84a26c303d6@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=ducKjBPCYJYhSfXplJWCZV3LtVZN3hY3HVjvA1+pg2k=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGpz160npRYqUBlOvpOjumwaS1C+mL4ZNKg+d yy6BL/UsAVwfYkCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqc9etAAoJENju1/PI O/qajMcP/1Ab2Tu1NS9cIEkuhHDkc0AdhHAsM2k9U33GRg/1BSNL3WwVj23KFcOoYZjdUXUlxXr dBEFbijl/mdo02Fx/P86aN1pLCzfBKdbZoDq2Rm6lYuu2Yduab8r6Fjgskx9bT3bz+KfLMuIv66 2QVHDev/R+xHmR+hItfXCF5+opkxs1XTCXjIQsGQK03Kb1XSP5FPk8QXkbTsHuKSZsSc9kkd3gg LHg6nfNVysrh2G2Rs1jVwqlDNo/yLI+HoB3ksvevmhFLB3j90QqDU+7jGoWkeYcuZeQDhfInWTS myJAKZX53W4XL1ZuGkp28NVyYLPSHByvWm8tYB3cc0XdbX43CQxAHuT6alxqIJ7BXbm5P+G9lBQ JCOa3WpPUVHPNoCGHfSr5SDBDPT7tIyfeWyPer7e5kE94ZNN2H/WMrvIMRnaAO8JfmFPgURSX+T uhRNizCcMOZc/upOVMKoK8kgsNmirMuNWysgb63rv81nQwWTZ+d44ZMvucqvDEy9cdRECBJZHi2 MzOYgIz7kEjjzsXdOQ5xaiKJqeMrDvlvRcDpBbYQHUqaJ/lFakIITfgt/AuCYNFxRkZlIY6Mk7Q YiyN6QuyKua+HfZTU1KzewiTxL7NUYIysnRAFMVGFN7IVml73letAEMU+H/sy0+B441xzaYRJCt VEzfpqZu+CdIESMauW8ojqw== 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 696cdef279fb..bd05ae9b044a 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-dp.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-dp.c @@ -1819,6 +1819,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 02:36: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 6E225385515; Thu, 6 Aug 2026 00:39:16 +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=1785976758; cv=none; b=CQ0OJR5Hx1MI0XPfCv1QSh+OePcrBDxKFNwGZu0sRIVpoKN+Cq78H/B7t5rhpQDf0v3mRCjguoj+m47L9a8Jy49oMc4OxEh3IXt90XI2uUK/0fluIb9i27NT5xC7hbwR4Uu5BfWiCD9++pTKRx9supNHgQEVwZTkckcLCf9UVhc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785976758; c=relaxed/simple; bh=fcI6NxAi0w9kYs3KWpEoGjJ9DJV5ajPSR9SnFAY0JFY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Mz26AR3EOY20sSyvL0SWMLWzsSTCby5itbFLKXv3cjHTI69RAJA/h0ozvdwXcZ5NYZ+teg0DKin5zRjSXM+aAx9Yt12eKgbYS35d0IGpZ9SHta58QK48eTvrVLJvR+Nen3TxZa8a14ByfvEadAOOc6auIKdMvJbM0uwZDOvq1lo= 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=ZCouqlUo; 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="ZCouqlUo" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1785976751; bh=fcI6NxAi0w9kYs3KWpEoGjJ9DJV5ajPSR9SnFAY0JFY=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=ZCouqlUon+4oPxndlT3o5V1GekpaWkg/1cR+oRr5ipN4dFEeBNQ318Y6oML7rKMWb 6HGRi4aFlnE2AeUgHBHhMM7Rc3kYZBZRhZkO68sFeRS5P0ZF+qHX+fiEx5ik9chnuY xlE3NQzajJGa4El2CRytKPaGeWTEVPCR2JywjN+MqrKNi6pFJ8f4/pE3n2BoweJ/IU pt81XtNyKbqhVEnE0DjDW0nyEPSqufsVXm/ice/vqNy/Uo4EbxihnvpZUC1rPdEMmR VHNl+BT6bAFcKDSoUcJbrphySrj/68HzvpjKQSXtFsIyHQEBTaTme9QwnNUU3seC5P e1z2/Zk1Suz0A== 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 42DDF17E07DC; Thu, 06 Aug 2026 02:39:11 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 9409548003D; Thu, 06 Aug 2026 02:39:10 +0200 (CEST) From: Sebastian Reichel Date: Thu, 06 Aug 2026 02:39:15 +0200 Subject: [PATCH v10 09/21] drm/bridge: synopsys: dw-dp: Support MEDIA_BUS_FMT_FIXED Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260806-synopsys-dw-dp-improvements-v10-9-d84a26c303d6@collabora.com> References: <20260806-synopsys-dw-dp-improvements-v10-0-d84a26c303d6@collabora.com> In-Reply-To: <20260806-synopsys-dw-dp-improvements-v10-0-d84a26c303d6@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=fcI6NxAi0w9kYs3KWpEoGjJ9DJV5ajPSR9SnFAY0JFY=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGpz1653pQP0kGVVseMikIvI0y2JwzOOmNQiZ 0kYQSoffk4274kCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqc9euAAoJENju1/PI O/qa2gUP+wbkCNF37pnGW0Y1321xnOCnpa4hjp9MyvDns9J9eMSb0ZmmN7FHQXWwA2e/enUjQcb mxcX/TSDGfc71A2Wj0ZcOiVaXs6q9buW5I6XNmfook1LzWMkbfhKD4Merlo91rEa72btrnJH2br midg9+aAwsbp3tyrsPJ9LHBSjIfHHapjo3cjD0/AXwXBseV713s6s1zz1LxW8i/GS3UKeA8QBnY N1LnYxklUnlQ9V9NBUmopGuhQWBt3IQ97HWAL9+eGcygZSIm4vSg7zorayuZF0rQxXyD0esUyHY tpUnkJVMNLowKRVslxS9MmcelygGAcu6Zkb7lCw2mWvWJluIz1nDyzsbjjB/egFEsScFNw/OyFY aQi8BaAv6VHW9qo7ddZpvW1iCvbruQZXxYRK8ncuyte+1q/vbaOlM01lNDfwkoGGfaDWM7XLXm4 Ot/4881z3eutuaeWjzKT/AI/XwdSK0ssCNWtl2isxNLYzkQZNSzmv2YnXgudu7jJkNd4W49E9W7 X9Jiozj5T4ACf1wtwO8RReHXlJfEQ7h6A/3d4PLExiS6EOvB9FyWT8Tj7LTeuTLdYGkxtm/Idsm esTIVGRGjz6rV4AJVjUzPuRmlDB3veo78VVOgjiL7bT4xNulesHORRaszGoiyQM7knyYq/PvnES oSQDmwhq0Bv4a2LPq5IU3Mg== 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 bd05ae9b044a..106978544cdf 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 @@ -1829,6 +1833,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; @@ -1886,7 +1916,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 02:36: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 70ED7385D6A; Thu, 6 Aug 2026 00:39:16 +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=1785976758; cv=none; b=UzFe4eoDZnDIkZZjDLbZvMzjifabtvOdKX4RXcr5RDzG/4V2ee6h7miiSjFy9i6TIOzcG+h1UB3/yicw8QeXXO0Tlz9/Cmw+HKt4UgpXBnEZn5S434Mkhp4mF3rwIRFTbWICNbY4nJlACoRzn/z9eUsTuaYsU00UyMoWGv8Ojfs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785976758; c=relaxed/simple; bh=9FpV3bb9Yf8xHPTcxEl1re2wN0q3D7uWMoett4BthOc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=roy2TehQA9HVidIRXPpGI7KZQMTR7v93yRXC7wcNbTLYgsvkhZ1HCoMLBJOivPxoEoXxIlcnaXi0GWAIcc8hjahNwDbf4n9ejpNwTV/IT9QmJouNDzRZwM/qIBwkiadsLzXljGkW/TZAN4z97MvPp1iJbgZIYuKbn/PDmIU4ntA= 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=mguQgjGm; 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="mguQgjGm" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1785976751; bh=9FpV3bb9Yf8xHPTcxEl1re2wN0q3D7uWMoett4BthOc=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=mguQgjGmYeyZbzDZHA9Yh1SLVEHzr69GNCUncsHiEUgT3fUKr8Jm09gyeLG2knvoO PpwWsUtBlsJvCA+si9lh+F5z37LLjn5FWa0jM6OFTyNTQFJcwXs3y5EX2yQ2JIwY6T yDqJNdfm2gGqMW/bV8aBYIwJg4G2GUBAR5KO5JnSlZdEEbrrlOrtdCeP9KwRdELsWb YPcGVHJFgRqip1ZZyZBVTGS3IyZ3GJsfRK91DJ/4oWz7VA/sGX5tITwaawFlXtZf85 f4nJK2xR/dEVXrjBguSNCpXM42TFsikf4CDnzo6FXVmgiYwtHamjSjtqQ8cUjvl9rk 5HOk01SS2wKmQ== 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 4802517E07EF; Thu, 06 Aug 2026 02:39:11 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 957A8480047; Thu, 06 Aug 2026 02:39:10 +0200 (CEST) From: Sebastian Reichel Date: Thu, 06 Aug 2026 02:39:16 +0200 Subject: [PATCH v10 10/21] drm/bridge: synopsys: dw-dp: Add follow-up bridge support Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260806-synopsys-dw-dp-improvements-v10-10-d84a26c303d6@collabora.com> References: <20260806-synopsys-dw-dp-improvements-v10-0-d84a26c303d6@collabora.com> In-Reply-To: <20260806-synopsys-dw-dp-improvements-v10-0-d84a26c303d6@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=2690; i=sebastian.reichel@collabora.com; h=from:subject:message-id; bh=9FpV3bb9Yf8xHPTcxEl1re2wN0q3D7uWMoett4BthOc=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGpz166l8Qx4il2hZc+l9xFnjgOZyqG1wg0CB v+yNeUO1cKD+okCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqc9euAAoJENju1/PI O/qazyMQAIhAmg7+0ZYXGv0P1r5+bX/faYShLMUu4zd14bDEZHkUC3qDcV4FTco/1z4haxN3U/+ QwrfUTg6+013T5lBS7Cshyfz+aRiA2AKDGISFuI21StD1W9m8omi/OW9WQcwL2RWXoGOY8RoCCW eTPm0xKtkhXoZQIZUcbnbQ0pSLPbrZTl2WmrC1/H/6MJ+y5OjpfMVt9/qyru5zcVnd30pEPZKXR sPaCaei3r0E2b2GTxRVY/0N4n5U9ntkF2U2iwA09XOe2NLtqnhpYZcf0L95jhCxuKOwp05PcS2h 6j9IIz/9KGgWEkWQvlauKVG5FzkHkgZf1O4lB+a8sgG7gxT4WkHrmD+8wQ0TNK0iLSSHTrZETme 33jKu+oaBgP6hA2BMpcSNxtIap/lDBwAFwwdeHkmY3wsuwzADRFEIzO7Y9uv/d0bkTuOtRXpvtL RxW3Tx6VmN7vtctTDbUbiPuVwIXKsvsxxTBsSan9bNCHuCMT6FoBMb24fOmQ7XAjPEbp4QNbQ7w /5GhfNh+TaL1Sr1IMsBtPc5mDyoM+FcV4jJxCZXgZOF3NFx7ac61/+o+WALlwkU4ImYdzPPa2tw HvyW6JiMu3tq+eMzrvqpYd8MRg6wT8uv6uDk1adOf6OG1pVwjQlUufItebFFLfsrPTTcUSq7lzi LWQ2KikgdjTMapAPs/zYygQ== 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 | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/drivers/gpu/drm/bridge/synopsys/dw-dp.c b/drivers/gpu/drm/brid= ge/synopsys/dw-dp.c index 106978544cdf..ce5bf9f107cd 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 @@ -1893,8 +1895,28 @@ static int dw_dp_bridge_attach(struct drm_bridge *br= idge, goto err_disable_irq; } =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); + dev_err(dev, "failed to get follow-up bridge: %d\n", ret); + goto err_unregister_dp_aux; + } + + ret =3D drm_bridge_attach(encoder, dp->next_bridge, bridge, + DRM_BRIDGE_ATTACH_NO_CONNECTOR); + if (ret) { + dev_err(dev, "Failed to attach next bridge: %d\n", ret); + goto err_put_next_bridge; + } + return 0; =20 +err_put_next_bridge: + drm_bridge_put(dp->next_bridge); + +err_unregister_dp_aux: + drm_dp_aux_unregister(&dp->aux); + err_disable_irq: disable_irq(dp->irq); cancel_work_sync(&dp->hpd_work); @@ -1905,6 +1927,7 @@ static void dw_dp_bridge_detach(struct drm_bridge *br= idge) { struct dw_dp *dp =3D bridge_to_dp(bridge); =20 + drm_bridge_put(dp->next_bridge); drm_dp_aux_unregister(&dp->aux); disable_irq(dp->irq); cancel_work_sync(&dp->hpd_work); --=20 2.53.0 From nobody Fri Oct 2 02:36: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 EF5BA386435; Thu, 6 Aug 2026 00:39:16 +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=1785976759; cv=none; b=pMCuR8rr8wHK7FNm7/DJXfqhSs7xSTUE1mdOpSEjfJKWBV1SIhC9iQGij//Udn5ToGFz+ac83q0HauaO66q/vTX3/JMPW6O+d/RaIoe6EFBoWy49riSU3omcxHoe1XcJKI0dDlm1VxPshf3KloGL3vqyiyTd38NAO2K4CNfpUtU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785976759; c=relaxed/simple; bh=rAX8Gkdd0l2SvPThxGwSATdesygL1W5j4bmXRGpe4TM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=PKGmiTyuJAVKaoxKzgBDo2/I0qf87HIn8ekEQ87BsGUuVfqi0wsJy9hMmyTag0gTIC4X3SYEY0hVnwJm18XIJgxXCvgJynunke86XFCiVSTwpld0MiUpALXI7IN+VoSaayS0953RuvXEay5HCm4VVcvYeI+6hiKkRpsMzzxY6ZA= 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=QFua4Zhb; 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="QFua4Zhb" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1785976751; bh=rAX8Gkdd0l2SvPThxGwSATdesygL1W5j4bmXRGpe4TM=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=QFua4Zhb0W0wJdtBf8ANDBppSl+FLqdeI1+wXp2EBsxDPhxV3N87GvyG383tuME/a E1/cxQfwMaFbcZFlL2dqYMLn7xrevpgHiRf/TxVKNBR3/Zn2ZU3iCL3OSuL+WY38TU 38bSePdeKz5QqmWHAmzpIZ8dfRX8BXx3WJC8RmTXl08ydYvdSva6BnXrwODKPEQuOE nCCdC1p7WafGNbmIA7mjFIcXCyvWVee6wA8Ft2N/L9oO+ho1xXEZJYjJTg7jVUS8jf z5GgQvwsvCig/NCTXGqLRtC+VsEzZWAR1cxP/VOa87JouHvmHs+xJzEZv287vI/XHN EF8XE0B/eR2rg== 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 4EF1717E07F7; Thu, 06 Aug 2026 02:39:11 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 970DD480048; Thu, 06 Aug 2026 02:39:10 +0200 (CEST) From: Sebastian Reichel Date: Thu, 06 Aug 2026 02:39:17 +0200 Subject: [PATCH v10 11/21] drm/bridge: Add out-of-band HPD notify handler Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260806-synopsys-dw-dp-improvements-v10-11-d84a26c303d6@collabora.com> References: <20260806-synopsys-dw-dp-improvements-v10-0-d84a26c303d6@collabora.com> In-Reply-To: <20260806-synopsys-dw-dp-improvements-v10-0-d84a26c303d6@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+poByyZiAGpz166vhmZxydrfD1ATurkKAw4amu5bN4ra5 utkp8KbJs1C64kCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqc9euAAoJENju1/PI O/qaE/gP/j8WPZxUx62lLvo0IQwmS+iFvhLErdsMkOFm9gE8blbMhIW3w0mdq6C5V016SHL9jET ZwqwPu+lBfn014O6KiAppHmxCxs228biavcxXdzo1FQu8TyExGykyRRyieRinkfN1Sr4DsQ+3GG gC9sCcKJ53G6LayyneumeSEb2NkwHHleMG8nVqg3sG5hVGhbj5Hfncw7n6YDXyb+85ENrbqZPZ+ jVW9fx/4B+KF/Syr30yxxOWYu35nZXlqiPY2o9suQp2MkPUxoj7O3pzMnk+DSnzmwuJkfEtskKZ 7FDB/opk9i3IdYXoPsAYr2TjM06KdIsHxQcbQ6CXaD9zWaic8W6XpUo1y8IcU70JXSFlDsjEro8 Ycb1DUz5hBiAwUyavnOKf6FrPpjyjQnv/xcVRUAV1gxnXoxToC9tJHBSkfs7pnOC68Ei2aqMk7h QKds4lK7OL16xI1oqXACaYDVzWyhRxoJyD6cIEuV67xsfljWILmrwnEuLoUMNeT9xv1u41/Zp8I IRk7p8eSpQYtCAkzcK17XC9zMYvRkMprXuUbAfOFk2F13In3CysM6zIjAATcMPGzsyh6lPEdQ0i 20bBJWLA6IZ1uL9En2FNbklteO02ekw1R7m0AQQrytln1b0fVr/+U4wxndZFCBoqmNJdMWeMqo6 cEzF4c2Hhvmd7SKM2HKwwcQ== 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 02:36: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 F04C3386566; Thu, 6 Aug 2026 00:39:16 +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=1785976759; cv=none; b=mF/BWx2KLOpQawXcklF2+1FY2A0mIwdibtgkPdL24k5lOm42+EeCJQC2D9+E3wuqRXdayrdbdLt15HOsFpPuGFOIgxY40c6ndnzCFK8xB8TflzCuHUccapp6asMF0SaOwfZPv/Vb2nVxBKuQXJLDzjej+xWZloMZ5UrUZHbkow8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785976759; c=relaxed/simple; bh=AuKS5pQ+7scVhYQSjD3cnZTP+tgPt5ol6hiWlnneAu8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=p63/KTPWAwnjMqK7nEqmANhfwsNqWwRMcmMpUf1pFMhaaaJqriuO++3ffNCpg0Atb+hvnEvlkPige5NKvd52rFXXfMycTrxV7znvtThgWnX8H8mwIlGwg3e3C2dprCvJOhjZ0SdUxMqpKTzoptddbnHXIoghiW7d7SngAGqkctE= 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=Idv5+evr; 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="Idv5+evr" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1785976751; bh=AuKS5pQ+7scVhYQSjD3cnZTP+tgPt5ol6hiWlnneAu8=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=Idv5+evrUgWE2gYPKzAYSJuMMGt0fK2fGa0YVzmusmjn/mi9w694ZXEYM1sZ1iMif TMOmWcSsWfy4Jzqmtm5ch+9M+RnVvuC2XS/QmjgsOJFue7zv5hYM/cUYxyMgkF9oOC ilSZEXZ1VmYk1nfO+Va1+njoU1l0fGP2ERKy99FU1qZmCWOM3t4d6EMa9sjwHYv7TX vN7mp+/oCncStwb1cL/Y8FS2w1bcNATp66kXiNcdInjzsDXrnBfBd28oM6i77LAgo/ 2c1gUVFyiCbEsPupzRYXPSJMXwdjoPITMhKC3PRw1fbG0ZFfmA8DwnaCrlvA9orQW9 yXlRH4Xy2/AzA== 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 51DCF17E07FC; Thu, 06 Aug 2026 02:39:11 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 986E548004C; Thu, 06 Aug 2026 02:39:10 +0200 (CEST) From: Sebastian Reichel Date: Thu, 06 Aug 2026 02:39:18 +0200 Subject: [PATCH v10 12/21] drm/bridge: synopsys: dw-dp: Support software triggered OOB HPD Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260806-synopsys-dw-dp-improvements-v10-12-d84a26c303d6@collabora.com> References: <20260806-synopsys-dw-dp-improvements-v10-0-d84a26c303d6@collabora.com> In-Reply-To: <20260806-synopsys-dw-dp-improvements-v10-0-d84a26c303d6@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=3723; i=sebastian.reichel@collabora.com; h=from:subject:message-id; bh=AuKS5pQ+7scVhYQSjD3cnZTP+tgPt5ol6hiWlnneAu8=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGpz164VeC57ES0o/LtiVdALS5O3Qp0Wj8R5d +UKuYsy6/N/Y4kCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqc9euAAoJENju1/PI O/qaNPYP/Rg23VSK5NmLVnF47H/K36zOrgUR9wh+Osc8IBdV37U/XxNmJ+s4SYoqyQcunC+lspg HSELnO2W2cetE4CGkwRS7L1KaEdMNROb/XmAGfNtEMY5i/UNXzYLjKsRlVvmmQgiPjsnLn0Mjvx Qa6jdPbdinA490MZeL1Hb35VZ5XAPacdw7f/UPZq6vX8It6tdW1fPjJs9Xio+qJLKWlFc90Butt r+kQaXyB9Q7cKV3YA4D3tbrfIqTM0KmRWkG/s0bHGQIVqdWKH9GZRO2LVf3D+5ADE0DLC7ld5Ri 52HJO12ogf9cKFBCfKor3Q4AITkINMU/8nUm8FBZMmdrNxWiYNk8a6ipWlUXu7g4xxDUgTnvp6h pfh0J2QFErznXptWb9IISwpHnbz57vB0A6VVkJ3HhoyLtc7RfVDN0//NV4+c+bpPhrlNpXjfMwa in4YUXuLBWf6I57yzD1+4+tRnvCxDk8/zLoIzVk4hF1cP/euVA9+e8FH5ZpDyOecYbxWerEldkv KeE1k6O9LrXdq+p2hpEygpfUEP01Wn1GE5jqhiOI0m5W23qayml5/M1EpWEQejc7Kf3fiYCfB/I ZoGHluyNYDu+tl8FBn7BZH4S1Y6gwamwx9KF96O0SUokIxfZ4AHza8t+dZKqSNSuJwKYsFin1hg qtu8OevlXwNEME5dmEUkujA== 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 ce5bf9f107cd..d0538e60ac5c 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-dp.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-dp.c @@ -1874,6 +1874,19 @@ static struct drm_bridge_state *dw_dp_bridge_atomic_= duplicate_state(struct drm_b return &state->base; } =20 +static bool dw_dp_is_routed_to_usb_c(struct drm_encoder *encoder) +{ + struct drm_bridge *last_bridge __free(drm_bridge_put) =3D NULL; + struct fwnode_handle *fwnode; + + last_bridge =3D drm_bridge_chain_get_last_bridge(encoder); + if (!last_bridge) + return false; + + fwnode =3D of_fwnode_handle(last_bridge->of_node); + return fwnode_device_is_compatible(fwnode, "usb-c-connector"); +} + static int dw_dp_bridge_attach(struct drm_bridge *bridge, struct drm_encoder *encoder, enum drm_bridge_attach_flags flags) @@ -1909,6 +1922,13 @@ static int dw_dp_bridge_attach(struct drm_bridge *br= idge, goto err_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 err_put_next_bridge: @@ -1933,6 +1953,19 @@ static void dw_dp_bridge_detach(struct drm_bridge *b= ridge) cancel_work_sync(&dp->hpd_work); } =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, @@ -1947,6 +1980,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) @@ -2108,6 +2142,10 @@ struct dw_dp *dw_dp_probe(struct platform_device *pd= ev, const struct dw_dp_plat_ =20 dp->dev =3D dev; dp->pixel_mode =3D plat_data->pixel_mode; + + dp->plat_data.hpd_sw_sel =3D plat_data->hpd_sw_sel; + dp->plat_data.hpd_sw_cfg =3D plat_data->hpd_sw_cfg; + dp->plat_data.data =3D plat_data->data; dp->plat_data.max_link_rate =3D plat_data->max_link_rate; =20 INIT_WORK(&dp->hpd_work, dw_dp_hpd_work); diff --git a/include/drm/bridge/dw_dp.h b/include/drm/bridge/dw_dp.h index a82412a9e769..79b2cdf0df99 100644 --- a/include/drm/bridge/dw_dp.h +++ b/include/drm/bridge/dw_dp.h @@ -20,6 +20,9 @@ enum { struct dw_dp_plat_data { u32 max_link_rate; u8 pixel_mode; + void *data; + void (*hpd_sw_sel)(void *data, bool hpd); + void (*hpd_sw_cfg)(void *data, bool hpd); }; =20 int dw_dp_bind(struct dw_dp *dp, struct drm_encoder *encoder); --=20 2.53.0 From nobody Fri Oct 2 02:36: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 19AAB388393; Thu, 6 Aug 2026 00:39:17 +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=1785976760; cv=none; b=qBBIG6xw9pkror/iakdSVBpoPFSppk311yyP32DLdNClO6T891OcvyEPCf6711XWQnpNKXMRuIwPFvxX++Bs2Pn27g6IJWpfVkDk4nnLZQuEwDAsPn/gS/5Q3ulwQlqxqWCADLZrZVx+wLiVjDijmSF0TT2aBejxBZKsjkLDwrE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785976760; c=relaxed/simple; bh=8AzTw6Q7BgLg8qygPB9irNWnzZO5bZlDFBZ2JLmp7kk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=O0hT0Q3pofiyIMXbdOTx6N3oOKaByDZOhO5nn4h+oFUfOsBXWtJ+EsIzt3PEYjklH9wnrzOccl/Txn7NGGVwPUAe/nafMFQ72gCTtv7hVnC77nwjklcQlVmWgAd6rQpkUkxICf3jx3UVmEWjkG4UVR5YtwuqTiBNoYxpIG/OLns= 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=cGdXV9we; 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="cGdXV9we" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1785976751; bh=8AzTw6Q7BgLg8qygPB9irNWnzZO5bZlDFBZ2JLmp7kk=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=cGdXV9weXOOrbxzTQKfd7inqRBNwud9KYwy5SIipdKblJzYOukLKzRovo9GECXqTE ALASn4hoKBvT1okzjeG2D593+zXNeUQ4qwd3XKYA5vdaL4TaySHJUvWTMadpuQoWxl hNuvllYu09Fx5xnDXDlfoRoMAz6+wUYjfhGKSRZDiwlA1tpv7GS7lfWM1hBJX4IoXD FKNyVhNapqG14L9v2wkJMe8krqKLecw6il51JjJk1rDpMwwwGveHuCCdSlMu0s3jx6 SCS+bb35wsLR1/Di7Z9XUXpvz69/00xSR5HubpyNOT8HeGq4D1hj6DjUTeFnib3zAP 87Vdsh7LYArpw== 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 5B74417E0824; Thu, 06 Aug 2026 02:39:11 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 99E1B48004E; Thu, 06 Aug 2026 02:39:10 +0200 (CEST) From: Sebastian Reichel Date: Thu, 06 Aug 2026 02:39:19 +0200 Subject: [PATCH v10 13/21] drm/rockchip: dw_dp: Implement out-of-band HPD handling Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260806-synopsys-dw-dp-improvements-v10-13-d84a26c303d6@collabora.com> References: <20260806-synopsys-dw-dp-improvements-v10-0-d84a26c303d6@collabora.com> In-Reply-To: <20260806-synopsys-dw-dp-improvements-v10-0-d84a26c303d6@collabora.com> To: Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Rob Herring , Krzysztof Kozlowski , Conor Dooley , David Airlie , Simona Vetter , Dmitry Baryshkov , Luca Ceresoli , Philipp Zabel Cc: Cristian Ciocaltea , Damon Ding , Dmitry Baryshkov , Alexey Charkov , dri-devel@lists.freedesktop.org, linux-rockchip@lists.infradead.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, kernel@collabora.com, linux-arm-kernel@lists.infradead.org, Sebastian Reichel X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=6435; i=sebastian.reichel@collabora.com; h=from:subject:message-id; bh=8AzTw6Q7BgLg8qygPB9irNWnzZO5bZlDFBZ2JLmp7kk=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGpz165jtivQsCn9ktt9gldDDBva4/2qBhS3G jnp3e4VdkVmGokCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqc9euAAoJENju1/PI O/qaiEgP/jy8JS6oes3UQlE4PmytyNaoWbiHsG9zmgz6TUCAnTius6xt7yYQXgMQGhVqyMEnjBg bgSKdgaHNN5CN7sUE0t9OeB8AqU/mqPoOdXIuA2+TQ/n6dPLRJfkA1I0IT0W8CknfoAuvyqmuhD fG9lmngNm8TvqxtDAH6uyBru3q8UTTLFBIh5zH5TRsIbuMRV53YXZsSVYhFchaSUDRRzl4T1CQc MJDT5BVSR8xAGYwqEgujzj2yPgS2ssnPgTYq1bh82VD3V4VMiAx1JU3Mz6JQmlXBTL6YLehrpcf yrTsXfCrgL+BuTkrWHlv6ncSyV6rLyH7NF5PNBco0ea/DIviFov6ujO7kRWbL/LyHv6wLMOHIVy Cp1wMaRSeIy7srLpp3CDwfJcogxna3jVBJ1c5fNIiLn+cUoQIz6zNk6Hdh44CQL2da4iIMYmlra XC8UvrfD3mkWw0vwkryZg4gs+w+a8nfAQgk1CdrIqzTVl/9nAAJs+OjRISxZolP/hRxgCThjsF+ V7FYjeVIWqMQkZ1Fij78pvZdd/j0SM4z/oeEnYMKgh1B3Lvm6NP/U7Kd5WSH1cS+g9yP4+CazHG 7W2zE/q50V44oO5+DDdhnoUymNQXnbxWsP1Yg63b+qF9bwEy6LaEuI+BHYqBUraTlt5asp0RdTN CwXZzq07nwK1nuUHobvopUw== X-Developer-Key: i=sebastian.reichel@collabora.com; a=openpgp; fpr=EF660D07463F8B726A795413D8EED7F3C83BFA9A Implement out-of-band hotplug handling, which will be used to receive external hotplug information from the USB-C state machine. This is currently handled by the USBDP PHY, which brings quite some trouble as the register being accessed requires the power-domain from the DP controller. Thus this patch prevents massive SError problems once runtime PM is implemented (and enabled) in the DP driver. Apart from that it avoids custom TypeC HPD info parsing in the USBDP PHY driver. In contrast to the USBDP PHY this does not just enable the hotplug signal when a DP AltMode capable adapter is plugged in, but instead properly detects if a cable is plugged in for things like USB-C to HDMI adapters. Signed-off-by: Sebastian Reichel --- drivers/gpu/drm/rockchip/dw_dp-rockchip.c | 118 ++++++++++++++++++++++++++= ++-- 1 file changed, 113 insertions(+), 5 deletions(-) diff --git a/drivers/gpu/drm/rockchip/dw_dp-rockchip.c b/drivers/gpu/drm/ro= ckchip/dw_dp-rockchip.c index 38e8fe75718e..9e49e7dbf420 100644 --- a/drivers/gpu/drm/rockchip/dw_dp-rockchip.c +++ b/drivers/gpu/drm/rockchip/dw_dp-rockchip.c @@ -7,9 +7,12 @@ */ =20 #include +#include #include +#include #include #include +#include #include =20 #include @@ -23,12 +26,48 @@ =20 #include "rockchip_drm_drv.h" =20 +#define ROCKCHIP_MAX_CTRLS 2 + +#define ROCKCHIP_VO_GRF_DP_SINK_HPD_SEL BIT(10) +#define ROCKCHIP_VO_GRF_DP_SINK_HPD_CFG BIT(11) + +struct rockchip_dw_dp_plat_data { + u8 num_ctrls; + u64 ctrl_ids[ROCKCHIP_MAX_CTRLS]; + u32 max_link_rate; + u8 pixel_mode; + u32 hpd_reg[ROCKCHIP_MAX_CTRLS]; +}; + struct rockchip_dw_dp { struct dw_dp *base; struct device *dev; + const struct rockchip_dw_dp_plat_data *pdata; + struct regmap *vo_grf; struct rockchip_encoder *encoder; + int id; }; =20 +static void dw_dp_rockchip_hpd_sw_sel(void *data, bool force_hpd_from_sw) +{ + struct rockchip_dw_dp *dp =3D data; + u32 hpd_reg =3D dp->pdata->hpd_reg[dp->id]; + + regmap_write(dp->vo_grf, hpd_reg, + FIELD_PREP_WM16(ROCKCHIP_VO_GRF_DP_SINK_HPD_SEL, force_hpd_from_sw)= ); +} + +static void dw_dp_rockchip_hpd_sw_cfg(void *data, bool hpd) +{ + struct rockchip_dw_dp *dp =3D data; + u32 hpd_reg =3D dp->pdata->hpd_reg[dp->id]; + + dev_dbg(dp->dev, "Force HPD connected=3D%s\n", str_yes_no(hpd)); + + regmap_write(dp->vo_grf, hpd_reg, + FIELD_PREP_WM16(ROCKCHIP_VO_GRF_DP_SINK_HPD_CFG, hpd)); +} + static int dw_dp_encoder_atomic_check(struct drm_encoder *encoder, struct drm_crtc_state *crtc_state, struct drm_connector_state *conn_state) @@ -71,6 +110,35 @@ static const struct drm_encoder_helper_funcs dw_dp_enco= der_helper_funcs =3D { .atomic_check =3D dw_dp_encoder_atomic_check, }; =20 +static struct regmap *dw_dp_rockchip_get_vo_grf(struct rockchip_dw_dp *dp) +{ + struct device_node *np =3D dev_of_node(dp->dev); + struct of_phandle_args args; + struct regmap *regmap; + int ret; + + ret =3D of_parse_phandle_with_args(np, "phys", "#phy-cells", 0, &args); + if (ret) + return ERR_PTR(-ENODEV); + + /* + * Limit this workaround to RK3576 and RK3588, potential future platforms + * reusing the driver should just add a VO GRF phandle in the DisplayPort + * controller DT node. + */ + if (!of_device_is_compatible(args.np, "rockchip,rk3576-usbdp-phy") && + !of_device_is_compatible(args.np, "rockchip,rk3588-usbdp-phy")) { + regmap =3D ERR_PTR(-ENODEV); + goto out_put_node; + } + + regmap =3D syscon_regmap_lookup_by_phandle(args.np, "rockchip,vo-grf"); + +out_put_node: + of_node_put(args.np); + return regmap; +} + static int dw_dp_rockchip_bind(struct device *dev, struct device *master, = void *data) { struct rockchip_dw_dp *dp =3D dev_get_drvdata(dev); @@ -121,19 +189,53 @@ static const struct component_ops dw_dp_rockchip_comp= onent_ops =3D { =20 static int dw_dp_rockchip_probe(struct platform_device *pdev) { - const struct dw_dp_plat_data *plat_data; + const struct rockchip_dw_dp_plat_data *plat_data_const; + struct dw_dp_plat_data *plat_data; struct device *dev =3D &pdev->dev; struct rockchip_dw_dp *dp; + struct resource *res; + int id; =20 - plat_data =3D of_device_get_match_data(dev); - if (!plat_data) + plat_data_const =3D device_get_match_data(dev); + if (!plat_data_const) return -ENODEV; =20 + plat_data =3D devm_kzalloc(dev, sizeof(*plat_data), GFP_KERNEL); + if (!plat_data) + return -ENOMEM; + dp =3D devm_kzalloc(dev, sizeof(*dp), GFP_KERNEL); if (!dp) return -ENOMEM; platform_set_drvdata(pdev, dp); dp->dev =3D dev; + dp->pdata =3D plat_data_const; + + res =3D platform_get_mem_or_io(pdev, 0); + if (!res) + return -ENODEV; + + /* find the DisplayPort ID from the io address */ + dp->id =3D -ENODEV; + for (id =3D 0; id < plat_data_const->num_ctrls; id++) { + if (res->start =3D=3D plat_data_const->ctrl_ids[id]) { + dp->id =3D id; + break; + } + } + + if (dp->id < 0) + return dp->id; + + dp->vo_grf =3D dw_dp_rockchip_get_vo_grf(dp); + if (IS_ERR(dp->vo_grf)) + return PTR_ERR(dp->vo_grf); + + plat_data->max_link_rate =3D plat_data_const->max_link_rate; + plat_data->pixel_mode =3D plat_data_const->pixel_mode; + plat_data->hpd_sw_sel =3D dw_dp_rockchip_hpd_sw_sel; + plat_data->hpd_sw_cfg =3D dw_dp_rockchip_hpd_sw_cfg; + plat_data->data =3D dp; =20 dp->base =3D dw_dp_probe(pdev, plat_data); if (IS_ERR(dp->base)) @@ -147,14 +249,20 @@ static void dw_dp_rockchip_remove(struct platform_dev= ice *pdev) component_del(&pdev->dev, &dw_dp_rockchip_component_ops); } =20 -static const struct dw_dp_plat_data rk3588_dp_plat_data =3D { +static const struct rockchip_dw_dp_plat_data rk3588_dp_plat_data =3D { + .num_ctrls =3D 2, + .ctrl_ids =3D {0xfde50000, 0xfde60000}, .max_link_rate =3D 810000, .pixel_mode =3D DW_DP_MP_QUAD_PIXEL, + .hpd_reg =3D {0x0000, 0x0008}, }; =20 -static const struct dw_dp_plat_data rk3576_dp_plat_data =3D { +static const struct rockchip_dw_dp_plat_data rk3576_dp_plat_data =3D { + .num_ctrls =3D 1, + .ctrl_ids =3D {0x27e40000}, .max_link_rate =3D 810000, .pixel_mode =3D DW_DP_MP_DUAL_PIXEL, + .hpd_reg =3D {0x0000}, }; =20 static const struct of_device_id dw_dp_of_match[] =3D { --=20 2.53.0 From nobody Fri Oct 2 02:36: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 35C2F3A2E2E; Thu, 6 Aug 2026 00:39:20 +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=1785976763; cv=none; b=tj8NrzO8Ixe+UrAWdtjqx83m6CjFykBe1dIzl44V1ysJBGLGlQeMr89dOKdMWX5Rq/HrTUKs5ZOHptTkIRo5kIgMWw3OtKtD6BVAkmH0+XmSTCnutvRftTi1sGO28E812jziddRvV1GjgexXKTWyB2WgoJvEMYnuEuczoQ91quE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785976763; c=relaxed/simple; bh=PhI/zPp4Sbc++6BDdoGyNtD3qMDbtTLfNKGUXYpti9o=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=lP6UpT7tTy70lOKl+6UiwMez8+ak3iE8uj0BS2G/WZeq0ehkivT5pbpJ0bsTui8MyAQgGX98KLQGgsUPG9ogsGlEW36sf/Z1S3vWVVh8O0W+33bGzn9tocZ+bQzmaBBEQmDoS0wPxyiZVkZ2zy6Pfm/nJSSAEA5H8ROSf0R1bN4= 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=BeHnzgsM; 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="BeHnzgsM" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1785976751; bh=PhI/zPp4Sbc++6BDdoGyNtD3qMDbtTLfNKGUXYpti9o=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=BeHnzgsMV+2Hyd/hFnrbv0GsclMSuddq6I1VC1dbarZoTl/irm7+IGc0D4XXhkreu 56ASp+3N8lESQ6DamxILeTXj79GPz5eKFzUcCfq6FC0XHP+oQ3Aj7vOsdoVjYMVMWo KD0V8g9qt7MhkuTj4fnIR/Xw8njihpPX5PaWnBPcbsei2MaC2TNe58I+wPCHUB+plR pxYeU9iBpHiB4HW5veB8IsFM6PCh58PtNqpd/CjkV22Z3ZkRa0DQEPxnAz5ey80RWt BREINjB5F3O24dyw7okI3JHAIR87AhM86AfWXcccAKlUP1EBiRR5dV5yZzEuFz5nfy dKQi2jlb74iCA== 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 6037E17E0829; Thu, 06 Aug 2026 02:39:11 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 9B425480052; Thu, 06 Aug 2026 02:39:10 +0200 (CEST) From: Sebastian Reichel Date: Thu, 06 Aug 2026 02:39:20 +0200 Subject: [PATCH v10 14/21] drm/bridge: synopsys: dw-dp: Add Runtime PM support Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260806-synopsys-dw-dp-improvements-v10-14-d84a26c303d6@collabora.com> References: <20260806-synopsys-dw-dp-improvements-v10-0-d84a26c303d6@collabora.com> In-Reply-To: <20260806-synopsys-dw-dp-improvements-v10-0-d84a26c303d6@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=13579; i=sebastian.reichel@collabora.com; h=from:subject:message-id; bh=PhI/zPp4Sbc++6BDdoGyNtD3qMDbtTLfNKGUXYpti9o=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGpz164fLWL5ddP21JHzfQOeDNGXI1D3OkPUk r9eFT1+8iJjv4kCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqc9euAAoJENju1/PI O/qaVHkP/iVGTDXMmgqx/E8qiMln9QnbsrFhcxji4EWYSorK8RdmTl4CeYsflTJVMObdDZMv83J wdel3sKbOQR/YMFGqrznx8Nrh5Rn2QaFBCtGX7ofkyy9LKgA77NID3GvGHMfVbaumADi6JdjARC gSuh3agxOU4BqTD0xyqCIa006C93wEBvs9PyNObwh85dizdLdqvu6og/u2ntol9D4zsFKVvZVYC 5EAlcSlxCbYXU7WKon2rQkSt4OrrnKqXA4Xd9TYYrIM9xLkQh9CzUSY+m6qup01d//TZeZZJY0L J7SuJpfp+YNFPe5+sVg5DRwovHZNNkI/Ckg15N2EqR6Lfl6BXTzH5IcW/AUmJvGyxTXL+WTm3Nr ihgI9tpJfEE0I46yzQg5OAStIKriaLITsCgoNyySne3JALTXAfiRH/gkmBWrYSbLW/znJXPK8/M CpAnU8mNb4LSx2zRq1q+CsYux9LN1YU075QpwReBC/VkshuUBVvBpkiEV9NcEvbg25lvs7wEVVX +SUoWg/+g119iv3Jhju0FjzmW/il1KDKqgAHT+75gbnDJW5oOgL89MFEzogDzaQoJX0A0DH143X Dt4mufzrLUpglvAoaKvKnpH5rhQJ/nYiesOEMszhqOzf60pZIGeQYsd1CKqL9N5FYQXr5T/oj4a uEYgn0Op5rgmhM6QxJyksoA== 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 | 198 +++++++++++++++++++++++++-= ---- drivers/gpu/drm/rockchip/dw_dp-rockchip.c | 8 +- include/drm/bridge/dw_dp.h | 7 +- 3 files changed, 181 insertions(+), 32 deletions(-) diff --git a/drivers/gpu/drm/bridge/synopsys/dw-dp.c b/drivers/gpu/drm/brid= ge/synopsys/dw-dp.c index d0538e60ac5c..b8ba884d04ed 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) { @@ -1681,6 +1689,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"); @@ -1731,10 +1746,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) @@ -1755,6 +1775,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 @@ -1900,6 +1924,10 @@ static int dw_dp_bridge_attach(struct drm_bridge *br= idge, dp->aux.name =3D dev_name(dev); dp->aux.transfer =3D dw_dp_aux_transfer; =20 + ret =3D pm_runtime_get_active(dp->dev, RPM_TRANSPARENT); + if (ret) + return ret; + enable_irq(dp->irq); =20 ret =3D drm_dp_aux_register(&dp->aux); @@ -1922,11 +1950,15 @@ static int dw_dp_bridge_attach(struct drm_bridge *b= ridge, goto err_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; @@ -1940,6 +1972,9 @@ static int dw_dp_bridge_attach(struct drm_bridge *bri= dge, err_disable_irq: disable_irq(dp->irq); cancel_work_sync(&dp->hpd_work); + + pm_runtime_put_autosuspend(dp->dev); + return ret; } =20 @@ -1951,6 +1986,8 @@ static void dw_dp_bridge_detach(struct drm_bridge *br= idge) drm_dp_aux_unregister(&dp->aux); disable_irq(dp->irq); cancel_work_sync(&dp->hpd_work); + if (!dp->usbc_mode) + pm_runtime_put_autosuspend(dp->dev); } =20 static void dw_dp_bridge_oob_notify(struct drm_bridge *bridge, @@ -1959,6 +1996,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); @@ -2018,6 +2063,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); @@ -2128,13 +2178,24 @@ static void dw_dp_phy_exit(void *data) phy_exit(dp->phy); } =20 -struct dw_dp *dw_dp_probe(struct platform_device *pdev, const struct dw_dp= _plat_data *plat_data) +static void dw_dp_manual_suspend(void *data) +{ + struct dw_dp *dp =3D data; + + dw_dp_runtime_suspend(dp); +} + +static void dw_dp_enable_irq(void *data) +{ + struct dw_dp *dp =3D data; + + enable_irq(dp->irq); +} + +struct dw_dp *dw_dp_alloc(struct platform_device *pdev, const struct dw_dp= _plat_data *plat_data) { struct device *dev =3D &pdev->dev; - struct drm_bridge *bridge; - void __iomem *res; struct dw_dp *dp; - int ret; =20 dp =3D devm_drm_bridge_alloc(dev, struct dw_dp, bridge, &dw_dp_bridge_fun= cs); if (IS_ERR(dp)) @@ -2147,58 +2208,71 @@ struct dw_dp *dw_dp_probe(struct platform_device *p= dev, const struct dw_dp_plat_ dp->plat_data.hpd_sw_cfg =3D plat_data->hpd_sw_cfg; dp->plat_data.data =3D plat_data->data; dp->plat_data.max_link_rate =3D plat_data->max_link_rate; + dp->plat_data.autosuspend_delay =3D plat_data->autosuspend_delay; =20 INIT_WORK(&dp->hpd_work, dw_dp_hpd_work); init_completion(&dp->complete); =20 + return dp; +} +EXPORT_SYMBOL_GPL(dw_dp_alloc); + +int dw_dp_probe(struct dw_dp *dp) +{ + struct device *dev =3D dp->dev; + struct platform_device *pdev =3D to_platform_device(dev); + struct drm_bridge *bridge; + void __iomem *res; + int ret; + ret =3D devm_mutex_init(dev, &dp->irq_lock); if (ret) - return ERR_PTR(ret); + return ret; =20 res =3D devm_platform_ioremap_resource(pdev, 0); if (IS_ERR(res)) - return ERR_CAST(res); + return PTR_ERR(res); =20 dp->regmap =3D devm_regmap_init_mmio(dev, res, &dw_dp_regmap_config); if (IS_ERR(dp->regmap)) { dev_err_probe(dev, PTR_ERR(dp->regmap), "failed to create regmap\n"); - return ERR_CAST(dp->regmap); + return PTR_ERR(dp->regmap); } =20 dp->phy =3D devm_of_phy_get(dev, dev->of_node, NULL); if (IS_ERR(dp->phy)) { dev_err_probe(dev, PTR_ERR(dp->phy), "failed to get phy\n"); - return ERR_CAST(dp->phy); + return PTR_ERR(dp->phy); } =20 - dp->apb_clk =3D devm_clk_get_enabled(dev, "apb"); + dp->apb_clk =3D devm_clk_get(dev, "apb"); if (IS_ERR(dp->apb_clk)) { dev_err_probe(dev, PTR_ERR(dp->apb_clk), "failed to get apb clock\n"); - return ERR_CAST(dp->apb_clk); + return PTR_ERR(dp->apb_clk); } =20 - dp->aux_clk =3D devm_clk_get_enabled(dev, "aux"); + dp->aux_clk =3D devm_clk_get(dev, "aux"); if (IS_ERR(dp->aux_clk)) { dev_err_probe(dev, PTR_ERR(dp->aux_clk), "failed to get aux clock\n"); - return ERR_CAST(dp->aux_clk); + return PTR_ERR(dp->aux_clk); } =20 dp->i2s_clk =3D devm_clk_get_optional(dev, "i2s"); if (IS_ERR(dp->i2s_clk)) { dev_err_probe(dev, PTR_ERR(dp->i2s_clk), "failed to get i2s clock\n"); - return ERR_CAST(dp->i2s_clk); + return PTR_ERR(dp->i2s_clk); } =20 dp->spdif_clk =3D devm_clk_get_optional(dev, "spdif"); if (IS_ERR(dp->spdif_clk)) { dev_err_probe(dev, PTR_ERR(dp->spdif_clk), "failed to get spdif clock\n"= ); - return ERR_CAST(dp->spdif_clk); + return PTR_ERR(dp->spdif_clk); } =20 dp->hdcp_clk =3D devm_clk_get(dev, "hdcp"); if (IS_ERR(dp->hdcp_clk)) { dev_err_probe(dev, PTR_ERR(dp->hdcp_clk), "failed to get hdcp clock\n"); - return ERR_CAST(dp->hdcp_clk); + return PTR_ERR(dp->hdcp_clk); } =20 /* @@ -2208,31 +2282,57 @@ struct dw_dp *dw_dp_probe(struct platform_device *p= dev, const struct dw_dp_plat_ dp->rstc =3D devm_reset_control_get(dev, NULL); if (IS_ERR(dp->rstc)) { dev_err_probe(dev, PTR_ERR(dp->rstc), "failed to get reset control\n"); - return ERR_CAST(dp->rstc); + return PTR_ERR(dp->rstc); } =20 dp->irq =3D platform_get_irq(pdev, 0); if (dp->irq < 0) - return ERR_PTR(dp->irq); + return dp->irq; =20 ret =3D devm_request_threaded_irq(dev, dp->irq, NULL, dw_dp_irq, IRQF_ONESHOT | IRQF_NO_AUTOEN, dev_name(dev), dp); if (ret) { dev_err_probe(dev, ret, "failed to request irq\n"); - return ERR_PTR(ret); + return ret; } =20 - dw_dp_init_hw(dp); + /* + * Disable IRQ a second time; this ensures the interrupt is only + * enabled when the bridge is attached AND runtime PM is enabled. + * Also register a devm action to restore the correct balance during + * device removal. + */ + disable_irq(dp->irq); + + ret =3D devm_add_action_or_reset(dev, dw_dp_enable_irq, dp); + if (ret) + return ret; + + 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; @@ -2240,13 +2340,53 @@ struct dw_dp *dw_dp_probe(struct platform_device *p= dev, const struct dw_dp_plat_ bridge->type =3D DRM_MODE_CONNECTOR_DisplayPort; bridge->ycbcr_420_allowed =3D true; =20 - ret =3D devm_drm_bridge_add(dev, bridge); + return devm_drm_bridge_add(dev, bridge); +} +EXPORT_SYMBOL_GPL(dw_dp_probe); + +int dw_dp_runtime_suspend(struct dw_dp *dp) +{ + disable_irq(dp->irq); + + clk_disable_unprepare(dp->aux_clk); + clk_disable_unprepare(dp->apb_clk); + + return 0; +} +EXPORT_SYMBOL_GPL(dw_dp_runtime_suspend); + +int dw_dp_runtime_resume(struct dw_dp *dp) +{ + int ret; + + ret =3D clk_prepare_enable(dp->apb_clk); if (ret) - return ERR_PTR(ret); + return ret; =20 - return dp; + ret =3D clk_prepare_enable(dp->aux_clk); + if (ret) { + clk_disable_unprepare(dp->apb_clk); + return ret; + } + + if (dp->plat_data.hpd_sw_sel) + dp->plat_data.hpd_sw_sel(dp->plat_data.data, dp->usbc_mode); + if (dp->plat_data.hpd_sw_cfg) + dp->plat_data.hpd_sw_cfg(dp->plat_data.data, dp->usbc_hpd); + + dw_dp_init_hw(dp); + + enable_irq(dp->irq); + + /* + * HPD_HOT_PLUG bit is asserted only after the sink holds HPD + * high for at least 100ms. + */ + msleep(110); + + return 0; } -EXPORT_SYMBOL_GPL(dw_dp_probe); +EXPORT_SYMBOL_GPL(dw_dp_runtime_resume); =20 MODULE_AUTHOR("Andy Yan "); MODULE_DESCRIPTION("DW DP Core Library"); diff --git a/drivers/gpu/drm/rockchip/dw_dp-rockchip.c b/drivers/gpu/drm/ro= ckchip/dw_dp-rockchip.c index 9e49e7dbf420..ffcfb887d0d2 100644 --- a/drivers/gpu/drm/rockchip/dw_dp-rockchip.c +++ b/drivers/gpu/drm/rockchip/dw_dp-rockchip.c @@ -194,7 +194,7 @@ static int dw_dp_rockchip_probe(struct platform_device = *pdev) struct device *dev =3D &pdev->dev; struct rockchip_dw_dp *dp; struct resource *res; - int id; + int id, ret; =20 plat_data_const =3D device_get_match_data(dev); if (!plat_data_const) @@ -237,10 +237,14 @@ static int dw_dp_rockchip_probe(struct platform_devic= e *pdev) plat_data->hpd_sw_cfg =3D dw_dp_rockchip_hpd_sw_cfg; plat_data->data =3D dp; =20 - dp->base =3D dw_dp_probe(pdev, plat_data); + dp->base =3D dw_dp_alloc(pdev, plat_data); if (IS_ERR(dp->base)) return PTR_ERR(dp->base); =20 + ret =3D dw_dp_probe(dp->base); + if (ret) + return ret; + return component_add(&pdev->dev, &dw_dp_rockchip_component_ops); } =20 diff --git a/include/drm/bridge/dw_dp.h b/include/drm/bridge/dw_dp.h index 79b2cdf0df99..1e23180b565e 100644 --- a/include/drm/bridge/dw_dp.h +++ b/include/drm/bridge/dw_dp.h @@ -18,6 +18,7 @@ enum { }; =20 struct dw_dp_plat_data { + int autosuspend_delay; u32 max_link_rate; u8 pixel_mode; void *data; @@ -28,5 +29,9 @@ struct dw_dp_plat_data { int dw_dp_bind(struct dw_dp *dp, struct drm_encoder *encoder); void dw_dp_unbind(struct dw_dp *dp); =20 -struct dw_dp *dw_dp_probe(struct platform_device *pdev, const struct dw_dp= _plat_data *plat_data); +struct dw_dp *dw_dp_alloc(struct platform_device *pdev, const struct dw_dp= _plat_data *plat_data); +int dw_dp_probe(struct dw_dp *dp); + +int dw_dp_runtime_suspend(struct dw_dp *dp); +int dw_dp_runtime_resume(struct dw_dp *dp); #endif /* __DW_DP__ */ --=20 2.53.0 From nobody Fri Oct 2 02:36: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 35D2C3A2E33; Thu, 6 Aug 2026 00:39:20 +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=1785976762; cv=none; b=AVAYx9OjRnszjaupidQt4f1ez0hF/MRgweQlSvEufK8PISed1ZOeIXYC/qa72i8HlQT3UeumaPJDbmuhhH9dUHTcWJoMIOa3wP+rF7s+cvCHnyL/T6RaeWXJxm92ioLPNarIEOY4mvtCpHJypxPna4oj5EVRzJWJjENxZ8oaX+I= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785976762; c=relaxed/simple; bh=oRTwAEvsdtAdQ3xeWlEgRs01pA0QwvbbaxWZXaVnR4M=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=teIImunHJF4tL8XraABEZg2r1pxAHb6xw+Q33d5uO5t5MzYw4v23muXWi+PvkVpYTjYUNBCY0XXFDAfORBd0fRWyE3MvgO5EkEABgqrESyZoh7Ks07WCJYlYa+CrgXper+P4izAxtJHpuf/BXWgJVyPH9/WVS/2K7+wGOq+6pl4= 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=mti+hVE4; 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="mti+hVE4" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1785976751; bh=oRTwAEvsdtAdQ3xeWlEgRs01pA0QwvbbaxWZXaVnR4M=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=mti+hVE4xihzZGsOpdyWAc35hBFpGC4GNche6SQCNQB9MQ37SQtrVJNsGa9Vbnkb/ sgs3t16YWfj7fwk1YbUg0RAsUcuIcLFA/c8/65F2aqEYPUwC7yLEpKvG1wxjo0z0SS koGxpQy9ibKA50PN9J/cIbs1DXY4493eGYt4WXVSoi8Fu2tRNwdecGEOKEcvdTBqIy Y4Qx8mdXYNdIbEihoEsLf91JUefddCSS4NcRoDGLhRg6aMQEuuPHDPc3BZFDCoaHyc PqLy/0HB1KIgZc+ydBboiVrXLl0zwObaIguqMDoFVNyLou/5doYJ6LnQaOfc4WaMqp wkKceqO2/rUcg== 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 819AE17E082A; Thu, 06 Aug 2026 02:39:11 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 9CA7E480055; Thu, 06 Aug 2026 02:39:10 +0200 (CEST) From: Sebastian Reichel Date: Thu, 06 Aug 2026 02:39:21 +0200 Subject: [PATCH v10 15/21] drm/rockchip: dw_dp: Add runtime PM support Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260806-synopsys-dw-dp-improvements-v10-15-d84a26c303d6@collabora.com> References: <20260806-synopsys-dw-dp-improvements-v10-0-d84a26c303d6@collabora.com> In-Reply-To: <20260806-synopsys-dw-dp-improvements-v10-0-d84a26c303d6@collabora.com> To: Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Rob Herring , Krzysztof Kozlowski , Conor Dooley , David Airlie , Simona Vetter , Dmitry Baryshkov , Luca Ceresoli , Philipp Zabel Cc: Cristian Ciocaltea , Damon Ding , Dmitry Baryshkov , Alexey Charkov , dri-devel@lists.freedesktop.org, linux-rockchip@lists.infradead.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, kernel@collabora.com, linux-arm-kernel@lists.infradead.org, Sebastian Reichel X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=2058; i=sebastian.reichel@collabora.com; h=from:subject:message-id; bh=oRTwAEvsdtAdQ3xeWlEgRs01pA0QwvbbaxWZXaVnR4M=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGpz166DLPUJ2TM/Iv6OumBgfJmR621XrspIw 4iJod88cNEXEIkCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqc9euAAoJENju1/PI O/qabGQP/0JgDru7s3ZwEPfU7kp3JeBjFVITtlI54T1bYYYYEpMLoV0NDwsH0Zzat9/4mFqwoKY HO4ZvHRJxKTanRujoieloXrcZvx3MVgnwbioXtmtJQh0QWfiiYC6im0N2zEhnI4ewPpRkVOxQvW 7FiMl/rcY36p+MS9oIOKBSZtRQIEpTGrp7PbumbUEerLWBsGB6vxb90JwhSSXxsY4peCAvgFcVc DKLASIS+gnfYhR4gQ64ZhmK11zQm4cr/EmvrBfN3qPmycx5CMjwlW8ULMo6+VlaM1TirFBsILeq BkBF7m6hzoFPwb4RxceoQqhm6M67sCHS3OJ3HWi1IoUEIrqWI1ssIbopR2IGcUWKk5ubBMn3cmc N+B77EP7h98QW12diuKjqhyoKyc/7+ohHiacEp+eeIbbff8MuSolwtTPea5Bc6AovvfDDKCOYj+ tf+RNMSbAf3629q1J4cjbb99nXgaVQ4wvPbRMCHgfUE7hhLU9swms65o+5QkAOrrewg8dSPcHSz 1JqOGotMiI1CvP+1bSmG/dDoVtLPgf6giUKFEZDZICWMbhheEery09b//Yi12CJxKFzUywm1UT3 nKkpPMOOcp6p83AdMB1SLslmvLCnsD4sF5Sko6/xV/BVDt9AW0ITlg+0Z46lM0QHMqHkjOX4ASM GPFgQ9CMWvva39xDf+04l/Q== 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 | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/drivers/gpu/drm/rockchip/dw_dp-rockchip.c b/drivers/gpu/drm/ro= ckchip/dw_dp-rockchip.c index ffcfb887d0d2..770ab042a187 100644 --- a/drivers/gpu/drm/rockchip/dw_dp-rockchip.c +++ b/drivers/gpu/drm/rockchip/dw_dp-rockchip.c @@ -12,6 +12,7 @@ #include #include #include +#include #include #include =20 @@ -231,6 +232,7 @@ static int dw_dp_rockchip_probe(struct platform_device = *pdev) if (IS_ERR(dp->vo_grf)) return PTR_ERR(dp->vo_grf); =20 + plat_data->autosuspend_delay =3D 500; plat_data->max_link_rate =3D plat_data_const->max_link_rate; plat_data->pixel_mode =3D plat_data_const->pixel_mode; plat_data->hpd_sw_sel =3D dw_dp_rockchip_hpd_sw_sel; @@ -253,6 +255,24 @@ static void dw_dp_rockchip_remove(struct platform_devi= ce *pdev) component_del(&pdev->dev, &dw_dp_rockchip_component_ops); } =20 +static int dw_dp_rockchip_runtime_suspend(struct device *dev) +{ + struct rockchip_dw_dp *dp =3D dev_get_drvdata(dev); + + return dw_dp_runtime_suspend(dp->base); +} + +static int dw_dp_rockchip_runtime_resume(struct device *dev) +{ + struct rockchip_dw_dp *dp =3D dev_get_drvdata(dev); + + return dw_dp_runtime_resume(dp->base); +} + +static const struct dev_pm_ops dw_dp_pm_ops =3D { + RUNTIME_PM_OPS(dw_dp_rockchip_runtime_suspend, dw_dp_rockchip_runtime_res= ume, NULL) +}; + static const struct rockchip_dw_dp_plat_data rk3588_dp_plat_data =3D { .num_ctrls =3D 2, .ctrl_ids =3D {0xfde50000, 0xfde60000}, @@ -287,5 +307,6 @@ struct platform_driver dw_dp_driver =3D { .driver =3D { .name =3D "dw-dp", .of_match_table =3D dw_dp_of_match, + .pm =3D pm_ptr(&dw_dp_pm_ops), }, }; --=20 2.53.0 From nobody Fri Oct 2 02:36: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 19A00388377; Thu, 6 Aug 2026 00:39:17 +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=1785976759; cv=none; b=qDBm55miRD7wNuPwAuc6ttS6aBpVB7y6phFDA1Ki09zjYoLH+TANDKmqh9R4vwuPVLrYMB3e4oyQ2nSVSot8tHKid87vqB5ZlVyI5GNjQypuO7R71cGAGtAwI61+7Trr1LRfLgILcwWhynKyKbbqC4BUra8vTJd3LBweMa2Ri00= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785976759; c=relaxed/simple; bh=/pny3r7ktgDc2Z+IoylC5iAQmlaEL0Yh0JrwtTyx240=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=IS6T/dgNom18AHX2PcZwBGxvk/tD8RgSTNseDg4t1RuUttN1OnqCxNsqSX5ZwwJEUP/yC6AnohXhgnU5ZwdTAcxx7BWVIUiBTKuzXBR8PQyhMe/MXFkZy7Xb+7CUX11ID4XPyQrQ/03wC1frS228UJ4X5QhICtbtef2aZee+yKQ= 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=aG64Ov0N; 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="aG64Ov0N" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1785976751; bh=/pny3r7ktgDc2Z+IoylC5iAQmlaEL0Yh0JrwtTyx240=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=aG64Ov0NQjtVWfmCPFZcPSn5GI40uY0Rw0cmishWEaYkAjoqIB+1E25aclhEab97U 00fgG7tGrJO2W+7PtdPuJHycXOPlZBXlraWmC7/JRXULI8u0raIDV/hG0j4eeBURjB qpdS5fKtRnpbbiDOXktXk8IlV/GjqhRzwwkUgl8jVeLCK+A2YkENqwuSxAlERX6u/A NGQ/XqXpasbH3lIegAwuEAPaHvurTnHNLyvbOiF1VwUts8rOeMcUsHWogDuoRgylNh fvTwpXPWMX3HFXtDJ+NeJ5KY0z3yKd6Sb7fL/PPZmYlw6K8e28Z2UADxLjSU6VOflh ftDBvIbuM3MEg== 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 846B317E084E; Thu, 06 Aug 2026 02:39:11 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 9E287480061; Thu, 06 Aug 2026 02:39:10 +0200 (CEST) From: Sebastian Reichel Date: Thu, 06 Aug 2026 02:39:22 +0200 Subject: [PATCH v10 16/21] drm/bridge: synopsys: dw-dp: Protect sdp_reg_bank from concurrent access Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260806-synopsys-dw-dp-improvements-v10-16-d84a26c303d6@collabora.com> References: <20260806-synopsys-dw-dp-improvements-v10-0-d84a26c303d6@collabora.com> In-Reply-To: <20260806-synopsys-dw-dp-improvements-v10-0-d84a26c303d6@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=/pny3r7ktgDc2Z+IoylC5iAQmlaEL0Yh0JrwtTyx240=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGpz167wZVFaB2j2JT4LQKLFTVJWIbXQdcXOk qqJYVWBwAzDtokCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqc9euAAoJENju1/PI O/qacE4QAIeBECduSDd7RLHt7dZy72CUXmLfxhcAccV9cyo4IA+NxxpwzEYzBepPzLKUlqsVL+f z7lAxnNUbGSBlR3wx0oPMYPDY5vsCdCXa5x5HnAqDF6k14WhyoWNlsonC8+bnnM/Yz5YRJVcxav SE6HD3YOr5xhR3TPp0gsdMYwo6BcatJLo+zYDk/z/hqy7igM7oxyAmziFuMu5oXgPtj9C3tsq/g i6MeT807KiefEeb30tno7sYGVkSxV6LMAUfmBxC1/xDGCLSrrh8G+n//xh529l1/wTJSTP0xZMo h/aCnt2b9jon4EAOLHxuLHqnHNWg7c+YjlqiBJz7ed8LcYd1LpCX/rOLKvGkYwLxVZynGwzJXr/ VvwrI5mp9OjAHlqOgvuGwIkm7CX+DEbymncatH2P7uc+DMnIM8TKczkYCge2PX2xexF7mMDhDYR NimiJRRr9/1vWJ9QoU9VYQoqaP79K52MFwB/NyUlxVF3mO53wzgskE7VACjpKd0cVAHXbRCznXU 7lvniktXVgLkWGvqf2RIKRZAS/k07LACv9qQ9b/DAl6auOD2w9KHRPKfC7jgeraEUUQNnPHFC+3 z5vKZn7FjlgjgKJW6qyB6tLRVThzX5s0010zKHnEsrgT8WlPo0aHu/HUrXJIj/FXOz0FfBy01/D 5iMAA1gaxsGjEsE2kG4sygw== 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 b8ba884d04ed..a63fe1fc0969 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 @@ -1708,7 +1712,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) { @@ -1752,7 +1757,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); } @@ -2229,6 +2235,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 02:36: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 72602340286; Thu, 6 Aug 2026 00:46:30 +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=1785977191; cv=none; b=PNRQvcTOUnjCct9pcCUkj4rqOzPW/RHda7vGPFOsqcge20f7EPjLLo2482fbhyTVeqe7lZ8zJW28oWnNNmxUOhjjKsrFlFIPyb/zZf22IAtNaa38kkjzOQcU153nrz3TxI6elkI2BEZoSuHppaK5KxmoBiJNHsVmdKpyJCMSR80= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785977191; c=relaxed/simple; bh=PLIm9h3gU4IggjgGaEHpfMBzz245EqybIu7YjjboNDo=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=TFzCPXcb/KpcDF3FO1P4A70hy6/ZJx5bqS9+VvKuG1K3thkU3qSa5bfVA/8WlnTE6Qh1YChr5N341OAJSB8PvfnF7XuNKO5G7yzGESqdp6QudCogJggntO5xZ2Qnj5b51V4mebkFYvMTfKyEGN0zCoX3ZI61DBHzx2/4giN78xs= 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=MSxKjM+Z; arc=none smtp.client-ip=148.251.105.195 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=collabora.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="MSxKjM+Z" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1785977188; bh=PLIm9h3gU4IggjgGaEHpfMBzz245EqybIu7YjjboNDo=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=MSxKjM+Zj8f6fX5Mn4ekbP5WyFd7LifwnVoOy1wZLoqkXrCWJopTinNIVXhFReSLQ PJVUZWx4tXinacyU7NYN0L7I1Pc4MPh2t0UiSZw2rPrPRlW7j42l8XCgkq4TUnRy88 6c9G5DnRt8a4XW42gE5SpRgrRBUXk0t5vwx6MpGBAzjZ5kgevTcp+Us92wIRSPceC5 LtERCjv+pcIMjCU1KAipuyRTPmaUXtbgH3yixBFT0sZ9RTs9GcuzkIJiOEtOZyMJzg PX4trX7oJzBYGgZKSgHrtIeoUqLDFb3HSRJ0VugZfbV0obGhOKDGU3r1i89q5C2sFa p5VMbB3a8W6ag== 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 69FF217E0739; Thu, 06 Aug 2026 02:46:28 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 9F889480062; Thu, 06 Aug 2026 02:39:10 +0200 (CEST) From: Sebastian Reichel Date: Thu, 06 Aug 2026 02:39:23 +0200 Subject: [PATCH v10 17/21] drm/bridge: synopsys: dw-dp: Drop useless reservation of first slot Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260806-synopsys-dw-dp-improvements-v10-17-d84a26c303d6@collabora.com> References: <20260806-synopsys-dw-dp-improvements-v10-0-d84a26c303d6@collabora.com> In-Reply-To: <20260806-synopsys-dw-dp-improvements-v10-0-d84a26c303d6@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=PLIm9h3gU4IggjgGaEHpfMBzz245EqybIu7YjjboNDo=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGpz165fHEm38M1E4PGMvPdA5LMMZG45yzMr4 UNc8Lgzt2ywr4kCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqc9euAAoJENju1/PI O/qaEsUP/jNVsxtUZOdin7EbfNqYp6bck6y7Hii2pXq9dghhqfUiFIiWzb+nHX/Es/sK6pvxou5 f/u9yDjbCb+OdcdQhr8OGT1vq0VSOPGc9k6sHE8/vnUbbH+pHJaUy8JZvKuIGh0+dNTtE5d9AAN o/iVzwZhJdBQOqNGSCQoX3wCd7Fe7dNoavQ706FrIG4g5qQ2yB725377aokFU8u+ChGau4BJ010 O1nMLY8Deer2W7ykFp8LNGVbxCmR1RSfjaULqWvIDO7iPvPujAco3pbrD+q+a2NH31WZkyp57n+ x7YLOU47zu2D3dT7UuG78rvDV9iI60HywtjkYRBwU5bAHKRtkkAI07Nc0YRm48OQ2kkpZ5o2rp+ NDVS4y97/Ad3AVrX0K6qWuABLSKn3oJ0jdSdZHdNYMTEDEcMnUpyjtKityQwuK2MUeL2XpV52qX zloMziO5r6InSXFfWY+da5e/UAG3k8khtWBiM/eYIw7IbFihr322tknqS2sLiUolagCUrOxO7j3 7+Rdm2NZImiwXDiJYVNp0J1dM1aZbMgaDaZHYuJj3DKTvmmW+xNwZFMV2tO2Ul2HY07xqjx2CX/ +93hSi/LTLftp1uUe2Tft/8OeWufniUqqbdm3FlT01HxYWeGtp9Vf5i0p8cDIsd5wkSsLqAdVim LbPM9tjJ/o3udjHN8cUg7Qg== 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 a63fe1fc0969..425bfcd3a37d 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-dp.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-dp.c @@ -1712,9 +1712,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 02:36: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 9055E3446C0; Thu, 6 Aug 2026 00:46:30 +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=1785977191; cv=none; b=hKS7mvPQfatK+yiG+60ro+JCawqLQG0MYnwHtZlaJYaW42B+DvG2KFw3cYgEZG9RGgQAwUY8HnsefqvlWRVmd0lo29ccpsV3xFay49O4DLIR71Yq3+30P/+7DE93Z5LDOwObrA11U0HE5DVA59bTcTGLq/ScfNQyIgCzLzcBEgg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785977191; c=relaxed/simple; bh=evmVzWSmkMNe11q/nd1T6eZIDF68HR1dZx3DTB4BQwA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=K3lyVP+eHTnctaQijbjONT/fMWDweh0oKzq7q6HNNG1njIzfs/7ojKqBW8Yvwr8zGdyvbH4YMS4QahbNx5Xp/MF50rpXu3dcK3jK6VDeQ/r3SiDbNMvMrr9VPaPYAtFStKGNPKV+TiW67DEKOKkZTgVR5aOjLD2Q55oJB1K296U= 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=nR3fWOYP; 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="nR3fWOYP" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1785977188; bh=evmVzWSmkMNe11q/nd1T6eZIDF68HR1dZx3DTB4BQwA=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=nR3fWOYP8JmhzPqpY2p9KAi/8cCBBskSykgUGM21zrqtoRShqsXVhy9dbxgmb0Lo+ UCeH7nG/PK6Am5p/Qtf/GxwbryBVLE+5ZXjyS0TF2ZXNwOepDq3rerl1GMN6ok1EEq LhHDlhYtoUuyRq2vCU0tNbGRJEtYMrJLhJaqEEEKhlbNNfGqPfLAao8otTCMPzUWNs cUwJG634yCW/6+0ANNYvlZig0rDDcWRlacd/R5cjtd3rK/8I1ycT9a+KpFxwebjhVn IBw8xoK/6HCHSKfAN/3BC0xK43Qf6ua8I+m9zCPAAKrORGpLAMt986e7Z5F90Tc6Ml 5up9DwwjNSYCg== 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 6BE3D17E075D; Thu, 06 Aug 2026 02:46:28 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id A1005480064; Thu, 06 Aug 2026 02:39:10 +0200 (CEST) From: Sebastian Reichel Date: Thu, 06 Aug 2026 02:39:24 +0200 Subject: [PATCH v10 18/21] drm/bridge: synopsys: dw-dp: Clear only enabled SDPs on atomic disable Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260806-synopsys-dw-dp-improvements-v10-18-d84a26c303d6@collabora.com> References: <20260806-synopsys-dw-dp-improvements-v10-0-d84a26c303d6@collabora.com> In-Reply-To: <20260806-synopsys-dw-dp-improvements-v10-0-d84a26c303d6@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=evmVzWSmkMNe11q/nd1T6eZIDF68HR1dZx3DTB4BQwA=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGpz1651f5GFzi7tbG0ij9UawtlVcYuwUkTjU jPRQjqO83tCU4kCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqc9euAAoJENju1/PI O/qaY5IP/A3Aqr8ezypgIi8N3zCYHRywRMuOuZjrF8xT4BHuktmrAkkj1/90sqlaUxzK8mc33rF SXksu2aBXDg7lAPDGmWJ+q51mve7IEXagbc+ceD/6H7iCmn2FG0xf6OWvjM08KLYvWf1Dn7zb/g //eswcUI5VvbotKlDprYNrQhDS0Ewxk6JnprMaXUEV+heZvSeSbUm2kOw1wfxUzj+49g/N81etV jcl2WaCUqX0DiU+Am7Dmd599icEw7nPNDKkK7lCt8V7cqNzB/DCUTzfjba50bnI30ZcR+KeEiUK a1mnD7ESH5q7VaSMuaLSFWfVIiN6EfaSr3JvGHcYyXTj3jpZMvEdVUmFwwshXLi8p6dNn6qYF4d +L49GA3fexLzPNr508a+A0uU2fOWAzK8m4c4KzJRZOzkwX8ZGSTMZsK4mmR47WAJMmXKwy0+4rB Y82yQ7aVraRbNUIkcnH17/3IKEOist//j3J9Dk4ahb9LBXhRHGyhiTipb9NBPNKIFqDN6vHVEYy 2nS6TfAVSYP7foyZH7GJKs+0apWR5kfyQ3M7p6flmZ87BCdueMu5i6qGnkTcHqNH86PD6aZnDp2 GaJr0BdaMUKIiZx0aGcxg12aH6bkuxLPtQwG5ReS/BXWEtkSDfLwQydUQWxce7GcUSFsLeBAvuz 09u52Ix8/J0pkUO1wm3orvw== 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 425bfcd3a37d..2883922af969 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; } @@ -1754,8 +1767,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); } @@ -2341,6 +2358,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 02:36: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 578C73A382F; Thu, 6 Aug 2026 00:39:20 +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=1785976762; cv=none; b=LhfoGQHzwnILEChZmXf3sQMVBj5D7lF01KwoPibMvUdXhXyKk+Bl3R9gpGTDQTx0YV/vCFwa4DRL7nrjGVmT16Wr9GpWbGDxwH3BFIANxzPyKGGTWiZQKxBz3SyD5egHi+2gra6ArMdOmA53VvNZl1go0dUT32O5yH26xGErIww= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785976762; c=relaxed/simple; bh=1tBl2R5rjtLWnLxWK1fLnuHlYl63j8aoeW5amYJufHI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=r2qVHaBTw9M8akLb2uRBDJRhsHgEs8ePr2shZ6aMmRYP3vdbemPg/a8UrfGPiFNLLFc3qpzmjp4lR6rdictLvltaJJSBnRQSrTTVG6jIaOhmw2RLQospacYsfBihB+vbq13FWyrOhbLPp+yv9xk7zNZ7pnoShgHC6YnDCer2Se8= 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=n5NWU49+; 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="n5NWU49+" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1785976751; bh=1tBl2R5rjtLWnLxWK1fLnuHlYl63j8aoeW5amYJufHI=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=n5NWU49+UgvLrI5xitD2xkgap8HIZOOi+a3gxKcgDAbeTh4Ibq9m8laInzR0LJk98 C+Idom728G3gy2hm0LOKNZwKy35tBvxm0EvcZ+eGmqudK0H0VTqeNX71lcMEQjNWdT Oxyd06MAIN05b/836S55EM8ladNK8gOaBN0LtF9ObdknGbgk5IS5XwYkQODJxWMKe+ FM5sk1MmG0NjNNHgUG+m1iRinzhXYCMY8Ch6HfS/7Yi0Gn9Uu45UlnNy62+RP7c53G 4W7MS6yDIVTnIIZJkLdMoNQiw612U96Y8woNJcDrm8qpVg8yGbvL5dNWZXKBFldrOE zgEs41IVmRLWQ== 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 99E5A17E0851; Thu, 06 Aug 2026 02:39:11 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id A26ED480065; Thu, 06 Aug 2026 02:39:10 +0200 (CEST) From: Sebastian Reichel Date: Thu, 06 Aug 2026 02:39:25 +0200 Subject: [PATCH v10 19/21] drm/bridge: synopsys: dw-dp: Use regmap_set_bits in dw_dp_send_sdp Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260806-synopsys-dw-dp-improvements-v10-19-d84a26c303d6@collabora.com> References: <20260806-synopsys-dw-dp-improvements-v10-0-d84a26c303d6@collabora.com> In-Reply-To: <20260806-synopsys-dw-dp-improvements-v10-0-d84a26c303d6@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=1tBl2R5rjtLWnLxWK1fLnuHlYl63j8aoeW5amYJufHI=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGpz164kNlhKjfk2jFVhjwubNZMf43ZFSWW+O FjFvoalJ5HeN4kCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqc9euAAoJENju1/PI O/qa1PMP/jA/41vMMVbj3kqoYzG6ZxqIp/3/RmD+m6VPja9NGCw0diVtpIrSp6ZFqdhSNg4jdpG PPaL1oJIrj2u4CXVXkiqV4BaZNhjc/A6bgw5oVqiyVG0VUY5CL7qFKdYMNaZpeKOwZe7TKV21Pc +ue63WChRWVPP88hA1S9GVxNUkrJOeL35wUq05iB73wWD+OjHheCbRfIU96mfVtcJgzHrdiME6H ymWCuYSE7sNgFlQTWGkzzChOB5DlSNvBOBXOpu9YvT4vXvyPtE05aEmVIdX70nBdtIO7y4XmjHm uxCsNfWSoRw4BzfRF9bru6oDG8bfEQ87eAh9wpuq2QLn5VM7ipBmYlNneXd2Ikg7aajboTh6VQ7 lbk+rejEkCUcBaBbPRdcI2dsIxuxLPN1JDExxSlz8XQcKzJ5W/plRMI7tX0eNUFH+m2iH5eHd14 fOcCnbMVHFkbrLoETPDYS/yK2IDk0I6a8bViAEK7H96IrmJhTmB4dXIaCwagrwlKc04L6JcmhdX YSOMQd90fvyXTekexi1i5SL2dRmbpSZ1v51S53TalCdGbK4efaKz/tPKc3gfvXu2R7l+spNOIm4 O+8i+tmBJ9zi2gv/5MjM+8PmrOC9/m3S5phxgstF3+y0t8V4pwwLoA5Gll7Q1U96faiLkhlGv5W B6PtTo22xrsgaCC1bdHkzWA== 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 2883922af969..35e45b5c3fc4 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 02:36: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 5BFF43A3815; Thu, 6 Aug 2026 00:39:20 +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=1785976762; cv=none; b=jAEpzeqUcNQBLKGuI3sA9iArzo3OYGynK+E84bzZGz8ucwI1sAfjMZ9SMIP5c367MbvQFMNMDZINTT1LeoccPoRBppstWYjlmkDEqgYaGgBgXFpi5cvGN1sRdLR51WD4gdZxBea7v+4A1RSlif/9VQ7SXBjqUn7aQC6Izfg63zk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785976762; c=relaxed/simple; bh=SwF3VHoRiI4Zsf33YHjX0UHR9rjLn/pkIELQ2nyar2c=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=k+JcO4oeHrKb7PZkEBwlH7RhWB/q1cz92Yc5InbWVnLwrK7iFiA/cuO/wheKoTTNA24hzzWqhyScFvSuIr2DnWlUERY1FXWvIqEcVDDmeanGUF8f3IM/f1Gv2T6WNu9IphZx4dnhvQHYyumI71tngJuLdC8EalMKFOTPxlN9ouY= 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=FuPyv4Rs; 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="FuPyv4Rs" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1785976751; bh=SwF3VHoRiI4Zsf33YHjX0UHR9rjLn/pkIELQ2nyar2c=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=FuPyv4Rs7xMozQIy/XWUHydBBg4OEZpTMJ6rU65N3hXOZjznC3fCOB78nSLlzJYox 5MXHUc+y1MMYrBUj4OfAneA86+Ah3Asra+j1arGLYC1jqDpc6l6MUs/Qi7Q/lclFxj I+CT1/y/4CEePtsY6N2r2GSXwCB0Y3GogHE5lWvOHXTm8w6a+xNfy09IA/V9Xn9/O2 at3SnPuJM77mLQf/V+u9PY7f1i9oRKWxnP5g4Ub5jErA5+jL3BEJQmyaxVo+WYCIHF egdPlq1+FBzkliN4M5qqcIt6gEsRH68WZ02DVUVKc3gpCZP1eUzoODZlPoy1zk1EPI uq6znpHd0wVHQ== 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 A36B217E0857; Thu, 06 Aug 2026 02:39:11 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id A3E29480066; Thu, 06 Aug 2026 02:39:10 +0200 (CEST) From: Sebastian Reichel Date: Thu, 06 Aug 2026 02:39:26 +0200 Subject: [PATCH v10 20/21] dt-bindings: display: rockchip: dw-dp: Fix sound DAI cells Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260806-synopsys-dw-dp-improvements-v10-20-d84a26c303d6@collabora.com> References: <20260806-synopsys-dw-dp-improvements-v10-0-d84a26c303d6@collabora.com> In-Reply-To: <20260806-synopsys-dw-dp-improvements-v10-0-d84a26c303d6@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+poByyZiAGpz165DDl1gJku7NzBf+jHokgRopyuUdSvOg UVJYAyfqlbc2YkCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqc9euAAoJENju1/PI O/qaugoP/2TmnRj1wRwb1uGbg3fpKNW1RQDsENE31yu6a1psJ9jp4Xe0J3QhJON7HZjtacbYC+n rqc1vcVKOtZn9hOM+TM/O2qU4LFAKaZkcAgDEwa7iStESnJel6DSl65v5J4EiJHfrirL3DWVcXC uKDLqQtC9skdARUCj+VD9sqDMEg2ZlcjNSM1MoVccy0hh76TZZzBJddaJwE7cjKWzNo76TuYBU8 6AuVkZBsToDJ4MJWLWC69pVr51HaeNxf8Jq5dFP8e8LIZqmDWurzZo92I5piLWwbiC3w83hXzCQ sjddST4jTjxH+lEXZcjo4E4wictpyOPJwVs4HhQ2q2L7+11AObwIf7E2QjHktExucm7rRkYhszT 8dhEYtt07+yc+RuCt7bwHC4uAa24OIBRqT4cviCIbEPq9w28UbPBbJJB/nYS4GX9exNaslqRkjG pzPKCfU61ZyggG8whF77ZHeu2LZQa02rHP4VKmDaAOVMEA9aKj+AXSOs6Y5tXFE94k4aMiyFmun SnZr0+DbWuaIAtb3Vl7aiWpuOA+h9kcgme03Zmj9pPOM100m23OSssqPv68FbBeC8cmKCScVYr2 qek81+IWEEutnNUoVRIKNl5sgZM5569V191QW578/PhsYMozesXXg6/sXlJBUtvO9twGjouNFzr QMS3P6MNLTS7rOm8ODYkrlg== 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 02:36: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 726883438B5; Thu, 6 Aug 2026 00:46:30 +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=1785977192; cv=none; b=kBzyy/x6oD8sFltfsXZ0kp8x0LHk0Ak4vcfuYhYHkYLJhsAE/2hNa5JVaG4DxuSTev12PekWyd9n3eWRX3ozP1EU3r7wnV7/vh7hiD+OKPvJj74WWPPgjjYxnJtqdE20PWulyxVz8WWjq6I1JDvMF5DyNymu+ZgYZ7bI3YW6Xr4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785977192; c=relaxed/simple; bh=hpRBIVgimgcr5Tx2ODAqFEn04TQlm5wXnpcVXWduEcA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=PINjjXBXMYhocJZFlfMQckw3aJVFVLFgExG81XZ/J9caElTWRWV12ks+/+PIjh8ycvNgEIO2IFUxbOp5eVisZV0FhRANPY8tGi7UPoOMvDyWADlAqIzflyMX4Wz/2YTDSP+ePIz8IHxik1o2svkXsk0ZGCQmBrUvBjFO/ENn5vY= 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=QquTZHIR; 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="QquTZHIR" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1785977188; bh=hpRBIVgimgcr5Tx2ODAqFEn04TQlm5wXnpcVXWduEcA=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=QquTZHIRH13VVx1Ib2vy/++8bbyTh+hCUlXSMZj8uNDOzWt5TSaL8/QwRR5XKjnT6 kEqAHgezWkcs+/MOyJ7u/3T7tBo6JtKK2gc4iK3rnPrfT9u2K5WVZlO1KsVoVQQGPV r5GNq7Sg6beYnTKtKSe2iE5HBAwG6XlRtLexB7swz1qtiudE0qkDc0g6KMvS6BImH+ M8WzibU9YKwowt12GVUcXrofTVmvRxX1wqWKzeLRMs5fQEBw/NsAwvRYa2AvmF+p5D RA2O0JPJmKuvXpWt78Lad0M72TSl5PoiabbDZ3Yk7I8IdmNOnEd5KFDcKk+YOL4fit QmqvFxS1JaYGA== 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 6741617E06DB; Thu, 06 Aug 2026 02:46:28 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id A540D480067; Thu, 06 Aug 2026 02:39:10 +0200 (CEST) From: Sebastian Reichel Date: Thu, 06 Aug 2026 02:39:27 +0200 Subject: [PATCH v10 21/21] drm/bridge: synopsys: dw-dp: Add audio support Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260806-synopsys-dw-dp-improvements-v10-21-d84a26c303d6@collabora.com> References: <20260806-synopsys-dw-dp-improvements-v10-0-d84a26c303d6@collabora.com> In-Reply-To: <20260806-synopsys-dw-dp-improvements-v10-0-d84a26c303d6@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=11909; i=sebastian.reichel@collabora.com; h=from:subject:message-id; bh=hpRBIVgimgcr5Tx2ODAqFEn04TQlm5wXnpcVXWduEcA=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGpz16639wJlKX9vQ8vd41qofQ7WuEbBzISpq XiVZPAZkHyKh4kCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqc9euAAoJENju1/PI O/qaq/YP/AwEDSuAiMbwXWjlWyrddB3nItXP6oQJETx0joS+uJH8HV3a/MzciI4+SM6kqWVfdXU Sa8mB9ZK2mkoWiUEYdmrK1vmUv4G9/+r9BvetuM2aAhXpAf1Yk7pYZivQbwvNQLpwcpytIYw2IE qvnL8zQkffZQ9Oi2guzDpUbRq2VDjugJqEL63yN19BkZgFXCWHZFPvAMqOuz4xiSk+sZH638EDI vNqIVw4mxIMzd8kKErmzwBnzQKGOi1J6tN5KUffsfeQQpFeIa/9UsqUC2yyJdex5Dj821gtL2nP 4UIFSzurMGgLfZehRuecr7Q3JR7BRqPRZwyIHc5EspMCkMYcgd4DnN/tLffcNiDOkocXf1QUJVe 3n4PNXYF2/iGbdcObfiE2py3wnIz9F9uhl2rrAWzmIDih6LGTOnm8A33sss1U80IlOndSV4gCGy Vjjn1ev3smCp7Bh+ZO9GqTSfmmdQ2Xd4RgbUPh9/Q0hOBVJi8qkv/rd2CP427ncypaX6NE+D1G2 UYTAm5HJoflgg3Cmlx5s0lm9FrWx+1xCLHuOr4k0TXPffM2hNwRC42rE+n+8M5YGUQssIjMOAKY rLMqhNwxaF7Wub1T0KScxqC2tPiMX92g5eU2Ybyzq8nB+R47uO733hWF9P4KCg275PQIWyWvIQW UW5INL/SXxtGnkzvz6Jkznw== X-Developer-Key: i=sebastian.reichel@collabora.com; a=openpgp; fpr=EF660D07463F8B726A795413D8EED7F3C83BFA9A Implement audio support for the Synopsys DesignWare DisplayPort controller. Signed-off-by: Sebastian Reichel --- drivers/gpu/drm/bridge/synopsys/dw-dp.c | 307 ++++++++++++++++++++++++++++= +++- 1 file changed, 306 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/bridge/synopsys/dw-dp.c b/drivers/gpu/drm/brid= ge/synopsys/dw-dp.c index 35e45b5c3fc4..079d3f8e8148 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-dp.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-dp.c @@ -23,17 +23,21 @@ #include #include #include +#include #include #include #include #include #include =20 +#include + #define DW_DP_VERSION_NUMBER 0x0000 #define DW_DP_VERSION_TYPE 0x0004 #define DW_DP_ID 0x0008 =20 #define DW_DP_CONFIG_REG1 0x0100 +#define AUDIO_SELECT GENMASK(2, 1) #define DW_DP_CONFIG_REG2 0x0104 #define DW_DP_CONFIG_REG3 0x0108 =20 @@ -110,6 +114,10 @@ #define HBR_MODE_ENABLE BIT(10) #define AUDIO_DATA_WIDTH GENMASK(9, 5) #define AUDIO_DATA_IN_EN GENMASK(4, 1) +#define AUDIO_DATA_IN_EN_CHANNEL12 BIT(0) +#define AUDIO_DATA_IN_EN_CHANNEL34 BIT(1) +#define AUDIO_DATA_IN_EN_CHANNEL56 BIT(2) +#define AUDIO_DATA_IN_EN_CHANNEL78 BIT(3) #define AUDIO_INF_SELECT BIT(0) =20 #define DW_DP_SDP_VERTICAL_CTRL 0x0500 @@ -253,6 +261,8 @@ =20 #define SDP_REG_BANK_SIZE 16 =20 +#define DW_DP_SDP_VERSION 0x12 + struct dw_dp_link_caps { bool enhanced_framing; bool tps3_supported; @@ -306,6 +316,19 @@ struct dw_dp_hotplug { bool long_hpd; }; =20 +enum dw_dp_audio_interface_support { + DW_DP_AUDIO_I2S_ONLY =3D 0, + DW_DP_AUDIO_SPDIF_ONLY =3D 1, + DW_DP_AUDIO_I2S_AND_SPDIF =3D 2, + DW_DP_AUDIO_NONE =3D 3, +}; + +enum dw_dp_audio_interface { + DW_DP_AUDIO_I2S =3D 0, + DW_DP_AUDIO_SPDIF =3D 1, + DW_DP_AUDIO_UNUSED, +}; + struct dw_dp { struct drm_bridge bridge; struct device *dev; @@ -321,10 +344,18 @@ struct dw_dp { int irq; struct work_struct hpd_work; struct dw_dp_hotplug hotplug; + enum dw_dp_audio_interface audio_interface; + int audio_channels; + int audio_channel_allocation; + int audio_sample_width; + bool audio_muted; + int audio_sdp_nr; /* Serialize hpd status access */ struct mutex irq_lock; /* Serialize sdp_reg_bank access */ struct mutex sdp_lock; + /* Serialize audio state */ + struct mutex audio_lock; =20 struct drm_dp_aux aux; =20 @@ -1696,6 +1727,254 @@ static int dw_dp_link_enable(struct dw_dp *dp) return ret; } =20 +static int dw_dp_audio_infoframe_send(struct dw_dp *dp) +{ + struct hdmi_audio_infoframe frame; + struct dw_dp_sdp sdp; + int ret; + + ret =3D hdmi_audio_infoframe_init(&frame); + if (ret < 0) + return ret; + + frame.coding_type =3D HDMI_AUDIO_CODING_TYPE_STREAM; + frame.sample_frequency =3D HDMI_AUDIO_SAMPLE_FREQUENCY_STREAM; + frame.sample_size =3D HDMI_AUDIO_SAMPLE_SIZE_STREAM; + frame.channels =3D dp->audio_channels; + frame.channel_allocation =3D dp->audio_channel_allocation; + + ret =3D hdmi_audio_infoframe_pack_for_dp(&frame, &sdp.base, DW_DP_SDP_VER= SION); + if (ret < 0) + return ret; + + sdp.flags =3D DW_DP_SDP_VERTICAL_INTERVAL; + + return dw_dp_send_sdp(dp, &sdp); +} + +static void __dw_dp_audio_disable(struct dw_dp *dp) +{ + if (dp->audio_sdp_nr >=3D 0) { + dw_dp_clear_sdp(dp, dp->audio_sdp_nr); + dp->audio_sdp_nr =3D -1; + } + + regmap_clear_bits(dp->regmap, DW_DP_SDP_VERTICAL_CTRL, + EN_AUDIO_STREAM_SDP | EN_AUDIO_TIMESTAMP_SDP); + regmap_clear_bits(dp->regmap, DW_DP_SDP_HORIZONTAL_CTRL, + EN_AUDIO_STREAM_SDP); + + regmap_clear_bits(dp->regmap, DW_DP_AUD_CONFIG1, AUDIO_DATA_IN_EN); + + if (dp->audio_interface =3D=3D DW_DP_AUDIO_SPDIF) + clk_disable_unprepare(dp->spdif_clk); + else if (dp->audio_interface =3D=3D DW_DP_AUDIO_I2S) + clk_disable_unprepare(dp->i2s_clk); + + dp->audio_interface =3D DW_DP_AUDIO_UNUSED; +} + +static int __dw_dp_audio_enable(struct dw_dp *dp) +{ + u8 audio_data_in_en; + + switch (dp->audio_channels) { + case 1: + case 2: + audio_data_in_en =3D AUDIO_DATA_IN_EN_CHANNEL12; + break; + case 8: + audio_data_in_en =3D AUDIO_DATA_IN_EN_CHANNEL12 | + AUDIO_DATA_IN_EN_CHANNEL34 | + AUDIO_DATA_IN_EN_CHANNEL56 | + AUDIO_DATA_IN_EN_CHANNEL78; + break; + default: + return -EINVAL; + } + + regmap_update_bits(dp->regmap, DW_DP_AUD_CONFIG1, + AUDIO_DATA_IN_EN | NUM_CHANNELS | AUDIO_DATA_WIDTH | + AUDIO_INF_SELECT | HBR_MODE_ENABLE | AUDIO_MUTE, + FIELD_PREP(AUDIO_DATA_IN_EN, audio_data_in_en) | + FIELD_PREP(NUM_CHANNELS, dp->audio_channels - 1) | + FIELD_PREP(AUDIO_DATA_WIDTH, dp->audio_sample_width) | + FIELD_PREP(AUDIO_INF_SELECT, dp->audio_interface) | + FIELD_PREP(HBR_MODE_ENABLE, 0) | + FIELD_PREP(AUDIO_MUTE, dp->audio_muted)); + + /* Wait for inf switch */ + usleep_range(20, 40); + + /* + * Send audio stream during vertical and horizontal blanking periods. + * Send out audio timestamp SDP once per video frame during the vertical + * blanking period + */ + regmap_update_bits(dp->regmap, DW_DP_SDP_VERTICAL_CTRL, + EN_AUDIO_STREAM_SDP | EN_AUDIO_TIMESTAMP_SDP, + FIELD_PREP(EN_AUDIO_STREAM_SDP, 1) | + FIELD_PREP(EN_AUDIO_TIMESTAMP_SDP, 1)); + regmap_update_bits(dp->regmap, DW_DP_SDP_HORIZONTAL_CTRL, + EN_AUDIO_STREAM_SDP, + FIELD_PREP(EN_AUDIO_STREAM_SDP, 1)); + + if (dp->audio_sdp_nr >=3D 0) { + dw_dp_clear_sdp(dp, dp->audio_sdp_nr); + dp->audio_sdp_nr =3D -1; + } + + dp->audio_sdp_nr =3D dw_dp_audio_infoframe_send(dp); + if (dp->audio_sdp_nr < 0) + return dp->audio_sdp_nr; + + return 0; +} + +static int dw_dp_audio_startup(struct drm_bridge *bridge, + struct drm_connector *connector) +{ + struct dw_dp *dp =3D bridge_to_dp(bridge); + + dev_dbg(dp->dev, "audio startup\n"); + + return pm_runtime_get_active(dp->dev, RPM_TRANSPARENT); +} + +static void dw_dp_audio_unprepare(struct drm_bridge *bridge, + struct drm_connector *connector) +{ + struct dw_dp *dp =3D bridge_to_dp(bridge); + + guard(mutex)(&dp->audio_lock); + + __dw_dp_audio_disable(dp); +} + +static int dw_dp_audio_prepare(struct drm_bridge *bridge, + struct drm_connector *connector, + struct hdmi_codec_daifmt *daifmt, + struct hdmi_codec_params *params) +{ + struct dw_dp *dp =3D bridge_to_dp(bridge); + u8 supported_audio_interfaces; + enum dw_dp_audio_interface audio_interface; + u32 cfg1; + int ret; + + guard(mutex)(&dp->audio_lock); + + /* + * prepare might be called multiple times, so release the clocks + * from previous calls to keep the calls in balance. + */ + if (dp->audio_interface !=3D DW_DP_AUDIO_UNUSED) + __dw_dp_audio_disable(dp); + + /* The hardware is limited to 1,2 or 8 channels */ + switch (params->cea.channels) { + case 1: + case 2: + case 8: + break; + default: + dev_err(dp->dev, "invalid audio channels %d\n", params->cea.channels); + return -EINVAL; + } + + if (params->sample_width < 16 || params->sample_width > 24) { + dev_err(dp->dev, "invalid data sample width %d\n", params->sample_width); + return -EINVAL; + } + + switch (daifmt->fmt) { + case HDMI_SPDIF: + audio_interface =3D DW_DP_AUDIO_SPDIF; + break; + case HDMI_I2S: + /* + * It is recommended to use SPDIF instead of I2S, since I2S mode requires + * manually inserting PCUV control bits from userspace and this is done + * automatically in hardware for SPDIF mode. + */ + audio_interface =3D DW_DP_AUDIO_I2S; + break; + default: + dev_err(dp->dev, "invalid DAI format %d\n", daifmt->fmt); + return -EINVAL; + } + + regmap_read(dp->regmap, DW_DP_CONFIG_REG1, &cfg1); + supported_audio_interfaces =3D FIELD_GET(AUDIO_SELECT, cfg1); + + if (supported_audio_interfaces !=3D DW_DP_AUDIO_I2S_AND_SPDIF && + supported_audio_interfaces !=3D audio_interface) { + dev_err(dp->dev, "unsupported DAI %d\n", daifmt->fmt); + return -EINVAL; + } + + ret =3D clk_prepare_enable(dp->spdif_clk); + if (ret) + return ret; + + ret =3D clk_prepare_enable(dp->i2s_clk); + if (ret) { + clk_disable_unprepare(dp->spdif_clk); + return ret; + } + + if (audio_interface =3D=3D DW_DP_AUDIO_I2S) + clk_disable_unprepare(dp->spdif_clk); + else if (audio_interface =3D=3D DW_DP_AUDIO_SPDIF) + clk_disable_unprepare(dp->i2s_clk); + + dp->audio_channels =3D params->cea.channels; + dp->audio_channel_allocation =3D params->cea.channel_allocation; + dp->audio_sample_width =3D params->sample_width; + dp->audio_interface =3D audio_interface; + + ret =3D __dw_dp_audio_enable(dp); + if (ret < 0) { + dev_err(dp->dev, "failed to enable audio\n"); + __dw_dp_audio_disable(dp); + return ret; + } + + dev_dbg(dp->dev, "audio prepare with %d channels using DAI=3D%d\n", + dp->audio_channels, dp->audio_interface); + + return 0; +} + +static void dw_dp_audio_shutdown(struct drm_bridge *bridge, + struct drm_connector *connector) +{ + struct dw_dp *dp =3D bridge_to_dp(bridge); + + dev_dbg(dp->dev, "audio shutdown\n"); + + dw_dp_audio_unprepare(bridge, connector); + pm_runtime_put_autosuspend(dp->dev); +} + +static int dw_dp_audio_mute_stream(struct drm_bridge *bridge, + struct drm_connector *connector, + bool enable, int direction) +{ + struct dw_dp *dp =3D bridge_to_dp(bridge); + + dev_dbg(dp->dev, "audio %smute\n", enable ? "" : "un"); + + guard(mutex)(&dp->audio_lock); + + dp->audio_muted =3D enable; + + regmap_update_bits(dp->regmap, DW_DP_AUD_CONFIG1, AUDIO_MUTE, + FIELD_PREP(AUDIO_MUTE, enable)); + + return 0; +} + static void dw_dp_bridge_atomic_enable(struct drm_bridge *bridge, struct drm_atomic_commit *state) { @@ -1734,6 +2013,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) @@ -2044,6 +2331,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) @@ -2251,6 +2543,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); @@ -2357,12 +2653,21 @@ int dw_dp_probe(struct dw_dp *dp) return ret; =20 dp->vsc_sdp_nr =3D -1; + dp->audio_interface =3D DW_DP_AUDIO_UNUSED; + dp->audio_sdp_nr =3D -1; =20 bridge =3D &dp->bridge; bridge->of_node =3D dev->of_node; - bridge->ops =3D DRM_BRIDGE_OP_DETECT | DRM_BRIDGE_OP_EDID | DRM_BRIDGE_OP= _HPD; + bridge->ops =3D DRM_BRIDGE_OP_DP_AUDIO | + DRM_BRIDGE_OP_DETECT | + DRM_BRIDGE_OP_EDID | + DRM_BRIDGE_OP_HPD; bridge->type =3D DRM_MODE_CONNECTOR_DisplayPort; bridge->ycbcr_420_allowed =3D true; + bridge->hdmi_audio_dev =3D dev; + bridge->hdmi_audio_max_i2s_playback_channels =3D 8; + bridge->hdmi_audio_dai_port =3D 1; + bridge->hdmi_audio_spdif_playback =3D true; =20 return devm_drm_bridge_add(dev, bridge); } --=20 2.53.0