From 7433881f47bafb6cb765a8e3b1e422449ac9d2ea Mon Sep 17 00:00:00 2001 From: Anupam Roy Date: Mon, 6 Feb 2012 10:25:38 +0530 Subject: CG2900 FM Radio: Implement FMR_RP_Stereo_SetControl_BlendingRSSI This implementation controls the stereo-threshold level by adjusting the min and max RSSI levels. The threshold for switching is optimized(lowered), which was by default a bit too high. ST-Ericsson Linux next: NA ST-Ericsson ID: 410120 ST-Ericsson FOSS-OUT ID: Trivial Change-Id: I35e4202de8066dff80f371285eb298caa23b9656 Signed-off-by: Anupam Roy Change-Id: Ibcec6ec65aef6f324810504415b530564ac942b2 Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/49998 Reviewed-by: Anurag GUPTA-1 Reviewed-by: Hemant GUPTA --- drivers/media/radio/CG2900/cg2900_fm_api.c | 13 +++++++++ drivers/media/radio/CG2900/cg2900_fm_driver.c | 38 +++++++++++++++++++++++++++ drivers/media/radio/CG2900/cg2900_fm_driver.h | 28 ++++++++++++++++++++ 3 files changed, 79 insertions(+) diff --git a/drivers/media/radio/CG2900/cg2900_fm_api.c b/drivers/media/radio/CG2900/cg2900_fm_api.c index 95d56bb52a0..f755ad371cc 100644 --- a/drivers/media/radio/CG2900/cg2900_fm_api.c +++ b/drivers/media/radio/CG2900/cg2900_fm_api.c @@ -1339,6 +1339,19 @@ int cg2900_fm_set_rx_default_settings( result = -EINVAL; goto error; } + if (enable_stereo) { + /* Set the Stereo Blending RSSI control */ + result = fmd_rx_set_stereo_ctrl_blending_rssi( + STEREO_BLENDING_MIN_RSSI, + STEREO_BLENDING_MAX_RSSI); + } + if (0 != result) { + FM_ERR_REPORT("cg2900_fm_set_rx_default_settings: " + "fmd_rx_set_stereo_ctrl_blending_rssi " + "failed %d", (unsigned int)result); + result = -EINVAL; + goto error; + } /* Remove all Interrupt from the queue */ skb_queue_purge(&fm_interrupt_queue); diff --git a/drivers/media/radio/CG2900/cg2900_fm_driver.c b/drivers/media/radio/CG2900/cg2900_fm_driver.c index 37fb664d04b..95680534e11 100644 --- a/drivers/media/radio/CG2900/cg2900_fm_driver.c +++ b/drivers/media/radio/CG2900/cg2900_fm_driver.c @@ -2326,6 +2326,44 @@ error: return err; } +int fmd_rx_set_stereo_ctrl_blending_rssi( + u16 min_rssi, + u16 max_rssi) +{ + int err; + int io_result; + u16 parameters[CMD_RP_STEREO_SET_CONTROL_BLENDING_RSSI_PARAM_LEN]; + + if (fmd_go_cmd_busy()) { + err = -EBUSY; + goto error; + } + + if (!fmd_state_info.fmd_initialized) { + err = -ENOEXEC; + goto error; + } + + parameters[0] = min_rssi; + parameters[1] = max_rssi; + + io_result = fmd_send_cmd_and_read_resp( + CMD_FMR_RP_STEREO_SET_CONTROL_BLENDING_RSSI, + CMD_RP_STEREO_SET_CONTROL_BLENDING_RSSI_PARAM_LEN, + parameters, + NULL, + NULL); + + if (io_result != 0) { + err = io_result; + goto error; + } + err = 0; + +error: + return err; +} + int fmd_rx_get_stereo_mode( u8 *mode ) diff --git a/drivers/media/radio/CG2900/cg2900_fm_driver.h b/drivers/media/radio/CG2900/cg2900_fm_driver.h index b1ddda5f5a8..55ff60035c9 100644 --- a/drivers/media/radio/CG2900/cg2900_fm_driver.h +++ b/drivers/media/radio/CG2900/cg2900_fm_driver.h @@ -140,6 +140,12 @@ enum fmd_debug_levels { * This is just a hexadecimal number with no units. */ #define DEFAULT_PEAK_NOISE_VALUE 0x0035 +/* Defines the RF level (at the antenna pin) at which the stereo blending + * function will stop limiting the channel separation */ +#define STEREO_BLENDING_MIN_RSSI 0x0005 +/* Defines the RF level (at the antenna pin) at which the stereo blending + * function will start limiting the channel separation */ +#define STEREO_BLENDING_MAX_RSSI 0x0100 /* * Default Average Noise level for a channel to be considered valid for CG2900. * This is just a hexadecimal number with no units. @@ -186,6 +192,7 @@ enum fmd_debug_levels { #define CMD_FMR_RP_GET_RSSI 0x0083 #define CMD_FMR_RP_GET_STATE 0x0063 #define CMD_FMR_RP_STEREO_SET_MODE 0x0123 +#define CMD_FMR_RP_STEREO_SET_CONTROL_BLENDING_RSSI 0x0143 #define CMD_FMR_SET_ANTENNA 0x0663 #define CMD_FMR_SP_AF_SWITCH_GET_RESULT 0x0603 #define CMD_FMR_SP_AF_SWITCH_START 0x04A3 @@ -244,6 +251,7 @@ enum fmd_debug_levels { #define CMD_SP_TUNE_GET_CHANNEL_PARAM_LEN 0 #define CMD_SP_TUNE_GET_CHANNEL_RSP_PARAM_LEN 1 #define CMD_RP_STEREO_SET_MODE_PARAM_LEN 1 +#define CMD_RP_STEREO_SET_CONTROL_BLENDING_RSSI_PARAM_LEN 2 #define CMD_RP_GET_RSSI_PARAM_LEN 0 #define CMD_RP_GET_RSSI_RSP_PARAM_LEN 1 #define CMD_RP_GET_STATE_PARAM_LEN 0 @@ -799,6 +807,26 @@ int fmd_rx_set_stereo_mode( u8 mode ); +/** + * fmd_rx_set_stereo_ctrl_blending_rssi() - Sets the stereo blending control setting. + * + * @min_rssi: Defines the RF level (at the antenna pin) at which the stereo blending + * function will stop limiting the channel separation + * @max_rssi: Defines the RF level (at the antenna pin) at which the stereo blending + * function will start limiting the channel separation. + * + * Returns: + * 0, if no error. + * -EINVAL, if parameter is invalid. + * -ENOEXEC, if preconditions are violated. + * -EBUSY, if FM Driver is not in idle state. + * -EINVAL, if wrong response received from chip. + */ +int fmd_rx_set_stereo_ctrl_blending_rssi( + u16 min_rssi, + u16 max_rssi + ); + /** * fmd_rx_get_stereo_mode() - Gets the currently used FM mode. * -- cgit v1.2.3