[PATCH 12/17] usb: isp1760: Move core code to isp1760-core.c

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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




[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux