lkml.org 
[lkml]   [2021]   [Jan]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.10 056/145] scsi: ufs-pci: Ensure UFS device is in PowerDown mode for suspend-to-disk ->poweroff()
    Date
    From: Adrian Hunter <adrian.hunter@intel.com>

    [ Upstream commit af423534d2de86cd0db729a5ac41f056ca8717de ]

    The expectation for suspend-to-disk is that devices will be powered-off, so
    the UFS device should be put in PowerDown mode. If spm_lvl is not 5, then
    that will not happen. Change the pm callbacks to force spm_lvl 5 for
    suspend-to-disk poweroff.

    Link: https://lore.kernel.org/r/20201207083120.26732-3-adrian.hunter@intel.com
    Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/scsi/ufs/ufshcd-pci.c | 34 ++++++++++++++++++++++++++++++++--
    1 file changed, 32 insertions(+), 2 deletions(-)

    diff --git a/drivers/scsi/ufs/ufshcd-pci.c b/drivers/scsi/ufs/ufshcd-pci.c
    index 360c25f1f061a..5d33c39fa82f0 100644
    --- a/drivers/scsi/ufs/ufshcd-pci.c
    +++ b/drivers/scsi/ufs/ufshcd-pci.c
    @@ -227,6 +227,30 @@ static int ufshcd_pci_resume(struct device *dev)
    {
    return ufshcd_system_resume(dev_get_drvdata(dev));
    }
    +
    +/**
    + * ufshcd_pci_poweroff - suspend-to-disk poweroff function
    + * @dev: pointer to PCI device handle
    + *
    + * Returns 0 if successful
    + * Returns non-zero otherwise
    + */
    +static int ufshcd_pci_poweroff(struct device *dev)
    +{
    + struct ufs_hba *hba = dev_get_drvdata(dev);
    + int spm_lvl = hba->spm_lvl;
    + int ret;
    +
    + /*
    + * For poweroff we need to set the UFS device to PowerDown mode.
    + * Force spm_lvl to ensure that.
    + */
    + hba->spm_lvl = 5;
    + ret = ufshcd_system_suspend(hba);
    + hba->spm_lvl = spm_lvl;
    + return ret;
    +}
    +
    #endif /* !CONFIG_PM_SLEEP */

    #ifdef CONFIG_PM
    @@ -322,8 +346,14 @@ ufshcd_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
    }

    static const struct dev_pm_ops ufshcd_pci_pm_ops = {
    - SET_SYSTEM_SLEEP_PM_OPS(ufshcd_pci_suspend,
    - ufshcd_pci_resume)
    +#ifdef CONFIG_PM_SLEEP
    + .suspend = ufshcd_pci_suspend,
    + .resume = ufshcd_pci_resume,
    + .freeze = ufshcd_pci_suspend,
    + .thaw = ufshcd_pci_resume,
    + .poweroff = ufshcd_pci_poweroff,
    + .restore = ufshcd_pci_resume,
    +#endif
    SET_RUNTIME_PM_OPS(ufshcd_pci_runtime_suspend,
    ufshcd_pci_runtime_resume,
    ufshcd_pci_runtime_idle)
    --
    2.27.0


    \
     
     \ /
      Last update: 2021-01-11 14:30    [W:2.910 / U:0.316 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site