Merge "ARM: dts: msm: Update the vifeed back routing"
diff --git a/drivers/cpufreq/cpufreq_ondemand.c b/drivers/cpufreq/cpufreq_ondemand.c
index 7f8b4cd..c3d4c0b 100644
--- a/drivers/cpufreq/cpufreq_ondemand.c
+++ b/drivers/cpufreq/cpufreq_ondemand.c
@@ -4,7 +4,7 @@
* Copyright (C) 2001 Russell King
* (C) 2003 Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>.
* Jun Nakajima <jun.nakajima@intel.com>
- * (c) 2013 The Linux Foundation. All rights reserved.
+ * (c) 2013, 2015 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 as
@@ -108,6 +108,7 @@
struct task_struct *sync_thread;
wait_queue_head_t sync_wq;
atomic_t src_sync_cpu;
+ atomic_t being_woken;
atomic_t sync_enabled;
};
static DEFINE_PER_CPU(struct cpu_dbs_info_s, od_cpu_dbs_info);
@@ -1087,7 +1088,16 @@
&per_cpu(od_cpu_dbs_info, target_cpu);
atomic_set(&target_dbs_info->src_sync_cpu, (int)arg);
- wake_up(&target_dbs_info->sync_wq);
+ /*
+ * Avoid issuing recursive wakeup call, as sync thread itself could be
+ * seen as migrating triggering this notification. Note that sync thread
+ * of a cpu could be running for a short while with its affinity broken
+ * because of CPU hotplug.
+ */
+ if (!atomic_cmpxchg(&target_dbs_info->being_woken, 0, 1)) {
+ wake_up(&target_dbs_info->sync_wq);
+ atomic_set(&target_dbs_info->being_woken, 0);
+ }
return NOTIFY_OK;
}
@@ -1442,6 +1452,7 @@
dbs_work->cpu = i;
atomic_set(&this_dbs_info->src_sync_cpu, -1);
+ atomic_set(&this_dbs_info->being_woken, 0);
init_waitqueue_head(&this_dbs_info->sync_wq);
this_dbs_info->sync_thread = kthread_run(dbs_sync_thread,
diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c
index c09447d..22572aa 100644
--- a/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c
+++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c
@@ -868,6 +868,21 @@
uint32_t pingpong_bit = 0;
uint32_t bufq_handle = stream_info->bufq_handle;
uint32_t stream_idx = HANDLE_TO_IDX(stream_info->stream_handle);
+ uint32_t src_intf = SRC_TO_INTF(stream_info->stream_src);
+ uint32_t frame_id = 0;
+ if (stream_idx >= MAX_NUM_STREAM) {
+ pr_err("%s: Invalid stream_idx", __func__);
+ return rc;
+ }
+ if (src_intf < VFE_SRC_MAX)
+ frame_id = vfe_dev->axi_data.src_info[src_intf].frame_id;
+
+ if (frame_id && (stream_info->frame_id >= frame_id)) {
+ pr_err("%s: duplicate frame_id, Session frm id %d cur frm id %d\n",
+ __func__, frame_id, stream_info->frame_id);
+ vfe_dev->error_info.stream_framedrop_count[stream_idx]++;
+ return rc;
+ }
rc = vfe_dev->buf_mgr->ops->get_buf(vfe_dev->buf_mgr,
vfe_dev->pdev->id, bufq_handle, &buf);
@@ -1277,6 +1292,7 @@
}
stream_info = &axi_data->stream_info[
HANDLE_TO_IDX(stream_cfg_cmd->stream_handle[i])];
+ stream_info->frame_id = 0;
if (SRC_TO_INTF(stream_info->stream_src) < VFE_SRC_MAX)
src_state = axi_data->src_info[
SRC_TO_INTF(stream_info->stream_src)].active;
@@ -1573,7 +1589,6 @@
vfe_dev->hw_info->vfe_ops.axi_ops.get_pingpong_status(vfe_dev);
msm_isp_get_buffer_ts(vfe_dev, ts, &buf_ts);
-
for (i = 0; i < axi_data->hw_info->num_comp_mask; i++) {
comp_info = &axi_data->composite_info[i];
if (comp_mask & (1 << i)) {
@@ -1590,7 +1605,6 @@
ISP_DBG("%s: stream%d frame id: 0x%x\n",
__func__,
stream_idx, stream_info->frame_id);
- stream_info->frame_id++;
if (stream_info->stream_type == BURST_STREAM)
stream_info->
@@ -1606,6 +1620,11 @@
vfe_dev, stream_info,
pingpong_status);
}
+ if ((stream_info->stream_src < RDI_INTF_0) &&
+ SRC_TO_INTF(stream_info->stream_src) < VFE_SRC_MAX) {
+ stream_info->frame_id = vfe_dev->axi_data.
+ src_info[SRC_TO_INTF(stream_info->stream_src)].frame_id;
+ }
if (done_buf && !rc)
msm_isp_process_done_buf(vfe_dev,
stream_info, done_buf, &buf_ts);
@@ -1627,7 +1646,6 @@
ISP_DBG("%s: stream%d frame id: 0x%x\n",
__func__,
stream_idx, stream_info->frame_id);
- stream_info->frame_id++;
if (stream_info->stream_type == BURST_STREAM)
stream_info->runtime_num_burst_capture--;
@@ -1639,6 +1657,10 @@
rc = msm_isp_cfg_ping_pong_address(vfe_dev,
stream_info, pingpong_status);
}
+ if ((stream_info->stream_src < RDI_INTF_0) &&
+ SRC_TO_INTF(stream_info->stream_src) < VFE_SRC_MAX)
+ stream_info->frame_id = vfe_dev->axi_data.
+ src_info[SRC_TO_INTF(stream_info->stream_src)].frame_id;
if (done_buf && !rc)
msm_isp_process_done_buf(vfe_dev,
stream_info, done_buf, &buf_ts);
diff --git a/drivers/media/platform/msm/camera_v2/sensor/gc0339.c b/drivers/media/platform/msm/camera_v2/sensor/gc0339.c
index 36f3b61..9675e77 100644
--- a/drivers/media/platform/msm/camera_v2/sensor/gc0339.c
+++ b/drivers/media/platform/msm/camera_v2/sensor/gc0339.c
@@ -514,10 +514,16 @@
}
if (conf_array.addr_type == MSM_CAMERA_I2C_WORD_ADDR
- || conf_array.data_type == MSM_CAMERA_I2C_WORD_DATA
- || !conf_array.size)
+ || conf_array.data_type == MSM_CAMERA_I2C_WORD_DATA)
break;
+ if ((!conf_array.size) ||
+ (conf_array.size > I2C_SEQ_REG_DATA_MAX)) {
+ pr_err("%s:%d failed\n", __func__, __LINE__);
+ rc = -EFAULT;
+ break;
+ }
+
reg_setting = kzalloc(conf_array.size *
(sizeof(struct msm_camera_i2c_reg_array)), GFP_KERNEL);
if (!reg_setting) {
@@ -552,6 +558,13 @@
break;
}
+ if ((!conf_array.size) ||
+ (conf_array.size > I2C_SEQ_REG_DATA_MAX)) {
+ pr_err("%s:%d failed\n", __func__, __LINE__);
+ rc = -EFAULT;
+ break;
+ }
+
reg_setting = kzalloc(conf_array.size *
(sizeof(struct msm_camera_i2c_seq_reg_array)),
GFP_KERNEL);
diff --git a/drivers/media/platform/msm/camera_v2/sensor/hi256.c b/drivers/media/platform/msm/camera_v2/sensor/hi256.c
index c7e0cb5..1cec087 100644
--- a/drivers/media/platform/msm/camera_v2/sensor/hi256.c
+++ b/drivers/media/platform/msm/camera_v2/sensor/hi256.c
@@ -1922,6 +1922,13 @@
break;
}
+ if ((!conf_array.size) ||
+ (conf_array.size > I2C_SEQ_REG_DATA_MAX)) {
+ pr_err("%s:%d failed\n", __func__, __LINE__);
+ rc = -EFAULT;
+ break;
+ }
+
reg_setting = kzalloc(conf_array.size *
(sizeof(struct msm_camera_i2c_reg_array)), GFP_KERNEL);
if (!reg_setting) {
@@ -1956,6 +1963,12 @@
break;
}
+ if ((!conf_array.size) ||
+ (conf_array.size > I2C_SEQ_REG_DATA_MAX)) {
+ pr_err("%s:%d failed\n", __func__, __LINE__);
+ rc = -EFAULT;
+ break;
+ }
reg_setting = kzalloc(conf_array.size *
(sizeof(struct msm_camera_i2c_seq_reg_array)),
GFP_KERNEL);
diff --git a/drivers/media/platform/msm/camera_v2/sensor/msm_sensor.c b/drivers/media/platform/msm/camera_v2/sensor/msm_sensor.c
index 279a7dd..4c0fa81 100755
--- a/drivers/media/platform/msm/camera_v2/sensor/msm_sensor.c
+++ b/drivers/media/platform/msm/camera_v2/sensor/msm_sensor.c
@@ -738,7 +738,8 @@
break;
}
- if (!conf_array.size) {
+ if ((!conf_array.size) ||
+ (conf_array.size > I2C_SEQ_REG_DATA_MAX)) {
pr_err("%s:%d failed\n", __func__, __LINE__);
rc = -EFAULT;
break;
@@ -912,7 +913,8 @@
break;
}
- if (!conf_array.size) {
+ if ((!conf_array.size) ||
+ (conf_array.size > I2C_SEQ_REG_DATA_MAX)) {
pr_err("%s:%d failed\n", __func__, __LINE__);
rc = -EFAULT;
break;
diff --git a/drivers/media/platform/msm/camera_v2/sensor/mt9m114.c b/drivers/media/platform/msm/camera_v2/sensor/mt9m114.c
index 367bdbe..d0049db 100644
--- a/drivers/media/platform/msm/camera_v2/sensor/mt9m114.c
+++ b/drivers/media/platform/msm/camera_v2/sensor/mt9m114.c
@@ -1330,9 +1330,8 @@
break;
}
- if (!conf_array.size ||
- conf_array.size > I2C_SEQ_REG_DATA_MAX) {
-
+ if ((!conf_array.size) ||
+ (conf_array.size > I2C_SEQ_REG_DATA_MAX)) {
pr_err("%s:%d failed\n", __func__, __LINE__);
rc = -EFAULT;
break;
@@ -1372,6 +1371,12 @@
break;
}
+ if ((!conf_array.size) ||
+ (conf_array.size > I2C_SEQ_REG_DATA_MAX)) {
+ pr_err("%s:%d failed\n", __func__, __LINE__);
+ rc = -EFAULT;
+ break;
+ }
reg_setting = kzalloc(conf_array.size *
(sizeof(struct msm_camera_i2c_seq_reg_array)),
GFP_KERNEL);
diff --git a/drivers/media/platform/msm/camera_v2/sensor/sp1628.c b/drivers/media/platform/msm/camera_v2/sensor/sp1628.c
index d4e4cdf..69440d2 100755
--- a/drivers/media/platform/msm/camera_v2/sensor/sp1628.c
+++ b/drivers/media/platform/msm/camera_v2/sensor/sp1628.c
@@ -771,6 +771,13 @@
break;
}
+ if ((!conf_array.size) ||
+ (conf_array.size > I2C_SEQ_REG_DATA_MAX)) {
+ pr_err("%s:%d failed\n", __func__, __LINE__);
+ rc = -EFAULT;
+ break;
+ }
+
reg_setting = kzalloc(conf_array.size *
(sizeof(struct msm_camera_i2c_reg_array)), GFP_KERNEL);
if (!reg_setting) {
@@ -805,6 +812,12 @@
break;
}
+ if ((!conf_array.size) ||
+ (conf_array.size > I2C_SEQ_REG_DATA_MAX)) {
+ pr_err("%s:%d failed\n", __func__, __LINE__);
+ rc = -EFAULT;
+ break;
+ }
reg_setting = kzalloc(conf_array.size *
(sizeof(struct msm_camera_i2c_seq_reg_array)),
GFP_KERNEL);
diff --git a/drivers/net/wireless/wcnss/wcnss_vreg.c b/drivers/net/wireless/wcnss/wcnss_vreg.c
index 6cfd8cb..599318e 100644
--- a/drivers/net/wireless/wcnss/wcnss_vreg.c
+++ b/drivers/net/wireless/wcnss/wcnss_vreg.c
@@ -44,6 +44,13 @@
#define PRONTO_IRIS_REG_READ_OFFSET 0x1134
#define PRONTO_IRIS_REG_CHIP_ID 0x04
+/* IRIS card chip ID's */
+#define WCN3660 0x0200
+#define WCN3660A 0x0300
+#define WCN3660B 0x0400
+#define WCN3620 0x5111
+#define WCN3620A 0x5112
+#define WCN3610 0x9101
#define WCNSS_PMU_CFG_IRIS_XO_CFG BIT(3)
#define WCNSS_PMU_CFG_IRIS_XO_EN BIT(4)
@@ -141,10 +148,44 @@
}
}
+int validate_iris_chip_id(u32 reg)
+{
+ int iris_id;
+ iris_id = reg >> 16;
+
+ switch (iris_id) {
+ case WCN3660:
+ case WCN3660A:
+ case WCN3660B:
+ case WCN3620:
+ case WCN3620A:
+ case WCN3610:
+ return 0;
+ default:
+ return 1;
+ }
+}
+
+void wcnss_iris_reset(u32 reg, void __iomem *pmu_conf_reg)
+{
+ /* Reset IRIS */
+ reg |= WCNSS_PMU_CFG_IRIS_RESET;
+ writel_relaxed(reg, pmu_conf_reg);
+
+ /* Wait for PMU_CFG.iris_reg_reset_sts */
+ while (readl_relaxed(pmu_conf_reg) &
+ WCNSS_PMU_CFG_IRIS_RESET_STS)
+ cpu_relax();
+
+ /* Reset iris reset bit */
+ reg &= ~WCNSS_PMU_CFG_IRIS_RESET;
+ writel_relaxed(reg, pmu_conf_reg);
+}
+
static int configure_iris_xo(struct device *dev, bool use_48mhz_xo, int on,
int *iris_xo_set)
{
- u32 reg = 0;
+ u32 reg = 0, i = 0;
u32 iris_reg = WCNSS_INVALID_IRIS_REG;
int rc = 0;
int size = 0;
@@ -218,34 +259,44 @@
iris_reg = readl_relaxed(iris_read_reg);
}
+ wcnss_iris_reset(reg, pmu_conf_reg);
+
if (iris_reg != WCNSS_INVALID_IRIS_REG) {
iris_reg &= 0xffff;
iris_reg |= PRONTO_IRIS_REG_CHIP_ID;
writel_relaxed(iris_reg, iris_read_reg);
+ do {
+ /* Iris read */
+ reg = readl_relaxed(pmu_conf_reg);
+ reg |= WCNSS_PMU_CFG_IRIS_XO_READ;
+ writel_relaxed(reg, pmu_conf_reg);
- /* Iris read */
- reg = readl_relaxed(pmu_conf_reg);
- reg |= WCNSS_PMU_CFG_IRIS_XO_READ;
- writel_relaxed(reg, pmu_conf_reg);
+ /* Wait for PMU_CFG.iris_reg_read_sts */
+ while (readl_relaxed(pmu_conf_reg) &
+ WCNSS_PMU_CFG_IRIS_XO_READ_STS)
+ cpu_relax();
- /* Wait for PMU_CFG.iris_reg_read_sts */
- while (readl_relaxed(pmu_conf_reg) &
- WCNSS_PMU_CFG_IRIS_XO_READ_STS)
- cpu_relax();
+ iris_reg = readl_relaxed(iris_read_reg);
+ pr_info("wcnss: IRIS Reg: %08x\n", iris_reg);
- iris_reg = readl_relaxed(iris_read_reg);
- pr_info("wcnss: IRIS Reg: %08x\n", iris_reg);
- if (iris_reg == PRONTO_IRIS_REG_CHIP_ID) {
- pr_info("wcnss: IRIS Card not Preset\n");
- auto_detect = WCNSS_XO_INVALID;
- /* Reset iris read bit */
+ if (validate_iris_chip_id(iris_reg) && i >= 4) {
+ pr_info("wcnss: IRIS Card absent/invalid\n");
+ auto_detect = WCNSS_XO_INVALID;
+ /* Reset iris read bit */
+ reg &= ~WCNSS_PMU_CFG_IRIS_XO_READ;
+ /* Clear XO_MODE[b2:b1] bits.
+ * Clear implies 19.2 MHz TCXO
+ */
+ reg &= ~(WCNSS_PMU_CFG_IRIS_XO_MODE);
+ goto xo_configure;
+ } else if (!validate_iris_chip_id(iris_reg)) {
+ pr_debug("wcnss: IRIS Card is present\n");
+ break;
+ }
reg &= ~WCNSS_PMU_CFG_IRIS_XO_READ;
- /* Clear XO_MODE[b2:b1] bits.
- Clear implies 19.2 MHz TCXO
- */
- reg &= ~(WCNSS_PMU_CFG_IRIS_XO_MODE);
- goto xo_configure;
- }
+ writel_relaxed(reg, pmu_conf_reg);
+ wcnss_iris_reset(reg, pmu_conf_reg);
+ } while (i++ < 5);
auto_detect = xo_auto_detect(iris_reg);
/* Reset iris read bit */
@@ -271,18 +322,7 @@
xo_configure:
writel_relaxed(reg, pmu_conf_reg);
- /* Reset IRIS */
- reg |= WCNSS_PMU_CFG_IRIS_RESET;
- writel_relaxed(reg, pmu_conf_reg);
-
- /* Wait for PMU_CFG.iris_reg_reset_sts */
- while (readl_relaxed(pmu_conf_reg) &
- WCNSS_PMU_CFG_IRIS_RESET_STS)
- cpu_relax();
-
- /* Reset iris reset bit */
- reg &= ~WCNSS_PMU_CFG_IRIS_RESET;
- writel_relaxed(reg, pmu_conf_reg);
+ wcnss_iris_reset(reg, pmu_conf_reg);
/* Start IRIS XO configuration */
reg |= WCNSS_PMU_CFG_IRIS_XO_CFG;
diff --git a/drivers/video/msm/mdss/mdss_dsi_status.c b/drivers/video/msm/mdss/mdss_dsi_status.c
index 02540bb..c36201e 100644
--- a/drivers/video/msm/mdss/mdss_dsi_status.c
+++ b/drivers/video/msm/mdss/mdss_dsi_status.c
@@ -82,9 +82,15 @@
struct dsi_status_data, fb_notifier);
struct mdss_dsi_ctrl_pdata *ctrl_pdata = NULL;
struct mdss_panel_info *pinfo;
+ struct msm_fb_data_type *mfd;
- pdata->mfd = evdata->info->par;
- ctrl_pdata = container_of(dev_get_platdata(&pdata->mfd->pdev->dev),
+ if (!evdata) {
+ pr_err("%s: event data not available\n", __func__);
+ return NOTIFY_BAD;
+ }
+
+ mfd = evdata->info->par;
+ ctrl_pdata = container_of(dev_get_platdata(&mfd->pdev->dev),
struct mdss_dsi_ctrl_pdata, panel_data);
if (!ctrl_pdata) {
pr_err("%s: DSI ctrl not available\n", __func__);
@@ -103,7 +109,8 @@
return NOTIFY_DONE;
}
- if (event == FB_EVENT_BLANK && evdata) {
+ pdata->mfd = evdata->info->par;
+ if (event == FB_EVENT_BLANK) {
int *blank = evdata->data;
struct dsi_status_data *pdata = container_of(self,
struct dsi_status_data, fb_notifier);