Move core device initialization to a central location in order to share it with the device mode implementation. Signed-off-by: Laurent Pinchart <laurent.pinchart@xxxxxxxxxxxxxxxx> --- drivers/usb/host/Makefile | 2 +- drivers/usb/host/isp1760-core.c | 90 +++++++++++++++++++++++++++++++++++++++++ drivers/usb/host/isp1760-core.h | 37 +++++++++++++++++ drivers/usb/host/isp1760-hcd.c | 73 ++++++++------------------------- drivers/usb/host/isp1760-hcd.h | 8 ++-- drivers/usb/host/isp1760-if.c | 2 +- 6 files changed, 150 insertions(+), 62 deletions(-) create mode 100644 drivers/usb/host/isp1760-core.c create mode 100644 drivers/usb/host/isp1760-core.h diff --git a/drivers/usb/host/Makefile b/drivers/usb/host/Makefile index 144c038..ecba12c 100644 --- a/drivers/usb/host/Makefile +++ b/drivers/usb/host/Makefile @@ -5,7 +5,7 @@ # tell define_trace.h where to find the xhci trace header CFLAGS_xhci-trace.o := -I$(src) -isp1760-y := isp1760-hcd.o isp1760-if.o +isp1760-y := isp1760-core.o isp1760-hcd.o isp1760-if.o fhci-y := fhci-hcd.o fhci-hub.o fhci-q.o fhci-y += fhci-mem.o fhci-tds.o fhci-sched.o diff --git a/drivers/usb/host/isp1760-core.c b/drivers/usb/host/isp1760-core.c new file mode 100644 index 0000000..28f8290 --- /dev/null +++ b/drivers/usb/host/isp1760-core.c @@ -0,0 +1,90 @@ +/* + * Driver for the NXP ISP1760 chip + * + * Copyright 2014 Laurent Pinchart + * Copyright 2007 Sebastian Siewior + * + * Contacts: + * Sebastian Siewior <bigeasy@xxxxxxxxxxxxx> + * Laurent Pinchart <laurent.pinchart@xxxxxxxxxxxxxxxx> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + */ + +#include <linux/gpio.h> +#include <linux/io.h> +#include <linux/kernel.h> +#include <linux/module.h> +#include <linux/slab.h> +#include <linux/usb.h> + +#include "isp1760-core.h" +#include "isp1760-hcd.h" + +int isp1760_register(struct resource *mem, int irq, unsigned long irqflags, + int rst_gpio, struct device *dev, unsigned int devflags) +{ + struct isp1760_device *isp; + int ret; + + if (usb_disabled()) + return -ENODEV; + + /* prevent usb-core allocating DMA pages */ + dev->dma_mask = NULL; + + isp = kzalloc(sizeof(*isp), GFP_KERNEL); + if (!isp) + return -ENOMEM; + + isp->rst_gpio = rst_gpio; + + isp->mem_start = mem->start; + isp->mem_size = resource_size(mem); + + isp->regs = ioremap(isp->mem_start, isp->mem_size); + if (!isp->regs) { + ret = -EIO; + goto error; + } + + isp->hcd.rst_gpio = rst_gpio; + ret = isp1760_hcd_register(&isp->hcd, isp->regs, mem, irq, irqflags, + dev, devflags); + if (ret < 0) + goto error; + + dev_set_drvdata(dev, isp); + + return 0; + +error: + if (isp->regs) + iounmap(isp->regs); + + kfree(isp); + + return ret; +} + +void isp1760_unregister(struct device *dev) +{ + struct isp1760_device *isp = dev_get_drvdata(dev); + + release_mem_region(isp->mem_start, isp->mem_size); + + isp1760_hcd_unregister(&isp->hcd); + + iounmap(isp->regs); + + if (gpio_is_valid(isp->rst_gpio)) + gpio_free(isp->rst_gpio); + + kfree(isp); +} + +MODULE_DESCRIPTION("Driver for the ISP1760 USB-controller from NXP"); +MODULE_AUTHOR("Sebastian Siewior <bigeasy@xxxxxxxxxxxxxx>"); +MODULE_LICENSE("GPL v2"); diff --git a/drivers/usb/host/isp1760-core.h b/drivers/usb/host/isp1760-core.h new file mode 100644 index 0000000..8bd997c --- /dev/null +++ b/drivers/usb/host/isp1760-core.h @@ -0,0 +1,37 @@ +/* + * Driver for the NXP ISP1760 chip + * + * Copyright 2014 Laurent Pinchart + * Copyright 2007 Sebastian Siewior + * + * Contacts: + * Sebastian Siewior <bigeasy@xxxxxxxxxxxxx> + * Laurent Pinchart <laurent.pinchart@xxxxxxxxxxxxxxxx> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + */ + +#ifndef _ISP1760_CORE_H_ +#define _ISP1760_CORE_H_ + +#include <linux/ioport.h> + +#include "isp1760-hcd.h" + +struct isp1760_device { + resource_size_t mem_start; + resource_size_t mem_size; + + void __iomem *regs; + int rst_gpio; + + struct isp1760_hcd hcd; +}; + +int isp1760_register(struct resource *mem, int irq, unsigned long irqflags, + int rst_gpio, struct device *dev, unsigned int devflags); +void isp1760_unregister(struct device *dev); + +#endif diff --git a/drivers/usb/host/isp1760-hcd.c b/drivers/usb/host/isp1760-hcd.c index 9c8cd37..f903ad9 100644 --- a/drivers/usb/host/isp1760-hcd.c +++ b/drivers/usb/host/isp1760-hcd.c @@ -2237,81 +2237,42 @@ void isp1760_deinit_kmem_cache(void) kmem_cache_destroy(urb_listitem_cachep); } -int isp1760_register(struct resource *mem, int irq, unsigned long irqflags, - int rst_gpio, struct device *dev, unsigned int devflags) +int isp1760_hcd_register(struct isp1760_hcd *priv, void __iomem *regs, + struct resource *mem, int irq, unsigned long irqflags, + struct device *dev, unsigned int devflags) { - struct usb_hcd *hcd = NULL; - struct isp1760_hcd *priv; + struct usb_hcd *hcd; int ret; - if (usb_disabled()) - return -ENODEV; - - priv = kzalloc(sizeof(*priv), GFP_KERNEL); - if (!priv) - return -ENOMEM; - - /* prevent usb-core allocating DMA pages */ - dev->dma_mask = NULL; - hcd = usb_create_hcd(&isp1760_hc_driver, dev, dev_name(dev)); - if (!hcd) { - ret = -ENOMEM; - goto err_put; - } + if (!hcd) + return -ENOMEM; - priv->hcd = hcd; *(struct isp1760_hcd **)hcd->hcd_priv = priv; + priv->hcd = hcd; priv->devflags = devflags; - priv->rst_gpio = rst_gpio; + init_memory(priv); - hcd->regs = ioremap(mem->start, resource_size(mem)); - if (!hcd->regs) { - ret = -EIO; - goto err_put; - } hcd->irq = irq; + hcd->regs = regs; hcd->rsrc_start = mem->start; hcd->rsrc_len = resource_size(mem); ret = usb_add_hcd(hcd, irq, irqflags); - if (ret) - goto err_unmap; - device_wakeup_enable(hcd->self.controller); + if (ret) { + usb_put_hcd(hcd); + return ret; + } - dev_set_drvdata(dev, priv); + device_wakeup_enable(hcd->self.controller); return 0; - -err_unmap: - iounmap(hcd->regs); - -err_put: - usb_put_hcd(hcd); - kfree(priv); - - return ret; } -void isp1760_unregister(struct device *dev) +void isp1760_hcd_unregister(struct isp1760_hcd *priv) { - struct isp1760_hcd *priv = dev_get_drvdata(dev); - struct usb_hcd *hcd = priv->hcd; - - release_mem_region(hcd->rsrc_start, hcd->rsrc_len); - - usb_remove_hcd(hcd); - iounmap(hcd->regs); - usb_put_hcd(hcd); - - if (gpio_is_valid(priv->rst_gpio)) - gpio_free(priv->rst_gpio); - - kfree(priv); + usb_remove_hcd(priv->hcd); + usb_put_hcd(priv->hcd); } - -MODULE_DESCRIPTION("Driver for the ISP1760 USB-controller from NXP"); -MODULE_AUTHOR("Sebastian Siewior <bigeasy@xxxxxxxxxxxxxx>"); -MODULE_LICENSE("GPL v2"); diff --git a/drivers/usb/host/isp1760-hcd.h b/drivers/usb/host/isp1760-hcd.h index 3ece078..51996a2 100644 --- a/drivers/usb/host/isp1760-hcd.h +++ b/drivers/usb/host/isp1760-hcd.h @@ -84,10 +84,10 @@ struct isp1760_hcd { int rst_gpio; }; -/* exports for if */ -int isp1760_register(struct resource *mem, int irq, unsigned long irqflags, - int rst_gpio, struct device *dev, unsigned int devflags); -void isp1760_unregister(struct device *dev); +int isp1760_hcd_register(struct isp1760_hcd *priv, void __iomem *regs, + struct resource *mem, int irq, unsigned long irqflags, + struct device *dev, unsigned int devflags); +void isp1760_hcd_unregister(struct isp1760_hcd *priv); int isp1760_init_kmem_once(void); void isp1760_deinit_kmem_cache(void); diff --git a/drivers/usb/host/isp1760-if.c b/drivers/usb/host/isp1760-if.c index 2880604..16db1be 100644 --- a/drivers/usb/host/isp1760-if.c +++ b/drivers/usb/host/isp1760-if.c @@ -16,7 +16,7 @@ #include <linux/usb/isp1760.h> #include <linux/usb/hcd.h> -#include "isp1760-hcd.h" +#include "isp1760-core.h" #include "isp1760-regs.h" #if defined(CONFIG_OF) && defined(CONFIG_OF_IRQ) -- 2.0.4 -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html