From patchwork Thu Dec 17 08:40:12 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 7870901 X-Patchwork-Delegate: geert@linux-m68k.org Return-Path: X-Original-To: patchwork-linux-sh@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 859E59F32E for ; Thu, 17 Dec 2015 08:42:28 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 212EC202EC for ; Thu, 17 Dec 2015 08:42:23 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 4D094203F3 for ; Thu, 17 Dec 2015 08:42:22 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752887AbbLQImA (ORCPT ); Thu, 17 Dec 2015 03:42:00 -0500 Received: from galahad.ideasonboard.com ([185.26.127.97]:44651 "EHLO galahad.ideasonboard.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S934228AbbLQIlO (ORCPT ); Thu, 17 Dec 2015 03:41:14 -0500 Received: from avalon.ideasonboard.com (unknown [207.140.26.138]) by galahad.ideasonboard.com (Postfix) with ESMTPSA id 6AB4220395; Thu, 17 Dec 2015 09:41:11 +0100 (CET) From: Laurent Pinchart To: linux-media@vger.kernel.org Cc: linux-sh@vger.kernel.org Subject: [PATCH/RFC 34/48] vb2: Add helper function to queue request-specific buffer. Date: Thu, 17 Dec 2015 10:40:12 +0200 Message-Id: <1450341626-6695-35-git-send-email-laurent.pinchart+renesas@ideasonboard.com> X-Mailer: git-send-email 2.4.10 In-Reply-To: <1450341626-6695-1-git-send-email-laurent.pinchart+renesas@ideasonboard.com> References: <1450341626-6695-1-git-send-email-laurent.pinchart+renesas@ideasonboard.com> Sender: linux-sh-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-sh@vger.kernel.org X-Spam-Status: No, score=-6.9 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, T_RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Hans Verkuil The vb2_qbuf_request() function will queue any buffers for the given request that are in state PREPARED. Useful when drivers have to implement the req_queue callback. Signed-off-by: Hans Verkuil --- drivers/media/v4l2-core/videobuf2-v4l2.c | 31 +++++++++++++++++++++++++++++++ include/media/videobuf2-v4l2.h | 1 + 2 files changed, 32 insertions(+) diff --git a/drivers/media/v4l2-core/videobuf2-v4l2.c b/drivers/media/v4l2-core/videobuf2-v4l2.c index 0db7d67092ab..1f649b15990f 100644 --- a/drivers/media/v4l2-core/videobuf2-v4l2.c +++ b/drivers/media/v4l2-core/videobuf2-v4l2.c @@ -113,6 +113,9 @@ static int __set_timestamp(struct vb2_buffer *vb, const void *pb) struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb); struct vb2_queue *q = vb->vb2_queue; + if (!pb) + return 0; + if (q->is_output) { /* * For output buffers copy the timestamp if needed, @@ -188,6 +191,9 @@ static int __fill_v4l2_buffer(struct vb2_buffer *vb, void *pb) struct vb2_queue *q = vb->vb2_queue; unsigned int plane; + if (!pb) + return 0; + /* Copy back data such as timestamp, flags, etc. */ b->index = vb->index; b->type = vb->type; @@ -578,6 +584,31 @@ int vb2_qbuf(struct vb2_queue *q, struct v4l2_buffer *b) } EXPORT_SYMBOL_GPL(vb2_qbuf); +int vb2_qbuf_request(struct vb2_queue *q, u16 request, struct vb2_buffer **p_buf) +{ + unsigned int buffer; + + for (buffer = 0; buffer < q->num_buffers; buffer++) { + struct vb2_buffer *vb = q->bufs[buffer]; + struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb); + + if (vbuf->request == request && + vb->state == VB2_BUF_STATE_PREPARED) { + if (p_buf) + *p_buf = vb; + /* + * The buffer has already been prepared so we can skip + * the vb2_queue_or_prepare_buf() call in vb2_qbuf() and + * call the core function directly. + */ + return vb2_core_qbuf(q, vb->index, NULL); + } + } + + return -ENOENT; +} +EXPORT_SYMBOL_GPL(vb2_qbuf_request); + static int vb2_internal_dqbuf(struct vb2_queue *q, struct v4l2_buffer *b, bool nonblocking) { diff --git a/include/media/videobuf2-v4l2.h b/include/media/videobuf2-v4l2.h index 7cb428fc66ad..bc742a174f2b 100644 --- a/include/media/videobuf2-v4l2.h +++ b/include/media/videobuf2-v4l2.h @@ -59,6 +59,7 @@ int vb2_create_bufs(struct vb2_queue *q, struct v4l2_create_buffers *create); int vb2_prepare_buf(struct vb2_queue *q, struct v4l2_buffer *b); int vb2_qbuf(struct vb2_queue *q, struct v4l2_buffer *b); +int vb2_qbuf_request(struct vb2_queue *q, u16 request, struct vb2_buffer **p_buf); int vb2_expbuf(struct vb2_queue *q, struct v4l2_exportbuffer *eb); int vb2_dqbuf(struct vb2_queue *q, struct v4l2_buffer *b, bool nonblocking);