Commit 86ef3f78 authored by Hans de Goede's avatar Hans de Goede Committed by Mauro Carvalho Chehab

[media] radio-si470x: Don't unnecesarily read registers on G_TUNER

Reading registers from the pcear USB dongles with the si470x causes a
loud pop (and an alsa buffer overrun). Since most radio apps periodically
call G_TUNER to update mono/stereo, signal and afc status this leads
to the music . pop . music . pop . music -> not good.

On the internet there is an howto for flashing the pcear with a newer
firmware from the silabs reference boardto fix this, but:
1) This howto relies on a special version of the driver which allows
   firmware flashing
2) We should try to avoid the answer to a bug report being upgrade your
   firmware, if at all possible
3) Windows does not suffer from the pop sounds

After a quick look at the driver I found at that the register reads are
not necessary at all, as the device gives us the necessary status through
usb interrupt packets, and the driver already uses these!
Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 8e2ce73e
...@@ -583,14 +583,16 @@ static int si470x_vidioc_g_tuner(struct file *file, void *priv, ...@@ -583,14 +583,16 @@ static int si470x_vidioc_g_tuner(struct file *file, void *priv,
struct v4l2_tuner *tuner) struct v4l2_tuner *tuner)
{ {
struct si470x_device *radio = video_drvdata(file); struct si470x_device *radio = video_drvdata(file);
int retval; int retval = 0;
if (tuner->index != 0) if (tuner->index != 0)
return -EINVAL; return -EINVAL;
retval = si470x_get_register(radio, STATUSRSSI); if (!radio->status_rssi_auto_update) {
if (retval < 0) retval = si470x_get_register(radio, STATUSRSSI);
return retval; if (retval < 0)
return retval;
}
/* driver constants */ /* driver constants */
strcpy(tuner->name, "FM"); strcpy(tuner->name, "FM");
......
...@@ -399,12 +399,16 @@ static void si470x_int_in_callback(struct urb *urb) ...@@ -399,12 +399,16 @@ static void si470x_int_in_callback(struct urb *urb)
} }
} }
if ((radio->registers[SYSCONFIG1] & SYSCONFIG1_RDS) == 0) /* Sometimes the device returns len 0 packets */
if (urb->actual_length != RDS_REPORT_SIZE)
goto resubmit; goto resubmit;
if (urb->actual_length > 0) { radio->registers[STATUSRSSI] =
get_unaligned_be16(&radio->int_in_buffer[1]);
if ((radio->registers[SYSCONFIG1] & SYSCONFIG1_RDS)) {
/* Update RDS registers with URB data */ /* Update RDS registers with URB data */
for (regnr = 0; regnr < RDS_REGISTER_NUM; regnr++) for (regnr = 1; regnr < RDS_REGISTER_NUM; regnr++)
radio->registers[STATUSRSSI + regnr] = radio->registers[STATUSRSSI + regnr] =
get_unaligned_be16(&radio->int_in_buffer[ get_unaligned_be16(&radio->int_in_buffer[
regnr * RADIO_REGISTER_SIZE + 1]); regnr * RADIO_REGISTER_SIZE + 1]);
...@@ -480,6 +484,7 @@ static void si470x_int_in_callback(struct urb *urb) ...@@ -480,6 +484,7 @@ static void si470x_int_in_callback(struct urb *urb)
radio->int_in_running = 0; radio->int_in_running = 0;
} }
} }
radio->status_rssi_auto_update = radio->int_in_running;
} }
...@@ -560,6 +565,7 @@ static int si470x_start_usb(struct si470x_device *radio) ...@@ -560,6 +565,7 @@ static int si470x_start_usb(struct si470x_device *radio)
"submitting int urb failed (%d)\n", retval); "submitting int urb failed (%d)\n", retval);
radio->int_in_running = 0; radio->int_in_running = 0;
} }
radio->status_rssi_auto_update = radio->int_in_running;
return retval; return retval;
} }
......
...@@ -161,6 +161,7 @@ struct si470x_device { ...@@ -161,6 +161,7 @@ struct si470x_device {
struct completion completion; struct completion completion;
bool stci_enabled; /* Seek/Tune Complete Interrupt */ bool stci_enabled; /* Seek/Tune Complete Interrupt */
bool status_rssi_auto_update; /* Does RSSI get updated automatic? */
#if defined(CONFIG_USB_SI470X) || defined(CONFIG_USB_SI470X_MODULE) #if defined(CONFIG_USB_SI470X) || defined(CONFIG_USB_SI470X_MODULE)
/* reference to USB and video device */ /* reference to USB and video device */
......
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