[adm5120] refactor kernel code (part 1), mark it as broken now
[openwrt.git] / target / linux / adm5120-2.6 / files / drivers / usb / host / adm5120-hcd.c
index 25ba4b8..c8be739 100644 (file)
@@ -18,6 +18,7 @@
 #include <linux/usb.h>
 #include <linux/platform_device.h>
 
+#include <asm/bootinfo.h>
 #include <asm/io.h>
 #include <asm/irq.h>
 #include <asm/system.h>
@@ -30,6 +31,8 @@ MODULE_DESCRIPTION("ADM5120 USB Host Controller Driver");
 MODULE_LICENSE("GPL");
 MODULE_AUTHOR("Jeroen Vreeken (pe1rxq@amsat.org)");
 
+#define PFX    "adm5120-hcd: "
+
 #define ADMHCD_REG_CONTROL             0x00
 #define ADMHCD_REG_INTSTATUS           0x04
 #define ADMHCD_REG_INTENABLE           0x08
@@ -328,9 +331,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;
 
@@ -376,7 +378,7 @@ static irqreturn_t adm5120hcd_irq(int irq, void *ptr, struct pt_regs *regs)
 }
 
 static int admhcd_urb_enqueue(struct usb_hcd *hcd, struct usb_host_endpoint *ep,
-    struct urb *urb, int mem_flags)
+    struct urb *urb, gfp_t mem_flags)
 {
        struct admhcd *ahcd = hcd_to_admhcd(hcd);
        struct admhcd_ed *ed;
@@ -689,6 +691,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,68 +705,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_device *udev;
+        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;
-       }
+        }
+
+       if (pdev->dev.dma_mask) {
+                printk(KERN_DEBUG "no we won't dma\n");
+                return -EINVAL;
+        }
 
-       data = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       addr = platform_get_resource(pdev, IORESOURCE_MEM, 1);
        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);
 
@@ -786,14 +796,10 @@ static int __init adm5120hcd_probe(struct platform_device *pdev)
 
 out_dev:
        usb_put_hcd(hcd);
-out_irq:
-       free_irq(pdev->resource[1].start, hcd);
 out_unmap:
        iounmap(addr_reg);
-out_hcd:
-       usb_put_hcd(hcd);
 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;
 }
@@ -802,7 +808,6 @@ static int __init_or_module adm5120hcd_remove(struct platform_device *pdev)
 {
        struct usb_hcd *hcd = platform_get_drvdata(pdev);
        struct admhcd *ahcd;
-       struct resource *res;
 
        if (!hcd)
                return 0;
@@ -817,19 +822,30 @@ static struct platform_driver adm5120hcd_driver = {
        .probe =        adm5120hcd_probe,
        .remove =       adm5120hcd_remove,
        .driver =       {
-               .name   = "adm5120-hcd",
+               .name   = "adm5120-usbc",
                .owner  = THIS_MODULE,
        },
 };
 
 static int __init adm5120hcd_init(void)
 {
-       if (usb_disabled())
+       int ret;
+
+       if (usb_disabled()) {
+               printk(KERN_DEBUG PFX "USB support is disabled\n");
                return -ENODEV;
-       if (!adm5120_board.has_usb)
+       }
+
+       if (mips_machgroup != MACH_GROUP_ADM5120) {
+               printk(KERN_DEBUG PFX "unsupported machine group\n");
                return -ENODEV;
+       }
 
-       return platform_driver_register(&adm5120hcd_driver);
+       ret = platform_driver_register(&adm5120hcd_driver);
+       if (ret == 0)
+               printk(KERN_INFO PFX "registered\n");
+
+       return ret;
 }
 
 static void __exit adm5120hcd_exit(void)
This page took 0.035123 seconds and 4 git commands to generate.