mtip32xx: convert to generic power management

Convert mtip32xx from legacy PCI power management to the generic power
management framework.

Previously, mtip32xx used legacy PCI power management, where
mtip_pci_suspend() and mtip_pci_resume() were responsible for both
device-specific things and generic PCI things:

  mtip_pci_suspend
    mtip_block_suspend(dd)              <-- device-specific
    pci_save_state(pdev)                <-- generic PCI
    pci_set_power_state(pdev, pci_choose_state(pdev, state))

  mtip_pci_resume
    pci_set_power_state(PCI_D0)         <-- generic PCI
    pci_restore_state(pdev)             <-- generic PCI
    pcim_enable_device(pdev)            <-- generic PCI
    pci_set_master(pdev)                <-- generic PCI
    mtip_block_resume(dd)               <-- device-specific

With generic power management, the PCI bus PM methods do the generic PCI
things, and the driver needs only the device-specific part, i.e.,

  suspend_devices_and_enter
    dpm_suspend_start(PMSG_SUSPEND)
      pci_pm_suspend                    # PCI bus .suspend() method
        mtip_pci_suspend                # dev->driver->pm->suspend
          mtip_block_suspend            <-- device-specific
    suspend_enter
      dpm_suspend_noirq(PMSG_SUSPEND)
        pci_pm_suspend_noirq            # PCI bus .suspend_noirq() method
          pci_save_state                <-- generic PCI
          pci_prepare_to_sleep          <-- generic PCI
            pci_set_power_state
    ...
    dpm_resume_end(PMSG_RESUME)
      pci_pm_resume                     # PCI bus .resume() method
        pci_restore_standard_config
          pci_set_power_state(PCI_D0)   <-- generic PCI
          pci_restore_state             <-- generic PCI
        mtip_pci_resume                 # dev->driver->pm->resume
          mtip_block_resume             <-- device-specific

[bhelgaas: commit log]

Link: https://lore.kernel.org/r/20210114115423.52414-2-vaibhavgupta40@gmail.com
Signed-off-by: Vaibhav Gupta <vaibhavgupta40@gmail.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Link: https://lore.kernel.org/r/20211208192449.146076-4-helgaas@kernel.org
Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
Vaibhav Gupta 2021-12-08 13:24:48 -06:00 committed by Jens Axboe
parent 9e541f142d
commit cd97b7e0d7

View File

@ -4144,30 +4144,17 @@ static void mtip_pci_remove(struct pci_dev *pdev)
* 0 Success * 0 Success
* <0 Error * <0 Error
*/ */
static int mtip_pci_suspend(struct pci_dev *pdev, pm_message_t mesg) static int __maybe_unused mtip_pci_suspend(struct device *dev)
{ {
int rv = 0; int rv = 0;
struct driver_data *dd = pci_get_drvdata(pdev); struct driver_data *dd = dev_get_drvdata(dev);
set_bit(MTIP_DDF_RESUME_BIT, &dd->dd_flag); set_bit(MTIP_DDF_RESUME_BIT, &dd->dd_flag);
/* Disable ports & interrupts then send standby immediate */ /* Disable ports & interrupts then send standby immediate */
rv = mtip_block_suspend(dd); rv = mtip_block_suspend(dd);
if (rv < 0) { if (rv < 0)
dev_err(&pdev->dev, dev_err(dev, "Failed to suspend controller\n");
"Failed to suspend controller\n");
return rv;
}
/*
* Save the pci config space to pdev structure &
* disable the device
*/
pci_save_state(pdev);
pci_disable_device(pdev);
/* Move to Low power state*/
pci_set_power_state(pdev, PCI_D3hot);
return rv; return rv;
} }
@ -4179,25 +4166,10 @@ static int mtip_pci_suspend(struct pci_dev *pdev, pm_message_t mesg)
* 0 Success * 0 Success
* <0 Error * <0 Error
*/ */
static int mtip_pci_resume(struct pci_dev *pdev) static int __maybe_unused mtip_pci_resume(struct device *dev)
{ {
int rv = 0; int rv = 0;
struct driver_data *dd = pci_get_drvdata(pdev); struct driver_data *dd = dev_get_drvdata(dev);
/* Move the device to active State */
pci_set_power_state(pdev, PCI_D0);
/* Restore PCI configuration space */
pci_restore_state(pdev);
/* Enable the PCI device*/
rv = pcim_enable_device(pdev);
if (rv < 0) {
dev_err(&pdev->dev,
"Failed to enable card during resume\n");
goto err;
}
pci_set_master(pdev);
/* /*
* Calls hbaReset, initPort, & startPort function * Calls hbaReset, initPort, & startPort function
@ -4205,9 +4177,8 @@ static int mtip_pci_resume(struct pci_dev *pdev)
*/ */
rv = mtip_block_resume(dd); rv = mtip_block_resume(dd);
if (rv < 0) if (rv < 0)
dev_err(&pdev->dev, "Unable to resume\n"); dev_err(dev, "Unable to resume\n");
err:
clear_bit(MTIP_DDF_RESUME_BIT, &dd->dd_flag); clear_bit(MTIP_DDF_RESUME_BIT, &dd->dd_flag);
return rv; return rv;
@ -4238,14 +4209,15 @@ static const struct pci_device_id mtip_pci_tbl[] = {
{ 0 } { 0 }
}; };
static SIMPLE_DEV_PM_OPS(mtip_pci_pm_ops, mtip_pci_suspend, mtip_pci_resume);
/* Structure that describes the PCI driver functions. */ /* Structure that describes the PCI driver functions. */
static struct pci_driver mtip_pci_driver = { static struct pci_driver mtip_pci_driver = {
.name = MTIP_DRV_NAME, .name = MTIP_DRV_NAME,
.id_table = mtip_pci_tbl, .id_table = mtip_pci_tbl,
.probe = mtip_pci_probe, .probe = mtip_pci_probe,
.remove = mtip_pci_remove, .remove = mtip_pci_remove,
.suspend = mtip_pci_suspend, .driver.pm = &mtip_pci_pm_ops,
.resume = mtip_pci_resume,
.shutdown = mtip_pci_shutdown, .shutdown = mtip_pci_shutdown,
}; };