Merge "msm: camera: Removed CCI_RELEASE call."
diff --git a/block/row-iosched.c b/block/row-iosched.c
index dfb46b4..9b39741 100644
--- a/block/row-iosched.c
+++ b/block/row-iosched.c
@@ -1,7 +1,7 @@
/*
* ROW (Read Over Write) I/O scheduler.
*
- * Copyright (c) 2012-2013, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2014, 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
@@ -331,10 +331,6 @@
struct row_queue *rqueue = RQ_ROWQ(rq);
s64 diff_ms;
bool queue_was_empty = list_empty(&rqueue->fifo);
- unsigned long bv_page_flags = 0;
-
- if (rq->bio && rq->bio->bi_io_vec && rq->bio->bi_io_vec->bv_page)
- bv_page_flags = rq->bio->bi_io_vec->bv_page->flags;
list_add_tail(&rq->queuelist, &rqueue->fifo);
rd->nr_reqs[rq_data_dir(rq)]++;
@@ -367,9 +363,7 @@
rqueue->idle_data.begin_idling = false;
return;
}
-
- if ((bv_page_flags & (1L << PG_readahead)) ||
- (diff_ms < rd->rd_idle_data.freq_ms)) {
+ if (diff_ms < rd->rd_idle_data.freq_ms) {
rqueue->idle_data.begin_idling = true;
row_log_rowq(rd, rqueue->prio, "Enable idling");
} else {
diff --git a/drivers/media/platform/msm/camera_v2/sensor/eeprom/msm_eeprom.c b/drivers/media/platform/msm/camera_v2/sensor/eeprom/msm_eeprom.c
index 7649a40..059780d 100644
--- a/drivers/media/platform/msm/camera_v2/sensor/eeprom/msm_eeprom.c
+++ b/drivers/media/platform/msm/camera_v2/sensor/eeprom/msm_eeprom.c
@@ -131,12 +131,6 @@
e_ctrl->cal_data.mapdata,
cdata->cfg.read_data.num_bytes);
- /* should only be called once. free kernel resource */
- if (!rc) {
- kfree(e_ctrl->cal_data.mapdata);
- kfree(e_ctrl->cal_data.map);
- memset(&e_ctrl->cal_data, 0, sizeof(e_ctrl->cal_data));
- }
return rc;
}
diff --git a/drivers/misc/qseecom.c b/drivers/misc/qseecom.c
index 23edc8a..1a11541 100644
--- a/drivers/misc/qseecom.c
+++ b/drivers/misc/qseecom.c
@@ -2947,9 +2947,10 @@
struct qseecom_command_scm_resp resp;
int ret;
- if (usage != QSEOS_KM_USAGE_DISK_ENCRYPTION) {
- pr_err("Error:: unsupported usage %d\n", usage);
- return -EFAULT;
+ if (usage < QSEOS_KM_USAGE_DISK_ENCRYPTION ||
+ usage >= QSEOS_KM_USAGE_MAX) {
+ pr_err("Error:: unsupported usage %d\n", usage);
+ return -EFAULT;
}
__qseecom_enable_clk(CLK_QSEE);
diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c
index 36bf643..da62cb0 100644
--- a/drivers/mmc/core/core.c
+++ b/drivers/mmc/core/core.c
@@ -3129,6 +3129,19 @@
return 1;
ret = host->bus_ops->alive(host);
+
+ /*
+ * Card detect status and alive check may be out of sync if card is
+ * removed slowly, when card detect switch changes while card/slot
+ * pads are still contacted in hardware (refer to "SD Card Mechanical
+ * Addendum, Appendix C: Card Detection Switch"). So reschedule a
+ * detect work 200ms later for this case.
+ */
+ if (!ret && host->ops->get_cd && !host->ops->get_cd(host)) {
+ mmc_detect_change(host, msecs_to_jiffies(200));
+ pr_debug("%s: card removed too slowly\n", mmc_hostname(host));
+ }
+
if (ret) {
mmc_card_set_removed(host->card);
pr_debug("%s: card remove detected\n", mmc_hostname(host));
@@ -3229,8 +3242,12 @@
*/
mmc_bus_put(host);
- if (host->ops->get_cd && host->ops->get_cd(host) == 0)
+ if (host->ops->get_cd && host->ops->get_cd(host) == 0) {
+ mmc_claim_host(host);
+ mmc_power_off(host);
+ mmc_release_host(host);
goto out;
+ }
mmc_rpm_hold(host, &host->class_dev);
mmc_claim_host(host);
diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
index 277aef5..ba07348 100644
--- a/drivers/mmc/host/sdhci.c
+++ b/drivers/mmc/host/sdhci.c
@@ -1567,6 +1567,7 @@
MMC_SEND_TUNING_BLOCK_HS200 :
MMC_SEND_TUNING_BLOCK;
host->mrq = NULL;
+ host->flags &= ~SDHCI_NEEDS_RETUNING;
spin_unlock_irqrestore(&host->lock, flags);
sdhci_execute_tuning(mmc, tuning_opcode);
spin_lock_irqsave(&host->lock, flags);
@@ -2561,6 +2562,7 @@
static void sdhci_cmd_irq(struct sdhci_host *host, u32 intmask)
{
u16 auto_cmd_status;
+ u32 command;
BUG_ON(intmask == 0);
if (!host->cmd) {
@@ -2592,8 +2594,13 @@
}
if (host->cmd->error) {
- if (host->cmd->error == -EILSEQ)
- host->flags |= SDHCI_NEEDS_RETUNING;
+ command = SDHCI_GET_CMD(sdhci_readw(host,
+ SDHCI_COMMAND));
+ if (host->cmd->error == -EILSEQ &&
+ (command != MMC_SEND_TUNING_BLOCK_HS400) &&
+ (command != MMC_SEND_TUNING_BLOCK_HS200) &&
+ (command != MMC_SEND_TUNING_BLOCK))
+ host->flags |= SDHCI_NEEDS_RETUNING;
tasklet_schedule(&host->finish_tasklet);
return;
}
diff --git a/drivers/power/qpnp-charger.c b/drivers/power/qpnp-charger.c
index df3493a..94d48e6 100644
--- a/drivers/power/qpnp-charger.c
+++ b/drivers/power/qpnp-charger.c
@@ -98,6 +98,8 @@
#define CHGR_BUCK_PSTG_CTRL 0x73
#define CHGR_BUCK_COMPARATOR_OVRIDE_1 0xEB
#define CHGR_BUCK_COMPARATOR_OVRIDE_3 0xED
+#define CHG_OVR0 0xED
+#define CHG_TRICKLE_CLAMP 0xE3
#define CHGR_BUCK_BCK_VBAT_REG_MODE 0x74
#define MISC_REVISION2 0x01
#define USB_OVP_CTL 0x42
@@ -4584,6 +4586,25 @@
CHGR_IBAT_TERM_CHGR,
0xFF, 0x08, 1);
+ /* HACK: trkl stuck workaround */
+
+ rc = qpnp_chg_masked_write(chip,
+ chip->chgr_base + SEC_ACCESS,
+ 0xFF,
+ 0xA5, 1);
+
+ rc = qpnp_chg_masked_write(chip, chip->chgr_base +
+ CHG_OVR0,
+ 0xFF, 0x00, 1);
+
+ rc = qpnp_chg_masked_write(chip,
+ chip->chgr_base + SEC_ACCESS,
+ 0xFF,
+ 0xA5, 1);
+
+ rc = qpnp_chg_masked_write(chip, chip->chgr_base +
+ CHG_TRICKLE_CLAMP,
+ 0xFF, 0x00, 1);
break;
case SMBB_BUCK_SUBTYPE:
case SMBBP_BUCK_SUBTYPE:
diff --git a/drivers/tty/serial/msm_serial_hs.c b/drivers/tty/serial/msm_serial_hs.c
index 6078ef1..a6c60ce 100644
--- a/drivers/tty/serial/msm_serial_hs.c
+++ b/drivers/tty/serial/msm_serial_hs.c
@@ -3301,32 +3301,31 @@
if (is_blsp_uart(msm_uport)) {
core_resource = platform_get_resource_byname(pdev,
IORESOURCE_MEM, "core_mem");
- bam_resource = platform_get_resource_byname(pdev,
- IORESOURCE_MEM, "bam_mem");
- core_irqres = platform_get_irq_byname(pdev, "core_irq");
- bam_irqres = platform_get_irq_byname(pdev, "bam_irq");
- wakeup_irqres = platform_get_irq_byname(pdev, "wakeup_irq");
-
if (!core_resource) {
MSM_HS_ERR("Invalid core HSUART Resources.\n");
return -ENXIO;
}
-
+ bam_resource = platform_get_resource_byname(pdev,
+ IORESOURCE_MEM, "bam_mem");
if (!bam_resource) {
MSM_HS_ERR("Invalid BAM HSUART Resources.\n");
return -ENXIO;
}
-
- if (!core_irqres) {
+ core_irqres = platform_get_irq_byname(pdev, "core_irq");
+ if (core_irqres < 0) {
MSM_HS_ERR("Invalid core irqres Resources.\n");
return -ENXIO;
}
- if (!bam_irqres) {
+ bam_irqres = platform_get_irq_byname(pdev, "bam_irq");
+ if (bam_irqres < 0) {
MSM_HS_ERR("Invalid bam irqres Resources.\n");
return -ENXIO;
}
- if (!wakeup_irqres)
+ wakeup_irqres = platform_get_irq_byname(pdev, "wakeup_irq");
+ if (wakeup_irqres < 0) {
+ wakeup_irqres = -1;
MSM_HS_DBG("Wakeup irq not specified.\n");
+ }
uport->mapbase = core_resource->start;
@@ -3390,11 +3389,6 @@
msm_uport->wakeup.inject_rx = pdata->inject_rx_on_wakeup;
msm_uport->wakeup.rx_to_inject = pdata->rx_to_inject;
- if (unlikely(msm_uport->wakeup.irq < 0)) {
- ret = -ENXIO;
- goto deregister_bus_client;
- }
-
if (is_blsp_uart(msm_uport)) {
msm_uport->bam_tx_ep_pipe_index =
pdata->bam_tx_ep_pipe_index;
diff --git a/drivers/video/msm/mdss/dsi_status_6g.c b/drivers/video/msm/mdss/dsi_status_6g.c
index 4f7e4da..ead7f2c 100644
--- a/drivers/video/msm/mdss/dsi_status_6g.c
+++ b/drivers/video/msm/mdss/dsi_status_6g.c
@@ -65,6 +65,7 @@
return;
}
+ mutex_lock(&ctrl_pdata->mutex);
if (ctl->shared_lock)
mutex_lock(ctl->shared_lock);
mutex_lock(&mdp5_data->ov_lock);
@@ -73,7 +74,8 @@
mutex_unlock(&mdp5_data->ov_lock);
if (ctl->shared_lock)
mutex_unlock(ctl->shared_lock);
- pr_err("%s: DSI turning off, avoiding BTA status check\n",
+ mutex_unlock(&ctrl_pdata->mutex);
+ pr_err("%s: DSI turning off, avoiding panel status check\n",
__func__);
return;
}
@@ -100,6 +102,7 @@
mutex_unlock(&mdp5_data->ov_lock);
if (ctl->shared_lock)
mutex_unlock(ctl->shared_lock);
+ mutex_unlock(&ctrl_pdata->mutex);
if ((pstatus_data->mfd->panel_power_on)) {
if (ret > 0) {
diff --git a/drivers/video/msm/mdss/mdss_dsi.c b/drivers/video/msm/mdss/mdss_dsi.c
index e724d68..e3f8122 100644
--- a/drivers/video/msm/mdss/mdss_dsi.c
+++ b/drivers/video/msm/mdss/mdss_dsi.c
@@ -316,6 +316,7 @@
ctrl_pdata = container_of(pdata, struct mdss_dsi_ctrl_pdata,
panel_data);
+ mutex_lock(&ctrl_pdata->mutex);
panel_info = &ctrl_pdata->panel_data.panel_info;
pr_debug("%s+: ctrl=%p ndx=%d\n", __func__,
ctrl_pdata, ctrl_pdata->ndx);
@@ -333,6 +334,7 @@
ret = mdss_dsi_panel_power_on(pdata, 0);
if (ret) {
+ mutex_unlock(&ctrl_pdata->mutex);
pr_err("%s: Panel power off failed\n", __func__);
return ret;
}
@@ -342,6 +344,7 @@
&& (panel_info->new_fps != panel_info->mipi.frame_rate))
panel_info->mipi.frame_rate = panel_info->new_fps;
+ mutex_unlock(&ctrl_pdata->mutex);
pr_debug("%s-:\n", __func__);
return ret;