Skip to content

Commit

Permalink
usb: isp1760: Move core code to isp1760-core.c
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Laurent Pinchart authored and Felipe Balbi committed Jan 27, 2015
1 parent e19c99e commit 4b1a577
Show file tree
Hide file tree
Showing 6 changed files with 114 additions and 38 deletions.
2 changes: 1 addition & 1 deletion drivers/usb/host/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
65 changes: 65 additions & 0 deletions drivers/usb/host/isp1760-core.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
/*
* Driver for the NXP ISP1760 chip
*
* Copyright 2014 Laurent Pinchart
* Copyright 2007 Sebastian Siewior
*
* Contacts:
* Sebastian Siewior <bigeasy@linutronix.de>
* Laurent Pinchart <laurent.pinchart@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,
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 = devm_kzalloc(dev, sizeof(*isp), GFP_KERNEL);
if (!isp)
return -ENOMEM;

isp->regs = devm_ioremap_resource(dev, mem);
if (IS_ERR(isp->regs))
return PTR_ERR(isp->regs);

ret = isp1760_hcd_register(&isp->hcd, isp->regs, mem, irq, irqflags,
dev, devflags);
if (ret < 0)
return ret;

dev_set_drvdata(dev, isp);

return 0;
}

void isp1760_unregister(struct device *dev)
{
struct isp1760_device *isp = dev_get_drvdata(dev);

isp1760_hcd_unregister(&isp->hcd);
}

MODULE_DESCRIPTION("Driver for the ISP1760 USB-controller from NXP");
MODULE_AUTHOR("Sebastian Siewior <bigeasy@linuxtronix.de>");
MODULE_LICENSE("GPL v2");
33 changes: 33 additions & 0 deletions drivers/usb/host/isp1760-core.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
/*
* Driver for the NXP ISP1760 chip
*
* Copyright 2014 Laurent Pinchart
* Copyright 2007 Sebastian Siewior
*
* Contacts:
* Sebastian Siewior <bigeasy@linutronix.de>
* Laurent Pinchart <laurent.pinchart@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 {
void __iomem *regs;

struct isp1760_hcd hcd;
};

int isp1760_register(struct resource *mem, int irq, unsigned long irqflags,
struct device *dev, unsigned int devflags);
void isp1760_unregister(struct device *dev);

#endif
42 changes: 10 additions & 32 deletions drivers/usb/host/isp1760-hcd.c
Original file line number Diff line number Diff line change
Expand Up @@ -2232,30 +2232,20 @@ void isp1760_deinit_kmem_cache(void)
kmem_cache_destroy(urb_listitem_cachep);
}

int isp1760_register(struct resource *mem, int irq, unsigned long irqflags,
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 = devm_kzalloc(dev, 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)
return -ENOMEM;

priv->hcd = hcd;
*(struct isp1760_hcd **)hcd->hcd_priv = priv;

priv->hcd = hcd;
priv->devflags = devflags;

priv->rst_gpio = devm_gpiod_get_optional(dev, NULL, GPIOD_OUT_HIGH);
Expand All @@ -2265,22 +2255,17 @@ int isp1760_register(struct resource *mem, int irq, unsigned long irqflags,
}

init_memory(priv);
hcd->regs = devm_ioremap_resource(dev, mem);
if (IS_ERR(hcd->regs)) {
ret = PTR_ERR(hcd->regs);
goto error;
}

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 error;
device_wakeup_enable(hcd->self.controller);

dev_set_drvdata(dev, priv);
device_wakeup_enable(hcd->self.controller);

return 0;

Expand All @@ -2289,15 +2274,8 @@ int isp1760_register(struct resource *mem, int irq, unsigned long irqflags,
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;

usb_remove_hcd(hcd);
usb_put_hcd(hcd);
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@linuxtronix.de>");
MODULE_LICENSE("GPL v2");
8 changes: 4 additions & 4 deletions drivers/usb/host/isp1760-hcd.h
Original file line number Diff line number Diff line change
Expand Up @@ -84,10 +84,10 @@ struct isp1760_hcd {
struct gpio_desc *rst_gpio;
};

/* exports for if */
int isp1760_register(struct resource *mem, int irq, unsigned long irqflags,
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);
Expand Down
2 changes: 1 addition & 1 deletion drivers/usb/host/isp1760-if.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
#include <linux/usb/isp1760.h>
#include <linux/usb/hcd.h>

#include "isp1760-hcd.h"
#include "isp1760-core.h"
#include "isp1760-regs.h"

#ifdef CONFIG_PCI
Expand Down

0 comments on commit 4b1a577

Please sign in to comment.