Merge "ASoC: msm8974: Set tx bit rate for slim tx params"
diff --git a/arch/arm/boot/dts/msm8226-mdss.dtsi b/arch/arm/boot/dts/msm8226-mdss.dtsi
index 5776926..cedec5f 100644
--- a/arch/arm/boot/dts/msm8226-mdss.dtsi
+++ b/arch/arm/boot/dts/msm8226-mdss.dtsi
@@ -76,7 +76,13 @@
<0x0D8 0x00000707>,
<0x124 0x00000003>;
qcom,mdp-settings = <0x02E0 0x000000A5>,
- <0x02E4 0x00000055>;
+ <0x02E4 0x00000055>,
+ <0x03AC 0xC0000CCC>,
+ <0x03B4 0xC0000000>,
+ <0x03BC 0x00C00C00>,
+ <0x04A8 0x0CCCC000>,
+ <0x04B0 0xC0000000>,
+ <0x04B8 0xC0000000>;
/* buffer parameters to calculate prefill bandwidth */
qcom,mdss-prefill-outstanding-buffer-bytes = <1024>;
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/arch/arm/mach-msm/clock-8226.c b/arch/arm/mach-msm/clock-8226.c
index 7a7c008..e16bcb1 100644
--- a/arch/arm/mach-msm/clock-8226.c
+++ b/arch/arm/mach-msm/clock-8226.c
@@ -3497,8 +3497,36 @@
"fda08400.qcom,csid"),
/* ISPIF clocks */
+
CLK_LOOKUP("ispif_ahb_clk", camss_ispif_ahb_clk.c,
- "fda0a000.qcom,ispif"),
+ "fda0a000.qcom,ispif"),
+ CLK_LOOKUP("camss_top_ahb_clk", camss_top_ahb_clk.c,
+ "fda0a000.qcom,ispif"),
+ CLK_LOOKUP("csi0_ahb_clk", camss_csi0_ahb_clk.c,
+ "fda0a000.qcom,ispif"),
+ CLK_LOOKUP("csi0_src_clk", csi0_clk_src.c,
+ "fda0a000.qcom,ispif"),
+ CLK_LOOKUP("csi0_phy_clk", camss_csi0phy_clk.c,
+ "fda0a000.qcom,ispif"),
+ CLK_LOOKUP("csi0_clk", camss_csi0_clk.c,
+ "fda0a000.qcom,ispif"),
+ CLK_LOOKUP("csi0_pix_clk", camss_csi0pix_clk.c,
+ "fda0a000.qcom,ispif"),
+ CLK_LOOKUP("csi0_rdi_clk", camss_csi0rdi_clk.c,
+ "fda0a000.qcom,ispif"),
+
+ CLK_LOOKUP("csi1_ahb_clk", camss_csi1_ahb_clk.c,
+ "fda0a000.qcom,ispif"),
+ CLK_LOOKUP("csi1_src_clk", csi1_clk_src.c,
+ "fda0a000.qcom,ispif"),
+ CLK_LOOKUP("csi1_phy_clk", camss_csi1phy_clk.c,
+ "fda0a000.qcom,ispif"),
+ CLK_LOOKUP("csi1_clk", camss_csi1_clk.c,
+ "fda0a000.qcom,ispif"),
+ CLK_LOOKUP("csi1_pix_clk", camss_csi1pix_clk.c,
+ "fda0a000.qcom,ispif"),
+ CLK_LOOKUP("csi1_rdi_clk", camss_csi1rdi_clk.c,
+ "fda0a000.qcom,ispif"),
CLK_LOOKUP("camss_vfe_vfe_clk", camss_vfe_vfe0_clk.c,
"fda0a000.qcom,ispif"),
CLK_LOOKUP("camss_csi_vfe_clk", camss_csi_vfe0_clk.c,
diff --git a/arch/arm/mach-msm/include/mach/ocmem_priv.h b/arch/arm/mach-msm/include/mach/ocmem_priv.h
index 00aedb6..c94fa0e 100644
--- a/arch/arm/mach-msm/include/mach/ocmem_priv.h
+++ b/arch/arm/mach-msm/include/mach/ocmem_priv.h
@@ -206,7 +206,7 @@
int check_notifier(int);
const char *get_name(int);
int get_tz_id(int);
-int ocmem_enable_sec_program(int);
+int ocmem_restore_sec_program(int);
int ocmem_enable_dump(enum ocmem_client, unsigned long, unsigned long);
int ocmem_disable_dump(enum ocmem_client, unsigned long, unsigned long);
int check_id(int);
diff --git a/arch/arm/mach-msm/ocmem.c b/arch/arm/mach-msm/ocmem.c
index 99e54b7..4a8cc39 100644
--- a/arch/arm/mach-msm/ocmem.c
+++ b/arch/arm/mach-msm/ocmem.c
@@ -1,4 +1,4 @@
-/* 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
@@ -788,6 +788,7 @@
struct device *dev = &pdev->dev;
struct clk *ocmem_core_clk = NULL;
struct clk *ocmem_iface_clk = NULL;
+ int rc;
if (!pdev->dev.of_node) {
dev_info(dev, "Missing Configuration in Device Tree\n");
@@ -830,10 +831,23 @@
platform_set_drvdata(pdev, ocmem_pdata);
+ rc = ocmem_enable_core_clock();
+ if (rc < 0)
+ goto core_clk_fail;
+
+ rc = ocmem_enable_iface_clock();
+ if (rc < 0)
+ goto iface_clk_fail;
+
/* Parameter to be updated based on TZ */
/* Allow the OCMEM CSR to be programmed */
- if (ocmem_enable_sec_program(OCMEM_SECURE_DEV_ID))
+ if (ocmem_restore_sec_program(OCMEM_SECURE_DEV_ID)) {
+ ocmem_disable_iface_clock();
+ ocmem_disable_core_clock();
return -EBUSY;
+ }
+ ocmem_disable_iface_clock();
+ ocmem_disable_core_clock();
if (ocmem_debugfs_init(pdev))
dev_err(dev, "ocmem: No debugfs node available\n");
@@ -860,6 +874,11 @@
dev_dbg(dev, "initialized successfully\n");
return 0;
+
+iface_clk_fail:
+ ocmem_disable_core_clock();
+core_clk_fail:
+ return rc;
}
static int __devexit msm_ocmem_remove(struct platform_device *pdev)
diff --git a/arch/arm/mach-msm/ocmem_core.c b/arch/arm/mach-msm/ocmem_core.c
index f753391..9c2afb9 100644
--- a/arch/arm/mach-msm/ocmem_core.c
+++ b/arch/arm/mach-msm/ocmem_core.c
@@ -1,4 +1,4 @@
-/* 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
@@ -583,7 +583,7 @@
return 0;
}
-int ocmem_enable_sec_program(int sec_id)
+int ocmem_restore_sec_program(int sec_id)
{
return 0;
}
@@ -702,7 +702,7 @@
return rc;
}
-int ocmem_enable_sec_program(int sec_id)
+int ocmem_restore_sec_program(int sec_id)
{
int rc, scm_ret = 0;
struct msm_scm_sec_cfg {
@@ -953,7 +953,6 @@
unsigned end_m = num_banks;
unsigned long region_offset = 0;
struct ocmem_hw_region *region;
- int rc = 0;
if (offset < 0)
return -EINVAL;
@@ -974,14 +973,6 @@
(region_end >= num_regions))
return -EINVAL;
- rc = ocmem_enable_core_clock();
-
- if (rc < 0) {
- pr_err("ocmem: Power transistion request for client %s (id: %d) failed\n",
- get_name(id), id);
- return rc;
- }
-
mutex_lock(®ion_ctrl_lock);
for (i = region_start; i <= region_end; i++) {
@@ -1035,11 +1026,10 @@
}
mutex_unlock(®ion_ctrl_lock);
- ocmem_disable_core_clock();
+
return 0;
invalid_transition:
mutex_unlock(®ion_ctrl_lock);
- ocmem_disable_core_clock();
pr_err("ocmem_core: Invalid state transition detected for %d\n", id);
pr_err("ocmem_core: Offset %lx Len %lx curr_state %x new_state %x\n",
offset, len, curr_state, new_state);
@@ -1122,9 +1112,37 @@
static int ocmem_power_show(struct seq_file *f, void *dummy)
{
+ int rc = 0;
+
+ rc = ocmem_enable_core_clock();
+
+ if (rc < 0)
+ goto core_clock_fail;
+
+ rc = ocmem_enable_iface_clock();
+
+ if (rc < 0)
+ goto iface_clock_fail;
+
+ rc = ocmem_restore_sec_program(OCMEM_SECURE_DEV_ID);
+ if (rc < 0) {
+ pr_err("ocmem: Failed to restore security programming\n");
+ goto restore_config_fail;
+ }
ocmem_power_show_sw_state(f, dummy);
ocmem_power_show_hw_state(f, dummy);
+
+ ocmem_disable_iface_clock();
+ ocmem_disable_core_clock();
+
return 0;
+
+restore_config_fail:
+ ocmem_disable_iface_clock();
+iface_clock_fail:
+ ocmem_disable_core_clock();
+core_clock_fail:
+ return -EINVAL;
}
static int ocmem_power_open(struct inode *inode, struct file *file)
diff --git a/arch/arm/mach-msm/ocmem_sched.c b/arch/arm/mach-msm/ocmem_sched.c
index 8e25bb2..78279ed 100644
--- a/arch/arm/mach-msm/ocmem_sched.c
+++ b/arch/arm/mach-msm/ocmem_sched.c
@@ -634,17 +634,11 @@
{
int rc = 0;
- rc = ocmem_enable_core_clock();
+ rc = ocmem_restore_sec_program(OCMEM_SECURE_DEV_ID);
- if (rc < 0)
- goto core_clock_fail;
-
-
- if (is_iface_access(req->owner)) {
- rc = ocmem_enable_iface_clock();
-
- if (rc < 0)
- goto iface_clock_fail;
+ if (rc < 0) {
+ pr_err("ocmem: Failed to restore security programming\n");
+ goto lock_failed;
}
rc = ocmem_lock(req->owner, phys_to_offset(req->req_start), req->req_sz,
@@ -670,11 +664,6 @@
process_map_fail:
ocmem_unlock(req->owner, phys_to_offset(req->req_start), req->req_sz);
lock_failed:
- if (is_iface_access(req->owner))
- ocmem_disable_iface_clock();
-iface_clock_fail:
- ocmem_disable_core_clock();
-core_clock_fail:
pr_err("ocmem: Failed to map ocmem request\n");
return rc;
}
@@ -698,9 +687,6 @@
goto unlock_failed;
}
- if (is_iface_access(req->owner))
- ocmem_disable_iface_clock();
- ocmem_disable_core_clock();
pr_debug("ocmem: Unmapped request %p\n", req);
return 0;
@@ -1345,9 +1331,21 @@
if (rc < 0)
return -EINVAL;
+ rc = ocmem_enable_core_clock();
+
+ if (rc < 0)
+ goto core_clock_fail;
+
+ if (is_iface_access(req->owner)) {
+ rc = ocmem_enable_iface_clock();
+
+ if (rc < 0)
+ goto iface_clock_fail;
+ }
+
rc = process_map(req, req->req_start, req->req_end);
if (rc < 0)
- return -EINVAL;
+ goto map_error;
offset = phys_to_offset(req->req_start);
@@ -1366,7 +1364,14 @@
BUG();
}
return 0;
+
power_ctl_error:
+map_error:
+if (is_iface_access(req->owner))
+ ocmem_disable_iface_clock();
+iface_clock_fail:
+ ocmem_disable_core_clock();
+core_clock_fail:
return -EINVAL;
}
@@ -1536,6 +1541,10 @@
}
}
+ if (is_iface_access(req->owner))
+ ocmem_disable_iface_clock();
+ ocmem_disable_core_clock();
+
rc = do_free(req);
if (rc < 0) {
pr_err("ocmem: Failed to free %p\n", req);
@@ -1556,6 +1565,9 @@
pr_err("Failed to switch OFF memory macros\n");
goto free_fail;
}
+ if (is_iface_access(req->owner))
+ ocmem_disable_iface_clock();
+ ocmem_disable_core_clock();
}
/* free the allocation */
@@ -1658,6 +1670,10 @@
rc = process_unmap(req, req->req_start, req->req_end);
if (rc < 0)
return -EINVAL;
+
+ if (is_iface_access(req->owner))
+ ocmem_disable_iface_clock();
+ ocmem_disable_core_clock();
} else
return -EINVAL;
@@ -1768,6 +1784,9 @@
rc = process_unmap(req, req->req_start, req->req_end);
if (rc < 0)
goto shrink_fail;
+ if (is_iface_access(req->owner))
+ ocmem_disable_iface_clock();
+ ocmem_disable_core_clock();
}
rc = do_free(req);
if (rc < 0)
@@ -2254,6 +2273,17 @@
if (req->req_sz != 0) {
+ rc = ocmem_enable_core_clock();
+
+ if (rc < 0)
+ goto core_clock_fail;
+
+ if (is_iface_access(req->owner)) {
+ rc = ocmem_enable_iface_clock();
+
+ if (rc < 0)
+ goto iface_clock_fail;
+ }
rc = process_map(req, req->req_start, req->req_end);
if (rc < 0)
goto map_error;
@@ -2275,6 +2305,11 @@
map_error:
handle->req = NULL;
do_free(req);
+ if (is_iface_access(req->owner))
+ ocmem_disable_iface_clock();
+iface_clock_fail:
+ ocmem_disable_core_clock();
+core_clock_fail:
do_allocate_error:
ocmem_destroy_req(req);
return -EINVAL;
@@ -2303,6 +2338,17 @@
inc_ocmem_stat(zone_of(req), NR_ASYNC_ALLOCATIONS);
if (req->req_sz != 0) {
+ rc = ocmem_enable_core_clock();
+
+ if (rc < 0)
+ goto core_clock_fail;
+
+ if (is_iface_access(req->owner)) {
+ rc = ocmem_enable_iface_clock();
+
+ if (rc < 0)
+ goto iface_clock_fail;
+ }
rc = process_map(req, req->req_start, req->req_end);
if (rc < 0)
@@ -2333,6 +2379,11 @@
map_error:
handle->req = NULL;
do_free(req);
+ if (is_iface_access(req->owner))
+ ocmem_disable_iface_clock();
+iface_clock_fail:
+ ocmem_disable_core_clock();
+core_clock_fail:
do_allocate_error:
ocmem_destroy_req(req);
return -EINVAL;
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..ee69840 100644
--- a/drivers/hwmon/qpnp-adc-voltage.c
+++ b/drivers/hwmon/qpnp-adc-voltage.c
@@ -600,6 +600,7 @@
QPNP_VBAT_COEFF_25;
break;
}
+ break;
case QPNP_REV_ID_8110_2_0:
switch (vadc->id) {
case COMP_ID_SMIC:
@@ -713,6 +714,7 @@
temp_var = 0;
break;
}
+ break;
case QPNP_REV_ID_8110_2_0:
switch (vadc->id) {
case COMP_ID_SMIC:
@@ -1173,6 +1175,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/camera_v2/ispif/msm_ispif.c b/drivers/media/platform/msm/camera_v2/ispif/msm_ispif.c
index a08fad7..8f99ff6 100755
--- a/drivers/media/platform/msm/camera_v2/ispif/msm_ispif.c
+++ b/drivers/media/platform/msm/camera_v2/ispif/msm_ispif.c
@@ -64,6 +64,25 @@
false : true;
}
+static struct msm_cam_clk_info ispif_8626_reset_clk_info[] = {
+ {"ispif_ahb_clk", NO_SET_RATE},
+ {"camss_top_ahb_clk", NO_SET_RATE},
+ {"csi0_ahb_clk", NO_SET_RATE},
+ {"csi0_src_clk", NO_SET_RATE},
+ {"csi0_phy_clk", NO_SET_RATE},
+ {"csi0_clk", NO_SET_RATE},
+ {"csi0_pix_clk", NO_SET_RATE},
+ {"csi0_rdi_clk", NO_SET_RATE},
+ {"csi1_ahb_clk", NO_SET_RATE},
+ {"csi1_src_clk", NO_SET_RATE},
+ {"csi1_phy_clk", NO_SET_RATE},
+ {"csi1_clk", NO_SET_RATE},
+ {"csi1_pix_clk", NO_SET_RATE},
+ {"csi1_rdi_clk", NO_SET_RATE},
+ {"camss_vfe_vfe_clk", NO_SET_RATE},
+ {"camss_csi_vfe_clk", NO_SET_RATE},
+};
+
static struct msm_cam_clk_info ispif_8974_ahb_clk_info[] = {
{"ispif_ahb_clk", -1},
};
@@ -98,13 +117,26 @@
int rc = 0;
long timeout = 0;
struct clk *reset_clk[ARRAY_SIZE(ispif_8974_reset_clk_info)];
+ struct clk *reset_clk1[ARRAY_SIZE(ispif_8626_reset_clk_info)];
+ ispif->clk_idx = 0;
rc = msm_cam_clk_enable(&ispif->pdev->dev,
ispif_8974_reset_clk_info, reset_clk,
ARRAY_SIZE(ispif_8974_reset_clk_info), 1);
if (rc < 0) {
- pr_err("%s: cannot enable clock, error = %d",
- __func__, rc);
+ rc = msm_cam_clk_enable(&ispif->pdev->dev,
+ ispif_8626_reset_clk_info, reset_clk1,
+ ARRAY_SIZE(ispif_8626_reset_clk_info), 1);
+ if (rc < 0){
+ pr_err("%s: cannot enable clock, error = %d",
+ __func__, rc);
+ } else {
+ /* This is set if device is 8x26 */
+ ispif->clk_idx = 2;
+ }
+ } else {
+ /* This is set if device is 8974 */
+ ispif->clk_idx = 1;
}
init_completion(&ispif->reset_complete[VFE0]);
@@ -121,11 +153,19 @@
timeout = wait_for_completion_timeout(
&ispif->reset_complete[VFE0], msecs_to_jiffies(500));
CDBG("%s: VFE0 done\n", __func__);
+
if (timeout <= 0) {
pr_err("%s: VFE0 reset wait timeout\n", __func__);
- msm_cam_clk_enable(&ispif->pdev->dev,
+ rc = msm_cam_clk_enable(&ispif->pdev->dev,
ispif_8974_reset_clk_info, reset_clk,
ARRAY_SIZE(ispif_8974_reset_clk_info), 0);
+ if (rc < 0){
+ rc = msm_cam_clk_enable(&ispif->pdev->dev,
+ ispif_8626_reset_clk_info, reset_clk1,
+ ARRAY_SIZE(ispif_8626_reset_clk_info), 0);
+ if (rc < 0)
+ pr_err("%s: VFE0 reset wait timeout\n", __func__);
+ }
return -ETIMEDOUT;
}
@@ -143,13 +183,26 @@
}
}
- rc = msm_cam_clk_enable(&ispif->pdev->dev,
- ispif_8974_reset_clk_info, reset_clk,
- ARRAY_SIZE(ispif_8974_reset_clk_info), 0);
- if (rc < 0) {
- pr_err("%s: cannot disable clock, error = %d",
- __func__, rc);
+ if (ispif->clk_idx == 1){
+ rc = msm_cam_clk_enable(&ispif->pdev->dev,
+ ispif_8974_reset_clk_info, reset_clk,
+ ARRAY_SIZE(ispif_8974_reset_clk_info), 0);
+ if (rc < 0) {
+ pr_err("%s: cannot disable clock, error = %d",
+ __func__, rc);
+ }
}
+
+ if (ispif->clk_idx == 2){
+ rc = msm_cam_clk_enable(&ispif->pdev->dev,
+ ispif_8626_reset_clk_info, reset_clk1,
+ ARRAY_SIZE(ispif_8626_reset_clk_info), 0);
+ if (rc < 0) {
+ pr_err("%s: cannot disable clock, error = %d",
+ __func__, rc);
+ }
+ }
+
return rc;
}
@@ -941,11 +994,7 @@
goto error_ahb;
}
- if (of_device_is_compatible(ispif->pdev->dev.of_node,
- "qcom,ispif-v3.0")) {
- /* currently HW reset is implemented for 8974 only */
- msm_ispif_reset_hw(ispif);
- }
+ msm_ispif_reset_hw(ispif);
rc = msm_ispif_reset(ispif);
if (rc == 0) {
diff --git a/drivers/media/platform/msm/camera_v2/ispif/msm_ispif.h b/drivers/media/platform/msm/camera_v2/ispif/msm_ispif.h
index 45e7354..10dbfb6 100644
--- a/drivers/media/platform/msm/camera_v2/ispif/msm_ispif.h
+++ b/drivers/media/platform/msm/camera_v2/ispif/msm_ispif.h
@@ -60,5 +60,6 @@
struct clk *ahb_clk;
struct completion reset_complete[VFE_MAX];
uint32_t hw_num_isps;
+ uint32_t clk_idx;
};
#endif
diff --git a/drivers/media/platform/msm/camera_v2/sensor/actuator/msm_actuator.c b/drivers/media/platform/msm/camera_v2/sensor/actuator/msm_actuator.c
index 7805930..8e7dc2c 100644
--- a/drivers/media/platform/msm/camera_v2/sensor/actuator/msm_actuator.c
+++ b/drivers/media/platform/msm/camera_v2/sensor/actuator/msm_actuator.c
@@ -156,6 +156,7 @@
settings[i].i2c_operation);
break;
}
+ break;
}
case MSM_ACT_POLL: {
switch (settings[i].data_type) {
@@ -178,6 +179,7 @@
settings[i].i2c_operation);
break;
}
+ break;
}
}
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/media/platform/msm/vidc/venus_hfi.c b/drivers/media/platform/msm/vidc/venus_hfi.c
index 37b1e72..448fe3b 100644
--- a/drivers/media/platform/msm/vidc/venus_hfi.c
+++ b/drivers/media/platform/msm/vidc/venus_hfi.c
@@ -3739,45 +3739,11 @@
int venus_hfi_get_core_capabilities(void)
{
- int i = 0, rc = 0, j = 0, venus_version_length = 0;
- u32 smem_block_size = 0;
- u8 *smem_table_ptr;
- char version[256];
- const u32 version_string_size = 128;
- char venus_version[] = "VIDEO.VE.1.4";
- u8 version_info[256];
- const u32 smem_image_index_venus = 14 * 128;
- /* Venus version is stored at 14th entry in smem table */
-
- smem_table_ptr = smem_get_entry(SMEM_IMAGE_VERSION_TABLE,
- &smem_block_size);
- if (smem_table_ptr &&
- ((smem_image_index_venus + version_string_size) <=
- smem_block_size)) {
- memcpy(version_info, smem_table_ptr + smem_image_index_venus,
- version_string_size);
- } else {
- dprintk(VIDC_ERR,
- "%s: failed to read version info from smem table\n",
- __func__);
- return -EINVAL;
- }
-
- while (version_info[i++] != 'V' && i < version_string_size)
- ;
-
- venus_version_length = strlen(venus_version);
- for (i--, j = 0; i < version_string_size && j < venus_version_length;
- i++)
- version[j++] = version_info[i];
- version[venus_version_length] = '\0';
- dprintk(VIDC_DBG, "F/W version retrieved : %s\n", version);
-
- if (strcmp((const char *)version, (const char *)venus_version) == 0)
- rc = HAL_VIDEO_ENCODER_ROTATION_CAPABILITY |
- HAL_VIDEO_ENCODER_SCALING_CAPABILITY |
- HAL_VIDEO_ENCODER_DEINTERLACE_CAPABILITY |
- HAL_VIDEO_DECODER_MULTI_STREAM_CAPABILITY;
+ int rc = 0;
+ rc = HAL_VIDEO_ENCODER_ROTATION_CAPABILITY |
+ HAL_VIDEO_ENCODER_SCALING_CAPABILITY |
+ HAL_VIDEO_ENCODER_DEINTERLACE_CAPABILITY |
+ HAL_VIDEO_DECODER_MULTI_STREAM_CAPABILITY;
return rc;
}
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/net/wireless/wcnss/wcnss_vreg.c b/drivers/net/wireless/wcnss/wcnss_vreg.c
index 4713d29..c066acd 100644
--- a/drivers/net/wireless/wcnss/wcnss_vreg.c
+++ b/drivers/net/wireless/wcnss/wcnss_vreg.c
@@ -51,6 +51,8 @@
#define WCNSS_PMU_CFG_GC_BUS_MUX_SEL_TOP BIT(5)
#define WCNSS_PMU_CFG_IRIS_XO_CFG_STS BIT(6) /* 1: in progress, 0: done */
+#define WCNSS_PMU_CFG_IRIS_RESET BIT(7)
+#define WCNSS_PMU_CFG_IRIS_RESET_STS BIT(8) /* 1: in progress, 0: done */
#define WCNSS_PMU_CFG_IRIS_XO_READ BIT(9)
#define WCNSS_PMU_CFG_IRIS_XO_READ_STS BIT(10)
@@ -258,6 +260,19 @@
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);
+
/* Start IRIS XO configuration */
reg |= WCNSS_PMU_CFG_IRIS_XO_CFG;
writel_relaxed(reg, pmu_conf_reg);
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/slimbus/slim-msm-ngd.c b/drivers/slimbus/slim-msm-ngd.c
index 0035349..b4c88cd 100644
--- a/drivers/slimbus/slim-msm-ngd.c
+++ b/drivers/slimbus/slim-msm-ngd.c
@@ -301,17 +301,9 @@
*/
ngd_slim_runtime_resume(dev->dev);
}
- if ((txn->mc == (SLIM_MSG_CLK_PAUSE_SEQ_FLG |
- SLIM_MSG_MC_RECONFIGURE_NOW)) &&
- dev->state <= MSM_CTRL_IDLE) {
- msm_slim_disconnect_endp(dev, &dev->rx_msgq,
- &dev->use_rx_msgqs);
- msm_slim_disconnect_endp(dev, &dev->tx_msgq,
- &dev->use_tx_msgqs);
- return msm_slim_qmi_power_request(dev, false);
- }
+
else if (txn->mc & SLIM_MSG_CLK_PAUSE_SEQ_FLG)
- return 0;
+ return -EPROTONOSUPPORT;
if (txn->mt == SLIM_MSG_MT_CORE &&
(txn->mc >= SLIM_MSG_MC_BEGIN_RECONFIGURATION &&
@@ -385,6 +377,7 @@
if (report_sat == false && dev->state != MSM_CTRL_AWAKE) {
SLIM_ERR(dev, "controller not ready\n");
mutex_unlock(&dev->tx_lock);
+ pm_runtime_set_suspended(dev->dev);
msm_slim_put_ctrl(dev);
return -EREMOTEIO;
}
@@ -1074,20 +1067,7 @@
ret = msm_slim_qmi_init(dev, false);
/* controller state should be in sync with framework state */
if (!ret) {
- ret = slim_ctrl_clk_pause(&dev->ctrl, false,
- SLIM_CLK_UNSPECIFIED);
complete(&dev->qmi.qmi_comp);
- /*
- * Power-up won't be called if clock pause failed.
- * This can happen if ADSP SSR happened when audio
- * session is in progress. Framework will think that
- * clock pause failed so no need to wakeup controller.
- * Call power-up explicitly in that case, since slimbus
- * HW needs to be powered-on to be in sync with
- * framework state
- */
- if (ret)
- ngd_slim_power_up(dev, false);
if (!pm_runtime_enabled(dev->dev) ||
!pm_runtime_suspended(dev->dev))
ngd_slim_runtime_resume(dev->dev);
@@ -1105,10 +1085,25 @@
return ret;
}
-static int ngd_clk_pause_wakeup(struct slim_controller *ctrl)
+static int ngd_slim_power_down(struct msm_slim_ctrl *dev)
{
- struct msm_slim_ctrl *dev = slim_get_ctrldata(ctrl);
- return ngd_slim_power_up(dev, false);
+ int i;
+ struct slim_controller *ctrl = &dev->ctrl;
+ mutex_lock(&ctrl->m_ctrl);
+ /* Pending response for a message */
+ for (i = 0; i < ctrl->last_tid; i++) {
+ if (ctrl->txnt[i]) {
+ SLIM_INFO(dev, "NGD down:txn-rsp for %d pending", i);
+ mutex_unlock(&ctrl->m_ctrl);
+ return -EBUSY;
+ }
+ }
+ mutex_unlock(&ctrl->m_ctrl);
+ msm_slim_disconnect_endp(dev, &dev->rx_msgq,
+ &dev->use_rx_msgqs);
+ msm_slim_disconnect_endp(dev, &dev->tx_msgq,
+ &dev->use_tx_msgqs);
+ return msm_slim_qmi_power_request(dev, false);
}
static int ngd_slim_rx_msgq_thread(void *data)
@@ -1365,7 +1360,7 @@
dev->ctrl.allocbw = ngd_allocbw;
dev->ctrl.xfer_msg = ngd_xfer_msg;
dev->ctrl.xfer_user_msg = ngd_user_msg;
- dev->ctrl.wakeup = ngd_clk_pause_wakeup;
+ dev->ctrl.wakeup = NULL;
dev->ctrl.alloc_port = msm_alloc_port;
dev->ctrl.dealloc_port = msm_dealloc_port;
dev->ctrl.port_xfer = msm_slim_port_xfer;
@@ -1528,9 +1523,9 @@
struct msm_slim_ctrl *dev = platform_get_drvdata(pdev);
int ret = 0;
if (dev->state >= MSM_CTRL_ASLEEP)
- ret = slim_ctrl_clk_pause(&dev->ctrl, true, 0);
+ ret = ngd_slim_power_up(dev, false);
if (ret) {
- /* Did SSR cause this clock pause failure */
+ /* Did SSR cause this power up failure */
if (dev->state != MSM_CTRL_DOWN)
dev->state = MSM_CTRL_ASLEEP;
else
@@ -1548,10 +1543,10 @@
struct platform_device *pdev = to_platform_device(device);
struct msm_slim_ctrl *dev = platform_get_drvdata(pdev);
int ret = 0;
- ret = slim_ctrl_clk_pause(&dev->ctrl, false, SLIM_CLK_UNSPECIFIED);
+ ret = ngd_slim_power_down(dev);
if (ret) {
if (ret != -EBUSY)
- SLIM_INFO(dev, "clk pause not entered:%d\n", ret);
+ SLIM_INFO(dev, "slim resource not idle:%d\n", ret);
dev->state = MSM_CTRL_AWAKE;
} else {
dev->state = MSM_CTRL_ASLEEP;
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/mfd/wcd9xxx/core.h b/include/linux/mfd/wcd9xxx/core.h
index 85be7c3..a8e792b 100644
--- a/include/linux/mfd/wcd9xxx/core.h
+++ b/include/linux/mfd/wcd9xxx/core.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2011-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
@@ -133,6 +133,7 @@
u16 grph; /* slimbus group handle */
unsigned long ch_mask;
wait_queue_head_t dai_wait;
+ bool bus_down_in_recovery;
};
#define WCD9XXX_CH(xport, xshift) \
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/include/media/msm_media_info.h b/include/media/msm_media_info.h
index 663809e..d46b505 100644
--- a/include/media/msm_media_info.h
+++ b/include/media/msm_media_info.h
@@ -79,6 +79,18 @@
COLOR_FMT_NV21,
};
+static inline unsigned int VENUS_EXTRADATA_SIZE(int width, int height)
+{
+ (void)height;
+ (void)width;
+
+ /*
+ * In the future, calculate the size based on the w/h but just
+ * hardcode it for now since 8K satisfies all current usecases.
+ */
+ return 8 * 1024;
+}
+
static inline unsigned int VENUS_Y_STRIDE(int color_fmt, int width)
{
unsigned int alignment, stride = 0;
@@ -158,7 +170,7 @@
static inline unsigned int VENUS_BUFFER_SIZE(
int color_fmt, int width, int height)
{
- const unsigned int extra_size = 8*1024;
+ const unsigned int extra_size = VENUS_EXTRADATA_SIZE(width, height);
unsigned int uv_alignment = 0, size = 0;
unsigned int y_plane, uv_plane, y_stride,
uv_stride, y_sclines, uv_sclines;
diff --git a/sound/soc/codecs/wcd9306.c b/sound/soc/codecs/wcd9306.c
index 61a0682..38d7901 100644
--- a/sound/soc/codecs/wcd9306.c
+++ b/sound/soc/codecs/wcd9306.c
@@ -4154,6 +4154,7 @@
switch (event) {
case SND_SOC_DAPM_POST_PMU:
+ dai->bus_down_in_recovery = false;
(void) tapan_codec_enable_slim_chmask(dai, true);
ret = wcd9xxx_cfg_slim_sch_rx(core, &dai->wcd9xxx_ch_list,
dai->rate, dai->bit_width,
@@ -4162,7 +4163,8 @@
case SND_SOC_DAPM_POST_PMD:
ret = wcd9xxx_close_slim_sch_rx(core, &dai->wcd9xxx_ch_list,
dai->grph);
- ret = tapan_codec_enable_slim_chmask(dai, false);
+ if (!dai->bus_down_in_recovery)
+ ret = tapan_codec_enable_slim_chmask(dai, false);
if (ret < 0) {
ret = wcd9xxx_disconnect_port(core,
&dai->wcd9xxx_ch_list,
@@ -4177,6 +4179,7 @@
pm_runtime_put(core->dev->parent);
dev_dbg(codec->dev, "%s: unvote requested", __func__);
}
+ dai->bus_down_in_recovery = false;
break;
}
return ret;
@@ -4208,6 +4211,7 @@
dai = &tapan_p->dai[w->shift];
switch (event) {
case SND_SOC_DAPM_POST_PMU:
+ dai->bus_down_in_recovery = false;
(void) tapan_codec_enable_slim_chmask(dai, true);
ret = wcd9xxx_cfg_slim_sch_tx(core, &dai->wcd9xxx_ch_list,
dai->rate, dai->bit_width,
@@ -4216,7 +4220,8 @@
case SND_SOC_DAPM_POST_PMD:
ret = wcd9xxx_close_slim_sch_tx(core, &dai->wcd9xxx_ch_list,
dai->grph);
- ret = tapan_codec_enable_slim_chmask(dai, false);
+ if (!dai->bus_down_in_recovery)
+ ret = tapan_codec_enable_slim_chmask(dai, false);
if (ret < 0) {
ret = wcd9xxx_disconnect_port(core,
&dai->wcd9xxx_ch_list,
@@ -4231,6 +4236,7 @@
pm_runtime_put(core->dev->parent);
dev_dbg(codec->dev, "%s: unvote requested", __func__);
}
+ dai->bus_down_in_recovery = false;
break;
}
return ret;
@@ -5732,6 +5738,7 @@
int rco_clk_rate;
struct snd_soc_codec *codec;
struct tapan_priv *tapan;
+ int count;
codec = (struct snd_soc_codec *)(wcd9xxx->ssr_priv);
tapan = snd_soc_codec_get_drvdata(codec);
@@ -5788,6 +5795,9 @@
tapan->machine_codec_event_cb(codec, WCD9XXX_CODEC_EVENT_CODEC_UP);
+ for (count = 0; count < NUM_CODEC_DAIS; count++)
+ tapan->dai[count].bus_down_in_recovery = true;
+
mutex_unlock(&codec->mutex);
return ret;
}
diff --git a/sound/soc/codecs/wcd9320.c b/sound/soc/codecs/wcd9320.c
index d749715..4c5d327 100644
--- a/sound/soc/codecs/wcd9320.c
+++ b/sound/soc/codecs/wcd9320.c
@@ -5144,6 +5144,7 @@
switch (event) {
case SND_SOC_DAPM_POST_PMU:
+ dai->bus_down_in_recovery = false;
taiko_codec_enable_int_port(dai, codec);
(void) taiko_codec_enable_slim_chmask(dai, true);
ret = wcd9xxx_cfg_slim_sch_rx(core, &dai->wcd9xxx_ch_list,
@@ -5153,7 +5154,9 @@
case SND_SOC_DAPM_POST_PMD:
ret = wcd9xxx_close_slim_sch_rx(core, &dai->wcd9xxx_ch_list,
dai->grph);
- ret = taiko_codec_enable_slim_chmask(dai, false);
+ if (!dai->bus_down_in_recovery)
+ ret = taiko_codec_enable_slim_chmask(dai, false);
+
if (ret < 0) {
ret = wcd9xxx_disconnect_port(core,
&dai->wcd9xxx_ch_list,
@@ -5161,6 +5164,7 @@
pr_debug("%s: Disconnect RX port, ret = %d\n",
__func__, ret);
}
+ dai->bus_down_in_recovery = false;
break;
}
return ret;
@@ -5210,6 +5214,7 @@
snd_soc_update_bits(codec,
TAIKO_A_CDC_CLK_TX_CLK_EN_B2_CTL, 0xC, 0xC);
taiko_codec_enable_int_port(dai, codec);
+ dai->bus_down_in_recovery = false;
(void) taiko_codec_enable_slim_chmask(dai, true);
ret = wcd9xxx_cfg_slim_sch_tx(core, &dai->wcd9xxx_ch_list,
dai->rate, dai->bit_width,
@@ -5226,6 +5231,8 @@
/*Disable V&I sensing*/
snd_soc_update_bits(codec, TAIKO_A_SPKR_PROT_EN,
0x88, 0x00);
+
+ dai->bus_down_in_recovery = false;
break;
}
out_vi:
@@ -5255,9 +5262,11 @@
__func__, w->name, event, w->shift);
dai = &taiko_p->dai[w->shift];
+
switch (event) {
case SND_SOC_DAPM_POST_PMU:
taiko_codec_enable_int_port(dai, codec);
+ dai->bus_down_in_recovery = false;
(void) taiko_codec_enable_slim_chmask(dai, true);
ret = wcd9xxx_cfg_slim_sch_tx(core, &dai->wcd9xxx_ch_list,
dai->rate, dai->bit_width,
@@ -5266,7 +5275,9 @@
case SND_SOC_DAPM_POST_PMD:
ret = wcd9xxx_close_slim_sch_tx(core, &dai->wcd9xxx_ch_list,
dai->grph);
- ret = taiko_codec_enable_slim_chmask(dai, false);
+ if (!dai->bus_down_in_recovery)
+ ret = taiko_codec_enable_slim_chmask(dai, false);
+
if (ret < 0) {
ret = wcd9xxx_disconnect_port(core,
&dai->wcd9xxx_ch_list,
@@ -5274,6 +5285,8 @@
pr_debug("%s: Disconnect RX port, ret = %d\n",
__func__, ret);
}
+
+ dai->bus_down_in_recovery = false;
break;
}
return ret;
@@ -6810,6 +6823,7 @@
struct snd_soc_codec *codec;
struct taiko_priv *taiko;
int rco_clk_rate;
+ int count;
codec = (struct snd_soc_codec *)(wcd9xxx->ssr_priv);
taiko = snd_soc_codec_get_drvdata(codec);
@@ -6866,6 +6880,9 @@
if (ret)
pr_err("%s: Failed to setup irq: %d\n", __func__, ret);
+ for (count = 0; count < NUM_CODEC_DAIS; count++)
+ taiko->dai[count].bus_down_in_recovery = true;
+
mutex_unlock(&codec->mutex);
return ret;
}
diff --git a/sound/soc/codecs/wcd9xxx-mbhc.c b/sound/soc/codecs/wcd9xxx-mbhc.c
index d405667..8a71891 100644
--- a/sound/soc/codecs/wcd9xxx-mbhc.c
+++ b/sound/soc/codecs/wcd9xxx-mbhc.c
@@ -884,7 +884,8 @@
0, WCD9XXX_JACK_MASK);
mbhc->hph_status &= ~(SND_JACK_HEADSET |
SND_JACK_LINEOUT |
- SND_JACK_ANC_HEADPHONE);
+ SND_JACK_ANC_HEADPHONE |
+ SND_JACK_UNSUPPORTED);
}
/* Report insertion */
@@ -3050,11 +3051,14 @@
if (!mbhc->mbhc_cfg->detect_extn_cable &&
retry == NUM_ATTEMPTS_TO_REPORT &&
mbhc->current_plug == PLUG_TYPE_NONE) {
+ WCD9XXX_BCL_LOCK(mbhc->resmgr);
wcd9xxx_report_plug(mbhc, 1,
SND_JACK_HEADPHONE);
+ WCD9XXX_BCL_UNLOCK(mbhc->resmgr);
}
} else if (plug_type == PLUG_TYPE_HEADPHONE) {
pr_debug("Good headphone detected, continue polling\n");
+ WCD9XXX_BCL_LOCK(mbhc->resmgr);
if (mbhc->mbhc_cfg->detect_extn_cable) {
if (mbhc->current_plug != plug_type)
wcd9xxx_report_plug(mbhc, 1,
@@ -3063,9 +3067,11 @@
wcd9xxx_report_plug(mbhc, 1,
SND_JACK_HEADPHONE);
}
+ WCD9XXX_BCL_UNLOCK(mbhc->resmgr);
} else if (plug_type == PLUG_TYPE_HIGH_HPH) {
pr_debug("%s: High HPH detected, continue polling\n",
__func__);
+ WCD9XXX_BCL_LOCK(mbhc->resmgr);
if (mbhc->mbhc_cfg->detect_extn_cable) {
if (mbhc->current_plug != plug_type)
wcd9xxx_report_plug(mbhc, 1,
@@ -3074,6 +3080,7 @@
wcd9xxx_report_plug(mbhc, 1,
SND_JACK_HEADPHONE);
}
+ WCD9XXX_BCL_UNLOCK(mbhc->resmgr);
} else {
if (plug_type == PLUG_TYPE_GND_MIC_SWAP) {
pt_gnd_mic_swap_cnt++;