]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - drivers/usb/host/ohci-hcd.c
Merge branch 'u-boot-imx/master' into 'u-boot-arm/master'
[karo-tx-uboot.git] / drivers / usb / host / ohci-hcd.c
index c20d7064277bb82f60a649be5f2caee6cbe09eb6..bc17b85db5a7ca38325d3037135fa077c76f97f7 100644 (file)
@@ -66,7 +66,6 @@
 
 #if defined(CONFIG_ARM920T) || \
     defined(CONFIG_S3C24X0) || \
-    defined(CONFIG_S3C6400) || \
     defined(CONFIG_440EP) || \
     defined(CONFIG_PCI_OHCI) || \
     defined(CONFIG_MPC5200) || \
@@ -803,7 +802,7 @@ static ed_t *ep_add_ed(struct usb_device *usb_dev, unsigned long pipe,
                        | (usb_pipeisoc(pipe)? 0x8000: 0)
                        | (usb_pipecontrol(pipe)? 0: \
                                           (usb_pipeout(pipe)? 0x800: 0x1000))
-                       | usb_pipeslow(pipe) << 13
+                       | (usb_dev->speed == USB_SPEED_LOW) << 13
                        | usb_maxpacket(usb_dev, pipe) << 16);
 
        if (ed->type == PIPE_INTERRUPT && ed->state == ED_UNLINK) {
@@ -1261,18 +1260,17 @@ static int ohci_submit_rh_msg(struct usb_device *dev, unsigned long pipe,
        int leni = transfer_len;
        int len = 0;
        int stat = 0;
-       __u32 datab[4];
-       __u8 *data_buf = (__u8 *)datab;
        __u16 bmRType_bReq;
        __u16 wValue;
        __u16 wIndex;
        __u16 wLength;
+       ALLOC_ALIGN_BUFFER(__u8, databuf, 16, sizeof(u32));
 
 #ifdef DEBUG
 pkt_print(NULL, dev, pipe, buffer, transfer_len,
          cmd, "SUB(rh)", usb_pipein(pipe));
 #else
-       wait_ms(1);
+       mdelay(1);
 #endif
        if (usb_pipeint(pipe)) {
                info("Root-Hub submit IRQ: NOT implemented");
@@ -1297,20 +1295,20 @@ pkt_print(NULL, dev, pipe, buffer, transfer_len,
        */
 
        case RH_GET_STATUS:
-               *(__u16 *) data_buf = cpu_to_le16(1);
+               *(u16 *)databuf = cpu_to_le16(1);
                OK(2);
        case RH_GET_STATUS | RH_INTERFACE:
-               *(__u16 *) data_buf = cpu_to_le16(0);
+               *(u16 *)databuf = cpu_to_le16(0);
                OK(2);
        case RH_GET_STATUS | RH_ENDPOINT:
-               *(__u16 *) data_buf = cpu_to_le16(0);
+               *(u16 *)databuf = cpu_to_le16(0);
                OK(2);
        case RH_GET_STATUS | RH_CLASS:
-               *(__u32 *) data_buf = cpu_to_le32(
+               *(u32 *)databuf = cpu_to_le32(
                                RD_RH_STAT & ~(RH_HS_CRWE | RH_HS_DRWE));
                OK(4);
        case RH_GET_STATUS | RH_OTHER | RH_CLASS:
-               *(__u32 *) data_buf = cpu_to_le32(RD_RH_PORTSTAT);
+               *(u32 *)databuf = cpu_to_le32(RD_RH_PORTSTAT);
                OK(4);
 
        case RH_CLEAR_FEATURE | RH_ENDPOINT:
@@ -1353,7 +1351,7 @@ pkt_print(NULL, dev, pipe, buffer, transfer_len,
                        OK(0);
                case (RH_PORT_POWER):
                        WR_RH_PORTSTAT(RH_PS_PPS);
-                       wait_ms(100);
+                       mdelay(100);
                        OK(0);
                case (RH_PORT_ENABLE): /* BUG IN HUP CODE *********/
                        if (RD_RH_PORTSTAT & RH_PS_CCS)
@@ -1374,14 +1372,14 @@ pkt_print(NULL, dev, pipe, buffer, transfer_len,
                                        min_t(unsigned int,
                                        sizeof(root_hub_dev_des),
                                        wLength));
-                       data_buf = root_hub_dev_des; OK(len);
+                       databuf = root_hub_dev_des; OK(len);
                case (0x02): /* configuration descriptor */
                        len = min_t(unsigned int,
                                        leni,
                                        min_t(unsigned int,
                                        sizeof(root_hub_config_des),
                                        wLength));
-                       data_buf = root_hub_config_des; OK(len);
+                       databuf = root_hub_config_des; OK(len);
                case (0x03): /* string descriptors */
                        if (wValue == 0x0300) {
                                len = min_t(unsigned int,
@@ -1389,7 +1387,7 @@ pkt_print(NULL, dev, pipe, buffer, transfer_len,
                                                min_t(unsigned int,
                                                sizeof(root_hub_str_index0),
                                                wLength));
-                               data_buf = root_hub_str_index0;
+                               databuf = root_hub_str_index0;
                                OK(len);
                        }
                        if (wValue == 0x0301) {
@@ -1398,7 +1396,7 @@ pkt_print(NULL, dev, pipe, buffer, transfer_len,
                                                min_t(unsigned int,
                                                sizeof(root_hub_str_index1),
                                                wLength));
-                               data_buf = root_hub_str_index1;
+                               databuf = root_hub_str_index1;
                                OK(len);
                }
                default:
@@ -1410,41 +1408,45 @@ pkt_print(NULL, dev, pipe, buffer, transfer_len,
        {
                __u32 temp = roothub_a(&gohci);
 
-               data_buf [0] = 9;               /* min length; */
-               data_buf [1] = 0x29;
-               data_buf [2] = temp & RH_A_NDP;
+               databuf[0] = 9;         /* min length; */
+               databuf[1] = 0x29;
+               databuf[2] = temp & RH_A_NDP;
 #ifdef CONFIG_AT91C_PQFP_UHPBUG
-               data_buf [2] = (data_buf [2] == 2) ? 1:0;
+               databuf[2] = (databuf[2] == 2) ? 1 : 0;
 #endif
-               data_buf [3] = 0;
+               databuf[3] = 0;
                if (temp & RH_A_PSM)    /* per-port power switching? */
-                       data_buf [3] |= 0x1;
+                       databuf[3] |= 0x1;
                if (temp & RH_A_NOCP)   /* no overcurrent reporting? */
-                       data_buf [3] |= 0x10;
+                       databuf[3] |= 0x10;
                else if (temp & RH_A_OCPM)/* per-port overcurrent reporting? */
-                       data_buf [3] |= 0x8;
+                       databuf[3] |= 0x8;
 
-               /* corresponds to data_buf[4-7] */
-               datab [1] = 0;
-               data_buf [5] = (temp & RH_A_POTPGT) >> 24;
+               databuf[4] = 0;
+               databuf[5] = (temp & RH_A_POTPGT) >> 24;
+               databuf[6] = 0;
                temp = roothub_b(&gohci);
-               data_buf [7] = temp & RH_B_DR;
-               if (data_buf [2] < 7) {
-                       data_buf [8] = 0xff;
+               databuf[7] = temp & RH_B_DR;
+               if (databuf[2] < 7) {
+                       databuf[8] = 0xff;
                } else {
-                       data_buf [0] += 2;
-                       data_buf [8] = (temp & RH_B_DR) >> 8;
-                       data_buf [10] = data_buf [9] = 0xff;
+                       databuf[0] += 2;
+                       databuf[8] = (temp & RH_B_DR) >> 8;
+                       databuf[10] = databuf[9] = 0xff;
                }
 
                len = min_t(unsigned int, leni,
-                           min_t(unsigned int, data_buf [0], wLength));
+                           min_t(unsigned int, databuf[0], wLength));
                OK(len);
        }
 
-       case RH_GET_CONFIGURATION:      *(__u8 *) data_buf = 0x01; OK(1);
+       case RH_GET_CONFIGURATION:
+               databuf[0] = 0x01;
+               OK(1);
 
-       case RH_SET_CONFIGURATION:      WR_RH_STAT(0x10000); OK(0);
+       case RH_SET_CONFIGURATION:
+               WR_RH_STAT(0x10000);
+               OK(0);
 
        default:
                dbg("unsupported root hub command");
@@ -1454,12 +1456,12 @@ pkt_print(NULL, dev, pipe, buffer, transfer_len,
 #ifdef DEBUG
        ohci_dump_roothub(&gohci, 1);
 #else
-       wait_ms(1);
+       mdelay(1);
 #endif
 
        len = min_t(int, len, leni);
-       if (data != data_buf)
-           memcpy(data, data_buf, len);
+       if (data != databuf)
+               memcpy(data, databuf, len);
        dev->act_len = len;
        dev->status = stat;
 
@@ -1467,7 +1469,7 @@ pkt_print(NULL, dev, pipe, buffer, transfer_len,
        pkt_print(NULL, dev, pipe, buffer,
                  transfer_len, cmd, "RET(rh)", 0/*usb_pipein(pipe)*/);
 #else
-       wait_ms(1);
+       mdelay(1);
 #endif
 
        return stat;
@@ -1505,7 +1507,7 @@ int submit_common_msg(struct usb_device *dev, unsigned long pipe, void *buffer,
        pkt_print(urb, dev, pipe, buffer, transfer_len,
                  setup, "SUB", usb_pipein(pipe));
 #else
-       wait_ms(1);
+       mdelay(1);
 #endif
        if (!maxsize) {
                err("submit_common_message: pipesize for pipe %lx is zero",
@@ -1519,7 +1521,7 @@ int submit_common_msg(struct usb_device *dev, unsigned long pipe, void *buffer,
        }
 
 #if 0
-       wait_ms(10);
+       mdelay(10);
        /* ohci_dump_status(&gohci); */
 #endif
 
@@ -1549,7 +1551,7 @@ int submit_common_msg(struct usb_device *dev, unsigned long pipe, void *buffer,
                }
 
                if (--timeout) {
-                       wait_ms(1);
+                       mdelay(1);
                        if (!urb->finished)
                                dbg("*");
 
@@ -1569,7 +1571,7 @@ int submit_common_msg(struct usb_device *dev, unsigned long pipe, void *buffer,
        pkt_print(urb, dev, pipe, buffer, transfer_len,
                  setup, "RET(ctlr)", usb_pipein(pipe));
 #else
-       wait_ms(1);
+       mdelay(1);
 #endif
 
        /* free TDs in urb_priv */
@@ -1596,7 +1598,7 @@ int submit_control_msg(struct usb_device *dev, unsigned long pipe, void *buffer,
        pkt_print(NULL, dev, pipe, buffer, transfer_len,
                  setup, "SUB", usb_pipein(pipe));
 #else
-       wait_ms(1);
+       mdelay(1);
 #endif
        if (!maxsize) {
                err("submit_control_message: pipesize for pipe %lx is zero",
@@ -1666,7 +1668,7 @@ static int hc_reset(ohci_t *ohci)
                ohci_writel(OHCI_OCR, &ohci->regs->cmdstatus);
                info("USB HC TakeOver from SMM");
                while (ohci_readl(&ohci->regs->control) & OHCI_CTRL_IR) {
-                       wait_ms(10);
+                       mdelay(10);
                        if (--smm_timeout == 0) {
                                err("USB HC TakeOver failed!");
                                return -1;
@@ -1749,7 +1751,6 @@ static int hc_start(ohci_t *ohci)
        ohci_writel(RH_HS_LPSC, &ohci->regs->roothub.status);
 #endif /* OHCI_USE_NPS */
 
-#define mdelay(n) ({unsigned long msec = (n); while (msec--) udelay(1000); })
        /* POTPGT delay is bits 24-31, in 2 ms units. */
        mdelay((roothub_a(ohci) >> 23) & 0x1fe);
 
@@ -1761,12 +1762,6 @@ static int hc_start(ohci_t *ohci)
 
 /*-------------------------------------------------------------------------*/
 
-/* Poll USB interrupt. */
-void usb_event_poll(void)
-{
-       hc_interrupt();
-}
-
 /* an interrupt happens */
 
 static int hc_interrupt(void)
@@ -1809,7 +1804,7 @@ static int hc_interrupt(void)
 #ifdef DEBUG
                ohci_dump(ohci, 1);
 #else
-               wait_ms(1);
+               mdelay(1);
 #endif
                /* FIXME: be optimistic, hope that bug won't repeat often. */
                /* Make some non-interrupt context restart the controller. */
@@ -1820,7 +1815,7 @@ static int hc_interrupt(void)
        }
 
        if (ints & OHCI_INTR_WDH) {
-               wait_ms(1);
+               mdelay(1);
                ohci_writel(OHCI_INTR_WDH, &regs->intrdisable);
                (void)ohci_readl(&regs->intrdisable); /* flush */
                stat = dl_done_list(&gohci);
@@ -1837,7 +1832,7 @@ static int hc_interrupt(void)
        /* FIXME:  this assumes SOF (1/ms) interrupts don't get lost... */
        if (ints & OHCI_INTR_SF) {
                unsigned int frame = m16_swap(ohci->hcca->frame_no) & 1;
-               wait_ms(1);
+               mdelay(1);
                ohci_writel(OHCI_INTR_SF, &regs->intrdisable);
                if (ohci->ed_rm_list[frame] != NULL)
                        ohci_writel(OHCI_INTR_SF, &regs->intrenable);
@@ -1869,7 +1864,7 @@ static void hc_release_ohci(ohci_t *ohci)
  */
 static char ohci_inited = 0;
 
-int usb_lowlevel_init(void)
+int usb_lowlevel_init(int index, void **controller)
 {
 #ifdef CONFIG_PCI_OHCI
        pci_dev_t pdev;
@@ -1969,13 +1964,13 @@ int usb_lowlevel_init(void)
 #ifdef DEBUG
        ohci_dump(&gohci, 1);
 #else
-       wait_ms(1);
+       mdelay(1);
 #endif
        ohci_inited = 1;
        return 0;
 }
 
-int usb_lowlevel_stop(void)
+int usb_lowlevel_stop(int index)
 {
        /* this gets called really early - before the controller has */
        /* even been initialized! */