From patchwork Thu Dec 22 15:05:21 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Javier Martin X-Patchwork-Id: 8966 Received: from mail.tu-berlin.de ([130.149.7.33]) by www.linuxtv.org with esmtp (Exim 4.72) (envelope-from ) id 1RdkDB-0006LC-Pe; Thu, 22 Dec 2011 16:05:41 +0100 X-tubIT-Incoming-IP: 209.132.180.67 Received: from vger.kernel.org ([209.132.180.67]) by mail.tu-berlin.de (exim-4.75/mailfrontend-4) with esmtp id 1RdkDB-00075s-9x; Thu, 22 Dec 2011 16:05:37 +0100 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753225Ab1LVPFe (ORCPT + 3 others); Thu, 22 Dec 2011 10:05:34 -0500 Received: from mail-wi0-f174.google.com ([209.85.212.174]:57111 "EHLO mail-wi0-f174.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752975Ab1LVPFe (ORCPT ); Thu, 22 Dec 2011 10:05:34 -0500 Received: by wibhm6 with SMTP id hm6so2585404wib.19 for ; Thu, 22 Dec 2011 07:05:32 -0800 (PST) Received: by 10.180.72.133 with SMTP id d5mr24243781wiv.7.1324566332697; Thu, 22 Dec 2011 07:05:32 -0800 (PST) Received: from localhost.localdomain (74.51.18.95.dynamic.jazztel.es. [95.18.51.74]) by mx.google.com with ESMTPS id w8sm23237408wiz.4.2011.12.22.07.05.31 (version=TLSv1/SSLv3 cipher=OTHER); Thu, 22 Dec 2011 07:05:32 -0800 (PST) From: Javier Martin To: linux-media@vger.kernel.org Cc: mchehab@infradead.org, g.liakhovetski@gmx.de, lethal@linux-sh.org, hans.verkuil@cisco.com, s.hauer@pengutronix.de, Javier Martin Subject: [PATCH] media i.MX27 camera: Fix field_count handling. Date: Thu, 22 Dec 2011 16:05:21 +0100 Message-Id: <1324566321-13953-1-git-send-email-javier.martin@vista-silicon.com> X-Mailer: git-send-email 1.7.0.4 Sender: linux-media-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-media@vger.kernel.org X-PMX-Version: 5.6.1.2065439, Antispam-Engine: 2.7.2.376379, Antispam-Data: 2011.12.22.144815 X-PMX-Spam: Gauge=IIIIIIII, Probability=8%, Report=' MULTIPLE_RCPTS 0.1, BODY_SIZE_4000_4999 0, BODY_SIZE_5000_LESS 0, BODY_SIZE_7000_LESS 0, __ANY_URI 0, __CP_MEDIA_BODY 0, __CP_URI_IN_BODY 0, __HAS_MSGID 0, __HAS_X_MAILER 0, __HAS_X_MAILING_LIST 0, __MIME_TEXT_ONLY 0, __MULTIPLE_RCPTS_CC_X2 0, __SANE_MSGID 0, __TO_MALFORMED_2 0, __TO_NO_NAME 0, __URI_NO_WWW 0, __URI_NS ' X-LSpam-Score: -1.9 (-) X-LSpam-Report: No, score=-1.9 required=5.0 tests=BAYES_00=-1.9 autolearn=ham To properly detect frame loss the driver must keep track of a frame_count. Furthermore, field_count use was erroneous because in progressive format this must be incremented twice. Signed-off-by: Javier Martin --- drivers/media/video/mx2_camera.c | 5 ++++- drivers/media/video/mx2_emmaprp.c | 29 ++++++++++------------------- 2 files changed, 14 insertions(+), 20 deletions(-) diff --git a/drivers/media/video/mx2_camera.c b/drivers/media/video/mx2_camera.c index ea1f4dc..ca76dd2 100644 --- a/drivers/media/video/mx2_camera.c +++ b/drivers/media/video/mx2_camera.c @@ -255,6 +255,7 @@ struct mx2_camera_dev { dma_addr_t discard_buffer_dma; size_t discard_size; struct mx2_fmt_cfg *emma_prp; + u32 frame_count; }; /* buffer for one video frame */ @@ -368,6 +369,7 @@ static int mx2_camera_add_device(struct soc_camera_device *icd) writel(pcdev->csicr1, pcdev->base_csi + CSICR1); pcdev->icd = icd; + pcdev->frame_count = 0; dev_info(icd->parent, "Camera driver attached to camera %d\n", icd->devnum); @@ -1211,7 +1213,8 @@ static void mx27_camera_frame_done_emma(struct mx2_camera_dev *pcdev, list_del(&vb->queue); vb->state = state; do_gettimeofday(&vb->ts); - vb->field_count++; + vb->field_count = pcdev->frame_count * 2; + pcdev->frame_count++; wake_up(&vb->done); } diff --git a/drivers/media/video/mx2_emmaprp.c b/drivers/media/video/mx2_emmaprp.c index 607b73f..fb87665 100644 --- a/drivers/media/video/mx2_emmaprp.c +++ b/drivers/media/video/mx2_emmaprp.c @@ -16,6 +16,7 @@ * Free Software Foundation; either version 2 of the * License, or (at your option) any later version */ + #include #include #include @@ -35,7 +36,7 @@ MODULE_AUTHOR("Javier Martin dev; + struct dma_chan *chan = pcdev->dma_chan; if ((v4l2_m2m_num_src_bufs_ready(ctx->m2m_ctx) > 0) && (v4l2_m2m_num_dst_bufs_ready(ctx->m2m_ctx) > 0) - && (atomic_read(&pcdev->busy) == 0)) + && (dma_async_memcpy_complete(chan, ctx->cookie, NULL, NULL) == 0)) return 1; dprintk(pcdev, "Task not ready to run\n"); @@ -290,10 +292,8 @@ static void emmaprp_unlock(void *priv) static void emmaprp_dma_callback(void *data) { struct emmaprp_dev *pcdev = (struct emmaprp_dev *)data; - struct dma_chan *chan = pcdev->dma_chan; struct vb2_buffer *src_vb, *dst_vb; struct emmaprp_ctx *curr_ctx; - enum dma_status status; unsigned long flags; curr_ctx = v4l2_m2m_get_curr_priv(pcdev->m2m_dev); @@ -306,26 +306,18 @@ static void emmaprp_dma_callback(void *data) if (curr_ctx->aborting) goto irq_ok; - status = dma_async_memcpy_complete(chan, curr_ctx->cookie, NULL, NULL); - if (status != DMA_SUCCESS) { - v4l2_warn(&pcdev->v4l2_dev, - "DMA got completion callback but status is \'%s\'\n", - status == DMA_ERROR ? "error" : "in progress"); - goto irq_ok; - } - src_vb = v4l2_m2m_src_buf_remove(curr_ctx->m2m_ctx); dst_vb = v4l2_m2m_dst_buf_remove(curr_ctx->m2m_ctx); dst_vb->v4l2_buf.sequence = src_vb->v4l2_buf.sequence; - +printk("%s: dstbuf sequence =%d, srcbuf sequence = %d\n", __func__, dst_vb->v4l2_buf.sequence, src_vb->v4l2_buf.sequence); spin_lock_irqsave(&pcdev->irqlock, flags); v4l2_m2m_buf_done(src_vb, VB2_BUF_STATE_DONE); v4l2_m2m_buf_done(dst_vb, VB2_BUF_STATE_DONE); spin_unlock_irqrestore(&pcdev->irqlock, flags); irq_ok: - atomic_set(&pcdev->busy, 0); v4l2_m2m_job_finish(pcdev->m2m_dev, curr_ctx->m2m_ctx); +printk("DMA IRQ\n"); } static void emmaprp_device_run(void *priv) @@ -342,7 +334,6 @@ static void emmaprp_device_run(void *priv) unsigned int d_size, s_size; dma_addr_t p_in, p_out; enum dma_ctrl_flags flags; - dma_cookie_t cookie; atomic_set(&ctx->dev->busy, 1); @@ -382,12 +373,12 @@ static void emmaprp_device_run(void *priv) } tx->callback = emmaprp_dma_callback; tx->callback_param = pcdev; - cookie = tx->tx_submit(tx); - ctx->cookie = cookie; - if (dma_submit_error(cookie)) { + ctx->cookie = tx->tx_submit(tx); + + if (dma_submit_error(ctx->cookie)) { v4l2_warn(&pcdev->v4l2_dev, "DMA submit error %d with src=0x%x dst=0x%x len=0x%x\n", - cookie, p_in, p_out, s_size * 3/2); + ctx->cookie, p_in, p_out, s_size * 3/2); return; } dma_async_issue_pending(chan);