Move core device initialization to a central location in order to share
it with the device mode implementation.

Signed-off-by: Laurent Pinchart <laurent.pinch...@ideasonboard.com>
---
 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 <bige...@linutronix.de>
+ *     Laurent Pinchart <laurent.pinch...@ideasonboard.com>
+ *
+ * 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 <bige...@linuxtronix.de>");
+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 <bige...@linutronix.de>
+ *     Laurent Pinchart <laurent.pinch...@ideasonboard.com>
+ *
+ * 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 <bige...@linuxtronix.de>");
-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 majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to