summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/media/radio/CG2900/cg2900_fm_driver.c46
-rw-r--r--drivers/media/radio/CG2900/cg2900_fm_driver.h2
2 files changed, 33 insertions, 15 deletions
diff --git a/drivers/media/radio/CG2900/cg2900_fm_driver.c b/drivers/media/radio/CG2900/cg2900_fm_driver.c
index 4b1d39839ae..ee30f7b0070 100644
--- a/drivers/media/radio/CG2900/cg2900_fm_driver.c
+++ b/drivers/media/radio/CG2900/cg2900_fm_driver.c
@@ -106,6 +106,15 @@
*/
#define MAX_RESPONSE_TIME_IN_MS 5000
+/* Byte per word */
+#define WORD_LENGTH 2
+
+/* Byte Offset Counter */
+#define COUNTER 1
+
+/* Binary shift offset for one byte */
+#define SHIFT_OFFSET 8
+
/*
* enum fmd_gocmd_t - FM Driver Command state.
*
@@ -229,7 +238,7 @@ struct fmd_states_info {
struct fmd_data {
u32 cmd_id;
u16 num_parameters;
- u8 *parameters;
+ u8 parameters[MAX_RESP_SIZE];
};
static struct fmd_states_info fmd_state_info;
@@ -873,11 +882,6 @@ static int fmd_rx_channel_to_frequency(
*/
*frequency = min_freq + (channel_number * CHANNEL_FREQ_CONVERTER_MHZ);
- if (*frequency > max_freq)
- *frequency = max_freq;
- else if (*frequency < min_freq)
- *frequency = min_freq;
-
error:
return result;
}
@@ -1621,6 +1625,8 @@ static int fmd_read_resp(
)
{
int err;
+ int param_offset = 0;
+ int byte_offset = 0;
FM_INFO_REPORT("fmd_read_resp");
/* Wait till response of the command is received */
@@ -1640,10 +1646,17 @@ static int fmd_read_resp(
*cmd_id = fmd_data.cmd_id;
if (fmd_data.num_parameters) {
*num_parameters = fmd_data.num_parameters;
- memcpy(
- parameters,
- fmd_data.parameters,
- (*num_parameters * sizeof(u16)));
+ while (param_offset <
+ (*num_parameters * sizeof(u16)) / WORD_LENGTH) {
+ parameters[param_offset] =
+ (u16)(fmd_data.parameters[byte_offset])
+ & 0x00ff;
+ parameters[param_offset] |=
+ ((u16)(fmd_data.parameters[byte_offset + COUNTER])
+ & 0x00ff) << SHIFT_OFFSET;
+ byte_offset = byte_offset + WORD_LENGTH;
+ param_offset++;
+ }
}
err = 0;
@@ -1668,6 +1681,7 @@ static void fmd_process_fm_function(
{
u8 fm_function_id;
u8 block_id;
+ int count = 0;
if (packet_buffer == NULL)
return;
@@ -1700,12 +1714,14 @@ static void fmd_process_fm_function(
fmd_data.cmd_id, fmd_data.num_parameters);
if (fmd_data.num_parameters) {
- fmd_data.parameters =
- FM_GET_RSP_BUFFER_ADDR(packet_buffer);
- memcpy(fmd_data.parameters,
- FM_GET_RSP_BUFFER_ADDR(packet_buffer),
- fmd_data.num_parameters * sizeof(u16));
+ while (count <
+ (fmd_data.num_parameters * sizeof(u16))) {
+ fmd_data.parameters[count] =
+ *(FM_GET_RSP_BUFFER_ADDR(packet_buffer) + count);
+ count++;
+ }
}
+
/* Release the semaphore since response is received */
fmd_set_cmd_sem();
break;
diff --git a/drivers/media/radio/CG2900/cg2900_fm_driver.h b/drivers/media/radio/CG2900/cg2900_fm_driver.h
index fc5ec682714..b1ddda5f5a8 100644
--- a/drivers/media/radio/CG2900/cg2900_fm_driver.h
+++ b/drivers/media/radio/CG2900/cg2900_fm_driver.h
@@ -86,6 +86,8 @@ enum fmd_debug_levels {
#define MAX_COUNT_OF_IRQS 16
#define MAX_BUFFER_SIZE 512
#define MAX_NAME_SIZE 100
+/* Maximum size of parsable data in bytes, received from CG2900 FM IP */
+#define MAX_RESP_SIZE 20
/* Minimum Power level for CG2900. The value is in units of dBuV */
#define MIN_POWER_LEVEL 88
/* Maximum Power level for CG2900. The value is in units of dBuV */