/**
  * pm8001_pci_suspend - power management suspend main entry point
- * @pdev: PCI device struct
- * @state: PM state change to (usually PCI_D3)
+ * @dev: Device struct
  *
  * Returns 0 success, anything else error.
  */
-static int pm8001_pci_suspend(struct pci_dev *pdev, pm_message_t state)
+static int __maybe_unused pm8001_pci_suspend(struct device *dev)
 {
+       struct pci_dev *pdev = to_pci_dev(dev);
        struct sas_ha_struct *sha = pci_get_drvdata(pdev);
-       struct pm8001_hba_info *pm8001_ha;
+       struct pm8001_hba_info *pm8001_ha = sha->lldd_ha;
        int  i, j;
-       u32 device_state;
-       pm8001_ha = sha->lldd_ha;
        sas_suspend_ha(sha);
        flush_workqueue(pm8001_wq);
        scsi_block_requests(pm8001_ha->shost);
        if (!pdev->pm_cap) {
-               dev_err(&pdev->dev, " PCI PM not supported\n");
+               dev_err(dev, " PCI PM not supported\n");
                return -ENODEV;
        }
        PM8001_CHIP_DISP->interrupt_disable(pm8001_ha, 0xFF);
                for (j = 0; j < PM8001_MAX_MSIX_VEC; j++)
                        tasklet_kill(&pm8001_ha->tasklet[j]);
 #endif
-       device_state = pci_choose_state(pdev, state);
-       pm8001_printk(pm8001_ha, "pdev=0x%p, slot=%s, entering operating state [D%d]\n",
-                     pdev, pm8001_ha->name, device_state);
-       pci_save_state(pdev);
-       pci_disable_device(pdev);
-       pci_set_power_state(pdev, device_state);
+       pm8001_printk(pm8001_ha, "pdev=0x%p, slot=%s, entering "
+                     "suspended state\n", pdev,
+                     pm8001_ha->name);
        return 0;
 }
 
 /**
  * pm8001_pci_resume - power management resume main entry point
- * @pdev: PCI device struct
+ * @dev: Device struct
  *
  * Returns 0 success, anything else error.
  */
-static int pm8001_pci_resume(struct pci_dev *pdev)
+static int __maybe_unused pm8001_pci_resume(struct device *dev)
 {
+       struct pci_dev *pdev = to_pci_dev(dev);
        struct sas_ha_struct *sha = pci_get_drvdata(pdev);
        struct pm8001_hba_info *pm8001_ha;
        int rc;
        pm8001_printk(pm8001_ha, "pdev=0x%p, slot=%s, resuming from previous operating state [D%d]\n",
                      pdev, pm8001_ha->name, device_state);
 
-       pci_set_power_state(pdev, PCI_D0);
-       pci_restore_state(pdev);
-       rc = pci_enable_device(pdev);
-       if (rc) {
-               pm8001_printk(pm8001_ha, "slot=%s Enable device failed during resume\n",
-                             pm8001_ha->name);
-               goto err_out_enable;
-       }
-
-       pci_set_master(pdev);
        rc = pci_go_44(pdev);
        if (rc)
                goto err_out_disable;
 
 err_out_disable:
        scsi_remove_host(pm8001_ha->shost);
-       pci_disable_device(pdev);
-err_out_enable:
+
        return rc;
 }
 
        {} /* terminate list */
 };
 
+static SIMPLE_DEV_PM_OPS(pm8001_pci_pm_ops,
+                        pm8001_pci_suspend,
+                        pm8001_pci_resume);
+
 static struct pci_driver pm8001_pci_driver = {
        .name           = DRV_NAME,
        .id_table       = pm8001_pci_table,
        .probe          = pm8001_pci_probe,
        .remove         = pm8001_pci_remove,
-       .suspend        = pm8001_pci_suspend,
-       .resume         = pm8001_pci_resume,
+       .driver.pm      = &pm8001_pci_pm_ops,
 };
 
 /**