Merge "input: qti-haptics: Add support for cmd based haptics-twm"
diff --git a/Documentation/devicetree/bindings/regulator/gdsc-regulator.txt b/Documentation/devicetree/bindings/regulator/gdsc-regulator.txt
index 4ef8d7a..a6b0cdd 100644
--- a/Documentation/devicetree/bindings/regulator/gdsc-regulator.txt
+++ b/Documentation/devicetree/bindings/regulator/gdsc-regulator.txt
@@ -72,7 +72,9 @@
- qcom,en-rest-wait-val: Input value for EN_REST_WAIT controls state transition
delay after receiving ack signal (gds_enr_ack) from the
longest en_rest power switch chain.
-
+ - qcom,skip-disable-before-sw-enable: Presence denotes a hardware requirement
+ to leave the GDSC on that has been
+ enabled by an entity external to HLOS.
Example:
gdsc_oxili_gx: qcom,gdsc@fd8c4024 {
compatible = "qcom,gdsc";
diff --git a/arch/arm64/boot/dts/qcom/sda429-bg-dvt2-wtp-overlay.dts b/arch/arm64/boot/dts/qcom/sda429-bg-dvt2-wtp-overlay.dts
index 1994c5c..eb9d5d4 100644
--- a/arch/arm64/boot/dts/qcom/sda429-bg-dvt2-wtp-overlay.dts
+++ b/arch/arm64/boot/dts/qcom/sda429-bg-dvt2-wtp-overlay.dts
@@ -25,6 +25,18 @@
qcom,pmic-id = <0x0002001b 0x0 0x0 0x0>;
};
+&modem_mem {
+ reg = <0x0 0x86800000 0x0 0x1F00000>;
+};
+
+&adsp_fw_mem {
+ reg = <0x0 0x88700000 0x0 0x1500000>;
+};
+
+&wcnss_fw_mem {
+ reg = <0x0 0x89c00000 0x0 0x700000>;
+};
+
&mdss_dsi0 {
qcom,dsi-pref-prim-pan = <&dsi_auo_416p_amoled_cmd>;
/delete-property/ vdd-supply;
diff --git a/arch/arm64/boot/dts/qcom/sda429-bg-wdp-overlay.dts b/arch/arm64/boot/dts/qcom/sda429-bg-wdp-overlay.dts
index 4e70535..8c021377 100644
--- a/arch/arm64/boot/dts/qcom/sda429-bg-wdp-overlay.dts
+++ b/arch/arm64/boot/dts/qcom/sda429-bg-wdp-overlay.dts
@@ -25,6 +25,18 @@
qcom,pmic-id = <0x0002001b 0x0 0x0 0x0>;
};
+&modem_mem {
+ reg = <0x0 0x86800000 0x0 0x1F00000>;
+};
+
+&adsp_fw_mem {
+ reg = <0x0 0x88700000 0x0 0x1500000>;
+};
+
+&wcnss_fw_mem {
+ reg = <0x0 0x89c00000 0x0 0x700000>;
+};
+
&usb_otg {
HSUSB_3p3-supply = <&L16A>;
};
diff --git a/arch/arm64/boot/dts/qcom/sda429-bg-wtp-overlay.dts b/arch/arm64/boot/dts/qcom/sda429-bg-wtp-overlay.dts
index 9b9a849..e8c11bb 100644
--- a/arch/arm64/boot/dts/qcom/sda429-bg-wtp-overlay.dts
+++ b/arch/arm64/boot/dts/qcom/sda429-bg-wtp-overlay.dts
@@ -25,6 +25,18 @@
qcom,pmic-id = <0x0002001b 0x0 0x0 0x0>;
};
+&modem_mem {
+ reg = <0x0 0x86800000 0x0 0x1F00000>;
+};
+
+&adsp_fw_mem {
+ reg = <0x0 0x88700000 0x0 0x1500000>;
+};
+
+&wcnss_fw_mem {
+ reg = <0x0 0x89c00000 0x0 0x700000>;
+};
+
&mdss_dsi0 {
qcom,dsi-pref-prim-pan = <&dsi_auo_416p_amoled_cmd>;
/delete-property/ vdd-supply;
diff --git a/arch/arm64/boot/dts/qcom/sda429-spyro-qrd-dvt-overlay.dts b/arch/arm64/boot/dts/qcom/sda429-spyro-qrd-dvt-overlay.dts
index 46fe9d5..2bab608 100644
--- a/arch/arm64/boot/dts/qcom/sda429-spyro-qrd-dvt-overlay.dts
+++ b/arch/arm64/boot/dts/qcom/sda429-spyro-qrd-dvt-overlay.dts
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2019, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2019-2020, 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,6 +24,18 @@
qcom,pmic-id = <0x0002001b 0x0 0x0 0x0>;
};
+&modem_mem {
+ reg = <0x0 0x86800000 0x0 0x1F00000>;
+};
+
+&adsp_fw_mem {
+ reg = <0x0 0x88700000 0x0 0x1500000>;
+};
+
+&wcnss_fw_mem {
+ reg = <0x0 0x89c00000 0x0 0x700000>;
+};
+
&usb_otg {
HSUSB_3p3-supply = <&L16A>;
};
diff --git a/arch/arm64/boot/dts/qcom/sdm429w-bg-pm660.dtsi b/arch/arm64/boot/dts/qcom/sdm429w-bg-pm660.dtsi
index bb73889..f453259 100644
--- a/arch/arm64/boot/dts/qcom/sdm429w-bg-pm660.dtsi
+++ b/arch/arm64/boot/dts/qcom/sdm429w-bg-pm660.dtsi
@@ -29,7 +29,3 @@
&pm660_fg {
qcom,fg-disable-in-twm;
};
-
-&pm660_haptics {
- qcom,haptics-ext-pin-twm;
-};
diff --git a/arch/arm64/boot/dts/qcom/sdm670-audio.dtsi b/arch/arm64/boot/dts/qcom/sdm670-audio.dtsi
index 0ea1660..7990e91 100644
--- a/arch/arm64/boot/dts/qcom/sdm670-audio.dtsi
+++ b/arch/arm64/boot/dts/qcom/sdm670-audio.dtsi
@@ -71,12 +71,11 @@
<&incall_music_2_rx>,
<&usb_audio_rx>, <&usb_audio_tx>,
<&dai_pri_tdm_rx_0>, <&dai_pri_tdm_tx_0>,
- <&dai_pri_tdm_tx_1>, <&dai_pri_tdm_tx_2>,
- <&dai_pri_tdm_tx_3>, <&dai_sec_tdm_rx_0>,
- <&dai_sec_tdm_tx_0>, <&dai_tert_tdm_rx_0>,
- <&dai_tert_tdm_tx_0>, <&dai_quat_tdm_rx_0>,
- <&dai_quat_tdm_tx_0>, <&dai_quin_tdm_rx_0>,
- <&dai_quin_tdm_tx_0>, <&afe_loopback_tx>;
+ <&dai_sec_tdm_rx_0>, <&dai_sec_tdm_tx_0>,
+ <&dai_tert_tdm_rx_0>, <&dai_tert_tdm_tx_0>,
+ <&dai_quat_tdm_rx_0>, <&dai_quat_tdm_tx_0>,
+ <&dai_quin_tdm_rx_0>, <&dai_quin_tdm_tx_0>,
+ <&afe_loopback_tx>;
asoc-cpu-names = "msm-dai-q6-dp.24608",
"msm-dai-q6-mi2s.0", "msm-dai-q6-mi2s.1",
"msm-dai-q6-mi2s.2", "msm-dai-q6-mi2s.3",
@@ -99,12 +98,11 @@
"msm-dai-q6-dev.32773", "msm-dai-q6-dev.32770",
"msm-dai-q6-dev.28672", "msm-dai-q6-dev.28673",
"msm-dai-q6-tdm.36864", "msm-dai-q6-tdm.36865",
- "msm-dai-q6-tdm.36867", "msm-dai-q6-tdm.36869",
- "msm-dai-q6-tdm.36871", "msm-dai-q6-tdm.36880",
- "msm-dai-q6-tdm.36881", "msm-dai-q6-tdm.36896",
- "msm-dai-q6-tdm.36897", "msm-dai-q6-tdm.36912",
- "msm-dai-q6-tdm.36913", "msm-dai-q6-tdm.36928",
- "msm-dai-q6-tdm.36929", "msm-dai-q6-dev.24577";
+ "msm-dai-q6-tdm.36880", "msm-dai-q6-tdm.36881",
+ "msm-dai-q6-tdm.36896", "msm-dai-q6-tdm.36897",
+ "msm-dai-q6-tdm.36912", "msm-dai-q6-tdm.36913",
+ "msm-dai-q6-tdm.36928", "msm-dai-q6-tdm.36929",
+ "msm-dai-q6-dev.24577";
};
tasha_snd: sound-tasha {
@@ -243,40 +241,6 @@
compatible = "qcom,msm-cpe-lsm";
qcom,msm-cpe-lsm-id = <3>;
};
-
- pri_tdm_tx: qcom,msm-dai-tdm-pri-tx {
- compatible = "qcom,msm-dai-tdm";
- qcom,msm-cpudai-tdm-group-id = <37121>;
- qcom,msm-cpudai-tdm-group-num-ports = <4>;
- qcom,msm-cpudai-tdm-group-port-id = <36865 36867 36869 36871>;
- qcom,msm-cpudai-tdm-clk-rate = <1536000>;
- qcom,msm-cpudai-tdm-clk-internal = <1>;
- qcom,msm-cpudai-tdm-sync-mode = <1>;
- qcom,msm-cpudai-tdm-sync-src = <1>;
- qcom,msm-cpudai-tdm-data-out = <0>;
- qcom,msm-cpudai-tdm-invert-sync = <1>;
- qcom,msm-cpudai-tdm-data-delay = <1>;
- dai_pri_tdm_tx_0: qcom,msm-dai-q6-tdm-pri-tx-0 {
- compatible = "qcom,msm-dai-q6-tdm";
- qcom,msm-cpudai-tdm-dev-id = <36865>;
- qcom,msm-cpudai-tdm-data-align = <0>;
- };
- dai_pri_tdm_tx_1: qcom,msm-dai-q6-tdm-pri-tx-1 {
- compatible = "qcom,msm-dai-q6-tdm";
- qcom,msm-cpudai-tdm-dev-id = <36867>;
- qcom,msm-cpudai-tdm-data-align = <0>;
- };
- dai_pri_tdm_tx_2: qcom,msm-dai-q6-tdm-pri-tx-2 {
- compatible = "qcom,msm-dai-q6-tdm";
- qcom,msm-cpudai-tdm-dev-id = <36869>;
- qcom,msm-cpudai-tdm-data-align = <0>;
- };
- dai_pri_tdm_tx_3: qcom,msm-dai-q6-tdm-pri-tx-3 {
- compatible = "qcom,msm-dai-q6-tdm";
- qcom,msm-cpudai-tdm-dev-id = <36871>;
- qcom,msm-cpudai-tdm-data-align = <0>;
- };
- };
};
&slim_aud {
diff --git a/arch/arm64/boot/dts/qcom/sdm670.dtsi b/arch/arm64/boot/dts/qcom/sdm670.dtsi
index d7b1b06..5990f9b 100644
--- a/arch/arm64/boot/dts/qcom/sdm670.dtsi
+++ b/arch/arm64/boot/dts/qcom/sdm670.dtsi
@@ -3004,6 +3004,7 @@
parent-supply = <&pm660l_s2_level>;
domain-addr = <&gpu_gx_domain_addr>;
sw-reset = <&gpu_gx_sw_reset>;
+ qcom,skip-disable-before-sw-enable;
qcom,reset-aon-logic;
status = "ok";
};
diff --git a/drivers/bus/mhi/core/mhi_main.c b/drivers/bus/mhi/core/mhi_main.c
index 1b81eb8..0dfeff0 100644
--- a/drivers/bus/mhi/core/mhi_main.c
+++ b/drivers/bus/mhi/core/mhi_main.c
@@ -1049,7 +1049,9 @@
result.transaction_status = (ev_code == MHI_EV_CC_OVERFLOW) ?
-EOVERFLOW : 0;
- result.bytes_xferd = xfer_len;
+
+ /* truncate to buf len if xfer_len is larger */
+ result.bytes_xferd = min_t(u16, xfer_len, buf_info->len);
result.buf_addr = buf_info->cb_buf;
result.dir = mhi_chan->dir;
@@ -1287,7 +1289,7 @@
chan = MHI_TRE_GET_EV_CHID(local_rp);
if (chan >= mhi_cntrl->max_chan) {
MHI_ERR("invalid channel id %u\n", chan);
- continue;
+ goto next_er_element;
}
mhi_chan = &mhi_cntrl->mhi_chan[chan];
@@ -1299,6 +1301,7 @@
event_quota--;
}
+next_er_element:
mhi_recycle_ev_ring_element(mhi_cntrl, ev_ring);
local_rp = ev_ring->rp;
dev_rp = mhi_to_virtual(ev_ring, er_ctxt->rp);
diff --git a/drivers/char/adsprpc.c b/drivers/char/adsprpc.c
index a0652b7..2d23442 100644
--- a/drivers/char/adsprpc.c
+++ b/drivers/char/adsprpc.c
@@ -720,12 +720,20 @@
{
struct fastrpc_apps *me = &gfa;
struct fastrpc_file *fl;
- int vmid;
+ int vmid, cid = -1, err = 0;
struct fastrpc_session_ctx *sess;
if (!map)
return;
fl = map->fl;
+ cid = fl->cid;
+ VERIFY(err, cid >= ADSP_DOMAIN_ID && cid < NUM_CHANNELS);
+ if (err) {
+ err = -ECHRNG;
+ pr_err("adsprpc: ERROR:%s, Invalid channel id: %d, err:%d",
+ __func__, cid, err);
+ return;
+ }
if (map->flags == ADSP_MMAP_HEAP_ADDR ||
map->flags == ADSP_MMAP_REMOTE_HEAP_ADDR) {
spin_lock(&me->hlock);
@@ -805,15 +813,21 @@
struct fastrpc_apps *me = &gfa;
struct fastrpc_session_ctx *sess;
struct fastrpc_apps *apps = fl->apps;
- int cid = fl->cid;
- struct fastrpc_channel_ctx *chan = &apps->channel[cid];
struct fastrpc_mmap *map = NULL;
+ struct fastrpc_channel_ctx *chan = NULL;
unsigned long attrs;
dma_addr_t region_phys = 0;
void *region_vaddr = NULL;
unsigned long flags;
- int err = 0, vmid;
+ int err = 0, vmid, cid = -1;
+ cid = fl->cid;
+ VERIFY(err, cid >= ADSP_DOMAIN_ID && cid < NUM_CHANNELS);
+ if (err) {
+ err = -ECHRNG;
+ goto bail;
+ }
+ chan = &apps->channel[cid];
if (!fastrpc_mmap_find(fl, fd, va, len, mflags, 1, ppmap))
return 0;
map = kzalloc(sizeof(*map), GFP_KERNEL);
@@ -1850,12 +1864,22 @@
{
struct smq_msg *msg = &ctx->msg;
struct fastrpc_file *fl = ctx->fl;
- struct fastrpc_channel_ctx *channel_ctx = &fl->apps->channel[fl->cid];
- int err = 0, len;
+ int err = 0, len, cid = -1;
+ struct fastrpc_channel_ctx *channel_ctx = NULL;
+
+ cid = fl->cid;
+ VERIFY(err, cid >= ADSP_DOMAIN_ID && cid < NUM_CHANNELS);
+ if (err) {
+ err = -ECHRNG;
+ goto bail;
+ }
+ channel_ctx = &fl->apps->channel[fl->cid];
VERIFY(err, NULL != channel_ctx->chan);
- if (err)
+ if (err) {
+ err = -ECHRNG;
goto bail;
+ }
msg->pid = fl->tgid;
msg->tid = current->pid;
if (fl->sessionid)
@@ -1974,11 +1998,22 @@
{
struct smq_invoke_ctx *ctx = NULL;
struct fastrpc_ioctl_invoke *invoke = &inv->inv;
- int cid = fl->cid;
- int interrupted = 0;
- int err = 0;
+ int err = 0, cid = -1, interrupted = 0;
struct timespec invoket = {0};
- int64_t *perf_counter = getperfcounter(fl, PERF_COUNT);
+ int64_t *perf_counter = NULL;
+
+ cid = fl->cid;
+ VERIFY(err, cid >= ADSP_DOMAIN_ID && cid < NUM_CHANNELS);
+ if (err) {
+ err = -ECHRNG;
+ goto bail;
+ }
+ VERIFY(err, fl->sctx != NULL);
+ if (err) {
+ err = -EBADR;
+ goto bail;
+ }
+ perf_counter = getperfcounter(fl, PERF_COUNT);
if (fl->profile)
getnstimeofday(&invoket);
@@ -1992,13 +2027,6 @@
}
}
- VERIFY(err, fl->sctx != NULL);
- if (err)
- goto bail;
- VERIFY(err, fl->cid >= 0 && fl->cid < NUM_CHANNELS);
- if (err)
- goto bail;
-
if (!kernel) {
VERIFY(err, 0 == context_restore_interrupted(fl, inv,
&ctx));
@@ -3408,7 +3436,7 @@
static int fastrpc_channel_open(struct fastrpc_file *fl)
{
struct fastrpc_apps *me = &gfa;
- int cid, ii, err = 0;
+ int cid = -1, ii, err = 0;
mutex_lock(&me->smd_mutex);
@@ -3416,9 +3444,11 @@
if (err)
goto bail;
cid = fl->cid;
- VERIFY(err, cid >= 0 && cid < NUM_CHANNELS);
- if (err)
+ VERIFY(err, cid >= ADSP_DOMAIN_ID && cid < NUM_CHANNELS);
+ if (err) {
+ err = -ECHRNG;
goto bail;
+ }
if (me->channel[cid].ssrcount !=
me->channel[cid].prevssrcount) {
if (!me->channel[cid].issubsystemup) {
diff --git a/drivers/clk/qcom/gdsc-regulator.c b/drivers/clk/qcom/gdsc-regulator.c
index 15a93cd..1ffb341 100644
--- a/drivers/clk/qcom/gdsc-regulator.c
+++ b/drivers/clk/qcom/gdsc-regulator.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2019, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2020, 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
@@ -92,6 +92,7 @@
int root_clk_idx;
u32 gds_timeout;
u32 flags;
+ bool skip_disable_before_enable;
};
enum gdscr_status {
@@ -379,6 +380,7 @@
clk_disable_unprepare(sc->clocks[sc->root_clk_idx]);
sc->is_gdsc_enabled = true;
+ sc->skip_disable_before_enable = false;
mutex_unlock(&gdsc_seq_lock);
@@ -391,6 +393,16 @@
uint32_t regval;
int i, ret = 0;
+ /*
+ * Protect GDSC against late_init disabling when the GDSC is enabled
+ * by an entity outside external to HLOS.
+ */
+ if (sc->skip_disable_before_enable) {
+ dev_dbg(&rdev->dev, "Skip Disabling: %s\n", sc->rdesc.name);
+ sc->skip_disable_before_enable = false;
+ return 0;
+ }
+
mutex_lock(&gdsc_seq_lock);
if (sc->force_root_en)
@@ -827,6 +839,9 @@
clk_set_flags(sc->clocks[i], CLKFLAG_NORETAIN_PERIPH);
}
+ sc->skip_disable_before_enable = of_property_read_bool(
+ pdev->dev.of_node, "qcom,skip-disable-before-sw-enable");
+
reg_config.dev = &pdev->dev;
reg_config.init_data = init_data;
reg_config.driver_data = sc;
diff --git a/drivers/soc/qcom/bgcom_spi.c b/drivers/soc/qcom/bgcom_spi.c
index a6a176a..ff07a32 100644
--- a/drivers/soc/qcom/bgcom_spi.c
+++ b/drivers/soc/qcom/bgcom_spi.c
@@ -1050,6 +1050,7 @@
{
struct bg_spi_priv *bg_spi = spi_get_drvdata(spi);
+ bg_com_drv = NULL;
mutex_destroy(&bg_spi->xfer_mutex);
devm_kfree(&spi->dev, bg_spi);
spi_set_drvdata(spi, NULL);