summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnupam Roy <anupam.roy@stericsson.com>2012-02-06 10:25:38 +0530
committerPhilippe Langlais <philippe.langlais@stericsson.com>2012-05-22 11:06:03 +0200
commit7433881f47bafb6cb765a8e3b1e422449ac9d2ea (patch)
tree58c138700b1093fe03246f54c3eb73127da7d6f8
parentd49bd9347fcf6da0addeb8b36aeb13dceeecfa72 (diff)
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 <anupam.roy@stericsson.com> Change-Id: Ibcec6ec65aef6f324810504415b530564ac942b2 Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/49998 Reviewed-by: Anurag GUPTA-1 <anurag.gupta@stericsson.com> Reviewed-by: Hemant GUPTA <hemant.gupta@stericsson.com>
-rw-r--r--drivers/media/radio/CG2900/cg2900_fm_api.c13
-rw-r--r--drivers/media/radio/CG2900/cg2900_fm_driver.c38
-rw-r--r--drivers/media/radio/CG2900/cg2900_fm_driver.h28
3 files changed, 79 insertions, 0 deletions
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
@@ -800,6 +808,26 @@ int fmd_rx_set_stereo_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.
*
* FMD_STEREOMODE_MONO, FMD_STEREOMODE_STEREO and