Merge "msm: vidc: Expose extradata size to userspace"
diff --git a/arch/arm/boot/dts/msm8974-mdss.dtsi b/arch/arm/boot/dts/msm8974-mdss.dtsi
index d83a235..3fef47a 100644
--- a/arch/arm/boot/dts/msm8974-mdss.dtsi
+++ b/arch/arm/boot/dts/msm8974-mdss.dtsi
@@ -35,6 +35,7 @@
qcom,mdss-ab-factor = <2 1>; /* 2 times */
qcom,mdss-ib-factor = <6 5>; /* 1.2 times */
qcom,mdss-clk-factor = <5 4>; /* 1.25 times */
+ qcom,mdss-ib-factor-overlap = <7 4>; /* 1.75 times */
qcom,max-clk-rate = <320000000>;
qcom,mdss-pipe-vig-off = <0x00001200 0x00001600
diff --git a/drivers/hwmon/qpnp-adc-common.c b/drivers/hwmon/qpnp-adc-common.c
index 37a11d2..96b058b 100644
--- a/drivers/hwmon/qpnp-adc-common.c
+++ b/drivers/hwmon/qpnp-adc-common.c
@@ -814,17 +814,22 @@
return -EINVAL;
scale_voltage = (adc_code -
- chan_properties->adc_graph[CALIB_ABSOLUTE].adc_gnd)
- * chan_properties->adc_graph[CALIB_ABSOLUTE].dx;
+ chan_properties->adc_graph[chan_properties->calib_type].adc_gnd)
+ * chan_properties->adc_graph[chan_properties->calib_type].dx;
if (scale_voltage < 0) {
negative_offset = 1;
scale_voltage = -scale_voltage;
}
do_div(scale_voltage,
- chan_properties->adc_graph[CALIB_ABSOLUTE].dy);
+ chan_properties->adc_graph[chan_properties->calib_type].dy);
if (negative_offset)
scale_voltage = -scale_voltage;
- scale_voltage += chan_properties->adc_graph[CALIB_ABSOLUTE].dx;
+
+ if (chan_properties->calib_type == CALIB_ABSOLUTE)
+ scale_voltage +=
+ chan_properties->adc_graph[chan_properties->calib_type].dx;
+ else
+ scale_voltage *= 1000;
if (scale_voltage < 0) {
if (adc_properties->bipolar) {
@@ -1190,6 +1195,7 @@
adc_channel_list[i].adc_scale_fn = post_scaling;
adc_channel_list[i].hw_settle_time = hw_settle_time;
adc_channel_list[i].fast_avg_setup = fast_avg_setup;
+ adc_channel_list[i].calib_type = calib_type;
i++;
}
diff --git a/drivers/hwmon/qpnp-adc-voltage.c b/drivers/hwmon/qpnp-adc-voltage.c
index 346a72d..24dea75 100644
--- a/drivers/hwmon/qpnp-adc-voltage.c
+++ b/drivers/hwmon/qpnp-adc-voltage.c
@@ -1173,6 +1173,8 @@
qpnp_vadc_amux_scaling_ratio[amux_prescaling].num;
vadc->adc->amux_prop->chan_prop->offset_gain_denominator =
qpnp_vadc_amux_scaling_ratio[amux_prescaling].den;
+ vadc->adc->amux_prop->chan_prop->calib_type =
+ vadc->adc->adc_channels[dt_index].calib_type;
scale_type = vadc->adc->adc_channels[dt_index].adc_scale_fn;
if (scale_type >= SCALE_NONE) {
diff --git a/drivers/media/platform/msm/vidc/msm_v4l2_vidc.c b/drivers/media/platform/msm/vidc/msm_v4l2_vidc.c
index 176c612..c638415 100644
--- a/drivers/media/platform/msm/vidc/msm_v4l2_vidc.c
+++ b/drivers/media/platform/msm/vidc/msm_v4l2_vidc.c
@@ -319,7 +319,6 @@
}
INIT_LIST_HEAD(&core->instances);
- mutex_init(&core->sync_lock);
mutex_init(&core->lock);
core->state = VIDC_CORE_UNINIT;
diff --git a/drivers/media/platform/msm/vidc/msm_vdec.c b/drivers/media/platform/msm/vidc/msm_vdec.c
index 7d27cea..f84a806 100644
--- a/drivers/media/platform/msm/vidc/msm_vdec.c
+++ b/drivers/media/platform/msm/vidc/msm_vdec.c
@@ -870,9 +870,8 @@
dprintk(VIDC_PROF, "reported fps changed for %p: %d->%d\n",
inst, inst->prop.fps, fps);
inst->prop.fps = fps;
- mutex_lock(&inst->core->sync_lock);
+
msm_comm_scale_clocks_and_bus(inst);
- mutex_unlock(&inst->core->sync_lock);
}
exit:
return rc;
@@ -1228,9 +1227,8 @@
goto fail_start;
}
}
- mutex_lock(&inst->core->sync_lock);
+
msm_comm_scale_clocks_and_bus(inst);
- mutex_unlock(&inst->core->sync_lock);
rc = msm_comm_try_state(inst, MSM_VIDC_START_DONE);
if (rc) {
@@ -1337,9 +1335,7 @@
break;
}
- mutex_lock(&inst->core->sync_lock);
msm_comm_scale_clocks_and_bus(inst);
- mutex_unlock(&inst->core->sync_lock);
if (rc)
dprintk(VIDC_ERR,
@@ -1889,6 +1885,11 @@
int msm_vdec_ctrl_deinit(struct msm_vidc_inst *inst)
{
+ if (!inst) {
+ dprintk(VIDC_ERR, "%s invalid parameters\n", __func__);
+ return -EINVAL;
+ }
+
kfree(inst->ctrls);
kfree(inst->cluster);
v4l2_ctrl_handler_free(&inst->ctrl_handler);
diff --git a/drivers/media/platform/msm/vidc/msm_venc.c b/drivers/media/platform/msm/vidc/msm_venc.c
index c4646f9..d9d65a7 100644
--- a/drivers/media/platform/msm/vidc/msm_venc.c
+++ b/drivers/media/platform/msm/vidc/msm_venc.c
@@ -1076,9 +1076,7 @@
goto fail_start;
}
- mutex_lock(&inst->core->sync_lock);
msm_comm_scale_clocks_and_bus(inst);
- mutex_unlock(&inst->core->sync_lock);
rc = msm_comm_try_state(inst, MSM_VIDC_START_DONE);
if (rc) {
@@ -1155,9 +1153,7 @@
break;
}
- mutex_lock(&inst->core->sync_lock);
msm_comm_scale_clocks_and_bus(inst);
- mutex_unlock(&inst->core->sync_lock);
if (rc)
dprintk(VIDC_ERR,
@@ -2512,9 +2508,8 @@
dprintk(VIDC_WARN,
"Failed to set frame rate %d\n", rc);
}
- mutex_lock(&inst->core->sync_lock);
+
msm_comm_scale_clocks_and_bus(inst);
- mutex_unlock(&inst->core->sync_lock);
}
exit:
return rc;
@@ -3056,6 +3051,11 @@
int msm_venc_ctrl_deinit(struct msm_vidc_inst *inst)
{
+ if (!inst) {
+ dprintk(VIDC_ERR, "%s invalid parameters\n", __func__);
+ return -EINVAL;
+ }
+
kfree(inst->ctrls);
kfree(inst->cluster);
v4l2_ctrl_handler_free(&inst->ctrl_handler);
diff --git a/drivers/media/platform/msm/vidc/msm_vidc.c b/drivers/media/platform/msm/vidc/msm_vidc.c
index bfa9025..cfc2eb8 100644
--- a/drivers/media/platform/msm/vidc/msm_vidc.c
+++ b/drivers/media/platform/msm/vidc/msm_vidc.c
@@ -1276,9 +1276,9 @@
setup_event_queue(inst, &core->vdev[session_type].vdev);
- mutex_lock(&core->sync_lock);
+ mutex_lock(&core->lock);
list_add_tail(&inst->list, &core->instances);
- mutex_unlock(&core->sync_lock);
+ mutex_unlock(&core->lock);
return inst;
fail_init:
vb2_queue_release(&inst->bufq[OUTPUT_PORT].vb2_bufq);
@@ -1373,13 +1373,13 @@
}
core = inst->core;
- mutex_lock(&core->sync_lock);
+ mutex_lock(&core->lock);
list_for_each_safe(ptr, next, &core->instances) {
temp = list_entry(ptr, struct msm_vidc_inst, list);
if (temp == inst)
list_del(&inst->list);
}
- mutex_unlock(&core->sync_lock);
+ mutex_unlock(&core->lock);
if (inst->session_type == MSM_VIDC_DECODER)
msm_vdec_ctrl_deinit(inst);
diff --git a/drivers/media/platform/msm/vidc/msm_vidc_common.c b/drivers/media/platform/msm/vidc/msm_vidc_common.c
index cd06108..7429466 100644
--- a/drivers/media/platform/msm/vidc/msm_vidc_common.c
+++ b/drivers/media/platform/msm/vidc/msm_vidc_common.c
@@ -51,9 +51,10 @@
enum session_type type)
{
struct msm_vidc_inst *inst = NULL;
+ bool wants_turbo = false;
+ mutex_lock(&core->lock);
list_for_each_entry(inst, &core->instances, list) {
- bool wants_turbo = false;
mutex_lock(&inst->lock);
if (inst->session_type == type &&
@@ -64,10 +65,12 @@
mutex_unlock(&inst->lock);
if (wants_turbo)
- return true;
+ break;
}
- return false;
+ mutex_unlock(&core->lock);
+
+ return wants_turbo;
}
static bool is_thumbnail_session(struct msm_vidc_inst *inst)
@@ -117,6 +120,7 @@
dprintk(VIDC_ERR, "Invalid args: %p\n", core);
return -EINVAL;
}
+ mutex_lock(&core->lock);
list_for_each_entry(inst, &core->instances, list) {
mutex_lock(&inst->lock);
if (inst->session_type == type &&
@@ -128,6 +132,7 @@
}
mutex_unlock(&inst->lock);
}
+ mutex_unlock(&core->lock);
return num_mbs_per_sec;
}
@@ -869,13 +874,12 @@
core = handler->core;
hdev = core->device;
- mutex_lock(&core->sync_lock);
+ mutex_lock(&core->lock);
/*
* Restart the firmware to bring out of bad state.
*/
if ((core->state == VIDC_CORE_INVALID) &&
hdev->resurrect_fw) {
- mutex_lock(&core->lock);
rc = call_hfi_op(hdev, resurrect_fw,
hdev->hfi_device_data);
if (rc) {
@@ -884,12 +888,11 @@
__func__, rc);
}
core->state = VIDC_CORE_LOADED;
- mutex_unlock(&core->lock);
} else {
dprintk(VIDC_DBG,
"fw unloaded after sys error, no need to resurrect\n");
}
- mutex_unlock(&core->sync_lock);
+ mutex_unlock(&core->lock);
exit:
/* free sys error handler, allocated in handle_sys_err */
@@ -922,13 +925,11 @@
dprintk(VIDC_WARN, "SYS_ERROR %d received for core %p\n", cmd, core);
mutex_lock(&core->lock);
core->state = VIDC_CORE_INVALID;
- mutex_unlock(&core->lock);
/*
* 1. Delete each instance session from hfi list
* 2. Notify all clients about hardware error.
*/
- mutex_lock(&core->sync_lock);
list_for_each_entry(inst, &core->instances,
list) {
mutex_lock(&inst->lock);
@@ -950,7 +951,7 @@
msm_vidc_queue_v4l2_event(inst,
V4L2_EVENT_MSM_VIDC_SYS_ERROR);
}
- mutex_unlock(&core->sync_lock);
+ mutex_unlock(&core->lock);
handler = kzalloc(sizeof(*handler), GFP_KERNEL);
@@ -1604,7 +1605,7 @@
{
struct msm_vidc_core *core = inst->core;
int rc = 0;
- mutex_lock(&core->sync_lock);
+ mutex_lock(&core->lock);
if (core->state >= VIDC_CORE_INIT_DONE) {
dprintk(VIDC_INFO, "Video core: %d is already in state: %d\n",
core->id, core->state);
@@ -1620,16 +1621,14 @@
rc = -EIO;
goto exit;
} else {
- mutex_lock(&core->lock);
core->state = VIDC_CORE_INIT_DONE;
- mutex_unlock(&core->lock);
}
dprintk(VIDC_DBG, "SYS_INIT_DONE!!!\n");
core_already_inited:
change_inst_state(inst, MSM_VIDC_CORE_INIT_DONE);
rc = 0;
exit:
- mutex_unlock(&core->sync_lock);
+ mutex_unlock(&core->lock);
return rc;
}
@@ -1643,12 +1642,13 @@
return -EINVAL;
hdev = core->device;
- mutex_lock(&core->sync_lock);
+ mutex_lock(&core->lock);
if (core->state >= VIDC_CORE_INIT) {
dprintk(VIDC_INFO, "Video core: %d is already in state: %d\n",
core->id, core->state);
goto core_already_inited;
}
+ mutex_unlock(&core->lock);
rc = msm_comm_scale_bus(core, inst->session_type, DDR_MEM);
if (rc) {
@@ -1656,13 +1656,16 @@
goto fail_scale_bus;
}
+ mutex_lock(&core->lock);
if (core->state < VIDC_CORE_LOADED) {
rc = call_hfi_op(hdev, load_fw, hdev->hfi_device_data);
if (rc) {
dprintk(VIDC_ERR, "Failed to load video firmware\n");
goto fail_load_fw;
}
+ core->state = VIDC_CORE_LOADED;
}
+ mutex_unlock(&core->lock);
rc = msm_comm_scale_clocks(core);
if (rc) {
@@ -1670,25 +1673,29 @@
goto fail_core_init;
}
- init_completion(&core->completions[SYS_MSG_INDEX(SYS_INIT_DONE)]);
- rc = call_hfi_op(hdev, core_init, hdev->hfi_device_data);
- if (rc) {
- dprintk(VIDC_ERR, "Failed to init core, id = %d\n", core->id);
- goto fail_core_init;
- }
mutex_lock(&core->lock);
- core->state = VIDC_CORE_INIT;
- mutex_unlock(&core->lock);
+ if (core->state == VIDC_CORE_LOADED) {
+ init_completion(&core->completions
+ [SYS_MSG_INDEX(SYS_INIT_DONE)]);
+ rc = call_hfi_op(hdev, core_init, hdev->hfi_device_data);
+ if (rc) {
+ dprintk(VIDC_ERR, "Failed to init core, id = %d\n",
+ core->id);
+ goto fail_core_init;
+ }
+ core->state = VIDC_CORE_INIT;
+ }
+
core_already_inited:
change_inst_state(inst, MSM_VIDC_CORE_INIT);
- mutex_unlock(&core->sync_lock);
+ mutex_unlock(&core->lock);
return rc;
fail_core_init:
call_hfi_op(hdev, unload_fw, hdev->hfi_device_data);
fail_load_fw:
msm_comm_unvote_buses(core, DDR_MEM);
fail_scale_bus:
- mutex_unlock(&core->sync_lock);
+ mutex_unlock(&core->lock);
return rc;
}
@@ -1706,14 +1713,17 @@
core = inst->core;
hdev = core->device;
- mutex_lock(&core->sync_lock);
+ mutex_lock(&core->lock);
if (core->state == VIDC_CORE_UNINIT) {
dprintk(VIDC_INFO, "Video core: %d is already in state: %d\n",
core->id, core->state);
goto core_already_uninited;
}
+ mutex_unlock(&core->lock);
msm_comm_scale_clocks_and_bus(inst);
+
+ mutex_lock(&core->lock);
if (list_empty(&core->instances)) {
if (core->state > VIDC_CORE_INIT) {
if (core->resources.has_ocmem) {
@@ -1732,9 +1742,9 @@
goto exit;
}
}
- mutex_lock(&core->lock);
+
core->state = VIDC_CORE_UNINIT;
- mutex_unlock(&core->lock);
+
call_hfi_op(hdev, unload_fw, hdev->hfi_device_data);
if (core->resources.has_ocmem)
msm_comm_unvote_buses(core, DDR_MEM|OCMEM_MEM);
@@ -1745,7 +1755,7 @@
core_already_uninited:
change_inst_state(inst, MSM_VIDC_CORE_UNINIT);
exit:
- mutex_unlock(&core->sync_lock);
+ mutex_unlock(&core->lock);
return rc;
}
@@ -1874,6 +1884,8 @@
struct msm_vidc_inst *temp;
dprintk(VIDC_ERR, "Running instances:\n");
dprintk(VIDC_ERR, "%4s|%4s|%4s|%4s\n", "type", "w", "h", "fps");
+
+ mutex_lock(&core->lock);
list_for_each_entry(temp, &core->instances, list) {
mutex_lock(&temp->lock);
if (temp->state >= MSM_VIDC_OPEN_DONE &&
@@ -1886,6 +1898,7 @@
}
mutex_unlock(&temp->lock);
}
+ mutex_unlock(&core->lock);
}
static int msm_vidc_load_resources(int flipped_state,
@@ -1914,10 +1927,8 @@
return -EINVAL;
}
- mutex_lock(&inst->core->sync_lock);
num_mbs_per_sec = msm_comm_get_load(inst->core, MSM_VIDC_DECODER);
num_mbs_per_sec += msm_comm_get_load(inst->core, MSM_VIDC_ENCODER);
- mutex_unlock(&inst->core->sync_lock);
if (num_mbs_per_sec > inst->core->resources.max_load) {
dprintk(VIDC_ERR, "HW is overloaded, needed: %d max: %d\n",
@@ -1941,16 +1952,14 @@
inst->prop.width[OUTPUT_PORT]);
ocmem_sz = get_ocmem_requirement(
height, width);
- mutex_lock(&inst->core->sync_lock);
rc = msm_comm_scale_bus(inst->core, inst->session_type,
OCMEM_MEM);
- mutex_unlock(&inst->core->sync_lock);
if (!rc) {
- mutex_lock(&inst->core->sync_lock);
+ mutex_lock(&inst->core->lock);
rc = call_hfi_op(hdev, alloc_ocmem,
hdev->hfi_device_data,
ocmem_sz);
- mutex_unlock(&inst->core->sync_lock);
+ mutex_unlock(&inst->core->lock);
if (rc) {
dprintk(VIDC_WARN,
"Failed to allocate OCMEM. Performance will be impacted\n");
@@ -3346,20 +3355,16 @@
int num_mbs_per_sec = 0;
if (inst->state == MSM_VIDC_OPEN_DONE) {
- mutex_lock(&inst->core->sync_lock);
num_mbs_per_sec = msm_comm_get_load(inst->core,
MSM_VIDC_DECODER);
num_mbs_per_sec += msm_comm_get_load(inst->core,
MSM_VIDC_ENCODER);
- mutex_unlock(&inst->core->sync_lock);
if (num_mbs_per_sec > inst->core->resources.max_load) {
dprintk(VIDC_ERR,
"H/w is overloaded. needed: %d max: %d\n",
num_mbs_per_sec,
inst->core->resources.max_load);
- mutex_lock(&inst->sync_lock);
msm_vidc_print_running_insts(inst->core);
- mutex_unlock(&inst->sync_lock);
return -EINVAL;
}
}
diff --git a/drivers/media/platform/msm/vidc/msm_vidc_internal.h b/drivers/media/platform/msm/vidc/msm_vidc_internal.h
index e9bf91d..1677e57 100644
--- a/drivers/media/platform/msm/vidc/msm_vidc_internal.h
+++ b/drivers/media/platform/msm/vidc/msm_vidc_internal.h
@@ -199,7 +199,7 @@
struct msm_vidc_core {
struct list_head list;
- struct mutex sync_lock, lock;
+ struct mutex lock;
int id;
void *device;
struct msm_video_device vdev[MSM_VIDC_MAX_DEVICES];
diff --git a/drivers/mmc/host/sdhci-msm.c b/drivers/mmc/host/sdhci-msm.c
index 074b6a8..2c96d3c 100644
--- a/drivers/mmc/host/sdhci-msm.c
+++ b/drivers/mmc/host/sdhci-msm.c
@@ -876,6 +876,14 @@
memset(data_buf, 0, size);
mmc_wait_for_req(mmc, &mrq);
+ /*
+ * wait for 146 MCLK cycles for the card to send out the data
+ * and thus move to TRANS state. As the MCLK would be minimum
+ * 200MHz when tuning is performed, we need maximum 0.73us
+ * delay. To be on safer side 1ms delay is given.
+ */
+ if (cmd.error)
+ usleep_range(1000, 1200);
if (!cmd.error && !data.error &&
!memcmp(data_buf, tuning_block_pattern, size)) {
/* tuning is successful at this tuning point */
@@ -2897,7 +2905,6 @@
host->quirks |= SDHCI_QUIRK_SINGLE_POWER_WRITE;
host->quirks |= SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN;
host->quirks2 |= SDHCI_QUIRK2_ALWAYS_USE_BASE_CLOCK;
- host->quirks2 |= SDHCI_QUIRK2_IGNORE_CMDCRC_FOR_TUNING;
host->quirks2 |= SDHCI_QUIRK2_USE_MAX_DISCARD_SIZE;
host->quirks2 |= SDHCI_QUIRK2_IGNORE_DATATOUT_FOR_R1BCMD;
host->quirks2 |= SDHCI_QUIRK2_BROKEN_PRESET_VALUE;
diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
index 32ff175..277aef5 100644
--- a/drivers/mmc/host/sdhci.c
+++ b/drivers/mmc/host/sdhci.c
@@ -2591,17 +2591,6 @@
host->cmd->error = -EILSEQ;
}
- if (host->quirks2 & SDHCI_QUIRK2_IGNORE_CMDCRC_FOR_TUNING) {
- if ((host->cmd->opcode == MMC_SEND_TUNING_BLOCK_HS400) ||
- (host->cmd->opcode == MMC_SEND_TUNING_BLOCK_HS200) ||
- (host->cmd->opcode == MMC_SEND_TUNING_BLOCK)) {
- if (intmask & SDHCI_INT_CRC) {
- sdhci_reset(host, SDHCI_RESET_CMD);
- host->cmd->error = 0;
- }
- }
- }
-
if (host->cmd->error) {
if (host->cmd->error == -EILSEQ)
host->flags |= SDHCI_NEEDS_RETUNING;
@@ -2631,17 +2620,6 @@
* fall through and take the SDHCI_INT_RESPONSE */
}
- if (host->quirks2 & SDHCI_QUIRK2_IGNORE_CMDCRC_FOR_TUNING) {
- if ((host->cmd->opcode == MMC_SEND_TUNING_BLOCK_HS400) ||
- (host->cmd->opcode == MMC_SEND_TUNING_BLOCK_HS200) ||
- (host->cmd->opcode == MMC_SEND_TUNING_BLOCK)) {
- if (intmask & SDHCI_INT_CRC) {
- sdhci_finish_command(host);
- return;
- }
- }
- }
-
if (intmask & SDHCI_INT_RESPONSE)
sdhci_finish_command(host);
}
@@ -2727,8 +2705,7 @@
host->data->error = -EIO;
}
if (host->data->error) {
- if ((intmask & (SDHCI_INT_DATA_CRC | SDHCI_INT_DATA_TIMEOUT)) &&
- (host->quirks2 & SDHCI_QUIRK2_IGNORE_CMDCRC_FOR_TUNING)) {
+ if (intmask & (SDHCI_INT_DATA_CRC | SDHCI_INT_DATA_TIMEOUT)) {
command = SDHCI_GET_CMD(sdhci_readw(host,
SDHCI_COMMAND));
if ((command != MMC_SEND_TUNING_BLOCK_HS400) &&
diff --git a/drivers/nfc/nfc-nci.c b/drivers/nfc/nfc-nci.c
index 8cd4bd1..018c3a6 100644
--- a/drivers/nfc/nfc-nci.c
+++ b/drivers/nfc/nfc-nci.c
@@ -1169,10 +1169,7 @@
r = of_property_read_string(np, "qcom,clk-src", &pdata->clk_src_name);
if (strcmp(pdata->clk_src_name, "GPCLK2")) {
- r = of_property_read_u32(np, "qcom,clk-gpio",
- &pdata->clkreq_gpio);
- if (r)
- return -EINVAL;
+ pdata->clkreq_gpio = of_get_named_gpio(np, "qcom,clk-gpio", 0);
}
if ((!strcmp(pdata->clk_src_name, "GPCLK")) ||
@@ -1186,6 +1183,7 @@
if ((!gpio_is_valid(pdata->irq_gpio_clk_req)))
return -EINVAL;
}
+
if (r)
return -EINVAL;
return r;
@@ -1196,7 +1194,6 @@
{
int r = 0;
int irqn = 0;
- struct device_node *node = client->dev.of_node;
struct qca199x_platform_data *platform_data;
struct qca199x_dev *qca199x_dev;
@@ -1348,9 +1345,6 @@
}
if (strcmp(platform_data->clk_src_name, "GPCLK2")) {
- platform_data->clkreq_gpio =
- of_get_named_gpio(node, "qcom,clk-gpio", 0);
-
if (gpio_is_valid(platform_data->clkreq_gpio)) {
r = gpio_request(platform_data->clkreq_gpio,
"nfc_clkreq_gpio");
diff --git a/drivers/usb/otg/msm_otg.c b/drivers/usb/otg/msm_otg.c
index 486d99d..b5641b6 100644
--- a/drivers/usb/otg/msm_otg.c
+++ b/drivers/usb/otg/msm_otg.c
@@ -2543,12 +2543,15 @@
if (motg->ext_chg_active) {
+do_wait:
pr_debug("before msm_otg ext chg wait\n");
t = wait_for_completion_timeout(&motg->ext_chg_wait,
msecs_to_jiffies(3000));
if (!t)
pr_err("msm_otg ext chg wait timeout\n");
+ else if (motg->ext_chg_active)
+ goto do_wait;
else
pr_debug("msm_otg ext chg wait done\n");
}
@@ -4051,6 +4054,7 @@
pr_debug("%s: LPM block request %d\n", __func__, val);
if (val) { /* block LPM */
if (motg->chg_type == USB_DCP_CHARGER) {
+ motg->ext_chg_active = true;
/*
* If device is already suspended, resume it.
* The PM usage counter is incremented in
diff --git a/include/linux/mmc/sdhci.h b/include/linux/mmc/sdhci.h
index 65a3fe1..9bdf508 100644
--- a/include/linux/mmc/sdhci.h
+++ b/include/linux/mmc/sdhci.h
@@ -113,39 +113,37 @@
* be called twice.
*/
#define SDHCI_QUIRK2_SLOW_INT_CLR (1<<2)
-/* Ignore CMD CRC errors for tuning commands */
-#define SDHCI_QUIRK2_IGNORE_CMDCRC_FOR_TUNING (1<<3)
/*
* If the base clock can be scalable, then there should be no further
* clock dividing as the input clock itself will be scaled down to
* required frequency.
*/
-#define SDHCI_QUIRK2_ALWAYS_USE_BASE_CLOCK (1<<4)
+#define SDHCI_QUIRK2_ALWAYS_USE_BASE_CLOCK (1<<3)
/*
* Dont use the max_discard_to in sdhci driver so that the maximum discard
* unit gets picked by the mmc queue. Otherwise, it takes a long time for
* secure discard kind of operations to complete.
*/
-#define SDHCI_QUIRK2_USE_MAX_DISCARD_SIZE (1<<5)
+#define SDHCI_QUIRK2_USE_MAX_DISCARD_SIZE (1<<4)
/*
* Ignore data timeout error for R1B commands as there will be no
* data associated and the busy timeout value for these commands
* could be lager than the maximum timeout value that controller
* can handle.
*/
-#define SDHCI_QUIRK2_IGNORE_DATATOUT_FOR_R1BCMD (1<<6)
+#define SDHCI_QUIRK2_IGNORE_DATATOUT_FOR_R1BCMD (1<<5)
/*
* The preset value registers are not properly initialized by
* some hardware and hence preset value must not be enabled for
* such controllers.
*/
-#define SDHCI_QUIRK2_BROKEN_PRESET_VALUE (1<<7)
+#define SDHCI_QUIRK2_BROKEN_PRESET_VALUE (1<<6)
/*
* Some controllers define the usage of 0xF in data timeout counter
* register (0x2E) which is actually a reserved bit as per
* specification.
*/
-#define SDHCI_QUIRK2_USE_RESERVED_MAX_TIMEOUT (1<<8)
+#define SDHCI_QUIRK2_USE_RESERVED_MAX_TIMEOUT (1<<7)
/*
* This is applicable for controllers that advertize timeout clock
* value in capabilities register (bit 5-0) as just 50MHz whereas the
@@ -158,7 +156,7 @@
* will be used in such cases to avoid controller mulplication when timeout is
* calculated based on the base clock.
*/
-#define SDHCI_QUIRK2_DIVIDE_TOUT_BY_4 (1 << 9)
+#define SDHCI_QUIRK2_DIVIDE_TOUT_BY_4 (1 << 8)
/*
* Some SDHC controllers are unable to handle data-end bit error in
diff --git a/include/linux/qpnp/qpnp-adc.h b/include/linux/qpnp/qpnp-adc.h
index 7ba4148..52195c1 100644
--- a/include/linux/qpnp/qpnp-adc.h
+++ b/include/linux/qpnp/qpnp-adc.h
@@ -840,6 +840,7 @@
enum qpnp_adc_meas_timer_2 meas_interval2;
enum qpnp_adc_tm_channel_select tm_channel_select;
enum qpnp_state_request state_request;
+ enum qpnp_adc_calib_type calib_type;
struct qpnp_vadc_linear_graph adc_graph[2];
};
@@ -883,6 +884,7 @@
enum qpnp_adc_scale_fn_type adc_scale_fn;
enum qpnp_adc_fast_avg_ctl fast_avg_setup;
enum qpnp_adc_hw_settle_time hw_settle_time;
+ enum qpnp_adc_calib_type calib_type;
};
/**
diff --git a/sound/soc/codecs/wcd9320.c b/sound/soc/codecs/wcd9320.c
index 2b0c9d3..d749715 100644
--- a/sound/soc/codecs/wcd9320.c
+++ b/sound/soc/codecs/wcd9320.c
@@ -6485,6 +6485,9 @@
/* set MAD input MIC to DMIC1 */
{TAIKO_A_CDC_CONN_MAD, 0x0F, 0x08},
+
+ /* set DMIC CLK drive strength to 4mA */
+ {TAIKO_A_HDRIVE_OVERRIDE, 0x07, 0x01},
};
static void taiko_codec_init_reg(struct snd_soc_codec *codec)