diff options
Diffstat (limited to 'drivers/usb/host/ohci-omap3.c')
| -rw-r--r-- | drivers/usb/host/ohci-omap3.c | 129 | 
1 files changed, 44 insertions, 85 deletions
diff --git a/drivers/usb/host/ohci-omap3.c b/drivers/usb/host/ohci-omap3.c index a09af26f69e..ec15aebe878 100644 --- a/drivers/usb/host/ohci-omap3.c +++ b/drivers/usb/host/ohci-omap3.c @@ -29,90 +29,22 @@   *	- add kernel-doc   */ +#include <linux/dma-mapping.h> +#include <linux/kernel.h> +#include <linux/module.h> +#include <linux/of.h> +#include <linux/usb/otg.h>  #include <linux/platform_device.h>  #include <linux/pm_runtime.h> -#include <linux/of.h> -#include <linux/dma-mapping.h> - -/*-------------------------------------------------------------------------*/ - -static int ohci_omap3_init(struct usb_hcd *hcd) -{ -	dev_dbg(hcd->self.controller, "starting OHCI controller\n"); - -	return ohci_init(hcd_to_ohci(hcd)); -} - -/*-------------------------------------------------------------------------*/ - -static int ohci_omap3_start(struct usb_hcd *hcd) -{ -	struct ohci_hcd *ohci = hcd_to_ohci(hcd); -	int ret; - -	/* -	 * RemoteWakeupConnected has to be set explicitly before -	 * calling ohci_run. The reset value of RWC is 0. -	 */ -	ohci->hc_control = OHCI_CTRL_RWC; -	writel(OHCI_CTRL_RWC, &ohci->regs->control); - -	ret = ohci_run(ohci); - -	if (ret < 0) { -		dev_err(hcd->self.controller, "can't start\n"); -		ohci_stop(hcd); -	} - -	return ret; -} - -/*-------------------------------------------------------------------------*/ - -static const struct hc_driver ohci_omap3_hc_driver = { -	.description =		hcd_name, -	.product_desc =		"OMAP3 OHCI Host Controller", -	.hcd_priv_size =	sizeof(struct ohci_hcd), - -	/* -	 * generic hardware linkage -	 */ -	.irq =			ohci_irq, -	.flags =		HCD_USB11 | HCD_MEMORY, - -	/* -	 * basic lifecycle operations -	 */ -	.reset =		ohci_omap3_init, -	.start =		ohci_omap3_start, -	.stop =			ohci_stop, -	.shutdown =		ohci_shutdown, - -	/* -	 * managing i/o requests and associated device resources -	 */ -	.urb_enqueue =		ohci_urb_enqueue, -	.urb_dequeue =		ohci_urb_dequeue, -	.endpoint_disable =	ohci_endpoint_disable, +#include <linux/usb.h> +#include <linux/usb/hcd.h> -	/* -	 * scheduling support -	 */ -	.get_frame_number =	ohci_get_frame, +#include "ohci.h" -	/* -	 * root hub support -	 */ -	.hub_status_data =	ohci_hub_status_data, -	.hub_control =		ohci_hub_control, -#ifdef	CONFIG_PM -	.bus_suspend =		ohci_bus_suspend, -	.bus_resume =		ohci_bus_resume, -#endif -	.start_port_reset =	ohci_start_port_reset, -}; +#define DRIVER_DESC "OHCI OMAP3 driver" -/*-------------------------------------------------------------------------*/ +static const char hcd_name[] = "ohci-omap3"; +static struct hc_driver __read_mostly ohci_omap3_hc_driver;  /*   * configure so an HC device and id are always provided @@ -129,10 +61,11 @@ static const struct hc_driver ohci_omap3_hc_driver = {  static int ohci_hcd_omap3_probe(struct platform_device *pdev)  {  	struct device		*dev = &pdev->dev; +	struct ohci_hcd		*ohci;  	struct usb_hcd		*hcd = NULL;  	void __iomem		*regs = NULL;  	struct resource		*res; -	int			ret = -ENODEV; +	int			ret;  	int			irq;  	if (usb_disabled()) @@ -166,11 +99,11 @@ static int ohci_hcd_omap3_probe(struct platform_device *pdev)  	 * Since shared usb code relies on it, set it here for now.  	 * Once we have dma capability bindings this can go away.  	 */ -	if (!dev->dma_mask) -		dev->dma_mask = &dev->coherent_dma_mask; -	if (!dev->coherent_dma_mask) -		dev->coherent_dma_mask = DMA_BIT_MASK(32); +	ret = dma_coerce_mask_and_coherent(dev, DMA_BIT_MASK(32)); +	if (ret) +		goto err_io; +	ret = -ENODEV;  	hcd = usb_create_hcd(&ohci_omap3_hc_driver, dev,  			dev_name(dev));  	if (!hcd) { @@ -185,13 +118,19 @@ static int ohci_hcd_omap3_probe(struct platform_device *pdev)  	pm_runtime_enable(dev);  	pm_runtime_get_sync(dev); -	ohci_hcd_init(hcd_to_ohci(hcd)); +	ohci = hcd_to_ohci(hcd); +	/* +	 * RemoteWakeupConnected has to be set explicitly before +	 * calling ohci_run. The reset value of RWC is 0. +	 */ +	ohci->hc_control = OHCI_CTRL_RWC;  	ret = usb_add_hcd(hcd, irq, 0);  	if (ret) {  		dev_dbg(dev, "failed to add hcd with err %d\n", ret);  		goto err_add_hcd;  	} +	device_wakeup_enable(hcd->self.controller);  	return 0; @@ -248,5 +187,25 @@ static struct platform_driver ohci_hcd_omap3_driver = {  	},  }; +static int __init ohci_omap3_init(void) +{ +	if (usb_disabled()) +		return -ENODEV; + +	pr_info("%s: " DRIVER_DESC "\n", hcd_name); + +	ohci_init_driver(&ohci_omap3_hc_driver, NULL); +	return platform_driver_register(&ohci_hcd_omap3_driver); +} +module_init(ohci_omap3_init); + +static void __exit ohci_omap3_cleanup(void) +{ +	platform_driver_unregister(&ohci_hcd_omap3_driver); +} +module_exit(ohci_omap3_cleanup); + +MODULE_DESCRIPTION(DRIVER_DESC);  MODULE_ALIAS("platform:ohci-omap3");  MODULE_AUTHOR("Anand Gadiyar <gadiyar@ti.com>"); +MODULE_LICENSE("GPL");  | 
