Commit 644afdb9 authored by Mike Isely's avatar Mike Isely Committed by Mauro Carvalho Chehab

V4L/DVB (5084): Pvrusb2: Stop hardcoding frequency ranges

Rather than hardcoding frequency ranges everywhere, rely on
VIDIOC_G_TUNER results wherever we can.
Signed-off-by: default avatarMike Isely <isely@pobox.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@infradead.org>
parent 7c74e57e
...@@ -39,8 +39,6 @@ ...@@ -39,8 +39,6 @@
#define TV_MIN_FREQ 55250000L #define TV_MIN_FREQ 55250000L
#define TV_MAX_FREQ 850000000L #define TV_MAX_FREQ 850000000L
#define RADIO_MIN_FREQ 87000000L
#define RADIO_MAX_FREQ 108000000L
struct usb_device_id pvr2_device_table[] = { struct usb_device_id pvr2_device_table[] = {
[PVR2_HDW_TYPE_29XXX] = { USB_DEVICE(0x2040, 0x2900) }, [PVR2_HDW_TYPE_29XXX] = { USB_DEVICE(0x2040, 0x2900) },
...@@ -432,34 +430,48 @@ static void ctrl_cleardirty_input(struct pvr2_ctrl *cptr) ...@@ -432,34 +430,48 @@ static void ctrl_cleardirty_input(struct pvr2_ctrl *cptr)
cptr->hdw->input_dirty = 0; cptr->hdw->input_dirty = 0;
} }
static int ctrl_freq_check(struct pvr2_ctrl *cptr,int v)
{
/* Both ranges are simultaneously considered legal, in order to
permit implicit mode switching, i.e. set a frequency in the
other range and the mode will switch */
return (((v >= RADIO_MIN_FREQ) && (v <= RADIO_MAX_FREQ)) ||
((v >= TV_MIN_FREQ) && (v <= TV_MAX_FREQ)));
}
static int ctrl_freq_max_get(struct pvr2_ctrl *cptr, int *vp) static int ctrl_freq_max_get(struct pvr2_ctrl *cptr, int *vp)
{ {
/* Actual maximum depends on radio/tv mode */ unsigned long fv;
if (cptr->hdw->input_val == PVR2_CVAL_INPUT_RADIO) { struct pvr2_hdw *hdw = cptr->hdw;
*vp = RADIO_MAX_FREQ; if (hdw->tuner_signal_stale) {
} else { pvr2_i2c_core_status_poll(hdw);
}
fv = hdw->tuner_signal_info.rangehigh;
if (!fv) {
/* Safety fallback */
*vp = TV_MAX_FREQ; *vp = TV_MAX_FREQ;
return 0;
} }
if (hdw->tuner_signal_info.capability & V4L2_TUNER_CAP_LOW) {
fv = (fv * 125) / 2;
} else {
fv = fv * 62500;
}
*vp = fv;
return 0; return 0;
} }
static int ctrl_freq_min_get(struct pvr2_ctrl *cptr, int *vp) static int ctrl_freq_min_get(struct pvr2_ctrl *cptr, int *vp)
{ {
/* Actual minimum depends on radio/tv mode */ unsigned long fv;
if (cptr->hdw->input_val == PVR2_CVAL_INPUT_RADIO) { struct pvr2_hdw *hdw = cptr->hdw;
*vp = RADIO_MIN_FREQ; if (hdw->tuner_signal_stale) {
} else { pvr2_i2c_core_status_poll(hdw);
}
fv = hdw->tuner_signal_info.rangelow;
if (!fv) {
/* Safety fallback */
*vp = TV_MIN_FREQ; *vp = TV_MIN_FREQ;
return 0;
} }
if (hdw->tuner_signal_info.capability & V4L2_TUNER_CAP_LOW) {
fv = (fv * 125) / 2;
} else {
fv = fv * 62500;
}
*vp = fv;
return 0; return 0;
} }
...@@ -630,9 +642,7 @@ static int ctrl_audio_modes_present_get(struct pvr2_ctrl *cptr,int *vp) ...@@ -630,9 +642,7 @@ static int ctrl_audio_modes_present_get(struct pvr2_ctrl *cptr,int *vp)
int val = 0; int val = 0;
unsigned int subchan; unsigned int subchan;
struct pvr2_hdw *hdw = cptr->hdw; struct pvr2_hdw *hdw = cptr->hdw;
if (hdw->tuner_signal_stale) { pvr2_i2c_core_status_poll(hdw);
pvr2_i2c_core_status_poll(hdw);
}
subchan = hdw->tuner_signal_info.rxsubchans; subchan = hdw->tuner_signal_info.rxsubchans;
if (subchan & V4L2_TUNER_SUB_MONO) { if (subchan & V4L2_TUNER_SUB_MONO) {
val |= (1 << V4L2_TUNER_MODE_MONO); val |= (1 << V4L2_TUNER_MODE_MONO);
...@@ -870,10 +880,9 @@ static const struct pvr2_ctl_info control_defs[] = { ...@@ -870,10 +880,9 @@ static const struct pvr2_ctl_info control_defs[] = {
.get_value = ctrl_freq_get, .get_value = ctrl_freq_get,
.is_dirty = ctrl_freq_is_dirty, .is_dirty = ctrl_freq_is_dirty,
.clear_dirty = ctrl_freq_clear_dirty, .clear_dirty = ctrl_freq_clear_dirty,
DEFINT(TV_MIN_FREQ,TV_MAX_FREQ), DEFINT(0,0),
/* Hook in check for input value (tv/radio) and adjust /* Hook in check for input value (tv/radio) and adjust
max/min values accordingly */ max/min values accordingly */
.check_value = ctrl_freq_check,
.get_max_value = ctrl_freq_max_get, .get_max_value = ctrl_freq_max_get,
.get_min_value = ctrl_freq_min_get, .get_min_value = ctrl_freq_min_get,
},{ },{
...@@ -887,10 +896,9 @@ static const struct pvr2_ctl_info control_defs[] = { ...@@ -887,10 +896,9 @@ static const struct pvr2_ctl_info control_defs[] = {
.name = "freq_table_value", .name = "freq_table_value",
.set_value = ctrl_channelfreq_set, .set_value = ctrl_channelfreq_set,
.get_value = ctrl_channelfreq_get, .get_value = ctrl_channelfreq_get,
DEFINT(TV_MIN_FREQ,TV_MAX_FREQ), DEFINT(0,0),
/* Hook in check for input value (tv/radio) and adjust /* Hook in check for input value (tv/radio) and adjust
max/min values accordingly */ max/min values accordingly */
.check_value = ctrl_freq_check,
.get_max_value = ctrl_freq_max_get, .get_max_value = ctrl_freq_max_get,
.get_min_value = ctrl_freq_min_get, .get_min_value = ctrl_freq_min_get,
},{ },{
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment