From patchwork Fri Apr 20 15:19:10 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Antonio Ospite X-Patchwork-Id: 10785 Received: from mail.tu-berlin.de ([130.149.7.33]) by www.linuxtv.org with esmtp (Exim 4.72) (envelope-from ) id 1SLFcf-00086M-Me for patchwork@linuxtv.org; Fri, 20 Apr 2012 17:19:45 +0200 X-tubIT-Incoming-IP: 209.132.180.67 Received: from vger.kernel.org ([209.132.180.67]) by mail.tu-berlin.de (exim-4.75/mailfrontend-4) with esmtp for id 1SLFce-0006hL-Co; Fri, 20 Apr 2012 17:19:45 +0200 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932558Ab2DTPTk (ORCPT ); Fri, 20 Apr 2012 11:19:40 -0400 Received: from smtp209.alice.it ([82.57.200.105]:40423 "EHLO smtp209.alice.it" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932470Ab2DTPTj (ORCPT ); Fri, 20 Apr 2012 11:19:39 -0400 Received: from jcn (82.61.46.157) by smtp209.alice.it (8.6.023.02) id 4EF08A630D796924; Fri, 20 Apr 2012 17:19:37 +0200 Received: from ao2 by jcn with local (Exim 4.77) (envelope-from ) id 1SLFcV-0004DP-Hi; Fri, 20 Apr 2012 17:19:35 +0200 From: Antonio Ospite To: linux-media@vger.kernel.org Cc: Antonio Ospite , Jean-Francois Moine , =?UTF-8?q?Erik=20Andr=C3=A9n?= Subject: [RFC PATCH 2/3] [media] gspca - main: factor out the logic to set and get controls Date: Fri, 20 Apr 2012 17:19:10 +0200 Message-Id: <1334935152-16165-3-git-send-email-ospite@studenti.unina.it> X-Mailer: git-send-email 1.7.10 In-Reply-To: <1334935152-16165-1-git-send-email-ospite@studenti.unina.it> References: <20120418153720.1359c7d2f2a3efc2c7c17b88@studenti.unina.it> <1334935152-16165-1-git-send-email-ospite@studenti.unina.it> X-Face: z*RaLf`X<@C75u6Ig9}{oW$H; 1_\2t5)({*|jhM/Vb; ]yA5\I~93>J<_`<4)A{':UrE Sender: linux-media-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-media@vger.kernel.org X-PMX-Version: 5.6.1.2065439, Antispam-Engine: 2.7.2.376379, Antispam-Data: 2012.4.20.150616 X-PMX-Spam: Gauge=IIIIIIII, Probability=8%, Report=' MULTIPLE_RCPTS 0.1, HTML_00_01 0.05, HTML_00_10 0.05, BODY_SIZE_5000_5999 0, BODY_SIZE_7000_LESS 0, URI_ENDS_IN_HTML 0, __ANY_URI 0, __CP_MEDIA_BODY 0, __CP_URI_IN_BODY 0, __HAS_MSGID 0, __HAS_X_MAILER 0, __HAS_X_MAILING_LIST 0, __MIME_TEXT_ONLY 0, __MULTIPLE_RCPTS_CC_X2 0, __SANE_MSGID 0, __STOCK_PHRASE_7 0, __SUBJ_ALPHA_END 0, __TO_MALFORMED_2 0, __TO_NO_NAME 0, __URI_NO_WWW 0, __URI_NS ' Factor out the logic to set and get controls from vidioc_s_ctrl() and vidioc_g_ctrl() so that the code can be reused in the coming implementation of vidioc_s_ext_ctrls() and vidioc_g_ext_ctrls(). Signed-off-by: Antonio Ospite --- drivers/media/video/gspca/gspca.c | 148 ++++++++++++++++++++----------------- 1 file changed, 80 insertions(+), 68 deletions(-) diff --git a/drivers/media/video/gspca/gspca.c b/drivers/media/video/gspca/gspca.c index bc9d037..ba1bda9 100644 --- a/drivers/media/video/gspca/gspca.c +++ b/drivers/media/video/gspca/gspca.c @@ -1432,6 +1432,84 @@ static int get_ctrl_index(struct gspca_dev *gspca_dev, return -1; } +static int gspca_set_ctrl(struct gspca_dev *gspca_dev, + __u32 id, __s32 value) +{ + const struct ctrl *ctrls; + struct gspca_ctrl *gspca_ctrl; + int idx, ret; + + idx = get_ctrl_index(gspca_dev, id); + if (idx < 0) + return -EINVAL; + if (gspca_dev->ctrl_inac & (1 << idx)) + return -EINVAL; + ctrls = &gspca_dev->sd_desc->ctrls[idx]; + if (gspca_dev->cam.ctrls != NULL) { + gspca_ctrl = &gspca_dev->cam.ctrls[idx]; + if (value < gspca_ctrl->min + || value > gspca_ctrl->max) + return -ERANGE; + } else { + gspca_ctrl = NULL; + if (value < ctrls->qctrl.minimum + || value > ctrls->qctrl.maximum) + return -ERANGE; + } + PDEBUG(D_CONF, "set ctrl [%08x] = %d", id, value); + if (mutex_lock_interruptible(&gspca_dev->usb_lock)) + return -ERESTARTSYS; + if (!gspca_dev->present) { + ret = -ENODEV; + goto out; + } + gspca_dev->usb_err = 0; + if (ctrls->set != NULL) { + ret = ctrls->set(gspca_dev, value); + goto out; + } + if (gspca_ctrl != NULL) { + gspca_ctrl->val = value; + if (ctrls->set_control != NULL + && gspca_dev->streaming) + ctrls->set_control(gspca_dev); + } + ret = gspca_dev->usb_err; +out: + mutex_unlock(&gspca_dev->usb_lock); + return ret; +} + +static int gspca_get_ctrl(struct gspca_dev *gspca_dev, + __u32 id, __s32 *value) +{ + const struct ctrl *ctrls; + int idx, ret; + + idx = get_ctrl_index(gspca_dev, id); + if (idx < 0) + return -EINVAL; + ctrls = &gspca_dev->sd_desc->ctrls[idx]; + + if (mutex_lock_interruptible(&gspca_dev->usb_lock)) + return -ERESTARTSYS; + if (!gspca_dev->present) { + ret = -ENODEV; + goto out; + } + gspca_dev->usb_err = 0; + if (ctrls->get != NULL) { + ret = ctrls->get(gspca_dev, value); + goto out; + } + if (gspca_dev->cam.ctrls != NULL) + *value = gspca_dev->cam.ctrls[idx].val; + ret = 0; +out: + mutex_unlock(&gspca_dev->usb_lock); + return ret; +} + static int vidioc_queryctrl(struct file *file, void *priv, struct v4l2_queryctrl *q_ctrl) { @@ -1479,80 +1557,14 @@ static int vidioc_s_ctrl(struct file *file, void *priv, struct v4l2_control *ctrl) { struct gspca_dev *gspca_dev = priv; - const struct ctrl *ctrls; - struct gspca_ctrl *gspca_ctrl; - int idx, ret; - - idx = get_ctrl_index(gspca_dev, ctrl->id); - if (idx < 0) - return -EINVAL; - if (gspca_dev->ctrl_inac & (1 << idx)) - return -EINVAL; - ctrls = &gspca_dev->sd_desc->ctrls[idx]; - if (gspca_dev->cam.ctrls != NULL) { - gspca_ctrl = &gspca_dev->cam.ctrls[idx]; - if (ctrl->value < gspca_ctrl->min - || ctrl->value > gspca_ctrl->max) - return -ERANGE; - } else { - gspca_ctrl = NULL; - if (ctrl->value < ctrls->qctrl.minimum - || ctrl->value > ctrls->qctrl.maximum) - return -ERANGE; - } - PDEBUG(D_CONF, "set ctrl [%08x] = %d", ctrl->id, ctrl->value); - if (mutex_lock_interruptible(&gspca_dev->usb_lock)) - return -ERESTARTSYS; - if (!gspca_dev->present) { - ret = -ENODEV; - goto out; - } - gspca_dev->usb_err = 0; - if (ctrls->set != NULL) { - ret = ctrls->set(gspca_dev, ctrl->value); - goto out; - } - if (gspca_ctrl != NULL) { - gspca_ctrl->val = ctrl->value; - if (ctrls->set_control != NULL - && gspca_dev->streaming) - ctrls->set_control(gspca_dev); - } - ret = gspca_dev->usb_err; -out: - mutex_unlock(&gspca_dev->usb_lock); - return ret; + return gspca_set_ctrl(gspca_dev, ctrl->id, ctrl->value); } static int vidioc_g_ctrl(struct file *file, void *priv, struct v4l2_control *ctrl) { struct gspca_dev *gspca_dev = priv; - const struct ctrl *ctrls; - int idx, ret; - - idx = get_ctrl_index(gspca_dev, ctrl->id); - if (idx < 0) - return -EINVAL; - ctrls = &gspca_dev->sd_desc->ctrls[idx]; - - if (mutex_lock_interruptible(&gspca_dev->usb_lock)) - return -ERESTARTSYS; - if (!gspca_dev->present) { - ret = -ENODEV; - goto out; - } - gspca_dev->usb_err = 0; - if (ctrls->get != NULL) { - ret = ctrls->get(gspca_dev, &ctrl->value); - goto out; - } - if (gspca_dev->cam.ctrls != NULL) - ctrl->value = gspca_dev->cam.ctrls[idx].val; - ret = 0; -out: - mutex_unlock(&gspca_dev->usb_lock); - return ret; + return gspca_get_ctrl(gspca_dev, ctrl->id, &ctrl->value); } static int vidioc_querymenu(struct file *file, void *priv,