Merge "msm: ADSPRPC: Always map buffers into IOMMU if one is present"
diff --git a/arch/arm/mach-msm/clock-8610.c b/arch/arm/mach-msm/clock-8610.c
index d327d25..672c512 100644
--- a/arch/arm/mach-msm/clock-8610.c
+++ b/arch/arm/mach-msm/clock-8610.c
@@ -3113,6 +3113,8 @@
CLK_LOOKUP("xo", cxo_acpu_clk.c, "f9011050.qcom,acpuclk"),
CLK_LOOKUP("gpll0", gpll0_ao_clk_src.c, "f9011050.qcom,acpuclk"),
CLK_LOOKUP("a7sspll", a7sspll.c, "f9011050.qcom,acpuclk"),
+ CLK_LOOKUP("clk-4", gpll0_ao_clk_src.c, "f9011050.qcom,clock-a7"),
+ CLK_LOOKUP("clk-5", a7sspll.c, "f9011050.qcom,clock-a7"),
CLK_LOOKUP("measure_clk", apc0_m_clk, ""),
CLK_LOOKUP("measure_clk", apc1_m_clk, ""),
diff --git a/arch/arm/mach-msm/include/mach/ecm_ipa.h b/arch/arm/mach-msm/include/mach/ecm_ipa.h
index f6afb2a..cdcb8d8 100644
--- a/arch/arm/mach-msm/include/mach/ecm_ipa.h
+++ b/arch/arm/mach-msm/include/mach/ecm_ipa.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2013, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2013-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
@@ -40,6 +40,8 @@
* with ecm_ipa APIs
* @host_ethaddr: host Ethernet address in network order
* @device_ethaddr: device Ethernet address in network order
+ * @skip_ep_cfg: boolean field that determines if Apps-processor
+ * should or should not configure this end-point.
*/
struct ecm_ipa_params {
ecm_ipa_callback ecm_ipa_rx_dp_notify;
@@ -47,6 +49,7 @@
u8 host_ethaddr[ETH_ALEN];
u8 device_ethaddr[ETH_ALEN];
void *private;
+ bool skip_ep_cfg;
};
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 c4a23ca..9a8963d 100755
--- a/drivers/media/platform/msm/camera_v2/ispif/msm_ispif.c
+++ b/drivers/media/platform/msm/camera_v2/ispif/msm_ispif.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2013, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2013-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
@@ -1045,7 +1045,8 @@
case MSM_SD_SHUTDOWN: {
struct ispif_device *ispif =
(struct ispif_device *)v4l2_get_subdevdata(sd);
- msm_ispif_release(ispif);
+ if (ispif && ispif->base)
+ msm_ispif_release(ispif);
return 0;
}
default:
diff --git a/drivers/media/platform/msm/vidc/msm_v4l2_vidc.c b/drivers/media/platform/msm/vidc/msm_v4l2_vidc.c
index 3fc3634..5e3699d 100644
--- a/drivers/media/platform/msm/vidc/msm_v4l2_vidc.c
+++ b/drivers/media/platform/msm/vidc/msm_v4l2_vidc.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
@@ -533,6 +533,7 @@
}
static const struct of_device_id msm_vidc_dt_match[] = {
{.compatible = "qcom,msm-vidc"},
+ {}
};
MODULE_DEVICE_TABLE(of, msm_vidc_dt_match);
diff --git a/drivers/media/platform/msm/vidc/msm_vdec.c b/drivers/media/platform/msm/vidc/msm_vdec.c
index 7e24510..5c735d6 100644
--- a/drivers/media/platform/msm/vidc/msm_vdec.c
+++ b/drivers/media/platform/msm/vidc/msm_vdec.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
@@ -24,13 +24,9 @@
#define MAX_NUM_OUTPUT_BUFFERS 6
#define DEFAULT_VIDEO_CONCEAL_COLOR_BLACK 0x8080
-#define TZ_INFO_GET_FEATURE_VERSION_ID 0x3
#define TZ_DYNAMIC_BUFFER_FEATURE_ID 12
#define TZ_FEATURE_VERSION(major, minor, patch) \
(((major & 0x3FF) << 22) | ((minor & 0x3FF) << 12) | (patch & 0xFFF))
-struct tz_get_feature_version {
- u32 feature_id;
-};
enum msm_vdec_ctrl_cluster {
MSM_VDEC_CTRL_CLUSTER_MAX = 1 << 0,
@@ -1535,17 +1531,16 @@
static int check_tz_dynamic_buffer_support(void)
{
int rc = 0;
- struct tz_get_feature_version tz_feature_id;
- unsigned int resp = 0;
+ int version = scm_get_feat_version(TZ_DYNAMIC_BUFFER_FEATURE_ID);
- tz_feature_id.feature_id = TZ_DYNAMIC_BUFFER_FEATURE_ID;
- rc = scm_call(SCM_SVC_INFO,
- TZ_INFO_GET_FEATURE_VERSION_ID, &tz_feature_id,
- sizeof(tz_feature_id), &resp, sizeof(resp));
- if ((rc) || (resp != TZ_FEATURE_VERSION(1, 1, 0))) {
+ /*
+ * if the version is < 1.1.0 then dynamic buffer allocation is
+ * not supported
+ */
+ if (version < TZ_FEATURE_VERSION(1, 1, 0)) {
dprintk(VIDC_DBG,
- "Dyamic buffer mode not supported, failed to get tz feature version id : %u, rc : %d, response : %u\n",
- tz_feature_id.feature_id, rc, resp);
+ "Dynamic buffer mode not supported, tz version is : %u vs required : %u\n",
+ version, TZ_FEATURE_VERSION(1, 1, 0));
rc = -ENOTSUPP;
}
return rc;
diff --git a/drivers/net/ethernet/msm/ecm_ipa.c b/drivers/net/ethernet/msm/ecm_ipa.c
index 644a751..cc2ade4 100644
--- a/drivers/net/ethernet/msm/ecm_ipa.c
+++ b/drivers/net/ethernet/msm/ecm_ipa.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2013, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2013-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
@@ -294,6 +294,7 @@
params->ecm_ipa_rx_dp_notify = ecm_ipa_packet_receive_notify;
params->ecm_ipa_tx_dp_notify = ecm_ipa_tx_complete_notify;
params->private = (void *)ecm_ipa_ctx;
+ params->skip_ep_cfg = false;
ecm_ipa_ctx->state = ECM_IPA_INITIALIZED;
ECM_IPA_STATE_DEBUG(ecm_ipa_ctx);
diff --git a/drivers/power/qpnp-bms.c b/drivers/power/qpnp-bms.c
index 85a70ea..9ea034c 100644
--- a/drivers/power/qpnp-bms.c
+++ b/drivers/power/qpnp-bms.c
@@ -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
@@ -757,7 +757,20 @@
static bool is_battery_charging(struct qpnp_bms_chip *chip)
{
- return get_battery_status(chip) == POWER_SUPPLY_STATUS_CHARGING;
+ union power_supply_propval ret = {0,};
+
+ if (chip->batt_psy == NULL)
+ chip->batt_psy = power_supply_get_by_name("battery");
+ if (chip->batt_psy) {
+ /* if battery has been registered, use the status property */
+ chip->batt_psy->get_property(chip->batt_psy,
+ POWER_SUPPLY_PROP_CHARGE_TYPE, &ret);
+ return ret.intval != POWER_SUPPLY_CHARGE_TYPE_NONE;
+ }
+
+ /* Default to false if the battery power supply is not registered. */
+ pr_debug("battery power supply is not registered\n");
+ return false;
}
static bool is_battery_full(struct qpnp_bms_chip *chip)
diff --git a/drivers/power/qpnp-charger.c b/drivers/power/qpnp-charger.c
index e009a8d..370266b 100644
--- a/drivers/power/qpnp-charger.c
+++ b/drivers/power/qpnp-charger.c
@@ -1988,6 +1988,24 @@
return POWER_SUPPLY_CHARGE_TYPE_NONE;
}
+#define DEFAULT_CAPACITY 50
+static int
+get_batt_capacity(struct qpnp_chg_chip *chip)
+{
+ union power_supply_propval ret = {0,};
+
+ if (chip->fake_battery_soc >= 0)
+ return chip->fake_battery_soc;
+ if (chip->use_default_batt_values || !get_prop_batt_present(chip))
+ return DEFAULT_CAPACITY;
+ if (chip->bms_psy) {
+ chip->bms_psy->get_property(chip->bms_psy,
+ POWER_SUPPLY_PROP_CAPACITY, &ret);
+ return ret.intval;
+ }
+ return DEFAULT_CAPACITY;
+}
+
static int
get_prop_batt_status(struct qpnp_chg_chip *chip)
{
@@ -2016,6 +2034,13 @@
if (chgr_sts & FAST_CHG_ON_IRQ && bat_if_sts & BAT_FET_ON_IRQ)
return POWER_SUPPLY_STATUS_CHARGING;
+ /* report full if state of charge is 100 and a charger is connected */
+ if ((qpnp_chg_is_usb_chg_plugged_in(chip) ||
+ qpnp_chg_is_dc_chg_plugged_in(chip))
+ && get_batt_capacity(chip) == 100) {
+ return POWER_SUPPLY_STATUS_FULL;
+ }
+
return POWER_SUPPLY_STATUS_DISCHARGING;
}
@@ -2067,7 +2092,6 @@
return 0;
}
-#define DEFAULT_CAPACITY 50
static int
get_prop_capacity(struct qpnp_chg_chip *chip)
{
diff --git a/drivers/usb/gadget/u_bam.c b/drivers/usb/gadget/u_bam.c
index 843c207..4bd7f39 100644
--- a/drivers/usb/gadget/u_bam.c
+++ b/drivers/usb/gadget/u_bam.c
@@ -54,28 +54,31 @@
#define DL_INTR_THRESHOLD 20
-unsigned int bam_mux_tx_pkt_drop_thld = BAM_MUX_TX_PKT_DROP_THRESHOLD;
+static unsigned int bam_pending_limit = BAM_PENDING_LIMIT;
+module_param(bam_pending_limit, uint, S_IRUGO | S_IWUSR);
+
+static unsigned int bam_mux_tx_pkt_drop_thld = BAM_MUX_TX_PKT_DROP_THRESHOLD;
module_param(bam_mux_tx_pkt_drop_thld, uint, S_IRUGO | S_IWUSR);
-unsigned int bam_mux_rx_fctrl_en_thld = BAM_MUX_RX_PKT_FCTRL_EN_TSHOLD;
+static unsigned int bam_mux_rx_fctrl_en_thld = BAM_MUX_RX_PKT_FCTRL_EN_TSHOLD;
module_param(bam_mux_rx_fctrl_en_thld, uint, S_IRUGO | S_IWUSR);
-unsigned int bam_mux_rx_fctrl_support = BAM_MUX_RX_PKT_FLOW_CTRL_SUPPORT;
+static unsigned int bam_mux_rx_fctrl_support = BAM_MUX_RX_PKT_FLOW_CTRL_SUPPORT;
module_param(bam_mux_rx_fctrl_support, uint, S_IRUGO | S_IWUSR);
-unsigned int bam_mux_rx_fctrl_dis_thld = BAM_MUX_RX_PKT_FCTRL_DIS_TSHOLD;
+static unsigned int bam_mux_rx_fctrl_dis_thld = BAM_MUX_RX_PKT_FCTRL_DIS_TSHOLD;
module_param(bam_mux_rx_fctrl_dis_thld, uint, S_IRUGO | S_IWUSR);
-unsigned int bam_mux_tx_q_size = BAM_MUX_TX_Q_SIZE;
+static unsigned int bam_mux_tx_q_size = BAM_MUX_TX_Q_SIZE;
module_param(bam_mux_tx_q_size, uint, S_IRUGO | S_IWUSR);
-unsigned int bam_mux_rx_q_size = BAM_MUX_RX_Q_SIZE;
+static unsigned int bam_mux_rx_q_size = BAM_MUX_RX_Q_SIZE;
module_param(bam_mux_rx_q_size, uint, S_IRUGO | S_IWUSR);
-unsigned int bam_mux_rx_req_size = BAM_MUX_RX_REQ_SIZE;
+static unsigned int bam_mux_rx_req_size = BAM_MUX_RX_REQ_SIZE;
module_param(bam_mux_rx_req_size, uint, S_IRUGO | S_IWUSR);
-unsigned int dl_intr_threshold = DL_INTR_THRESHOLD;
+static unsigned int dl_intr_threshold = DL_INTR_THRESHOLD;
module_param(dl_intr_threshold, uint, S_IRUGO | S_IWUSR);
#define BAM_CH_OPENED BIT(0)
@@ -113,6 +116,10 @@
unsigned int rx_len;
unsigned long to_modem;
unsigned long to_host;
+ unsigned int rx_flow_control_disable;
+ unsigned int rx_flow_control_enable;
+ unsigned int rx_flow_control_triggered;
+ unsigned int max_num_pkts_pending_with_bam;
};
struct gbam_port {
@@ -324,7 +331,7 @@
return;
}
- while (d->pending_with_bam < BAM_PENDING_LIMIT) {
+ while (d->pending_with_bam < bam_pending_limit) {
skb = __skb_dequeue(&d->rx_skb_q);
if (!skb)
break;
@@ -347,14 +354,21 @@
dev_kfree_skb_any(skb);
break;
}
+ if (d->pending_with_bam > d->max_num_pkts_pending_with_bam)
+ d->max_num_pkts_pending_with_bam = d->pending_with_bam;
}
qlen = d->rx_skb_q.qlen;
spin_unlock_irqrestore(&port->port_lock_ul, flags);
- if (qlen < BAM_MUX_RX_PKT_FCTRL_DIS_TSHOLD)
+ if (qlen < bam_mux_rx_fctrl_dis_thld) {
+ if (d->rx_flow_control_triggered) {
+ d->rx_flow_control_disable++;
+ d->rx_flow_control_triggered = 0;
+ }
gbam_start_rx(port);
+ }
}
/*-------------------------------------------------------------*/
@@ -435,7 +449,10 @@
*/
if (bam_mux_rx_fctrl_support &&
d->rx_skb_q.qlen >= bam_mux_rx_fctrl_en_thld) {
-
+ if (!d->rx_flow_control_triggered) {
+ d->rx_flow_control_triggered = 1;
+ d->rx_flow_control_enable++;
+ }
list_add_tail(&req->list, &d->rx_idle);
spin_unlock(&port->port_lock_ul);
return;
@@ -1223,6 +1240,10 @@
"dpkts_pwith_bam: %u\n"
"to_usbhost_dcnt: %u\n"
"tomodem__dcnt: %u\n"
+ "rx_flow_control_disable_count: %u\n"
+ "rx_flow_control_enable_count: %u\n"
+ "rx_flow_control_triggered: %u\n"
+ "max_num_pkts_pending_with_bam: %u\n"
"tx_buf_len: %u\n"
"rx_buf_len: %u\n"
"data_ch_open: %d\n"
@@ -1231,6 +1252,10 @@
d->to_host, d->to_modem,
d->pending_with_bam,
d->tohost_drp_cnt, d->tomodem_drp_cnt,
+ d->rx_flow_control_disable,
+ d->rx_flow_control_enable,
+ d->rx_flow_control_triggered,
+ d->max_num_pkts_pending_with_bam,
d->tx_skb_q.qlen, d->rx_skb_q.qlen,
test_bit(BAM_CH_OPENED, &d->flags),
test_bit(BAM_CH_READY, &d->flags));
@@ -1269,6 +1294,10 @@
d->pending_with_bam = 0;
d->tohost_drp_cnt = 0;
d->tomodem_drp_cnt = 0;
+ d->rx_flow_control_disable = 0;
+ d->rx_flow_control_enable = 0;
+ d->rx_flow_control_triggered = 0;
+ d->max_num_pkts_pending_with_bam = 0;
spin_unlock(&port->port_lock_dl);
spin_unlock_irqrestore(&port->port_lock_ul, flags);
@@ -1434,6 +1463,10 @@
d->pending_with_bam = 0;
d->tohost_drp_cnt = 0;
d->tomodem_drp_cnt = 0;
+ d->rx_flow_control_disable = 0;
+ d->rx_flow_control_enable = 0;
+ d->rx_flow_control_triggered = 0;
+ d->max_num_pkts_pending_with_bam = 0;
}
spin_unlock(&port->port_lock_dl);
diff --git a/drivers/video/msm/mdss/mdp3.c b/drivers/video/msm/mdss/mdp3.c
index 4abd0f7..0cf1093 100644
--- a/drivers/video/msm/mdss/mdp3.c
+++ b/drivers/video/msm/mdss/mdp3.c
@@ -1667,69 +1667,79 @@
return xres * bpp;
}
-static int mdp3_alloc(size_t size, void **virt, unsigned long *phys)
+static int mdp3_alloc(struct msm_fb_data_type *mfd)
{
- int ret = 0;
+ int ret;
+ int dom;
+ void *virt;
+ unsigned long phys;
+ u32 offsets[2];
+ size_t size;
+ struct platform_device *pdev = mfd->pdev;
- if (mdp3_res->ion_handle) {
- pr_debug("memory already alloc\n");
- *virt = mdp3_res->virt;
- *phys = mdp3_res->phys;
- return 0;
+ mfd->fbi->screen_base = NULL;
+ mfd->fbi->fix.smem_start = 0;
+ mfd->fbi->fix.smem_len = 0;
+
+ ret = of_property_read_u32_array(pdev->dev.of_node,
+ "qcom,memblock-reserve", offsets, 2);
+
+ if (ret) {
+ pr_err("fail to parse splash memory address\n");
+ return ret;
}
- mdp3_res->ion_handle = ion_alloc(mdp3_res->ion_client, size,
- SZ_1M,
- ION_HEAP(ION_QSECOM_HEAP_ID), 0);
+ phys = offsets[0];
+ size = PAGE_ALIGN(mfd->fbi->fix.line_length *
+ mfd->fbi->var.yres_virtual);
- if (!IS_ERR_OR_NULL(mdp3_res->ion_handle)) {
- *virt = ion_map_kernel(mdp3_res->ion_client,
- mdp3_res->ion_handle);
- if (IS_ERR(*virt)) {
- pr_err("map kernel error\n");
- goto ion_map_kernel_err;
- }
+ if (size > offsets[1]) {
+ pr_err("reserved splash memory size too small\n");
+ return -EINVAL;
+ }
- ret = ion_phys(mdp3_res->ion_client, mdp3_res->ion_handle,
- phys, &size);
- if (ret) {
- pr_err("%s ion_phys error\n", __func__);
- goto ion_map_phys_err;
- }
-
- mdp3_res->virt = *virt;
- mdp3_res->phys = *phys;
- mdp3_res->size = size;
- } else {
- pr_err("%s ion alloc fail\n", __func__);
- mdp3_res->ion_handle = NULL;
+ virt = phys_to_virt(phys);
+ if (unlikely(!virt)) {
+ pr_err("unable to map in splash memory\n");
return -ENOMEM;
}
- return 0;
+ dom = mdp3_res->domains[MDP3_DMA_IOMMU_DOMAIN].domain_idx;
+ ret = msm_iommu_map_contig_buffer(phys, dom, 0, size, SZ_4K, 0,
+ &mfd->iova);
-ion_map_phys_err:
- ion_unmap_kernel(mdp3_res->ion_client, mdp3_res->ion_handle);
-ion_map_kernel_err:
- ion_free(mdp3_res->ion_client, mdp3_res->ion_handle);
- mdp3_res->ion_handle = NULL;
- mdp3_res->virt = NULL;
- mdp3_res->phys = 0;
- mdp3_res->size = 0;
- return -ENOMEM;
+ if (ret) {
+ pr_err("fail to map to IOMMU %d\n", ret);
+ return ret;
+ }
+ pr_info("allocating %u bytes at %p (%lx phys) for fb %d\n",
+ size, virt, phys, mfd->index);
+
+ mfd->fbi->screen_base = virt;
+ mfd->fbi->fix.smem_start = phys;
+ mfd->fbi->fix.smem_len = size;
+
+ return 0;
}
-void mdp3_free(void)
+void mdp3_free(struct msm_fb_data_type *mfd)
{
- pr_debug("mdp3_fbmem_free\n");
- if (mdp3_res->ion_handle) {
- ion_unmap_kernel(mdp3_res->ion_client, mdp3_res->ion_handle);
- ion_free(mdp3_res->ion_client, mdp3_res->ion_handle);
- mdp3_res->ion_handle = NULL;
- mdp3_res->virt = NULL;
- mdp3_res->phys = 0;
- mdp3_res->size = 0;
+ size_t size = 0;
+ int dom;
+
+ if (!mfd->iova || !mfd->fbi->screen_base) {
+ pr_info("no fbmem allocated\n");
+ return;
}
+
+ size = mfd->fbi->fix.smem_len;
+ dom = mdp3_res->domains[MDP3_DMA_IOMMU_DOMAIN].domain_idx;
+ msm_iommu_unmap_contig_buffer(mfd->iova, dom, 0, size);
+
+ mfd->fbi->screen_base = NULL;
+ mfd->fbi->fix.smem_start = 0;
+ mfd->fbi->fix.smem_len = 0;
+ mfd->iova = 0;
}
int mdp3_parse_dt_splash(struct msm_fb_data_type *mfd)
@@ -1752,16 +1762,17 @@
mdp3_res->splash_mem_addr = offsets[0];
mdp3_res->splash_mem_size = offsets[1];
- pr_debug("memaddr=%x size=%x\n", mdp3_res->splash_mem_addr,
+ pr_debug("memaddr=%lx size=%x\n", mdp3_res->splash_mem_addr,
mdp3_res->splash_mem_size);
return rc;
}
-void mdp3_release_splash_memory(void)
+void mdp3_release_splash_memory(struct msm_fb_data_type *mfd)
{
/* Give back the reserved memory to the system */
if (mdp3_res->splash_mem_addr) {
+ mdp3_free(mfd);
pr_debug("mdp3_release_splash_memory\n");
memblock_free(mdp3_res->splash_mem_addr,
mdp3_res->splash_mem_size);
@@ -1811,44 +1822,6 @@
return mdp3_res->cont_splash_en;
}
-int mdp3_continuous_splash_copy(struct mdss_panel_data *pdata)
-{
- unsigned long splash_phys, phys;
- void *splash_virt, *virt;
- u32 height, width, rgb_size, stride;
- size_t size;
- int rc;
-
- if (pdata->panel_info.type != MIPI_VIDEO_PANEL) {
- pr_debug("cmd mode panel, no need to copy splash image\n");
- return 0;
- }
-
- rgb_size = MDP3_REG_READ(MDP3_REG_DMA_P_SIZE);
- stride = MDP3_REG_READ(MDP3_REG_DMA_P_IBUF_Y_STRIDE);
- stride = stride & 0x3FFF;
- splash_phys = MDP3_REG_READ(MDP3_REG_DMA_P_IBUF_ADDR);
-
- height = (rgb_size >> 16) & 0xffff;
- width = rgb_size & 0xffff;
- size = PAGE_ALIGN(height * stride);
- pr_debug("splash_height=%d splash_width=%d Buffer size=%d\n",
- height, width, size);
-
- rc = mdp3_alloc(size, &virt, &phys);
- if (rc) {
- pr_err("fail to allocate memory for continuous splash image\n");
- return rc;
- }
-
- splash_virt = ioremap(splash_phys, stride * height);
- memcpy(virt, splash_virt, stride * height);
- iounmap(splash_virt);
- MDP3_REG_WRITE(MDP3_REG_DMA_P_IBUF_ADDR, phys);
-
- return 0;
-}
-
static int mdp3_is_display_on(struct mdss_panel_data *pdata)
{
int rc = 0;
@@ -2174,6 +2147,7 @@
.fb_mem_get_iommu_domain = mdp3_fb_mem_get_iommu_domain,
.panel_register_done = mdp3_panel_register_done,
.fb_stride = mdp3_fb_stride,
+ .fb_mem_alloc_fnc = mdp3_alloc,
};
struct mdp3_intr_cb underrun_cb = {
diff --git a/drivers/video/msm/mdss/mdp3.h b/drivers/video/msm/mdss/mdp3.h
index bd0dc65..a253d8f 100644
--- a/drivers/video/msm/mdss/mdp3.h
+++ b/drivers/video/msm/mdss/mdp3.h
@@ -137,9 +137,6 @@
struct ion_handle *ion_handle;
struct mutex iommu_lock;
struct rb_root iommu_root;
- void *virt;
- unsigned long phys;
- size_t size;
struct mdp3_dma dma[MDP3_DMA_MAX];
struct mdp3_intf intf[MDP3_DMA_OUTPUT_SEL_MAX];
@@ -154,7 +151,7 @@
struct early_suspend suspend_handler;
struct mdss_panel_cfg pan_cfg;
- u32 splash_mem_addr;
+ unsigned long splash_mem_addr;
u32 splash_mem_size;
int clk_prepare_count;
@@ -195,9 +192,9 @@
int mdp3_iommu_enable(int client);
int mdp3_iommu_disable(int client);
int mdp3_iommu_is_attached(int client);
-void mdp3_free(void);
+void mdp3_free(struct msm_fb_data_type *mfd);
int mdp3_parse_dt_splash(struct msm_fb_data_type *mfd);
-void mdp3_release_splash_memory(void);
+void mdp3_release_splash_memory(struct msm_fb_data_type *mfd);
int mdp3_create_sysfs_link(struct device *dev);
int mdp3_get_cont_spash_en(void);
int mdp3_get_mdp_dsi_clk(void);
diff --git a/drivers/video/msm/mdss/mdp3_ctrl.c b/drivers/video/msm/mdss/mdp3_ctrl.c
index dafaae3..44a7e51 100644
--- a/drivers/video/msm/mdss/mdp3_ctrl.c
+++ b/drivers/video/msm/mdss/mdp3_ctrl.c
@@ -627,17 +627,8 @@
}
mdp3_session->clk_on = 1;
- pr_debug("mdp3_ctrl_on dma start\n");
- if (mfd->fbi->screen_base) {
- rc = mdp3_session->dma->start(mdp3_session->dma,
- mdp3_session->intf);
- if (rc) {
- pr_err("fail to start the MDP display interface\n");
- goto on_error;
- }
- } else {
- mdp3_session->first_commit = true;
- }
+
+ mdp3_session->first_commit = true;
on_error:
if (!rc)
@@ -763,10 +754,7 @@
if (vsync_client.handler)
mdp3_dma->vsync_enable(mdp3_dma, &vsync_client);
- if (mfd->fbi->screen_base)
- rc = mdp3_dma->start(mdp3_dma, mdp3_session->intf);
- else
- mdp3_session->first_commit = true;
+ mdp3_session->first_commit = true;
reset_error:
mutex_unlock(&mdp3_session->lock);
@@ -854,10 +842,7 @@
if (vsync_client.handler)
mdp3_dma->vsync_enable(mdp3_dma, &vsync_client);
- if (mfd->fbi->screen_base)
- rc = mdp3_dma->start(mdp3_dma, mdp3_session->intf);
- else
- mdp3_session->first_commit = true;
+ mdp3_session->first_commit = true;
reset_error:
mutex_unlock(&mdp3_session->lock);
@@ -1030,7 +1015,6 @@
mdp3_ctrl_reset(mfd);
reset_done = true;
}
- mdp3_release_splash_memory();
mutex_lock(&mdp3_session->lock);
@@ -1065,6 +1049,7 @@
}
if (mdp3_bufq_count(&mdp3_session->bufq_out) > 1) {
+ mdp3_release_splash_memory(mfd);
data = mdp3_bufq_pop(&mdp3_session->bufq_out);
mdp3_put_img(data, MDP3_CLIENT_DMA_P);
}
@@ -1110,7 +1095,6 @@
pr_debug("continuous splash screen, IOMMU not attached\n");
mdp3_ctrl_reset(mfd);
}
- mdp3_release_splash_memory();
mutex_lock(&mdp3_session->lock);
diff --git a/sound/soc/codecs/msm_hdmi_codec_rx.c b/sound/soc/codecs/msm_hdmi_codec_rx.c
index 73c9547e..9cf37b4 100644
--- a/sound/soc/codecs/msm_hdmi_codec_rx.c
+++ b/sound/soc/codecs/msm_hdmi_codec_rx.c
@@ -21,8 +21,6 @@
#define MSM_HDMI_PCM_RATES SNDRV_PCM_RATE_48000
-static int msm_hdmi_audio_codec_return_value;
-
struct msm_hdmi_audio_codec_rx_data {
struct platform_device *hdmi_core_pdev;
struct msm_hdmi_audio_codec_ops hdmi_ops;
@@ -86,18 +84,18 @@
struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
+ int rv;
struct msm_hdmi_audio_codec_rx_data *codec_data =
dev_get_drvdata(dai->codec->dev);
- msm_hdmi_audio_codec_return_value =
- codec_data->hdmi_ops.hdmi_cable_status(
+ rv = codec_data->hdmi_ops.hdmi_cable_status(
codec_data->hdmi_core_pdev, 1);
- if (IS_ERR_VALUE(msm_hdmi_audio_codec_return_value)) {
+ if (IS_ERR_VALUE(rv)) {
dev_err(dai->dev,
"%s() HDMI core is not ready\n", __func__);
}
- return msm_hdmi_audio_codec_return_value;
+ return rv;
}
static int msm_hdmi_audio_codec_rx_dai_hw_params(
@@ -109,16 +107,17 @@
u32 level_shift = 0; /* 0dB */
bool down_mix = 0;
u32 num_channels = params_channels(params);
- int rc = 0;
+ int rv = 0;
struct msm_hdmi_audio_codec_rx_data *codec_data =
dev_get_drvdata(dai->codec->dev);
- /*refer to HDMI spec CEA-861-E: Table 28 Audio InfoFrame Data Byte 4*/
- if (IS_ERR_VALUE(msm_hdmi_audio_codec_return_value)) {
+ rv = codec_data->hdmi_ops.hdmi_cable_status(
+ codec_data->hdmi_core_pdev, 1);
+ if (IS_ERR_VALUE(rv)) {
dev_err(dai->dev,
"%s() HDMI core is not ready\n", __func__);
- return msm_hdmi_audio_codec_return_value;
+ return rv;
}
switch (num_channels) {
@@ -153,16 +152,16 @@
__func__, num_channels, params_rate(params),
channel_allocation);
- rc = codec_data->hdmi_ops.audio_info_setup(
+ rv = codec_data->hdmi_ops.audio_info_setup(
codec_data->hdmi_core_pdev,
params_rate(params), num_channels,
channel_allocation, level_shift, down_mix);
- if (IS_ERR_VALUE(rc)) {
+ if (IS_ERR_VALUE(rv)) {
dev_err(dai->dev,
"%s() HDMI core is not ready\n", __func__);
}
- return rc;
+ return rv;
}
static void msm_hdmi_audio_codec_rx_dai_shutdown(