summaryrefslogtreecommitdiffstats
path: root/drivers/media/video/pvrusb2/pvrusb2-ctrl.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@woody.linux-foundation.org>2007-02-21 20:10:30 +0100
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-02-21 20:10:30 +0100
commite695e10bc996d6f83df7d85f1011c8d00573f68b (patch)
tree3d0ba107ea8fe7d0090e3cfd5e36cdb4abcaab99 /drivers/media/video/pvrusb2/pvrusb2-ctrl.c
parent[S390] add atomic64_xchg to s390 (diff)
parentV4L/DVB (5253): Qt1010: whitespace / 80 column cleanups (diff)
downloadlinux-e695e10bc996d6f83df7d85f1011c8d00573f68b.tar.xz
linux-e695e10bc996d6f83df7d85f1011c8d00573f68b.zip
Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/mchehab/v4l-dvb
* 'master' of master.kernel.org:/pub/scm/linux/kernel/git/mchehab/v4l-dvb: (196 commits) V4L/DVB (5253): Qt1010: whitespace / 80 column cleanups V4L/DVB (5252): Qt1010: use ARRAY_SIZE macro when appropriate V4L/DVB (5251): Qt1010: fix compiler warning V4L/DVB (5249): Fix compiler warning in vivi.c V4L/DVB (5247): Stv0297: Enable BER/UNC counting V4L/DVB (5246): Budget-ci: IR handling fixups V4L/DVB (5245): Dvb-ttpci: use i2c gate ctrl from stv0297 frontend driver V4L/DVB (5244): Dvbdev: fix illegal re-usage of fileoperations struct V4L/DVB (5178): Avoid race when deregistering the IR control for dvb-usb V4L/DVB (5240): Qt1010: use i2c_gate_ctrl where appropriate V4L/DVB (5239): Whitespace / 80-column cleanups V4L/DVB (5238): Kconfig: qt1010 should be selected by gl861 and au6610 V4L/DVB (5237): Dvb: add new qt1010 tuner module V4L/DVB (5236): Initial support for Sigmatek DVB-110 DVB-T V4L/DVB (5235): Gl861: use parallel_ts V4L/DVB (5234): Gl861: remove unneeded declaration V4L/DVB (5233): Gl861: correct address of the bulk endpoint V4L/DVB (5232): Gl861: correct oops when loading module V4L/DVB (5231): Gl861: whitespace cleanups V4L/DVB (5230): Gl861: remove NULL entry from gl861_properties ...
Diffstat (limited to 'drivers/media/video/pvrusb2/pvrusb2-ctrl.c')
-rw-r--r--drivers/media/video/pvrusb2/pvrusb2-ctrl.c45
1 files changed, 27 insertions, 18 deletions
diff --git a/drivers/media/video/pvrusb2/pvrusb2-ctrl.c b/drivers/media/video/pvrusb2/pvrusb2-ctrl.c
index c77de859cc8e..f569b00201dd 100644
--- a/drivers/media/video/pvrusb2/pvrusb2-ctrl.c
+++ b/drivers/media/video/pvrusb2/pvrusb2-ctrl.c
@@ -26,6 +26,27 @@
#include <linux/mutex.h>
+static int pvr2_ctrl_range_check(struct pvr2_ctrl *cptr,int val)
+{
+ if (cptr->info->check_value) {
+ if (!cptr->info->check_value(cptr,val)) return -ERANGE;
+ } else {
+ int lim;
+ lim = cptr->info->def.type_int.min_value;
+ if (cptr->info->get_min_value) {
+ cptr->info->get_min_value(cptr,&lim);
+ }
+ if (val < lim) return -ERANGE;
+ lim = cptr->info->def.type_int.max_value;
+ if (cptr->info->get_max_value) {
+ cptr->info->get_max_value(cptr,&lim);
+ }
+ if (val > lim) return -ERANGE;
+ }
+ return 0;
+}
+
+
/* Set the given control. */
int pvr2_ctrl_set_value(struct pvr2_ctrl *cptr,int val)
{
@@ -43,17 +64,8 @@ int pvr2_ctrl_set_mask_value(struct pvr2_ctrl *cptr,int mask,int val)
if (cptr->info->type == pvr2_ctl_bitmask) {
mask &= cptr->info->def.type_bitmask.valid_bits;
} else if (cptr->info->type == pvr2_ctl_int) {
- int lim;
- lim = cptr->info->def.type_int.min_value;
- if (cptr->info->get_min_value) {
- cptr->info->get_min_value(cptr,&lim);
- }
- if (val < lim) break;
- lim = cptr->info->def.type_int.max_value;
- if (cptr->info->get_max_value) {
- cptr->info->get_max_value(cptr,&lim);
- }
- if (val > lim) break;
+ ret = pvr2_ctrl_range_check(cptr,val);
+ if (ret < 0) break;
} else if (cptr->info->type == pvr2_ctl_enum) {
if (val >= cptr->info->def.type_enum.count) {
break;
@@ -498,16 +510,13 @@ int pvr2_ctrl_sym_to_value(struct pvr2_ctrl *cptr,
LOCK_TAKE(cptr->hdw->big_lock); do {
if (cptr->info->type == pvr2_ctl_int) {
ret = parse_token(ptr,len,valptr,NULL,0);
- if ((ret >= 0) &&
- ((*valptr < cptr->info->def.type_int.min_value) ||
- (*valptr > cptr->info->def.type_int.max_value))) {
- ret = -ERANGE;
+ if (ret >= 0) {
+ ret = pvr2_ctrl_range_check(cptr,*valptr);
}
if (maskptr) *maskptr = ~0;
} else if (cptr->info->type == pvr2_ctl_bool) {
- ret = parse_token(
- ptr,len,valptr,boolNames,
- sizeof(boolNames)/sizeof(boolNames[0]));
+ ret = parse_token(ptr,len,valptr,boolNames,
+ ARRAY_SIZE(boolNames));
if (ret == 1) {
*valptr = *valptr ? !0 : 0;
} else if (ret == 0) {