Received: by 10.223.185.116 with SMTP id b49csp218549wrg; Mon, 19 Feb 2018 20:47:47 -0800 (PST) X-Google-Smtp-Source: AH8x227rI7d4urMVW1Z+/P4079Owny6zFATmoUrSPulKvenVHR0L1tRxWdYDe2+J5L35noQ4Krpy X-Received: by 2002:a17:902:71c5:: with SMTP id t5-v6mr16573989plm.142.1519102066932; Mon, 19 Feb 2018 20:47:46 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1519102066; cv=none; d=google.com; s=arc-20160816; b=KTmO++G7iGPNp1mJd/TfY4YLlyBeEHcesCyQaneXX1pLV0/tP3yPiPcPg4tjy4oRD8 bQQZfCS4JfM5+fRlZfpxIgQDRwsO5f7SLXYfDrF5N6VGITQ4yP55DuabG9UaTH2sR8Qg 5SKValsDDiV69gx9fOKTi7EJip6qFiIFqJMn5UnAMKUmGH5XfTwoh+j6VOP1HACcJ0tg qAHLuq0yZ6PFaSwOWQNrpYuh5T6lUwxr0wsh/wKHNh1sNF1+f4D8ap+i8zIy7gIu8h6f Zq/KGyX+BlIktbAvvZy0ofZK/s7xdjjx6FS9begZZD1wRQw3E/oq2Ci9pasVHTB0EGCK 1bVw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature:arc-authentication-results; bh=dwJKeafP7TdB9J3ORP2kBugh834QvRWdehkytymy0lo=; b=AYhBS06omZ5Lix+xXBcBnZF0zXA4RqNPshyQo5lzTJ/gyWZ9XToMq6TvJOA4bmsShv kW5jEYCua6vUSwdutO+TtjcKZFOnup9+M15OMQxNiZm242sMuHjsi3H2i78Apt+Z9Po7 qwzfEjdtgVGqdkAsivAsSvtlRUfJgYiB3VML4+hvBCj5Dkob8bSH245Y5tdol8wKRgR+ CHxfyRFZg0G0FCUJtwamIFScYUXAYmDH7BGSTjk0aOHC29VrEGRgDVVyVTuj8EBcleIM /bWvvbmqblaO7ynF5ipjyVdLXMHkrIvQGx09SYZAb8w43n/EC3ha7dBbWlgVHQ6r2xCY UAvw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@chromium.org header.s=google header.b=m7ZP/rcL; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=chromium.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id b4-v6si8713304plb.648.2018.02.19.20.47.32; Mon, 19 Feb 2018 20:47:46 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@chromium.org header.s=google header.b=m7ZP/rcL; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=chromium.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751765AbeBTEqI (ORCPT + 99 others); Mon, 19 Feb 2018 23:46:08 -0500 Received: from mail-pf0-f195.google.com ([209.85.192.195]:46472 "EHLO mail-pf0-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751610AbeBTEpi (ORCPT ); Mon, 19 Feb 2018 23:45:38 -0500 Received: by mail-pf0-f195.google.com with SMTP id z24so3012383pfh.13 for ; Mon, 19 Feb 2018 20:45:38 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=dwJKeafP7TdB9J3ORP2kBugh834QvRWdehkytymy0lo=; b=m7ZP/rcLZj+KvgeWYkZBtf1YCFr+KLxLH7pyUjytYEpH3BZdmP4DcDCNeOsyHg4St9 CN6R2pOVVGeeqC6fsvZM3iNKQyO+sCl+nC5XMOrTQPvXlU7WeexwdZcTIeDgK0I1P1hk 0vrQzoG5VJY/yjd8xd42QQCjnWCYbbrpPulOQ= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=dwJKeafP7TdB9J3ORP2kBugh834QvRWdehkytymy0lo=; b=nN3ZfFIKD9bk11IbgDQz52oNW5Te6VQKkq13xWixUql4TH16Q4jPQ/6pSsuMrZ9fOS tWWfQzNf7hZekH103pbRZR+BW7gxvYoXjnzoiCbtPoLKQUYFlK+4O/RKgeeUIrwJ7zPc OKCEBHTvJiYMl5eK3ILADt3MU28hCSdQNX3Nc1zYBNpgIcj1UYgH/ky65Z4fXWqqOskl HflX9w3TNuv0GNpH576AtDtvZ4uPOlUqSDdXjqCXRwUec1VHyw1LSok9C39Vy8el73TL xAjvqKWxmnqC8Rm7pPxzxBz0eU9f8KD5kvi3fDXZYxmxwkL/AVg5TCuNeNVYVRjT6uvX O3/Q== X-Gm-Message-State: APf1xPCBlf+sxaXKprdiaja1Hv41GEIPoKeH5mMC6X8diwgu8/Evzop9 dskdDOKAyV0P3oO/wqVev375Dg== X-Received: by 10.99.177.67 with SMTP id g3mr14435610pgp.410.1519101937927; Mon, 19 Feb 2018 20:45:37 -0800 (PST) Received: from acourbot.tok.corp.google.com ([2401:fa00:4:1002:a6cd:a898:e07b:a331]) by smtp.gmail.com with ESMTPSA id q9sm783397pgs.28.2018.02.19.20.45.35 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 19 Feb 2018 20:45:37 -0800 (PST) From: Alexandre Courbot To: Mauro Carvalho Chehab , Hans Verkuil , Laurent Pinchart , Pawel Osciak , Marek Szyprowski , Tomasz Figa , Sakari Ailus Cc: Gustavo Padovan , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Alexandre Courbot Subject: [RFCv4 20/21] media: vivid: add request support for the video capture device Date: Tue, 20 Feb 2018 13:44:24 +0900 Message-Id: <20180220044425.169493-21-acourbot@chromium.org> X-Mailer: git-send-email 2.16.1.291.g4437f3f132-goog In-Reply-To: <20180220044425.169493-1-acourbot@chromium.org> References: <20180220044425.169493-1-acourbot@chromium.org> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Allow to use requests with the video capture device. Signed-off-by: Alexandre Courbot --- drivers/media/platform/vivid/Kconfig | 1 + drivers/media/platform/vivid/vivid-core.c | 63 ++++++++++++++++++- drivers/media/platform/vivid/vivid-core.h | 3 + .../media/platform/vivid/vivid-kthread-cap.c | 17 +++++ 4 files changed, 83 insertions(+), 1 deletion(-) diff --git a/drivers/media/platform/vivid/Kconfig b/drivers/media/platform/vivid/Kconfig index 154de92dd809..a6494dabae95 100644 --- a/drivers/media/platform/vivid/Kconfig +++ b/drivers/media/platform/vivid/Kconfig @@ -7,6 +7,7 @@ config VIDEO_VIVID select FB_CFB_FILLRECT select FB_CFB_COPYAREA select FB_CFB_IMAGEBLIT + select MEDIA_REQUEST_API select VIDEOBUF2_VMALLOC select VIDEOBUF2_DMA_CONTIG select VIDEO_V4L2_TPG diff --git a/drivers/media/platform/vivid/vivid-core.c b/drivers/media/platform/vivid/vivid-core.c index 82ec216f2ad8..c1cf8e7ca2c9 100644 --- a/drivers/media/platform/vivid/vivid-core.c +++ b/drivers/media/platform/vivid/vivid-core.c @@ -23,6 +23,7 @@ #include #include #include +#include #include "vivid-core.h" #include "vivid-vid-common.h" @@ -486,6 +487,33 @@ static const struct v4l2_file_operations vivid_fops = { .mmap = vb2_fop_mmap, }; +static int vivid_cap_open(struct file *filp) +{ + struct vivid_dev *dev; + struct v4l2_fh *fh; + int ret; + + ret = v4l2_fh_open(filp); + if (ret) + return ret; + + dev = container_of(video_devdata(filp), struct vivid_dev, vid_cap_dev); + fh = filp->private_data; + fh->entity = &dev->vid_cap_req_entity.base; + + return ret; +} + +static const struct v4l2_file_operations vivid_cap_fops = { + .owner = THIS_MODULE, + .open = vivid_cap_open, + .release = vivid_fop_release, + .read = vb2_fop_read, + .write = vb2_fop_write, + .poll = vb2_fop_poll, + .unlocked_ioctl = video_ioctl2, + .mmap = vb2_fop_mmap, +}; static const struct v4l2_file_operations vivid_radio_fops = { .owner = THIS_MODULE, .open = v4l2_fh_open, @@ -607,6 +635,31 @@ static const struct v4l2_ioctl_ops vivid_ioctl_ops = { .vidioc_unsubscribe_event = v4l2_event_unsubscribe, }; +struct media_request_entity_data * +vid_cap_entity_data_alloc(struct media_request *req, + struct media_request_entity *entity) +{ + struct vivid_dev *dev; + + dev = container_of(entity, struct vivid_dev, vid_cap_req_entity.base); + return v4l2_request_entity_data_alloc(req, &dev->ctrl_hdl_vid_cap); +} + +static int vid_cap_request_submit(struct media_request *req, + struct media_request_entity_data *_data) +{ + struct v4l2_request_entity_data *data; + + data = to_v4l2_entity_data(_data); + return vb2_request_submit(data); +} + +static const struct media_request_entity_ops vivid_request_entity_ops = { + .data_alloc = vid_cap_entity_data_alloc, + .data_free = v4l2_request_entity_data_free, + .submit = vid_cap_request_submit, +}; + /* ----------------------------------------------------------------- Initialization and module stuff ------------------------------------------------------------------*/ @@ -1057,6 +1110,7 @@ static int vivid_create_instance(struct platform_device *pdev, int inst) q->mem_ops = vivid_mem_ops[allocator]; q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC; q->min_buffers_needed = 2; + q->allow_requests = true; q->lock = &dev->mutex; q->dev = dev->v4l2_dev.dev; @@ -1158,13 +1212,19 @@ static int vivid_create_instance(struct platform_device *pdev, int inst) vfd = &dev->vid_cap_dev; snprintf(vfd->name, sizeof(vfd->name), "vivid-%03d-vid-cap", inst); - vfd->fops = &vivid_fops; + vfd->fops = &vivid_cap_fops; vfd->ioctl_ops = &vivid_ioctl_ops; vfd->device_caps = dev->vid_cap_caps; vfd->release = video_device_release_empty; vfd->v4l2_dev = &dev->v4l2_dev; vfd->queue = &dev->vb_vid_cap_q; vfd->tvnorms = tvnorms_cap; + vfd->req_mgr = &dev->vid_cap_req_mgr.base; + v4l2_request_mgr_init(&dev->vid_cap_req_mgr, vfd, + &v4l2_request_ops); + v4l2_request_entity_init(&dev->vid_cap_req_entity, + &vivid_request_entity_ops, + vfd); /* * Provide a mutex to v4l2 core. It will be used to protect @@ -1448,6 +1508,7 @@ static int vivid_remove(struct platform_device *pdev) v4l2_info(&dev->v4l2_dev, "unregistering %s\n", video_device_node_name(&dev->vid_cap_dev)); video_unregister_device(&dev->vid_cap_dev); + v4l2_request_mgr_free(&dev->vid_cap_req_mgr); } if (dev->has_vid_out) { v4l2_info(&dev->v4l2_dev, "unregistering %s\n", diff --git a/drivers/media/platform/vivid/vivid-core.h b/drivers/media/platform/vivid/vivid-core.h index 477c80a4d44c..c8adcbb1c1d1 100644 --- a/drivers/media/platform/vivid/vivid-core.h +++ b/drivers/media/platform/vivid/vivid-core.h @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -145,6 +146,8 @@ struct vivid_dev { struct v4l2_ctrl_handler ctrl_hdl_fb; struct video_device vid_cap_dev; struct v4l2_ctrl_handler ctrl_hdl_vid_cap; + struct v4l2_request_mgr vid_cap_req_mgr; + struct v4l2_request_entity vid_cap_req_entity; struct video_device vid_out_dev; struct v4l2_ctrl_handler ctrl_hdl_vid_out; struct video_device vbi_cap_dev; diff --git a/drivers/media/platform/vivid/vivid-kthread-cap.c b/drivers/media/platform/vivid/vivid-kthread-cap.c index 3fdb280c36ca..0d0866dc11b3 100644 --- a/drivers/media/platform/vivid/vivid-kthread-cap.c +++ b/drivers/media/platform/vivid/vivid-kthread-cap.c @@ -19,6 +19,7 @@ #include #include #include +#include #include #include #include @@ -703,6 +704,17 @@ static void vivid_thread_vid_cap_tick(struct vivid_dev *dev, int dropped_bufs) goto update_mv; if (vid_cap_buf) { + struct media_request *req = vid_cap_buf->vb.vb2_buf.request; + + /* Using request? Apply its controls */ + if (req) { + struct v4l2_request_entity_data *data; + data = to_v4l2_entity_data( + media_request_get_entity_data(req, + &dev->vid_cap_req_entity.base)); + if (!WARN_ON(IS_ERR(data))) + v4l2_ctrl_request_setup(&data->ctrls); + } /* Fill buffer */ vivid_fillbuff(dev, vid_cap_buf); dprintk(dev, 1, "filled buffer %d\n", @@ -717,6 +729,11 @@ static void vivid_thread_vid_cap_tick(struct vivid_dev *dev, int dropped_bufs) VB2_BUF_STATE_ERROR : VB2_BUF_STATE_DONE); dprintk(dev, 2, "vid_cap buffer %d done\n", vid_cap_buf->vb.vb2_buf.index); + if (req) + media_request_entity_complete(req, + &dev->vid_cap_req_entity.base); + dprintk(dev, 2, "vid_cap buffer %d request completed\n", + vid_cap_buf->vb.vb2_buf.index); } if (vbi_cap_buf) { -- 2.16.1.291.g4437f3f132-goog