Commit 673b5708 authored by Jacky Bai's avatar Jacky Bai Committed by Jassi Brar
Browse files

mailbox: imx: Skip the suspend flag for i.MX7ULP



In current imx-mailbox driver, the MU IRQ is configured with
'IRQF_NO_SUSPEND' flag set. So during linux suspend/resume flow,
the MU IRQ is always enabled. With commit 892cb524 ("mailbox: imx:
fix wakeup failure from freeze mode"), if the MU IRQ is triggered after
the priv->suspended flag has been set, the system suspend will be
aborted.

On i.MX7ULP platform, certain drivers that depend on rpmsg may need
to send rpmsg request and receive an acknowledgment from the remote
core during the late_suspend stage. Early suspend abort is not
expected, and the i.MX7ULP already has additional hardware and
software to make sure the system can be wakeup from freeze mode
correctly when MU IRQ is trigger.

Skip the 'suspend' flag handling logic on i.MX7ULP to avoid the
early abort when doing suspend.

Signed-off-by: default avatarJacky Bai <ping.bai@nxp.com>
Reviewed-by: default avatarPeng Fan <peng.fan@nxp.com>
Signed-off-by: default avatarJassi Brar <jassisinghbrar@gmail.com>
parent 6b0eadf6
Loading
Loading
Loading
Loading
+6 −2
Original line number Diff line number Diff line
@@ -122,6 +122,7 @@ struct imx_mu_dcfg {
	u32	xRR;		/* Receive Register0 */
	u32	xSR[IMX_MU_xSR_MAX];	/* Status Registers */
	u32	xCR[IMX_MU_xCR_MAX];	/* Control Registers */
	bool	skip_suspend_flag;
};

#define IMX_MU_xSR_GIPn(type, x) (type & IMX_MU_V2 ? BIT(x) : BIT(28 + (3 - (x))))
@@ -988,6 +989,7 @@ static const struct imx_mu_dcfg imx_mu_cfg_imx7ulp = {
	.xRR	= 0x40,
	.xSR	= {0x60, 0x60, 0x60, 0x60},
	.xCR	= {0x64, 0x64, 0x64, 0x64, 0x64},
	.skip_suspend_flag = true,
};

static const struct imx_mu_dcfg imx_mu_cfg_imx8ulp = {
@@ -1071,6 +1073,7 @@ static int __maybe_unused imx_mu_suspend_noirq(struct device *dev)
			priv->xcr[i] = imx_mu_read(priv, priv->dcfg->xCR[i]);
	}

	if (!priv->dcfg->skip_suspend_flag)
		priv->suspend = true;

	return 0;
@@ -1094,6 +1097,7 @@ static int __maybe_unused imx_mu_resume_noirq(struct device *dev)
			imx_mu_write(priv, priv->xcr[i], priv->dcfg->xCR[i]);
	}

	if (!priv->dcfg->skip_suspend_flag)
		priv->suspend = false;

	return 0;