Changeset 8320


Ignore:
Timestamp:
2007-08-02T23:06:00+02:00 (11 years ago)
Author:
florian
Message:

Some adm5120-hcd cleanups

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/target/linux/adm5120-2.6/files/drivers/usb/host/adm5120-hcd.c

    r8078 r8320  
    3535 
    3636#define ADMHCD_REG_CONTROL              0x00 
     37#define  ADMHCD_SW_RESET                0x00000008      /* Reset */ 
     38#define  ADMHCD_DMAA                    0x00000004      /* DMA arbitration control */ 
     39#define  ADMHCD_SW_INTREQ               0x00000002      /* request software int */ 
     40#define  ADMHCD_HOST_EN                 0x00000001      /* Host enable */ 
    3741#define ADMHCD_REG_INTSTATUS            0x04 
     42#define  ADMHCD_INT_ACT                 0x80000000      /* Interrupt active */ 
     43#define  ADMHCD_INT_FATAL               0x40000000      /* Fatal interrupt */ 
     44#define  ADMHCD_INT_SW                  0x20000000      /* software interrupt */ 
     45#define  ADMHCD_INT_TD                  0x00100000      /* TD completed */ 
     46#define  ADMHCD_FNO                     0x00000800      /* Frame number overaflow */ 
     47#define  ADMHCD_SO                      0x00000400      /* Scheduling overrun */ 
     48#define  ADMHCD_INSMI                   0x00000200      /* Root hub status change */ 
     49#define  ADMHCD_BABI                    0x00000100      /* Babble detected, host mode */ 
     50#define  ADMHCD_RESI                    0x00000020      /* Resume detected */ 
     51#define  ADMHCD_SOFI                    0x00000010      /* SOF transmitted/received, host mode */ 
    3852#define ADMHCD_REG_INTENABLE            0x08 
     53#define  ADMHCD_INT_EN                  0x80000000      /* Interrupt enable */ 
     54#define  ADMHCD_INTMASK                 0x00000001      /* Interrupt mask */     
    3955#define ADMHCD_REG_HOSTCONTROL          0x10 
     56#define  ADMHCD_DMA_EN                  0x00000004      /* USB host DMA enable */ 
     57#define  ADMHCD_STATE_RST               0x00000000      /* bus state reset */ 
     58#define  ADMHCD_STATE_RES               0x00000001      /* bus state resume */ 
     59#define  ADMHCD_STATE_OP                0x00000002      /* bus state operational */ 
     60#define  ADMHCD_STATE_SUS               0x00000003      /* bus state suspended */ 
    4061#define ADMHCD_REG_FMINTERVAL           0x18 
    4162#define ADMHCD_REG_FMNUMBER             0x1c 
    4263#define ADMHCD_REG_LSTHRESH             0x70 
    4364#define ADMHCD_REG_RHDESCR              0x74 
     65#define  ADMHCD_CRWE                    0x20000000      /* Clear wakeup enable */ 
     66#define  ADMHCD_DRWE                    0x10000000      /* Device remote wakeup enable */ 
     67#define  ADMHCD_HW_OCIC                 0x08000000      /* Over current indication change */ 
     68#define  ADMHCD_LPSC                    0x04000000      /* Local power switch change */ 
     69#define  ADMHCD_OCI                     0x02000000      /* Over current indication */ 
     70#define  ADMHCD_LPS                     0x01000000      /* Local power switch/global power switch */ 
     71#define  ADMHCD_NOCP                    0x00000800      /* No over current protect mode */ 
     72#define  ADMHCD_OPCM                    0x00000400      /* Over current protect mode */ 
     73#define  ADMHCD_NPS                     0x00000200      /* No Power Switch */ 
     74#define  ADMHCD_PSM                     0x00000100      /* Power switch mode */ 
    4475#define ADMHCD_REG_PORTSTATUS0          0x78 
     76#define  ADMHCD_CCS                     0x00000001      /* current connect status */ 
     77#define  ADMHCD_PES                     0x00000002      /* port enable status */ 
     78#define  ADMHCD_PSS                     0x00000004      /* port suspend status */ 
     79#define  ADMHCD_POCI                    0x00000008      /* port overcurrent indicator */ 
     80#define  ADMHCD_PRS                     0x00000010      /* port reset status */ 
     81#define  ADMHCD_PPS                     0x00000100      /* port power status */ 
     82#define  ADMHCD_LSDA                    0x00000200      /* low speed device attached */ 
     83#define  ADMHCD_CSC                     0x00010000      /* connect status change */ 
     84#define  ADMHCD_PESC                    0x00020000      /* enable status change */ 
     85#define  ADMHCD_PSSC                    0x00040000      /* suspend status change */ 
     86#define  ADMHCD_OCIC                    0x00080000      /* overcurrent change*/ 
     87#define  ADMHCD_PRSC                    0x00100000      /* reset status change */ 
    4588#define ADMHCD_REG_PORTSTATUS1          0x7c 
    4689#define ADMHCD_REG_HOSTHEAD             0x80 
     
    4891 
    4992#define ADMHCD_NUMPORTS         2 
    50  
    51 #define ADMHCD_HOST_EN          0x00000001      /* Host enable */ 
    52 #define ADMHCD_SW_INTREQ        0x00000002      /* request software int */ 
    53 #define ADMHCD_SW_RESET         0x00000008      /* Reset */ 
    54  
    55 #define ADMHCD_INT_TD           0x00100000      /* TD completed */ 
    56 #define ADMHCD_INT_SW           0x20000000      /* software interrupt */ 
    57 #define ADMHCD_INT_FATAL        0x40000000      /* Fatal interrupt */ 
    58 #define ADMHCD_INT_ACT          0x80000000      /* Interrupt active */ 
    59  
    60 #define ADMHCD_STATE_RST        0x00000000      /* bus state reset */ 
    61 #define ADMHCD_STATE_RES        0x00000001      /* bus state resume */ 
    62 #define ADMHCD_STATE_OP         0x00000002      /* bus state operational */ 
    63 #define ADMHCD_STATE_SUS        0x00000003      /* bus state suspended */ 
    64 #define ADMHCD_DMA_EN           0x00000004      /* enable dma engine */ 
    65  
    66 #define ADMHCD_RST_ST           0x00            /* USB reset state */ 
    67 #define ADMHCD_RSM_ST           0x01            /* USB resume state */ 
    68 #define ADMHCD_OPR_ST           0x10            /* USB operational state */ 
    69 #define ADMHCD_SUS_ST           0x11            /* USB suspend state */ 
    70  
    71 #define ADMHCD_NPS              0x00000200      /* No Power Switch */ 
    72 #define ADMHCD_PSM              0x00000100      /* Power switch mode */ 
    73 #define ADMHCD_OPCM             0x00000400      /* Over current protect mode */ 
    74 #define ADMHCD_NOCP             0x00000800      /* No over current protect mode */ 
    75 #define ADMHCD_LPSC             0x04000000      /* Local power switch change */ 
    76 #define ADMHCD_LPS              0x01000000      /* Local power switch/global power switch */ 
    77  
    78 #define ADMHCD_CCS              0x00000001      /* current connect status */ 
    79 #define ADMHCD_PES              0x00000002      /* port enable status */ 
    80 #define ADMHCD_PSS              0x00000004      /* port suspend status */ 
    81 #define ADMHCD_POCI             0x00000008      /* port overcurrent indicator */ 
    82 #define ADMHCD_PRS              0x00000010      /* port reset status */ 
    83 #define ADMHCD_PPS              0x00000100      /* port power status */ 
    84 #define ADMHCD_LSDA             0x00000200      /* low speed device attached */ 
    85 #define ADMHCD_CSC              0x00010000      /* connect status change */ 
    86 #define ADMHCD_PESC             0x00020000      /* enable status change */ 
    87 #define ADMHCD_PSSC             0x00040000      /* suspend status change */ 
    88 #define ADMHCD_OCIC             0x00080000      /* overcurrent change*/ 
    89 #define ADMHCD_PRSC             0x00100000      /* reset status change */ 
    90  
    9193 
    9294struct admhcd_ed { 
     
    701703        unsigned long flags; 
    702704 
     705        printk(KERN_DEBUG PFX "calling admhcd_start\n"); 
     706 
    703707        spin_lock_irqsave(&ahcd->lock, flags); 
    704708 
     
    709713        admhcd_reg_set(ahcd, ADMHCD_REG_CONTROL, ADMHCD_SW_RESET); 
    710714 
    711         while (admhcd_reg_get(ahcd, ADMHCD_REG_CONTROL) & ADMHCD_SW_RESET) 
     715        while (admhcd_reg_get(ahcd, ADMHCD_REG_CONTROL) & ADMHCD_SW_RESET) { 
     716                printk(KERN_WARNING PFX "waiting for reset to complete\n"); 
    712717                mdelay(1); 
     718        } 
     719         
     720        hcd->uses_new_polling = 1; 
    713721 
    714722        /* Enable USB host mode */ 
     
    726734            ADMHCD_INT_ACT | ADMHCD_INT_FATAL | ADMHCD_INT_SW | ADMHCD_INT_TD); 
    727735 
     736        /* Power on all ports */ 
    728737        admhcd_reg_set(ahcd, ADMHCD_REG_RHDESCR, ADMHCD_NPS | ADMHCD_LPSC); 
     738 
     739        /* HCD is now operationnal */ 
    729740        admhcd_reg_set(ahcd, ADMHCD_REG_HOSTCONTROL, ADMHCD_STATE_OP); 
    730741 
    731  
    732742        hcd->state = HC_STATE_RUNNING; 
    733743 
    734744        spin_unlock_irqrestore(&ahcd->lock, flags); 
     745 
     746        printk(KERN_DEBUG PFX "returning 0 from admhcd_start\n"); 
    735747        return 0; 
    736748} 
     
    777789                msleep(4); 
    778790                spin_lock_irq(&ahcd->lock); 
    779                 val = admhcd_reg_get(ahcd, ADMHCD_REG_HOSTCONTROL) & ADMHCD_OPR_ST; 
     791                val = admhcd_reg_get(ahcd, ADMHCD_REG_HOSTCONTROL) & ADMHCD_STATE_RST; 
    780792                spin_unlock_irq(&ahcd->lock); 
    781793                if (val) 
     
    815827        .hcd_priv_size =        sizeof(struct admhcd), 
    816828        .irq =                  adm5120hcd_irq, 
    817         .flags =                HCD_MEMORY|HCD_USB11, 
     829        .flags =                HCD_USB11, 
    818830        .urb_enqueue =          admhcd_urb_enqueue, 
    819831        .urb_dequeue =          admhcd_urb_dequeue, 
     
    839851 
    840852        if (pdev->num_resources < 2) { 
     853                printk(KERN_WARNING PFX "not enough resources\n"); 
    841854                err = -ENODEV; 
    842855                goto out; 
    843856        } 
    844857 
     858        irq = platform_get_irq(pdev, 0); 
     859        data = platform_get_resource(pdev, IORESOURCE_MEM, 0); 
     860 
    845861        if (pdev->dev.dma_mask) { 
    846                 printk(KERN_DEBUG "no we won't dma\n"); 
     862                printk(KERN_DEBUG PFX "no we won't dma\n"); 
    847863                return -EINVAL; 
    848864        } 
    849865 
    850         irq = platform_get_irq(pdev, 0); 
    851         data = platform_get_resource(pdev, IORESOURCE_MEM, 0); 
    852  
    853866        if (!data || irq < 0) { 
     867                printk(KERN_DEBUG PFX "either IRQ or data resource is invalid\n"); 
    854868                err = -ENODEV; 
    855869                goto out; 
     
    857871 
    858872        if (!request_mem_region(data->start, 2, hcd_name)) { 
     873                printk(KERN_DEBUG PFX "cannot request memory regions for the data resource\n"); 
    859874                err = -EBUSY; 
    860                 goto out_unmap; 
     875                goto out; 
    861876        } 
    862877 
    863878        data_reg = ioremap(data->start, resource_len(data)); 
     879 
    864880        if (data_reg == NULL) { 
     881                printk(KERN_DEBUG PFX "unable to ioremap\n"); 
    865882                err = -ENOMEM; 
    866883                goto out_mem; 
     
    868885 
    869886        hcd = usb_create_hcd(&adm5120_hc_driver, &pdev->dev, pdev->dev.bus_id); 
    870         if (!hcd) 
     887        if (!hcd) { 
     888                printk(KERN_DEBUG PFX "unable to create the hcd\n"); 
     889                err = -ENOMEM; 
    871890                goto out_mem; 
     891        } 
    872892 
    873893        hcd->rsrc_start = data->start; 
    874         hcd->rsrc_len   = resource_len(data); 
    875         hcd->regs = (u32)data_reg; 
     894        hcd->rsrc_len = resource_len(data); 
     895        hcd->regs = data_reg; 
     896         
    876897        ahcd = hcd_to_admhcd(hcd); 
     898        ahcd->data_reg = data_reg; 
     899        ahcd->base = (u32)data_reg; 
    877900 
    878901        spin_lock_init(&ahcd->lock); 
    879902        INIT_LIST_HEAD(&ahcd->async); 
    880903 
    881         ahcd->data_reg = data_reg; 
    882         ahcd->base = (u32)data_reg; 
    883  
    884904        hcd->product_desc = "ADM5120 HCD"; 
    885905 
    886906        err = usb_add_hcd(hcd, irq, IRQF_DISABLED); 
    887         if (err) 
     907        if (err) { 
     908                printk(KERN_DEBUG PFX "unable to add hcd\n"); 
    888909                goto out_dev; 
     910        } 
    889911 
    890912        return 0; 
     
    900922} 
    901923 
     924#ifdef CONFIG_PM 
     925static int adm5120hcd_suspend(struct platform_device *pdev,  pm_message_t state) 
     926{ 
     927        pdev-dev.power.power_state = state; 
     928        mdelay(1); 
     929        return 0; 
     930} 
     931 
     932static int adm5120hcd_resume(struct platform_device *pdev, pm_message_t state) 
     933{ 
     934        pdev->dev.power.power_state = PMSG_ON; 
     935        mdelay(1); 
     936        return 0; 
     937} 
     938#else 
     939#define adm5120hcd_suspend      NULL 
     940#define adm5120hcd_resume       NULL 
     941#endif 
     942 
    902943static int __init_or_module adm5120hcd_remove(struct platform_device *pdev) 
    903944{ 
     
    917958        .probe =        adm5120hcd_probe, 
    918959        .remove =       adm5120hcd_remove, 
     960        .suspend =      adm5120hcd_suspend, 
     961        .remove =       adm5120hcd_resume, 
    919962        .driver =       { 
    920                 .name   = "adm5120-usbc", 
     963                .name   = (char *)hcd_name, 
    921964                .owner  = THIS_MODULE, 
    922965        }, 
     
    945988 
    946989static void __exit adm5120hcd_exit(void) 
    947 { 
     990{        
    948991        platform_driver_unregister(&adm5120hcd_driver); 
     992        printk(KERN_INFO PFX "driver unregistered\n"); 
    949993} 
    950994 
Note: See TracChangeset for help on using the changeset viewer.