From b2f6b2abc791802631ff1c85488cdf3c1f0a97e2 Mon Sep 17 00:00:00 2001 From: Marcel Ziswiler Date: Mon, 7 Nov 2016 12:59:07 +0100 Subject: Revert "media: tegra_camera: introduce 2 kthreads for capture" This reverts commit ff5bccb61c1f8da1f63451fda88bd1f65dbee5b2. This makes Antmicro's OV5640 camera module work again as described on their blog here: http://antmicro.com/Blog/2015/09/jetson-tk1-cameras/ Further investigation pending. Acked-by: Marcel Ziswiler Acked-by: Dominik Sliwa --- .../media/platform/soc_camera/tegra_camera/vi2.c | 60 +++++++--------------- 1 file changed, 18 insertions(+), 42 deletions(-) (limited to 'drivers/media/platform/soc_camera/tegra_camera/vi2.c') diff --git a/drivers/media/platform/soc_camera/tegra_camera/vi2.c b/drivers/media/platform/soc_camera/tegra_camera/vi2.c index 99bef12e1b7f..56659fe6bb3a 100644 --- a/drivers/media/platform/soc_camera/tegra_camera/vi2.c +++ b/drivers/media/platform/soc_camera/tegra_camera/vi2.c @@ -787,9 +787,10 @@ static int vi2_capture_setup_csi_1(struct tegra_camera_dev *cam, return 0; } -static int vi2_capture_setup(struct tegra_camera_dev *cam, - struct tegra_camera_buffer *buf) +static int vi2_capture_setup(struct tegra_camera_dev *cam) { + struct vb2_buffer *vb = cam->active; + struct tegra_camera_buffer *buf = to_tegra_vb(vb); struct soc_camera_device *icd = buf->icd; struct soc_camera_subdev_desc *ssdesc = &icd->sdesc->subdev_desc; struct tegra_camera_platform_data *pdata = ssdesc->drv_priv; @@ -959,7 +960,7 @@ static void vi2_capture_error_status(struct tegra_camera_dev *cam) } static int vi2_capture_start(struct tegra_camera_dev *cam, - struct tegra_camera_buffer *buf) + struct tegra_camera_buffer *buf) { struct soc_camera_device *icd = buf->icd; struct soc_camera_subdev_desc *ssdesc = &icd->sdesc->subdev_desc; @@ -972,6 +973,7 @@ static int vi2_capture_start(struct tegra_camera_dev *cam, if (err < 0) return err; + /* Only wait on CSI frame end syncpt if we're using CSI. */ if (port == TEGRA_CAMERA_PORT_CSI_A) { if (!nvhost_syncpt_read_ext_check(cam->ndev, cam->syncpt_id_csi_a, &val)) @@ -982,6 +984,13 @@ static int vi2_capture_start(struct tegra_camera_dev *cam, TC_VI_REG_WT(cam, TEGRA_VI_CFG_VI_INCR_SYNCPT, VI_CSI_PPA_FRAME_START | cam->syncpt_id_csi_a); TC_VI_REG_WT(cam, TEGRA_VI_CSI_0_SINGLE_SHOT, 0x1); + + err = nvhost_syncpt_wait_timeout_ext(cam->ndev, + cam->syncpt_id_csi_a, + cam->syncpt_csi_a, + TEGRA_SYNCPT_CSI_WAIT_TIMEOUT, + NULL, + NULL); } else if (port == TEGRA_CAMERA_PORT_CSI_B || port == TEGRA_CAMERA_PORT_CSI_C) { if (!nvhost_syncpt_read_ext_check(cam->ndev, @@ -993,30 +1002,7 @@ static int vi2_capture_start(struct tegra_camera_dev *cam, TC_VI_REG_WT(cam, TEGRA_VI_CFG_VI_INCR_SYNCPT, VI_CSI_PPB_FRAME_START | cam->syncpt_id_csi_b); TC_VI_REG_WT(cam, TEGRA_VI_CSI_1_SINGLE_SHOT, 0x1); - } - - return err; -} - -static int vi2_capture_wait(struct tegra_camera_dev *cam, - struct tegra_camera_buffer *buf) -{ - struct soc_camera_device *icd = buf->icd; - struct soc_camera_subdev_desc *ssdesc = &icd->sdesc->subdev_desc; - struct tegra_camera_platform_data *pdata = ssdesc->drv_priv; - int port = pdata->port; - int err = 0; - /* Only wait on CSI frame end syncpt if we're using CSI. */ - if (port == TEGRA_CAMERA_PORT_CSI_A) { - err = nvhost_syncpt_wait_timeout_ext(cam->ndev, - cam->syncpt_id_csi_a, - cam->syncpt_csi_a, - TEGRA_SYNCPT_CSI_WAIT_TIMEOUT, - NULL, - NULL); - } else if (port == TEGRA_CAMERA_PORT_CSI_B || - port == TEGRA_CAMERA_PORT_CSI_C) { err = nvhost_syncpt_wait_timeout_ext(cam->ndev, cam->syncpt_id_csi_b, cam->syncpt_csi_b, @@ -1046,7 +1032,7 @@ static int vi2_capture_wait(struct tegra_camera_dev *cam, return err; } -static int vi2_capture_done(struct tegra_camera_dev *cam, int port) +static int vi2_capture_stop(struct tegra_camera_dev *cam, int port) { u32 val; int err = 0; @@ -1076,6 +1062,7 @@ static int vi2_capture_done(struct tegra_camera_dev *cam, int port) TEGRA_SYNCPT_CSI_WAIT_TIMEOUT, NULL, NULL); + TC_VI_REG_WT(cam, TEGRA_CSI_PIXEL_STREAM_PPA_COMMAND, 0xf002); } else if (port == TEGRA_CAMERA_PORT_CSI_B || port == TEGRA_CAMERA_PORT_CSI_C) { if (!nvhost_syncpt_read_ext_check(cam->ndev, @@ -1102,22 +1089,12 @@ static int vi2_capture_done(struct tegra_camera_dev *cam, int port) TEGRA_SYNCPT_CSI_WAIT_TIMEOUT, NULL, NULL); + TC_VI_REG_WT(cam, TEGRA_CSI_PIXEL_STREAM_PPB_COMMAND, 0xf002); } return err; } -static int vi2_capture_stop(struct tegra_camera_dev *cam, int port) -{ - u32 reg = (port == TEGRA_CAMERA_PORT_CSI_A) ? - TEGRA_CSI_PIXEL_STREAM_PPA_COMMAND : - TEGRA_CSI_PIXEL_STREAM_PPB_COMMAND; - - TC_VI_REG_WT(cam, reg, 0xf002); - - return 0; -} - /* Reset VI2/CSI2 when activating, no sepecial ops for deactiving */ static void vi2_sw_reset(struct tegra_camera_dev *cam) { @@ -1130,12 +1107,13 @@ static void vi2_sw_reset(struct tegra_camera_dev *cam) } -static int vi2_mipi_calibration(struct tegra_camera_dev *cam, - struct tegra_camera_buffer *buf) +static int vi2_mipi_calibration(struct tegra_camera_dev *cam) { void __iomem *mipi_cal; struct regmap *regs; struct platform_device *pdev = cam->ndev; + struct vb2_buffer *vb = cam->active; + struct tegra_camera_buffer *buf = to_tegra_vb(vb); struct soc_camera_device *icd = buf->icd; struct soc_camera_subdev_desc *ssdesc = &icd->sdesc->subdev_desc; struct tegra_camera_platform_data *pdata = ssdesc->drv_priv; @@ -1278,8 +1256,6 @@ struct tegra_camera_ops vi2_ops = { .capture_clean = vi2_capture_clean, .capture_setup = vi2_capture_setup, .capture_start = vi2_capture_start, - .capture_wait = vi2_capture_wait, - .capture_done = vi2_capture_done, .capture_stop = vi2_capture_stop, .activate = vi2_sw_reset, -- cgit v1.2.3