diff options
Diffstat (limited to 'drivers/usb/host/ehci-xilinx-of.c')
| -rw-r--r-- | drivers/usb/host/ehci-xilinx-of.c | 98 | 
1 files changed, 20 insertions, 78 deletions
diff --git a/drivers/usb/host/ehci-xilinx-of.c b/drivers/usb/host/ehci-xilinx-of.c index 6c8076ad821..fe57710753e 100644 --- a/drivers/usb/host/ehci-xilinx-of.c +++ b/drivers/usb/host/ehci-xilinx-of.c @@ -25,34 +25,12 @@   *   */ +#include <linux/err.h>  #include <linux/signal.h>  #include <linux/of.h>  #include <linux/of_platform.h> - -/** - * ehci_xilinx_of_setup - Initialize the device for ehci_reset() - * @hcd:	Pointer to the usb_hcd device to which the host controller bound - * - * called during probe() after chip reset completes. - */ -static int ehci_xilinx_of_setup(struct usb_hcd *hcd) -{ -	struct ehci_hcd	*ehci = hcd_to_ehci(hcd); -	int		retval; - -	retval = ehci_halt(ehci); -	if (retval) -		return retval; - -	retval = ehci_init(hcd); -	if (retval) -		return retval; - -	ehci->sbrn = 0x20; - -	return ehci_reset(ehci); -} +#include <linux/of_address.h>  /**   * ehci_xilinx_port_handed_over - hand the port out if failed to enable it @@ -101,12 +79,12 @@ static const struct hc_driver ehci_xilinx_of_hc_driver = {  	 * generic hardware linkage  	 */  	.irq			= ehci_irq, -	.flags			= HCD_MEMORY | HCD_USB2, +	.flags			= HCD_MEMORY | HCD_USB2 | HCD_BH,  	/*  	 * basic lifecycle operations  	 */ -	.reset			= ehci_xilinx_of_setup, +	.reset			= ehci_setup,  	.start			= ehci_run,  	.stop			= ehci_stop,  	.shutdown		= ehci_shutdown, @@ -117,6 +95,7 @@ static const struct hc_driver ehci_xilinx_of_hc_driver = {  	.urb_enqueue		= ehci_urb_enqueue,  	.urb_dequeue		= ehci_urb_dequeue,  	.endpoint_disable	= ehci_endpoint_disable, +	.endpoint_reset		= ehci_endpoint_reset,  	/*  	 * scheduling support @@ -141,15 +120,13 @@ static const struct hc_driver ehci_xilinx_of_hc_driver = {  /**   * ehci_hcd_xilinx_of_probe - Probe method for the USB host controller   * @op:		pointer to the platform_device bound to the host controller - * @match:	pointer to of_device_id structure, not used   *   * This function requests resources and sets up appropriate properties for the   * host controller. Because the Xilinx USB host controller can be configured   * as HS only or HS/FS only, it checks the configuration in the device tree   * entry, and sets an appropriate value for hcd->has_tt.   */ -static int __devinit -ehci_hcd_xilinx_of_probe(struct platform_device *op, const struct of_device_id *match) +static int ehci_hcd_xilinx_of_probe(struct platform_device *op)  {  	struct device_node *dn = op->dev.of_node;  	struct usb_hcd *hcd; @@ -174,26 +151,20 @@ ehci_hcd_xilinx_of_probe(struct platform_device *op, const struct of_device_id *  		return -ENOMEM;  	hcd->rsrc_start = res.start; -	hcd->rsrc_len = res.end - res.start + 1; - -	if (!request_mem_region(hcd->rsrc_start, hcd->rsrc_len, hcd_name)) { -		printk(KERN_ERR "%s: request_mem_region failed\n", __FILE__); -		rv = -EBUSY; -		goto err_rmr; -	} +	hcd->rsrc_len = resource_size(&res);  	irq = irq_of_parse_and_map(dn, 0); -	if (irq == NO_IRQ) { -		printk(KERN_ERR "%s: irq_of_parse_and_map failed\n", __FILE__); +	if (!irq) { +		dev_err(&op->dev, "%s: irq_of_parse_and_map failed\n", +			__FILE__);  		rv = -EBUSY;  		goto err_irq;  	} -	hcd->regs = ioremap(hcd->rsrc_start, hcd->rsrc_len); -	if (!hcd->regs) { -		printk(KERN_ERR "%s: ioremap failed\n", __FILE__); -		rv = -ENOMEM; -		goto err_ioremap; +	hcd->regs = devm_ioremap_resource(&op->dev, &res); +	if (IS_ERR(hcd->regs)) { +		rv = PTR_ERR(hcd->regs); +		goto err_irq;  	}  	ehci = hcd_to_ehci(hcd); @@ -219,22 +190,14 @@ ehci_hcd_xilinx_of_probe(struct platform_device *op, const struct of_device_id *  	/* Debug registers are at the first 0x100 region  	 */  	ehci->caps = hcd->regs + 0x100; -	ehci->regs = hcd->regs + 0x100 + -			HC_LENGTH(ehci_readl(ehci, &ehci->caps->hc_capbase)); - -	/* cache this readonly data; minimize chip reads */ -	ehci->hcs_params = ehci_readl(ehci, &ehci->caps->hcs_params);  	rv = usb_add_hcd(hcd, irq, 0); -	if (rv == 0) +	if (rv == 0) { +		device_wakeup_enable(hcd->self.controller);  		return 0; +	} -	iounmap(hcd->regs); - -err_ioremap:  err_irq: -	release_mem_region(hcd->rsrc_start, hcd->rsrc_len); -err_rmr:  	usb_put_hcd(hcd);  	return rv; @@ -249,48 +212,27 @@ err_rmr:   */  static int ehci_hcd_xilinx_of_remove(struct platform_device *op)  { -	struct usb_hcd *hcd = dev_get_drvdata(&op->dev); -	dev_set_drvdata(&op->dev, NULL); +	struct usb_hcd *hcd = platform_get_drvdata(op);  	dev_dbg(&op->dev, "stopping XILINX-OF USB Controller\n");  	usb_remove_hcd(hcd); -	iounmap(hcd->regs); -	release_mem_region(hcd->rsrc_start, hcd->rsrc_len); -  	usb_put_hcd(hcd);  	return 0;  } -/** - * ehci_hcd_xilinx_of_shutdown - shutdown the hcd - * @op:		pointer to platform_device structure that is to be removed - * - * Properly shutdown the hcd, call driver's shutdown routine. - */ -static int ehci_hcd_xilinx_of_shutdown(struct platform_device *op) -{ -	struct usb_hcd *hcd = dev_get_drvdata(&op->dev); - -	if (hcd->driver->shutdown) -		hcd->driver->shutdown(hcd); - -	return 0; -} - -  static const struct of_device_id ehci_hcd_xilinx_of_match[] = {  		{.compatible = "xlnx,xps-usb-host-1.00.a",},  	{},  };  MODULE_DEVICE_TABLE(of, ehci_hcd_xilinx_of_match); -static struct of_platform_driver ehci_hcd_xilinx_of_driver = { +static struct platform_driver ehci_hcd_xilinx_of_driver = {  	.probe		= ehci_hcd_xilinx_of_probe,  	.remove		= ehci_hcd_xilinx_of_remove, -	.shutdown	= ehci_hcd_xilinx_of_shutdown, +	.shutdown	= usb_hcd_platform_shutdown,  	.driver = {  		.name = "xilinx-of-ehci",  		.owner = THIS_MODULE,  | 
