.channel = 0,
                .node = NULL,
        };
+       int ret;
 
        DRM_DEV_DEBUG_DRIVER(dev, "attach dsi\n");
 
                return -EINVAL;
        }
 
-       dsi = mipi_dsi_device_register_full(host, &info);
+       dsi = devm_mipi_dsi_device_register_full(dev, host, &info);
        if (IS_ERR(dsi)) {
                DRM_DEV_ERROR(dev, "fail to create dsi device.\n");
                return -EINVAL;
                MIPI_DSI_MODE_VIDEO_SYNC_PULSE  |
                MIPI_DSI_MODE_VIDEO_HSE;
 
-       if (mipi_dsi_attach(dsi) < 0) {
+       ret = devm_mipi_dsi_attach(dev, dsi);
+       if (ret) {
                DRM_DEV_ERROR(dev, "fail to attach dsi to host.\n");
-               mipi_dsi_device_unregister(dsi);
-               return -EINVAL;
+               return ret;
        }
 
        ctx->dsi = dsi;
        return 0;
 }
 
-static void anx7625_bridge_detach(struct drm_bridge *bridge)
-{
-       struct anx7625_data *ctx = bridge_to_anx7625(bridge);
-
-       if (ctx->dsi) {
-               mipi_dsi_detach(ctx->dsi);
-               mipi_dsi_device_unregister(ctx->dsi);
-       }
-}
-
 static int anx7625_bridge_attach(struct drm_bridge *bridge,
                                 enum drm_bridge_attach_flags flags)
 {
 
 static const struct drm_bridge_funcs anx7625_bridge_funcs = {
        .attach = anx7625_bridge_attach,
-       .detach = anx7625_bridge_detach,
        .disable = anx7625_bridge_disable,
        .mode_valid = anx7625_bridge_mode_valid,
        .mode_set = anx7625_bridge_mode_set,