Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 07d5afc4 authored by Sudheer Papothi's avatar Sudheer Papothi
Browse files

soc: soundwire: Enable soundwire slave host irq



soundwire slave devices gets reset resulting in setting
host irq to default state. Enable soundwire slave host irq
to process slave interrupts.

Change-Id: I49c3482a22b89fe2a28768edcf7d1e19ba0b978f
Signed-off-by: default avatarSudheer Papothi <spapothi@codeaurora.org>
parent 4f42ed04
Loading
Loading
Loading
Loading
+28 −1
Original line number Diff line number Diff line
@@ -1308,6 +1308,26 @@ static int swrm_find_alert_slave(struct swr_mstr_ctrl *swrm,
		return -EINVAL;
}

static void swrm_enable_slave_irq(struct swr_mstr_ctrl *swrm)
{
	int i;
	int status = 0;

	status = swr_master_read(swrm, SWRM_MCP_SLV_STATUS);
	if (!status) {
		dev_dbg_ratelimited(swrm->dev, "%s: slaves status is 0x%x\n",
					__func__, status);
		return;
	}
	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_wr_cmd(swrm, 0x4, i, 0x0,
						SWRS_SCP_INT_STATUS_MASK_1);
		status >>= 2;
	}
}

static int swrm_check_slave_change_status(struct swr_mstr_ctrl *swrm,
					int status, u8 *devnum)
{
@@ -1674,6 +1694,12 @@ static irqreturn_t swr_mstr_interrupt_v2(int irq, void *dev)
				dev_err_ratelimited(swrm->dev,
					"%s: SWR wokeup during clock stop\n",
					__func__);
			/* It might be possible the slave device gets reset
			 * and slave interrupt gets missed. So re-enable
			 * Host IRQ and process slave pending
			 * interrupts, if any.
			 */
			swrm_enable_slave_irq(swrm);
			break;
		default:
			dev_err_ratelimited(swrm->dev,
@@ -1690,7 +1716,8 @@ static irqreturn_t swr_mstr_interrupt_v2(int irq, void *dev)
	intr_sts_masked = intr_sts & swrm->intr_mask;

	if (intr_sts_masked) {
		dev_dbg(swrm->dev, "%s: new interrupt received\n", __func__);
		dev_dbg(swrm->dev, "%s: new interrupt received 0x%x\n",
			__func__, intr_sts_masked);
		goto handle_irq;
	}