From patchwork Sat Jun 4 23:47:16 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ezequiel Garcia X-Patchwork-Id: 9155019 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 87F5460751 for ; Sat, 4 Jun 2016 23:54:02 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 7A43927B13 for ; Sat, 4 Jun 2016 23:54:02 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 6F01727C8F; Sat, 4 Jun 2016 23:54:02 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.8 required=2.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_HI,T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id C0C2927B13 for ; Sat, 4 Jun 2016 23:54:01 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1750951AbcFDXyA (ORCPT ); Sat, 4 Jun 2016 19:54:00 -0400 Received: from mail-qt0-f179.google.com ([209.85.216.179]:34152 "EHLO mail-qt0-f179.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750884AbcFDXx7 (ORCPT ); Sat, 4 Jun 2016 19:53:59 -0400 Received: by mail-qt0-f179.google.com with SMTP id q45so6222924qtq.1 for ; Sat, 04 Jun 2016 16:53:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=vanguardiasur-com-ar.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=1hC1/C0AGkzIeFBw66FN6pBxsR/6+s8RIafPMN8Q0sc=; b=j4oEEJQ7+UyIgLamHP0V/K4fRF3e7KX/tG5ojJbM8o9ZGmeFA1GI1HZtW0JRqQupeZ B9t9j1Mr5h5BzRg2qUxK4J60ufOvVn2tIpEf2/omL7smqBPyYsOeLjYNOnZB+JP1fgOw gZ26i57qeP2kk1FbnSzsSSDxGaJTyZKBUJNhyFWn7UTqVif4thgcrYGRQ0jWQcgU6pzP w3rr5SRH6asBlhplcFAwHzrhn7sc2q2xeUGcs0fyAXbPT4ShcneVO3Ip3DeOCd8530Qh RPg/WZ5yhy+g7TbWLnqN4X552OK/Myk0GX/ns7uTHYAjyNG9ttS+5VxgYKZgEnLtNeOf lGrQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=1hC1/C0AGkzIeFBw66FN6pBxsR/6+s8RIafPMN8Q0sc=; b=mFMWLQiQA4NmH7F7ePobLiCHbdI5z+QcEK5UzXr9xVP4+b4sYn0RvzPgCNUuXDLRro /+B5YJtvf8XffVKAHvMauWkfdhJsWLKeXMeZPw58BZIaA4igFTs3iGwj6au50HdKIRCh ShopQHuWht5+FqKeALGyw//0/KwmOpIBCdJYthlZ2f2Q1dUdPxfN+Y4nxvrJ8Id6tVJE oPYTBr3lIX7w5Avo+2IXnH42pAxxDkYPWzr/S2aFgQQvqvkj2K564zht4Qew+eZ7djs3 apFdIF+3eVS6eKcfXL4aL+lHKUYYng9MibxU7AECegZnv8W578rRSxtw258mk7xvGvwB 80eg== X-Gm-Message-State: ALyK8tLuWxNEknxwq8SVhUPF1dMAiN7wv/XWLrdNUqe2pqrOWuo3LopXyqYXNKhv3xONdg== X-Received: by 10.200.37.239 with SMTP id f44mr9840996qtf.57.1465084056689; Sat, 04 Jun 2016 16:47:36 -0700 (PDT) Received: from localhost.localdomain ([190.2.108.156]) by smtp.gmail.com with ESMTPSA id i34sm3022786qgd.2.2016.06.04.16.47.34 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Sat, 04 Jun 2016 16:47:35 -0700 (PDT) From: Ezequiel Garcia To: Cc: Hans Verkuil , Ezequiel Garcia Subject: [RESEND/PATCH 2/6] tw686x: Add support for DMA contiguous interlaced frame mode Date: Sat, 4 Jun 2016 20:47:16 -0300 Message-Id: <1465084040-6112-3-git-send-email-ezequiel@vanguardiasur.com.ar> X-Mailer: git-send-email 2.7.0 In-Reply-To: <1465084040-6112-1-git-send-email-ezequiel@vanguardiasur.com.ar> References: <1465084040-6112-1-git-send-email-ezequiel@vanguardiasur.com.ar> Sender: linux-media-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-media@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Now that the driver has the infrastructure to support more DMA modes, let's add the DMA contiguous interlaced frame mode. In this mode, the DMA P and B buffers are programmed with the user-provided buffers. When a P (or B) frame is ready, a new buffer is dequeued into P (or B). In addition to interlaced fields, the device can also be programmed to deliver alternate fields. Only interlaced mode is supported for now. Tested-by: Tim Harvey Signed-off-by: Ezequiel Garcia --- drivers/media/pci/tw686x/Kconfig | 1 + drivers/media/pci/tw686x/tw686x-core.c | 4 +++ drivers/media/pci/tw686x/tw686x-video.c | 50 +++++++++++++++++++++++++++++++++ drivers/media/pci/tw686x/tw686x.h | 1 + 4 files changed, 56 insertions(+) diff --git a/drivers/media/pci/tw686x/Kconfig b/drivers/media/pci/tw686x/Kconfig index fb8536974052..ef8ca85522f8 100644 --- a/drivers/media/pci/tw686x/Kconfig +++ b/drivers/media/pci/tw686x/Kconfig @@ -3,6 +3,7 @@ config VIDEO_TW686X depends on PCI && VIDEO_DEV && VIDEO_V4L2 && SND depends on HAS_DMA select VIDEOBUF2_VMALLOC + select VIDEOBUF2_DMA_CONTIG select SND_PCM help Support for Intersil/Techwell TW686x-based frame grabber cards. diff --git a/drivers/media/pci/tw686x/tw686x-core.c b/drivers/media/pci/tw686x/tw686x-core.c index 01c06bb59e78..9a7646c0f9f6 100644 --- a/drivers/media/pci/tw686x/tw686x-core.c +++ b/drivers/media/pci/tw686x/tw686x-core.c @@ -63,6 +63,8 @@ static const char *dma_mode_name(unsigned int mode) switch (mode) { case TW686X_DMA_MODE_MEMCPY: return "memcpy"; + case TW686X_DMA_MODE_CONTIG: + return "contig"; default: return "unknown"; } @@ -77,6 +79,8 @@ static int tw686x_dma_mode_set(const char *val, struct kernel_param *kp) { if (!strcasecmp(val, dma_mode_name(TW686X_DMA_MODE_MEMCPY))) dma_mode = TW686X_DMA_MODE_MEMCPY; + else if (!strcasecmp(val, dma_mode_name(TW686X_DMA_MODE_CONTIG))) + dma_mode = TW686X_DMA_MODE_CONTIG; else return -EINVAL; return 0; diff --git a/drivers/media/pci/tw686x/tw686x-video.c b/drivers/media/pci/tw686x/tw686x-video.c index c0d2a9bd5414..b5cb385e4cb1 100644 --- a/drivers/media/pci/tw686x/tw686x-video.c +++ b/drivers/media/pci/tw686x/tw686x-video.c @@ -19,6 +19,7 @@ #include #include #include +#include #include #include "tw686x.h" #include "tw686x-regs.h" @@ -148,6 +149,53 @@ const struct tw686x_dma_ops memcpy_dma_ops = { .field = V4L2_FIELD_INTERLACED, }; +static void tw686x_contig_buf_refill(struct tw686x_video_channel *vc, + unsigned int pb) +{ + struct tw686x_v4l2_buf *buf; + + while (!list_empty(&vc->vidq_queued)) { + u32 reg = pb ? VDMA_B_ADDR[vc->ch] : VDMA_P_ADDR[vc->ch]; + dma_addr_t phys; + + buf = list_first_entry(&vc->vidq_queued, + struct tw686x_v4l2_buf, list); + list_del(&buf->list); + + phys = vb2_dma_contig_plane_dma_addr(&buf->vb.vb2_buf, 0); + reg_write(vc->dev, reg, phys); + + buf->vb.vb2_buf.state = VB2_BUF_STATE_ACTIVE; + vc->curr_bufs[pb] = buf; + return; + } + vc->curr_bufs[pb] = NULL; +} + +static void tw686x_contig_cleanup(struct tw686x_dev *dev) +{ + vb2_dma_contig_cleanup_ctx(dev->alloc_ctx); +} + +static int tw686x_contig_setup(struct tw686x_dev *dev) +{ + dev->alloc_ctx = vb2_dma_contig_init_ctx(&dev->pci_dev->dev); + if (IS_ERR(dev->alloc_ctx)) { + dev_err(&dev->pci_dev->dev, "unable to init DMA context\n"); + return PTR_ERR(dev->alloc_ctx); + } + return 0; +} + +const struct tw686x_dma_ops contig_dma_ops = { + .setup = tw686x_contig_setup, + .cleanup = tw686x_contig_cleanup, + .buf_refill = tw686x_contig_buf_refill, + .mem_ops = &vb2_dma_contig_memops, + .hw_dma_mode = TW686X_FRAME_MODE, + .field = V4L2_FIELD_INTERLACED, +}; + static unsigned int tw686x_fields_map(v4l2_std_id std, unsigned int fps) { static const unsigned int map[15] = { @@ -841,6 +889,8 @@ int tw686x_video_init(struct tw686x_dev *dev) if (dev->dma_mode == TW686X_DMA_MODE_MEMCPY) dev->dma_ops = &memcpy_dma_ops; + else if (dev->dma_mode == TW686X_DMA_MODE_CONTIG) + dev->dma_ops = &contig_dma_ops; else return -EINVAL; diff --git a/drivers/media/pci/tw686x/tw686x.h b/drivers/media/pci/tw686x/tw686x.h index 977ff6e3c1e2..5f4c2131ddac 100644 --- a/drivers/media/pci/tw686x/tw686x.h +++ b/drivers/media/pci/tw686x/tw686x.h @@ -33,6 +33,7 @@ #define TW686X_AUDIO_PERIODS_MAX TW686X_AUDIO_PAGE_MAX #define TW686X_DMA_MODE_MEMCPY 0 +#define TW686X_DMA_MODE_CONTIG 1 struct tw686x_format { char *name;