 +	struct ti964_ti913_priv *priv = v4l2_get_subdevdata(sd);
 +	struct i2c_client *client = priv->client;
 +
-+	reg8_write(client, 0x20, 0x00);		/* enable port forwarding */
++	reg8_write(client, 0x33, ((priv->lanes - 1) ^ 0x3) << 4 | 0x1); /* enable CSI output, set CSI lane count, non-continuous CSI mode */
 +
 +	return 0;
 +}

 static int rcar_vin_add_device(struct soc_camera_device *icd)
 {
 	struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
@@ -1328,8 +1355,21 @@ static int rcar_vin_add_device(struct soc_camera_device *icd)
 
 	if (priv->chip == RCAR_H3 || priv->chip == RCAR_M3) {
 		struct v4l2_subdev *csi2_sd = find_csi2(priv);
-		int ret;
+		struct v4l2_subdev *deser_sd = find_deser(priv);
+		int ret = 0;
+
+		if (deser_sd) {
+			v4l2_set_subdev_hostdata(deser_sd, icd);
+
+			ret = v4l2_subdev_call(deser_sd, core, s_power, 1);
+			priv->deser_sync = true;
 
+			if (ret < 0 && ret != -EINVAL)
+				priv->deser_sync = false;
+
+			if (ret < 0 && ret != -ENOIOCTLCMD && ret != -ENODEV)
+				return ret;
+		}
 		if (csi2_sd) {
 			csi2_sd->grp_id = soc_camera_grp_id(icd);
 			v4l2_set_subdev_hostdata(csi2_sd, icd);
@@ -1370,6 +1410,7 @@ static void rcar_vin_remove_device(struct soc_camera_device *icd)
 	struct rcar_vin_priv *priv = ici->priv;
 	struct vb2_v4l2_buffer *vbuf;

+};
diff --git a/drivers/media/i2c/soc_camera/ti964_ti913.c b/drivers/media/i2c/soc_camera/ti964_ti913.c
new file mode 100644
index 0000000..ab480f5
--- /dev/null
+++ b/drivers/media/i2c/soc_camera/ti964_ti913.c
@@ -0,0 +1,353 @@
