summaryrefslogtreecommitdiff
path: root/soc/swr-mstr-ctrl.c
diff options
context:
space:
mode:
Diffstat (limited to 'soc/swr-mstr-ctrl.c')
-rw-r--r--soc/swr-mstr-ctrl.c20
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;