aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/adm5120-2.6/files/drivers/usb/host
diff options
context:
space:
mode:
authorFlorian Fainelli <florian@openwrt.org>2007-06-05 14:03:42 +0000
committerFlorian Fainelli <florian@openwrt.org>2007-06-05 14:03:42 +0000
commit40f74f411d890de64200dfe8eaffb1332e7cc2e6 (patch)
tree26f31cc04602fec1f9d1cbceb8cbebe2f2c6f4f6 /target/linux/adm5120-2.6/files/drivers/usb/host
parentf111480b822acbf180741a0040b3bc4762d200ac (diff)
downloadupstream-40f74f411d890de64200dfe8eaffb1332e7cc2e6.tar.gz
upstream-40f74f411d890de64200dfe8eaffb1332e7cc2e6.tar.bz2
upstream-40f74f411d890de64200dfe8eaffb1332e7cc2e6.zip
USB probe rewrite, really needs testing
SVN-Revision: 7505
Diffstat (limited to 'target/linux/adm5120-2.6/files/drivers/usb/host')
-rw-r--r--target/linux/adm5120-2.6/files/drivers/usb/host/adm5120-hcd.c95
1 files changed, 49 insertions, 46 deletions
diff --git a/target/linux/adm5120-2.6/files/drivers/usb/host/adm5120-hcd.c b/target/linux/adm5120-2.6/files/drivers/usb/host/adm5120-hcd.c
index 8dabeeb8f7..a0ccaefd55 100644
--- a/target/linux/adm5120-2.6/files/drivers/usb/host/adm5120-hcd.c
+++ b/target/linux/adm5120-2.6/files/drivers/usb/host/adm5120-hcd.c
@@ -328,9 +328,8 @@ static void admhcd_ed_start(struct admhcd *ahcd, struct admhcd_ed *ed)
ahcd->dma_en |= ADMHCD_DMA_EN;
}
-static irqreturn_t adm5120hcd_irq(int irq, void *ptr, struct pt_regs *regs)
+static irqreturn_t adm5120hcd_irq(struct usb_hcd *hcd)
{
- struct usb_hcd *hcd = (struct usb_hcd *)ptr;
struct admhcd *ahcd = hcd_to_admhcd(hcd);
u32 intstatus;
@@ -689,6 +688,7 @@ static struct hc_driver adm5120_hc_driver = {
.description = hcd_name,
.product_desc = "ADM5120 HCD",
.hcd_priv_size = sizeof(struct admhcd),
+ .irq = adm5120hcd_irq,
.flags = HCD_USB11,
.urb_enqueue = admhcd_urb_enqueue,
.urb_dequeue = admhcd_urb_dequeue,
@@ -702,72 +702,75 @@ static struct hc_driver adm5120_hc_driver = {
static int __init adm5120hcd_probe(struct platform_device *pdev)
{
- struct usb_hcd *hcd;
- struct admhcd *ahcd;
+ struct usb_hcd *hcd;
+ struct admhcd *ahcd;
struct resource *addr, *data;
void __iomem *addr_reg;
void __iomem *data_reg;
- int irq, err = 0;
+
+ int err = 0, irq;
if (pdev->num_resources < 3) {
err = -ENODEV;
goto out;
- }
+ }
- data = platform_get_resource(pdev, IORESOURCE_MEM, 0);
- addr = platform_get_resource(pdev, IORESOURCE_MEM, 1);
+ if (pdev->dev.dma_mask) {
+ printk(KERN_DEBUG "no we won't dma\n");
+ return -EINVAL;
+ }
- if (request_irq(data->start, adm5120hcd_irq, 0, hcd_name, hcd)) {
- printk(KERN_WARNING "Could not request IRQ\n");
- err = -EBUSY;
- goto out;
- }
+ irq = platform_get_irq(pdev, 0);
+ data = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ addr = platform_get_resource(pdev, IORESOURCE_MEM, 1);
if (!addr || !data || irq < 0) {
- err = -ENODEV;
- goto out;
- }
-
- if (pdev->dev.dma_mask) {
- printk(KERN_DEBUG "DMA not supported\n");
- err = -EINVAL;
- goto out;
- }
+ err = -ENODEV;
+ goto out;
+ }
if (!request_mem_region(addr->start, 2, hcd_name)) {
- err = -EBUSY;
- goto out;
- }
- addr_reg = ioremap(addr->start, resource_len(addr));
- if (addr_reg == NULL) {
- err = -ENOMEM;
- goto out_mem;
- }
- if (!request_mem_region(data->start, 2, hcd_name)) {
- err = -EBUSY;
- goto out_unmap;
- }
- data_reg = ioremap(data->start, resource_len(data));
- if (data_reg == NULL) {
- err = -ENOMEM;
- goto out_mem;
- }
-
-
+ err = -EBUSY;
+ goto out;
+ }
+
+ addr_reg = ioremap(addr->start, resource_len(addr));
+ if (addr_reg == NULL) {
+ err = -ENOMEM;
+ goto out_mem;
+ }
+ if (!request_mem_region(data->start, 2, hcd_name)) {
+ err = -EBUSY;
+ goto out_unmap;
+ }
+
+ data_reg = ioremap(data->start, resource_len(data));
+ if (data_reg == NULL) {
+ err = -ENOMEM;
+ goto out_mem;
+ }
+
hcd = usb_create_hcd(&adm5120_hc_driver, &pdev->dev, pdev->dev.bus_id);
- if (!hcd)
- goto out_mem;
+ if (!hcd)
+ goto out_mem;
+ hcd->rsrc_start = addr->start;
ahcd = hcd_to_admhcd(hcd);
- ahcd->data_reg = data_reg;
- ahcd->addr_reg = addr_reg;
+
spin_lock_init(&ahcd->lock);
INIT_LIST_HEAD(&ahcd->async);
+ ahcd->data_reg = data_reg;
+ ahcd->addr_reg = addr_reg;
+
+ hcd->product_desc = "ADM5120 HCD";
+
/* Initialise the HCD registers */
admhcd_reg_set(ahcd, ADMHCD_REG_INTENABLE, 0);
mdelay(10);
+
admhcd_reg_set(ahcd, ADMHCD_REG_CONTROL, ADMHCD_SW_RESET);
+
while (admhcd_reg_get(ahcd, ADMHCD_REG_CONTROL) & ADMHCD_SW_RESET)
mdelay(1);
@@ -793,7 +796,7 @@ out_dev:
out_unmap:
iounmap(addr_reg);
out_mem:
- release_mem_region(addr->start, 2);
+ release_mem_region(pdev->resource[0].start, pdev->resource[0].end - pdev->resource[0].start);
out:
return err;
}