Commit 0aeddbd0 authored by Vaibhav Gupta's avatar Vaibhav Gupta Committed by Bjorn Helgaas
Browse files

via-agp: convert to generic power management

Convert via-agp from legacy PCI power management to the generic power
management framework.

Previously, via-agp used legacy PCI power management, and agp_via_suspend()
and agp_via_resume() were responsible for both device-specific things and
generic PCI things:

  agp_via_suspend
    pci_save_state(pdev)                <-- generic PCI
    pci_set_power_state(pdev, pci_choose_state(pdev, state)) <-- generic PCI

  agp_via_resume
    pci_set_power_state(pdev, PCI_D0)   <-- generic PCI
    pci_restore_state(pdev)             <-- generic PCI
    via_configure_agp3()                <-- device-specific
    via_configure()                     <-- 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
        agp_via_suspend                 <-- not needed at all; removed
    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
        agp_via_resume                  # dev->driver->pm->resume
          via_configure_agp3()          <-- device-specific
          via_configure()               <-- device-specific

[bhelgaas: commit log]
Link: https://lore.kernel.org/r/20211208193305.147072-4-helgaas@kernel.org


Signed-off-by: default avatarVaibhav Gupta <vaibhavgupta40@gmail.com>
Signed-off-by: default avatarBjorn Helgaas <bhelgaas@google.com>
Acked-by: default avatarDave Airlie <airlied@redhat.com>
parent 6d1adc3d
Loading
Loading
Loading
Loading
+5 −20
Original line number Original line Diff line number Diff line
@@ -492,22 +492,11 @@ static void agp_via_remove(struct pci_dev *pdev)
	agp_put_bridge(bridge);
	agp_put_bridge(bridge);
}
}


#ifdef CONFIG_PM
#define agp_via_suspend NULL


static int agp_via_suspend(struct pci_dev *pdev, pm_message_t state)
static int __maybe_unused agp_via_resume(struct device *dev)
{
{
	pci_save_state (pdev);
	struct agp_bridge_data *bridge = dev_get_drvdata(dev);
	pci_set_power_state (pdev, PCI_D3hot);

	return 0;
}

static int agp_via_resume(struct pci_dev *pdev)
{
	struct agp_bridge_data *bridge = pci_get_drvdata(pdev);

	pci_set_power_state (pdev, PCI_D0);
	pci_restore_state(pdev);


	if (bridge->driver == &via_agp3_driver)
	if (bridge->driver == &via_agp3_driver)
		return via_configure_agp3();
		return via_configure_agp3();
@@ -517,8 +506,6 @@ static int agp_via_resume(struct pci_dev *pdev)
	return 0;
	return 0;
}
}


#endif /* CONFIG_PM */

/* must be the same order as name table above */
/* must be the same order as name table above */
static const struct pci_device_id agp_via_pci_table[] = {
static const struct pci_device_id agp_via_pci_table[] = {
#define ID(x) \
#define ID(x) \
@@ -567,16 +554,14 @@ static const struct pci_device_id agp_via_pci_table[] = {


MODULE_DEVICE_TABLE(pci, agp_via_pci_table);
MODULE_DEVICE_TABLE(pci, agp_via_pci_table);


static SIMPLE_DEV_PM_OPS(agp_via_pm_ops, agp_via_suspend, agp_via_resume);


static struct pci_driver agp_via_pci_driver = {
static struct pci_driver agp_via_pci_driver = {
	.name		= "agpgart-via",
	.name		= "agpgart-via",
	.id_table	= agp_via_pci_table,
	.id_table	= agp_via_pci_table,
	.probe		= agp_via_probe,
	.probe		= agp_via_probe,
	.remove		= agp_via_remove,
	.remove		= agp_via_remove,
#ifdef CONFIG_PM
	.driver.pm      = &agp_via_pm_ops,
	.suspend	= agp_via_suspend,
	.resume		= agp_via_resume,
#endif
};
};