From: Arkadiusz Miskiewicz <arekm@pld-linux.org> With this patch I'm able to suspend to disk (well, works even without patch) and resume (without it my laptop hangs (even sysrq is not working) while resuming). Signed-off-by: Arkadiusz Miskiewicz <arekm@pld-linux.org> Signed-off-by: Andrew Morton <akpm@osdl.org> --- 25-akpm/drivers/char/agp/via-agp.c | 31 +++++++++++++++++++++++++++++++ 1 files changed, 31 insertions(+) diff -puN drivers/char/agp/via-agp.c~via-agpc-resume-suspend-support drivers/char/agp/via-agp.c --- 25/drivers/char/agp/via-agp.c~via-agpc-resume-suspend-support 2004-08-04 21:01:53.306912184 -0700 +++ 25-akpm/drivers/char/agp/via-agp.c 2004-08-04 21:01:53.310911576 -0700 @@ -438,6 +438,33 @@ static void __devexit agp_via_remove(str agp_put_bridge(bridge); } +#ifdef CONFIG_PM + +static int agp_via_suspend(struct pci_dev *pdev, u32 state) +{ + pci_save_state (pdev, pdev->saved_config_space); + pci_set_power_state (pdev, 3); + + 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, 0); + pci_restore_state(pdev, pdev->saved_config_space); + + if (bridge->driver == &via_agp3_driver) + return via_configure_agp3(); + else if (bridge->driver == &via_driver) + return via_configure(); + + return 0; +} + +#endif /* CONFIG_PM */ + /* must be the same order as name table above */ static struct pci_device_id agp_via_pci_table[] = { #define ID(x) \ @@ -487,6 +514,10 @@ static struct pci_driver agp_via_pci_dri .id_table = agp_via_pci_table, .probe = agp_via_probe, .remove = agp_via_remove, +#ifdef CONFIG_PM + .suspend = agp_via_suspend, + .resume = agp_via_resume, +#endif }; _