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
 };
 
 
_