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

Commit 2b1980ee authored by Stanley Chu's avatar Stanley Chu
Browse files

UPSTREAM: scsi: ufs: ufs-mediatek: ensure UniPro is not powered down before linkup

MediaTek Chipsets can enter proprietary UniPro low-power mode during
suspend while link is in hibern8 state. Make sure leaving low-power mode
before every link startup to prevent lockup in any possible error recovery
path.

At the same time, re-factor related funcitons to improve code readability.

Bug: 151050916
(cherry picked from commit 7742ca797aa79f280853ffd3e7d2e2af3cd317a5)
Link: https://lore.kernel.org/r/20200129105251.12466-2-stanley.chu@mediatek.com


Reviewed-by: default avatarAlim Akhtar <alim.akhtar@samsung.com>
Reviewed-by: default avatarBean Huo <beanhuo@micron.com>
Signed-off-by: default avatarStanley Chu <stanley.chu@mediatek.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
Change-Id: I98a583a0b3e490465a572e45ba64ae5605bb65e1
parent a74f79b3
Loading
Loading
Loading
Loading
+10 −9
Original line number Diff line number Diff line
@@ -30,6 +30,11 @@
#define ufs_mtk_device_reset_ctrl(high, res) \
	ufs_mtk_smc(UFS_MTK_SIP_DEVICE_RESET, high, res)

#define ufs_mtk_unipro_powerdown(hba, powerdown) \
	ufshcd_dme_set(hba, \
		       UIC_ARG_MIB_SEL(VS_UNIPROPOWERDOWNCONTROL, 0), \
		       powerdown)

static void ufs_mtk_cfg_unipro_cg(struct ufs_hba *hba, bool enable)
{
	u32 tmp;
@@ -290,6 +295,8 @@ static int ufs_mtk_pre_link(struct ufs_hba *hba)
	int ret;
	u32 tmp;

	ufs_mtk_unipro_powerdown(hba, 0);

	/* disable deep stall */
	ret = ufshcd_dme_get(hba, UIC_ARG_MIB(VS_SAVEPOWERCONTROL), &tmp);
	if (ret)
@@ -390,9 +397,7 @@ static int ufs_mtk_link_set_hpm(struct ufs_hba *hba)
	if (err)
		return err;

	err = ufshcd_dme_set(hba,
			     UIC_ARG_MIB_SEL(VS_UNIPROPOWERDOWNCONTROL, 0),
			     0);
	err = ufs_mtk_unipro_powerdown(hba, 0);
	if (err)
		return err;

@@ -413,14 +418,10 @@ static int ufs_mtk_link_set_lpm(struct ufs_hba *hba)
{
	int err;

	err = ufshcd_dme_set(hba,
			     UIC_ARG_MIB_SEL(VS_UNIPROPOWERDOWNCONTROL, 0),
			     1);
	err = ufs_mtk_unipro_powerdown(hba, 1);
	if (err) {
		/* Resume UniPro state for following error recovery */
		ufshcd_dme_set(hba,
			       UIC_ARG_MIB_SEL(VS_UNIPROPOWERDOWNCONTROL, 0),
			       0);
		ufs_mtk_unipro_powerdown(hba, 0);
		return err;
	}