Received: by 10.223.185.116 with SMTP id b49csp219246wrg; Mon, 19 Feb 2018 20:48:56 -0800 (PST) X-Google-Smtp-Source: AH8x227c63xvbqqZW8jGV9HzWTv48nRTIkU3Zbr3B+l8B5d9lyA9AXf7+rYHe40QDzQD73/86765 X-Received: by 2002:a17:902:2b84:: with SMTP id l4-v6mr16426906plb.338.1519102136562; Mon, 19 Feb 2018 20:48:56 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1519102136; cv=none; d=google.com; s=arc-20160816; b=n5DLJ7yVtvgCA92Q7ukKuzY/q9eopzUSWUt0aVi2Nn8QYySHo8BsEoHwAaNjP7dYrc aaHlCsfYPVETlf9jRxtThSgwY6xt4y2O1/x8vlRxCuHO/yyOuQ5KlkG70c5a0O4bwP2l rgYjWY6HIX7159hcmSoxLmEvBNLP7v2FamQ0a9XRRLYuoR2//wWaSgSpxnh9r7QVF66z u10+mttG6xWkZJWxq4qqwZnwsZnrg6zthgYcVL5bk9PqjvCsPeAv33vdvWCZ0CGZzXKT UT6DhdDa7zS8VFQRisNe8P4G4M1ltJc6ePuIzXSjXCprA1lvBlZUsI4DNpHS3I9KrC8d J2wQ== 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=N0YhHlinbBwHTtn81rIwB0froRFSOkFtCfsCAsUmFCE=; b=pL7z7msGEg6ZJG8zdCSCO6CFrLBcBTEuxmj+gXIgQyIm/fyXoSic0faX1ysG4jsH3t /nB+1dgJFHgiDbW8w2nVsm2o8Mli/dgxzSKmfvC/yP9ERcOdcoe9qmRne40slB6bhfHE umxzltiye+fegataZLbaivSZF0l26dtQntRe+zkyDM4eYli42YdyzCSsggHhd5oq09a3 GGK7Wh9XfZDu3xQOmI8M40Tf62s0cIuMewFiC6xP3Ae1Ahs4VMIGUFxILTiRLzFTDeeK pTfuCag6kTRXuouoMScajg2JdSy+ER7o8+0AZXQ8omW9V23WonYeiTOKmPmZmi3/7Tv5 Z37A== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@chromium.org header.s=google header.b=K3ogXnY0; 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 d3si731903pgt.286.2018.02.19.20.48.42; Mon, 19 Feb 2018 20:48:56 -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=K3ogXnY0; 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 S1751527AbeBTEp2 (ORCPT + 99 others); Mon, 19 Feb 2018 23:45:28 -0500 Received: from mail-pf0-f196.google.com ([209.85.192.196]:37250 "EHLO mail-pf0-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751480AbeBTEpZ (ORCPT ); Mon, 19 Feb 2018 23:45:25 -0500 Received: by mail-pf0-f196.google.com with SMTP id s24so3016492pfm.4 for ; Mon, 19 Feb 2018 20:45:24 -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=N0YhHlinbBwHTtn81rIwB0froRFSOkFtCfsCAsUmFCE=; b=K3ogXnY0iIqaCiFDD7ILEDobsGcBWBi8zoc5XpX/5vacdZYhDVbtVB8bHDoebs+DlM 5Wf24M5xhMZnP2M/f7MjtdgkcbOG/+9lXJ5Xqszx5i+r1JF+jLlsSCMPbt0FBLYQ5O4h 8Pce6/vzEA18MzmuOJ483FP10a4YhmNwXLJYo= 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=N0YhHlinbBwHTtn81rIwB0froRFSOkFtCfsCAsUmFCE=; b=VULpNtAkqIa4Q5UjSt9zK4RYWUnX9M82B0z3xkALIQCOrRB1+779hKvHs0w9aQV61t HUsFGU+hHuLUBMRTHSHmQXZnHPhMtMecelgJ6o9rv8m1qgy3ye/xl/p6r7yIVW5k53l6 13wjosehkgO3Yq4FRannKP5+v1c5XzR4ucylSEpDpFkv9hzTfdFcaNTHvXMMZ6pMkQeY A9sO7iyERkIt0WpRT9JqscbzQ67In2ormozouXq2nxFcH+bcIlvH0qWJlO7VyWpkNgtK ENwdWrUc64GkuvaPHnGqVRU11XWoj20iBMbn+pojp1fyJE3CDTQ2BTjEj4wXteQ67zw3 jQPQ== X-Gm-Message-State: APf1xPCWH8XFy+B2SbkaRNzOqi+FNNoZ1bkyP3L/VvazVSX0c+wlbwa7 lJwOmwbHKMxtoWZOSMgMYBy7KA== X-Received: by 10.99.4.66 with SMTP id 63mr14002172pge.93.1519101924236; Mon, 19 Feb 2018 20:45:24 -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.21 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 19 Feb 2018 20:45:23 -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 15/21] v4l2-ctrls: support requests in EXT_CTRLS ioctls Date: Tue, 20 Feb 2018 13:44:19 +0900 Message-Id: <20180220044425.169493-16-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 Read and use the request_fd field of struct v4l2_ext_controls to apply VIDIOC_G_EXT_CTRLS or VIDIOC_S_EXT_CTRLS to a request when asked by userspace. Signed-off-by: Alexandre Courbot --- drivers/media/platform/omap3isp/ispvideo.c | 2 +- drivers/media/v4l2-core/v4l2-ctrls.c | 98 +++++++++++++++++++++- drivers/media/v4l2-core/v4l2-ioctl.c | 6 +- drivers/media/v4l2-core/v4l2-subdev.c | 2 +- include/media/v4l2-ctrls.h | 3 +- 5 files changed, 102 insertions(+), 9 deletions(-) diff --git a/drivers/media/platform/omap3isp/ispvideo.c b/drivers/media/platform/omap3isp/ispvideo.c index a751c89a3ea8..3976cd9ac2f2 100644 --- a/drivers/media/platform/omap3isp/ispvideo.c +++ b/drivers/media/platform/omap3isp/ispvideo.c @@ -1028,7 +1028,7 @@ static int isp_video_check_external_subdevs(struct isp_video *video, ctrls.count = 1; ctrls.controls = &ctrl; - ret = v4l2_g_ext_ctrls(pipe->external->ctrl_handler, &ctrls); + ret = v4l2_g_ext_ctrls(NULL, pipe->external->ctrl_handler, &ctrls); if (ret < 0) { dev_warn(isp->dev, "no pixel rate control in subdev %s\n", pipe->external->name); diff --git a/drivers/media/v4l2-core/v4l2-ctrls.c b/drivers/media/v4l2-core/v4l2-ctrls.c index 7a81aa5959c3..d7b1aeb32470 100644 --- a/drivers/media/v4l2-core/v4l2-ctrls.c +++ b/drivers/media/v4l2-core/v4l2-ctrls.c @@ -27,6 +27,7 @@ #include #include #include +#include #define has_op(master, op) \ (master->ops && master->ops->op) @@ -2959,9 +2960,44 @@ static int class_check(struct v4l2_ctrl_handler *hdl, u32 which) } +#if IS_ENABLED(CONFIG_MEDIA_REQUEST_API) +static struct media_request * +get_handler_for_request(struct v4l2_fh *fh, struct v4l2_ext_controls *cs, + struct v4l2_ctrl_handler **hdl) +{ + struct media_request *req; + struct v4l2_request_entity_data *data; + + if (!fh || !fh->entity) + return ERR_PTR(-EINVAL); + + req = media_request_get_from_fd(cs->request_fd); + if (!req) + return ERR_PTR(-EINVAL); + + data = to_v4l2_entity_data(media_request_get_entity_data(req, + fh->entity)); + if (IS_ERR(data)) { + media_request_put(req); + return (void *)data; + } + + *hdl = &data->ctrls; + + return req; +} +#else +static struct media_request * +get_handler_for_request(struct v4l2_fh *fh, struct v4l2_ext_controls *cs, + struct v4l2_ctrl_handler **hdl) +{ + return ERR_PTR(-ENOTSUPP); +} +#endif /* Get extended controls. Allocates the helpers array if needed. */ -int v4l2_g_ext_ctrls(struct v4l2_ctrl_handler *hdl, struct v4l2_ext_controls *cs) +int __v4l2_g_ext_ctrls(struct v4l2_ctrl_handler *hdl, + struct v4l2_ext_controls *cs) { struct v4l2_ctrl_helper helper[4]; struct v4l2_ctrl_helper *helpers = helper; @@ -3042,6 +3078,30 @@ int v4l2_g_ext_ctrls(struct v4l2_ctrl_handler *hdl, struct v4l2_ext_controls *cs kvfree(helpers); return ret; } + +int v4l2_g_ext_ctrls(struct v4l2_fh *fh, struct v4l2_ctrl_handler *hdl, + struct v4l2_ext_controls *cs) +{ + struct media_request *req = NULL; + int ret; + + if (cs->request_fd > 0) { + req = get_handler_for_request(fh, cs, &hdl); + if (IS_ERR(req)) + return PTR_ERR(req); + + media_request_lock(req); + } + + ret = __v4l2_g_ext_ctrls(hdl, cs); + + if (req) { + media_request_unlock(req); + media_request_put(req); + } + + return ret; +} EXPORT_SYMBOL(v4l2_g_ext_ctrls); /* Helper function to get a single control */ @@ -3217,9 +3277,9 @@ static void update_from_auto_cluster(struct v4l2_ctrl *master) } /* Try or try-and-set controls */ -static int try_set_ext_ctrls(struct v4l2_fh *fh, struct v4l2_ctrl_handler *hdl, - struct v4l2_ext_controls *cs, - bool set) +static int __try_set_ext_ctrls(struct v4l2_fh *fh, + struct v4l2_ctrl_handler *hdl, + struct v4l2_ext_controls *cs, bool set) { struct v4l2_ctrl_helper helper[4]; struct v4l2_ctrl_helper *helpers = helper; @@ -3332,6 +3392,36 @@ static int try_set_ext_ctrls(struct v4l2_fh *fh, struct v4l2_ctrl_handler *hdl, return ret; } +static int try_set_ext_ctrls(struct v4l2_fh *fh, struct v4l2_ctrl_handler *hdl, + struct v4l2_ext_controls *cs, bool set) +{ + struct media_request *req = NULL; + int ret; + + if (cs->request_fd > 0) { + req = get_handler_for_request(fh, cs, &hdl); + if (IS_ERR(req)) + return PTR_ERR(req); + + media_request_lock(req); + + if (media_request_get_state(req) != MEDIA_REQUEST_STATE_IDLE) { + ret = -EBUSY; + goto out; + } + } + + ret = __try_set_ext_ctrls(fh, hdl, cs, set); + +out: + if (req) { + media_request_unlock(req); + media_request_put(req); + } + + return ret; +} + int v4l2_try_ext_ctrls(struct v4l2_ctrl_handler *hdl, struct v4l2_ext_controls *cs) { return try_set_ext_ctrls(NULL, hdl, cs, false); diff --git a/drivers/media/v4l2-core/v4l2-ioctl.c b/drivers/media/v4l2-core/v4l2-ioctl.c index 2f40ac0cdf6e..ab4968ea443f 100644 --- a/drivers/media/v4l2-core/v4l2-ioctl.c +++ b/drivers/media/v4l2-core/v4l2-ioctl.c @@ -2077,10 +2077,11 @@ static int v4l_g_ext_ctrls(const struct v4l2_ioctl_ops *ops, test_bit(V4L2_FL_USES_V4L2_FH, &vfd->flags) ? fh : NULL; p->error_idx = p->count; + if (vfh && vfh->ctrl_handler) - return v4l2_g_ext_ctrls(vfh->ctrl_handler, p); + return v4l2_g_ext_ctrls(vfh, vfh->ctrl_handler, p); if (vfd->ctrl_handler) - return v4l2_g_ext_ctrls(vfd->ctrl_handler, p); + return v4l2_g_ext_ctrls(NULL, vfd->ctrl_handler, p); if (ops->vidioc_g_ext_ctrls == NULL) return -ENOTTY; return check_ext_ctrls(p, 0) ? ops->vidioc_g_ext_ctrls(file, fh, p) : @@ -2096,6 +2097,7 @@ static int v4l_s_ext_ctrls(const struct v4l2_ioctl_ops *ops, test_bit(V4L2_FL_USES_V4L2_FH, &vfd->flags) ? fh : NULL; p->error_idx = p->count; + if (vfh && vfh->ctrl_handler) return v4l2_s_ext_ctrls(vfh, vfh->ctrl_handler, p); if (vfd->ctrl_handler) diff --git a/drivers/media/v4l2-core/v4l2-subdev.c b/drivers/media/v4l2-core/v4l2-subdev.c index c5639817db34..c547788026c6 100644 --- a/drivers/media/v4l2-core/v4l2-subdev.c +++ b/drivers/media/v4l2-core/v4l2-subdev.c @@ -202,7 +202,7 @@ static long subdev_do_ioctl(struct file *file, unsigned int cmd, void *arg) return v4l2_s_ctrl(vfh, vfh->ctrl_handler, arg); case VIDIOC_G_EXT_CTRLS: - return v4l2_g_ext_ctrls(vfh->ctrl_handler, arg); + return v4l2_g_ext_ctrls(vfh, vfh->ctrl_handler, arg); case VIDIOC_S_EXT_CTRLS: return v4l2_s_ext_ctrls(vfh, vfh->ctrl_handler, arg); diff --git a/include/media/v4l2-ctrls.h b/include/media/v4l2-ctrls.h index 3a10fb3419e3..7c6a76479099 100644 --- a/include/media/v4l2-ctrls.h +++ b/include/media/v4l2-ctrls.h @@ -1126,12 +1126,13 @@ int v4l2_s_ctrl(struct v4l2_fh *fh, struct v4l2_ctrl_handler *hdl, * v4l2_g_ext_ctrls - Helper function to implement * :ref:`VIDIOC_G_EXT_CTRLS ` ioctl * + * @fh: pointer to &struct v4l2_fh * @hdl: pointer to &struct v4l2_ctrl_handler * @c: pointer to &struct v4l2_ext_controls * * If hdl == NULL then they will all return -EINVAL. */ -int v4l2_g_ext_ctrls(struct v4l2_ctrl_handler *hdl, +int v4l2_g_ext_ctrls(struct v4l2_fh *fh, struct v4l2_ctrl_handler *hdl, struct v4l2_ext_controls *c); /** -- 2.16.1.291.g4437f3f132-goog