summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--arch/arm/boot/dts/qcom/Makefile3
-rw-r--r--arch/arm/boot/dts/qcom/apq8096pro-v1.1-auto-adp-lite.dts6
-rw-r--r--arch/arm/boot/dts/qcom/msm8996-auto-mizar.dts8
-rw-r--r--arch/arm/boot/dts/qcom/msm8996pro-auto-adp-lite.dts6
-rw-r--r--arch/arm/boot/dts/qcom/msm8998.dtsi1
-rw-r--r--arch/arm/boot/dts/qcom/vplatform-lfv-msm8996-ivi-lv-mt.dts107
-rw-r--r--arch/arm/boot/dts/qcom/vplatform-lfv-msm8996-usb.dtsi22
-rw-r--r--drivers/mmc/host/cmdq_hci.c2
-rw-r--r--drivers/mmc/host/sdhci-msm.c9
-rw-r--r--drivers/mmc/host/sdhci.c4
-rw-r--r--drivers/net/wireless/ath/ath10k/ce.c79
-rw-r--r--drivers/net/wireless/ath/ath10k/ce.h6
-rw-r--r--drivers/net/wireless/ath/ath10k/core.c1
-rw-r--r--drivers/net/wireless/ath/ath10k/core.h1
-rw-r--r--drivers/net/wireless/ath/ath10k/hw.c7
-rw-r--r--drivers/net/wireless/ath/ath10k/hw.h7
-rw-r--r--drivers/net/wireless/ath/ath10k/snoc.c19
-rw-r--r--drivers/soc/qcom/qdss_bridge.c10
-rw-r--r--drivers/spi/spi_qsd.c87
-rw-r--r--drivers/spi/spi_qsd.h3
-rw-r--r--drivers/usb/dwc3/dwc3-msm.c7
-rw-r--r--sound/soc/msm/qdsp6v2/msm-pcm-loopback-v2.c32
22 files changed, 348 insertions, 79 deletions
diff --git a/arch/arm/boot/dts/qcom/Makefile b/arch/arm/boot/dts/qcom/Makefile
index 5c61dba03f9f..9a7be59ef113 100644
--- a/arch/arm/boot/dts/qcom/Makefile
+++ b/arch/arm/boot/dts/qcom/Makefile
@@ -119,7 +119,8 @@ dtb-$(CONFIG_ARCH_MSM8996) += msm8996-v2-pmi8994-cdp.dtb \
dtb-$(CONFIG_MSM_GVM_QUIN) += vplatform-lfv-msm8996-telematics.dtb \
vplatform-lfv-msm8996-ivi.dtb \
vplatform-lfv-msm8996-baseline.dtb \
- vplatform-lfv-msm8996-ivi-la.dtb
+ vplatform-lfv-msm8996-ivi-la.dtb \
+ vplatform-lfv-msm8996-ivi-lv-mt.dtb
ifeq ($(CONFIG_BUILD_ARM64_DT_OVERLAY),y)
dtbo-$(CONFIG_ARCH_MSM8998) += \
diff --git a/arch/arm/boot/dts/qcom/apq8096pro-v1.1-auto-adp-lite.dts b/arch/arm/boot/dts/qcom/apq8096pro-v1.1-auto-adp-lite.dts
index 93302bb3e65a..b307b7b2b8dd 100644
--- a/arch/arm/boot/dts/qcom/apq8096pro-v1.1-auto-adp-lite.dts
+++ b/arch/arm/boot/dts/qcom/apq8096pro-v1.1-auto-adp-lite.dts
@@ -1,4 +1,4 @@
-/* Copyright (c) 2015-2017, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2015-2018, 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
@@ -54,6 +54,10 @@
qcom,msm-ba {
status = "disabled";
};
+
+ qcom,tv-tuner {
+ status = "disabled";
+ };
};
&dsi_adv_7533_2 {
diff --git a/arch/arm/boot/dts/qcom/msm8996-auto-mizar.dts b/arch/arm/boot/dts/qcom/msm8996-auto-mizar.dts
index 3a7d009c12a4..b50da730488a 100644
--- a/arch/arm/boot/dts/qcom/msm8996-auto-mizar.dts
+++ b/arch/arm/boot/dts/qcom/msm8996-auto-mizar.dts
@@ -1,4 +1,4 @@
-/* Copyright (c) 2017, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2017-2018, 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
@@ -140,6 +140,12 @@
};
};
+&pm8994_gpios {
+ gpio@ca00 { /* GPIO 11 - USB VBUS_EN */
+ qcom,out-strength = <2>; /* Medium */
+ };
+};
+
&sdhc_2 {
cd-gpios = <&tlmm 38 GPIO_ACTIVE_LOW>;
pinctrl-0 = <&sdc2_clk_on &sdc2_cmd_on &sdc2_data_on &sdc2_cd_on_sbc>;
diff --git a/arch/arm/boot/dts/qcom/msm8996pro-auto-adp-lite.dts b/arch/arm/boot/dts/qcom/msm8996pro-auto-adp-lite.dts
index 0126081e4b03..9fd2686dac67 100644
--- a/arch/arm/boot/dts/qcom/msm8996pro-auto-adp-lite.dts
+++ b/arch/arm/boot/dts/qcom/msm8996pro-auto-adp-lite.dts
@@ -1,4 +1,4 @@
-/* Copyright (c) 2015-2017, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2015-2018, 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
@@ -54,6 +54,10 @@
qcom,msm-ba {
status = "disabled";
};
+
+ qcom,tv-tuner {
+ status = "disabled";
+ };
};
&dsi_adv_7533_2 {
diff --git a/arch/arm/boot/dts/qcom/msm8998.dtsi b/arch/arm/boot/dts/qcom/msm8998.dtsi
index 132f3e7ce332..6990099978c6 100644
--- a/arch/arm/boot/dts/qcom/msm8998.dtsi
+++ b/arch/arm/boot/dts/qcom/msm8998.dtsi
@@ -2091,6 +2091,7 @@
compatible = "qcom,memshare-peripheral";
qcom,peripheral-size = <0x0>;
qcom,client-id = <1>;
+ qcom,allocate-boot-time;
label = "modem";
};
};
diff --git a/arch/arm/boot/dts/qcom/vplatform-lfv-msm8996-ivi-lv-mt.dts b/arch/arm/boot/dts/qcom/vplatform-lfv-msm8996-ivi-lv-mt.dts
new file mode 100644
index 000000000000..fd04dcf41c73
--- /dev/null
+++ b/arch/arm/boot/dts/qcom/vplatform-lfv-msm8996-ivi-lv-mt.dts
@@ -0,0 +1,107 @@
+/* Copyright (c) 2018, 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
+ * only version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+/dts-v1/;
+
+#include "skeleton64.dtsi"
+#include "vplatform-lfv-msm8996.dtsi"
+#include <dt-bindings/clock/msm-clocks-8996.h>
+#include <dt-bindings/interrupt-controller/arm-gic.h>
+
+/ {
+ model = "Qualcomm Technologies, Inc. MSM 8996";
+ compatible = "qcom,msm8996";
+ qcom,msm-id = <246 0x0>;
+};
+
+&soc {
+ qcom,msm-audio-ion-vm {
+ compatible = "qcom,msm-audio-ion-vm";
+ qcom,smmu-enabled;
+ };
+
+ qcom,hab {
+ compatible = "qcom,hab";
+ vmid = <3>;
+
+ mmid100: mmid-grp@100 {
+ grp-start-id = <100>;
+ role = "fe";
+ remote-vmids = <0>;
+ };
+
+ mmid200: mmid-grp@200 {
+ grp-start-id = <200>;
+ role = "fe";
+ remote-vmids = <0>;
+ };
+
+ mmid300: mmid-grp@300 {
+ grp-start-id = <300>;
+ role = "fe";
+ remote-vmids = <0>;
+ };
+
+ mmid400: mmid-grp@400 {
+ grp-start-id = <400>;
+ role = "fe";
+ remote-vmids = <0>;
+ };
+
+ mmid500: mmid-grp@500 {
+ grp-start-id = <500>;
+ role = "fe";
+ remote-vmids = <0>;
+ };
+
+ mmid600: mmid-grp@600 {
+ grp-start-id = <600>;
+ role = "fe";
+ remote-vmids = <0>;
+ };
+
+ mmid700: mmid-grp@700 {
+ grp-start-id = <700>;
+ role = "fe";
+ remote-vmids = <0>;
+ };
+
+ mmid800: mmid-grp@800 {
+ grp-start-id = <800>;
+ role = "fe";
+ remote-vmids = <0>;
+ };
+ };
+};
+
+&blsp1_uart2 {
+ status = "okay";
+};
+
+&reserved_memory {
+ pmem_shared: pmem_shared_region@d0000000 {
+ reg = <0 0xd0000000 0 0x20000000>;
+ label = "pmem_shared_mem";
+ };
+
+ ion_system: ion_system_region@100000000 {
+ reg = <0x1 0x60000000 0 0x10000000>;
+ label = "ion_system_mem";
+ };
+};
+
+#include "vplatform-lfv-msm8996-usb.dtsi"
+
+&usb3 {
+ status = "okay";
+ qcom,no-wakeup-src-in-hostmode;
+};
diff --git a/arch/arm/boot/dts/qcom/vplatform-lfv-msm8996-usb.dtsi b/arch/arm/boot/dts/qcom/vplatform-lfv-msm8996-usb.dtsi
index e50447c5e8e7..764a79ec4a73 100644
--- a/arch/arm/boot/dts/qcom/vplatform-lfv-msm8996-usb.dtsi
+++ b/arch/arm/boot/dts/qcom/vplatform-lfv-msm8996-usb.dtsi
@@ -73,13 +73,13 @@
qcom,dwc-usb3-msm-tx-fifo-size = <21288>;
- clocks = <&clock_gcc clk_gcc_usb30_master_clk>,
- <&clock_gcc clk_gcc_sys_noc_usb3_axi_clk>,
- <&clock_gcc clk_gcc_aggre2_usb3_axi_clk>,
- <&clock_gcc clk_gcc_usb30_mock_utmi_clk>,
- <&clock_gcc clk_gcc_usb30_sleep_clk>,
+ clocks = <&clock_virt clk_gcc_usb30_master_clk>,
+ <&clock_virt clk_gcc_sys_noc_usb3_axi_clk>,
+ <&clock_virt clk_gcc_aggre2_usb3_axi_clk>,
+ <&clock_virt clk_gcc_usb30_mock_utmi_clk>,
+ <&clock_virt clk_gcc_usb30_sleep_clk>,
<&clock_gcc clk_cxo_dwc3_clk>,
- <&clock_gcc clk_gcc_usb_phy_cfg_ahb2phy_clk>;
+ <&clock_virt clk_gcc_usb_phy_cfg_ahb2phy_clk>;
clock-names = "core_clk", "iface_clk", "bus_aggr_clk",
"utmi_clk","sleep_clk", "xo", "cfg_ahb_clk";
@@ -237,7 +237,7 @@
qcom,phy-clk-scheme = "cmos";
qcom,major-rev = <1>;
- clocks = <&clock_gcc clk_gcc_usb_phy_cfg_ahb2phy_clk>,
+ clocks = <&clock_virt clk_gcc_usb_phy_cfg_ahb2phy_clk>,
<&clock_gcc clk_ln_bb_clk>;
clock-names = "cfg_ahb_clk", "ref_clk_src";
@@ -356,11 +356,11 @@
0x600 /* USB3_PHY_SW_RESET */
0x608>; /* USB3_PHY_START */
- clocks = <&clock_gcc clk_gcc_usb3_phy_aux_clk>,
- <&clock_gcc clk_gcc_usb3_phy_pipe_clk>,
- <&clock_gcc clk_gcc_usb_phy_cfg_ahb2phy_clk>,
+ clocks = <&clock_virt clk_gcc_usb3_phy_aux_clk>,
+ <&clock_virt clk_gcc_usb3_phy_pipe_clk>,
+ <&clock_virt clk_gcc_usb_phy_cfg_ahb2phy_clk>,
<&clock_gcc clk_ln_bb_clk>,
- <&clock_gcc clk_gcc_usb3_clkref_clk>;
+ <&clock_virt clk_gcc_usb3_clkref_clk>;
clock-names = "aux_clk", "pipe_clk", "cfg_ahb_clk",
"ref_clk_src", "ref_clk";
diff --git a/drivers/mmc/host/cmdq_hci.c b/drivers/mmc/host/cmdq_hci.c
index 83d24fcaf2ab..54c86cb6d0fc 100644
--- a/drivers/mmc/host/cmdq_hci.c
+++ b/drivers/mmc/host/cmdq_hci.c
@@ -357,7 +357,7 @@ static int cmdq_host_alloc_tdl(struct cmdq_host *cq_host)
if (!cq_host->desc_base || !cq_host->trans_desc_base)
return -ENOMEM;
- pr_info("desc-base: 0x%p trans-base: 0x%p\n desc_dma 0x%llx trans_dma: 0x%llx\n",
+ pr_debug("desc-base: 0x%pK trans-base: 0x%pK\n desc_dma 0x%llx trans_dma: 0x%llx\n",
cq_host->desc_base, cq_host->trans_desc_base,
(unsigned long long)cq_host->desc_dma_base,
(unsigned long long) cq_host->trans_desc_dma_base);
diff --git a/drivers/mmc/host/sdhci-msm.c b/drivers/mmc/host/sdhci-msm.c
index 45d2f69f5f1a..aea00ce708b6 100644
--- a/drivers/mmc/host/sdhci-msm.c
+++ b/drivers/mmc/host/sdhci-msm.c
@@ -2,7 +2,7 @@
* drivers/mmc/host/sdhci-msm.c - Qualcomm Technologies, Inc. MSM SDHCI Platform
* driver source file
*
- * Copyright (c) 2012-2017, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2018, 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
@@ -3946,11 +3946,10 @@ void sdhci_msm_pm_qos_cpu_init(struct sdhci_host *host,
group->latency = PM_QOS_DEFAULT_VALUE;
pm_qos_add_request(&group->req, PM_QOS_CPU_DMA_LATENCY,
group->latency);
- pr_info("%s (): voted for group #%d (mask=0x%lx) latency=%d (0x%p)\n",
+ pr_info("%s (): voted for group #%d (mask=0x%lx) latency=%d\n",
__func__, i,
group->req.cpus_affine.bits[0],
- group->latency,
- &latency[i].latency[SDHCI_PERFORMANCE_MODE]);
+ group->latency);
}
msm_host->pm_qos_prev_cpu = -1;
msm_host->pm_qos_group_enable = true;
@@ -4475,8 +4474,6 @@ static int sdhci_msm_probe(struct platform_device *pdev)
goto vreg_deinit;
}
writel_relaxed(readl_relaxed(tlmm_mem) | 0x2, tlmm_mem);
- dev_dbg(&pdev->dev, "tlmm reg %pa value 0x%08x\n",
- &tlmm_memres->start, readl_relaxed(tlmm_mem));
}
/*
diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
index 8055fddac722..40a08a520861 100644
--- a/drivers/mmc/host/sdhci.c
+++ b/drivers/mmc/host/sdhci.c
@@ -2994,13 +2994,13 @@ static void sdhci_adma_show_error(struct sdhci_host *host)
struct sdhci_adma2_64_desc *dma_desc = desc;
if (host->flags & SDHCI_USE_64_BIT_DMA)
- DBG("%s: %p: DMA 0x%08x%08x, LEN 0x%04x, Attr=0x%02x\n",
+ DBG("%s: %pK: DMA 0x%08x%08x, LEN 0x%04x,Attr=0x%02x\n",
name, desc, le32_to_cpu(dma_desc->addr_hi),
le32_to_cpu(dma_desc->addr_lo),
le16_to_cpu(dma_desc->len),
le16_to_cpu(dma_desc->cmd));
else
- DBG("%s: %p: DMA 0x%08x, LEN 0x%04x, Attr=0x%02x\n",
+ DBG("%s: %pK: DMA 0x%08x, LEN 0x%04x, Attr=0x%02x\n",
name, desc, le32_to_cpu(dma_desc->addr_lo),
le16_to_cpu(dma_desc->len),
le16_to_cpu(dma_desc->cmd));
diff --git a/drivers/net/wireless/ath/ath10k/ce.c b/drivers/net/wireless/ath/ath10k/ce.c
index 769f89e8d14c..9ccd6212b54a 100644
--- a/drivers/net/wireless/ath/ath10k/ce.c
+++ b/drivers/net/wireless/ath/ath10k/ce.c
@@ -96,13 +96,29 @@ static inline u32 ath10k_ce_src_ring_write_index_get(struct ath10k *ar,
ce_ctrl_addr + ar->hw_ce_regs->sr_wr_index_addr);
}
+static inline u32 ath10k_ce_src_ring_read_index_get_from_ddr(
+ struct ath10k *ar, u32 ce_id)
+{
+ struct bus_opaque *ar_opaque = ath10k_bus_priv(ar);
+
+ return ar_opaque->vaddr_rri_on_ddr[ce_id] & CE_DDR_RRI_MASK;
+}
+
static inline u32 ath10k_ce_src_ring_read_index_get(struct ath10k *ar,
u32 ce_ctrl_addr)
{
struct bus_opaque *ar_opaque = ath10k_bus_priv(ar);
+ u32 ce_id = COPY_ENGINE_ID(ce_ctrl_addr);
+ struct ath10k_ce_pipe *ce_state = &ar_opaque->ce_states[ce_id];
+ u32 index;
- return ar_opaque->bus_ops->read32(ar,
+ if (ar->rri_on_ddr && (ce_state->attr_flags & CE_ATTR_DIS_INTR))
+ index = ath10k_ce_src_ring_read_index_get_from_ddr(ar, ce_id);
+ else
+ index = ar_opaque->bus_ops->read32(ar,
ce_ctrl_addr + ar->hw_ce_regs->current_srri_addr);
+
+ return index;
}
static inline void ath10k_ce_shadow_src_ring_write_index_set(struct ath10k *ar,
@@ -195,9 +211,19 @@ static inline u32 ath10k_ce_dest_ring_read_index_get(struct ath10k *ar,
u32 ce_ctrl_addr)
{
struct bus_opaque *ar_opaque = ath10k_bus_priv(ar);
+ u32 ce_id = COPY_ENGINE_ID(ce_ctrl_addr);
+ struct ath10k_ce_pipe *ce_state = &ar_opaque->ce_states[ce_id];
+ u32 index;
- return ar_opaque->bus_ops->read32(ar,
+ if (ar->rri_on_ddr && (ce_state->attr_flags & CE_ATTR_DIS_INTR))
+ index = (ar_opaque->vaddr_rri_on_ddr[ce_id] >>
+ CE_DDR_RRI_SHIFT) &
+ CE_DDR_RRI_MASK;
+ else
+ index = ar_opaque->bus_ops->read32(ar,
ce_ctrl_addr + ar->hw_ce_regs->current_drri_addr);
+
+ return index;
}
static inline void ath10k_ce_dest_ring_base_addr_set(struct ath10k *ar,
@@ -449,7 +475,7 @@ int ath10k_ce_send_nolock(struct ath10k_ce_pipe *ce_state,
struct ath10k_ce_ring *src_ring = ce_state->src_ring;
struct ce_desc *desc, sdesc;
unsigned int nentries_mask = src_ring->nentries_mask;
- unsigned int sw_index = src_ring->sw_index;
+ unsigned int sw_index;
unsigned int write_index = src_ring->write_index;
u32 ctrl_addr = ce_state->ctrl_addr;
u32 desc_flags = 0;
@@ -462,6 +488,7 @@ int ath10k_ce_send_nolock(struct ath10k_ce_pipe *ce_state,
ath10k_warn(ar, "%s: send more we can (nbytes: %d, max: %d)\n",
__func__, nbytes, ce_state->src_sz_max);
+ sw_index = ath10k_ce_src_ring_read_index_get_from_ddr(ar, ce_state->id);
if (unlikely(CE_RING_DELTA(nentries_mask,
write_index, sw_index - 1) <= 0)) {
ret = -ENOSR;
@@ -1235,6 +1262,52 @@ ath10k_ce_alloc_dest_ring(struct ath10k *ar, unsigned int ce_id,
return dest_ring;
}
+void ce_config_rri_on_ddr(struct ath10k *ar)
+{
+ struct bus_opaque *ar_opaque = ath10k_bus_priv(ar);
+ u32 hi_paddr, low_paddr;
+ u32 ce_base_addr;
+ u32 ctrl1_regs;
+ int i;
+
+ ar_opaque->vaddr_rri_on_ddr =
+ (u32 *)dma_alloc_coherent(ar->dev,
+ (CE_COUNT * sizeof(u32)),
+ &ar_opaque->paddr_rri_on_ddr, GFP_KERNEL);
+
+ if (!ar_opaque->vaddr_rri_on_ddr)
+ return;
+
+ low_paddr = lower_32_bits(ar_opaque->paddr_rri_on_ddr);
+ hi_paddr = upper_32_bits(ar_opaque->paddr_rri_on_ddr) &
+ CE_DESC_FLAGS_GET_MASK;
+
+ ar_opaque->bus_ops->write32(ar, ar->hw_ce_regs->ce_rri_low, low_paddr);
+ ar_opaque->bus_ops->write32(ar, ar->hw_ce_regs->ce_rri_high, hi_paddr);
+
+ for (i = 0; i < CE_COUNT; i++) {
+ ctrl1_regs = ar->hw_ce_regs->ctrl1_regs->addr;
+ ce_base_addr = ath10k_ce_base_address(ar, i);
+ ar_opaque->bus_ops->write32(ar, ce_base_addr + ctrl1_regs,
+ ar_opaque->bus_ops->read32(ar, ce_base_addr + ctrl1_regs) |
+ ar->hw_ce_regs->upd->mask);
+ }
+
+ memset(ar_opaque->vaddr_rri_on_ddr, 0, CE_COUNT * sizeof(u32));
+}
+
+void ce_remove_rri_on_ddr(struct ath10k *ar)
+{
+ struct bus_opaque *ar_opaque = ath10k_bus_priv(ar);
+
+ if (!ar_opaque->vaddr_rri_on_ddr)
+ return;
+
+ dma_free_coherent(ar->dev, (CE_COUNT * sizeof(u32)),
+ ar_opaque->vaddr_rri_on_ddr,
+ ar_opaque->paddr_rri_on_ddr);
+}
+
/*
* Initialize a Copy Engine based on caller-supplied attributes.
* This may be called once to initialize both source and destination
diff --git a/drivers/net/wireless/ath/ath10k/ce.h b/drivers/net/wireless/ath/ath10k/ce.h
index 936f0698c0f0..fe5f5680ca3d 100644
--- a/drivers/net/wireless/ath/ath10k/ce.h
+++ b/drivers/net/wireless/ath/ath10k/ce.h
@@ -42,6 +42,8 @@ struct ath10k_ce_pipe;
#define CE_DESC_FLAGS_GET_MASK 0x1F
#define CE_DESC_37BIT_ADDR_MASK 0x1FFFFFFFFF
+#define CE_DDR_RRI_MASK 0xFFFF
+#define CE_DDR_RRI_SHIFT 16
/* Following desc flags are used in QCA99X0 */
#define CE_DESC_FLAGS_HOST_INT_DIS (1 << 2)
@@ -211,6 +213,8 @@ struct bus_opaque {
spinlock_t ce_lock;
const struct ath10k_bus_ops *bus_ops;
struct ath10k_ce_pipe ce_states[CE_COUNT_MAX];
+ u32 *vaddr_rri_on_ddr;
+ dma_addr_t paddr_rri_on_ddr;
};
/*==================Send====================*/
@@ -288,6 +292,8 @@ void ath10k_ce_deinit_pipe(struct ath10k *ar, unsigned int ce_id);
int ath10k_ce_alloc_pipe(struct ath10k *ar, int ce_id,
const struct ce_attr *attr);
void ath10k_ce_free_pipe(struct ath10k *ar, int ce_id);
+void ce_config_rri_on_ddr(struct ath10k *ar);
+void ce_remove_rri_on_ddr(struct ath10k *ar);
/*==================CE Engine Shutdown=======================*/
/*
diff --git a/drivers/net/wireless/ath/ath10k/core.c b/drivers/net/wireless/ath/ath10k/core.c
index 079d77678b1c..1e1df685ffa5 100644
--- a/drivers/net/wireless/ath/ath10k/core.c
+++ b/drivers/net/wireless/ath/ath10k/core.c
@@ -2374,6 +2374,7 @@ struct ath10k *ath10k_core_create(size_t priv_size, struct device *dev,
ar->fw_flags = &wcn3990_fw_flags;
ar->shadow_reg_value = &wcn3990_shadow_reg_value;
ar->shadow_reg_address = &wcn3990_shadow_reg_address;
+ ar->rri_on_ddr = true;
break;
default:
ath10k_err(ar, "unsupported core hardware revision %d\n",
diff --git a/drivers/net/wireless/ath/ath10k/core.h b/drivers/net/wireless/ath/ath10k/core.h
index 2ef2e1ec040a..5491826ec05a 100644
--- a/drivers/net/wireless/ath/ath10k/core.h
+++ b/drivers/net/wireless/ath/ath10k/core.h
@@ -967,6 +967,7 @@ struct ath10k {
struct completion peer_delete_done;
bool is_bmi;
enum ieee80211_sta_state sta_state;
+ bool rri_on_ddr;
/* must be last */
u8 drv_priv[0] __aligned(sizeof(void *));
};
diff --git a/drivers/net/wireless/ath/ath10k/hw.c b/drivers/net/wireless/ath/ath10k/hw.c
index 1437b5d29a17..558214cef688 100644
--- a/drivers/net/wireless/ath/ath10k/hw.c
+++ b/drivers/net/wireless/ath/ath10k/hw.c
@@ -284,6 +284,12 @@ struct ath10k_hw_ce_dst_src_wm_regs wcn3990_wm_dst_ring = {
.wm_high = &wcn3990_dst_wm_high,
};
+static struct ath10k_hw_ce_ctrl1_upd wcn3990_ctrl1_upd = {
+ .shift = 19,
+ .mask = 0x00080000,
+ .enable = 0x00000000,
+};
+
struct ath10k_hw_ce_regs wcn3990_ce_regs = {
.sr_base_addr = 0x00000000,
.sr_size_addr = 0x00000008,
@@ -305,6 +311,7 @@ struct ath10k_hw_ce_regs wcn3990_ce_regs = {
.misc_regs = &wcn3990_misc_reg,
.wm_srcr = &wcn3990_wm_src_ring,
.wm_dstr = &wcn3990_wm_dst_ring,
+ .upd = &wcn3990_ctrl1_upd,
};
struct ath10k_hw_ce_regs_addr_map qcax_src_ring = {
diff --git a/drivers/net/wireless/ath/ath10k/hw.h b/drivers/net/wireless/ath/ath10k/hw.h
index a37b956c558f..77c197132421 100644
--- a/drivers/net/wireless/ath/ath10k/hw.h
+++ b/drivers/net/wireless/ath/ath10k/hw.h
@@ -332,6 +332,12 @@ struct ath10k_hw_ce_dst_src_wm_regs {
struct ath10k_hw_ce_regs_addr_map *wm_high;
};
+struct ath10k_hw_ce_ctrl1_upd {
+ u32 shift;
+ u32 mask;
+ u32 enable;
+};
+
struct ath10k_hw_ce_regs {
u32 sr_base_addr;
u32 sr_size_addr;
@@ -355,6 +361,7 @@ struct ath10k_hw_ce_regs {
struct ath10k_hw_ce_host_ie *host_ie;
struct ath10k_hw_ce_dst_src_wm_regs *wm_srcr;
struct ath10k_hw_ce_dst_src_wm_regs *wm_dstr;
+ struct ath10k_hw_ce_ctrl1_upd *upd;
};
extern struct ath10k_hw_ce_regs wcn3990_ce_regs;
diff --git a/drivers/net/wireless/ath/ath10k/snoc.c b/drivers/net/wireless/ath/ath10k/snoc.c
index a1a4812feeed..aead886a582c 100644
--- a/drivers/net/wireless/ath/ath10k/snoc.c
+++ b/drivers/net/wireless/ath/ath10k/snoc.c
@@ -646,10 +646,6 @@ static int ath10k_snoc_hif_tx_sg(struct ath10k *ar, u8 pipe_id,
struct ath10k_snoc *ar_snoc = ath10k_snoc_priv(ar);
struct ath10k_snoc_pipe *snoc_pipe;
struct ath10k_ce_pipe *ce_pipe;
- struct ath10k_ce_ring *src_ring;
- unsigned int nentries_mask;
- unsigned int sw_index;
- unsigned int write_index;
int err, i = 0;
if (!ar_snoc)
@@ -660,19 +656,8 @@ static int ath10k_snoc_hif_tx_sg(struct ath10k *ar, u8 pipe_id,
snoc_pipe = &ar_snoc->pipe_info[pipe_id];
ce_pipe = snoc_pipe->ce_hdl;
- src_ring = ce_pipe->src_ring;
spin_lock_bh(&ar_snoc->opaque_ctx.ce_lock);
- nentries_mask = src_ring->nentries_mask;
- sw_index = src_ring->sw_index;
- write_index = src_ring->write_index;
-
- if (unlikely(CE_RING_DELTA(nentries_mask,
- write_index, sw_index - 1) < n_items)) {
- err = -ENOBUFS;
- goto err;
- }
-
for (i = 0; i < n_items - 1; i++) {
ath10k_dbg(ar, ATH10K_DBG_SNOC,
"snoc tx item %d paddr %pad len %d n_items %d\n",
@@ -967,6 +952,8 @@ static void ath10k_snoc_hif_power_down(struct ath10k *ar)
if (!atomic_read(&ar_snoc->pm_ops_inprogress))
ath10k_snoc_qmi_wlan_disable(ar);
+
+ ce_remove_rri_on_ddr(ar);
}
int ath10k_snoc_get_ce_id(struct ath10k *ar, int irq)
@@ -1121,6 +1108,8 @@ static int ath10k_snoc_bus_configure(struct ath10k *ar)
return ret;
}
+ ce_config_rri_on_ddr(ar);
+
return 0;
}
diff --git a/drivers/soc/qcom/qdss_bridge.c b/drivers/soc/qcom/qdss_bridge.c
index 443e9e384ea2..087f01154924 100644
--- a/drivers/soc/qcom/qdss_bridge.c
+++ b/drivers/soc/qcom/qdss_bridge.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2017, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2017-2018, 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
@@ -352,6 +352,14 @@ static void mhi_notifier(struct mhi_cb_info *cb_info)
queue_work(drvdata->mhi_wq, &drvdata->close_work);
break;
+ case MHI_CB_SYS_ERROR:
+ case MHI_CB_MHI_SHUTDOWN:
+ drvdata->opened = 0;
+
+ flush_workqueue(drvdata->mhi_wq);
+ qdss_destroy_buf_tbl(drvdata);
+ break;
+
default:
pr_err_ratelimited("MHI returned invalid cb reason 0x%x\n",
cb_info->cb_reason);
diff --git a/drivers/spi/spi_qsd.c b/drivers/spi/spi_qsd.c
index 5c56001e36db..aa7386325893 100644
--- a/drivers/spi/spi_qsd.c
+++ b/drivers/spi/spi_qsd.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2008-2017, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2008-2018, 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
@@ -55,6 +55,7 @@ static int get_local_resources(struct msm_spi *dd);
static void put_local_resources(struct msm_spi *dd);
static void msm_spi_slv_setup(struct msm_spi *dd);
static inline int msm_spi_wait_valid(struct msm_spi *dd);
+static int reset_core(struct msm_spi *dd);
static inline int msm_spi_configure_gsbi(struct msm_spi *dd,
struct platform_device *pdev)
@@ -551,7 +552,7 @@ static inline int msm_spi_set_state(struct msm_spi *dd,
}
if (msm_spi_wait_valid(dd))
return -EIO;
-
+ atomic_set(&dd->qup_state, state);
return 0;
}
@@ -1491,6 +1492,10 @@ static int msm_spi_process_transfer(struct msm_spi *dd)
}
} while (msm_spi_dma_send_next(dd));
+ if (status && dd->pdata->is_slv_ctrl) {
+ if (reset_core(dd))
+ dev_err(dd->dev, "Reset failed\n");
+ }
msm_spi_udelay(dd->xfrs_delay_usec);
transfer_end:
@@ -1578,14 +1583,15 @@ static int reset_core(struct msm_spi *dd)
* bit.
*/
msm_spi_enable_error_flags(dd);
-
- spi_ioc = readl_relaxed(dd->base + SPI_IO_CONTROL);
- spi_ioc |= SPI_IO_C_NO_TRI_STATE;
- writel_relaxed(spi_ioc , dd->base + SPI_IO_CONTROL);
- /*
- * Ensure that the IO control is written to before returning.
- */
- mb();
+ if (!dd->pdata->is_slv_ctrl) {
+ spi_ioc = readl_relaxed(dd->base + SPI_IO_CONTROL);
+ spi_ioc |= SPI_IO_C_NO_TRI_STATE;
+ writel_relaxed(spi_ioc, dd->base + SPI_IO_CONTROL);
+ /*
+ * Ensure that the IO control is written to before returning.
+ */
+ mb();
+ }
msm_spi_set_state(dd, SPI_OP_STATE_RESET);
return 0;
}
@@ -1793,10 +1799,7 @@ static void msm_spi_slv_setup(struct msm_spi *dd)
u32 irq_en = GENMASK(6, 0);
qup_config &= ~QUP_CFG_MODE;
- qup_config |= QUP_CONFIG_SPI_SLAVE;
- qup_config |= (SPI_EN_EXT_OUT_FLAG | APP_CLK_ON_EN | CORE_CLK_ON_EN
- | FIFO_CLK_ON_EN | CORE_EX_CLK_ON_EN);
- spi_config |= SPI_CFG_SLAVE_OP;
+ qup_config |= SPI_EN_EXT_OUT_FLAG;
writel_relaxed(qup_config, dd->base + QUP_CONFIG);
writel_relaxed(spi_config, dd->base + SPI_CONFIG);
writel_relaxed(irq_en, (dd->base + SPI_SLAVE_IRQ_EN));
@@ -1807,6 +1810,28 @@ static void msm_spi_slv_setup(struct msm_spi *dd)
writel_relaxed(slv_cfg, (dd->base + SPI_SLAVE_CONFIG));
}
/*
+ * Ensure the previous write completed before enabling slave mode.
+ */
+ mb();
+
+ spi_config = readl_relaxed(dd->base + SPI_CONFIG);
+ qup_config = readl_relaxed(dd->base + QUP_CONFIG);
+
+ qup_config |= QUP_CONFIG_SPI_SLAVE;
+ spi_config |= SPI_CFG_SLAVE_OP;
+
+ writel_relaxed(qup_config, dd->base + QUP_CONFIG);
+ writel_relaxed(spi_config, dd->base + SPI_CONFIG);
+ /*
+ * Ensure the previous write completed before enabling clk_on bit.
+ */
+ mb();
+
+ qup_config = readl_relaxed(dd->base + QUP_CONFIG);
+ qup_config |= (APP_CLK_ON_EN | CORE_CLK_ON_EN |
+ FIFO_CLK_ON_EN | CORE_EX_CLK_ON_EN);
+ writel_relaxed(qup_config, dd->base + QUP_CONFIG);
+ /*
* Ensure Slave setup completes before returning.
*/
mb();
@@ -2034,6 +2059,33 @@ static ssize_t set_stats(struct device *dev, struct device_attribute *attr,
static DEVICE_ATTR(stats, S_IRUGO | S_IWUSR, show_stats, set_stats);
+static ssize_t show_qup_state(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ ssize_t ret = 0;
+ struct platform_device *pdev = container_of(dev, struct
+ platform_device, dev);
+ struct spi_master *master = platform_get_drvdata(pdev);
+ struct msm_spi *dd;
+
+ dd = spi_master_get_devdata(master);
+ /* This check should not fail */
+ if (dd)
+ ret = snprintf(buf, sizeof(int), "%u\n",
+ atomic_read(&dd->qup_state));
+ return ret;
+}
+
+static ssize_t set_qup_state(struct device *dev,
+ struct device_attribute *attr,
+ const char *buf, size_t count)
+{
+ return 1;
+}
+
+static DEVICE_ATTR(spi_qup_state, S_IWUSR | S_IRUGO,
+ show_qup_state, set_qup_state);
+
static struct attribute *dev_attrs[] = {
&dev_attr_stats.attr,
NULL,
@@ -2471,7 +2523,9 @@ static int init_resources(struct platform_device *pdev)
*/
msm_spi_enable_error_flags(dd);
- writel_relaxed(SPI_IO_C_NO_TRI_STATE, dd->base + SPI_IO_CONTROL);
+ if (dd->pdata && !dd->pdata->is_slv_ctrl)
+ writel_relaxed(SPI_IO_C_NO_TRI_STATE,
+ dd->base + SPI_IO_CONTROL);
rc = msm_spi_set_state(dd, SPI_OP_STATE_RESET);
if (rc)
goto err_spi_state;
@@ -2609,6 +2663,7 @@ static int msm_spi_probe(struct platform_device *pdev)
dd->mem_size = resource_size(resource);
dd->dev = &pdev->dev;
+ atomic_set(&dd->qup_state, SPI_OP_STATE_RESET);
if (pdata) {
master->rt = pdata->rt_priority;
if (pdata->dma_config) {
@@ -2682,6 +2737,7 @@ skip_dma_resources:
dev_err(&pdev->dev, "failed to create dev. attrs : %d\n", rc);
goto err_attrs;
}
+ rc = sysfs_create_file(&(dd->dev->kobj), &dev_attr_spi_qup_state.attr);
spi_debugfs_init(dd);
return 0;
@@ -2835,6 +2891,7 @@ static int msm_spi_remove(struct platform_device *pdev)
spi_debugfs_exit(dd);
sysfs_remove_group(&pdev->dev.kobj, &dev_attr_grp);
+ sysfs_remove_file(&pdev->dev.kobj, &dev_attr_spi_qup_state.attr);
if (dd->dma_teardown)
dd->dma_teardown(dd);
diff --git a/drivers/spi/spi_qsd.h b/drivers/spi/spi_qsd.h
index 6632fe806e41..09b9cb9d5b7d 100644
--- a/drivers/spi/spi_qsd.h
+++ b/drivers/spi/spi_qsd.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2014-2017, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2014-2018, 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
@@ -405,6 +405,7 @@ struct msm_spi {
bool is_init_complete;
bool pack_words;
bool slv_support;
+ atomic_t qup_state;
};
/* Forward declaration */
diff --git a/drivers/usb/dwc3/dwc3-msm.c b/drivers/usb/dwc3/dwc3-msm.c
index 9c3edae35422..2cd600a58fd7 100644
--- a/drivers/usb/dwc3/dwc3-msm.c
+++ b/drivers/usb/dwc3/dwc3-msm.c
@@ -1996,7 +1996,6 @@ static void msm_dwc3_perf_vote_update(struct dwc3_msm *mdwc,
static int dwc3_msm_suspend(struct dwc3_msm *mdwc)
{
int ret, i;
- bool can_suspend_ssphy;
struct dwc3 *dwc = platform_get_drvdata(mdwc->dwc3);
dbg_event(0xFF, "Ctl Sus", atomic_read(&dwc->in_lpm));
@@ -2065,10 +2064,6 @@ static int dwc3_msm_suspend(struct dwc3_msm *mdwc)
return ret;
}
- /* Initialize variables here */
- can_suspend_ssphy = !(mdwc->in_host_mode &&
- dwc3_msm_is_host_superspeed(mdwc));
-
/* Disable core irq */
if (dwc->irq)
disable_irq(dwc->irq);
@@ -2084,7 +2079,7 @@ static int dwc3_msm_suspend(struct dwc3_msm *mdwc)
usb_phy_set_suspend(mdwc->hs_phy, 1);
/* Suspend SS PHY */
- if (dwc->maximum_speed == USB_SPEED_SUPER && can_suspend_ssphy) {
+ if (dwc->maximum_speed == USB_SPEED_SUPER) {
/* indicate phy about SS mode */
if (dwc3_msm_is_superspeed(mdwc))
mdwc->ss_phy->flags |= DEVICE_IN_SS_MODE;
diff --git a/sound/soc/msm/qdsp6v2/msm-pcm-loopback-v2.c b/sound/soc/msm/qdsp6v2/msm-pcm-loopback-v2.c
index 44f59c49b670..00847d96579d 100644
--- a/sound/soc/msm/qdsp6v2/msm-pcm-loopback-v2.c
+++ b/sound/soc/msm/qdsp6v2/msm-pcm-loopback-v2.c
@@ -246,7 +246,6 @@ static int msm_pcm_open(struct snd_pcm_substream *substream)
struct msm_pcm_loopback *pcm = NULL;
int ret = 0;
uint16_t bits_per_sample = 16;
- struct msm_pcm_routing_evt event;
struct asm_session_mtmx_strtr_param_window_v2_t asm_mtmx_strtr_window;
uint32_t param_id;
struct msm_pcm_pdata *pdata;
@@ -268,10 +267,6 @@ static int msm_pcm_open(struct snd_pcm_substream *substream)
dev_dbg(rtd->platform->dev, "%s: pcm out open: %d,%d\n", __func__,
pcm->instance, substream->stream);
if (pcm->instance == 2) {
- struct snd_soc_pcm_runtime *soc_pcm_rx =
- pcm->playback_substream->private_data;
- struct snd_soc_pcm_runtime *soc_pcm_tx =
- pcm->capture_substream->private_data;
if (pcm->audio_client != NULL)
stop_pcm(pcm);
@@ -303,15 +298,6 @@ static int msm_pcm_open(struct snd_pcm_substream *substream)
mutex_unlock(&pcm->lock);
return -ENOMEM;
}
- event.event_func = msm_pcm_route_event_handler;
- event.priv_data = (void *) pcm;
- msm_pcm_routing_reg_phy_stream(soc_pcm_tx->dai_link->be_id,
- pcm->audio_client->perf_mode,
- pcm->session_id, pcm->capture_substream->stream);
- msm_pcm_routing_reg_phy_stream_v2(soc_pcm_rx->dai_link->be_id,
- pcm->audio_client->perf_mode,
- pcm->session_id, pcm->playback_substream->stream,
- event);
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
pcm->playback_substream = substream;
ret = pcm_loopback_set_volume(pcm, pcm->volume);
@@ -422,6 +408,7 @@ static int msm_pcm_prepare(struct snd_pcm_substream *substream)
struct snd_pcm_runtime *runtime = substream->runtime;
struct msm_pcm_loopback *pcm = runtime->private_data;
struct snd_soc_pcm_runtime *rtd = snd_pcm_substream_chip(substream);
+ struct msm_pcm_routing_evt event;
mutex_lock(&pcm->lock);
@@ -434,6 +421,23 @@ static int msm_pcm_prepare(struct snd_pcm_substream *substream)
if (!pcm->capture_start)
pcm->capture_start = 1;
}
+
+ if (pcm->instance == 2) {
+ struct snd_soc_pcm_runtime *soc_pcm_rx =
+ pcm->playback_substream->private_data;
+ struct snd_soc_pcm_runtime *soc_pcm_tx =
+ pcm->capture_substream->private_data;
+ event.event_func = msm_pcm_route_event_handler;
+ event.priv_data = (void *) pcm;
+ msm_pcm_routing_reg_phy_stream(soc_pcm_tx->dai_link->be_id,
+ pcm->audio_client->perf_mode,
+ pcm->session_id, pcm->capture_substream->stream);
+ msm_pcm_routing_reg_phy_stream_v2(soc_pcm_rx->dai_link->be_id,
+ pcm->audio_client->perf_mode,
+ pcm->session_id, pcm->playback_substream->stream,
+ event);
+ }
+
mutex_unlock(&pcm->lock);
return ret;