diff options
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__, |
