diff options
author | Mike Isely <isely@pobox.com> | 2006-08-08 08:10:07 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@infradead.org> | 2006-09-26 10:53:20 -0400 |
commit | 89ebd63fdddc83fabb5cc751d0e59a1350c1627c (patch) | |
tree | c5d3956965dbb8b62cf9f06f480b06a7e58274fe /drivers/media/video/pvrusb2/pvrusb2-ctrl.c | |
parent | e95a191566685530ef49b702bbce0a33c57c3136 (diff) |
V4L/DVB (4376): Make it possible for run-time calculation of control min/max in pvrusb2
The internal control implementation in the pvrusb2 driver normally
encodes integer range limits using literal values in a const
structure. This change adds two function pointers, which if not null
will be called through in order to determine integer min / max
values.
Signed-off-by: Mike Isely <isely@pobox.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
Diffstat (limited to 'drivers/media/video/pvrusb2/pvrusb2-ctrl.c')
-rw-r--r-- | drivers/media/video/pvrusb2/pvrusb2-ctrl.c | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/drivers/media/video/pvrusb2/pvrusb2-ctrl.c b/drivers/media/video/pvrusb2/pvrusb2-ctrl.c index fb6198f1df98..c77de859cc8e 100644 --- a/drivers/media/video/pvrusb2/pvrusb2-ctrl.c +++ b/drivers/media/video/pvrusb2/pvrusb2-ctrl.c | |||
@@ -43,12 +43,17 @@ int pvr2_ctrl_set_mask_value(struct pvr2_ctrl *cptr,int mask,int val) | |||
43 | if (cptr->info->type == pvr2_ctl_bitmask) { | 43 | if (cptr->info->type == pvr2_ctl_bitmask) { |
44 | mask &= cptr->info->def.type_bitmask.valid_bits; | 44 | mask &= cptr->info->def.type_bitmask.valid_bits; |
45 | } else if (cptr->info->type == pvr2_ctl_int) { | 45 | } else if (cptr->info->type == pvr2_ctl_int) { |
46 | if (val < cptr->info->def.type_int.min_value) { | 46 | int lim; |
47 | break; | 47 | lim = cptr->info->def.type_int.min_value; |
48 | if (cptr->info->get_min_value) { | ||
49 | cptr->info->get_min_value(cptr,&lim); | ||
48 | } | 50 | } |
49 | if (val > cptr->info->def.type_int.max_value) { | 51 | if (val < lim) break; |
50 | break; | 52 | lim = cptr->info->def.type_int.max_value; |
53 | if (cptr->info->get_max_value) { | ||
54 | cptr->info->get_max_value(cptr,&lim); | ||
51 | } | 55 | } |
56 | if (val > lim) break; | ||
52 | } else if (cptr->info->type == pvr2_ctl_enum) { | 57 | } else if (cptr->info->type == pvr2_ctl_enum) { |
53 | if (val >= cptr->info->def.type_enum.count) { | 58 | if (val >= cptr->info->def.type_enum.count) { |
54 | break; | 59 | break; |
@@ -91,7 +96,9 @@ int pvr2_ctrl_get_max(struct pvr2_ctrl *cptr) | |||
91 | int ret = 0; | 96 | int ret = 0; |
92 | if (!cptr) return 0; | 97 | if (!cptr) return 0; |
93 | LOCK_TAKE(cptr->hdw->big_lock); do { | 98 | LOCK_TAKE(cptr->hdw->big_lock); do { |
94 | if (cptr->info->type == pvr2_ctl_int) { | 99 | if (cptr->info->get_max_value) { |
100 | cptr->info->get_max_value(cptr,&ret); | ||
101 | } else if (cptr->info->type == pvr2_ctl_int) { | ||
95 | ret = cptr->info->def.type_int.max_value; | 102 | ret = cptr->info->def.type_int.max_value; |
96 | } | 103 | } |
97 | } while(0); LOCK_GIVE(cptr->hdw->big_lock); | 104 | } while(0); LOCK_GIVE(cptr->hdw->big_lock); |
@@ -105,7 +112,9 @@ int pvr2_ctrl_get_min(struct pvr2_ctrl *cptr) | |||
105 | int ret = 0; | 112 | int ret = 0; |
106 | if (!cptr) return 0; | 113 | if (!cptr) return 0; |
107 | LOCK_TAKE(cptr->hdw->big_lock); do { | 114 | LOCK_TAKE(cptr->hdw->big_lock); do { |
108 | if (cptr->info->type == pvr2_ctl_int) { | 115 | if (cptr->info->get_min_value) { |
116 | cptr->info->get_min_value(cptr,&ret); | ||
117 | } else if (cptr->info->type == pvr2_ctl_int) { | ||
109 | ret = cptr->info->def.type_int.min_value; | 118 | ret = cptr->info->def.type_int.min_value; |
110 | } | 119 | } |
111 | } while(0); LOCK_GIVE(cptr->hdw->big_lock); | 120 | } while(0); LOCK_GIVE(cptr->hdw->big_lock); |