From 253a6fbf6c5a5a4b49600972b4f50e73e8c83b88 Mon Sep 17 00:00:00 2001 From: Hemant Gupta Date: Tue, 4 Oct 2011 18:00:44 +0530 Subject: 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 Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/32954 Reviewed-by: Andreas KARLSSON Reviewed-by: Anupam ROY --- drivers/media/radio/CG2900/cg2900_fm_api.c | 33 +++++++++++++++++++++--------- drivers/media/radio/CG2900/radio-cg2900.c | 4 ++++ 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; -- cgit v1.2.3