struct rkisp1_csi *csi = to_rkisp1_csi(sd);
        struct rkisp1_device *rkisp1 = csi->rkisp1;
        struct rkisp1_sensor_async *source_asd;
+       struct v4l2_async_connection *asc;
        struct media_pad *source_pad;
        struct v4l2_subdev *source;
        int ret;
                return -EPIPE;
        }
 
-       source_asd = container_of(source->asd, struct rkisp1_sensor_async, asd);
+       asc = v4l2_async_connection_unique(source);
+       if (!asc)
+               return -EPIPE;
+
+       source_asd = container_of(asc, struct rkisp1_sensor_async, asd);
        if (source_asd->mbus_type != V4L2_MBUS_CSI2_DPHY)
                return -EINVAL;
 
 
                mbus_flags = 0;
        } else {
                const struct rkisp1_sensor_async *asd;
+               struct v4l2_async_connection *asc;
 
-               asd = container_of(rkisp1->source->asd,
-                                  struct rkisp1_sensor_async, asd);
+               asc = v4l2_async_connection_unique(rkisp1->source);
+               if (!asc)
+                       return -EPIPE;
+
+               asd = container_of(asc, struct rkisp1_sensor_async, asd);
 
                mbus_type = asd->mbus_type;
                mbus_flags = asd->mbus_flags;
 
        struct isp_bus_cfg bus;
 };
 
-#define v4l2_subdev_to_bus_cfg(sd) \
-       (&container_of((sd)->asd, struct isp_async_subdev, asd)->bus)
+static inline struct isp_bus_cfg *
+v4l2_subdev_to_bus_cfg(struct v4l2_subdev *sd)
+{
+       struct v4l2_async_connection *asc;
+
+       asc = v4l2_async_connection_unique(sd);
+       if (!asc)
+               return NULL;
+
+       return &container_of(asc, struct isp_async_subdev, asd)->bus;
+}
 
 #define v4l2_dev_to_isp_device(dev) \
        container_of(dev, struct isp_device, v4l2_dev)
 
        if (ccdc->input == CCDC_INPUT_PARALLEL) {
                struct v4l2_subdev *sd =
                        to_isp_pipeline(&ccdc->subdev.entity)->external;
+               struct isp_bus_cfg *bus_cfg;
 
-               parcfg = &v4l2_subdev_to_bus_cfg(sd)->bus.parallel;
+               bus_cfg = v4l2_subdev_to_bus_cfg(sd);
+               if (WARN_ON(!bus_cfg))
+                       return;
+
+               parcfg = &bus_cfg->bus.parallel;
                ccdc->bt656 = parcfg->bt656;
        }
 
        if (ccdc->input == CCDC_INPUT_PARALLEL) {
                struct v4l2_subdev *sd =
                        media_entity_to_v4l2_subdev(link->source->entity);
-               struct isp_bus_cfg *bus_cfg = v4l2_subdev_to_bus_cfg(sd);
+               struct isp_bus_cfg *bus_cfg;
+
+               bus_cfg = v4l2_subdev_to_bus_cfg(sd);
+               if (WARN_ON(!bus_cfg))
+                       return -EPIPE;
 
                parallel_shift = bus_cfg->bus.parallel.data_lane_shift;
        } else {
 
        pad = media_pad_remote_pad_first(&ccp2->pads[CCP2_PAD_SINK]);
        sensor = media_entity_to_v4l2_subdev(pad->entity);
        buscfg = v4l2_subdev_to_bus_cfg(pipe->external);
+       if (WARN_ON(!buscfg))
+               return -EPIPE;
 
        ret = ccp2_phyif_config(ccp2, &buscfg->bus.ccp2);
        if (ret < 0)
 
        pad = media_pad_remote_pad_first(&csi2->pads[CSI2_PAD_SINK]);
        sensor = media_entity_to_v4l2_subdev(pad->entity);
        buscfg = v4l2_subdev_to_bus_cfg(pipe->external);
+       if (WARN_ON(!buscfg))
+               return -EPIPE;
 
        csi2->frame_skip = 0;
        v4l2_subdev_call(sensor, sensor, g_skip_frames, &csi2->frame_skip);
 
 static int omap3isp_csiphy_config(struct isp_csiphy *phy)
 {
        struct isp_pipeline *pipe = to_isp_pipeline(phy->entity);
-       struct isp_bus_cfg *buscfg = v4l2_subdev_to_bus_cfg(pipe->external);
+       struct isp_bus_cfg *buscfg;
        struct isp_csiphy_lanes_cfg *lanes;
        int csi2_ddrclk_khz;
        unsigned int num_data_lanes, used_lanes = 0;
        unsigned int i;
        u32 reg;
 
+       buscfg = v4l2_subdev_to_bus_cfg(pipe->external);
+       if (WARN_ON(!buscfg))
+               return -EPIPE;
+
        if (buscfg->interface == ISP_INTERFACE_CCP2B_PHY1
            || buscfg->interface == ISP_INTERFACE_CCP2B_PHY2) {
                lanes = &buscfg->bus.ccp2.lanecfg;
        mutex_lock(&phy->mutex);
        if (phy->entity) {
                struct isp_pipeline *pipe = to_isp_pipeline(phy->entity);
-               struct isp_bus_cfg *buscfg =
-                       v4l2_subdev_to_bus_cfg(pipe->external);
+               struct isp_bus_cfg *buscfg;
+
+               buscfg = v4l2_subdev_to_bus_cfg(pipe->external);
+               if (WARN_ON(!buscfg)) {
+                       mutex_unlock(&phy->mutex);
+                       return;
+               }
 
                csiphy_routing_cfg(phy, buscfg->interface, false,
                                   buscfg->bus.ccp2.phy_layer);
 
 }
 EXPORT_SYMBOL_GPL(__v4l2_async_nf_add_i2c);
 
+struct v4l2_async_connection *
+v4l2_async_connection_unique(struct v4l2_subdev *sd)
+{
+       return sd->asd;
+}
+EXPORT_SYMBOL_GPL(v4l2_async_connection_unique);
+
 int v4l2_async_register_subdev(struct v4l2_subdev *sd)
 {
        struct v4l2_async_notifier *subdev_notifier;
 
        ((type *)__v4l2_async_nf_add_i2c(notifier, adapter, address, \
                                         sizeof(type)))
 
+/**
+ * v4l2_async_connection_unique - return a unique &struct v4l2_async_connection
+ *                               for a sub-device
+ * @sd: the sub-device
+ *
+ * Return an async connection for a sub-device, when there is a single
+ * one only.
+ */
+struct v4l2_async_connection *
+v4l2_async_connection_unique(struct v4l2_subdev *sd);
+
 /**
  * v4l2_async_nf_register - registers a subdevice asynchronous notifier
  *