if (!is_tx_enabled(tx))
                return 0;
 
-       /* FIXME: Do endpoint matching again! */
-
        adv748x_subdev_init(&tx->sd, state, &adv748x_csi2_ops,
                            MEDIA_ENT_F_VID_IF_BRIDGE,
                            is_txa(tx) ? "txa" : "txb");
        if (ret)
                return ret;
 
-       ret = adv748x_csi2_init_controls(tx);
+       ret = v4l2_async_subdev_endpoint_add(&tx->sd,
+                                            of_fwnode_handle(state->endpoints[tx->port]));
        if (ret)
                goto err_free_media;
 
+       ret = adv748x_csi2_init_controls(tx);
+       if (ret)
+               goto err_cleanup_subdev;
+
        ret = v4l2_async_register_subdev(&tx->sd);
        if (ret)
                goto err_free_ctrl;
 
 err_free_ctrl:
        v4l2_ctrl_handler_free(&tx->ctrl_hdl);
+err_cleanup_subdev:
+       v4l2_subdev_cleanup(&tx->sd);
 err_free_media:
        media_entity_cleanup(&tx->sd.entity);
 
        v4l2_async_unregister_subdev(&tx->sd);
        media_entity_cleanup(&tx->sd.entity);
        v4l2_ctrl_handler_free(&tx->ctrl_hdl);
+       v4l2_subdev_cleanup(&tx->sd);
 }