aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2015-01-20 17:55:57 -0500
committerFelipe Balbi <balbi@ti.com>2015-01-27 10:39:16 -0500
commit4b1a577d41c99f2aa548e8de3effe1033d9ca40b (patch)
tree181b85235f810e6e31f45a45c2316885ba96e534
parente19c99e7592e06b6fdf558aa8877b671f8cf0329 (diff)
usb: isp1760: Move core code to isp1760-core.c
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@ideasonboard.com> Signed-off-by: Felipe Balbi <balbi@ti.com>
-rw-r--r--drivers/usb/host/Makefile2
-rw-r--r--drivers/usb/host/isp1760-core.c65
-rw-r--r--drivers/usb/host/isp1760-core.h33
-rw-r--r--drivers/usb/host/isp1760-hcd.c42
-rw-r--r--drivers/usb/host/isp1760-hcd.h8
-rw-r--r--drivers/usb/host/isp1760-if.c2
6 files changed, 114 insertions, 38 deletions
diff --git a/drivers/usb/host/Makefile b/drivers/usb/host/Makefile
index d6216a493bab..4dea9b164210 100644
--- a/drivers/usb/host/Makefile
+++ b/drivers/usb/host/Makefile
@@ -5,7 +5,7 @@
5# tell define_trace.h where to find the xhci trace header 5# tell define_trace.h where to find the xhci trace header
6CFLAGS_xhci-trace.o := -I$(src) 6CFLAGS_xhci-trace.o := -I$(src)
7 7
8isp1760-y := isp1760-hcd.o isp1760-if.o 8isp1760-y := isp1760-core.o isp1760-hcd.o isp1760-if.o
9 9
10fhci-y := fhci-hcd.o fhci-hub.o fhci-q.o 10fhci-y := fhci-hcd.o fhci-hub.o fhci-q.o
11fhci-y += fhci-mem.o fhci-tds.o fhci-sched.o 11fhci-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 000000000000..d38efa0e340a
--- /dev/null
+++ b/drivers/usb/host/isp1760-core.c
@@ -0,0 +1,65 @@
1/*
2 * Driver for the NXP ISP1760 chip
3 *
4 * Copyright 2014 Laurent Pinchart
5 * Copyright 2007 Sebastian Siewior
6 *
7 * Contacts:
8 * Sebastian Siewior <bigeasy@linutronix.de>
9 * Laurent Pinchart <laurent.pinchart@ideasonboard.com>
10 *
11 * This program is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU General Public License
13 * version 2 as published by the Free Software Foundation.
14 */
15
16#include <linux/gpio.h>
17#include <linux/io.h>
18#include <linux/kernel.h>
19#include <linux/module.h>
20#include <linux/slab.h>
21#include <linux/usb.h>
22
23#include "isp1760-core.h"
24#include "isp1760-hcd.h"
25
26int isp1760_register(struct resource *mem, int irq, unsigned long irqflags,
27 struct device *dev, unsigned int devflags)
28{
29 struct isp1760_device *isp;
30 int ret;
31
32 if (usb_disabled())
33 return -ENODEV;
34
35 /* prevent usb-core allocating DMA pages */
36 dev->dma_mask = NULL;
37
38 isp = devm_kzalloc(dev, sizeof(*isp), GFP_KERNEL);
39 if (!isp)
40 return -ENOMEM;
41
42 isp->regs = devm_ioremap_resource(dev, mem);
43 if (IS_ERR(isp->regs))
44 return PTR_ERR(isp->regs);
45
46 ret = isp1760_hcd_register(&isp->hcd, isp->regs, mem, irq, irqflags,
47 dev, devflags);
48 if (ret < 0)
49 return ret;
50
51 dev_set_drvdata(dev, isp);
52
53 return 0;
54}
55
56void isp1760_unregister(struct device *dev)
57{
58 struct isp1760_device *isp = dev_get_drvdata(dev);
59
60 isp1760_hcd_unregister(&isp->hcd);
61}
62
63MODULE_DESCRIPTION("Driver for the ISP1760 USB-controller from NXP");
64MODULE_AUTHOR("Sebastian Siewior <bigeasy@linuxtronix.de>");
65MODULE_LICENSE("GPL v2");
diff --git a/drivers/usb/host/isp1760-core.h b/drivers/usb/host/isp1760-core.h
new file mode 100644
index 000000000000..0caeb1135275
--- /dev/null
+++ b/drivers/usb/host/isp1760-core.h
@@ -0,0 +1,33 @@
1/*
2 * Driver for the NXP ISP1760 chip
3 *
4 * Copyright 2014 Laurent Pinchart
5 * Copyright 2007 Sebastian Siewior
6 *
7 * Contacts:
8 * Sebastian Siewior <bigeasy@linutronix.de>
9 * Laurent Pinchart <laurent.pinchart@ideasonboard.com>
10 *
11 * This program is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU General Public License
13 * version 2 as published by the Free Software Foundation.
14 */
15
16#ifndef _ISP1760_CORE_H_
17#define _ISP1760_CORE_H_
18
19#include <linux/ioport.h>
20
21#include "isp1760-hcd.h"
22
23struct isp1760_device {
24 void __iomem *regs;
25
26 struct isp1760_hcd hcd;
27};
28
29int isp1760_register(struct resource *mem, int irq, unsigned long irqflags,
30 struct device *dev, unsigned int devflags);
31void isp1760_unregister(struct device *dev);
32
33#endif
diff --git a/drivers/usb/host/isp1760-hcd.c b/drivers/usb/host/isp1760-hcd.c
index 50434cc5335c..0cf620b1f6aa 100644
--- a/drivers/usb/host/isp1760-hcd.c
+++ b/drivers/usb/host/isp1760-hcd.c
@@ -2232,30 +2232,20 @@ void isp1760_deinit_kmem_cache(void)
2232 kmem_cache_destroy(urb_listitem_cachep); 2232 kmem_cache_destroy(urb_listitem_cachep);
2233} 2233}
2234 2234
2235int isp1760_register(struct resource *mem, int irq, unsigned long irqflags, 2235int isp1760_hcd_register(struct isp1760_hcd *priv, void __iomem *regs,
2236 struct device *dev, unsigned int devflags) 2236 struct resource *mem, int irq, unsigned long irqflags,
2237 struct device *dev, unsigned int devflags)
2237{ 2238{
2238 struct usb_hcd *hcd = NULL; 2239 struct usb_hcd *hcd;
2239 struct isp1760_hcd *priv;
2240 int ret; 2240 int ret;
2241 2241
2242 if (usb_disabled())
2243 return -ENODEV;
2244
2245 priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
2246 if (!priv)
2247 return -ENOMEM;
2248
2249 /* prevent usb-core allocating DMA pages */
2250 dev->dma_mask = NULL;
2251
2252 hcd = usb_create_hcd(&isp1760_hc_driver, dev, dev_name(dev)); 2242 hcd = usb_create_hcd(&isp1760_hc_driver, dev, dev_name(dev));
2253 if (!hcd) 2243 if (!hcd)
2254 return -ENOMEM; 2244 return -ENOMEM;
2255 2245
2256 priv->hcd = hcd;
2257 *(struct isp1760_hcd **)hcd->hcd_priv = priv; 2246 *(struct isp1760_hcd **)hcd->hcd_priv = priv;
2258 2247
2248 priv->hcd = hcd;
2259 priv->devflags = devflags; 2249 priv->devflags = devflags;
2260 2250
2261 priv->rst_gpio = devm_gpiod_get_optional(dev, NULL, GPIOD_OUT_HIGH); 2251 priv->rst_gpio = devm_gpiod_get_optional(dev, NULL, GPIOD_OUT_HIGH);
@@ -2265,22 +2255,17 @@ int isp1760_register(struct resource *mem, int irq, unsigned long irqflags,
2265 } 2255 }
2266 2256
2267 init_memory(priv); 2257 init_memory(priv);
2268 hcd->regs = devm_ioremap_resource(dev, mem);
2269 if (IS_ERR(hcd->regs)) {
2270 ret = PTR_ERR(hcd->regs);
2271 goto error;
2272 }
2273 2258
2274 hcd->irq = irq; 2259 hcd->irq = irq;
2260 hcd->regs = regs;
2275 hcd->rsrc_start = mem->start; 2261 hcd->rsrc_start = mem->start;
2276 hcd->rsrc_len = resource_size(mem); 2262 hcd->rsrc_len = resource_size(mem);
2277 2263
2278 ret = usb_add_hcd(hcd, irq, irqflags); 2264 ret = usb_add_hcd(hcd, irq, irqflags);
2279 if (ret) 2265 if (ret)
2280 goto error; 2266 goto error;
2281 device_wakeup_enable(hcd->self.controller);
2282 2267
2283 dev_set_drvdata(dev, priv); 2268 device_wakeup_enable(hcd->self.controller);
2284 2269
2285 return 0; 2270 return 0;
2286 2271
@@ -2289,15 +2274,8 @@ error:
2289 return ret; 2274 return ret;
2290} 2275}
2291 2276
2292void isp1760_unregister(struct device *dev) 2277void isp1760_hcd_unregister(struct isp1760_hcd *priv)
2293{ 2278{
2294 struct isp1760_hcd *priv = dev_get_drvdata(dev); 2279 usb_remove_hcd(priv->hcd);
2295 struct usb_hcd *hcd = priv->hcd; 2280 usb_put_hcd(priv->hcd);
2296
2297 usb_remove_hcd(hcd);
2298 usb_put_hcd(hcd);
2299} 2281}
2300
2301MODULE_DESCRIPTION("Driver for the ISP1760 USB-controller from NXP");
2302MODULE_AUTHOR("Sebastian Siewior <bigeasy@linuxtronix.de>");
2303MODULE_LICENSE("GPL v2");
diff --git a/drivers/usb/host/isp1760-hcd.h b/drivers/usb/host/isp1760-hcd.h
index 44486c86f5f7..dcd2232848cd 100644
--- a/drivers/usb/host/isp1760-hcd.h
+++ b/drivers/usb/host/isp1760-hcd.h
@@ -84,10 +84,10 @@ struct isp1760_hcd {
84 struct gpio_desc *rst_gpio; 84 struct gpio_desc *rst_gpio;
85}; 85};
86 86
87/* exports for if */ 87int isp1760_hcd_register(struct isp1760_hcd *priv, void __iomem *regs,
88int isp1760_register(struct resource *mem, int irq, unsigned long irqflags, 88 struct resource *mem, int irq, unsigned long irqflags,
89 struct device *dev, unsigned int devflags); 89 struct device *dev, unsigned int devflags);
90void isp1760_unregister(struct device *dev); 90void isp1760_hcd_unregister(struct isp1760_hcd *priv);
91 91
92int isp1760_init_kmem_once(void); 92int isp1760_init_kmem_once(void);
93void isp1760_deinit_kmem_cache(void); 93void isp1760_deinit_kmem_cache(void);
diff --git a/drivers/usb/host/isp1760-if.c b/drivers/usb/host/isp1760-if.c
index b1591c6cf54a..f2a399051244 100644
--- a/drivers/usb/host/isp1760-if.c
+++ b/drivers/usb/host/isp1760-if.c
@@ -18,7 +18,7 @@
18#include <linux/usb/isp1760.h> 18#include <linux/usb/isp1760.h>
19#include <linux/usb/hcd.h> 19#include <linux/usb/hcd.h>
20 20
21#include "isp1760-hcd.h" 21#include "isp1760-core.h"
22#include "isp1760-regs.h" 22#include "isp1760-regs.h"
23 23
24#ifdef CONFIG_PCI 24#ifdef CONFIG_PCI