radio: iris: Fix the calibration issue.

Fix the preset issue after the calibration

Change-Id: I5c0c694304b70be48462feaf64f688109596e781
CRs-Fixed: 318867
Signed-off-by: Venkateshwarlu Domakonda <Venkateshwarlu@codeaurora.org>
diff --git a/drivers/media/radio/radio-iris.c b/drivers/media/radio/radio-iris.c
index e4430ad..5e70607 100644
--- a/drivers/media/radio/radio-iris.c
+++ b/drivers/media/radio/radio-iris.c
@@ -1352,18 +1352,30 @@
 	return ret;
 }
 
-static int hci_fm_set_cal_req(struct radio_hci_dev *hdev,
+static int hci_fm_set_cal_req_proc(struct radio_hci_dev *hdev,
 		unsigned long param)
 {
 	u16 opcode = 0;
-	struct hci_fm_set_cal_req *cal_req =
-		(struct hci_fm_set_cal_req *)param;
+	struct hci_fm_set_cal_req_proc *cal_req =
+		(struct hci_fm_set_cal_req_proc *)param;
 
 	opcode = hci_opcode_pack(HCI_OGF_FM_COMMON_CTRL_CMD_REQ,
 		HCI_OCF_FM_SET_CALIBRATION);
-	return radio_hci_send_cmd(hdev, opcode, sizeof((*hci_fm_set_cal_req)),
+	return radio_hci_send_cmd(hdev, opcode, sizeof(*cal_req),
 		cal_req);
+}
 
+static int hci_fm_set_cal_req_dc(struct radio_hci_dev *hdev,
+		unsigned long param)
+{
+	u16 opcode = 0;
+	struct hci_fm_set_cal_req_dc *cal_req =
+		(struct hci_fm_set_cal_req_dc *)param;
+
+	opcode = hci_opcode_pack(HCI_OGF_FM_COMMON_CTRL_CMD_REQ,
+		HCI_OCF_FM_SET_CALIBRATION);
+	return radio_hci_send_cmd(hdev, opcode, sizeof(*cal_req),
+		cal_req);
 }
 
 static int hci_fm_do_cal_req(struct radio_hci_dev *hdev,
@@ -2525,7 +2537,8 @@
 	struct hci_fm_tx_ps tx_ps;
 	struct hci_fm_tx_rt tx_rt;
 	struct hci_fm_def_data_wr_req default_data;
-	struct hci_fm_set_cal_req cal_req;
+	struct hci_fm_set_cal_req_proc proc_cal_req;
+	struct hci_fm_set_cal_req_dc dc_cal_req;
 
 	struct iris_device *radio = video_get_drvdata(video_devdata(file));
 	char *data = NULL;
@@ -2579,24 +2592,33 @@
 		retval = hci_def_data_write(&default_data, radio->fm_hdev);
 			break;
 	case V4L2_CID_PRIVATE_IRIS_SET_CALIBRATION:
-		FMDERR("In Set Calibration");
 		data = (ctrl->controls[0]).string;
 		bytes_to_copy = (ctrl->controls[0]).size;
-		memset(cal_req.data, 0, MAX_CALIB_SIZE);
-		cal_req.mode = PROCS_CALIB_MODE;
-		if (copy_from_user(&cal_req.data[0],
-				data, PROCS_CALIB_SIZE))
+		if (bytes_to_copy < (PROCS_CALIB_SIZE + DC_CALIB_SIZE)) {
+			FMDERR("data is less than required size");
+			return -EFAULT;
+		}
+		memset(proc_cal_req.data, 0, PROCS_CALIB_SIZE);
+		proc_cal_req.mode = PROCS_CALIB_MODE;
+		if (copy_from_user(&proc_cal_req.data[0],
+				data, sizeof(proc_cal_req.data)))
 				return -EFAULT;
-		retval = radio_hci_request(radio->fm_hdev, hci_fm_set_cal_req,
-				(unsigned long)&cal_req, RADIO_HCI_TIMEOUT);
-		if (retval < 0)
+		retval = radio_hci_request(radio->fm_hdev,
+				hci_fm_set_cal_req_proc,
+				(unsigned long)&proc_cal_req,
+				 RADIO_HCI_TIMEOUT);
+		if (retval < 0) {
 			FMDERR("Set Process calibration failed %d", retval);
-		if (copy_from_user(&cal_req.data[PROCS_CALIB_SIZE],
-				data, DC_CALIB_SIZE))
+			return retval;
+		}
+		memset(dc_cal_req.data, 0, DC_CALIB_SIZE);
+		if (copy_from_user(&dc_cal_req.data[0], &data[PROCS_CALIB_SIZE],
+				sizeof(dc_cal_req.data)))
 				return -EFAULT;
-		cal_req.mode = DC_CALIB_MODE;
-		retval = radio_hci_request(radio->fm_hdev, hci_fm_set_cal_req,
-				(unsigned long)&cal_req, RADIO_HCI_TIMEOUT);
+		dc_cal_req.mode = DC_CALIB_MODE;
+		retval = radio_hci_request(radio->fm_hdev,
+				hci_fm_set_cal_req_dc,
+				(unsigned long)&dc_cal_req, RADIO_HCI_TIMEOUT);
 		if (retval < 0)
 			FMDERR("Set DC calibration failed %d", retval);
 		break;
@@ -3188,6 +3210,9 @@
 		if ((i == IRIS_BUF_RAW_RDS) || (i == IRIS_BUF_PEEK))
 			kfifo_alloc_rc = kfifo_alloc(&radio->data_buf[i],
 				rds_buf*3, GFP_KERNEL);
+		else if (i == IRIS_BUF_CAL_DATA)
+			kfifo_alloc_rc = kfifo_alloc(&radio->data_buf[i],
+				STD_BUF_SIZE*2, GFP_KERNEL);
 		else
 			kfifo_alloc_rc = kfifo_alloc(&radio->data_buf[i],
 				STD_BUF_SIZE, GFP_KERNEL);
diff --git a/include/media/radio-iris.h b/include/media/radio-iris.h
index d9687ba..dbdb651 100644
--- a/include/media/radio-iris.h
+++ b/include/media/radio-iris.h
@@ -727,13 +727,19 @@
 #define RSB_CALIB_SIZE    4
 #define CALIB_DATA_OFSET  2
 #define CALIB_MODE_OFSET  1
-
 #define MAX_CALIB_SIZE 75
-struct hci_fm_set_cal_req {
+struct hci_fm_set_cal_req_proc {
 	__u8    mode;
-	/*Max calibration data size*/
-	__u8    data[MAX_CALIB_SIZE];
+	/*Max process calibration data size*/
+	__u8    data[PROCS_CALIB_SIZE];
 } __packed;
+
+struct hci_fm_set_cal_req_dc {
+	__u8    mode;
+	/*Max DC calibration data size*/
+	__u8    data[DC_CALIB_SIZE];
+} __packed;
+
 struct hci_cc_do_calibration_rsp {
 	__u8 status;
 	__u8 mode;