|
@@ -203,10 +203,14 @@ static int amradio_set_mute(struct amradio_device *radio, bool mute)
|
|
|
/* set a frequency, freq is defined by v4l's TUNER_LOW, i.e. 1/16th kHz */
|
|
|
static int amradio_set_freq(struct amradio_device *radio, int freq)
|
|
|
{
|
|
|
- unsigned short freq_send = 0x10 + (freq >> 3) / 25;
|
|
|
+ unsigned short freq_send;
|
|
|
u8 buf[3];
|
|
|
int retval;
|
|
|
|
|
|
+ /* we need to be sure that frequency isn't out of range */
|
|
|
+ freq = clamp_t(unsigned, freq, FREQ_MIN * FREQ_MUL, FREQ_MAX * FREQ_MUL);
|
|
|
+ freq_send = 0x10 + (freq >> 3) / 25;
|
|
|
+
|
|
|
/* frequency is calculated from freq_send and placed in first 2 bytes */
|
|
|
buf[0] = (freq_send >> 8) & 0xff;
|
|
|
buf[1] = freq_send & 0xff;
|
|
@@ -329,8 +333,7 @@ static int vidioc_s_frequency(struct file *file, void *priv,
|
|
|
|
|
|
if (f->tuner != 0)
|
|
|
return -EINVAL;
|
|
|
- return amradio_set_freq(radio, clamp_t(unsigned, f->frequency,
|
|
|
- FREQ_MIN * FREQ_MUL, FREQ_MAX * FREQ_MUL));
|
|
|
+ return amradio_set_freq(radio, f->frequency);
|
|
|
}
|
|
|
|
|
|
/* vidioc_g_frequency - get tuner radio frequency */
|
|
@@ -389,6 +392,7 @@ static int vidioc_s_hw_freq_seek(struct file *file, void *priv,
|
|
|
continue;
|
|
|
amradio_send_cmd(radio, AMRADIO_GET_FREQ, 0, NULL, 0, true);
|
|
|
if (radio->buffer[1] || radio->buffer[2]) {
|
|
|
+ /* To check: sometimes radio->curfreq is set to out of range value */
|
|
|
radio->curfreq = (radio->buffer[1] << 8) | radio->buffer[2];
|
|
|
radio->curfreq = (radio->curfreq - 0x10) * 200;
|
|
|
amradio_send_cmd(radio, AMRADIO_STOP_SEARCH,
|