summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVatsal Bucha <vbucha@codeaurora.org>2020-08-04 07:46:05 +0530
committerGerrit - the friendly Code Review server <code-review@localhost>2020-08-28 20:46:19 -0700
commit908583ff00ed2b342fffc388e0a15693c2801bb4 (patch)
treeade7b409846c1c37de8e19c5633a1367a5d6170a
parent08747bef396f04f38ea4632444c6e17cb232d69d (diff)
downloadmsm-extra-908583ff00ed2b342fffc388e0a15693c2801bb4.tar.gz
soc: swr-mstr: Fix random headset detection issue on scuba
When headset is inserted and reboot device sometimes headset is not detected after reboot as host_irq from swr slave gets masked. This is because of cmd error seen after clearing all irq which results in fifo flush. Read swrslave irq before clearing so as to resolve cmd error. Also enable slave irq only after clearing enum interrupt at master which results in proper enabling of irq. Change-Id: Id66029c65c4d813391bfeb8c0c619560f298eeab Signed-off-by: Vatsal Bucha <vbucha@codeaurora.org>
-rw-r--r--soc/swr-mstr-ctrl.c20
-rw-r--r--soc/swr-mstr-ctrl.h1
2 files changed, 12 insertions, 9 deletions
diff --git a/soc/swr-mstr-ctrl.c b/soc/swr-mstr-ctrl.c
index 623f70e6..ad4db4f7 100644
--- a/soc/swr-mstr-ctrl.c
+++ b/soc/swr-mstr-ctrl.c
@@ -1744,6 +1744,7 @@ static void swrm_enable_slave_irq(struct swr_mstr_ctrl *swrm)
{
int i;
int status = 0;
+ u32 temp;
status = swr_master_read(swrm, SWRM_MCP_SLV_STATUS);
if (!status) {
@@ -1754,6 +1755,8 @@ static void swrm_enable_slave_irq(struct swr_mstr_ctrl *swrm)
dev_dbg(swrm->dev, "%s: slave status: 0x%x\n", __func__, status);
for (i = 0; i < (swrm->master.num_dev + 1); i++) {
if (status & SWRM_MCP_SLV_STATUS_MASK) {
+ swrm_cmd_fifo_rd_cmd(swrm, &temp, i, 0x0,
+ SWRS_SCP_INT_STATUS_CLEAR_1, 1);
swrm_cmd_fifo_wr_cmd(swrm, 0xFF, i, 0x0,
SWRS_SCP_INT_STATUS_CLEAR_1);
swrm_cmd_fifo_wr_cmd(swrm, 0x4, i, 0x0,
@@ -2069,10 +2072,7 @@ handle_irq:
* as hw will mask host_irq at slave
* but will not unmask it afterwards.
*/
- swrm_cmd_fifo_wr_cmd(swrm, 0xFF, devnum, 0x0,
- SWRS_SCP_INT_STATUS_CLEAR_1);
- swrm_cmd_fifo_wr_cmd(swrm, 0x4, devnum, 0x0,
- SWRS_SCP_INT_STATUS_MASK_1);
+ swrm->enable_slave_irq = true;
}
break;
case SWR_ATTACHED_OK:
@@ -2080,11 +2080,7 @@ handle_irq:
"%s: device %d got attached\n",
__func__, devnum);
/* enable host irq from slave device*/
- swrm_cmd_fifo_wr_cmd(swrm, 0xFF, devnum, 0x0,
- SWRS_SCP_INT_STATUS_CLEAR_1);
- swrm_cmd_fifo_wr_cmd(swrm, 0x4, devnum, 0x0,
- SWRS_SCP_INT_STATUS_MASK_1);
-
+ swrm->enable_slave_irq = true;
break;
case SWR_ALERT:
dev_dbg(swrm->dev,
@@ -2187,6 +2183,12 @@ handle_irq:
swr_master_write(swrm, SWRM_INTERRUPT_CLEAR, intr_sts);
swr_master_write(swrm, SWRM_INTERRUPT_CLEAR, 0x0);
+ if (swrm->enable_slave_irq) {
+ /* Enable slave irq here */
+ swrm_enable_slave_irq(swrm);
+ swrm->enable_slave_irq = false;
+ }
+
intr_sts = swr_master_read(swrm, SWRM_INTERRUPT_STATUS);
intr_sts_masked = intr_sts & swrm->intr_mask;
diff --git a/soc/swr-mstr-ctrl.h b/soc/swr-mstr-ctrl.h
index 51b35386..f5365923 100644
--- a/soc/swr-mstr-ctrl.h
+++ b/soc/swr-mstr-ctrl.h
@@ -184,6 +184,7 @@ struct swr_mstr_ctrl {
u32 disable_div2_clk_switch;
u32 rd_fifo_depth;
u32 wr_fifo_depth;
+ bool enable_slave_irq;
#ifdef CONFIG_DEBUG_FS
struct dentry *debugfs_swrm_dent;
struct dentry *debugfs_peek;