diff options
Diffstat (limited to 'soc/swr-mstr-ctrl.c')
-rw-r--r-- | soc/swr-mstr-ctrl.c | 20 |
1 files changed, 11 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; |