--- drivers/usb/host/ohci-s3c2410.c.orig	2007-02-08 11:51:45.000000000 -0800
+++ drivers/usb/host/ohci-s3c2410.c	2007-02-12 12:27:11.000000000 -0800
@@ -24,6 +24,7 @@
 
 #include <asm/hardware.h>
 #include <asm/arch/usb-control.h>
+#include <asm/arch/regs-gpio.h>
 
 #define valid_port(idx) ((idx) == 1 || (idx) == 2)
 
@@ -49,6 +50,13 @@ static void s3c2410_start_hc(struct plat
 
 	dev_dbg(&dev->dev, "s3c2410_start_hc:\n");
 
+	/* Put the USB port(s) in normal mode. */
+	if (info->port[0].flags & S3C_HCDFLG_USED)
+		s3c2410_modify_misccr(S3C2410_MISCCR_USBSUSPND0, 0);
+
+	if (info->port[1].flags & S3C_HCDFLG_USED)
+		s3c2410_modify_misccr(S3C2410_MISCCR_USBSUSPND1, 0);
+
 	clk_enable(usb_clk);
 	mdelay(2);			/* let the bus clock stabilise */
 
@@ -70,6 +78,15 @@ static void s3c2410_stop_hc(struct platf
 
 	dev_dbg(&dev->dev, "s3c2410_stop_hc:\n");
 
+	/* Put the USB port(s) in suspend mode. */
+	if (info->port[0].flags & S3C_HCDFLG_USED)
+		s3c2410_modify_misccr(S3C2410_MISCCR_USBSUSPND0,
+				      S3C2410_MISCCR_USBSUSPND0);
+
+	if (info->port[1].flags & S3C_HCDFLG_USED)
+		s3c2410_modify_misccr(S3C2410_MISCCR_USBSUSPND1,
+				      S3C2410_MISCCR_USBSUSPND1);
+
 	if (info != NULL) {
 		info->report_oc = NULL;
 		info->hcd	= NULL;
@@ -489,12 +506,50 @@ static int ohci_hcd_s3c2410_drv_remove(s
 	return 0;
 }
 
+#ifdef CONFIG_PM
+
+static int ohci_hcd_s3c2410_drv_suspend(struct platform_device *pdev,
+					pm_message_t state)
+{
+	struct usb_hcd *hcd = platform_get_drvdata(pdev);
+	struct ohci_hcd *ohci = hcd_to_ohci(hcd);
+
+	if (time_before(jiffies, ohci->next_statechange))
+		msleep(5);
+	ohci->next_statechange = jiffies;
+
+	s3c2410_stop_hc(pdev);
+
+	hcd->state = HC_STATE_SUSPENDED;
+	pdev->dev.power.power_state = PMSG_SUSPEND;
+
+	return 0;
+}
+
+static int ohci_hcd_s3c2410_drv_resume(struct platform_device *pdev)
+{
+	struct usb_hcd *hcd = platform_get_drvdata(pdev);
+	struct ohci_hcd *ohci = hcd_to_ohci(hcd);
+
+	if (time_before(jiffies, ohci->next_statechange))
+		msleep(5);
+	ohci->next_statechange = jiffies;
+
+	s3c2410_start_hc(pdev, hcd);
+
+	pdev->dev.power.power_state = PMSG_ON;
+
+	return 0;
+}
+
+#endif
+
 static struct platform_driver ohci_hcd_s3c2410_driver = {
 	.probe		= ohci_hcd_s3c2410_drv_probe,
 	.remove		= ohci_hcd_s3c2410_drv_remove,
 	.shutdown	= usb_hcd_platform_shutdown,
-	/*.suspend	= ohci_hcd_s3c2410_drv_suspend, */
-	/*.resume	= ohci_hcd_s3c2410_drv_resume, */
+	.suspend	= ohci_hcd_s3c2410_drv_suspend,
+	.resume		= ohci_hcd_s3c2410_drv_resume,
 	.driver		= {
 		.owner	= THIS_MODULE,
 		.name	= "s3c2410-ohci",
