diff options
Diffstat (limited to 'drivers/usb/host/ehci-ppc-of.c')
| -rw-r--r-- | drivers/usb/host/ehci-ppc-of.c | 91 | 
1 files changed, 22 insertions, 69 deletions
diff --git a/drivers/usb/host/ehci-ppc-of.c b/drivers/usb/host/ehci-ppc-of.c index ba52be47302..547924796d2 100644 --- a/drivers/usb/host/ehci-ppc-of.c +++ b/drivers/usb/host/ehci-ppc-of.c @@ -12,29 +12,14 @@   * This file is licenced under the GPL.   */ +#include <linux/err.h>  #include <linux/signal.h>  #include <linux/of.h> +#include <linux/of_address.h> +#include <linux/of_irq.h>  #include <linux/of_platform.h> -/* called during probe() after chip reset completes */ -static int ehci_ppc_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); -} -  static const struct hc_driver ehci_ppc_of_hc_driver = {  	.description		= hcd_name, @@ -45,12 +30,12 @@ static const struct hc_driver ehci_ppc_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_ppc_of_setup, +	.reset			= ehci_setup,  	.start			= ehci_run,  	.stop			= ehci_stop,  	.shutdown		= ehci_shutdown, @@ -89,7 +74,7 @@ static const struct hc_driver ehci_ppc_of_hc_driver = {   * Fix: Enable Break Memory Transfer (BMT) in INSNREG3   */  #define PPC440EPX_EHCI0_INSREG_BMT	(0x1 << 0) -static int __devinit +static int  ppc44x_enable_bmt(struct device_node *dn)  {  	__iomem u32 *insreg_virt; @@ -105,8 +90,7 @@ ppc44x_enable_bmt(struct device_node *dn)  } -static int __devinit -ehci_hcd_ppc_of_probe(struct platform_device *op, const struct of_device_id *match) +static int ehci_hcd_ppc_of_probe(struct platform_device *op)  {  	struct device_node *dn = op->dev.of_node;  	struct usb_hcd *hcd; @@ -131,25 +115,19 @@ ehci_hcd_ppc_of_probe(struct platform_device *op, const struct of_device_id *mat  		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__); +		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; +	hcd->regs = devm_ioremap_resource(&op->dev, &res); +	if (IS_ERR(hcd->regs)) { +		rv = PTR_ERR(hcd->regs);  		goto err_ioremap;  	} @@ -158,8 +136,10 @@ ehci_hcd_ppc_of_probe(struct platform_device *op, const struct of_device_id *mat  	if (np != NULL) {  		/* claim we really affected by usb23 erratum */  		if (!of_address_to_resource(np, 0, &res)) -			ehci->ohci_hcctrl_reg = ioremap(res.start + -					OHCI_HCCTRL_OFFSET, OHCI_HCCTRL_LEN); +			ehci->ohci_hcctrl_reg = +				devm_ioremap(&op->dev, +					     res.start + OHCI_HCCTRL_OFFSET, +					     OHCI_HCCTRL_LEN);  		else  			pr_debug("%s: no ohci offset in fdt\n", __FILE__);  		if (!ehci->ohci_hcctrl_reg) { @@ -179,11 +159,6 @@ ehci_hcd_ppc_of_probe(struct platform_device *op, const struct of_device_id *mat  		ehci->big_endian_desc = 1;  	ehci->caps = hcd->regs; -	ehci->regs = hcd->regs + -			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);  	if (of_device_is_compatible(dn, "ibm,usb-ehci-440epx")) {  		rv = ppc44x_enable_bmt(dn); @@ -193,19 +168,14 @@ ehci_hcd_ppc_of_probe(struct platform_device *op, const struct of_device_id *mat  	rv = usb_add_hcd(hcd, irq, 0);  	if (rv) -		goto err_ehci; +		goto err_ioremap; +	device_wakeup_enable(hcd->self.controller);  	return 0; -err_ehci: -	if (ehci->has_amcc_usb23) -		iounmap(ehci->ohci_hcctrl_reg); -	iounmap(hcd->regs);  err_ioremap:  	irq_dispose_mapping(irq);  err_irq: -	release_mem_region(hcd->rsrc_start, hcd->rsrc_len); -err_rmr:  	usb_put_hcd(hcd);  	return rv; @@ -214,21 +184,17 @@ err_rmr:  static int ehci_hcd_ppc_of_remove(struct platform_device *op)  { -	struct usb_hcd *hcd = dev_get_drvdata(&op->dev); +	struct usb_hcd *hcd = platform_get_drvdata(op);  	struct ehci_hcd *ehci = hcd_to_ehci(hcd);  	struct device_node *np;  	struct resource res; -	dev_set_drvdata(&op->dev, NULL); -  	dev_dbg(&op->dev, "stopping PPC-OF USB Controller\n");  	usb_remove_hcd(hcd); -	iounmap(hcd->regs);  	irq_dispose_mapping(hcd->irq); -	release_mem_region(hcd->rsrc_start, hcd->rsrc_len);  	/* use request_mem_region to test if the ohci driver is loaded.  if so  	 * ensure the ohci core is operational. @@ -246,8 +212,6 @@ static int ehci_hcd_ppc_of_remove(struct platform_device *op)  				pr_debug("%s: no ohci offset in fdt\n", __FILE__);  			of_node_put(np);  		} - -		iounmap(ehci->ohci_hcctrl_reg);  	}  	usb_put_hcd(hcd); @@ -255,17 +219,6 @@ static int ehci_hcd_ppc_of_remove(struct platform_device *op)  } -static int ehci_hcd_ppc_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_ppc_of_match[] = {  	{  		.compatible = "usb-ehci", @@ -275,10 +228,10 @@ static const struct of_device_id ehci_hcd_ppc_of_match[] = {  MODULE_DEVICE_TABLE(of, ehci_hcd_ppc_of_match); -static struct of_platform_driver ehci_hcd_ppc_of_driver = { +static struct platform_driver ehci_hcd_ppc_of_driver = {  	.probe		= ehci_hcd_ppc_of_probe,  	.remove		= ehci_hcd_ppc_of_remove, -	.shutdown	= ehci_hcd_ppc_of_shutdown, +	.shutdown	= usb_hcd_platform_shutdown,  	.driver = {  		.name = "ppc-of-ehci",  		.owner = THIS_MODULE,  | 
