Commit cd4c0025 authored by Peter Griffin's avatar Peter Griffin Committed by Martin K. Petersen
Browse files

scsi: ufs: exynos: gs101: Put UFS device in reset on .suspend()



GPIO_OUT[0] is connected to the reset pin of embedded UFS device.
Before powering off the phy assert the reset signal.

This is added as a gs101 specific suspend hook so as not to have any
unintended consequences for other SoCs supported by this driver.

Signed-off-by: default avatarPeter Griffin <peter.griffin@linaro.org>
Link: https://lore.kernel.org/r/20250319-exynos-ufs-stability-fixes-v2-7-96722cc2ba1b@linaro.org


Reviewed-by: default avatarBart Van Assche <bvanassche@acm.org>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 67e40850
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -1700,6 +1700,12 @@ static void exynos_ufs_hibern8_notify(struct ufs_hba *hba,
	}
}

static int gs101_ufs_suspend(struct exynos_ufs *ufs)
{
	hci_writel(ufs, 0 << 0, HCI_GPIO_OUT);
	return 0;
}

static int exynos_ufs_suspend(struct ufs_hba *hba, enum ufs_pm_op pm_op,
	enum ufs_notify_change_status status)
{
@@ -1708,6 +1714,9 @@ static int exynos_ufs_suspend(struct ufs_hba *hba, enum ufs_pm_op pm_op,
	if (status == PRE_CHANGE)
		return 0;

	if (ufs->drv_data->suspend)
		ufs->drv_data->suspend(ufs);

	if (!ufshcd_is_link_active(hba))
		phy_power_off(ufs->phy);

@@ -2170,6 +2179,7 @@ static const struct exynos_ufs_drv_data gs101_ufs_drvs = {
	.pre_link		= gs101_ufs_pre_link,
	.post_link		= gs101_ufs_post_link,
	.pre_pwr_change		= gs101_ufs_pre_pwr_change,
	.suspend		= gs101_ufs_suspend,
};

static const struct of_device_id exynos_ufs_of_match[] = {
+1 −0
Original line number Diff line number Diff line
@@ -192,6 +192,7 @@ struct exynos_ufs_drv_data {
				struct ufs_pa_layer_attr *pwr);
	int (*pre_hce_enable)(struct exynos_ufs *ufs);
	int (*post_hce_enable)(struct exynos_ufs *ufs);
	int (*suspend)(struct exynos_ufs *ufs);
};

struct ufs_phy_time_cfg {