0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049 #define USE_PLATFORM_DELAY
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059 #include <linux/module.h>
0060 #include <linux/delay.h>
0061 #include <linux/debugfs.h>
0062 #include <linux/seq_file.h>
0063 #include <linux/errno.h>
0064 #include <linux/list.h>
0065 #include <linux/slab.h>
0066 #include <linux/usb.h>
0067 #include <linux/usb/isp116x.h>
0068 #include <linux/usb/hcd.h>
0069 #include <linux/platform_device.h>
0070
0071 #include <asm/io.h>
0072 #include <asm/irq.h>
0073 #include <asm/byteorder.h>
0074
0075 #include "isp116x.h"
0076
0077 #define DRIVER_VERSION "03 Nov 2005"
0078 #define DRIVER_DESC "ISP116x USB Host Controller Driver"
0079
0080 MODULE_DESCRIPTION(DRIVER_DESC);
0081 MODULE_LICENSE("GPL");
0082
0083 static const char hcd_name[] = "isp116x-hcd";
0084
0085
0086
0087
0088
0089
0090 static void write_ptddata_to_fifo(struct isp116x *isp116x, void *buf, int len)
0091 {
0092 u8 *dp = (u8 *) buf;
0093 u16 *dp2 = (u16 *) buf;
0094 u16 w;
0095 int quot = len % 4;
0096
0097
0098
0099
0100
0101 if ((unsigned long)dp2 & 1) {
0102
0103 for (; len > 1; len -= 2) {
0104 w = *dp++;
0105 w |= *dp++ << 8;
0106 isp116x_raw_write_data16(isp116x, w);
0107 }
0108 if (len)
0109 isp116x_write_data16(isp116x, (u16) * dp);
0110 } else {
0111
0112 for (; len > 1; len -= 2) {
0113
0114 isp116x_raw_write_data16(isp116x, cpu_to_le16(*dp2++));
0115 }
0116
0117 if (len)
0118 isp116x_write_data16(isp116x, 0xff & *((u8 *) dp2));
0119 }
0120 if (quot == 1 || quot == 2)
0121 isp116x_raw_write_data16(isp116x, 0);
0122 }
0123
0124
0125
0126
0127 static void read_ptddata_from_fifo(struct isp116x *isp116x, void *buf, int len)
0128 {
0129 u8 *dp = (u8 *) buf;
0130 u16 *dp2 = (u16 *) buf;
0131 u16 w;
0132 int quot = len % 4;
0133
0134
0135
0136
0137
0138 if ((unsigned long)dp2 & 1) {
0139
0140 for (; len > 1; len -= 2) {
0141 w = isp116x_raw_read_data16(isp116x);
0142 *dp++ = w & 0xff;
0143 *dp++ = (w >> 8) & 0xff;
0144 }
0145
0146 if (len)
0147 *dp = 0xff & isp116x_read_data16(isp116x);
0148 } else {
0149
0150 for (; len > 1; len -= 2) {
0151
0152 *dp2++ = le16_to_cpu(isp116x_raw_read_data16(isp116x));
0153 }
0154
0155 if (len)
0156 *(u8 *) dp2 = 0xff & isp116x_read_data16(isp116x);
0157 }
0158 if (quot == 1 || quot == 2)
0159 isp116x_raw_read_data16(isp116x);
0160 }
0161
0162
0163
0164
0165
0166 static void pack_fifo(struct isp116x *isp116x)
0167 {
0168 struct isp116x_ep *ep;
0169 struct ptd *ptd;
0170 int buflen = isp116x->atl_last_dir == PTD_DIR_IN
0171 ? isp116x->atl_bufshrt : isp116x->atl_buflen;
0172
0173 isp116x_write_reg16(isp116x, HCuPINT, HCuPINT_AIIEOT);
0174 isp116x_write_reg16(isp116x, HCXFERCTR, buflen);
0175 isp116x_write_addr(isp116x, HCATLPORT | ISP116x_WRITE_OFFSET);
0176 for (ep = isp116x->atl_active; ep; ep = ep->active) {
0177 ptd = &ep->ptd;
0178 dump_ptd(ptd);
0179 dump_ptd_out_data(ptd, ep->data);
0180 isp116x_write_data16(isp116x, ptd->count);
0181 isp116x_write_data16(isp116x, ptd->mps);
0182 isp116x_write_data16(isp116x, ptd->len);
0183 isp116x_write_data16(isp116x, ptd->faddr);
0184 buflen -= sizeof(struct ptd);
0185
0186 if (ep->active || (isp116x->atl_last_dir != PTD_DIR_IN)) {
0187 write_ptddata_to_fifo(isp116x, ep->data, ep->length);
0188 buflen -= ALIGN(ep->length, 4);
0189 }
0190 }
0191 BUG_ON(buflen);
0192 }
0193
0194
0195
0196
0197
0198 static void unpack_fifo(struct isp116x *isp116x)
0199 {
0200 struct isp116x_ep *ep;
0201 struct ptd *ptd;
0202 int buflen = isp116x->atl_last_dir == PTD_DIR_IN
0203 ? isp116x->atl_buflen : isp116x->atl_bufshrt;
0204
0205 isp116x_write_reg16(isp116x, HCuPINT, HCuPINT_AIIEOT);
0206 isp116x_write_reg16(isp116x, HCXFERCTR, buflen);
0207 isp116x_write_addr(isp116x, HCATLPORT);
0208 for (ep = isp116x->atl_active; ep; ep = ep->active) {
0209 ptd = &ep->ptd;
0210 ptd->count = isp116x_read_data16(isp116x);
0211 ptd->mps = isp116x_read_data16(isp116x);
0212 ptd->len = isp116x_read_data16(isp116x);
0213 ptd->faddr = isp116x_read_data16(isp116x);
0214 buflen -= sizeof(struct ptd);
0215
0216 if (ep->active || (isp116x->atl_last_dir == PTD_DIR_IN)) {
0217 read_ptddata_from_fifo(isp116x, ep->data, ep->length);
0218 buflen -= ALIGN(ep->length, 4);
0219 }
0220 dump_ptd(ptd);
0221 dump_ptd_in_data(ptd, ep->data);
0222 }
0223 BUG_ON(buflen);
0224 }
0225
0226
0227
0228
0229
0230
0231 static void preproc_atl_queue(struct isp116x *isp116x)
0232 {
0233 struct isp116x_ep *ep;
0234 struct urb *urb;
0235 struct ptd *ptd;
0236 u16 len;
0237
0238 for (ep = isp116x->atl_active; ep; ep = ep->active) {
0239 u16 toggle = 0, dir = PTD_DIR_SETUP;
0240
0241 BUG_ON(list_empty(&ep->hep->urb_list));
0242 urb = container_of(ep->hep->urb_list.next,
0243 struct urb, urb_list);
0244 ptd = &ep->ptd;
0245 len = ep->length;
0246 ep->data = (unsigned char *)urb->transfer_buffer
0247 + urb->actual_length;
0248
0249 switch (ep->nextpid) {
0250 case USB_PID_IN:
0251 toggle = usb_gettoggle(urb->dev, ep->epnum, 0);
0252 dir = PTD_DIR_IN;
0253 break;
0254 case USB_PID_OUT:
0255 toggle = usb_gettoggle(urb->dev, ep->epnum, 1);
0256 dir = PTD_DIR_OUT;
0257 break;
0258 case USB_PID_SETUP:
0259 len = sizeof(struct usb_ctrlrequest);
0260 ep->data = urb->setup_packet;
0261 break;
0262 case USB_PID_ACK:
0263 toggle = 1;
0264 len = 0;
0265 dir = (urb->transfer_buffer_length
0266 && usb_pipein(urb->pipe))
0267 ? PTD_DIR_OUT : PTD_DIR_IN;
0268 break;
0269 default:
0270 ERR("%s %d: ep->nextpid %d\n", __func__, __LINE__,
0271 ep->nextpid);
0272 BUG();
0273 }
0274
0275 ptd->count = PTD_CC_MSK | PTD_ACTIVE_MSK | PTD_TOGGLE(toggle);
0276 ptd->mps = PTD_MPS(ep->maxpacket)
0277 | PTD_SPD(urb->dev->speed == USB_SPEED_LOW)
0278 | PTD_EP(ep->epnum);
0279 ptd->len = PTD_LEN(len) | PTD_DIR(dir);
0280 ptd->faddr = PTD_FA(usb_pipedevice(urb->pipe));
0281 if (!ep->active) {
0282 ptd->mps |= PTD_LAST_MSK;
0283 isp116x->atl_last_dir = dir;
0284 }
0285 isp116x->atl_bufshrt = sizeof(struct ptd) + isp116x->atl_buflen;
0286 isp116x->atl_buflen = isp116x->atl_bufshrt + ALIGN(len, 4);
0287 }
0288 }
0289
0290
0291
0292
0293
0294 static void finish_request(struct isp116x *isp116x, struct isp116x_ep *ep,
0295 struct urb *urb, int status)
0296 __releases(isp116x->lock) __acquires(isp116x->lock)
0297 {
0298 unsigned i;
0299
0300 ep->error_count = 0;
0301
0302 if (usb_pipecontrol(urb->pipe))
0303 ep->nextpid = USB_PID_SETUP;
0304
0305 urb_dbg(urb, "Finish");
0306
0307 usb_hcd_unlink_urb_from_ep(isp116x_to_hcd(isp116x), urb);
0308 spin_unlock(&isp116x->lock);
0309 usb_hcd_giveback_urb(isp116x_to_hcd(isp116x), urb, status);
0310 spin_lock(&isp116x->lock);
0311
0312
0313 if (!list_empty(&ep->hep->urb_list))
0314 return;
0315
0316
0317 if (!list_empty(&ep->schedule)) {
0318 list_del_init(&ep->schedule);
0319 return;
0320 }
0321
0322
0323 DBG("deschedule qh%d/%p branch %d\n", ep->period, ep, ep->branch);
0324 for (i = ep->branch; i < PERIODIC_SIZE; i += ep->period) {
0325 struct isp116x_ep *temp;
0326 struct isp116x_ep **prev = &isp116x->periodic[i];
0327
0328 while (*prev && ((temp = *prev) != ep))
0329 prev = &temp->next;
0330 if (*prev)
0331 *prev = ep->next;
0332 isp116x->load[i] -= ep->load;
0333 }
0334 ep->branch = PERIODIC_SIZE;
0335 isp116x_to_hcd(isp116x)->self.bandwidth_allocated -=
0336 ep->load / ep->period;
0337
0338
0339 if (!--isp116x->periodic_count) {
0340 isp116x->irqenb &= ~HCuPINT_SOF;
0341 isp116x->irqenb |= HCuPINT_ATL;
0342 }
0343 }
0344
0345
0346
0347
0348 static void postproc_atl_queue(struct isp116x *isp116x)
0349 {
0350 struct isp116x_ep *ep;
0351 struct urb *urb;
0352 struct usb_device *udev;
0353 struct ptd *ptd;
0354 int short_not_ok;
0355 int status;
0356 u8 cc;
0357
0358 for (ep = isp116x->atl_active; ep; ep = ep->active) {
0359 BUG_ON(list_empty(&ep->hep->urb_list));
0360 urb =
0361 container_of(ep->hep->urb_list.next, struct urb, urb_list);
0362 udev = urb->dev;
0363 ptd = &ep->ptd;
0364 cc = PTD_GET_CC(ptd);
0365 short_not_ok = 1;
0366 status = -EINPROGRESS;
0367
0368
0369
0370
0371
0372
0373 if (cc == TD_DATAUNDERRUN) {
0374 if (!(urb->transfer_flags & URB_SHORT_NOT_OK) ||
0375 usb_pipecontrol(urb->pipe)) {
0376 DBG("Allowed or control data underrun\n");
0377 cc = TD_CC_NOERROR;
0378 short_not_ok = 0;
0379 } else {
0380 ep->error_count = 1;
0381 usb_settoggle(udev, ep->epnum,
0382 ep->nextpid == USB_PID_OUT,
0383 PTD_GET_TOGGLE(ptd));
0384 urb->actual_length += PTD_GET_COUNT(ptd);
0385 status = cc_to_error[TD_DATAUNDERRUN];
0386 goto done;
0387 }
0388 }
0389
0390 if (cc != TD_CC_NOERROR && cc != TD_NOTACCESSED
0391 && (++ep->error_count >= 3 || cc == TD_CC_STALL
0392 || cc == TD_DATAOVERRUN)) {
0393 status = cc_to_error[cc];
0394 if (ep->nextpid == USB_PID_ACK)
0395 ep->nextpid = 0;
0396 goto done;
0397 }
0398
0399
0400
0401 if (usb_pipeint(urb->pipe) && !PTD_GET_LEN(ptd)) {
0402 status = 0;
0403 goto done;
0404 }
0405
0406
0407
0408 if (ep->error_count
0409 && (cc == TD_CC_NOERROR || cc == TD_NOTACCESSED))
0410 ep->error_count = 0;
0411
0412
0413
0414 if (ep->nextpid == USB_PID_OUT)
0415 usb_settoggle(udev, ep->epnum, 1, PTD_GET_TOGGLE(ptd)
0416 ^ (ep->error_count > 0));
0417 else if (ep->nextpid == USB_PID_IN)
0418 usb_settoggle(udev, ep->epnum, 0, PTD_GET_TOGGLE(ptd)
0419 ^ (ep->error_count > 0));
0420
0421 switch (ep->nextpid) {
0422 case USB_PID_IN:
0423 case USB_PID_OUT:
0424 urb->actual_length += PTD_GET_COUNT(ptd);
0425 if (PTD_GET_ACTIVE(ptd)
0426 || (cc != TD_CC_NOERROR && cc < 0x0E))
0427 break;
0428 if (urb->transfer_buffer_length != urb->actual_length) {
0429 if (short_not_ok)
0430 break;
0431 } else {
0432 if (urb->transfer_flags & URB_ZERO_PACKET
0433 && ep->nextpid == USB_PID_OUT
0434 && !(PTD_GET_COUNT(ptd) % ep->maxpacket)) {
0435 DBG("Zero packet requested\n");
0436 break;
0437 }
0438 }
0439
0440 if (usb_pipecontrol(urb->pipe))
0441 ep->nextpid = USB_PID_ACK;
0442 else
0443 status = 0;
0444 break;
0445 case USB_PID_SETUP:
0446 if (PTD_GET_ACTIVE(ptd)
0447 || (cc != TD_CC_NOERROR && cc < 0x0E))
0448 break;
0449 if (urb->transfer_buffer_length == urb->actual_length)
0450 ep->nextpid = USB_PID_ACK;
0451 else if (usb_pipeout(urb->pipe)) {
0452 usb_settoggle(udev, 0, 1, 1);
0453 ep->nextpid = USB_PID_OUT;
0454 } else {
0455 usb_settoggle(udev, 0, 0, 1);
0456 ep->nextpid = USB_PID_IN;
0457 }
0458 break;
0459 case USB_PID_ACK:
0460 if (PTD_GET_ACTIVE(ptd)
0461 || (cc != TD_CC_NOERROR && cc < 0x0E))
0462 break;
0463 status = 0;
0464 ep->nextpid = 0;
0465 break;
0466 default:
0467 BUG();
0468 }
0469
0470 done:
0471 if (status != -EINPROGRESS || urb->unlinked)
0472 finish_request(isp116x, ep, urb, status);
0473 }
0474 }
0475
0476
0477
0478
0479
0480 static void start_atl_transfers(struct isp116x *isp116x)
0481 {
0482 struct isp116x_ep *last_ep = NULL, *ep;
0483 struct urb *urb;
0484 u16 load = 0;
0485 int len, index, speed, byte_time;
0486
0487 if (atomic_read(&isp116x->atl_finishing))
0488 return;
0489
0490 if (!HC_IS_RUNNING(isp116x_to_hcd(isp116x)->state))
0491 return;
0492
0493
0494 if (isp116x_read_reg16(isp116x, HCBUFSTAT) & HCBUFSTAT_ATL_FULL)
0495 return;
0496
0497 isp116x->atl_active = NULL;
0498 isp116x->atl_buflen = isp116x->atl_bufshrt = 0;
0499
0500
0501 if (isp116x->periodic_count) {
0502 isp116x->fmindex = index =
0503 (isp116x->fmindex + 1) & (PERIODIC_SIZE - 1);
0504 load = isp116x->load[index];
0505 if (load) {
0506
0507
0508 isp116x->atl_active = last_ep =
0509 isp116x->periodic[index];
0510 while (last_ep->next)
0511 last_ep = (last_ep->active = last_ep->next);
0512 last_ep->active = NULL;
0513 }
0514 }
0515
0516
0517 list_for_each_entry(ep, &isp116x->async, schedule) {
0518 urb = container_of(ep->hep->urb_list.next,
0519 struct urb, urb_list);
0520 speed = urb->dev->speed;
0521 byte_time = speed == USB_SPEED_LOW
0522 ? BYTE_TIME_LOWSPEED : BYTE_TIME_FULLSPEED;
0523
0524 if (ep->nextpid == USB_PID_SETUP) {
0525 len = sizeof(struct usb_ctrlrequest);
0526 } else if (ep->nextpid == USB_PID_ACK) {
0527 len = 0;
0528 } else {
0529
0530 len = (MAX_LOAD_LIMIT - load) / byte_time;
0531
0532
0533 len = min(len, speed == USB_SPEED_LOW ?
0534 MAX_TRANSFER_SIZE_LOWSPEED :
0535 MAX_TRANSFER_SIZE_FULLSPEED);
0536
0537
0538
0539 if (len <
0540 (urb->transfer_buffer_length -
0541 urb->actual_length)) {
0542 len -= len % ep->maxpacket;
0543 if (!len)
0544 continue;
0545 } else
0546 len = urb->transfer_buffer_length -
0547 urb->actual_length;
0548 BUG_ON(len < 0);
0549 }
0550
0551 load += len * byte_time;
0552 if (load > MAX_LOAD_LIMIT)
0553 break;
0554
0555 ep->active = NULL;
0556 ep->length = len;
0557 if (last_ep)
0558 last_ep->active = ep;
0559 else
0560 isp116x->atl_active = ep;
0561 last_ep = ep;
0562 }
0563
0564
0565 if ((&isp116x->async)->next != (&isp116x->async)->prev)
0566 list_move(&isp116x->async, (&isp116x->async)->next);
0567
0568 if (isp116x->atl_active) {
0569 preproc_atl_queue(isp116x);
0570 pack_fifo(isp116x);
0571 }
0572 }
0573
0574
0575
0576
0577 static void finish_atl_transfers(struct isp116x *isp116x)
0578 {
0579 if (!isp116x->atl_active)
0580 return;
0581
0582 if (!(isp116x_read_reg16(isp116x, HCBUFSTAT) & HCBUFSTAT_ATL_DONE))
0583 return;
0584
0585 atomic_inc(&isp116x->atl_finishing);
0586 unpack_fifo(isp116x);
0587 postproc_atl_queue(isp116x);
0588 atomic_dec(&isp116x->atl_finishing);
0589 }
0590
0591 static irqreturn_t isp116x_irq(struct usb_hcd *hcd)
0592 {
0593 struct isp116x *isp116x = hcd_to_isp116x(hcd);
0594 u16 irqstat;
0595 irqreturn_t ret = IRQ_NONE;
0596
0597 spin_lock(&isp116x->lock);
0598 isp116x_write_reg16(isp116x, HCuPINTENB, 0);
0599 irqstat = isp116x_read_reg16(isp116x, HCuPINT);
0600 isp116x_write_reg16(isp116x, HCuPINT, irqstat);
0601
0602 if (irqstat & (HCuPINT_ATL | HCuPINT_SOF)) {
0603 ret = IRQ_HANDLED;
0604 finish_atl_transfers(isp116x);
0605 }
0606
0607 if (irqstat & HCuPINT_OPR) {
0608 u32 intstat = isp116x_read_reg32(isp116x, HCINTSTAT);
0609 isp116x_write_reg32(isp116x, HCINTSTAT, intstat);
0610 if (intstat & HCINT_UE) {
0611 ERR("Unrecoverable error, HC is dead!\n");
0612
0613
0614 hcd->state = HC_STATE_HALT;
0615 usb_hc_died(hcd);
0616 ret = IRQ_HANDLED;
0617 goto done;
0618 }
0619 if (intstat & HCINT_RHSC)
0620
0621
0622
0623 mod_timer(&hcd->rh_timer, jiffies
0624 + msecs_to_jiffies(20) + 1);
0625 if (intstat & HCINT_RD) {
0626 DBG("---- remote wakeup\n");
0627 usb_hcd_resume_root_hub(hcd);
0628 }
0629 irqstat &= ~HCuPINT_OPR;
0630 ret = IRQ_HANDLED;
0631 }
0632
0633 if (irqstat & (HCuPINT_ATL | HCuPINT_SOF)) {
0634 start_atl_transfers(isp116x);
0635 }
0636
0637 isp116x_write_reg16(isp116x, HCuPINTENB, isp116x->irqenb);
0638 done:
0639 spin_unlock(&isp116x->lock);
0640 return ret;
0641 }
0642
0643
0644
0645
0646
0647
0648
0649
0650
0651 #define MAX_PERIODIC_LOAD 600
0652 static int balance(struct isp116x *isp116x, u16 period, u16 load)
0653 {
0654 int i, branch = -ENOSPC;
0655
0656
0657
0658 for (i = 0; i < period; i++) {
0659 if (branch < 0 || isp116x->load[branch] > isp116x->load[i]) {
0660 int j;
0661
0662 for (j = i; j < PERIODIC_SIZE; j += period) {
0663 if ((isp116x->load[j] + load)
0664 > MAX_PERIODIC_LOAD)
0665 break;
0666 }
0667 if (j < PERIODIC_SIZE)
0668 continue;
0669 branch = i;
0670 }
0671 }
0672 return branch;
0673 }
0674
0675
0676
0677
0678
0679
0680
0681 static int isp116x_urb_enqueue(struct usb_hcd *hcd,
0682 struct urb *urb,
0683 gfp_t mem_flags)
0684 {
0685 struct isp116x *isp116x = hcd_to_isp116x(hcd);
0686 struct usb_device *udev = urb->dev;
0687 unsigned int pipe = urb->pipe;
0688 int is_out = !usb_pipein(pipe);
0689 int type = usb_pipetype(pipe);
0690 int epnum = usb_pipeendpoint(pipe);
0691 struct usb_host_endpoint *hep = urb->ep;
0692 struct isp116x_ep *ep = NULL;
0693 unsigned long flags;
0694 int i;
0695 int ret = 0;
0696
0697 urb_dbg(urb, "Enqueue");
0698
0699 if (type == PIPE_ISOCHRONOUS) {
0700 ERR("Isochronous transfers not supported\n");
0701 urb_dbg(urb, "Refused to enqueue");
0702 return -ENXIO;
0703 }
0704
0705 if (!hep->hcpriv) {
0706 ep = kzalloc(sizeof *ep, mem_flags);
0707 if (!ep)
0708 return -ENOMEM;
0709 }
0710
0711 spin_lock_irqsave(&isp116x->lock, flags);
0712 if (!HC_IS_RUNNING(hcd->state)) {
0713 kfree(ep);
0714 ret = -ENODEV;
0715 goto fail_not_linked;
0716 }
0717 ret = usb_hcd_link_urb_to_ep(hcd, urb);
0718 if (ret) {
0719 kfree(ep);
0720 goto fail_not_linked;
0721 }
0722
0723 if (hep->hcpriv)
0724 ep = hep->hcpriv;
0725 else {
0726 INIT_LIST_HEAD(&ep->schedule);
0727 ep->udev = udev;
0728 ep->epnum = epnum;
0729 ep->maxpacket = usb_maxpacket(udev, urb->pipe);
0730 usb_settoggle(udev, epnum, is_out, 0);
0731
0732 if (type == PIPE_CONTROL) {
0733 ep->nextpid = USB_PID_SETUP;
0734 } else if (is_out) {
0735 ep->nextpid = USB_PID_OUT;
0736 } else {
0737 ep->nextpid = USB_PID_IN;
0738 }
0739
0740 if (urb->interval) {
0741
0742
0743
0744
0745
0746
0747
0748
0749
0750
0751 if (urb->interval < 2)
0752 urb->interval = 2;
0753 if (urb->interval > 2 * PERIODIC_SIZE)
0754 urb->interval = 2 * PERIODIC_SIZE;
0755 ep->period = urb->interval >> 1;
0756 ep->branch = PERIODIC_SIZE;
0757 ep->load = usb_calc_bus_time(udev->speed,
0758 !is_out,
0759 (type == PIPE_ISOCHRONOUS),
0760 usb_maxpacket(udev, pipe)) /
0761 1000;
0762 }
0763 hep->hcpriv = ep;
0764 ep->hep = hep;
0765 }
0766
0767
0768 switch (type) {
0769 case PIPE_CONTROL:
0770 case PIPE_BULK:
0771 if (list_empty(&ep->schedule))
0772 list_add_tail(&ep->schedule, &isp116x->async);
0773 break;
0774 case PIPE_INTERRUPT:
0775 urb->interval = ep->period;
0776 ep->length = min_t(u32, ep->maxpacket,
0777 urb->transfer_buffer_length);
0778
0779
0780 if (ep->branch < PERIODIC_SIZE)
0781 break;
0782
0783 ep->branch = ret = balance(isp116x, ep->period, ep->load);
0784 if (ret < 0)
0785 goto fail;
0786 ret = 0;
0787
0788 urb->start_frame = (isp116x->fmindex & (PERIODIC_SIZE - 1))
0789 + ep->branch;
0790
0791
0792
0793
0794 DBG("schedule qh%d/%p branch %d\n", ep->period, ep, ep->branch);
0795 for (i = ep->branch; i < PERIODIC_SIZE; i += ep->period) {
0796 struct isp116x_ep **prev = &isp116x->periodic[i];
0797 struct isp116x_ep *here = *prev;
0798
0799 while (here && ep != here) {
0800 if (ep->period > here->period)
0801 break;
0802 prev = &here->next;
0803 here = *prev;
0804 }
0805 if (ep != here) {
0806 ep->next = here;
0807 *prev = ep;
0808 }
0809 isp116x->load[i] += ep->load;
0810 }
0811 hcd->self.bandwidth_allocated += ep->load / ep->period;
0812
0813
0814 if (!isp116x->periodic_count++) {
0815 isp116x->irqenb &= ~HCuPINT_ATL;
0816 isp116x->irqenb |= HCuPINT_SOF;
0817 isp116x_write_reg16(isp116x, HCuPINTENB,
0818 isp116x->irqenb);
0819 }
0820 }
0821
0822 urb->hcpriv = hep;
0823 start_atl_transfers(isp116x);
0824
0825 fail:
0826 if (ret)
0827 usb_hcd_unlink_urb_from_ep(hcd, urb);
0828 fail_not_linked:
0829 spin_unlock_irqrestore(&isp116x->lock, flags);
0830 return ret;
0831 }
0832
0833
0834
0835
0836 static int isp116x_urb_dequeue(struct usb_hcd *hcd, struct urb *urb,
0837 int status)
0838 {
0839 struct isp116x *isp116x = hcd_to_isp116x(hcd);
0840 struct usb_host_endpoint *hep;
0841 struct isp116x_ep *ep, *ep_act;
0842 unsigned long flags;
0843 int rc;
0844
0845 spin_lock_irqsave(&isp116x->lock, flags);
0846 rc = usb_hcd_check_unlink_urb(hcd, urb, status);
0847 if (rc)
0848 goto done;
0849
0850 hep = urb->hcpriv;
0851 ep = hep->hcpriv;
0852 WARN_ON(hep != ep->hep);
0853
0854
0855 if (ep->hep->urb_list.next == &urb->urb_list)
0856
0857 for (ep_act = isp116x->atl_active; ep_act;
0858 ep_act = ep_act->active)
0859 if (ep_act == ep) {
0860 VDBG("dequeue, urb %p active; wait for irq\n",
0861 urb);
0862 urb = NULL;
0863 break;
0864 }
0865
0866 if (urb)
0867 finish_request(isp116x, ep, urb, status);
0868 done:
0869 spin_unlock_irqrestore(&isp116x->lock, flags);
0870 return rc;
0871 }
0872
0873 static void isp116x_endpoint_disable(struct usb_hcd *hcd,
0874 struct usb_host_endpoint *hep)
0875 {
0876 int i;
0877 struct isp116x_ep *ep = hep->hcpriv;
0878
0879 if (!ep)
0880 return;
0881
0882
0883 for (i = 0; i < 100 && !list_empty(&hep->urb_list); i++)
0884 msleep(3);
0885 if (!list_empty(&hep->urb_list))
0886 WARNING("ep %p not empty?\n", ep);
0887
0888 kfree(ep);
0889 hep->hcpriv = NULL;
0890 }
0891
0892 static int isp116x_get_frame(struct usb_hcd *hcd)
0893 {
0894 struct isp116x *isp116x = hcd_to_isp116x(hcd);
0895 u32 fmnum;
0896 unsigned long flags;
0897
0898 spin_lock_irqsave(&isp116x->lock, flags);
0899 fmnum = isp116x_read_reg32(isp116x, HCFMNUM);
0900 spin_unlock_irqrestore(&isp116x->lock, flags);
0901 return (int)fmnum;
0902 }
0903
0904
0905
0906
0907 static int isp116x_hub_status_data(struct usb_hcd *hcd, char *buf)
0908 {
0909 struct isp116x *isp116x = hcd_to_isp116x(hcd);
0910 int ports, i, changed = 0;
0911 unsigned long flags;
0912
0913 if (!HC_IS_RUNNING(hcd->state))
0914 return -ESHUTDOWN;
0915
0916
0917
0918 if (timer_pending(&hcd->rh_timer))
0919 return 0;
0920
0921 ports = isp116x->rhdesca & RH_A_NDP;
0922 spin_lock_irqsave(&isp116x->lock, flags);
0923 isp116x->rhstatus = isp116x_read_reg32(isp116x, HCRHSTATUS);
0924 if (isp116x->rhstatus & (RH_HS_LPSC | RH_HS_OCIC))
0925 buf[0] = changed = 1;
0926 else
0927 buf[0] = 0;
0928
0929 for (i = 0; i < ports; i++) {
0930 u32 status = isp116x_read_reg32(isp116x, i ? HCRHPORT2 : HCRHPORT1);
0931
0932 if (status & (RH_PS_CSC | RH_PS_PESC | RH_PS_PSSC
0933 | RH_PS_OCIC | RH_PS_PRSC)) {
0934 changed = 1;
0935 buf[0] |= 1 << (i + 1);
0936 }
0937 }
0938 spin_unlock_irqrestore(&isp116x->lock, flags);
0939 return changed;
0940 }
0941
0942 static void isp116x_hub_descriptor(struct isp116x *isp116x,
0943 struct usb_hub_descriptor *desc)
0944 {
0945 u32 reg = isp116x->rhdesca;
0946
0947 desc->bDescriptorType = USB_DT_HUB;
0948 desc->bDescLength = 9;
0949 desc->bHubContrCurrent = 0;
0950 desc->bNbrPorts = (u8) (reg & 0x3);
0951
0952 desc->wHubCharacteristics = cpu_to_le16((u16) ((reg >> 8) &
0953 (HUB_CHAR_LPSM |
0954 HUB_CHAR_COMPOUND |
0955 HUB_CHAR_OCPM)));
0956 desc->bPwrOn2PwrGood = (u8) ((reg >> 24) & 0xff);
0957
0958 desc->u.hs.DeviceRemovable[0] = 0;
0959 desc->u.hs.DeviceRemovable[1] = ~0;
0960 }
0961
0962
0963
0964
0965
0966
0967
0968
0969 static inline void root_port_reset(struct isp116x *isp116x, unsigned port)
0970 {
0971 u32 tmp;
0972 unsigned long flags, t;
0973
0974
0975
0976 t = jiffies + msecs_to_jiffies(100);
0977
0978 while (time_before(jiffies, t)) {
0979 spin_lock_irqsave(&isp116x->lock, flags);
0980
0981 for (;;) {
0982 tmp = isp116x_read_reg32(isp116x, port ?
0983 HCRHPORT2 : HCRHPORT1);
0984 if (!(tmp & RH_PS_PRS))
0985 break;
0986 udelay(500);
0987 }
0988
0989 if (!(tmp & RH_PS_CCS)) {
0990 spin_unlock_irqrestore(&isp116x->lock, flags);
0991 break;
0992 }
0993
0994 isp116x_write_reg32(isp116x, port ? HCRHPORT2 :
0995 HCRHPORT1, (RH_PS_PRS));
0996 spin_unlock_irqrestore(&isp116x->lock, flags);
0997 msleep(10);
0998 }
0999 }
1000
1001
1002 static int isp116x_hub_control(struct usb_hcd *hcd,
1003 u16 typeReq,
1004 u16 wValue, u16 wIndex, char *buf, u16 wLength)
1005 {
1006 struct isp116x *isp116x = hcd_to_isp116x(hcd);
1007 int ret = 0;
1008 unsigned long flags;
1009 int ports = isp116x->rhdesca & RH_A_NDP;
1010 u32 tmp = 0;
1011
1012 switch (typeReq) {
1013 case ClearHubFeature:
1014 DBG("ClearHubFeature: ");
1015 switch (wValue) {
1016 case C_HUB_OVER_CURRENT:
1017 DBG("C_HUB_OVER_CURRENT\n");
1018 spin_lock_irqsave(&isp116x->lock, flags);
1019 isp116x_write_reg32(isp116x, HCRHSTATUS, RH_HS_OCIC);
1020 spin_unlock_irqrestore(&isp116x->lock, flags);
1021 fallthrough;
1022 case C_HUB_LOCAL_POWER:
1023 DBG("C_HUB_LOCAL_POWER\n");
1024 break;
1025 default:
1026 goto error;
1027 }
1028 break;
1029 case SetHubFeature:
1030 DBG("SetHubFeature: ");
1031 switch (wValue) {
1032 case C_HUB_OVER_CURRENT:
1033 case C_HUB_LOCAL_POWER:
1034 DBG("C_HUB_OVER_CURRENT or C_HUB_LOCAL_POWER\n");
1035 break;
1036 default:
1037 goto error;
1038 }
1039 break;
1040 case GetHubDescriptor:
1041 DBG("GetHubDescriptor\n");
1042 isp116x_hub_descriptor(isp116x,
1043 (struct usb_hub_descriptor *)buf);
1044 break;
1045 case GetHubStatus:
1046 DBG("GetHubStatus\n");
1047 *(__le32 *) buf = 0;
1048 break;
1049 case GetPortStatus:
1050 DBG("GetPortStatus\n");
1051 if (!wIndex || wIndex > ports)
1052 goto error;
1053 spin_lock_irqsave(&isp116x->lock, flags);
1054 tmp = isp116x_read_reg32(isp116x, (--wIndex) ? HCRHPORT2 : HCRHPORT1);
1055 spin_unlock_irqrestore(&isp116x->lock, flags);
1056 *(__le32 *) buf = cpu_to_le32(tmp);
1057 DBG("GetPortStatus: port[%d] %08x\n", wIndex + 1, tmp);
1058 break;
1059 case ClearPortFeature:
1060 DBG("ClearPortFeature: ");
1061 if (!wIndex || wIndex > ports)
1062 goto error;
1063 wIndex--;
1064
1065 switch (wValue) {
1066 case USB_PORT_FEAT_ENABLE:
1067 DBG("USB_PORT_FEAT_ENABLE\n");
1068 tmp = RH_PS_CCS;
1069 break;
1070 case USB_PORT_FEAT_C_ENABLE:
1071 DBG("USB_PORT_FEAT_C_ENABLE\n");
1072 tmp = RH_PS_PESC;
1073 break;
1074 case USB_PORT_FEAT_SUSPEND:
1075 DBG("USB_PORT_FEAT_SUSPEND\n");
1076 tmp = RH_PS_POCI;
1077 break;
1078 case USB_PORT_FEAT_C_SUSPEND:
1079 DBG("USB_PORT_FEAT_C_SUSPEND\n");
1080 tmp = RH_PS_PSSC;
1081 break;
1082 case USB_PORT_FEAT_POWER:
1083 DBG("USB_PORT_FEAT_POWER\n");
1084 tmp = RH_PS_LSDA;
1085 break;
1086 case USB_PORT_FEAT_C_CONNECTION:
1087 DBG("USB_PORT_FEAT_C_CONNECTION\n");
1088 tmp = RH_PS_CSC;
1089 break;
1090 case USB_PORT_FEAT_C_OVER_CURRENT:
1091 DBG("USB_PORT_FEAT_C_OVER_CURRENT\n");
1092 tmp = RH_PS_OCIC;
1093 break;
1094 case USB_PORT_FEAT_C_RESET:
1095 DBG("USB_PORT_FEAT_C_RESET\n");
1096 tmp = RH_PS_PRSC;
1097 break;
1098 default:
1099 goto error;
1100 }
1101 spin_lock_irqsave(&isp116x->lock, flags);
1102 isp116x_write_reg32(isp116x, wIndex
1103 ? HCRHPORT2 : HCRHPORT1, tmp);
1104 spin_unlock_irqrestore(&isp116x->lock, flags);
1105 break;
1106 case SetPortFeature:
1107 DBG("SetPortFeature: ");
1108 if (!wIndex || wIndex > ports)
1109 goto error;
1110 wIndex--;
1111 switch (wValue) {
1112 case USB_PORT_FEAT_SUSPEND:
1113 DBG("USB_PORT_FEAT_SUSPEND\n");
1114 spin_lock_irqsave(&isp116x->lock, flags);
1115 isp116x_write_reg32(isp116x, wIndex
1116 ? HCRHPORT2 : HCRHPORT1, RH_PS_PSS);
1117 spin_unlock_irqrestore(&isp116x->lock, flags);
1118 break;
1119 case USB_PORT_FEAT_POWER:
1120 DBG("USB_PORT_FEAT_POWER\n");
1121 spin_lock_irqsave(&isp116x->lock, flags);
1122 isp116x_write_reg32(isp116x, wIndex
1123 ? HCRHPORT2 : HCRHPORT1, RH_PS_PPS);
1124 spin_unlock_irqrestore(&isp116x->lock, flags);
1125 break;
1126 case USB_PORT_FEAT_RESET:
1127 DBG("USB_PORT_FEAT_RESET\n");
1128 root_port_reset(isp116x, wIndex);
1129 break;
1130 default:
1131 goto error;
1132 }
1133 break;
1134
1135 default:
1136 error:
1137
1138 DBG("PROTOCOL STALL\n");
1139 ret = -EPIPE;
1140 }
1141 return ret;
1142 }
1143
1144
1145
1146 #ifdef CONFIG_DEBUG_FS
1147
1148 static void dump_irq(struct seq_file *s, char *label, u16 mask)
1149 {
1150 seq_printf(s, "%s %04x%s%s%s%s%s%s\n", label, mask,
1151 mask & HCuPINT_CLKRDY ? " clkrdy" : "",
1152 mask & HCuPINT_SUSP ? " susp" : "",
1153 mask & HCuPINT_OPR ? " opr" : "",
1154 mask & HCuPINT_AIIEOT ? " eot" : "",
1155 mask & HCuPINT_ATL ? " atl" : "",
1156 mask & HCuPINT_SOF ? " sof" : "");
1157 }
1158
1159 static void dump_int(struct seq_file *s, char *label, u32 mask)
1160 {
1161 seq_printf(s, "%s %08x%s%s%s%s%s%s%s\n", label, mask,
1162 mask & HCINT_MIE ? " MIE" : "",
1163 mask & HCINT_RHSC ? " rhsc" : "",
1164 mask & HCINT_FNO ? " fno" : "",
1165 mask & HCINT_UE ? " ue" : "",
1166 mask & HCINT_RD ? " rd" : "",
1167 mask & HCINT_SF ? " sof" : "", mask & HCINT_SO ? " so" : "");
1168 }
1169
1170 static int isp116x_debug_show(struct seq_file *s, void *unused)
1171 {
1172 struct isp116x *isp116x = s->private;
1173
1174 seq_printf(s, "%s\n%s version %s\n",
1175 isp116x_to_hcd(isp116x)->product_desc, hcd_name,
1176 DRIVER_VERSION);
1177
1178 if (HC_IS_SUSPENDED(isp116x_to_hcd(isp116x)->state)) {
1179 seq_printf(s, "HCD is suspended\n");
1180 return 0;
1181 }
1182 if (!HC_IS_RUNNING(isp116x_to_hcd(isp116x)->state)) {
1183 seq_printf(s, "HCD not running\n");
1184 return 0;
1185 }
1186
1187 spin_lock_irq(&isp116x->lock);
1188 dump_irq(s, "hc_irq_enable", isp116x_read_reg16(isp116x, HCuPINTENB));
1189 dump_irq(s, "hc_irq_status", isp116x_read_reg16(isp116x, HCuPINT));
1190 dump_int(s, "hc_int_enable", isp116x_read_reg32(isp116x, HCINTENB));
1191 dump_int(s, "hc_int_status", isp116x_read_reg32(isp116x, HCINTSTAT));
1192 isp116x_show_regs_seq(isp116x, s);
1193 spin_unlock_irq(&isp116x->lock);
1194 seq_printf(s, "\n");
1195
1196 return 0;
1197 }
1198 DEFINE_SHOW_ATTRIBUTE(isp116x_debug);
1199
1200 static void create_debug_file(struct isp116x *isp116x)
1201 {
1202 debugfs_create_file(hcd_name, S_IRUGO, usb_debug_root, isp116x,
1203 &isp116x_debug_fops);
1204 }
1205
1206 static void remove_debug_file(struct isp116x *isp116x)
1207 {
1208 debugfs_remove(debugfs_lookup(hcd_name, usb_debug_root));
1209 }
1210
1211 #else
1212
1213 static inline void create_debug_file(struct isp116x *isp116x) { }
1214 static inline void remove_debug_file(struct isp116x *isp116x) { }
1215
1216 #endif
1217
1218
1219
1220
1221
1222
1223 static int isp116x_sw_reset(struct isp116x *isp116x)
1224 {
1225 int retries = 15;
1226 unsigned long flags;
1227 int ret = 0;
1228
1229 spin_lock_irqsave(&isp116x->lock, flags);
1230 isp116x_write_reg16(isp116x, HCSWRES, HCSWRES_MAGIC);
1231 isp116x_write_reg32(isp116x, HCCMDSTAT, HCCMDSTAT_HCR);
1232 while (--retries) {
1233
1234 mdelay(1);
1235 if (!(isp116x_read_reg32(isp116x, HCCMDSTAT) & HCCMDSTAT_HCR))
1236 break;
1237 }
1238 if (!retries) {
1239 ERR("Software reset timeout\n");
1240 ret = -ETIME;
1241 }
1242 spin_unlock_irqrestore(&isp116x->lock, flags);
1243 return ret;
1244 }
1245
1246 static int isp116x_reset(struct usb_hcd *hcd)
1247 {
1248 struct isp116x *isp116x = hcd_to_isp116x(hcd);
1249 unsigned long t;
1250 u16 clkrdy = 0;
1251 int ret, timeout = 15 ;
1252
1253 ret = isp116x_sw_reset(isp116x);
1254 if (ret)
1255 return ret;
1256
1257 t = jiffies + msecs_to_jiffies(timeout);
1258 while (time_before_eq(jiffies, t)) {
1259 msleep(4);
1260 spin_lock_irq(&isp116x->lock);
1261 clkrdy = isp116x_read_reg16(isp116x, HCuPINT) & HCuPINT_CLKRDY;
1262 spin_unlock_irq(&isp116x->lock);
1263 if (clkrdy)
1264 break;
1265 }
1266 if (!clkrdy) {
1267 ERR("Clock not ready after %dms\n", timeout);
1268
1269
1270 ERR("Please make sure that the H_WAKEUP pin is pulled low!\n");
1271 ret = -ENODEV;
1272 }
1273 return ret;
1274 }
1275
1276 static void isp116x_stop(struct usb_hcd *hcd)
1277 {
1278 struct isp116x *isp116x = hcd_to_isp116x(hcd);
1279 unsigned long flags;
1280 u32 val;
1281
1282 spin_lock_irqsave(&isp116x->lock, flags);
1283 isp116x_write_reg16(isp116x, HCuPINTENB, 0);
1284
1285
1286
1287 val = isp116x_read_reg32(isp116x, HCRHDESCA);
1288 val &= ~(RH_A_NPS | RH_A_PSM);
1289 isp116x_write_reg32(isp116x, HCRHDESCA, val);
1290 isp116x_write_reg32(isp116x, HCRHSTATUS, RH_HS_LPS);
1291 spin_unlock_irqrestore(&isp116x->lock, flags);
1292
1293 isp116x_sw_reset(isp116x);
1294 }
1295
1296
1297
1298
1299 static int isp116x_start(struct usb_hcd *hcd)
1300 {
1301 struct isp116x *isp116x = hcd_to_isp116x(hcd);
1302 struct isp116x_platform_data *board = isp116x->board;
1303 u32 val;
1304 unsigned long flags;
1305
1306 spin_lock_irqsave(&isp116x->lock, flags);
1307
1308
1309 isp116x_write_reg16(isp116x, HCuPINT, 0xff);
1310 isp116x_write_reg16(isp116x, HCuPINTENB, 0);
1311
1312 val = isp116x_read_reg16(isp116x, HCCHIPID);
1313 if ((val & HCCHIPID_MASK) != HCCHIPID_MAGIC) {
1314 ERR("Invalid chip ID %04x\n", val);
1315 spin_unlock_irqrestore(&isp116x->lock, flags);
1316 return -ENODEV;
1317 }
1318
1319
1320 hcd->uses_new_polling = 1;
1321
1322 isp116x_write_reg16(isp116x, HCITLBUFLEN, ISP116x_ITL_BUFSIZE);
1323 isp116x_write_reg16(isp116x, HCATLBUFLEN, ISP116x_ATL_BUFSIZE);
1324
1325
1326 val = HCHWCFG_INT_ENABLE | HCHWCFG_DBWIDTH(1);
1327 if (board->sel15Kres)
1328 val |= HCHWCFG_15KRSEL;
1329
1330 if (board->remote_wakeup_enable)
1331 val |= HCHWCFG_CLKNOTSTOP;
1332 if (board->oc_enable)
1333 val |= HCHWCFG_ANALOG_OC;
1334 if (board->int_act_high)
1335 val |= HCHWCFG_INT_POL;
1336 if (board->int_edge_triggered)
1337 val |= HCHWCFG_INT_TRIGGER;
1338 isp116x_write_reg16(isp116x, HCHWCFG, val);
1339
1340
1341 val = (25 << 24) & RH_A_POTPGT;
1342
1343
1344
1345 val |= RH_A_PSM;
1346
1347 val |= RH_A_OCPM;
1348 isp116x_write_reg32(isp116x, HCRHDESCA, val);
1349 isp116x->rhdesca = isp116x_read_reg32(isp116x, HCRHDESCA);
1350
1351 val = RH_B_PPCM;
1352 isp116x_write_reg32(isp116x, HCRHDESCB, val);
1353 isp116x->rhdescb = isp116x_read_reg32(isp116x, HCRHDESCB);
1354
1355 val = 0;
1356 if (board->remote_wakeup_enable) {
1357 if (!device_can_wakeup(hcd->self.controller))
1358 device_init_wakeup(hcd->self.controller, 1);
1359 val |= RH_HS_DRWE;
1360 }
1361 isp116x_write_reg32(isp116x, HCRHSTATUS, val);
1362 isp116x->rhstatus = isp116x_read_reg32(isp116x, HCRHSTATUS);
1363
1364 isp116x_write_reg32(isp116x, HCFMINTVL, 0x27782edf);
1365
1366 hcd->state = HC_STATE_RUNNING;
1367
1368
1369 isp116x->intenb = HCINT_MIE | HCINT_RHSC | HCINT_UE;
1370 if (board->remote_wakeup_enable)
1371 isp116x->intenb |= HCINT_RD;
1372 isp116x->irqenb = HCuPINT_ATL | HCuPINT_OPR;
1373 isp116x_write_reg32(isp116x, HCINTENB, isp116x->intenb);
1374 isp116x_write_reg16(isp116x, HCuPINTENB, isp116x->irqenb);
1375
1376
1377 val = HCCONTROL_USB_OPER;
1378 if (board->remote_wakeup_enable)
1379 val |= HCCONTROL_RWE;
1380 isp116x_write_reg32(isp116x, HCCONTROL, val);
1381
1382
1383 isp116x_write_reg32(isp116x, HCRHPORT1, RH_PS_CCS);
1384 isp116x_write_reg32(isp116x, HCRHPORT2, RH_PS_CCS);
1385
1386 isp116x_show_regs_log(isp116x);
1387 spin_unlock_irqrestore(&isp116x->lock, flags);
1388 return 0;
1389 }
1390
1391 #ifdef CONFIG_PM
1392
1393 static int isp116x_bus_suspend(struct usb_hcd *hcd)
1394 {
1395 struct isp116x *isp116x = hcd_to_isp116x(hcd);
1396 unsigned long flags;
1397 u32 val;
1398 int ret = 0;
1399
1400 spin_lock_irqsave(&isp116x->lock, flags);
1401 val = isp116x_read_reg32(isp116x, HCCONTROL);
1402
1403 switch (val & HCCONTROL_HCFS) {
1404 case HCCONTROL_USB_OPER:
1405 spin_unlock_irqrestore(&isp116x->lock, flags);
1406 val &= (~HCCONTROL_HCFS & ~HCCONTROL_RWE);
1407 val |= HCCONTROL_USB_SUSPEND;
1408 if (hcd->self.root_hub->do_remote_wakeup)
1409 val |= HCCONTROL_RWE;
1410
1411 msleep(2);
1412 spin_lock_irqsave(&isp116x->lock, flags);
1413 isp116x_write_reg32(isp116x, HCCONTROL, val);
1414 spin_unlock_irqrestore(&isp116x->lock, flags);
1415
1416 msleep(5);
1417 break;
1418 case HCCONTROL_USB_RESUME:
1419 isp116x_write_reg32(isp116x, HCCONTROL,
1420 (val & ~HCCONTROL_HCFS) |
1421 HCCONTROL_USB_RESET);
1422 fallthrough;
1423 case HCCONTROL_USB_RESET:
1424 ret = -EBUSY;
1425 fallthrough;
1426 default:
1427 spin_unlock_irqrestore(&isp116x->lock, flags);
1428 break;
1429 }
1430
1431 return ret;
1432 }
1433
1434 static int isp116x_bus_resume(struct usb_hcd *hcd)
1435 {
1436 struct isp116x *isp116x = hcd_to_isp116x(hcd);
1437 u32 val;
1438
1439 msleep(5);
1440 spin_lock_irq(&isp116x->lock);
1441
1442 val = isp116x_read_reg32(isp116x, HCCONTROL);
1443 switch (val & HCCONTROL_HCFS) {
1444 case HCCONTROL_USB_SUSPEND:
1445 val &= ~HCCONTROL_HCFS;
1446 val |= HCCONTROL_USB_RESUME;
1447 isp116x_write_reg32(isp116x, HCCONTROL, val);
1448 break;
1449 case HCCONTROL_USB_RESUME:
1450 break;
1451 case HCCONTROL_USB_OPER:
1452 spin_unlock_irq(&isp116x->lock);
1453 return 0;
1454 default:
1455
1456
1457 spin_unlock_irq(&isp116x->lock);
1458 DBG("Chip has been reset while suspended. Reinit from scratch.\n");
1459 isp116x_reset(hcd);
1460 isp116x_start(hcd);
1461 isp116x_hub_control(hcd, SetPortFeature,
1462 USB_PORT_FEAT_POWER, 1, NULL, 0);
1463 if ((isp116x->rhdesca & RH_A_NDP) == 2)
1464 isp116x_hub_control(hcd, SetPortFeature,
1465 USB_PORT_FEAT_POWER, 2, NULL, 0);
1466 return 0;
1467 }
1468
1469 val = isp116x->rhdesca & RH_A_NDP;
1470 while (val--) {
1471 u32 stat =
1472 isp116x_read_reg32(isp116x, val ? HCRHPORT2 : HCRHPORT1);
1473
1474 if (!(stat & RH_PS_PSS))
1475 continue;
1476 DBG("%s: Resuming port %d\n", __func__, val);
1477 isp116x_write_reg32(isp116x, RH_PS_POCI, val
1478 ? HCRHPORT2 : HCRHPORT1);
1479 }
1480 spin_unlock_irq(&isp116x->lock);
1481
1482 hcd->state = HC_STATE_RESUMING;
1483 msleep(USB_RESUME_TIMEOUT);
1484
1485
1486 spin_lock_irq(&isp116x->lock);
1487 val = isp116x_read_reg32(isp116x, HCCONTROL);
1488 isp116x_write_reg32(isp116x, HCCONTROL,
1489 (val & ~HCCONTROL_HCFS) | HCCONTROL_USB_OPER);
1490 spin_unlock_irq(&isp116x->lock);
1491 hcd->state = HC_STATE_RUNNING;
1492
1493 return 0;
1494 }
1495
1496 #else
1497
1498 #define isp116x_bus_suspend NULL
1499 #define isp116x_bus_resume NULL
1500
1501 #endif
1502
1503 static const struct hc_driver isp116x_hc_driver = {
1504 .description = hcd_name,
1505 .product_desc = "ISP116x Host Controller",
1506 .hcd_priv_size = sizeof(struct isp116x),
1507
1508 .irq = isp116x_irq,
1509 .flags = HCD_USB11,
1510
1511 .reset = isp116x_reset,
1512 .start = isp116x_start,
1513 .stop = isp116x_stop,
1514
1515 .urb_enqueue = isp116x_urb_enqueue,
1516 .urb_dequeue = isp116x_urb_dequeue,
1517 .endpoint_disable = isp116x_endpoint_disable,
1518
1519 .get_frame_number = isp116x_get_frame,
1520
1521 .hub_status_data = isp116x_hub_status_data,
1522 .hub_control = isp116x_hub_control,
1523 .bus_suspend = isp116x_bus_suspend,
1524 .bus_resume = isp116x_bus_resume,
1525 };
1526
1527
1528
1529 static int isp116x_remove(struct platform_device *pdev)
1530 {
1531 struct usb_hcd *hcd = platform_get_drvdata(pdev);
1532 struct isp116x *isp116x;
1533 struct resource *res;
1534
1535 if (!hcd)
1536 return 0;
1537 isp116x = hcd_to_isp116x(hcd);
1538 remove_debug_file(isp116x);
1539 usb_remove_hcd(hcd);
1540
1541 iounmap(isp116x->data_reg);
1542 res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
1543 if (res)
1544 release_mem_region(res->start, 2);
1545 iounmap(isp116x->addr_reg);
1546 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1547 if (res)
1548 release_mem_region(res->start, 2);
1549
1550 usb_put_hcd(hcd);
1551 return 0;
1552 }
1553
1554 static int isp116x_probe(struct platform_device *pdev)
1555 {
1556 struct usb_hcd *hcd;
1557 struct isp116x *isp116x;
1558 struct resource *addr, *data, *ires;
1559 void __iomem *addr_reg;
1560 void __iomem *data_reg;
1561 int irq;
1562 int ret = 0;
1563 unsigned long irqflags;
1564
1565 if (usb_disabled())
1566 return -ENODEV;
1567
1568 if (pdev->num_resources < 3) {
1569 ret = -ENODEV;
1570 goto err1;
1571 }
1572
1573 data = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1574 addr = platform_get_resource(pdev, IORESOURCE_MEM, 1);
1575 ires = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
1576
1577 if (!addr || !data || !ires) {
1578 ret = -ENODEV;
1579 goto err1;
1580 }
1581
1582 irq = ires->start;
1583 irqflags = ires->flags & IRQF_TRIGGER_MASK;
1584
1585 if (!request_mem_region(addr->start, 2, hcd_name)) {
1586 ret = -EBUSY;
1587 goto err1;
1588 }
1589 addr_reg = ioremap(addr->start, resource_size(addr));
1590 if (addr_reg == NULL) {
1591 ret = -ENOMEM;
1592 goto err2;
1593 }
1594 if (!request_mem_region(data->start, 2, hcd_name)) {
1595 ret = -EBUSY;
1596 goto err3;
1597 }
1598 data_reg = ioremap(data->start, resource_size(data));
1599 if (data_reg == NULL) {
1600 ret = -ENOMEM;
1601 goto err4;
1602 }
1603
1604
1605 hcd = usb_create_hcd(&isp116x_hc_driver, &pdev->dev, dev_name(&pdev->dev));
1606 if (!hcd) {
1607 ret = -ENOMEM;
1608 goto err5;
1609 }
1610
1611 hcd->rsrc_start = addr->start;
1612 isp116x = hcd_to_isp116x(hcd);
1613 isp116x->data_reg = data_reg;
1614 isp116x->addr_reg = addr_reg;
1615 spin_lock_init(&isp116x->lock);
1616 INIT_LIST_HEAD(&isp116x->async);
1617 isp116x->board = dev_get_platdata(&pdev->dev);
1618
1619 if (!isp116x->board) {
1620 ERR("Platform data structure not initialized\n");
1621 ret = -ENODEV;
1622 goto err6;
1623 }
1624 if (isp116x_check_platform_delay(isp116x)) {
1625 ERR("USE_PLATFORM_DELAY defined, but delay function not "
1626 "implemented.\n");
1627 ERR("See comments in drivers/usb/host/isp116x-hcd.c\n");
1628 ret = -ENODEV;
1629 goto err6;
1630 }
1631
1632 ret = usb_add_hcd(hcd, irq, irqflags);
1633 if (ret)
1634 goto err6;
1635
1636 device_wakeup_enable(hcd->self.controller);
1637
1638 create_debug_file(isp116x);
1639
1640 return 0;
1641
1642 err6:
1643 usb_put_hcd(hcd);
1644 err5:
1645 iounmap(data_reg);
1646 err4:
1647 release_mem_region(data->start, 2);
1648 err3:
1649 iounmap(addr_reg);
1650 err2:
1651 release_mem_region(addr->start, 2);
1652 err1:
1653 ERR("init error, %d\n", ret);
1654 return ret;
1655 }
1656
1657 #ifdef CONFIG_PM
1658
1659
1660
1661 static int isp116x_suspend(struct platform_device *dev, pm_message_t state)
1662 {
1663 VDBG("%s: state %x\n", __func__, state.event);
1664 return 0;
1665 }
1666
1667
1668
1669
1670 static int isp116x_resume(struct platform_device *dev)
1671 {
1672 VDBG("%s\n", __func__);
1673 return 0;
1674 }
1675
1676 #else
1677
1678 #define isp116x_suspend NULL
1679 #define isp116x_resume NULL
1680
1681 #endif
1682
1683
1684 MODULE_ALIAS("platform:isp116x-hcd");
1685
1686 static struct platform_driver isp116x_driver = {
1687 .probe = isp116x_probe,
1688 .remove = isp116x_remove,
1689 .suspend = isp116x_suspend,
1690 .resume = isp116x_resume,
1691 .driver = {
1692 .name = hcd_name,
1693 },
1694 };
1695
1696 module_platform_driver(isp116x_driver);