diff --git a/drivers/scsi/ufs/ufs-tegra-common.c b/drivers/scsi/ufs/ufs-tegra-common.c index dc43a55a..f0b06b60 100644 --- a/drivers/scsi/ufs/ufs-tegra-common.c +++ b/drivers/scsi/ufs/ufs-tegra-common.c @@ -1816,6 +1816,10 @@ static int ufs_tegra_hce_enable_notify(struct ufs_hba *hba, clk_disable_unprepare(ufs_tegra->mphy_force_ls_mode); if (ufs_tegra->soc->chip_id >= TEGRA234) ufs_tegra_ufs_mmio_axi(hba); + /* Enable auto hibernate */ + if (ufs_tegra->enable_auto_hibern8) + ufs_aux_writel(ufs_tegra->ufs_aux_base, 0x4, + UFSHC_AUX_UFSHC_CARD_DET_LP_PWR_CTRL_0); break; default: break; @@ -1941,6 +1945,8 @@ static int ufs_tegra_config_soc_data(struct ufs_tegra_host *ufs_tegra) ufs_tegra->enable_scramble = of_property_read_bool(np, "nvidia,enable-scramble"); + ufs_tegra->enable_auto_hibern8 = + of_property_read_bool(np, "nvidia,enable-auto-hibern8"); if (ufs_tegra->soc->chip_id >= TEGRA234) { #if defined(NV_UFSHCD_QUIRKS_ENUM_HAS_UFSHCD_QUIRK_BROKEN_64BIT_ADDRESS) /* Linux 6.0 */ diff --git a/drivers/scsi/ufs/ufs-tegra.h b/drivers/scsi/ufs/ufs-tegra.h index 2f30ad30..637734d4 100644 --- a/drivers/scsi/ufs/ufs-tegra.h +++ b/drivers/scsi/ufs/ufs-tegra.h @@ -45,6 +45,7 @@ #define UFS_AUX_ADDR_VIRT_CTRL_EN 0x1 #define UFS_AUX_ADDR_VIRT_PA_VA_CTRL 0x2 #define UFS_AUX_ADDR_VIRT_REG_0 0x4 +#define UFSHC_AUX_UFSHC_CARD_DET_LP_PWR_CTRL_0 0x1CU /* * M-PHY Registers @@ -348,6 +349,7 @@ struct ufs_tegra_host { bool enable_hs_mode; bool enable_38mhz_clk; bool enable_ufs_provisioning; + bool enable_auto_hibern8; u32 max_hs_gear; bool mask_fast_auto_mode; bool mask_hs_mode_b;