summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHemant Gupta <hemant.gupta@stericsson.com>2011-10-04 18:00:44 +0530
committerPhilippe Langlais <philippe.langlais@stericsson.com>2012-05-22 11:06:02 +0200
commit253a6fbf6c5a5a4b49600972b4f50e73e8c83b88 (patch)
tree955e42726a512b80018fe59fcd874cfd509fd831
parent1b0ab9fe1fdc2e67886e86e9720c12a2088f8455 (diff)
CG2900 FM Radio: RDS data cannot be retrieved.
This patch fixes the issue of non retrieval of RDS data from driver resulting in failure of further communication with driver. ST-Ericsson Linux next: NA ST-Ericsson ID: 363004 ST-Ericsson FOSS-OUT ID: Trivial Change-Id: I38e403cdb9845e1b644c28fbbc0ce6ca802a265e Signed-off-by: Hemant Gupta <hemant.gupta@stericsson.com> Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/32954 Reviewed-by: Andreas KARLSSON <andreas.z.karlsson@stericsson.com> Reviewed-by: Anupam ROY <anupam.roy@stericsson.com>
-rw-r--r--drivers/media/radio/CG2900/cg2900_fm_api.c33
-rw-r--r--drivers/media/radio/CG2900/radio-cg2900.c4
2 files changed, 27 insertions, 10 deletions
diff --git a/drivers/media/radio/CG2900/cg2900_fm_api.c b/drivers/media/radio/CG2900/cg2900_fm_api.c
index 9d809406687..ad9ab8de282 100644
--- a/drivers/media/radio/CG2900/cg2900_fm_api.c
+++ b/drivers/media/radio/CG2900/cg2900_fm_api.c
@@ -1803,7 +1803,7 @@ int cg2900_fm_get_block_scan_result(
/* Enable the PA */
result = fmd_tx_set_pa(true);
- if (0 != result) {
+ if (0 != result) {
FM_ERR_REPORT("cg2900_fm_get_block_scan_result:"
" fmd_tx_set_pa "
"failed %d",
@@ -2415,8 +2415,6 @@ int cg2900_fm_rds_off(void)
memset(fm_rds_buf, 0,
sizeof(struct cg2900_fm_rds_buf) *
MAX_RDS_BUFFER * MAX_RDS_GROUPS);
- /* Remove all Interrupts from the queue */
- skb_queue_purge(&fm_interrupt_queue);
result = fmd_rx_set_rds(FMD_SWITCH_OFF_RDS);
if (0 != result) {
FM_ERR_REPORT("cg2900_fm_rds_off: fmd_rx_set_rds failed, "
@@ -2664,13 +2662,21 @@ int cg2900_fm_set_frequency(
result = -EINVAL;
goto error;
}
- memset(&fm_rds_info, 0,
- sizeof(struct cg2900_fm_rds_info));
- memset(fm_rds_buf, 0,
- sizeof(struct cg2900_fm_rds_buf) *
- MAX_RDS_BUFFER * MAX_RDS_GROUPS);
- /* Remove all Interrupts from the queue */
- skb_queue_purge(&fm_interrupt_queue);
+ /* Check if RDS needs to be disabled before Setting Frequency */
+ if (fm_rds_status) {
+ /* Stop RDS if it is active */
+ result = cg2900_fm_rds_off();
+ fm_prev_rds_status = true;
+ } else {
+ memset(&fm_rds_info, 0,
+ sizeof(struct cg2900_fm_rds_info));
+ memset(fm_rds_buf, 0,
+ sizeof(struct cg2900_fm_rds_buf) *
+ MAX_RDS_BUFFER * MAX_RDS_GROUPS);
+ /* Remove all Interrupts from the queue */
+ skb_queue_purge(&fm_interrupt_queue);
+ }
+
if (CG2900_FM_RX_MODE == fm_mode) {
FM_DEBUG_REPORT("cg2900_fm_set_frequency: "
"fmd_rx_set_frequency");
@@ -2688,7 +2694,14 @@ int cg2900_fm_set_frequency(
(unsigned int)result);
result = -EINVAL;
goto error;
+ } else {
+ if (fm_prev_rds_status) {
+ /* Restart RDS if it was active earlier */
+ cg2900_fm_rds_on();
+ fm_prev_rds_status = false;
+ }
}
+
if (CG2900_FM_TX_MODE == fm_mode) {
FM_DEBUG_REPORT("cg2900_fm_set_frequency:"
" Sending Set" "fmd_tx_set_pa");
diff --git a/drivers/media/radio/CG2900/radio-cg2900.c b/drivers/media/radio/CG2900/radio-cg2900.c
index 0bc06adedb5..9ccb4e6b85d 100644
--- a/drivers/media/radio/CG2900/radio-cg2900.c
+++ b/drivers/media/radio/CG2900/radio-cg2900.c
@@ -2696,6 +2696,8 @@ static ssize_t cg2900_read(
if ((fm_rds_info.rds_head == fm_rds_info.rds_tail) ||
(fm_rds_buf[fm_rds_info.rds_tail]
[current_rds_grp].block1 == 0x0000)) {
+ /* Remove all Interrupts from the queue */
+ skb_queue_purge(&fm_interrupt_queue);
FM_INFO_REPORT("cg2900_read: returning 0");
return 0;
}
@@ -2807,6 +2809,8 @@ static ssize_t cg2900_read(
fm_rds_info.rds_block_sent = 0;
if (!cg2900_device.rx_rds_enabled) {
+ /* Remove all Interrupts from the queue */
+ skb_queue_purge(&fm_interrupt_queue);
FM_INFO_REPORT("cg2900_read: returning 0");
spin_unlock(&fm_spinlock);
return 0;