aboutsummaryrefslogtreecommitdiff
path: root/drivers/usb/host/uhci-hcd.c
diff options
context:
space:
mode:
authorAlan Stern <stern@rowland.harvard.edu>2005-04-28 14:51:27 -0400
committerGreg Kroah-Hartman <gregkh@suse.de>2005-06-27 14:43:45 -0700
commit02597d2deec2a3de0e2b52c1f83904b65626a0d5 (patch)
treec8953478e54c84b2931c1faf70b3a60a2196216e /drivers/usb/host/uhci-hcd.c
parentc074b416b94c0aa4a371f24bf6cc13d8cf1fab59 (diff)
[PATCH] USB UHCI: Add shutdown method
After all the discussion you might not be interested in this still, but nevertheless here it is. This patch adds a shutdown method to the uhci-hcd driver. Its prerequisite is the patch you wrote adding shutdown support for PCI. Signed-off-by: Alan Stern <stern@rowland.harvard.edu> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/usb/host/uhci-hcd.c')
-rw-r--r--drivers/usb/host/uhci-hcd.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/drivers/usb/host/uhci-hcd.c b/drivers/usb/host/uhci-hcd.c
index cec070fa8c8..53ba8a56592 100644
--- a/drivers/usb/host/uhci-hcd.c
+++ b/drivers/usb/host/uhci-hcd.c
@@ -154,6 +154,7 @@ static void reset_hc(struct uhci_hcd *uhci)
/*
* Last rites for a defunct/nonfunctional controller
+ * or one we don't want to use any more.
*/
static void hc_died(struct uhci_hcd *uhci)
{
@@ -525,6 +526,20 @@ static int uhci_reset(struct usb_hcd *hcd)
return 0;
}
+/* Make sure the controller is quiescent and that we're not using it
+ * any more. This is mainly for the benefit of programs which, like kexec,
+ * expect the hardware to be idle: not doing DMA or generating IRQs.
+ *
+ * This routine may be called in a damaged or failing kernel. Hence we
+ * do not acquire the spinlock before shutting down the controller.
+ */
+static void uhci_shutdown(struct pci_dev *pdev)
+{
+ struct usb_hcd *hcd = (struct usb_hcd *) pci_get_drvdata(pdev);
+
+ hc_died(hcd_to_uhci(hcd));
+}
+
/*
* Allocate a frame list, and then setup the skeleton
*
@@ -939,6 +954,7 @@ static struct pci_driver uhci_pci_driver = {
.probe = usb_hcd_pci_probe,
.remove = usb_hcd_pci_remove,
+ .shutdown = uhci_shutdown,
#ifdef CONFIG_PM
.suspend = usb_hcd_pci_suspend,