diff options
author | Florian Fainelli <florian@openwrt.org> | 2007-06-05 14:03:42 +0000 |
---|---|---|
committer | Florian Fainelli <florian@openwrt.org> | 2007-06-05 14:03:42 +0000 |
commit | 40f74f411d890de64200dfe8eaffb1332e7cc2e6 (patch) | |
tree | 26f31cc04602fec1f9d1cbceb8cbebe2f2c6f4f6 /target/linux/adm5120-2.6 | |
parent | f111480b822acbf180741a0040b3bc4762d200ac (diff) | |
download | master-31e0f0ae-40f74f411d890de64200dfe8eaffb1332e7cc2e6.tar.gz master-31e0f0ae-40f74f411d890de64200dfe8eaffb1332e7cc2e6.tar.bz2 master-31e0f0ae-40f74f411d890de64200dfe8eaffb1332e7cc2e6.zip |
USB probe rewrite, really needs testing
SVN-Revision: 7505
Diffstat (limited to 'target/linux/adm5120-2.6')
-rw-r--r-- | target/linux/adm5120-2.6/files/drivers/usb/host/adm5120-hcd.c | 95 |
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; } |