summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--arch/arm/boot/dts/qcom/msm8996-regulator.dtsi13
-rw-r--r--arch/arm/boot/dts/qcom/sdm630-gpu.dtsi1
-rw-r--r--arch/arm/boot/dts/qcom/sdm630.dtsi17
-rw-r--r--arch/arm/boot/dts/qcom/sdm660-gpu.dtsi1
-rw-r--r--arch/arm/boot/dts/qcom/sdm660.dtsi17
-rw-r--r--arch/arm64/configs/msm-auto-perf_defconfig5
-rw-r--r--arch/arm64/configs/msm-auto_defconfig5
-rw-r--r--drivers/clk/qcom/clk-regmap-mux-div.c22
-rw-r--r--drivers/clk/qcom/clk-regmap-mux-div.h3
-rw-r--r--drivers/gpu/msm/adreno.c5
-rw-r--r--drivers/gpu/msm/adreno_a5xx.c2
-rw-r--r--drivers/i2c/busses/i2c-msm-v2.c49
-rw-r--r--drivers/platform/msm/ipa/ipa_v2/rmnet_ipa.c9
-rw-r--r--drivers/platform/msm/ipa/ipa_v3/rmnet_ipa.c9
-rw-r--r--drivers/power/supply/qcom/smb-lib.c29
-rw-r--r--drivers/soc/qcom/glink_private.h2
-rw-r--r--drivers/soc/qcom/glink_ssr.c18
-rw-r--r--drivers/video/msm/ba/msm_ba.c8
-rw-r--r--drivers/video/msm/ba/msm_ba_common.c18
-rw-r--r--drivers/video/msm/ba/msm_ba_debug.c20
-rw-r--r--drivers/video/msm/ba/msm_v4l2_ba.c43
-rw-r--r--include/linux/i2c/i2c-msm-v2.h4
-rw-r--r--include/media/msm_ba.h3
-rw-r--r--sound/soc/codecs/wsa881x.c6
-rw-r--r--sound/soc/msm/qdsp6v2/msm-dai-q6-v2.c3
-rw-r--r--sound/soc/msm/qdsp6v2/msm-transcode-loopback-q6-v2.c20
-rw-r--r--sound/soc/msm/qdsp6v2/q6asm.c4
27 files changed, 227 insertions, 109 deletions
diff --git a/arch/arm/boot/dts/qcom/msm8996-regulator.dtsi b/arch/arm/boot/dts/qcom/msm8996-regulator.dtsi
index b86542a174da..e1921c3baeb3 100644
--- a/arch/arm/boot/dts/qcom/msm8996-regulator.dtsi
+++ b/arch/arm/boot/dts/qcom/msm8996-regulator.dtsi
@@ -12,6 +12,7 @@
#include <dt-bindings/interrupt-controller/arm-gic.h>
#include <dt-bindings/spmi/spmi.h>
+#include <dt-bindings/regulator/max20010.h>
&rpm_bus {
/* PM8994 S1 + S6 = 2 phase VDD_CX supply */
@@ -1967,4 +1968,16 @@
onnn,restore-reg;
status = "disabled";
};
+
+ max20010_vreg: max20010-regulator@38 {
+ compatible = "maxim,max20010";
+ reg = <0x38>;
+ vin-supply = <&hl7509_en_vreg>;
+ regulator-min-microvolt = <600000>;
+ regulator-max-microvolt = <1270000>;
+ regulator-initial-mode = <MAX20010_OPMODE_SYNC>;
+ maxim,vrange-sel = <0>;
+ maxim,soft-start-slew-rate = <5500>;
+ maxim,dvs-slew-rate = <5500>;
+ };
};
diff --git a/arch/arm/boot/dts/qcom/sdm630-gpu.dtsi b/arch/arm/boot/dts/qcom/sdm630-gpu.dtsi
index e0d51db067c9..72b89a7e7c47 100644
--- a/arch/arm/boot/dts/qcom/sdm630-gpu.dtsi
+++ b/arch/arm/boot/dts/qcom/sdm630-gpu.dtsi
@@ -152,6 +152,7 @@
qcom,gpu-mempool@1 {
reg = <1>;
qcom,mempool-page-size = <65536>;
+ qcom,mempool-allocate;
};
};
diff --git a/arch/arm/boot/dts/qcom/sdm630.dtsi b/arch/arm/boot/dts/qcom/sdm630.dtsi
index 9897900d3fd5..95f28d71334c 100644
--- a/arch/arm/boot/dts/qcom/sdm630.dtsi
+++ b/arch/arm/boot/dts/qcom/sdm630.dtsi
@@ -299,6 +299,23 @@
soc: soc { };
+ firmware: firmware {
+ android {
+ compatible = "android,firmware";
+ fstab {
+ compatible = "android,fstab";
+ vendor {
+ compatible = "android,vendor";
+ dev = "/dev/block/platform/soc/c0c4000.sdhci/by-name/vendor";
+ type = "ext4";
+ mnt_flags = "ro,barrier=1,discard";
+ fsmgr_flags = "wait,slotselect";
+ status = "ok";
+ };
+ };
+ };
+ };
+
reserved-memory {
#address-cells = <2>;
#size-cells = <2>;
diff --git a/arch/arm/boot/dts/qcom/sdm660-gpu.dtsi b/arch/arm/boot/dts/qcom/sdm660-gpu.dtsi
index f5d61d440a27..fecb86dcfdeb 100644
--- a/arch/arm/boot/dts/qcom/sdm660-gpu.dtsi
+++ b/arch/arm/boot/dts/qcom/sdm660-gpu.dtsi
@@ -158,6 +158,7 @@
qcom,gpu-mempool@1 {
reg = <1>;
qcom,mempool-page-size = <65536>;
+ qcom,mempool-allocate;
};
};
diff --git a/arch/arm/boot/dts/qcom/sdm660.dtsi b/arch/arm/boot/dts/qcom/sdm660.dtsi
index d13a359bae2e..a1714beb692e 100644
--- a/arch/arm/boot/dts/qcom/sdm660.dtsi
+++ b/arch/arm/boot/dts/qcom/sdm660.dtsi
@@ -297,6 +297,23 @@
soc: soc { };
+ firmware: firmware {
+ android {
+ compatible = "android,firmware";
+ fstab {
+ compatible = "android,fstab";
+ vendor {
+ compatible = "android,vendor";
+ dev = "/dev/block/platform/soc/c0c4000.sdhci/by-name/vendor";
+ type = "ext4";
+ mnt_flags = "ro,barrier=1,discard";
+ fsmgr_flags = "wait,slotselect";
+ status = "ok";
+ };
+ };
+ };
+ };
+
reserved-memory {
#address-cells = <2>;
#size-cells = <2>;
diff --git a/arch/arm64/configs/msm-auto-perf_defconfig b/arch/arm64/configs/msm-auto-perf_defconfig
index dbb75e313510..efdfb4da2de2 100644
--- a/arch/arm64/configs/msm-auto-perf_defconfig
+++ b/arch/arm64/configs/msm-auto-perf_defconfig
@@ -308,7 +308,9 @@ CONFIG_HW_RANDOM=y
CONFIG_HW_RANDOM_MSM_LEGACY=y
CONFIG_MSM_ADSPRPC=y
CONFIG_MSM_RDBG=m
+CONFIG_I2C=y
CONFIG_I2C_CHARDEV=y
+CONFIG_I2C_MUX=y
CONFIG_I2C_QUP=y
CONFIG_I2C_MSM_V2=y
CONFIG_SLIMBUS_MSM_NGD=y
@@ -369,7 +371,10 @@ CONFIG_MSM_SDE_ROTATOR=y
CONFIG_MSM_AIS=y
CONFIG_MSM_AIS_DEBUG=y
CONFIG_MSM_AIS_CAMERA_SENSOR=y
+# CONFIG_MEDIA_SUBDRV_AUTOSELECT is not set
+CONFIG_VIDEO_ADV7481=y
CONFIG_QCOM_KGSL=y
+CONFIG_MSM_BA_V4L2=y
CONFIG_FB=y
CONFIG_FB_MSM=y
CONFIG_FB_MSM_MDSS=y
diff --git a/arch/arm64/configs/msm-auto_defconfig b/arch/arm64/configs/msm-auto_defconfig
index 553677803e42..e9ef95772ebd 100644
--- a/arch/arm64/configs/msm-auto_defconfig
+++ b/arch/arm64/configs/msm-auto_defconfig
@@ -311,7 +311,9 @@ CONFIG_HW_RANDOM=y
CONFIG_HW_RANDOM_MSM_LEGACY=y
CONFIG_MSM_ADSPRPC=y
CONFIG_MSM_RDBG=m
+CONFIG_I2C=y
CONFIG_I2C_CHARDEV=y
+CONFIG_I2C_MUX=y
CONFIG_I2C_QUP=y
CONFIG_I2C_MSM_V2=y
CONFIG_SLIMBUS_MSM_NGD=y
@@ -373,7 +375,10 @@ CONFIG_MSM_SDE_ROTATOR=y
CONFIG_MSM_AIS=y
CONFIG_MSM_AIS_DEBUG=y
CONFIG_MSM_AIS_CAMERA_SENSOR=y
+# CONFIG_MEDIA_SUBDRV_AUTOSELECT is not set
+CONFIG_VIDEO_ADV7481=y
CONFIG_QCOM_KGSL=y
+CONFIG_MSM_BA_V4L2=y
CONFIG_FB=y
CONFIG_FB_MSM=y
CONFIG_FB_MSM_MDSS=y
diff --git a/drivers/clk/qcom/clk-regmap-mux-div.c b/drivers/clk/qcom/clk-regmap-mux-div.c
index 9593aefb0bf6..942a68e2a650 100644
--- a/drivers/clk/qcom/clk-regmap-mux-div.c
+++ b/drivers/clk/qcom/clk-regmap-mux-div.c
@@ -1,6 +1,6 @@
/*
* Copyright (c) 2015, Linaro Limited
- * Copyright (c) 2014, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2014, 2017, The Linux Foundation. All rights reserved.
*
* This software is licensed under the terms of the GNU General Public
* License version 2, as published by the Free Software Foundation, and
@@ -64,20 +64,26 @@ int __mux_div_set_src_div(struct clk_regmap_mux_div *md, u32 src, u32 div)
return -EBUSY;
}
-static void __mux_div_get_src_div(struct clk_regmap_mux_div *md, u32 *src,
+int mux_div_get_src_div(struct clk_regmap_mux_div *md, u32 *src,
u32 *div)
{
+ int ret = 0;
u32 val, __div, __src;
const char *name = clk_hw_get_name(&md->clkr.hw);
- regmap_read(md->clkr.regmap, CMD_RCGR + md->reg_offset, &val);
+ ret = regmap_read(md->clkr.regmap, CMD_RCGR + md->reg_offset, &val);
+ if (ret)
+ return ret;
if (val & CMD_RCGR_DIRTY_CFG) {
pr_err("%s: RCG configuration is pending\n", name);
- return;
+ return -EBUSY;
}
- regmap_read(md->clkr.regmap, CFG_RCGR + md->reg_offset, &val);
+ ret = regmap_read(md->clkr.regmap, CFG_RCGR + md->reg_offset, &val);
+ if (ret)
+ return ret;
+
__src = (val >> md->src_shift);
__src &= BIT(md->src_width) - 1;
*src = __src;
@@ -85,6 +91,8 @@ static void __mux_div_get_src_div(struct clk_regmap_mux_div *md, u32 *src,
__div = (val >> md->hid_shift);
__div &= BIT(md->hid_width) - 1;
*div = __div;
+
+ return ret;
}
static int mux_div_enable(struct clk_hw *hw)
@@ -181,7 +189,7 @@ static u8 mux_div_get_parent(struct clk_hw *hw)
const char *name = clk_hw_get_name(hw);
u32 i, div, src = 0;
- __mux_div_get_src_div(md, &src, &div);
+ mux_div_get_src_div(md, &src, &div);
for (i = 0; i < clk_hw_get_num_parents(hw); i++)
if (src == md->parent_map[i].cfg)
@@ -222,7 +230,7 @@ static unsigned long mux_div_recalc_rate(struct clk_hw *hw, unsigned long prate)
int i, num_parents = clk_hw_get_num_parents(hw);
const char *name = clk_hw_get_name(hw);
- __mux_div_get_src_div(md, &src, &div);
+ mux_div_get_src_div(md, &src, &div);
for (i = 0; i < num_parents; i++)
if (src == md->parent_map[i].cfg) {
struct clk_hw *p = clk_hw_get_parent_by_index(hw, i);
diff --git a/drivers/clk/qcom/clk-regmap-mux-div.h b/drivers/clk/qcom/clk-regmap-mux-div.h
index 6fac5c54a824..63a696a96033 100644
--- a/drivers/clk/qcom/clk-regmap-mux-div.h
+++ b/drivers/clk/qcom/clk-regmap-mux-div.h
@@ -1,6 +1,6 @@
/*
* Copyright (c) 2015, Linaro Limited
- * Copyright (c) 2014, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2014, 2017, The Linux Foundation. All rights reserved.
*
* This software is licensed under the terms of the GNU General Public
* License version 2, as published by the Free Software Foundation, and
@@ -61,5 +61,6 @@ struct clk_regmap_mux_div {
extern const struct clk_ops clk_regmap_mux_div_ops;
int __mux_div_set_src_div(struct clk_regmap_mux_div *md, u32 src, u32 div);
+int mux_div_get_src_div(struct clk_regmap_mux_div *md, u32 *src, u32 *div);
#endif
diff --git a/drivers/gpu/msm/adreno.c b/drivers/gpu/msm/adreno.c
index 89c7590ad121..6521ec01413e 100644
--- a/drivers/gpu/msm/adreno.c
+++ b/drivers/gpu/msm/adreno.c
@@ -2139,6 +2139,11 @@ static int adreno_soft_reset(struct kgsl_device *device)
/* Reset the GPU */
_soft_reset(adreno_dev);
+ /* Clear the busy_data stats - we're starting over from scratch */
+ adreno_dev->busy_data.gpu_busy = 0;
+ adreno_dev->busy_data.vbif_ram_cycles = 0;
+ adreno_dev->busy_data.vbif_starved_ram = 0;
+
/* Set the page table back to the default page table */
adreno_ringbuffer_set_global(adreno_dev, 0);
kgsl_mmu_set_pt(&device->mmu, device->mmu.defaultpagetable);
diff --git a/drivers/gpu/msm/adreno_a5xx.c b/drivers/gpu/msm/adreno_a5xx.c
index dcc6651710fe..0715022be6e3 100644
--- a/drivers/gpu/msm/adreno_a5xx.c
+++ b/drivers/gpu/msm/adreno_a5xx.c
@@ -59,7 +59,7 @@ static const struct adreno_vbif_platform a5xx_vbif_platforms[] = {
{ adreno_is_a530, a530_vbif },
{ adreno_is_a512, a540_vbif },
{ adreno_is_a510, a530_vbif },
- { adreno_is_a508, a540_vbif },
+ { adreno_is_a508, a530_vbif },
{ adreno_is_a505, a530_vbif },
{ adreno_is_a506, a530_vbif },
};
diff --git a/drivers/i2c/busses/i2c-msm-v2.c b/drivers/i2c/busses/i2c-msm-v2.c
index 7f98d9f527b9..1f042fa56eea 100644
--- a/drivers/i2c/busses/i2c-msm-v2.c
+++ b/drivers/i2c/busses/i2c-msm-v2.c
@@ -1310,7 +1310,8 @@ static int i2c_msm_dma_xfer_process(struct i2c_msm_ctrl *ctrl)
ret = i2c_msm_xfer_wait_for_completion(ctrl, &ctrl->xfer.complete);
if (!ret && ctrl->xfer.rx_cnt)
- i2c_msm_xfer_wait_for_completion(ctrl, &ctrl->xfer.rx_complete);
+ ret = i2c_msm_xfer_wait_for_completion(ctrl,
+ &ctrl->xfer.rx_complete);
dma_xfer_end:
/* free scatter-gather lists */
@@ -1716,9 +1717,7 @@ static irqreturn_t i2c_msm_qup_isr(int irq, void *devid)
void __iomem *base = ctrl->rsrcs.base;
struct i2c_msm_xfer *xfer = &ctrl->xfer;
struct i2c_msm_xfer_mode_blk *blk = &ctrl->xfer.blk;
- u32 i2c_status = 0;
u32 err_flags = 0;
- u32 qup_op = 0;
u32 clr_flds = 0;
bool log_event = false;
bool signal_complete = false;
@@ -1731,24 +1730,24 @@ static irqreturn_t i2c_msm_qup_isr(int irq, void *devid)
return IRQ_HANDLED;
}
- i2c_status = readl_relaxed(base + QUP_I2C_STATUS);
- err_flags = readl_relaxed(base + QUP_ERROR_FLAGS);
- qup_op = readl_relaxed(base + QUP_OPERATIONAL);
+ ctrl->i2c_sts_reg = readl_relaxed(base + QUP_I2C_STATUS);
+ err_flags = readl_relaxed(base + QUP_ERROR_FLAGS);
+ ctrl->qup_op_reg = readl_relaxed(base + QUP_OPERATIONAL);
- if (i2c_status & QUP_MSTR_STTS_ERR_MASK) {
+ if (ctrl->i2c_sts_reg & QUP_MSTR_STTS_ERR_MASK) {
signal_complete = true;
log_event = true;
/*
* If there is more than 1 error here, last one sticks.
* The order of the error set here matters.
*/
- if (i2c_status & QUP_ARB_LOST)
+ if (ctrl->i2c_sts_reg & QUP_ARB_LOST)
ctrl->xfer.err = I2C_MSM_ERR_ARB_LOST;
- if (i2c_status & QUP_BUS_ERROR)
+ if (ctrl->i2c_sts_reg & QUP_BUS_ERROR)
ctrl->xfer.err = I2C_MSM_ERR_BUS_ERR;
- if (i2c_status & QUP_PACKET_NACKED)
+ if (ctrl->i2c_sts_reg & QUP_PACKET_NACKED)
ctrl->xfer.err = I2C_MSM_ERR_NACK;
}
@@ -1761,7 +1760,7 @@ static irqreturn_t i2c_msm_qup_isr(int irq, void *devid)
i2c_msm_dbg_qup_reg_dump(ctrl);
/* clear interrupts fields */
- clr_flds = i2c_status & QUP_MSTR_STTS_ERR_MASK;
+ clr_flds = ctrl->i2c_sts_reg & QUP_MSTR_STTS_ERR_MASK;
if (clr_flds) {
writel_relaxed(clr_flds, base + QUP_I2C_STATUS);
need_wmb = true;
@@ -1773,7 +1772,9 @@ static irqreturn_t i2c_msm_qup_isr(int irq, void *devid)
need_wmb = true;
}
- clr_flds = qup_op & (QUP_OUTPUT_SERVICE_FLAG | QUP_INPUT_SERVICE_FLAG);
+ clr_flds = ctrl->qup_op_reg &
+ (QUP_OUTPUT_SERVICE_FLAG |
+ QUP_INPUT_SERVICE_FLAG);
if (clr_flds) {
writel_relaxed(clr_flds, base + QUP_OPERATIONAL);
need_wmb = true;
@@ -1814,25 +1815,25 @@ static irqreturn_t i2c_msm_qup_isr(int irq, void *devid)
/* handle data completion */
if (xfer->mode_id == I2C_MSM_XFER_MODE_BLOCK) {
/* block ready for writing */
- if (qup_op & QUP_OUTPUT_SERVICE_FLAG) {
+ if (ctrl->qup_op_reg & QUP_OUTPUT_SERVICE_FLAG) {
log_event = true;
- if (qup_op & QUP_OUT_BLOCK_WRITE_REQ)
+ if (ctrl->qup_op_reg & QUP_OUT_BLOCK_WRITE_REQ)
complete(&blk->wait_tx_blk);
- if ((qup_op & blk->complete_mask)
+ if ((ctrl->qup_op_reg & blk->complete_mask)
== blk->complete_mask) {
log_event = true;
signal_complete = true;
}
}
/* block ready for reading */
- if (qup_op & QUP_INPUT_SERVICE_FLAG) {
+ if (ctrl->qup_op_reg & QUP_INPUT_SERVICE_FLAG) {
log_event = true;
complete(&blk->wait_rx_blk);
}
} else {
/* for FIFO/DMA Mode*/
- if (qup_op & QUP_MAX_INPUT_DONE_FLAG) {
+ if (ctrl->qup_op_reg & QUP_MAX_INPUT_DONE_FLAG) {
log_event = true;
/*
* If last transaction is an input then the entire
@@ -1850,7 +1851,7 @@ static irqreturn_t i2c_msm_qup_isr(int irq, void *devid)
* here QUP_OUTPUT_SERVICE_FLAG and assumes that
* QUP_MAX_OUTPUT_DONE_FLAG.
*/
- if (qup_op & (QUP_OUTPUT_SERVICE_FLAG |
+ if (ctrl->qup_op_reg & (QUP_OUTPUT_SERVICE_FLAG |
QUP_MAX_OUTPUT_DONE_FLAG)) {
log_event = true;
/*
@@ -1863,13 +1864,11 @@ static irqreturn_t i2c_msm_qup_isr(int irq, void *devid)
}
isr_end:
- if (ctrl->xfer.err || (ctrl->dbgfs.dbg_lvl >= MSM_DBG))
- i2c_msm_dbg_dump_diag(ctrl, true, i2c_status, qup_op);
-
if (log_event || (ctrl->dbgfs.dbg_lvl >= MSM_DBG))
i2c_msm_prof_evnt_add(ctrl, MSM_PROF,
I2C_MSM_IRQ_END,
- i2c_status, qup_op, err_flags);
+ ctrl->i2c_sts_reg, ctrl->qup_op_reg,
+ err_flags);
if (signal_complete)
complete(&ctrl->xfer.complete);
@@ -2078,8 +2077,12 @@ static int i2c_msm_xfer_wait_for_completion(struct i2c_msm_ctrl *ctrl,
xfer->timeout, time_left, 0);
} else {
/* return an error if one detected by ISR */
- if (xfer->err)
+ if (ctrl->xfer.err ||
+ (ctrl->dbgfs.dbg_lvl >= MSM_DBG)) {
+ i2c_msm_dbg_dump_diag(ctrl, true,
+ ctrl->i2c_sts_reg, ctrl->qup_op_reg);
ret = -(xfer->err);
+ }
i2c_msm_prof_evnt_add(ctrl, MSM_DBG, I2C_MSM_COMPLT_OK,
xfer->timeout, time_left, 0);
}
diff --git a/drivers/platform/msm/ipa/ipa_v2/rmnet_ipa.c b/drivers/platform/msm/ipa/ipa_v2/rmnet_ipa.c
index ce899ef9c531..c59c597f39bf 100644
--- a/drivers/platform/msm/ipa/ipa_v2/rmnet_ipa.c
+++ b/drivers/platform/msm/ipa/ipa_v2/rmnet_ipa.c
@@ -2855,6 +2855,10 @@ int rmnet_ipa_query_tethering_stats_modem(
kfree(req);
kfree(resp);
return rc;
+ } else if (data == NULL) {
+ kfree(req);
+ kfree(resp);
+ return 0;
}
if (resp->dl_dst_pipe_stats_list_valid) {
@@ -3038,8 +3042,11 @@ int rmnet_ipa_query_tethering_stats_all(
int rmnet_ipa_reset_tethering_stats(struct wan_ioctl_reset_tether_stats *data)
{
enum ipa_upstream_type upstream_type;
+ struct wan_ioctl_query_tether_stats tether_stats;
int rc = 0;
+ memset(&tether_stats, 0, sizeof(struct wan_ioctl_query_tether_stats));
+
/* get IPA backhaul type */
upstream_type = find_upstream_type(data->upstreamIface);
@@ -3057,7 +3064,7 @@ int rmnet_ipa_reset_tethering_stats(struct wan_ioctl_reset_tether_stats *data)
} else {
IPAWANDBG(" reset modem-backhaul stats\n");
rc = rmnet_ipa_query_tethering_stats_modem(
- NULL, true);
+ &tether_stats, true);
if (rc) {
IPAWANERR("reset MODEM stats failed\n");
return rc;
diff --git a/drivers/platform/msm/ipa/ipa_v3/rmnet_ipa.c b/drivers/platform/msm/ipa/ipa_v3/rmnet_ipa.c
index 03dbcbb059aa..df5454e4776c 100644
--- a/drivers/platform/msm/ipa/ipa_v3/rmnet_ipa.c
+++ b/drivers/platform/msm/ipa/ipa_v3/rmnet_ipa.c
@@ -2982,6 +2982,10 @@ static int rmnet_ipa3_query_tethering_stats_modem(
kfree(req);
kfree(resp);
return rc;
+ } else if (data == NULL) {
+ kfree(req);
+ kfree(resp);
+ return 0;
}
if (resp->dl_dst_pipe_stats_list_valid) {
@@ -3165,8 +3169,11 @@ int rmnet_ipa3_query_tethering_stats_all(
int rmnet_ipa3_reset_tethering_stats(struct wan_ioctl_reset_tether_stats *data)
{
enum ipa_upstream_type upstream_type;
+ struct wan_ioctl_query_tether_stats tether_stats;
int rc = 0;
+ memset(&tether_stats, 0, sizeof(struct wan_ioctl_query_tether_stats));
+
/* get IPA backhaul type */
upstream_type = find_upstream_type(data->upstreamIface);
@@ -3184,7 +3191,7 @@ int rmnet_ipa3_reset_tethering_stats(struct wan_ioctl_reset_tether_stats *data)
} else {
IPAWANERR(" reset modem-backhaul stats\n");
rc = rmnet_ipa3_query_tethering_stats_modem(
- NULL, true);
+ &tether_stats, true);
if (rc) {
IPAWANERR("reset MODEM stats failed\n");
return rc;
diff --git a/drivers/power/supply/qcom/smb-lib.c b/drivers/power/supply/qcom/smb-lib.c
index 21bd718f0848..ef62631f6d98 100644
--- a/drivers/power/supply/qcom/smb-lib.c
+++ b/drivers/power/supply/qcom/smb-lib.c
@@ -737,7 +737,7 @@ int smblib_rerun_apsd_if_required(struct smb_charger *chg)
return 0;
}
-static int smblib_get_pulse_cnt(struct smb_charger *chg, int *count)
+static int smblib_get_hw_pulse_cnt(struct smb_charger *chg, int *count)
{
int rc;
u8 val[2];
@@ -771,6 +771,24 @@ static int smblib_get_pulse_cnt(struct smb_charger *chg, int *count)
return 0;
}
+static int smblib_get_pulse_cnt(struct smb_charger *chg, int *count)
+{
+ int rc;
+
+ /* Use software based pulse count if HW INOV is disabled */
+ if (get_effective_result(chg->hvdcp_hw_inov_dis_votable) > 0) {
+ *count = chg->pulse_cnt;
+ return 0;
+ }
+
+ /* Use h/w pulse count if autonomous mode is enabled */
+ rc = smblib_get_hw_pulse_cnt(chg, count);
+ if (rc < 0)
+ smblib_err(chg, "failed to read h/w pulse count rc=%d\n", rc);
+
+ return rc;
+}
+
#define USBIN_25MA 25000
#define USBIN_100MA 100000
#define USBIN_150MA 150000
@@ -1127,7 +1145,7 @@ static int smblib_hvdcp_hw_inov_dis_vote_callback(struct votable *votable,
* the pulse count register get zeroed when autonomous mode is
* disabled. Track that in variables before disabling
*/
- rc = smblib_get_pulse_cnt(chg, &chg->pulse_cnt);
+ rc = smblib_get_hw_pulse_cnt(chg, &chg->pulse_cnt);
if (rc < 0) {
pr_err("failed to read QC_PULSE_COUNT_STATUS_REG rc=%d\n",
rc);
@@ -2303,7 +2321,6 @@ int smblib_get_prop_input_voltage_settled(struct smb_charger *chg,
{
const struct apsd_result *apsd_result = smblib_get_apsd_result(chg);
int rc, pulses;
- u8 stat;
val->intval = MICRO_5V;
if (apsd_result == NULL) {
@@ -2313,13 +2330,12 @@ int smblib_get_prop_input_voltage_settled(struct smb_charger *chg,
switch (apsd_result->pst) {
case POWER_SUPPLY_TYPE_USB_HVDCP_3:
- rc = smblib_read(chg, QC_PULSE_COUNT_STATUS_REG, &stat);
+ rc = smblib_get_pulse_cnt(chg, &pulses);
if (rc < 0) {
smblib_err(chg,
"Couldn't read QC_PULSE_COUNT rc=%d\n", rc);
return 0;
}
- pulses = (stat & QC_PULSE_COUNT_MASK);
val->intval = MICRO_5V + HVDCP3_STEP_UV * pulses;
break;
default:
@@ -3296,13 +3312,12 @@ static void smblib_hvdcp_adaptive_voltage_change(struct smb_charger *chg)
}
if (chg->real_charger_type == POWER_SUPPLY_TYPE_USB_HVDCP_3) {
- rc = smblib_read(chg, QC_PULSE_COUNT_STATUS_REG, &stat);
+ rc = smblib_get_pulse_cnt(chg, &pulses);
if (rc < 0) {
smblib_err(chg,
"Couldn't read QC_PULSE_COUNT rc=%d\n", rc);
return;
}
- pulses = (stat & QC_PULSE_COUNT_MASK);
if (pulses < QC3_PULSES_FOR_6V)
smblib_set_opt_freq_buck(chg,
diff --git a/drivers/soc/qcom/glink_private.h b/drivers/soc/qcom/glink_private.h
index 24053c853a83..bb794f45cff7 100644
--- a/drivers/soc/qcom/glink_private.h
+++ b/drivers/soc/qcom/glink_private.h
@@ -745,7 +745,6 @@ struct subsys_info {
* ssr_name: Name of the subsystem recognized by the SSR framework
* edge: Name of the G-Link edge
* xprt: Name of the G-Link transport
- * restarted: Indicates whether a restart has been triggered for this edge
* cb_data: Private callback data structure for notification functions
* notify_list_node: used to chain this structure in the notify list
*/
@@ -753,7 +752,6 @@ struct subsys_info_leaf {
const char *ssr_name;
const char *edge;
const char *xprt;
- bool restarted;
struct ssr_notify_data *cb_data;
struct list_head notify_list_node;
};
diff --git a/drivers/soc/qcom/glink_ssr.c b/drivers/soc/qcom/glink_ssr.c
index 7e23b0bc3852..c28eeab92fed 100644
--- a/drivers/soc/qcom/glink_ssr.c
+++ b/drivers/soc/qcom/glink_ssr.c
@@ -22,7 +22,6 @@
#include <linux/random.h>
#include <soc/qcom/glink.h>
#include <soc/qcom/subsystem_notif.h>
-#include <soc/qcom/subsystem_restart.h>
#include "glink_private.h"
#define GLINK_SSR_REPLY_TIMEOUT HZ
@@ -608,13 +607,9 @@ int notify_for_subsystem(struct subsys_info *ss_info)
kfree(do_cleanup_data);
ss_leaf_entry->cb_data->do_cleanup_data = NULL;
- if (strcmp(ss_leaf_entry->ssr_name, "rpm")) {
- subsystem_restart(ss_leaf_entry->ssr_name);
- ss_leaf_entry->restarted = true;
- } else {
+ if (!strcmp(ss_leaf_entry->ssr_name, "rpm"))
panic("%s: Could not queue intent for RPM!\n",
__func__);
- }
atomic_dec(&responses_remaining);
kref_put(&ss_leaf_entry->cb_data->cb_kref,
cb_data_release);
@@ -639,13 +634,9 @@ int notify_for_subsystem(struct subsys_info *ss_info)
kfree(do_cleanup_data);
ss_leaf_entry->cb_data->do_cleanup_data = NULL;
- if (strcmp(ss_leaf_entry->ssr_name, "rpm")) {
- subsystem_restart(ss_leaf_entry->ssr_name);
- ss_leaf_entry->restarted = true;
- } else {
+ if (!strcmp(ss_leaf_entry->ssr_name, "rpm"))
panic("%s: glink_tx() to RPM failed!\n",
__func__);
- }
atomic_dec(&responses_remaining);
kref_put(&ss_leaf_entry->cb_data->cb_kref,
cb_data_release);
@@ -687,11 +678,7 @@ int notify_for_subsystem(struct subsys_info *ss_info)
/* Check for RPM, as it can't be restarted */
if (!strcmp(ss_leaf_entry->ssr_name, "rpm"))
panic("%s: RPM failed to respond!\n", __func__);
- else if (!ss_leaf_entry->restarted)
- subsystem_restart(ss_leaf_entry->ssr_name);
}
- ss_leaf_entry->restarted = false;
-
if (!IS_ERR_OR_NULL(ss_leaf_entry->cb_data))
ss_leaf_entry->cb_data->responded = false;
kref_put(&ss_leaf_entry->cb_data->cb_kref, cb_data_release);
@@ -1011,7 +998,6 @@ static int glink_ssr_probe(struct platform_device *pdev)
ss_info_leaf->ssr_name = subsys_name;
ss_info_leaf->edge = edge;
ss_info_leaf->xprt = xprt;
- ss_info_leaf->restarted = false;
list_add_tail(&ss_info_leaf->notify_list_node,
&ss_info->notify_list);
ss_info->notify_list_len++;
diff --git a/drivers/video/msm/ba/msm_ba.c b/drivers/video/msm/ba/msm_ba.c
index 3e0838115ca6..8d1459088b80 100644
--- a/drivers/video/msm/ba/msm_ba.c
+++ b/drivers/video/msm/ba/msm_ba.c
@@ -53,7 +53,7 @@ int msm_ba_querycap(void *instance, struct v4l2_capability *cap)
if (!inst || !cap) {
dprintk(BA_ERR,
- "Invalid input, inst = 0x%p, cap = 0x%p", inst, cap);
+ "Invalid input, inst = 0x%pK, cap = 0x%pK", inst, cap);
return -EINVAL;
}
@@ -618,7 +618,7 @@ int msm_ba_save_restore_input(void *instance, enum msm_ba_save_restore_ip sr)
}
EXPORT_SYMBOL(msm_ba_save_restore_input);
-void msm_ba_release_subdev_node(struct video_device *vdev)
+static void msm_ba_release_subdev_node(struct video_device *vdev)
{
struct v4l2_subdev *sd = video_get_drvdata(vdev);
@@ -632,7 +632,7 @@ static int msm_ba_register_v4l2_subdev(struct v4l2_device *v4l2_dev,
struct video_device *vdev;
int rc = 0;
- dprintk(BA_DBG, "Enter %s: v4l2_dev 0x%p, v4l2_subdev 0x%p",
+ dprintk(BA_DBG, "Enter %s: v4l2_dev 0x%pK, v4l2_subdev 0x%pK",
__func__, v4l2_dev, sd);
if (NULL == v4l2_dev || NULL == sd || !sd->name[0]) {
dprintk(BA_ERR, "Invalid input");
@@ -884,7 +884,7 @@ int msm_ba_close(void *instance)
debugfs_remove_recursive(inst->debugfs_root);
- dprintk(BA_DBG, "Closed BA instance: %p", inst);
+ dprintk(BA_DBG, "Closed BA instance: %pK", inst);
kfree(inst);
return rc;
diff --git a/drivers/video/msm/ba/msm_ba_common.c b/drivers/video/msm/ba/msm_ba_common.c
index cc8eb2da3e3b..1306fca46652 100644
--- a/drivers/video/msm/ba/msm_ba_common.c
+++ b/drivers/video/msm/ba/msm_ba_common.c
@@ -509,20 +509,20 @@ static const struct v4l2_ctrl_ops msm_ba_ctrl_ops = {
.s_ctrl = msm_ba_op_s_ctrl,
};
-const struct v4l2_ctrl_ops *msm_ba_get_ctrl_ops(void)
-{
- return &msm_ba_ctrl_ops;
-}
-
static struct v4l2_ctrl **msm_ba_get_super_cluster(struct msm_ba_inst *inst,
int *size)
{
int c = 0;
int sz = 0;
- struct v4l2_ctrl **cluster = kmalloc(sizeof(struct v4l2_ctrl *) *
+ struct v4l2_ctrl **cluster = NULL;
+
+ if (!size || !inst)
+ return NULL;
+
+ cluster = kmalloc(sizeof(struct v4l2_ctrl *) *
BA_NUM_CTRLS, GFP_KERNEL);
- if (!size || !cluster || !inst)
+ if (!cluster)
return NULL;
for (c = 0; c < BA_NUM_CTRLS; c++)
@@ -539,10 +539,12 @@ static struct v4l2_ctrl **msm_ba_get_super_cluster(struct msm_ba_inst *inst,
int msm_ba_ctrl_init(struct msm_ba_inst *inst)
{
int idx = 0;
- struct v4l2_ctrl_config ctrl_cfg = {0};
+ struct v4l2_ctrl_config ctrl_cfg;
int rc = 0;
int cluster_size = 0;
+ memset(&ctrl_cfg, 0x00, sizeof(struct v4l2_ctrl_config));
+
if (!inst) {
dprintk(BA_ERR, "%s - invalid instance", __func__);
return -EINVAL;
diff --git a/drivers/video/msm/ba/msm_ba_debug.c b/drivers/video/msm/ba/msm_ba_debug.c
index aa5109eb8e64..b57f4c94e18b 100644
--- a/drivers/video/msm/ba/msm_ba_debug.c
+++ b/drivers/video/msm/ba/msm_ba_debug.c
@@ -60,7 +60,7 @@ static ssize_t dev_info_read(struct file *file, char __user *buf,
ssize_t size = 0;
if (!dev_ctxt) {
- dprintk(BA_ERR, "Invalid params, dev: 0x%p", dev_ctxt);
+ dprintk(BA_ERR, "Invalid params, dev: 0x%pK", dev_ctxt);
return 0;
}
@@ -70,7 +70,7 @@ static ssize_t dev_info_read(struct file *file, char __user *buf,
INIT_DBG_BUF(dbg_buf);
write_str(dbg_buf, "===============================");
- write_str(dbg_buf, "DEV: 0x%p", dev_ctxt);
+ write_str(dbg_buf, "DEV: 0x%pK", dev_ctxt);
write_str(dbg_buf, "===============================");
write_str(dbg_buf, "state: %d", dev_ctxt->state);
@@ -102,7 +102,7 @@ struct dentry *msm_ba_debugfs_init_drv(void)
struct dentry *f = debugfs_create_##__type(__name, S_IRUGO | S_IWUSR, \
dir, __value); \
if (IS_ERR_OR_NULL(f)) { \
- dprintk(BA_ERR, "Failed creating debugfs file '%pd/%s'", \
+ dprintk(BA_ERR, "Failed creating debugfs file '%pKd/%s'", \
dir, __name); \
f = NULL; \
} \
@@ -135,11 +135,11 @@ struct dentry *msm_ba_debugfs_init_dev(struct msm_ba_dev *dev_ctxt,
char debugfs_name[MAX_DEBUGFS_NAME];
if (!dev_ctxt) {
- dprintk(BA_ERR, "Invalid params, core: %p", dev_ctxt);
+ dprintk(BA_ERR, "Invalid params, core: %pK", dev_ctxt);
goto failed_create_dir;
}
- snprintf(debugfs_name, MAX_DEBUGFS_NAME, "dev_%p", dev_ctxt);
+ snprintf(debugfs_name, MAX_DEBUGFS_NAME, "dev_%pK", dev_ctxt);
dir = debugfs_create_dir(debugfs_name, parent);
if (!dir) {
dprintk(BA_ERR, "Failed to create debugfs for msm_ba");
@@ -168,7 +168,7 @@ static ssize_t inst_info_read(struct file *file, char __user *buf,
ssize_t size = 0;
if (!inst) {
- dprintk(BA_ERR, "Invalid params, dev: %p", inst);
+ dprintk(BA_ERR, "Invalid params, dev: %pK", inst);
return 0;
}
@@ -178,10 +178,10 @@ static ssize_t inst_info_read(struct file *file, char __user *buf,
INIT_DBG_BUF(dbg_buf);
write_str(dbg_buf, "===============================");
- write_str(dbg_buf, "INSTANCE: %p (%s)", inst,
+ write_str(dbg_buf, "INSTANCE: %pK (%s)", inst,
"BA device");
write_str(dbg_buf, "===============================");
- write_str(dbg_buf, "dev: %p", inst->dev_ctxt);
+ write_str(dbg_buf, "dev: %pK", inst->dev_ctxt);
write_str(dbg_buf, "state: %d", inst->state);
size = simple_read_from_buffer(buf, count, ppos,
@@ -204,10 +204,10 @@ struct dentry *msm_ba_debugfs_init_inst(struct msm_ba_inst *inst,
char debugfs_name[MAX_DEBUGFS_NAME];
if (!inst) {
- dprintk(BA_ERR, "Invalid params, inst: %p", inst);
+ dprintk(BA_ERR, "Invalid params, inst: %pK", inst);
goto failed_create_dir;
}
- snprintf(debugfs_name, MAX_DEBUGFS_NAME, "inst_%p", inst);
+ snprintf(debugfs_name, MAX_DEBUGFS_NAME, "inst_%pK", inst);
dir = debugfs_create_dir(debugfs_name, parent);
if (!dir) {
dprintk(BA_ERR, "Failed to create debugfs for msm_ba");
diff --git a/drivers/video/msm/ba/msm_v4l2_ba.c b/drivers/video/msm/ba/msm_v4l2_ba.c
index 0cd3fc3b238f..89fc08dd3c33 100644
--- a/drivers/video/msm/ba/msm_v4l2_ba.c
+++ b/drivers/video/msm/ba/msm_v4l2_ba.c
@@ -37,7 +37,7 @@ struct ba_ctxt *msm_ba_get_ba_context(void)
return gp_ba_ctxt;
}
-void msm_ba_set_ba_context(struct ba_ctxt *ba_ctxt)
+static void msm_ba_set_ba_context(struct ba_ctxt *ba_ctxt)
{
gp_ba_ctxt = ba_ctxt;
}
@@ -83,7 +83,7 @@ static int msm_ba_v4l2_querycap(struct file *filp, void *fh,
return msm_ba_querycap((void *)ba_inst, cap);
}
-int msm_ba_v4l2_enum_input(struct file *file, void *fh,
+static int msm_ba_v4l2_enum_input(struct file *file, void *fh,
struct v4l2_input *input)
{
struct msm_ba_inst *ba_inst = get_ba_inst(file, fh);
@@ -91,7 +91,7 @@ int msm_ba_v4l2_enum_input(struct file *file, void *fh,
return msm_ba_enum_input((void *)ba_inst, input);
}
-int msm_ba_v4l2_g_input(struct file *file, void *fh,
+static int msm_ba_v4l2_g_input(struct file *file, void *fh,
unsigned int *index)
{
struct msm_ba_inst *ba_inst = get_ba_inst(file, fh);
@@ -99,7 +99,7 @@ int msm_ba_v4l2_g_input(struct file *file, void *fh,
return msm_ba_g_input((void *)ba_inst, index);
}
-int msm_ba_v4l2_s_input(struct file *file, void *fh,
+static int msm_ba_v4l2_s_input(struct file *file, void *fh,
unsigned int index)
{
struct msm_ba_inst *ba_inst = get_ba_inst(file, fh);
@@ -107,7 +107,7 @@ int msm_ba_v4l2_s_input(struct file *file, void *fh,
return msm_ba_s_input((void *)ba_inst, index);
}
-int msm_ba_v4l2_enum_output(struct file *file, void *fh,
+static int msm_ba_v4l2_enum_output(struct file *file, void *fh,
struct v4l2_output *output)
{
struct msm_ba_inst *ba_inst = get_ba_inst(file, fh);
@@ -115,7 +115,7 @@ int msm_ba_v4l2_enum_output(struct file *file, void *fh,
return msm_ba_enum_output((void *)ba_inst, output);
}
-int msm_ba_v4l2_g_output(struct file *file, void *fh,
+static int msm_ba_v4l2_g_output(struct file *file, void *fh,
unsigned int *index)
{
struct msm_ba_inst *ba_inst = get_ba_inst(file, fh);
@@ -123,7 +123,7 @@ int msm_ba_v4l2_g_output(struct file *file, void *fh,
return msm_ba_g_output((void *)ba_inst, index);
}
-int msm_ba_v4l2_s_output(struct file *file, void *fh,
+static int msm_ba_v4l2_s_output(struct file *file, void *fh,
unsigned int index)
{
struct msm_ba_inst *ba_inst = get_ba_inst(file, fh);
@@ -131,7 +131,7 @@ int msm_ba_v4l2_s_output(struct file *file, void *fh,
return msm_ba_s_output((void *)ba_inst, index);
}
-int msm_ba_v4l2_enum_fmt(struct file *file, void *fh,
+static int msm_ba_v4l2_enum_fmt(struct file *file, void *fh,
struct v4l2_fmtdesc *f)
{
struct msm_ba_inst *ba_inst = get_ba_inst(file, fh);
@@ -139,7 +139,7 @@ int msm_ba_v4l2_enum_fmt(struct file *file, void *fh,
return msm_ba_enum_fmt((void *)ba_inst, f);
}
-int msm_ba_v4l2_s_fmt(struct file *file, void *fh,
+static int msm_ba_v4l2_s_fmt(struct file *file, void *fh,
struct v4l2_format *f)
{
struct msm_ba_inst *ba_inst = get_ba_inst(file, fh);
@@ -147,7 +147,7 @@ int msm_ba_v4l2_s_fmt(struct file *file, void *fh,
return msm_ba_s_fmt((void *)ba_inst, f);
}
-int msm_ba_v4l2_g_fmt(struct file *file, void *fh,
+static int msm_ba_v4l2_g_fmt(struct file *file, void *fh,
struct v4l2_format *f)
{
struct msm_ba_inst *ba_inst = get_ba_inst(file, fh);
@@ -155,7 +155,7 @@ int msm_ba_v4l2_g_fmt(struct file *file, void *fh,
return msm_ba_g_fmt((void *)ba_inst, f);
}
-int msm_ba_v4l2_s_ctrl(struct file *file, void *fh,
+static int msm_ba_v4l2_s_ctrl(struct file *file, void *fh,
struct v4l2_control *a)
{
struct msm_ba_inst *ba_inst = get_ba_inst(file, fh);
@@ -163,7 +163,7 @@ int msm_ba_v4l2_s_ctrl(struct file *file, void *fh,
return msm_ba_s_ctrl((void *)ba_inst, a);
}
-int msm_ba_v4l2_g_ctrl(struct file *file, void *fh,
+static int msm_ba_v4l2_g_ctrl(struct file *file, void *fh,
struct v4l2_control *a)
{
struct msm_ba_inst *ba_inst = get_ba_inst(file, fh);
@@ -171,7 +171,7 @@ int msm_ba_v4l2_g_ctrl(struct file *file, void *fh,
return msm_ba_g_ctrl((void *)ba_inst, a);
}
-int msm_ba_v4l2_s_ext_ctrl(struct file *file, void *fh,
+static int msm_ba_v4l2_s_ext_ctrl(struct file *file, void *fh,
struct v4l2_ext_controls *a)
{
struct msm_ba_inst *ba_inst = get_ba_inst(file, fh);
@@ -179,7 +179,7 @@ int msm_ba_v4l2_s_ext_ctrl(struct file *file, void *fh,
return msm_ba_s_ext_ctrl((void *)ba_inst, a);
}
-int msm_ba_v4l2_streamon(struct file *file, void *fh,
+static int msm_ba_v4l2_streamon(struct file *file, void *fh,
enum v4l2_buf_type i)
{
struct msm_ba_inst *ba_inst = get_ba_inst(file, fh);
@@ -187,7 +187,7 @@ int msm_ba_v4l2_streamon(struct file *file, void *fh,
return msm_ba_streamon((void *)ba_inst, i);
}
-int msm_ba_v4l2_streamoff(struct file *file, void *fh,
+static int msm_ba_v4l2_streamoff(struct file *file, void *fh,
enum v4l2_buf_type i)
{
struct msm_ba_inst *ba_inst = get_ba_inst(file, fh);
@@ -260,7 +260,7 @@ static unsigned int msm_ba_v4l2_poll(struct file *filp,
return msm_ba_poll((void *)ba_inst, filp, pt);
}
-void msm_ba_release_video_device(struct video_device *pvdev)
+static void msm_ba_release_video_device(struct video_device *pvdev)
{
}
@@ -369,9 +369,8 @@ static int msm_ba_device_init(struct platform_device *pdev,
if ((ret_dev_ctxt == NULL) ||
(*ret_dev_ctxt != NULL) ||
(pdev == NULL)) {
- dprintk(BA_ERR, "%s(%d) Invalid params %p %p %p",
- __func__, __LINE__,
- ret_dev_ctxt, *ret_dev_ctxt, pdev);
+ dprintk(BA_ERR, "%s(%d) Invalid params",
+ __func__, __LINE__);
return -EINVAL;
}
@@ -453,7 +452,7 @@ static int msm_ba_probe(struct platform_device *pdev)
struct ba_ctxt *ba_ctxt;
int rc = 0;
- dprintk(BA_INFO, "Enter %s: pdev %p device id = %d",
+ dprintk(BA_INFO, "Enter %s: pdev %pK device id = %d",
__func__, pdev, pdev->id);
ba_ctxt = msm_ba_get_ba_context();
@@ -507,7 +506,7 @@ static int msm_ba_remove(struct platform_device *pdev)
return rc;
}
-int msm_ba_create(void)
+static int msm_ba_create(void)
{
struct ba_ctxt *ba_ctxt;
int rc = 0;
@@ -539,7 +538,7 @@ int msm_ba_create(void)
return rc;
}
-int msm_ba_destroy(void)
+static int msm_ba_destroy(void)
{
struct ba_ctxt *ba_ctxt;
int rc = 0;
diff --git a/include/linux/i2c/i2c-msm-v2.h b/include/linux/i2c/i2c-msm-v2.h
index 468a1d6fa58d..3ba9289549a2 100644
--- a/include/linux/i2c/i2c-msm-v2.h
+++ b/include/linux/i2c/i2c-msm-v2.h
@@ -581,6 +581,8 @@ struct i2c_msm_xfer {
* @rsrcs resources from platform data including clocks, gpios, irqs, and
* memory regions.
* @mstr_clk_ctl cached value for programming to mstr_clk_ctl register
+ * @i2c_sts_reg status of QUP_I2C_MASTER_STATUS register.
+ * @qup_op_reg status of QUP_OPERATIONAL register.
*/
struct i2c_msm_ctrl {
struct device *dev;
@@ -589,6 +591,8 @@ struct i2c_msm_ctrl {
struct i2c_msm_dbgfs dbgfs;
struct i2c_msm_resources rsrcs;
u32 mstr_clk_ctl;
+ u32 i2c_sts_reg;
+ u32 qup_op_reg;
enum i2c_msm_power_state pwr_state;
};
diff --git a/include/media/msm_ba.h b/include/media/msm_ba.h
index 1b51e3f754d8..d630e441590f 100644
--- a/include/media/msm_ba.h
+++ b/include/media/msm_ba.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2012-2015, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2012-2017, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -68,6 +68,7 @@ int msm_ba_s_ext_ctrl(void *instance, struct v4l2_ext_controls *a);
int msm_ba_g_ctrl(void *instance, struct v4l2_control *a);
int msm_ba_streamon(void *instance, enum v4l2_buf_type i);
int msm_ba_streamoff(void *instance, enum v4l2_buf_type i);
+long msm_ba_private_ioctl(void *instance, int cmd, void *arg);
int msm_ba_save_restore_input(void *instance, enum msm_ba_save_restore_ip sr);
int msm_ba_poll(void *instance, struct file *filp,
struct poll_table_struct *pt);
diff --git a/sound/soc/codecs/wsa881x.c b/sound/soc/codecs/wsa881x.c
index 0af656ce48f0..fe975a7dbe4e 100644
--- a/sound/soc/codecs/wsa881x.c
+++ b/sound/soc/codecs/wsa881x.c
@@ -1185,6 +1185,7 @@ static int wsa881x_swr_probe(struct swr_device *pdev)
int ret = 0;
struct wsa881x_priv *wsa881x;
u8 devnum = 0;
+ bool pin_state_current = false;
wsa881x = devm_kzalloc(&pdev->dev, sizeof(struct wsa881x_priv),
GFP_KERNEL);
@@ -1218,6 +1219,9 @@ static int wsa881x_swr_probe(struct swr_device *pdev)
if (ret)
goto err;
}
+ if (wsa881x->wsa_rst_np)
+ pin_state_current = msm_cdc_pinctrl_get_state(
+ wsa881x->wsa_rst_np);
wsa881x_gpio_ctrl(wsa881x, true);
wsa881x->state = WSA881X_DEV_UP;
@@ -1280,6 +1284,8 @@ static int wsa881x_swr_probe(struct swr_device *pdev)
return 0;
dev_err:
+ if (pin_state_current == false)
+ wsa881x_gpio_ctrl(wsa881x, false);
swr_remove_device(pdev);
err:
return ret;
diff --git a/sound/soc/msm/qdsp6v2/msm-dai-q6-v2.c b/sound/soc/msm/qdsp6v2/msm-dai-q6-v2.c
index 64b1961794b9..fa8bdddacef2 100644
--- a/sound/soc/msm/qdsp6v2/msm-dai-q6-v2.c
+++ b/sound/soc/msm/qdsp6v2/msm-dai-q6-v2.c
@@ -3586,6 +3586,9 @@ static int msm_dai_q6_dai_mi2s_probe(struct snd_soc_dai *dai)
ctrl = &mi2s_config_controls[11];
}
+ if (dai->id == MSM_QUAT_MI2S)
+ ctrl = &mi2s_config_controls[8];
+
if (ctrl) {
rc = snd_ctl_add(dai->component->card->snd_card,
snd_ctl_new1(ctrl,
diff --git a/sound/soc/msm/qdsp6v2/msm-transcode-loopback-q6-v2.c b/sound/soc/msm/qdsp6v2/msm-transcode-loopback-q6-v2.c
index dbda90c3616d..6bb85ca8e84e 100644
--- a/sound/soc/msm/qdsp6v2/msm-transcode-loopback-q6-v2.c
+++ b/sound/soc/msm/qdsp6v2/msm-transcode-loopback-q6-v2.c
@@ -112,7 +112,8 @@ static void loopback_event_handler(uint32_t opcode,
switch (opcode) {
case ASM_STREAM_CMD_ENCDEC_EVENTS:
case ASM_IEC_61937_MEDIA_FMT_EVENT:
- pr_debug("%s: ASM_IEC_61937_MEDIA_FMT_EVENT\n", __func__);
+ pr_debug("%s: Handling stream event : 0X%x\n",
+ __func__, opcode);
rtd = cstream->private_data;
if (!rtd) {
pr_err("%s: rtd is NULL\n", __func__);
@@ -449,17 +450,17 @@ static int msm_transcode_loopback_set_params(struct snd_compr_stream *cstream,
trans->audio_client->perf_mode,
trans->session_id,
SNDRV_PCM_STREAM_CAPTURE,
- true);
+ COMPRESSED_PASSTHROUGH_GEN);
else
msm_pcm_routing_reg_phy_stream(
soc_pcm_tx->dai_link->be_id,
trans->audio_client->perf_mode,
trans->session_id,
SNDRV_PCM_STREAM_CAPTURE);
-
+ /* Opening Rx ADM in LOW_LATENCY mode by default */
msm_pcm_routing_reg_phy_stream(
soc_pcm_rx->dai_link->be_id,
- trans->audio_client->perf_mode,
+ true,
trans->session_id,
SNDRV_PCM_STREAM_PLAYBACK);
pr_debug("%s: Successfully opened ADM sessions\n", __func__);
@@ -913,10 +914,21 @@ static int msm_transcode_loopback_probe(struct snd_soc_platform *platform)
return 0;
}
+static int msm_transcode_loopback_remove(struct snd_soc_platform *platform)
+{
+ struct trans_loopback_pdata *pdata = NULL;
+
+ pdata = (struct trans_loopback_pdata *)
+ snd_soc_platform_get_drvdata(platform);
+ kfree(pdata);
+ return 0;
+}
+
static struct snd_soc_platform_driver msm_soc_platform = {
.probe = msm_transcode_loopback_probe,
.compr_ops = &msm_transcode_loopback_ops,
.pcm_new = msm_transcode_loopback_new,
+ .remove = msm_transcode_loopback_remove,
};
static int msm_transcode_dev_probe(struct platform_device *pdev)
diff --git a/sound/soc/msm/qdsp6v2/q6asm.c b/sound/soc/msm/qdsp6v2/q6asm.c
index 6f097b7e8dd5..44e5b01b1ccb 100644
--- a/sound/soc/msm/qdsp6v2/q6asm.c
+++ b/sound/soc/msm/qdsp6v2/q6asm.c
@@ -1952,13 +1952,13 @@ static int32_t q6asm_callback(struct apr_client_data *data, void *priv)
port->buf[buf_index].used = 1;
spin_unlock_irqrestore(&port->dsp_lock, dsp_flags);
- config_debug_fs_write_cb();
for (i = 0; i < port->max_buf_cnt; i++)
dev_vdbg(ac->dev, "%s %d\n",
__func__, port->buf[i].used);
}
+ config_debug_fs_write_cb();
break;
}
case ASM_STREAM_CMDRSP_GET_PP_PARAMS_V2:
@@ -7750,6 +7750,8 @@ int q6asm_async_write(struct audio_client *ac,
}
}
+ config_debug_fs_write(ab);
+
rc = apr_send_pkt(ac->apr, (uint32_t *) &write);
if (rc < 0) {
pr_err("%s: write op[0x%x]rc[%d]\n", __func__,