summaryrefslogtreecommitdiff
path: root/drivers/media/platform/soc_camera/tegra_camera/common.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/media/platform/soc_camera/tegra_camera/common.c')
-rw-r--r--drivers/media/platform/soc_camera/tegra_camera/common.c32
1 files changed, 28 insertions, 4 deletions
diff --git a/drivers/media/platform/soc_camera/tegra_camera/common.c b/drivers/media/platform/soc_camera/tegra_camera/common.c
index 06741f3ebca1..762c95724609 100644
--- a/drivers/media/platform/soc_camera/tegra_camera/common.c
+++ b/drivers/media/platform/soc_camera/tegra_camera/common.c
@@ -170,7 +170,9 @@ static int tegra_camera_activate(struct tegra_camera_dev *cam,
if (cam_ops->capture_clean)
cam_ops->capture_clean(cam);
- cam->sof = 1;
+ cam->sof[0] = 1;
+ cam->sof[1] = 1;
+ cam->sof[2] = 1;
return 0;
}
@@ -197,8 +199,12 @@ static void tegra_camera_deactivate(struct tegra_camera_dev *cam)
nvhost_module_idle_ext(cam->ndev);
- cam->sof = 0;
- cam->cal_done = 0;
+ cam->sof[0] = 0;
+ cam->sof[1] = 0;
+ cam->sof[2] = 0;
+ cam->cal_done[0] = 0;
+ cam->cal_done[1] = 0;
+ cam->cal_done[2] = 0;
}
static int tegra_camera_capture_frame(struct tegra_camera_dev *cam,
@@ -219,7 +225,7 @@ static int tegra_camera_capture_frame(struct tegra_camera_dev *cam,
if (cam->ops->mipi_calibration && !cam->cal_done[port-1]) {
err = cam->ops->mipi_calibration(cam, buf);
if (!err)
- cam->cal_done = 1;
+ cam->cal_done[port-1] = 1;
}
/* Issue start capture */
@@ -555,6 +561,18 @@ static int tegra_camera_start_streaming(struct vb2_queue *q, unsigned int count)
vb2_vidq);
struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
struct tegra_camera_dev *cam = ici->priv;
+ struct soc_camera_subdev_desc *ssdesc = &icd->sdesc->subdev_desc;
+ struct tegra_camera_platform_data *pdata = ssdesc->drv_priv;
+ int port = pdata->port;
+
+ /* CSI B and CSI C can't work simultaneously */
+ if (port == TEGRA_CAMERA_PORT_CSI_B ||
+ port == TEGRA_CAMERA_PORT_CSI_C) {
+ if (cam->csi_bc_busy)
+ return -EBUSY;
+ else
+ cam->csi_bc_busy = true;
+ }
/* Start kthread to capture frame */
cam->kthread_capture_start = kthread_run(
@@ -587,6 +605,12 @@ static int tegra_camera_stop_streaming(struct vb2_queue *q)
cam->ops->capture_stop(cam, port);
+ if (port == TEGRA_CAMERA_PORT_CSI_B ||
+ port == TEGRA_CAMERA_PORT_CSI_C) {
+ cam->csi_bc_busy = false;
+ }
+
+
return 0;
}