[PATCH v11 01/21] drm/bridge: synopsys: dw-dp: Register DP AUX on bridge attach
Sebastian Reichel
sebastian.reichel at collabora.com
Mon Aug 17 09:19:37 PDT 2026
Hello Andy,
On Sun, Aug 16, 2026 at 08:37:21PM +0800, Andy Yan wrote:
> Hello Sebastian,
>
> At 2026-08-07 01:02:07, "Sebastian Reichel" <sebastian.reichel at collabora.com> wrote:
> >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 <sashiko-bot at kernel.org>
> >Signed-off-by: Sebastian Reichel <sebastian.reichel at collabora.com>
> >---
> > 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/bridge/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;
> > }
> >
> >+static int dw_dp_bridge_attach(struct drm_bridge *bridge,
> >+ struct drm_encoder *encoder,
> >+ enum drm_bridge_attach_flags flags)
> >+{
> >+ struct dw_dp *dp = bridge_to_dp(bridge);
> >+ struct device *dev = dp->dev;
> >+ int ret;
> >+
> >+ dp->aux.dev = dev;
> >+ dp->aux.drm_dev = encoder->dev;
> >+ dp->aux.name = dev_name(dev);
> >+ dp->aux.transfer = dw_dp_aux_transfer;
> >+
> >+ ret = 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 = bridge_to_dp(bridge);
> >+
> >+ drm_dp_aux_unregister(&dp->aux);
> >+}
> >+
> > static const struct drm_bridge_funcs dw_dp_bridge_funcs = {
> >+ .attach = dw_dp_bridge_attach,
> >+ .detach = dw_dp_bridge_detach,
> > .atomic_duplicate_state = dw_dp_bridge_atomic_duplicate_state,
> > .atomic_destroy_state = drm_atomic_helper_bridge_destroy_state,
> > .atomic_create_state = 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);
> >
> >- dp->aux.dev = dev;
> >- dp->aux.drm_dev = encoder->dev;
> >- dp->aux.name = dev_name(dev);
> >- dp->aux.transfer = dw_dp_aux_transfer;
> >- ret = drm_dp_aux_register(&dp->aux);
> >- if (ret) {
> >- dev_err_probe(dev, ret, "Aux register failed\n");
> >- return ERR_PTR(ret);
> >- }
> >-
> > ret = drm_bridge_attach(encoder, bridge, NULL, DRM_BRIDGE_ATTACH_NO_CONNECTOR);
> > if (ret) {
> > dev_err_probe(dev, ret, "Failed to attach bridge\n");
> >- goto unregister_aux;
> >+ return ERR_PTR(ret);
> > }
> >
> > dw_dp_init_hw(dp);
> >@@ -2064,37 +2083,33 @@ struct dw_dp *dw_dp_bind(struct device *dev, struct drm_encoder *encoder,
> > ret = phy_init(dp->phy);
> > if (ret) {
> > dev_err_probe(dev, ret, "phy init failed\n");
> >- goto unregister_aux;
> >+ return ERR_PTR(ret);
> > }
> >
> > ret = devm_add_action_or_reset(dev, dw_dp_phy_exit, dp);
> > if (ret)
> >- goto unregister_aux;
> >+ return ERR_PTR(ret);
> >
> > dp->irq = platform_get_irq(pdev, 0);
> > if (dp->irq < 0) {
> > ret = dp->irq;
> >- goto unregister_aux;
> >+ return ERR_PTR(ret);
> > }
> >
> > ret = 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");
>
>
> After this patch[0] is applied, there will be a conflict here.
>
> [0]https://lore.kernel.org/all/20260723131649.134127-6-panchuang@vivo.com/#t
This got applied after I send this. I do rebase to latest
drm-misc-next on every submission, so it will be fixed with the next
version.
Greetings,
-- Sebastian
>
>
> >- goto unregister_aux;
> >+ return ERR_PTR(ret);
> > }
>
>
>
> >
> > return dp;
> >-
> >-unregister_aux:
> >- drm_dp_aux_unregister(&dp->aux);
> >- return ERR_PTR(ret);
> > }
> > EXPORT_SYMBOL_GPL(dw_dp_bind);
> >
> > void dw_dp_unbind(struct dw_dp *dp)
> > {
> >- drm_dp_aux_unregister(&dp->aux);
> >+ /* nothing to do */
> > }
> > EXPORT_SYMBOL_GPL(dw_dp_unbind);
> >
> >
> >--
> >2.53.0
> >
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-rockchip/attachments/20260817/3fa68637/attachment.sig>
More information about the Linux-rockchip
mailing list