2  * SL811HS HCD (Host Controller Driver) for USB.
 
   4  * Copyright (C) 2004 Psion Teklogix (for NetBook PRO)
 
   5  * Copyright (C) 2004-2005 David Brownell
 
   7  * Periodic scheduling is based on Roman's OHCI code
 
   8  *      Copyright (C) 1999 Roman Weissgaerber
 
  10  * The SL811HS controller handles host side USB (like the SL11H, but with
 
  11  * another register set and SOF generation) as well as peripheral side USB
 
  12  * (like the SL811S).  This driver version doesn't implement the Gadget API
 
  13  * for the peripheral role; or OTG (that'd need much external circuitry).
 
  15  * For documentation, see the SL811HS spec and the "SL811HS Embedded Host"
 
  16  * document (providing significant pieces missing from that spec); plus
 
  17  * the SL811S spec if you want peripheral side info.
 
  21  * Status:  Passed basic stress testing, works with hubs, mice, keyboards,
 
  25  * - usb suspend/resume triggered by sl811 (with USB_SUSPEND)
 
  26  * - various issues noted in the code
 
  27  * - performance work; use both register banks; ...
 
  28  * - use urb->iso_frame_desc[] with ISO transfers
 
  34 #include <linux/module.h>
 
  35 #include <linux/moduleparam.h>
 
  36 #include <linux/kernel.h>
 
  37 #include <linux/delay.h>
 
  38 #include <linux/ioport.h>
 
  39 #include <linux/sched.h>
 
  40 #include <linux/slab.h>
 
  41 #include <linux/errno.h>
 
  42 #include <linux/init.h>
 
  43 #include <linux/timer.h>
 
  44 #include <linux/list.h>
 
  45 #include <linux/interrupt.h>
 
  46 #include <linux/usb.h>
 
  47 #include <linux/usb/sl811.h>
 
  48 #include <linux/platform_device.h>
 
  52 #include <asm/system.h>
 
  53 #include <asm/byteorder.h>
 
  55 #include "../core/hcd.h"
 
  59 MODULE_DESCRIPTION("SL811HS USB Host Controller Driver");
 
  60 MODULE_LICENSE("GPL");
 
  61 MODULE_ALIAS("platform:sl811-hcd");
 
  63 #define DRIVER_VERSION  "19 May 2005"
 
  67 #       define  STUB_DEBUG_FILE
 
  70 /* for now, use only one transfer register bank */
 
  73 /* this doesn't understand urb->iso_frame_desc[], but if you had a driver
 
  74  * that just queued one ISO frame per URB then iso transfers "should" work
 
  75  * using the normal urb status fields.
 
  82 static const char hcd_name[] = "sl811-hcd";
 
  84 /*-------------------------------------------------------------------------*/
 
  86 static void port_power(struct sl811 *sl811, int is_on)
 
  88         struct usb_hcd  *hcd = sl811_to_hcd(sl811);
 
  90         /* hub is inactive unless the port is powered */
 
  92                 if (sl811->port1 & (1 << USB_PORT_FEAT_POWER))
 
  95                 sl811->port1 = (1 << USB_PORT_FEAT_POWER);
 
  96                 sl811->irq_enable = SL11H_INTMASK_INSRMV;
 
  99                 sl811->irq_enable = 0;
 
 100                 hcd->state = HC_STATE_HALT;
 
 103         sl811_write(sl811, SL11H_IRQ_ENABLE, 0);
 
 104         sl811_write(sl811, SL11H_IRQ_STATUS, ~0);
 
 106         if (sl811->board && sl811->board->port_power) {
 
 107                 /* switch VBUS, at 500mA unless hub power budget gets set */
 
 108                 DBG("power %s\n", is_on ? "on" : "off");
 
 109                 sl811->board->port_power(hcd->self.controller, is_on);
 
 112         /* reset as thoroughly as we can */
 
 113         if (sl811->board && sl811->board->reset)
 
 114                 sl811->board->reset(hcd->self.controller);
 
 116                 sl811_write(sl811, SL11H_CTLREG1, SL11H_CTL1MASK_SE0);
 
 120         sl811_write(sl811, SL11H_IRQ_ENABLE, 0);
 
 121         sl811_write(sl811, SL11H_CTLREG1, sl811->ctrl1);
 
 122         sl811_write(sl811, SL811HS_CTLREG2, SL811HS_CTL2_INIT);
 
 123         sl811_write(sl811, SL11H_IRQ_ENABLE, sl811->irq_enable);
 
 125         // if !is_on, put into lowpower mode now
 
 128 /*-------------------------------------------------------------------------*/
 
 130 /* This is a PIO-only HCD.  Queueing appends URBs to the endpoint's queue,
 
 131  * and may start I/O.  Endpoint queues are scanned during completion irq
 
 132  * handlers (one per packet: ACK, NAK, faults, etc) and urb cancellation.
 
 134  * Using an external DMA engine to copy a packet at a time could work,
 
 135  * though setup/teardown costs may be too big to make it worthwhile.
 
 138 /* SETUP starts a new control request.  Devices are not allowed to
 
 139  * STALL or NAK these; they must cancel any pending control requests.
 
 141 static void setup_packet(
 
 143         struct sl811h_ep        *ep,
 
 151         void __iomem            *data_reg;
 
 153         addr = SL811HS_PACKET_BUF(bank == 0);
 
 154         len = sizeof(struct usb_ctrlrequest);
 
 155         data_reg = sl811->data_reg;
 
 156         sl811_write_buf(sl811, addr, urb->setup_packet, len);
 
 158         /* autoincrementing */
 
 159         sl811_write(sl811, bank + SL11H_BUFADDRREG, addr);
 
 160         writeb(len, data_reg);
 
 161         writeb(SL_SETUP /* | ep->epnum */, data_reg);
 
 162         writeb(usb_pipedevice(urb->pipe), data_reg);
 
 164         /* always OUT/data0 */ ;
 
 165         sl811_write(sl811, bank + SL11H_HOSTCTLREG,
 
 166                         control | SL11H_HCTLMASK_OUT);
 
 168         PACKET("SETUP qh%p\n", ep);
 
 171 /* STATUS finishes control requests, often after IN or OUT data packets */
 
 172 static void status_packet(
 
 174         struct sl811h_ep        *ep,
 
 181         void __iomem            *data_reg;
 
 183         do_out = urb->transfer_buffer_length && usb_pipein(urb->pipe);
 
 184         data_reg = sl811->data_reg;
 
 186         /* autoincrementing */
 
 187         sl811_write(sl811, bank + SL11H_BUFADDRREG, 0);
 
 189         writeb((do_out ? SL_OUT : SL_IN) /* | ep->epnum */, data_reg);
 
 190         writeb(usb_pipedevice(urb->pipe), data_reg);
 
 192         /* always data1; sometimes IN */
 
 193         control |= SL11H_HCTLMASK_TOGGLE;
 
 195                 control |= SL11H_HCTLMASK_OUT;
 
 196         sl811_write(sl811, bank + SL11H_HOSTCTLREG, control);
 
 198         PACKET("STATUS%s/%s qh%p\n", ep->nak_count ? "/retry" : "",
 
 199                         do_out ? "out" : "in", ep);
 
 202 /* IN packets can be used with any type of endpoint. here we just
 
 203  * start the transfer, data from the peripheral may arrive later.
 
 204  * urb->iso_frame_desc is currently ignored here...
 
 206 static void in_packet(
 
 208         struct sl811h_ep        *ep,
 
 216         void __iomem            *data_reg;
 
 218         /* avoid losing data on overflow */
 
 220         addr = SL811HS_PACKET_BUF(bank == 0);
 
 221         if (!(control & SL11H_HCTLMASK_ISOCH)
 
 222                         && usb_gettoggle(urb->dev, ep->epnum, 0))
 
 223                 control |= SL11H_HCTLMASK_TOGGLE;
 
 224         data_reg = sl811->data_reg;
 
 226         /* autoincrementing */
 
 227         sl811_write(sl811, bank + SL11H_BUFADDRREG, addr);
 
 228         writeb(len, data_reg);
 
 229         writeb(SL_IN | ep->epnum, data_reg);
 
 230         writeb(usb_pipedevice(urb->pipe), data_reg);
 
 232         sl811_write(sl811, bank + SL11H_HOSTCTLREG, control);
 
 233         ep->length = min((int)len,
 
 234                         urb->transfer_buffer_length - urb->actual_length);
 
 235         PACKET("IN%s/%d qh%p len%d\n", ep->nak_count ? "/retry" : "",
 
 236                         !!usb_gettoggle(urb->dev, ep->epnum, 0), ep, len);
 
 239 /* OUT packets can be used with any type of endpoint.
 
 240  * urb->iso_frame_desc is currently ignored here...
 
 242 static void out_packet(
 
 244         struct sl811h_ep        *ep,
 
 253         void __iomem            *data_reg;
 
 255         buf = urb->transfer_buffer + urb->actual_length;
 
 258         len = min((int)ep->maxpacket,
 
 259                         urb->transfer_buffer_length - urb->actual_length);
 
 261         if (!(control & SL11H_HCTLMASK_ISOCH)
 
 262                         && usb_gettoggle(urb->dev, ep->epnum, 1))
 
 263                 control |= SL11H_HCTLMASK_TOGGLE;
 
 264         addr = SL811HS_PACKET_BUF(bank == 0);
 
 265         data_reg = sl811->data_reg;
 
 267         sl811_write_buf(sl811, addr, buf, len);
 
 269         /* autoincrementing */
 
 270         sl811_write(sl811, bank + SL11H_BUFADDRREG, addr);
 
 271         writeb(len, data_reg);
 
 272         writeb(SL_OUT | ep->epnum, data_reg);
 
 273         writeb(usb_pipedevice(urb->pipe), data_reg);
 
 275         sl811_write(sl811, bank + SL11H_HOSTCTLREG,
 
 276                         control | SL11H_HCTLMASK_OUT);
 
 278         PACKET("OUT%s/%d qh%p len%d\n", ep->nak_count ? "/retry" : "",
 
 279                         !!usb_gettoggle(urb->dev, ep->epnum, 1), ep, len);
 
 282 /*-------------------------------------------------------------------------*/
 
 284 /* caller updates on-chip enables later */
 
 286 static inline void sofirq_on(struct sl811 *sl811)
 
 288         if (sl811->irq_enable & SL11H_INTMASK_SOFINTR)
 
 290         VDBG("sof irq on\n");
 
 291         sl811->irq_enable |= SL11H_INTMASK_SOFINTR;
 
 294 static inline void sofirq_off(struct sl811 *sl811)
 
 296         if (!(sl811->irq_enable & SL11H_INTMASK_SOFINTR))
 
 298         VDBG("sof irq off\n");
 
 299         sl811->irq_enable &= ~SL11H_INTMASK_SOFINTR;
 
 302 /*-------------------------------------------------------------------------*/
 
 304 /* pick the next endpoint for a transaction, and issue it.
 
 305  * frames start with periodic transfers (after whatever is pending
 
 306  * from the previous frame), and the rest of the time is async
 
 307  * transfers, scheduled round-robin.
 
 309 static struct sl811h_ep *start(struct sl811 *sl811, u8 bank)
 
 311         struct sl811h_ep        *ep;
 
 316         /* use endpoint at schedule head */
 
 317         if (sl811->next_periodic) {
 
 318                 ep = sl811->next_periodic;
 
 319                 sl811->next_periodic = ep->next;
 
 321                 if (sl811->next_async)
 
 322                         ep = sl811->next_async;
 
 323                 else if (!list_empty(&sl811->async))
 
 324                         ep = container_of(sl811->async.next,
 
 325                                         struct sl811h_ep, schedule);
 
 327                         /* could set up the first fullspeed periodic
 
 328                          * transfer for the next frame ...
 
 334                 if ((bank && sl811->active_b == ep) || sl811->active_a == ep)
 
 338                 if (ep->schedule.next == &sl811->async)
 
 339                         sl811->next_async = NULL;
 
 341                         sl811->next_async = container_of(ep->schedule.next,
 
 342                                         struct sl811h_ep, schedule);
 
 345         if (unlikely(list_empty(&ep->hep->urb_list))) {
 
 346                 DBG("empty %p queue?\n", ep);
 
 350         urb = container_of(ep->hep->urb_list.next, struct urb, urb_list);
 
 351         control = ep->defctrl;
 
 353         /* if this frame doesn't have enough time left to transfer this
 
 354          * packet, wait till the next frame.  too-simple algorithm...
 
 356         fclock = sl811_read(sl811, SL11H_SOFTMRREG) << 6;
 
 357         fclock -= 100;          /* setup takes not much time */
 
 358         if (urb->dev->speed == USB_SPEED_LOW) {
 
 359                 if (control & SL11H_HCTLMASK_PREAMBLE) {
 
 360                         /* also note erratum 1: some hubs won't work */
 
 363                 fclock -= ep->maxpacket << 8;
 
 365                 /* erratum 2: AFTERSOF only works for fullspeed */
 
 368                                 sl811->stat_overrun++;
 
 373                 fclock -= 12000 / 19;   /* 19 64byte packets/msec */
 
 376                                 sl811->stat_overrun++;
 
 377                         control |= SL11H_HCTLMASK_AFTERSOF;
 
 379                 /* throttle bulk/control irq noise */
 
 380                 } else if (ep->nak_count)
 
 381                         control |= SL11H_HCTLMASK_AFTERSOF;
 
 385         switch (ep->nextpid) {
 
 387                 in_packet(sl811, ep, urb, bank, control);
 
 390                 out_packet(sl811, ep, urb, bank, control);
 
 393                 setup_packet(sl811, ep, urb, bank, control);
 
 395         case USB_PID_ACK:               /* for control status */
 
 396                 status_packet(sl811, ep, urb, bank, control);
 
 399                 DBG("bad ep%p pid %02x\n", ep, ep->nextpid);
 
 405 #define MIN_JIFFIES     ((msecs_to_jiffies(2) > 1) ? msecs_to_jiffies(2) : 2)
 
 407 static inline void start_transfer(struct sl811 *sl811)
 
 409         if (sl811->port1 & (1 << USB_PORT_FEAT_SUSPEND))
 
 411         if (sl811->active_a == NULL) {
 
 412                 sl811->active_a = start(sl811, SL811_EP_A(SL811_HOST_BUF));
 
 413                 if (sl811->active_a != NULL)
 
 414                         sl811->jiffies_a = jiffies + MIN_JIFFIES;
 
 417         if (sl811->active_b == NULL) {
 
 418                 sl811->active_b = start(sl811, SL811_EP_B(SL811_HOST_BUF));
 
 419                 if (sl811->active_b != NULL)
 
 420                         sl811->jiffies_b = jiffies + MIN_JIFFIES;
 
 425 static void finish_request(
 
 427         struct sl811h_ep        *ep,
 
 430 ) __releases(sl811->lock) __acquires(sl811->lock)
 
 434         if (usb_pipecontrol(urb->pipe))
 
 435                 ep->nextpid = USB_PID_SETUP;
 
 437         usb_hcd_unlink_urb_from_ep(sl811_to_hcd(sl811), urb);
 
 438         spin_unlock(&sl811->lock);
 
 439         usb_hcd_giveback_urb(sl811_to_hcd(sl811), urb, status);
 
 440         spin_lock(&sl811->lock);
 
 442         /* leave active endpoints in the schedule */
 
 443         if (!list_empty(&ep->hep->urb_list))
 
 446         /* async deschedule? */
 
 447         if (!list_empty(&ep->schedule)) {
 
 448                 list_del_init(&ep->schedule);
 
 449                 if (ep == sl811->next_async)
 
 450                         sl811->next_async = NULL;
 
 454         /* periodic deschedule */
 
 455         DBG("deschedule qh%d/%p branch %d\n", ep->period, ep, ep->branch);
 
 456         for (i = ep->branch; i < PERIODIC_SIZE; i += ep->period) {
 
 457                 struct sl811h_ep        *temp;
 
 458                 struct sl811h_ep        **prev = &sl811->periodic[i];
 
 460                 while (*prev && ((temp = *prev) != ep))
 
 464                 sl811->load[i] -= ep->load;
 
 466         ep->branch = PERIODIC_SIZE;
 
 467         sl811->periodic_count--;
 
 468         sl811_to_hcd(sl811)->self.bandwidth_allocated
 
 469                 -= ep->load / ep->period;
 
 470         if (ep == sl811->next_periodic)
 
 471                 sl811->next_periodic = ep->next;
 
 473         /* we might turn SOFs back on again for the async schedule */
 
 474         if (sl811->periodic_count == 0)
 
 479 done(struct sl811 *sl811, struct sl811h_ep *ep, u8 bank)
 
 483         int                     urbstat = -EINPROGRESS;
 
 488         status = sl811_read(sl811, bank + SL11H_PKTSTATREG);
 
 490         urb = container_of(ep->hep->urb_list.next, struct urb, urb_list);
 
 492         /* we can safely ignore NAKs */
 
 493         if (status & SL11H_STATMASK_NAK) {
 
 494                 // PACKET("...NAK_%02x qh%p\n", bank, ep);
 
 499         /* ACK advances transfer, toggle, and maybe queue */
 
 500         } else if (status & SL11H_STATMASK_ACK) {
 
 501                 struct usb_device       *udev = urb->dev;
 
 505                 /* urb->iso_frame_desc is currently ignored here... */
 
 507                 ep->nak_count = ep->error_count = 0;
 
 508                 switch (ep->nextpid) {
 
 510                         // PACKET("...ACK/out_%02x qh%p\n", bank, ep);
 
 511                         urb->actual_length += ep->length;
 
 512                         usb_dotoggle(udev, ep->epnum, 1);
 
 513                         if (urb->actual_length
 
 514                                         == urb->transfer_buffer_length) {
 
 515                                 if (usb_pipecontrol(urb->pipe))
 
 516                                         ep->nextpid = USB_PID_ACK;
 
 518                                 /* some bulk protocols terminate OUT transfers
 
 519                                  * by a short packet, using ZLPs not padding.
 
 521                                 else if (ep->length < ep->maxpacket
 
 522                                                 || !(urb->transfer_flags
 
 528                         // PACKET("...ACK/in_%02x qh%p\n", bank, ep);
 
 529                         buf = urb->transfer_buffer + urb->actual_length;
 
 531                         len = ep->maxpacket - sl811_read(sl811,
 
 532                                                 bank + SL11H_XFERCNTREG);
 
 533                         if (len > ep->length) {
 
 535                                 urbstat = -EOVERFLOW;
 
 537                         urb->actual_length += len;
 
 538                         sl811_read_buf(sl811, SL811HS_PACKET_BUF(bank == 0),
 
 540                         usb_dotoggle(udev, ep->epnum, 0);
 
 541                         if (urbstat == -EINPROGRESS &&
 
 542                                         (len < ep->maxpacket ||
 
 543                                                 urb->actual_length ==
 
 544                                                 urb->transfer_buffer_length)) {
 
 545                                 if (usb_pipecontrol(urb->pipe))
 
 546                                         ep->nextpid = USB_PID_ACK;
 
 552                         // PACKET("...ACK/setup_%02x qh%p\n", bank, ep);
 
 553                         if (urb->transfer_buffer_length == urb->actual_length)
 
 554                                 ep->nextpid = USB_PID_ACK;
 
 555                         else if (usb_pipeout(urb->pipe)) {
 
 556                                 usb_settoggle(udev, 0, 1, 1);
 
 557                                 ep->nextpid = USB_PID_OUT;
 
 559                                 usb_settoggle(udev, 0, 0, 1);
 
 560                                 ep->nextpid = USB_PID_IN;
 
 564                         // PACKET("...ACK/status_%02x qh%p\n", bank, ep);
 
 569         /* STALL stops all transfers */
 
 570         } else if (status & SL11H_STATMASK_STALL) {
 
 571                 PACKET("...STALL_%02x qh%p\n", bank, ep);
 
 572                 ep->nak_count = ep->error_count = 0;
 
 575         /* error? retry, until "3 strikes" */
 
 576         } else if (++ep->error_count >= 3) {
 
 577                 if (status & SL11H_STATMASK_TMOUT)
 
 579                 else if (status & SL11H_STATMASK_OVF)
 
 580                         urbstat = -EOVERFLOW;
 
 584                 PACKET("...3STRIKES_%02x %02x qh%p stat %d\n",
 
 585                                 bank, status, ep, urbstat);
 
 588         if (urbstat != -EINPROGRESS || urb->unlinked)
 
 589                 finish_request(sl811, ep, urb, urbstat);
 
 592 static inline u8 checkdone(struct sl811 *sl811)
 
 597         if (sl811->active_a && time_before_eq(sl811->jiffies_a, jiffies)) {
 
 598                 ctl = sl811_read(sl811, SL811_EP_A(SL11H_HOSTCTLREG));
 
 599                 if (ctl & SL11H_HCTLMASK_ARM)
 
 600                         sl811_write(sl811, SL811_EP_A(SL11H_HOSTCTLREG), 0);
 
 601                 DBG("%s DONE_A: ctrl %02x sts %02x\n",
 
 602                         (ctl & SL11H_HCTLMASK_ARM) ? "timeout" : "lost",
 
 604                         sl811_read(sl811, SL811_EP_A(SL11H_PKTSTATREG)));
 
 605                 irqstat |= SL11H_INTMASK_DONE_A;
 
 608         if (sl811->active_b && time_before_eq(sl811->jiffies_b, jiffies)) {
 
 609                 ctl = sl811_read(sl811, SL811_EP_B(SL11H_HOSTCTLREG));
 
 610                 if (ctl & SL11H_HCTLMASK_ARM)
 
 611                         sl811_write(sl811, SL811_EP_B(SL11H_HOSTCTLREG), 0);
 
 612                 DBG("%s DONE_B: ctrl %02x sts %02x\n",
 
 613                         (ctl & SL11H_HCTLMASK_ARM) ? "timeout" : "lost",
 
 615                         sl811_read(sl811, SL811_EP_B(SL11H_PKTSTATREG)));
 
 616                 irqstat |= SL11H_INTMASK_DONE_A;
 
 622 static irqreturn_t sl811h_irq(struct usb_hcd *hcd)
 
 624         struct sl811    *sl811 = hcd_to_sl811(hcd);
 
 626         irqreturn_t     ret = IRQ_NONE;
 
 627         unsigned        retries = 5;
 
 629         spin_lock(&sl811->lock);
 
 632         irqstat = sl811_read(sl811, SL11H_IRQ_STATUS) & ~SL11H_INTMASK_DP;
 
 634                 sl811_write(sl811, SL11H_IRQ_STATUS, irqstat);
 
 635                 irqstat &= sl811->irq_enable;
 
 639         /* this may no longer be necessary ... */
 
 641                 irqstat = checkdone(sl811);
 
 647         /* USB packets, not necessarily handled in the order they're
 
 648          * issued ... that's fine if they're different endpoints.
 
 650         if (irqstat & SL11H_INTMASK_DONE_A) {
 
 651                 done(sl811, sl811->active_a, SL811_EP_A(SL811_HOST_BUF));
 
 652                 sl811->active_a = NULL;
 
 656         if (irqstat & SL11H_INTMASK_DONE_B) {
 
 657                 done(sl811, sl811->active_b, SL811_EP_B(SL811_HOST_BUF));
 
 658                 sl811->active_b = NULL;
 
 662         if (irqstat & SL11H_INTMASK_SOFINTR) {
 
 665                 index = sl811->frame++ % (PERIODIC_SIZE - 1);
 
 668                 /* be graceful about almost-inevitable periodic schedule
 
 669                  * overruns:  continue the previous frame's transfers iff
 
 670                  * this one has nothing scheduled.
 
 672                 if (sl811->next_periodic) {
 
 673                         // ERR("overrun to slot %d\n", index);
 
 674                         sl811->stat_overrun++;
 
 676                 if (sl811->periodic[index])
 
 677                         sl811->next_periodic = sl811->periodic[index];
 
 680         /* khubd manages debouncing and wakeup */
 
 681         if (irqstat & SL11H_INTMASK_INSRMV) {
 
 682                 sl811->stat_insrmv++;
 
 684                 /* most stats are reset for each VBUS session */
 
 685                 sl811->stat_wake = 0;
 
 689                 sl811->stat_lost = 0;
 
 692                 sl811_write(sl811, SL11H_CTLREG1, sl811->ctrl1);
 
 694                 sl811->irq_enable = SL11H_INTMASK_INSRMV;
 
 695                 sl811_write(sl811, SL11H_IRQ_ENABLE, sl811->irq_enable);
 
 697                 /* usbcore nukes other pending transactions on disconnect */
 
 698                 if (sl811->active_a) {
 
 699                         sl811_write(sl811, SL811_EP_A(SL11H_HOSTCTLREG), 0);
 
 700                         finish_request(sl811, sl811->active_a,
 
 701                                 container_of(sl811->active_a
 
 702                                                 ->hep->urb_list.next,
 
 703                                         struct urb, urb_list),
 
 705                         sl811->active_a = NULL;
 
 708                 if (sl811->active_b) {
 
 709                         sl811_write(sl811, SL811_EP_B(SL11H_HOSTCTLREG), 0);
 
 710                         finish_request(sl811, sl811->active_b,
 
 711                                 container_of(sl811->active_b
 
 712                                                 ->hep->urb_list.next,
 
 713                                         struct urb, urb_list),
 
 715                         sl811->active_b = NULL;
 
 719                 /* port status seems weird until after reset, so
 
 720                  * force the reset and make khubd clean up later.
 
 722                 sl811->port1 |= (1 << USB_PORT_FEAT_C_CONNECTION)
 
 723                                 | (1 << USB_PORT_FEAT_CONNECTION);
 
 725         } else if (irqstat & SL11H_INTMASK_RD) {
 
 726                 if (sl811->port1 & (1 << USB_PORT_FEAT_SUSPEND)) {
 
 728                         sl811->port1 |= 1 << USB_PORT_FEAT_C_SUSPEND;
 
 731                         irqstat &= ~SL11H_INTMASK_RD;
 
 735                 if (sl811->port1 & (1 << USB_PORT_FEAT_ENABLE))
 
 736                         start_transfer(sl811);
 
 742         if (sl811->periodic_count == 0 && list_empty(&sl811->async))
 
 744         sl811_write(sl811, SL11H_IRQ_ENABLE, sl811->irq_enable);
 
 746         spin_unlock(&sl811->lock);
 
 751 /*-------------------------------------------------------------------------*/
 
 753 /* usb 1.1 says max 90% of a frame is available for periodic transfers.
 
 754  * this driver doesn't promise that much since it's got to handle an
 
 755  * IRQ per packet; irq handling latencies also use up that time.
 
 757  * NOTE:  the periodic schedule is a sparse tree, with the load for
 
 758  * each branch minimized.  see fig 3.5 in the OHCI spec for example.
 
 760 #define MAX_PERIODIC_LOAD       500     /* out of 1000 usec */
 
 762 static int balance(struct sl811 *sl811, u16 period, u16 load)
 
 764         int     i, branch = -ENOSPC;
 
 766         /* search for the least loaded schedule branch of that period
 
 767          * which has enough bandwidth left unreserved.
 
 769         for (i = 0; i < period ; i++) {
 
 770                 if (branch < 0 || sl811->load[branch] > sl811->load[i]) {
 
 773                         for (j = i; j < PERIODIC_SIZE; j += period) {
 
 774                                 if ((sl811->load[j] + load)
 
 778                         if (j < PERIODIC_SIZE)
 
 786 /*-------------------------------------------------------------------------*/
 
 788 static int sl811h_urb_enqueue(
 
 793         struct sl811            *sl811 = hcd_to_sl811(hcd);
 
 794         struct usb_device       *udev = urb->dev;
 
 795         unsigned int            pipe = urb->pipe;
 
 796         int                     is_out = !usb_pipein(pipe);
 
 797         int                     type = usb_pipetype(pipe);
 
 798         int                     epnum = usb_pipeendpoint(pipe);
 
 799         struct sl811h_ep        *ep = NULL;
 
 803         struct usb_host_endpoint        *hep = urb->ep;
 
 806         if (type == PIPE_ISOCHRONOUS)
 
 810         /* avoid all allocations within spinlocks */
 
 812                 ep = kzalloc(sizeof *ep, mem_flags);
 
 814         spin_lock_irqsave(&sl811->lock, flags);
 
 816         /* don't submit to a dead or disabled port */
 
 817         if (!(sl811->port1 & (1 << USB_PORT_FEAT_ENABLE))
 
 818                         || !HC_IS_RUNNING(hcd->state)) {
 
 821                 goto fail_not_linked;
 
 823         retval = usb_hcd_link_urb_to_ep(hcd, urb);
 
 826                 goto fail_not_linked;
 
 837                 INIT_LIST_HEAD(&ep->schedule);
 
 840                 ep->maxpacket = usb_maxpacket(udev, urb->pipe, is_out);
 
 841                 ep->defctrl = SL11H_HCTLMASK_ARM | SL11H_HCTLMASK_ENABLE;
 
 842                 usb_settoggle(udev, epnum, is_out, 0);
 
 844                 if (type == PIPE_CONTROL)
 
 845                         ep->nextpid = USB_PID_SETUP;
 
 847                         ep->nextpid = USB_PID_OUT;
 
 849                         ep->nextpid = USB_PID_IN;
 
 851                 if (ep->maxpacket > H_MAXPACKET) {
 
 852                         /* iso packets up to 240 bytes could work... */
 
 853                         DBG("dev %d ep%d maxpacket %d\n",
 
 854                                 udev->devnum, epnum, ep->maxpacket);
 
 859                 if (udev->speed == USB_SPEED_LOW) {
 
 860                         /* send preamble for external hub? */
 
 861                         if (!(sl811->ctrl1 & SL11H_CTL1MASK_LSPD))
 
 862                                 ep->defctrl |= SL11H_HCTLMASK_PREAMBLE;
 
 865                 case PIPE_ISOCHRONOUS:
 
 867                         if (urb->interval > PERIODIC_SIZE)
 
 868                                 urb->interval = PERIODIC_SIZE;
 
 869                         ep->period = urb->interval;
 
 870                         ep->branch = PERIODIC_SIZE;
 
 871                         if (type == PIPE_ISOCHRONOUS)
 
 872                                 ep->defctrl |= SL11H_HCTLMASK_ISOCH;
 
 873                         ep->load = usb_calc_bus_time(udev->speed, !is_out,
 
 874                                 (type == PIPE_ISOCHRONOUS),
 
 875                                 usb_maxpacket(udev, pipe, is_out))
 
 884         /* maybe put endpoint into schedule */
 
 888                 if (list_empty(&ep->schedule))
 
 889                         list_add_tail(&ep->schedule, &sl811->async);
 
 891         case PIPE_ISOCHRONOUS:
 
 893                 urb->interval = ep->period;
 
 894                 if (ep->branch < PERIODIC_SIZE) {
 
 895                         /* NOTE:  the phase is correct here, but the value
 
 896                          * needs offsetting by the transfer queue depth.
 
 897                          * All current drivers ignore start_frame, so this
 
 898                          * is unlikely to ever matter...
 
 900                         urb->start_frame = (sl811->frame & (PERIODIC_SIZE - 1))
 
 905                 retval = balance(sl811, ep->period, ep->load);
 
 910                 urb->start_frame = (sl811->frame & (PERIODIC_SIZE - 1))
 
 913                 /* sort each schedule branch by period (slow before fast)
 
 914                  * to share the faster parts of the tree without needing
 
 915                  * dummy/placeholder nodes
 
 917                 DBG("schedule qh%d/%p branch %d\n", ep->period, ep, ep->branch);
 
 918                 for (i = ep->branch; i < PERIODIC_SIZE; i += ep->period) {
 
 919                         struct sl811h_ep        **prev = &sl811->periodic[i];
 
 920                         struct sl811h_ep        *here = *prev;
 
 922                         while (here && ep != here) {
 
 923                                 if (ep->period > here->period)
 
 932                         sl811->load[i] += ep->load;
 
 934                 sl811->periodic_count++;
 
 935                 hcd->self.bandwidth_allocated += ep->load / ep->period;
 
 940         start_transfer(sl811);
 
 941         sl811_write(sl811, SL11H_IRQ_ENABLE, sl811->irq_enable);
 
 944                 usb_hcd_unlink_urb_from_ep(hcd, urb);
 
 946         spin_unlock_irqrestore(&sl811->lock, flags);
 
 950 static int sl811h_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status)
 
 952         struct sl811            *sl811 = hcd_to_sl811(hcd);
 
 953         struct usb_host_endpoint *hep;
 
 955         struct sl811h_ep        *ep;
 
 958         spin_lock_irqsave(&sl811->lock, flags);
 
 959         retval = usb_hcd_check_unlink_urb(hcd, urb, status);
 
 966                 /* finish right away if this urb can't be active ...
 
 967                  * note that some drivers wrongly expect delays
 
 969                 if (ep->hep->urb_list.next != &urb->urb_list) {
 
 970                         /* not front of queue?  never active */
 
 972                 /* for active transfers, we expect an IRQ */
 
 973                 } else if (sl811->active_a == ep) {
 
 974                         if (time_before_eq(sl811->jiffies_a, jiffies)) {
 
 975                                 /* happens a lot with lowspeed?? */
 
 976                                 DBG("giveup on DONE_A: ctrl %02x sts %02x\n",
 
 978                                                 SL811_EP_A(SL11H_HOSTCTLREG)),
 
 980                                                 SL811_EP_A(SL11H_PKTSTATREG)));
 
 981                                 sl811_write(sl811, SL811_EP_A(SL11H_HOSTCTLREG),
 
 983                                 sl811->active_a = NULL;
 
 987                 } else if (sl811->active_b == ep) {
 
 988                         if (time_before_eq(sl811->jiffies_a, jiffies)) {
 
 989                                 /* happens a lot with lowspeed?? */
 
 990                                 DBG("giveup on DONE_B: ctrl %02x sts %02x\n",
 
 992                                                 SL811_EP_B(SL11H_HOSTCTLREG)),
 
 994                                                 SL811_EP_B(SL11H_PKTSTATREG)));
 
 995                                 sl811_write(sl811, SL811_EP_B(SL11H_HOSTCTLREG),
 
 997                                 sl811->active_b = NULL;
 
1002                         /* front of queue for inactive endpoint */
 
1006                         finish_request(sl811, ep, urb, 0);
 
1008                         VDBG("dequeue, urb %p active %s; wait4irq\n", urb,
 
1009                                 (sl811->active_a == ep) ? "A" : "B");
 
1013         spin_unlock_irqrestore(&sl811->lock, flags);
 
1018 sl811h_endpoint_disable(struct usb_hcd *hcd, struct usb_host_endpoint *hep)
 
1020         struct sl811h_ep        *ep = hep->hcpriv;
 
1025         /* assume we'd just wait for the irq */
 
1026         if (!list_empty(&hep->urb_list))
 
1028         if (!list_empty(&hep->urb_list))
 
1029                 WARNING("ep %p not empty?\n", ep);
 
1036 sl811h_get_frame(struct usb_hcd *hcd)
 
1038         struct sl811 *sl811 = hcd_to_sl811(hcd);
 
1040         /* wrong except while periodic transfers are scheduled;
 
1041          * never matches the on-the-wire frame;
 
1042          * subject to overruns.
 
1044         return sl811->frame;
 
1048 /*-------------------------------------------------------------------------*/
 
1050 /* the virtual root hub timer IRQ checks for hub status */
 
1052 sl811h_hub_status_data(struct usb_hcd *hcd, char *buf)
 
1054         struct sl811 *sl811 = hcd_to_sl811(hcd);
 
1056         unsigned long flags;
 
1058         /* non-SMP HACK: use root hub timer as i/o watchdog
 
1059          * this seems essential when SOF IRQs aren't in use...
 
1061         local_irq_save(flags);
 
1062         if (!timer_pending(&sl811->timer)) {
 
1063                 if (sl811h_irq( /* ~0, */ hcd) != IRQ_NONE)
 
1066         local_irq_restore(flags);
 
1069         if (!(sl811->port1 & (0xffff << 16)))
 
1072         /* tell khubd port 1 changed */
 
1078 sl811h_hub_descriptor (
 
1079         struct sl811                    *sl811,
 
1080         struct usb_hub_descriptor       *desc
 
1084         desc->bDescriptorType = 0x29;
 
1085         desc->bHubContrCurrent = 0;
 
1087         desc->bNbrPorts = 1;
 
1088         desc->bDescLength = 9;
 
1090         /* per-port power switching (gang of one!), or none */
 
1091         desc->bPwrOn2PwrGood = 0;
 
1092         if (sl811->board && sl811->board->port_power) {
 
1093                 desc->bPwrOn2PwrGood = sl811->board->potpg;
 
1094                 if (!desc->bPwrOn2PwrGood)
 
1095                         desc->bPwrOn2PwrGood = 10;
 
1100         /* no overcurrent errors detection/handling */
 
1103         desc->wHubCharacteristics = cpu_to_le16(temp);
 
1105         /* two bitmaps:  ports removable, and legacy PortPwrCtrlMask */
 
1106         desc->bitmap[0] = 0 << 1;
 
1107         desc->bitmap[1] = ~0;
 
1111 sl811h_timer(unsigned long _sl811)
 
1113         struct sl811    *sl811 = (void *) _sl811;
 
1114         unsigned long   flags;
 
1116         u8              signaling = sl811->ctrl1 & SL11H_CTL1MASK_FORCE;
 
1117         const u32       mask = (1 << USB_PORT_FEAT_CONNECTION)
 
1118                                 | (1 << USB_PORT_FEAT_ENABLE)
 
1119                                 | (1 << USB_PORT_FEAT_LOWSPEED);
 
1121         spin_lock_irqsave(&sl811->lock, flags);
 
1123         /* stop special signaling */
 
1124         sl811->ctrl1 &= ~SL11H_CTL1MASK_FORCE;
 
1125         sl811_write(sl811, SL11H_CTLREG1, sl811->ctrl1);
 
1128         irqstat = sl811_read(sl811, SL11H_IRQ_STATUS);
 
1130         switch (signaling) {
 
1131         case SL11H_CTL1MASK_SE0:
 
1133                 sl811->port1 = (1 << USB_PORT_FEAT_C_RESET)
 
1134                                 | (1 << USB_PORT_FEAT_POWER);
 
1136                 /* don't wrongly ack RD */
 
1137                 if (irqstat & SL11H_INTMASK_INSRMV)
 
1138                         irqstat &= ~SL11H_INTMASK_RD;
 
1140         case SL11H_CTL1MASK_K:
 
1141                 DBG("end resume\n");
 
1142                 sl811->port1 &= ~(1 << USB_PORT_FEAT_SUSPEND);
 
1145                 DBG("odd timer signaling: %02x\n", signaling);
 
1148         sl811_write(sl811, SL11H_IRQ_STATUS, irqstat);
 
1150         if (irqstat & SL11H_INTMASK_RD) {
 
1151                 /* usbcore nukes all pending transactions on disconnect */
 
1152                 if (sl811->port1 & (1 << USB_PORT_FEAT_CONNECTION))
 
1153                         sl811->port1 |= (1 << USB_PORT_FEAT_C_CONNECTION)
 
1154                                         | (1 << USB_PORT_FEAT_C_ENABLE);
 
1155                 sl811->port1 &= ~mask;
 
1156                 sl811->irq_enable = SL11H_INTMASK_INSRMV;
 
1158                 sl811->port1 |= mask;
 
1159                 if (irqstat & SL11H_INTMASK_DP)
 
1160                         sl811->port1 &= ~(1 << USB_PORT_FEAT_LOWSPEED);
 
1161                 sl811->irq_enable = SL11H_INTMASK_INSRMV | SL11H_INTMASK_RD;
 
1164         if (sl811->port1 & (1 << USB_PORT_FEAT_CONNECTION)) {
 
1165                 u8      ctrl2 = SL811HS_CTL2_INIT;
 
1167                 sl811->irq_enable |= SL11H_INTMASK_DONE_A;
 
1169                 sl811->irq_enable |= SL11H_INTMASK_DONE_B;
 
1171                 if (sl811->port1 & (1 << USB_PORT_FEAT_LOWSPEED)) {
 
1172                         sl811->ctrl1 |= SL11H_CTL1MASK_LSPD;
 
1173                         ctrl2 |= SL811HS_CTL2MASK_DSWAP;
 
1176                 /* start SOFs flowing, kickstarting with A registers */
 
1177                 sl811->ctrl1 |= SL11H_CTL1MASK_SOF_ENA;
 
1178                 sl811_write(sl811, SL11H_SOFLOWREG, 0xe0);
 
1179                 sl811_write(sl811, SL811HS_CTLREG2, ctrl2);
 
1181                 /* autoincrementing */
 
1182                 sl811_write(sl811, SL811_EP_A(SL11H_BUFLNTHREG), 0);
 
1183                 writeb(SL_SOF, sl811->data_reg);
 
1184                 writeb(0, sl811->data_reg);
 
1185                 sl811_write(sl811, SL811_EP_A(SL11H_HOSTCTLREG),
 
1186                                 SL11H_HCTLMASK_ARM);
 
1188                 /* khubd provides debounce delay */
 
1192         sl811_write(sl811, SL11H_CTLREG1, sl811->ctrl1);
 
1195         sl811_write(sl811, SL11H_IRQ_ENABLE, sl811->irq_enable);
 
1196         spin_unlock_irqrestore(&sl811->lock, flags);
 
1201         struct usb_hcd  *hcd,
 
1208         struct sl811    *sl811 = hcd_to_sl811(hcd);
 
1210         unsigned long   flags;
 
1212         spin_lock_irqsave(&sl811->lock, flags);
 
1215         case ClearHubFeature:
 
1218                 case C_HUB_OVER_CURRENT:
 
1219                 case C_HUB_LOCAL_POWER:
 
1225         case ClearPortFeature:
 
1226                 if (wIndex != 1 || wLength != 0)
 
1230                 case USB_PORT_FEAT_ENABLE:
 
1231                         sl811->port1 &= (1 << USB_PORT_FEAT_POWER);
 
1233                         sl811_write(sl811, SL11H_CTLREG1, sl811->ctrl1);
 
1234                         sl811->irq_enable = SL11H_INTMASK_INSRMV;
 
1235                         sl811_write(sl811, SL11H_IRQ_ENABLE,
 
1238                 case USB_PORT_FEAT_SUSPEND:
 
1239                         if (!(sl811->port1 & (1 << USB_PORT_FEAT_SUSPEND)))
 
1242                         /* 20 msec of resume/K signaling, other irqs blocked */
 
1243                         DBG("start resume...\n");
 
1244                         sl811->irq_enable = 0;
 
1245                         sl811_write(sl811, SL11H_IRQ_ENABLE,
 
1247                         sl811->ctrl1 |= SL11H_CTL1MASK_K;
 
1248                         sl811_write(sl811, SL11H_CTLREG1, sl811->ctrl1);
 
1250                         mod_timer(&sl811->timer, jiffies
 
1251                                         + msecs_to_jiffies(20));
 
1253                 case USB_PORT_FEAT_POWER:
 
1254                         port_power(sl811, 0);
 
1256                 case USB_PORT_FEAT_C_ENABLE:
 
1257                 case USB_PORT_FEAT_C_SUSPEND:
 
1258                 case USB_PORT_FEAT_C_CONNECTION:
 
1259                 case USB_PORT_FEAT_C_OVER_CURRENT:
 
1260                 case USB_PORT_FEAT_C_RESET:
 
1265                 sl811->port1 &= ~(1 << wValue);
 
1267         case GetHubDescriptor:
 
1268                 sl811h_hub_descriptor(sl811, (struct usb_hub_descriptor *) buf);
 
1271                 *(__le32 *) buf = cpu_to_le32(0);
 
1276                 *(__le32 *) buf = cpu_to_le32(sl811->port1);
 
1279         if (*(u16*)(buf+2))     /* only if wPortChange is interesting */
 
1281                 DBG("GetPortStatus %08x\n", sl811->port1);
 
1283         case SetPortFeature:
 
1284                 if (wIndex != 1 || wLength != 0)
 
1287                 case USB_PORT_FEAT_SUSPEND:
 
1288                         if (sl811->port1 & (1 << USB_PORT_FEAT_RESET))
 
1290                         if (!(sl811->port1 & (1 << USB_PORT_FEAT_ENABLE)))
 
1293                         DBG("suspend...\n");
 
1294                         sl811->ctrl1 &= ~SL11H_CTL1MASK_SOF_ENA;
 
1295                         sl811_write(sl811, SL11H_CTLREG1, sl811->ctrl1);
 
1297                 case USB_PORT_FEAT_POWER:
 
1298                         port_power(sl811, 1);
 
1300                 case USB_PORT_FEAT_RESET:
 
1301                         if (sl811->port1 & (1 << USB_PORT_FEAT_SUSPEND))
 
1303                         if (!(sl811->port1 & (1 << USB_PORT_FEAT_POWER)))
 
1306                         /* 50 msec of reset/SE0 signaling, irqs blocked */
 
1307                         sl811->irq_enable = 0;
 
1308                         sl811_write(sl811, SL11H_IRQ_ENABLE,
 
1310                         sl811->ctrl1 = SL11H_CTL1MASK_SE0;
 
1311                         sl811_write(sl811, SL11H_CTLREG1, sl811->ctrl1);
 
1312                         sl811->port1 |= (1 << USB_PORT_FEAT_RESET);
 
1313                         mod_timer(&sl811->timer, jiffies
 
1314                                         + msecs_to_jiffies(50));
 
1319                 sl811->port1 |= 1 << wValue;
 
1324                 /* "protocol stall" on error */
 
1328         spin_unlock_irqrestore(&sl811->lock, flags);
 
1335 sl811h_bus_suspend(struct usb_hcd *hcd)
 
1338         DBG("%s\n", __func__);
 
1343 sl811h_bus_resume(struct usb_hcd *hcd)
 
1346         DBG("%s\n", __func__);
 
1352 #define sl811h_bus_suspend      NULL
 
1353 #define sl811h_bus_resume       NULL
 
1358 /*-------------------------------------------------------------------------*/
 
1360 #ifdef STUB_DEBUG_FILE
 
1362 static inline void create_debug_file(struct sl811 *sl811) { }
 
1363 static inline void remove_debug_file(struct sl811 *sl811) { }
 
1367 #include <linux/proc_fs.h>
 
1368 #include <linux/seq_file.h>
 
1370 static void dump_irq(struct seq_file *s, char *label, u8 mask)
 
1372         seq_printf(s, "%s %02x%s%s%s%s%s%s\n", label, mask,
 
1373                 (mask & SL11H_INTMASK_DONE_A) ? " done_a" : "",
 
1374                 (mask & SL11H_INTMASK_DONE_B) ? " done_b" : "",
 
1375                 (mask & SL11H_INTMASK_SOFINTR) ? " sof" : "",
 
1376                 (mask & SL11H_INTMASK_INSRMV) ? " ins/rmv" : "",
 
1377                 (mask & SL11H_INTMASK_RD) ? " rd" : "",
 
1378                 (mask & SL11H_INTMASK_DP) ? " dp" : "");
 
1381 static int proc_sl811h_show(struct seq_file *s, void *unused)
 
1383         struct sl811            *sl811 = s->private;
 
1384         struct sl811h_ep        *ep;
 
1387         seq_printf(s, "%s\n%s version %s\nportstatus[1] = %08x\n",
 
1388                 sl811_to_hcd(sl811)->product_desc,
 
1389                 hcd_name, DRIVER_VERSION,
 
1392         seq_printf(s, "insert/remove: %ld\n", sl811->stat_insrmv);
 
1393         seq_printf(s, "current session:  done_a %ld done_b %ld "
 
1394                         "wake %ld sof %ld overrun %ld lost %ld\n\n",
 
1395                 sl811->stat_a, sl811->stat_b,
 
1396                 sl811->stat_wake, sl811->stat_sof,
 
1397                 sl811->stat_overrun, sl811->stat_lost);
 
1399         spin_lock_irq(&sl811->lock);
 
1401         if (sl811->ctrl1 & SL11H_CTL1MASK_SUSPEND)
 
1402                 seq_printf(s, "(suspended)\n\n");
 
1404                 u8      t = sl811_read(sl811, SL11H_CTLREG1);
 
1406                 seq_printf(s, "ctrl1 %02x%s%s%s%s\n", t,
 
1407                         (t & SL11H_CTL1MASK_SOF_ENA) ? " sofgen" : "",
 
1408                         ({char *s; switch (t & SL11H_CTL1MASK_FORCE) {
 
1409                         case SL11H_CTL1MASK_NORMAL: s = ""; break;
 
1410                         case SL11H_CTL1MASK_SE0: s = " se0/reset"; break;
 
1411                         case SL11H_CTL1MASK_K: s = " k/resume"; break;
 
1412                         default: s = "j"; break;
 
1414                         (t & SL11H_CTL1MASK_LSPD) ? " lowspeed" : "",
 
1415                         (t & SL11H_CTL1MASK_SUSPEND) ? " suspend" : "");
 
1417                 dump_irq(s, "irq_enable",
 
1418                                 sl811_read(sl811, SL11H_IRQ_ENABLE));
 
1419                 dump_irq(s, "irq_status",
 
1420                                 sl811_read(sl811, SL11H_IRQ_STATUS));
 
1421                 seq_printf(s, "frame clocks remaining:  %d\n",
 
1422                                 sl811_read(sl811, SL11H_SOFTMRREG) << 6);
 
1425         seq_printf(s, "A: qh%p ctl %02x sts %02x\n", sl811->active_a,
 
1426                 sl811_read(sl811, SL811_EP_A(SL11H_HOSTCTLREG)),
 
1427                 sl811_read(sl811, SL811_EP_A(SL11H_PKTSTATREG)));
 
1428         seq_printf(s, "B: qh%p ctl %02x sts %02x\n", sl811->active_b,
 
1429                 sl811_read(sl811, SL811_EP_B(SL11H_HOSTCTLREG)),
 
1430                 sl811_read(sl811, SL811_EP_B(SL11H_PKTSTATREG)));
 
1431         seq_printf(s, "\n");
 
1432         list_for_each_entry (ep, &sl811->async, schedule) {
 
1435                 seq_printf(s, "%s%sqh%p, ep%d%s, maxpacket %d"
 
1437                         (ep == sl811->active_a) ? "(A) " : "",
 
1438                         (ep == sl811->active_b) ? "(B) " : "",
 
1440                         ({ char *s; switch (ep->nextpid) {
 
1441                         case USB_PID_IN: s = "in"; break;
 
1442                         case USB_PID_OUT: s = "out"; break;
 
1443                         case USB_PID_SETUP: s = "setup"; break;
 
1444                         case USB_PID_ACK: s = "status"; break;
 
1445                         default: s = "?"; break;
 
1448                         ep->nak_count, ep->error_count);
 
1449                 list_for_each_entry (urb, &ep->hep->urb_list, urb_list) {
 
1450                         seq_printf(s, "  urb%p, %d/%d\n", urb,
 
1452                                 urb->transfer_buffer_length);
 
1455         if (!list_empty(&sl811->async))
 
1456                 seq_printf(s, "\n");
 
1458         seq_printf(s, "periodic size= %d\n", PERIODIC_SIZE);
 
1460         for (i = 0; i < PERIODIC_SIZE; i++) {
 
1461                 ep = sl811->periodic[i];
 
1464                 seq_printf(s, "%2d [%3d]:\n", i, sl811->load[i]);
 
1466                 /* DUMB: prints shared entries multiple times */
 
1469                                 "   %s%sqh%d/%p (%sdev%d ep%d%s max %d) "
 
1471                                 (ep == sl811->active_a) ? "(A) " : "",
 
1472                                 (ep == sl811->active_b) ? "(B) " : "",
 
1474                                 (ep->udev->speed == USB_SPEED_FULL)
 
1476                                 ep->udev->devnum, ep->epnum,
 
1477                                 (ep->epnum == 0) ? ""
 
1478                                         : ((ep->nextpid == USB_PID_IN)
 
1481                                 ep->maxpacket, ep->error_count);
 
1486         spin_unlock_irq(&sl811->lock);
 
1487         seq_printf(s, "\n");
 
1492 static int proc_sl811h_open(struct inode *inode, struct file *file)
 
1494         return single_open(file, proc_sl811h_show, PDE(inode)->data);
 
1497 static const struct file_operations proc_ops = {
 
1498         .open           = proc_sl811h_open,
 
1500         .llseek         = seq_lseek,
 
1501         .release        = single_release,
 
1504 /* expect just one sl811 per system */
 
1505 static const char proc_filename[] = "driver/sl811h";
 
1507 static void create_debug_file(struct sl811 *sl811)
 
1509         sl811->pde = proc_create_data(proc_filename, 0, NULL, &proc_ops, sl811);
 
1512 static void remove_debug_file(struct sl811 *sl811)
 
1515                 remove_proc_entry(proc_filename, NULL);
 
1520 /*-------------------------------------------------------------------------*/
 
1523 sl811h_stop(struct usb_hcd *hcd)
 
1525         struct sl811    *sl811 = hcd_to_sl811(hcd);
 
1526         unsigned long   flags;
 
1528         del_timer_sync(&hcd->rh_timer);
 
1530         spin_lock_irqsave(&sl811->lock, flags);
 
1531         port_power(sl811, 0);
 
1532         spin_unlock_irqrestore(&sl811->lock, flags);
 
1536 sl811h_start(struct usb_hcd *hcd)
 
1538         struct sl811            *sl811 = hcd_to_sl811(hcd);
 
1540         /* chip has been reset, VBUS power is off */
 
1541         hcd->state = HC_STATE_RUNNING;
 
1544                 if (!device_can_wakeup(hcd->self.controller))
 
1545                         device_init_wakeup(hcd->self.controller,
 
1546                                 sl811->board->can_wakeup);
 
1547                 hcd->power_budget = sl811->board->power * 2;
 
1550         /* enable power and interrupts */
 
1551         port_power(sl811, 1);
 
1556 /*-------------------------------------------------------------------------*/
 
1558 static struct hc_driver sl811h_hc_driver = {
 
1559         .description =          hcd_name,
 
1560         .hcd_priv_size =        sizeof(struct sl811),
 
1563          * generic hardware linkage
 
1566         .flags =                HCD_USB11 | HCD_MEMORY,
 
1568         /* Basic lifecycle operations */
 
1569         .start =                sl811h_start,
 
1570         .stop =                 sl811h_stop,
 
1573          * managing i/o requests and associated device resources
 
1575         .urb_enqueue =          sl811h_urb_enqueue,
 
1576         .urb_dequeue =          sl811h_urb_dequeue,
 
1577         .endpoint_disable =     sl811h_endpoint_disable,
 
1580          * periodic schedule support
 
1582         .get_frame_number =     sl811h_get_frame,
 
1587         .hub_status_data =      sl811h_hub_status_data,
 
1588         .hub_control =          sl811h_hub_control,
 
1589         .bus_suspend =          sl811h_bus_suspend,
 
1590         .bus_resume =           sl811h_bus_resume,
 
1593 /*-------------------------------------------------------------------------*/
 
1595 static int __devexit
 
1596 sl811h_remove(struct platform_device *dev)
 
1598         struct usb_hcd          *hcd = platform_get_drvdata(dev);
 
1599         struct sl811            *sl811 = hcd_to_sl811(hcd);
 
1600         struct resource         *res;
 
1602         remove_debug_file(sl811);
 
1603         usb_remove_hcd(hcd);
 
1605         /* some platforms may use IORESOURCE_IO */
 
1606         res = platform_get_resource(dev, IORESOURCE_MEM, 1);
 
1608                 iounmap(sl811->data_reg);
 
1610         res = platform_get_resource(dev, IORESOURCE_MEM, 0);
 
1612                 iounmap(sl811->addr_reg);
 
1618 static int __devinit
 
1619 sl811h_probe(struct platform_device *dev)
 
1621         struct usb_hcd          *hcd;
 
1622         struct sl811            *sl811;
 
1623         struct resource         *addr, *data, *ires;
 
1625         void __iomem            *addr_reg;
 
1626         void __iomem            *data_reg;
 
1629         unsigned long           irqflags;
 
1631         /* basic sanity checks first.  board-specific init logic should
 
1632          * have initialized these three resources and probably board
 
1633          * specific platform_data.  we don't probe for IRQs, and do only
 
1634          * minimal sanity checking.
 
1636         ires = platform_get_resource(dev, IORESOURCE_IRQ, 0);
 
1637         if (dev->num_resources < 3 || !ires)
 
1641         irqflags = ires->flags & IRQF_TRIGGER_MASK;
 
1643         /* refuse to confuse usbcore */
 
1644         if (dev->dev.dma_mask) {
 
1645                 DBG("no we won't dma\n");
 
1649         /* the chip may be wired for either kind of addressing */
 
1650         addr = platform_get_resource(dev, IORESOURCE_MEM, 0);
 
1651         data = platform_get_resource(dev, IORESOURCE_MEM, 1);
 
1653         if (!addr || !data) {
 
1654                 addr = platform_get_resource(dev, IORESOURCE_IO, 0);
 
1655                 data = platform_get_resource(dev, IORESOURCE_IO, 1);
 
1660                  * NOTE: 64-bit resource->start is getting truncated
 
1661                  * to avoid compiler warning, assuming that ->start
 
1662                  * is always 32-bit for this case
 
1664                 addr_reg = (void __iomem *) (unsigned long) addr->start;
 
1665                 data_reg = (void __iomem *) (unsigned long) data->start;
 
1667                 addr_reg = ioremap(addr->start, 1);
 
1668                 if (addr_reg == NULL) {
 
1673                 data_reg = ioremap(data->start, 1);
 
1674                 if (data_reg == NULL) {
 
1680         /* allocate and initialize hcd */
 
1681         hcd = usb_create_hcd(&sl811h_hc_driver, &dev->dev, dev_name(&dev->dev));
 
1686         hcd->rsrc_start = addr->start;
 
1687         sl811 = hcd_to_sl811(hcd);
 
1689         spin_lock_init(&sl811->lock);
 
1690         INIT_LIST_HEAD(&sl811->async);
 
1691         sl811->board = dev->dev.platform_data;
 
1692         init_timer(&sl811->timer);
 
1693         sl811->timer.function = sl811h_timer;
 
1694         sl811->timer.data = (unsigned long) sl811;
 
1695         sl811->addr_reg = addr_reg;
 
1696         sl811->data_reg = data_reg;
 
1698         spin_lock_irq(&sl811->lock);
 
1699         port_power(sl811, 0);
 
1700         spin_unlock_irq(&sl811->lock);
 
1703         tmp = sl811_read(sl811, SL11H_HWREVREG);
 
1706                 hcd->product_desc = "SL811HS v1.2";
 
1709                 hcd->product_desc = "SL811HS v1.5";
 
1712                 /* reject case 0, SL11S is less functional */
 
1713                 DBG("chiprev %02x\n", tmp);
 
1718         /* The chip's IRQ is level triggered, active high.  A requirement
 
1719          * for platform device setup is to cope with things like signal
 
1720          * inverters (e.g. CF is active low) or working only with edge
 
1721          * triggers (e.g. most ARM CPUs).  Initial driver stress testing
 
1722          * was on a system with single edge triggering, so most sorts of
 
1723          * triggering arrangement should work.
 
1725          * Use resource IRQ flags if set by platform device setup.
 
1727         irqflags |= IRQF_SHARED;
 
1728         retval = usb_add_hcd(hcd, irq, IRQF_DISABLED | irqflags);
 
1732         create_debug_file(sl811);
 
1744         DBG("init error, %d\n", retval);
 
1750 /* for this device there's no useful distinction between the controller
 
1751  * and its root hub, except that the root hub only gets direct PM calls
 
1752  * when CONFIG_USB_SUSPEND is enabled.
 
1756 sl811h_suspend(struct platform_device *dev, pm_message_t state)
 
1758         struct usb_hcd  *hcd = platform_get_drvdata(dev);
 
1759         struct sl811    *sl811 = hcd_to_sl811(hcd);
 
1762         switch (state.event) {
 
1763         case PM_EVENT_FREEZE:
 
1764                 retval = sl811h_bus_suspend(hcd);
 
1766         case PM_EVENT_SUSPEND:
 
1767         case PM_EVENT_HIBERNATE:
 
1768         case PM_EVENT_PRETHAW:          /* explicitly discard hw state */
 
1769                 port_power(sl811, 0);
 
1776 sl811h_resume(struct platform_device *dev)
 
1778         struct usb_hcd  *hcd = platform_get_drvdata(dev);
 
1779         struct sl811    *sl811 = hcd_to_sl811(hcd);
 
1781         /* with no "check to see if VBUS is still powered" board hook,
 
1782          * let's assume it'd only be powered to enable remote wakeup.
 
1784         if (!sl811->port1 || !device_can_wakeup(&hcd->self.root_hub->dev)) {
 
1786                 port_power(sl811, 1);
 
1787                 usb_root_hub_lost_power(hcd->self.root_hub);
 
1791         return sl811h_bus_resume(hcd);
 
1796 #define sl811h_suspend  NULL
 
1797 #define sl811h_resume   NULL
 
1802 /* this driver is exported so sl811_cs can depend on it */
 
1803 struct platform_driver sl811h_driver = {
 
1804         .probe =        sl811h_probe,
 
1805         .remove =       __devexit_p(sl811h_remove),
 
1807         .suspend =      sl811h_suspend,
 
1808         .resume =       sl811h_resume,
 
1810                 .name = (char *) hcd_name,
 
1811                 .owner = THIS_MODULE,
 
1814 EXPORT_SYMBOL(sl811h_driver);
 
1816 /*-------------------------------------------------------------------------*/
 
1818 static int __init sl811h_init(void)
 
1823         INFO("driver %s, %s\n", hcd_name, DRIVER_VERSION);
 
1824         return platform_driver_register(&sl811h_driver);
 
1826 module_init(sl811h_init);
 
1828 static void __exit sl811h_cleanup(void)
 
1830         platform_driver_unregister(&sl811h_driver);
 
1832 module_exit(sl811h_cleanup);