diff options
Diffstat (limited to 'drivers/usb/host/ehci-pci.c')
| -rw-r--r-- | drivers/usb/host/ehci-pci.c | 132 | 
1 files changed, 49 insertions, 83 deletions
diff --git a/drivers/usb/host/ehci-pci.c b/drivers/usb/host/ehci-pci.c index 2cb7d370c4e..dabb2049482 100644 --- a/drivers/usb/host/ehci-pci.c +++ b/drivers/usb/host/ehci-pci.c @@ -18,9 +18,18 @@   * Inc., 675 Mass Ave, Cambridge, MA 02139, USA.   */ -#ifndef CONFIG_PCI -#error "This file is PCI bus glue.  CONFIG_PCI must be defined." -#endif +#include <linux/kernel.h> +#include <linux/module.h> +#include <linux/pci.h> +#include <linux/usb.h> +#include <linux/usb/hcd.h> + +#include "ehci.h" +#include "pci-quirks.h" + +#define DRIVER_DESC "EHCI PCI platform driver" + +static const char hcd_name[] = "ehci-pci";  /* defined here to avoid adding to pci_ids.h for single instance use */  #define PCI_DEVICE_ID_INTEL_CE4100_USB	0x2e70 @@ -103,7 +112,6 @@ static int ehci_pci_setup(struct usb_hcd *hcd)  		}  		break;  	case PCI_VENDOR_ID_INTEL: -		ehci->fs_i_thresh = 1;  		if (pdev->device == PCI_DEVICE_ID_INTEL_CE4100_USB)  			hcd->has_tt = 1;  		break; @@ -203,11 +211,6 @@ static int ehci_pci_setup(struct usb_hcd *hcd)  		break;  	case PCI_VENDOR_ID_INTEL:  		ehci->need_io_watchdog = 0; -		if (pdev->device == 0x0806 || pdev->device == 0x0811 -				|| pdev->device == 0x0829) { -			ehci_info(ehci, "disable lpm for langwell/penwell\n"); -			ehci->has_lpm = 0; -		}  		break;  	case PCI_VENDOR_ID_NVIDIA:  		switch (pdev->device) { @@ -217,8 +220,7 @@ static int ehci_pci_setup(struct usb_hcd *hcd)  		 * devices with PPCD enabled.  		 */  		case 0x0d9d: -			ehci_info(ehci, "disable lpm/ppcd for nvidia mcp89"); -			ehci->has_lpm = 0; +			ehci_info(ehci, "disable ppcd for nvidia mcp89\n");  			ehci->has_ppcd = 0;  			ehci->command &= ~CMD_PPCEE;  			break; @@ -304,7 +306,6 @@ static int ehci_pci_setup(struct usb_hcd *hcd)  		ehci_warn(ehci, "selective suspend/wakeup unavailable\n");  #endif -	ehci_port_power(ehci, 1);  	retval = ehci_pci_reinit(ehci, pdev);  done:  	return retval; @@ -323,18 +324,14 @@ done:   * Also they depend on separate root hub suspend/resume.   */ -static int ehci_pci_suspend(struct usb_hcd *hcd, bool do_wakeup) -{ -	return ehci_suspend(hcd, do_wakeup); -} -  static bool usb_is_intel_switchable_ehci(struct pci_dev *pdev)  {  	return pdev->class == PCI_CLASS_SERIAL_USB_EHCI &&  		pdev->vendor == PCI_VENDOR_ID_INTEL &&  		(pdev->device == 0x1E26 ||  		 pdev->device == 0x8C2D || -		 pdev->device == 0x8C26); +		 pdev->device == 0x8C26 || +		 pdev->device == 0x9C26);  }  static void ehci_enable_xhci_companion(void) @@ -378,76 +375,17 @@ static int ehci_pci_resume(struct usb_hcd *hcd, bool hibernated)  		(void) ehci_pci_reinit(ehci, pdev);  	return 0;  } -#endif -static int ehci_update_device(struct usb_hcd *hcd, struct usb_device *udev) -{ -	struct ehci_hcd *ehci = hcd_to_ehci(hcd); -	int rc = 0; - -	if (!udev->parent) /* udev is root hub itself, impossible */ -		rc = -1; -	/* we only support lpm device connected to root hub yet */ -	if (ehci->has_lpm && !udev->parent->parent) { -		rc = ehci_lpm_set_da(ehci, udev->devnum, udev->portnum); -		if (!rc) -			rc = ehci_lpm_check(ehci, udev->portnum); -	} -	return rc; -} +#else -static const struct hc_driver ehci_pci_hc_driver = { -	.description =		hcd_name, -	.product_desc =		"EHCI Host Controller", -	.hcd_priv_size =	sizeof(struct ehci_hcd), +#define ehci_suspend		NULL +#define ehci_pci_resume		NULL +#endif	/* CONFIG_PM */ -	/* -	 * generic hardware linkage -	 */ -	.irq =			ehci_irq, -	.flags =		HCD_MEMORY | HCD_USB2, +static struct hc_driver __read_mostly ehci_pci_hc_driver; -	/* -	 * basic lifecycle operations -	 */ +static const struct ehci_driver_overrides pci_overrides __initdata = {  	.reset =		ehci_pci_setup, -	.start =		ehci_run, -#ifdef	CONFIG_PM -	.pci_suspend =		ehci_pci_suspend, -	.pci_resume =		ehci_pci_resume, -#endif -	.stop =			ehci_stop, -	.shutdown =		ehci_shutdown, - -	/* -	 * managing i/o requests and associated device resources -	 */ -	.urb_enqueue =		ehci_urb_enqueue, -	.urb_dequeue =		ehci_urb_dequeue, -	.endpoint_disable =	ehci_endpoint_disable, -	.endpoint_reset =	ehci_endpoint_reset, - -	/* -	 * scheduling support -	 */ -	.get_frame_number =	ehci_get_frame, - -	/* -	 * root hub support -	 */ -	.hub_status_data =	ehci_hub_status_data, -	.hub_control =		ehci_hub_control, -	.bus_suspend =		ehci_bus_suspend, -	.bus_resume =		ehci_bus_resume, -	.relinquish_port =	ehci_relinquish_port, -	.port_handed_over =	ehci_port_handed_over, - -	/* -	 * call back when device connected and addressed -	 */ -	.update_device =	ehci_update_device, - -	.clear_tt_buffer_complete	= ehci_clear_tt_buffer_complete,  };  /*-------------------------------------------------------------------------*/ @@ -480,3 +418,31 @@ static struct pci_driver ehci_pci_driver = {  	},  #endif  }; + +static int __init ehci_pci_init(void) +{ +	if (usb_disabled()) +		return -ENODEV; + +	pr_info("%s: " DRIVER_DESC "\n", hcd_name); + +	ehci_init_driver(&ehci_pci_hc_driver, &pci_overrides); + +	/* Entries for the PCI suspend/resume callbacks are special */ +	ehci_pci_hc_driver.pci_suspend = ehci_suspend; +	ehci_pci_hc_driver.pci_resume = ehci_pci_resume; + +	return pci_register_driver(&ehci_pci_driver); +} +module_init(ehci_pci_init); + +static void __exit ehci_pci_cleanup(void) +{ +	pci_unregister_driver(&ehci_pci_driver); +} +module_exit(ehci_pci_cleanup); + +MODULE_DESCRIPTION(DRIVER_DESC); +MODULE_AUTHOR("David Brownell"); +MODULE_AUTHOR("Alan Stern"); +MODULE_LICENSE("GPL");  | 
