From patchwork Fri Aug 30 02:17:08 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pawel Osciak X-Patchwork-Id: 19974 X-Patchwork-Delegate: laurent.pinchart@ideasonboard.com Received: from mail.tu-berlin.de ([130.149.7.33]) by www.linuxtv.org with esmtp (Exim 4.72) (envelope-from ) id 1VFEHW-0006aq-BV; Fri, 30 Aug 2013 04:17:50 +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.72/mailfrontend-6) with esmtp id 1VFEHU-0007f4-4I; Fri, 30 Aug 2013 04:17:50 +0200 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754885Ab3H3CRo (ORCPT + 1 other); Thu, 29 Aug 2013 22:17:44 -0400 Received: from mail-pd0-f172.google.com ([209.85.192.172]:50501 "EHLO mail-pd0-f172.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754297Ab3H3CRn (ORCPT ); Thu, 29 Aug 2013 22:17:43 -0400 Received: by mail-pd0-f172.google.com with SMTP id z10so1228841pdj.17 for ; Thu, 29 Aug 2013 19:17:42 -0700 (PDT) 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=mSIcuAi4dT2jP78Yrr98FEtjDHnpnsvOADYpGtDhblU=; b=XigDv5/xJgC22U4t15ymyHwDqRsj0EpCgFHinKEZt7zngzf9nR2Bpn1ouZna5f2rxd 7/RpLHIN65WyXDJ3sibeiR9nvLa4+9nhuqlN+icKo9IX51lzUWVEkt2XJxGF9+22CKTm HDcyh88FfMaX7ZfieQHgqu85TMZRTlHg+6NNU= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=mSIcuAi4dT2jP78Yrr98FEtjDHnpnsvOADYpGtDhblU=; b=gjWBXEebBxd+LI2pTSyd/HJD27J2eYWMWvIEfjQY2kVoAKLUM3DEmFBGmYZMSoNGZE P45eZgDFEWXo1agCaiI7TjMYnuDPSAKwZ0Tgl8XY6VF9RDgiD+zCIGYmr7QNgPQEvb2o reeJt9pvvBFpUQ0MBiAuKy6JD1VW6xc/7z+OG4aRg6BuIiooF4t5abgUOE0n1GiV06XN w2coAfbBnVOJvUHEOw2SosmSkEpLr1T7QRZu3ctwyhAoOGY+8uuDho2ulZbRWwAqlyTF juX0zl48hZT4qxb5QW7FYNRrd+f/TzPA+kD7KsawjzG0IQoKXLvPr5CUrbXRDJ6YOTls e47g== X-Gm-Message-State: ALoCoQn1s94xAjey+loVSUQwQ+KfB5UitMz30QXeABDQydw9I89f5NqupCgxJT5OSJzK8mhnSjIx X-Received: by 10.66.191.5 with SMTP id gu5mr7559889pac.126.1377829062870; Thu, 29 Aug 2013 19:17:42 -0700 (PDT) Received: from kawagoe.tok.corp.google.com (kawagoe.tok.corp.google.com [172.30.88.114]) by mx.google.com with ESMTPSA id ye1sm27935254pab.19.1969.12.31.16.00.00 (version=TLSv1.1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Thu, 29 Aug 2013 19:17:42 -0700 (PDT) From: Pawel Osciak To: linux-media@vger.kernel.org Cc: laurent.pinchart@ideasonboard.com, Pawel Osciak Subject: [PATCH v1 09/19] uvcvideo: Reorganize uvc_{get,set}_le_value. Date: Fri, 30 Aug 2013 11:17:08 +0900 Message-Id: <1377829038-4726-10-git-send-email-posciak@chromium.org> X-Mailer: git-send-email 1.8.4 In-Reply-To: <1377829038-4726-1-git-send-email-posciak@chromium.org> References: <1377829038-4726-1-git-send-email-posciak@chromium.org> Sender: linux-media-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-media@vger.kernel.org X-PMX-Version: 6.0.0.2142326, Antispam-Engine: 2.7.2.2107409, Antispam-Data: 2013.8.30.20624 X-PMX-Spam: Gauge=IIIIIIII, Probability=8%, Report=' MULTIPLE_RCPTS 0.1, HTML_00_01 0.05, HTML_00_10 0.05, BODY_SIZE_3000_3999 0, BODY_SIZE_5000_LESS 0, BODY_SIZE_7000_LESS 0, DKIM_SIGNATURE 0, URI_ENDS_IN_HTML 0, __ANY_URI 0, __CP_URI_IN_BODY 0, __HAS_FROM 0, __HAS_MSGID 0, __HAS_X_MAILER 0, __HAS_X_MAILING_LIST 0, __IN_REP_TO 0, __MIME_TEXT_ONLY 0, __MULTIPLE_RCPTS_CC_X2 0, __SANE_MSGID 0, __TO_MALFORMED_2 0, __TO_NO_NAME 0, __URI_NO_WWW 0, __URI_NS , __YOUTUBE_RCVD 0' Signed-off-by: Pawel Osciak --- drivers/media/usb/uvc/uvc_ctrl.c | 62 ++++++++++++++++++++++++---------------- 1 file changed, 37 insertions(+), 25 deletions(-) diff --git a/drivers/media/usb/uvc/uvc_ctrl.c b/drivers/media/usb/uvc/uvc_ctrl.c index 72d6724..d735c88 100644 --- a/drivers/media/usb/uvc/uvc_ctrl.c +++ b/drivers/media/usb/uvc/uvc_ctrl.c @@ -707,18 +707,12 @@ static inline void uvc_clear_bit(__u8 *data, int bit) data[bit >> 3] &= ~(1 << (bit & 7)); } -/* Extract the bit string specified by mapping->offset and mapping->size - * from the little-endian data stored at 'data' and return the result as - * a signed 32bit integer. Sign extension will be performed if the mapping - * references a signed data type. - */ -static __s32 uvc_get_le_value(struct uvc_control_mapping *mapping, - __u8 query, const __u8 *data) +static int __uvc_get_le_value(int bits, int offset, const __u8 *data, + __u32 data_type) { - int bits = mapping->size; - int offset = mapping->offset; __s32 value = 0; __u8 mask; + int size = bits; data += offset / 8; offset &= 7; @@ -733,22 +727,49 @@ static __s32 uvc_get_le_value(struct uvc_control_mapping *mapping, } /* Sign-extend the value if needed. */ - if (mapping->data_type == UVC_CTRL_DATA_TYPE_SIGNED) - value |= -(value & (1 << (mapping->size - 1))); + if (data_type == UVC_CTRL_DATA_TYPE_SIGNED) + value |= -(value & (1 << (size - 1))); return value; } +/* Extract the bit string specified by mapping->offset and mapping->size + * from the little-endian data stored at 'data' and return the result as + * a signed 32bit integer. Sign extension will be performed if the mapping + * references a signed data type. + */ +static __s32 uvc_get_le_value(struct uvc_control_mapping *mapping, + __u8 query, const __u8 *data) +{ + return __uvc_get_le_value(mapping->size, mapping->offset, data, + mapping->data_type); +} + +static void __uvc_set_le_value(int bits, int offset, __s32 value, __u8 *data, + bool keep_existing) +{ + __u8 mask; + + data += offset / 8; + offset &= 7; + + for (; bits > 0; data++) { + mask = ((1LL << bits) - 1) << offset; + if (!keep_existing) + *data = (*data & ~mask); + *data |= ((value << offset) & mask); + value >>= (8 - offset); + bits -= 8 - offset; + offset = 0; + } +} + /* Set the bit string specified by mapping->offset and mapping->size * in the little-endian data stored at 'data' to the value 'value'. */ static void uvc_set_le_value(struct uvc_control_mapping *mapping, __s32 value, __u8 *data) { - int bits = mapping->size; - int offset = mapping->offset; - __u8 mask; - /* According to the v4l2 spec, writing any value to a button control * should result in the action belonging to the button control being * triggered. UVC devices however want to see a 1 written -> override @@ -757,16 +778,7 @@ static void uvc_set_le_value(struct uvc_control_mapping *mapping, if (mapping->v4l2_type == V4L2_CTRL_TYPE_BUTTON) value = -1; - data += offset / 8; - offset &= 7; - - for (; bits > 0; data++) { - mask = ((1LL << bits) - 1) << offset; - *data = (*data & ~mask) | ((value << offset) & mask); - value >>= offset ? offset : 8; - bits -= 8 - offset; - offset = 0; - } + __uvc_set_le_value(mapping->size, mapping->offset, value, data, false); } /* ------------------------------------------------------------------------