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" 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 > >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/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 > >