On Mon, Oct 06, 2014 at 06:55:00PM +0300, Laurent Pinchart wrote: > 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; > + } where did request_mem_region() go ? > + 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); only after iounmap() > + 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 > -- balbi
Attachment:
signature.asc
Description: Digital signature