From patchwork Wed Jun 13 14:07:13 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Maxime Ripard X-Patchwork-Id: 10462321 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 5A7EE603B4 for ; Wed, 13 Jun 2018 14:09:15 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 452D8285BE for ; Wed, 13 Jun 2018 14:09:15 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 39766289DA; Wed, 13 Jun 2018 14:09:15 +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=-2.9 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,MAILING_LIST_MULTI autolearn=unavailable version=3.3.1 Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id B8D1E289D6 for ; Wed, 13 Jun 2018 14:09:13 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:MIME-Version:Cc:List-Subscribe: List-Help:List-Post:List-Archive:List-Unsubscribe:List-Id:References: In-Reply-To:Message-Id:Date:Subject:To:From:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Owner; bh=NaEAzhGPfqOZU1ByGxg/rTeHF43dEs1b/1lnpYVFTNo=; b=rLDW1d6N6j3bMO82W/EeOxI+IV rrwc8nbjHe+zrOATvxkh5usOJIyvdYzpqix354Tc/aUb8QgwoiO9csOM9HVqy51l3jczkIQAdG0In bUgnDYLOJvLjA3w5FXzyCag5/gxEkRLC1X0XGijq60gvcitkDuZeyULUcCsIzvawJIyER+/KzJJbk Var7u9Tn4X50WYuaLLPzpv6ea/J//LtJp//DXReXFXjfpcSGERpqiTjUM1fHNhoNnqPbY7QOjtyE0 e/QssM8xPFhDyCn8yUTCfFpXFLtYNGJlhuzDE8foB4iJeNhLhEEM3b4P3iVcllva1GAxfzzyq3uNZ OADw6Y0g==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.90_1 #2 (Red Hat Linux)) id 1fT6SV-0008Th-6F; Wed, 13 Jun 2018 14:09:11 +0000 Received: from mail.bootlin.com ([62.4.15.54]) by bombadil.infradead.org with esmtp (Exim 4.90_1 #2 (Red Hat Linux)) id 1fT6R6-0007dA-LT for linux-arm-kernel@lists.infradead.org; Wed, 13 Jun 2018 14:07:50 +0000 Received: by mail.bootlin.com (Postfix, from userid 110) id E338A20A46; Wed, 13 Jun 2018 16:07:30 +0200 (CEST) Received: from localhost (AAubervilliers-681-1-37-30.w90-88.abo.wanadoo.fr [90.88.156.30]) by mail.bootlin.com (Postfix) with ESMTPSA id DD31D20A58; Wed, 13 Jun 2018 16:07:19 +0200 (CEST) From: Maxime Ripard To: hans.verkuil@cisco.com, acourbot@chromium.org, sakari.ailus@linux.intel.com, Laurent Pinchart Subject: [PATCH 8/9] media: cedrus: Add start and stop decoder operations Date: Wed, 13 Jun 2018 16:07:13 +0200 Message-Id: <20180613140714.1686-9-maxime.ripard@bootlin.com> X-Mailer: git-send-email 2.17.0 In-Reply-To: <20180613140714.1686-1-maxime.ripard@bootlin.com> References: <20180613140714.1686-1-maxime.ripard@bootlin.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20180613_070745_021138_ED5C58B5 X-CRM114-Status: GOOD ( 13.58 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Maxime Ripard , jenskuske@gmail.com, linux-sunxi@googlegroups.com, linux-kernel@vger.kernel.org, tfiga@chromium.org, Paul Kocialkowski , Chen-Yu Tsai , posciak@chromium.org, Thomas Petazzoni , nicolas.dufresne@collabora.com, linux-arm-kernel@lists.infradead.org, linux-media@vger.kernel.org MIME-Version: 1.0 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Virus-Scanned: ClamAV using ClamSMTP Some codec needs to perform some additional task when a decoding is started and stopped, and not only at every frame. For example, the H264 decoding support needs to allocate buffers that will be used in the decoding process, but do not need to change over time, or at each frame. In order to allow that for codecs, introduce a start and stop hook that will be called if present at start_streaming and stop_streaming time. Signed-off-by: Maxime Ripard --- .../platform/sunxi/cedrus/sunxi_cedrus_common.h | 2 ++ .../platform/sunxi/cedrus/sunxi_cedrus_video.c | 14 +++++++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/drivers/media/platform/sunxi/cedrus/sunxi_cedrus_common.h b/drivers/media/platform/sunxi/cedrus/sunxi_cedrus_common.h index a2a507eb9fc9..20c78ec1f037 100644 --- a/drivers/media/platform/sunxi/cedrus/sunxi_cedrus_common.h +++ b/drivers/media/platform/sunxi/cedrus/sunxi_cedrus_common.h @@ -120,6 +120,8 @@ struct sunxi_cedrus_dec_ops { enum sunxi_cedrus_irq_status (*irq_status)(struct sunxi_cedrus_ctx *ctx); void (*setup)(struct sunxi_cedrus_ctx *ctx, struct sunxi_cedrus_run *run); + int (*start)(struct sunxi_cedrus_ctx *ctx); + void (*stop)(struct sunxi_cedrus_ctx *ctx); void (*trigger)(struct sunxi_cedrus_ctx *ctx); }; diff --git a/drivers/media/platform/sunxi/cedrus/sunxi_cedrus_video.c b/drivers/media/platform/sunxi/cedrus/sunxi_cedrus_video.c index fb7b081a5bb7..d93461178857 100644 --- a/drivers/media/platform/sunxi/cedrus/sunxi_cedrus_video.c +++ b/drivers/media/platform/sunxi/cedrus/sunxi_cedrus_video.c @@ -416,6 +416,8 @@ static int sunxi_cedrus_buf_prepare(struct vb2_buffer *vb) static int sunxi_cedrus_start_streaming(struct vb2_queue *q, unsigned int count) { struct sunxi_cedrus_ctx *ctx = vb2_get_drv_priv(q); + struct sunxi_cedrus_dev *dev = ctx->dev; + int ret = 0; switch (ctx->vpu_src_fmt->fourcc) { case V4L2_PIX_FMT_MPEG2_FRAME: @@ -425,16 +427,26 @@ static int sunxi_cedrus_start_streaming(struct vb2_queue *q, unsigned int count) return -EINVAL; } - return 0; + if (V4L2_TYPE_IS_OUTPUT(q->type) && + dev->dec_ops[ctx->current_codec]->start) + ret = dev->dec_ops[ctx->current_codec]->start(ctx); + + return ret; } static void sunxi_cedrus_stop_streaming(struct vb2_queue *q) { struct sunxi_cedrus_ctx *ctx = vb2_get_drv_priv(q); + struct sunxi_cedrus_dev *dev = ctx->dev; struct vb2_v4l2_buffer *vbuf; unsigned long flags; flush_scheduled_work(); + + if (V4L2_TYPE_IS_OUTPUT(q->type) && + dev->dec_ops[ctx->current_codec]->stop) + dev->dec_ops[ctx->current_codec]->stop(ctx); + for (;;) { spin_lock_irqsave(&ctx->dev->irq_lock, flags);