struct media_pad                pads[CSI2RX_PAD_MAX];
 
        /* Remote source */
-       struct v4l2_async_subdev        asd;
        struct v4l2_subdev              *source_subdev;
        int                             source_pad;
 };
 static int csi2rx_parse_dt(struct csi2rx_priv *csi2rx)
 {
        struct v4l2_fwnode_endpoint v4l2_ep = { .bus_type = 0 };
+       struct v4l2_async_subdev *asd;
        struct fwnode_handle *fwh;
        struct device_node *ep;
        int ret;
                return -EINVAL;
        }
 
-       csi2rx->asd.match.fwnode = fwnode_graph_get_remote_port_parent(fwh);
-       csi2rx->asd.match_type = V4L2_ASYNC_MATCH_FWNODE;
-       of_node_put(ep);
-
        v4l2_async_notifier_init(&csi2rx->notifier);
 
-       ret = v4l2_async_notifier_add_subdev(&csi2rx->notifier, &csi2rx->asd);
-       if (ret) {
-               fwnode_handle_put(csi2rx->asd.match.fwnode);
-               return ret;
-       }
+       asd = v4l2_async_notifier_add_fwnode_remote_subdev(&csi2rx->notifier,
+                                                          fwh, sizeof(*asd));
+       of_node_put(ep);
+       if (IS_ERR(asd))
+               return PTR_ERR(asd);
 
        csi2rx->notifier.ops = &csi2rx_notifier_ops;