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 <[email protected]> > --- > 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 <[email protected]> > + * Laurent Pinchart <[email protected]> > + * > + * 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 <[email protected]>");
> +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 <[email protected]>
> + * Laurent Pinchart <[email protected]>
> + *
> + * 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 <[email protected]>");
> -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
signature.asc
Description: Digital signature
