Merge "ARM: smp: Save CPU registers before IPI_CPU_STOP processing"
diff --git a/Documentation/devicetree/bindings/media/video/msm-vfe.txt b/Documentation/devicetree/bindings/media/video/msm-vfe.txt
index f02f35e..dd8eb15 100644
--- a/Documentation/devicetree/bindings/media/video/msm-vfe.txt
+++ b/Documentation/devicetree/bindings/media/video/msm-vfe.txt
@@ -8,9 +8,13 @@
- reg : offset and length of the register set for the device
for the vfe operating in compatible mode.
- reg-names : should specify relevant names to each reg property defined.
+ - "vfe" - Required.
+ - "vfe_vbif" - Optional for "vfe32". Required for "vfe40".
+ - "tcsr" - Optional for "vfe32". Required for "vfe40".
- interrupts : should contain the vfe interrupt.
- interrupt-names : should specify relevant names to each interrupts
property defined.
+ - "vfe" - Required.
- vdd-supply: phandle to GDSC regulator controlling VFE core.
Example:
diff --git a/arch/arm/boot/dts/msm8226-camera.dtsi b/arch/arm/boot/dts/msm8226-camera.dtsi
index 617d738..23ee20d 100644
--- a/arch/arm/boot/dts/msm8226-camera.dtsi
+++ b/arch/arm/boot/dts/msm8226-camera.dtsi
@@ -74,8 +74,9 @@
cell-index = <0>;
compatible = "qcom,vfe40";
reg = <0xfda10000 0x1000>,
- <0xfda40000 0x200>;
- reg-names = "vfe", "vfe_vbif";
+ <0xfda40000 0x200>,
+ <0xfd4a8000 0x4>;
+ reg-names = "vfe", "vfe_vbif", "tcsr";
interrupts = <0 57 0>;
interrupt-names = "vfe";
vdd-supply = <&gdsc_vfe>;
diff --git a/arch/arm/boot/dts/msm8974-camera.dtsi b/arch/arm/boot/dts/msm8974-camera.dtsi
index 8e5b58c..dd30820 100644
--- a/arch/arm/boot/dts/msm8974-camera.dtsi
+++ b/arch/arm/boot/dts/msm8974-camera.dtsi
@@ -107,8 +107,9 @@
cell-index = <0>;
compatible = "qcom,vfe40";
reg = <0xfda10000 0x1000>,
- <0xfda40000 0x200>;
- reg-names = "vfe", "vfe_vbif";
+ <0xfda40000 0x200>,
+ <0xfd4a8000 0x4>;
+ reg-names = "vfe", "vfe_vbif", "tcsr";
interrupts = <0 57 0>;
interrupt-names = "vfe";
vdd-supply = <&gdsc_vfe>;
@@ -118,8 +119,9 @@
cell-index = <1>;
compatible = "qcom,vfe40";
reg = <0xfda14000 0x1000>,
- <0xfda40000 0x200>;
- reg-names = "vfe", "vfe_vbif";
+ <0xfda40000 0x200>,
+ <0xfd4a8000 0x4>;
+ reg-names = "vfe", "vfe_vbif", "tcsr";
interrupts = <0 58 0>;
interrupt-names = "vfe";
vdd-supply = <&gdsc_vfe>;
diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp.h b/drivers/media/platform/msm/camera_v2/isp/msm_isp.h
index 8c42ed2..4aa423f 100644
--- a/drivers/media/platform/msm/camera_v2/isp/msm_isp.h
+++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp.h
@@ -49,6 +49,16 @@
uint32_t active;
};
+enum msm_isp_pack_fmt {
+ QCOM,
+ MIPI,
+ DPCM6,
+ DPCM8,
+ PLAIN8,
+ PLAIN16,
+ MAX_ISP_PACK_FMT,
+};
+
enum msm_isp_camif_update_state {
NO_UPDATE,
ENABLE_CAMIF,
@@ -290,7 +300,7 @@
enum msm_vfe_inputmux input_mux;
uint32_t width;
long pixel_clock;
- uint32_t input_format;
+ uint32_t input_format;/*V4L2 pix format with bayer pattern*/
};
enum msm_wm_ub_cfg_type {
@@ -386,10 +396,12 @@
struct resource *vfe_irq;
struct resource *vfe_mem;
struct resource *vfe_vbif_mem;
+ struct resource *tcsr_mem;
struct resource *vfe_io;
struct resource *vfe_vbif_io;
void __iomem *vfe_base;
void __iomem *vfe_vbif_base;
+ void __iomem *tcsr_base;
struct device *iommu_ctx[MAX_IOMMU_CTX];
@@ -414,6 +426,7 @@
struct msm_vfe_tasklet_queue_cmd
tasklet_queue_cmd[MSM_VFE_TASKLETQ_SIZE];
+ uint32_t soc_hw_version;
uint32_t vfe_hw_version;
struct msm_vfe_hardware_info *hw_info;
struct msm_vfe_axi_shared_data axi_data;
diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp32.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp32.c
index 95b3a51..a6972e4 100644
--- a/drivers/media/platform/msm/camera_v2/isp/msm_isp32.c
+++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp32.c
@@ -484,7 +484,7 @@
static void msm_vfe32_cfg_io_format(struct vfe_device *vfe_dev,
enum msm_vfe_axi_stream_src stream_src, uint32_t io_format)
{
- int bpp, bpp_reg = 0;
+ int bpp, bpp_reg = 0, pack_fmt = 0, pack_reg = 0;
uint32_t io_format_reg;
bpp = msm_isp_get_bit_per_pixel(io_format);
@@ -499,6 +499,34 @@
bpp_reg = 1 << 1;
break;
}
+
+ if (stream_src == IDEAL_RAW) {
+ pack_fmt = msm_isp_get_pack_format(io_format);
+ switch (pack_fmt) {
+ case QCOM:
+ pack_reg = 0x0;
+ break;
+ case MIPI:
+ pack_reg = 0x1;
+ break;
+ case DPCM6:
+ pack_reg = 0x2;
+ break;
+ case DPCM8:
+ pack_reg = 0x3;
+ break;
+ case PLAIN8:
+ pack_reg = 0x4;
+ break;
+ case PLAIN16:
+ pack_reg = 0x5;
+ break;
+ default:
+ pr_err("%s: invalid pack fmt!\n", __func__);
+ return;
+ }
+ }
+
io_format_reg = msm_camera_io_r(vfe_dev->vfe_base + 0x6F8);
switch (stream_src) {
case PIX_ENCODER:
@@ -509,7 +537,7 @@
break;
case IDEAL_RAW:
io_format_reg &= 0xFFFFFFC8;
- io_format_reg |= bpp_reg << 4;
+ io_format_reg |= bpp_reg << 4 | pack_reg;
break;
case RDI_INTF_0:
case RDI_INTF_1:
diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp40.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp40.c
index 84b95f1..4ff8849 100644
--- a/drivers/media/platform/msm/camera_v2/isp/msm_isp40.c
+++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp40.c
@@ -290,6 +290,14 @@
goto vbif_remap_failed;
}
+ vfe_dev->tcsr_base = ioremap(vfe_dev->tcsr_mem->start,
+ resource_size(vfe_dev->tcsr_mem));
+ if (!vfe_dev->tcsr_base) {
+ rc = -ENOMEM;
+ pr_err("%s: tcsr ioremap failed\n", __func__);
+ goto tcsr_remap_failed;
+ }
+
rc = request_irq(vfe_dev->vfe_irq->start, msm_isp_process_irq,
IRQF_TRIGGER_RISING, "vfe", vfe_dev);
if (rc < 0) {
@@ -298,6 +306,8 @@
}
return rc;
irq_req_failed:
+ iounmap(vfe_dev->tcsr_base);
+tcsr_remap_failed:
iounmap(vfe_dev->vfe_vbif_base);
vbif_remap_failed:
iounmap(vfe_dev->vfe_base);
@@ -316,6 +326,7 @@
{
free_irq(vfe_dev->vfe_irq->start, vfe_dev);
tasklet_kill(&vfe_dev->vfe_tasklet);
+ iounmap(vfe_dev->tcsr_base);
iounmap(vfe_dev->vfe_vbif_base);
iounmap(vfe_dev->vfe_base);
msm_cam_clk_enable(&vfe_dev->pdev->dev, msm_vfe40_clk_info,
@@ -690,8 +701,9 @@
static void msm_vfe40_cfg_io_format(struct vfe_device *vfe_dev,
enum msm_vfe_axi_stream_src stream_src, uint32_t io_format)
{
- int bpp, bpp_reg = 0;
- uint32_t io_format_reg;
+ int bpp, bpp_reg = 0, pack_reg = 0;
+ enum msm_isp_pack_fmt pack_fmt = 0;
+ uint32_t io_format_reg; /*io format register bit*/
bpp = msm_isp_get_bit_per_pixel(io_format);
switch (bpp) {
@@ -705,6 +717,35 @@
bpp_reg = 1 << 1;
break;
}
+
+ if (stream_src == IDEAL_RAW) {
+ /*use io_format(v4l2_pix_fmt) to get pack format*/
+ pack_fmt = msm_isp_get_pack_format(io_format);
+ switch (pack_fmt) {
+ case QCOM:
+ pack_reg = 0x0;
+ break;
+ case MIPI:
+ pack_reg = 0x1;
+ break;
+ case DPCM6:
+ pack_reg = 0x2;
+ break;
+ case DPCM8:
+ pack_reg = 0x3;
+ break;
+ case PLAIN8:
+ pack_reg = 0x4;
+ break;
+ case PLAIN16:
+ pack_reg = 0x5;
+ break;
+ default:
+ pr_err("%s: invalid pack fmt!\n", __func__);
+ return;
+ }
+ }
+
io_format_reg = msm_camera_io_r(vfe_dev->vfe_base + 0x54);
switch (stream_src) {
case PIX_ENCODER:
@@ -715,7 +756,7 @@
break;
case IDEAL_RAW:
io_format_reg &= 0xFFFFFFC8;
- io_format_reg |= bpp_reg << 4;
+ io_format_reg |= bpp_reg << 4 | pack_reg;
break;
case RDI_INTF_0:
case RDI_INTF_1:
@@ -1262,6 +1303,14 @@
goto vfe_no_resource;
}
+ vfe_dev->tcsr_mem = platform_get_resource_byname(vfe_dev->pdev,
+ IORESOURCE_MEM, "tcsr");
+ if (!vfe_dev->tcsr_mem) {
+ pr_err("%s: no mem resource?\n", __func__);
+ rc = -ENODEV;
+ goto vfe_no_resource;
+ }
+
vfe_dev->vfe_irq = platform_get_resource_byname(vfe_dev->pdev,
IORESOURCE_IRQ, "vfe");
if (!vfe_dev->vfe_irq) {
diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c
index 3786b09..f547b0e 100644
--- a/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c
+++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c
@@ -300,7 +300,16 @@
struct msm_vfe_axi_stream *stream_info;
enum msm_vfe_axi_state valid_state =
(stream_cfg_cmd->cmd == START_STREAM) ? INACTIVE : ACTIVE;
+
+ if (stream_cfg_cmd->num_streams > MAX_NUM_STREAM) {
+ return -EINVAL;
+ }
+
for (i = 0; i < stream_cfg_cmd->num_streams; i++) {
+ if (HANDLE_TO_IDX(stream_cfg_cmd->stream_handle[i])
+ > MAX_NUM_STREAM) {
+ return -EINVAL;
+ }
stream_info = &axi_data->stream_info[
HANDLE_TO_IDX(stream_cfg_cmd->stream_handle[i])];
spin_lock_irqsave(&stream_info->lock, flags);
@@ -852,7 +861,16 @@
int i;
struct msm_vfe_axi_stream *stream_info;
struct msm_vfe_axi_shared_data *axi_data = &vfe_dev->axi_data;
+
+ if (stream_cfg_cmd->num_streams > MAX_NUM_STREAM) {
+ return;
+ }
+
for (i = 0; i < stream_cfg_cmd->num_streams; i++) {
+ if (HANDLE_TO_IDX(stream_cfg_cmd->stream_handle[i])
+ > MAX_NUM_STREAM) {
+ return;
+ }
stream_info =
&axi_data->stream_info[
HANDLE_TO_IDX(stream_cfg_cmd->stream_handle[i])];
@@ -1032,7 +1050,16 @@
uint32_t wm_reload_mask = 0x0;
struct msm_vfe_axi_stream *stream_info;
struct msm_vfe_axi_shared_data *axi_data = &vfe_dev->axi_data;
+
+ if (stream_cfg_cmd->num_streams > MAX_NUM_STREAM) {
+ return -EINVAL;
+ }
+
for (i = 0; i < stream_cfg_cmd->num_streams; i++) {
+ if (HANDLE_TO_IDX(stream_cfg_cmd->stream_handle[i])
+ > MAX_NUM_STREAM) {
+ return -EINVAL;
+ }
stream_info = &axi_data->stream_info[
HANDLE_TO_IDX(stream_cfg_cmd->stream_handle[i])];
src_state = axi_data->src_info[
@@ -1085,7 +1112,16 @@
uint8_t wait_for_complete = 0;
struct msm_vfe_axi_stream *stream_info;
struct msm_vfe_axi_shared_data *axi_data = &vfe_dev->axi_data;
+
+ if (stream_cfg_cmd->num_streams > MAX_NUM_STREAM) {
+ return -EINVAL;
+ }
+
for (i = 0; i < stream_cfg_cmd->num_streams; i++) {
+ if (HANDLE_TO_IDX(stream_cfg_cmd->stream_handle[i])
+ > MAX_NUM_STREAM) {
+ return -EINVAL;
+ }
stream_info = &axi_data->stream_info[
HANDLE_TO_IDX(stream_cfg_cmd->stream_handle[i])];
@@ -1175,8 +1211,18 @@
return -EBUSY;
}
+ /*num_stream is uint32 and update_info[] bound by MAX_NUM_STREAM*/
+ if (update_cmd->num_streams > MAX_NUM_STREAM) {
+ return -EINVAL;
+ }
+
for (i = 0; i < update_cmd->num_streams; i++) {
update_info = &update_cmd->update_info[i];
+ /*check array reference bounds*/
+ if (HANDLE_TO_IDX(update_info->stream_handle)
+ > MAX_NUM_STREAM) {
+ return -EINVAL;
+ }
stream_info = &axi_data->stream_info[
HANDLE_TO_IDX(update_info->stream_handle)];
if (stream_info->state != ACTIVE &&
diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp_util.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp_util.c
index 590b636..fcdf34e 100644
--- a/drivers/media/platform/msm/camera_v2/isp/msm_isp_util.c
+++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp_util.c
@@ -27,6 +27,8 @@
#define MSM_ISP_MIN_AB 300000000
#define MSM_ISP_MIN_IB 450000000
+#define VFE40_8974V2_VERSION 0x1001001A
+
static struct msm_bus_vectors msm_isp_init_vectors[] = {
{
.src = MSM_BUS_MASTER_VFE,
@@ -537,6 +539,9 @@
}
break;
}
+ case GET_SOC_HW_VER:
+ *cfg_data = vfe_dev->soc_hw_version;
+ break;
}
return 0;
}
@@ -668,6 +673,42 @@
return val;
}
+enum msm_isp_pack_fmt msm_isp_get_pack_format(uint32_t output_format)
+{
+ switch (output_format) {
+ case V4L2_PIX_FMT_SBGGR8:
+ case V4L2_PIX_FMT_SGBRG8:
+ case V4L2_PIX_FMT_SGRBG8:
+ case V4L2_PIX_FMT_SRGGB8:
+ case V4L2_PIX_FMT_SBGGR10:
+ case V4L2_PIX_FMT_SGBRG10:
+ case V4L2_PIX_FMT_SGRBG10:
+ case V4L2_PIX_FMT_SRGGB10:
+ case V4L2_PIX_FMT_SBGGR12:
+ case V4L2_PIX_FMT_SGBRG12:
+ case V4L2_PIX_FMT_SGRBG12:
+ case V4L2_PIX_FMT_SRGGB12:
+ return MIPI;
+ case V4L2_PIX_FMT_QBGGR8:
+ case V4L2_PIX_FMT_QGBRG8:
+ case V4L2_PIX_FMT_QGRBG8:
+ case V4L2_PIX_FMT_QRGGB8:
+ case V4L2_PIX_FMT_QBGGR10:
+ case V4L2_PIX_FMT_QGBRG10:
+ case V4L2_PIX_FMT_QGRBG10:
+ case V4L2_PIX_FMT_QRGGB10:
+ case V4L2_PIX_FMT_QBGGR12:
+ case V4L2_PIX_FMT_QGBRG12:
+ case V4L2_PIX_FMT_QGRBG12:
+ case V4L2_PIX_FMT_QRGGB12:
+ return QCOM;
+ default:
+ pr_err("%s: Invalid output format\n", __func__);
+ break;
+ }
+ return -EINVAL;
+}
+
int msm_isp_get_bit_per_pixel(uint32_t output_format)
{
switch (output_format) {
@@ -902,6 +943,15 @@
vfe_dev->buf_mgr->ops->buf_mgr_init(vfe_dev->buf_mgr, "msm_isp", 28);
+ switch (vfe_dev->vfe_hw_version) {
+ case VFE40_8974V2_VERSION:
+ vfe_dev->soc_hw_version = msm_camera_io_r(vfe_dev->tcsr_base);
+ break;
+ default:
+ /* SOC HARDWARE VERSION NOT SUPPORTED */
+ vfe_dev->soc_hw_version = 0x00;
+ }
+
memset(&vfe_dev->axi_data, 0, sizeof(struct msm_vfe_axi_shared_data));
memset(&vfe_dev->stats_data, 0,
sizeof(struct msm_vfe_stats_shared_data));
diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp_util.h b/drivers/media/platform/msm/camera_v2/isp/msm_isp_util.h
index 34b9859..ee901c3 100644
--- a/drivers/media/platform/msm/camera_v2/isp/msm_isp_util.h
+++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp_util.h
@@ -63,6 +63,7 @@
int msm_isp_cal_word_per_line(uint32_t output_format,
uint32_t pixel_per_line);
int msm_isp_get_bit_per_pixel(uint32_t output_format);
+enum msm_isp_pack_fmt msm_isp_get_pack_format(uint32_t output_format);
irqreturn_t msm_isp_process_irq(int irq_num, void *data);
void msm_isp_set_src_state(struct vfe_device *vfe_dev, void *arg);
void msm_isp_do_tasklet(unsigned long data);
diff --git a/include/media/msmb_isp.h b/include/media/msmb_isp.h
index b18b16b..23b19b5 100644
--- a/include/media/msmb_isp.h
+++ b/include/media/msmb_isp.h
@@ -225,6 +225,7 @@
VFE_READ_DMI_16BIT,
VFE_READ_DMI_32BIT,
VFE_READ_DMI_64BIT,
+ GET_SOC_HW_VER,
};
struct msm_vfe_cfg_cmd2 {
diff --git a/sound/soc/msm/qdsp6v2/q6voice.c b/sound/soc/msm/qdsp6v2/q6voice.c
index 60dd522..c863497 100644
--- a/sound/soc/msm/qdsp6v2/q6voice.c
+++ b/sound/soc/msm/qdsp6v2/q6voice.c
@@ -1890,20 +1890,20 @@
if (!common.apr_q6_cvs) {
pr_err("%s: apr_cvs is NULL\n", __func__);
- ret = -EINVAL;
+ ret = -EPERM;
goto done;
}
if (!common.cal_mem_handle) {
- pr_debug("%s: Cal mem handle is NULL\n", __func__);
-
+ pr_err("%s: Cal mem handle is NULL\n", __func__);
+ ret = -EPERM;
goto done;
}
get_vocstrm_cal(&cal_block);
if (cal_block.cal_size == 0) {
pr_err("%s: CVS cal size is 0\n", __func__);
-
+ ret = -EPERM;
goto done;
}
@@ -1932,7 +1932,7 @@
ret = apr_send_pkt(common.apr_q6_cvs, (uint32_t *) &cvs_reg_cal_cmd);
if (ret < 0) {
pr_err("%s: Error %d registering CVS cal\n", __func__, ret);
-
+ ret = -EINVAL;
goto done;
}
ret = wait_event_timeout(v->cvs_wait,
@@ -1940,7 +1940,7 @@
msecs_to_jiffies(TIMEOUT_MS));
if (!ret) {
pr_err("%s: Command timeout\n", __func__);
-
+ ret = -EINVAL;
goto done;
}
@@ -1965,19 +1965,22 @@
if (!common.apr_q6_cvs) {
pr_err("%s: apr_cvs is NULL\n", __func__);
- ret = -EINVAL;
+ ret = -EPERM;
goto done;
}
if (!common.cal_mem_handle) {
- pr_debug("%s: Cal mem handle is NULL\n", __func__);
-
+ pr_err("%s: Cal mem handle is NULL\n", __func__);
+ ret = -EPERM;
goto done;
}
get_vocstrm_cal(&cal_block);
- if (cal_block.cal_size == 0)
+ if (cal_block.cal_size == 0) {
+ pr_err("%s: CVS cal size is 0\n", __func__);
+ ret = -EPERM;
goto done;
+ }
cvs_dereg_cal_cmd.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD,
APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER);
@@ -1994,7 +1997,7 @@
ret = apr_send_pkt(common.apr_q6_cvs, (uint32_t *) &cvs_dereg_cal_cmd);
if (ret < 0) {
pr_err("%s: Error %d de-registering CVS cal\n", __func__, ret);
-
+ ret = -EINVAL;
goto done;
}
ret = wait_event_timeout(v->cvs_wait,
@@ -2002,7 +2005,7 @@
msecs_to_jiffies(TIMEOUT_MS));
if (!ret) {
pr_err("%s: Command timeout\n", __func__);
-
+ ret = -EINVAL;
goto done;
}
@@ -2028,20 +2031,20 @@
if (!common.apr_q6_cvp) {
pr_err("%s: apr_cvp is NULL\n", __func__);
- ret = -EINVAL;
+ ret = -EPERM;
goto done;
}
if (!common.cal_mem_handle) {
- pr_debug("%s: Cal mem handle is NULL\n", __func__);
-
+ pr_err("%s: Cal mem handle is NULL\n", __func__);
+ ret = -EPERM;
goto done;
}
get_vocproc_dev_cfg_cal(&cal_block);
if (cal_block.cal_size == 0) {
pr_err("%s: CVP cal size is 0\n", __func__);
-
+ ret = -EPERM;
goto done;
}
@@ -2066,7 +2069,7 @@
if (ret < 0) {
pr_err("%s: Error %d registering CVP dev cfg cal\n",
__func__, ret);
-
+ ret = -EINVAL;
goto done;
}
ret = wait_event_timeout(v->cvp_wait,
@@ -2074,7 +2077,7 @@
msecs_to_jiffies(TIMEOUT_MS));
if (!ret) {
pr_err("%s: Command timeout\n", __func__);
-
+ ret = -EINVAL;
goto done;
}
@@ -2099,19 +2102,22 @@
if (!common.apr_q6_cvp) {
pr_err("%s: apr_cvp is NULL\n", __func__);
- ret = -EINVAL;
+ ret = -EPERM;
goto done;
}
if (!common.cal_mem_handle) {
- pr_debug("%s: Cal mem handle is NULL\n", __func__);
-
+ pr_err("%s: Cal mem handle is NULL\n", __func__);
+ ret = -EPERM;
goto done;
}
get_vocproc_dev_cfg_cal(&cal_block);
- if (cal_block.cal_size == 0)
+ if (cal_block.cal_size == 0) {
+ pr_err("%s: CVP cal size is 0\n", __func__);
+ ret = -EPERM;
goto done;
+ }
cvp_dereg_dev_cfg_cmd.hdr.hdr_field =
APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD,
@@ -2131,7 +2137,7 @@
if (ret < 0) {
pr_err("%s: Error %d de-registering CVP dev cfg cal\n",
__func__, ret);
-
+ ret = -EINVAL;
goto done;
}
ret = wait_event_timeout(v->cvp_wait,
@@ -2139,7 +2145,7 @@
msecs_to_jiffies(TIMEOUT_MS));
if (!ret) {
pr_err("%s: Command timeout\n", __func__);
-
+ ret = -EINVAL;
goto done;
}
@@ -2164,20 +2170,20 @@
if (!common.apr_q6_cvp) {
pr_err("%s: apr_cvp is NULL\n", __func__);
- ret = -EINVAL;
+ ret = -EPERM;
goto done;
}
if (!common.cal_mem_handle) {
- pr_debug("%s: Cal mem handle is NULL\n", __func__);
-
+ pr_err("%s: Cal mem handle is NULL\n", __func__);
+ ret = -EPERM;
goto done;
}
get_vocproc_cal(&cal_block);
if (cal_block.cal_size == 0) {
pr_err("%s: CVP cal size is 0\n", __func__);
-
+ ret = -EPERM;
goto done;
}
@@ -2206,7 +2212,7 @@
ret = apr_send_pkt(common.apr_q6_cvp, (uint32_t *) &cvp_reg_cal_cmd);
if (ret < 0) {
pr_err("%s: Error %d registering CVP cal\n", __func__, ret);
-
+ ret = -EINVAL;
goto done;
}
ret = wait_event_timeout(v->cvp_wait,
@@ -2214,7 +2220,7 @@
msecs_to_jiffies(TIMEOUT_MS));
if (!ret) {
pr_err("%s: Command timeout\n", __func__);
-
+ ret = -EINVAL;
goto done;
}
@@ -2239,19 +2245,22 @@
if (!common.apr_q6_cvp) {
pr_err("%s: apr_cvp is NULL.\n", __func__);
- ret = -EINVAL;
+ ret = -EPERM;
goto done;
}
if (!common.cal_mem_handle) {
- pr_debug("%s: Cal mem handle is NULL\n", __func__);
-
+ pr_err("%s: Cal mem handle is NULL\n", __func__);
+ ret = -EPERM;
goto done;
}
get_vocproc_cal(&cal_block);
- if (cal_block.cal_size == 0)
+ if (cal_block.cal_size == 0) {
+ pr_err("%s: CVP vol cal size is 0\n", __func__);
+ ret = -EPERM;
goto done;
+ }
cvp_dereg_cal_cmd.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD,
APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER);
@@ -2268,7 +2277,7 @@
ret = apr_send_pkt(common.apr_q6_cvp, (uint32_t *) &cvp_dereg_cal_cmd);
if (ret < 0) {
pr_err("%s: Error %d de-registering CVP cal\n", __func__, ret);
-
+ ret = -EINVAL;
goto done;
}
ret = wait_event_timeout(v->cvp_wait,
@@ -2276,7 +2285,7 @@
msecs_to_jiffies(TIMEOUT_MS));
if (!ret) {
pr_err("%s: Command timeout\n", __func__);
-
+ ret = -EINVAL;
goto done;
}
@@ -2301,20 +2310,20 @@
if (!common.apr_q6_cvp) {
pr_err("%s: apr_cvp is NULL\n", __func__);
- ret = -EINVAL;
+ ret = -EPERM;
goto done;
}
if (!common.cal_mem_handle) {
- pr_debug("%s: Cal mem handle is NULL\n", __func__);
-
+ pr_err("%s: Cal mem handle is NULL\n", __func__);
+ ret = -EPERM;
goto done;
}
get_vocvol_cal(&cal_block);
if (cal_block.cal_size == 0) {
pr_err("%s: CVP vol cal size is 0\n", __func__);
-
+ ret = -EPERM;
goto done;
}
@@ -2346,7 +2355,7 @@
(uint32_t *) &cvp_reg_vol_cal_cmd);
if (ret < 0) {
pr_err("%s: Error %d registering CVP vol cal\n", __func__, ret);
-
+ ret = -EINVAL;
goto done;
}
ret = wait_event_timeout(v->cvp_wait,
@@ -2354,7 +2363,7 @@
msecs_to_jiffies(TIMEOUT_MS));
if (!ret) {
pr_err("%s: Command timeout\n", __func__);
-
+ ret = -EINVAL;
goto done;
}
@@ -2379,19 +2388,22 @@
if (!common.apr_q6_cvp) {
pr_err("%s: apr_cvp is NULL\n", __func__);
- ret = -EINVAL;
+ ret = -EPERM;
goto done;
}
if (!common.cal_mem_handle) {
- pr_debug("%s: Cal mem handle is NULL\n", __func__);
-
+ pr_err("%s: Cal mem handle is NULL\n", __func__);
+ ret = -EPERM;
goto done;
}
get_vocvol_cal(&cal_block);
- if (cal_block.cal_size == 0)
+ if (cal_block.cal_size == 0) {
+ pr_err("%s: CVP vol cal size is 0\n", __func__);
+ ret = -EPERM;
goto done;
+ }
cvp_dereg_vol_cal_cmd.hdr.hdr_field =
APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD,
@@ -2411,7 +2423,7 @@
if (ret < 0) {
pr_err("%s: Error %d de-registering CVP vol cal\n",
__func__, ret);
-
+ ret = -EINVAL;
goto done;
}
ret = wait_event_timeout(v->cvp_wait,
@@ -2419,7 +2431,7 @@
msecs_to_jiffies(TIMEOUT_MS));
if (!ret) {
pr_err("%s: Command timeout\n", __func__);
-
+ ret = -EINVAL;
goto done;
}
@@ -2430,6 +2442,7 @@
int voc_register_vocproc_vol_table(void)
{
int result = 0;
+ int result2 = 0;
int i;
struct voice_data *v = NULL;
pr_debug("%s\n", __func__);
@@ -2440,17 +2453,17 @@
mutex_lock(&v->lock);
if (is_voc_state_active(v->voc_state)) {
- result = voice_send_cvp_register_vol_cal_cmd(v);
- if (result) {
+ result2 = voice_send_cvp_register_vol_cal_cmd(v);
+ if (result2 < 0) {
pr_err("%s: Failed to register vocvol table for session 0x%x!\n",
__func__, v->session_id);
- mutex_unlock(&v->lock);
- goto done;
+ result = result2;
+ /* Still try to register other sessions */
}
}
mutex_unlock(&v->lock);
}
-done:
+
mutex_unlock(&common.common_lock);
return result;
}
@@ -2458,6 +2471,7 @@
int voc_deregister_vocproc_vol_table(void)
{
int result = 0;
+ int success = 0;
int i;
struct voice_data *v = NULL;
pr_debug("%s\n", __func__);
@@ -2469,17 +2483,25 @@
mutex_lock(&v->lock);
if (is_voc_state_active(v->voc_state)) {
result = voice_send_cvp_deregister_vol_cal_cmd(v);
- if (result) {
+ if (result < 0) {
pr_err("%s: Failed to deregister vocvol table for session 0x%x!\n",
__func__, v->session_id);
mutex_unlock(&v->lock);
+ mutex_unlock(&common.common_lock);
+ if (success) {
+ pr_err("%s: Try to re-register all deregistered sessions!\n",
+ __func__);
+ voc_register_vocproc_vol_table();
+ }
goto done;
+ } else {
+ success = 1;
}
}
mutex_unlock(&v->lock);
}
-done:
mutex_unlock(&common.common_lock);
+done:
return result;
}