This source file includes following definitions.
- write_ptddata_to_fifo
- read_ptddata_from_fifo
- pack_fifo
- unpack_fifo
- preproc_atl_queue
- finish_request
- postproc_atl_queue
- start_atl_transfers
- finish_atl_transfers
- isp116x_irq
- balance
- isp116x_urb_enqueue
- isp116x_urb_dequeue
- isp116x_endpoint_disable
- isp116x_get_frame
- isp116x_hub_status_data
- isp116x_hub_descriptor
- root_port_reset
- isp116x_hub_control
- dump_irq
- dump_int
- isp116x_debug_show
- create_debug_file
- remove_debug_file
- create_debug_file
- remove_debug_file
- isp116x_sw_reset
- isp116x_reset
- isp116x_stop
- isp116x_start
- isp116x_bus_suspend
- isp116x_bus_resume
- isp116x_remove
- isp116x_probe
- isp116x_suspend
- isp116x_resume
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49 #define USE_PLATFORM_DELAY
50
51
52
53
54
55
56
57
58
59 #include <linux/module.h>
60 #include <linux/delay.h>
61 #include <linux/debugfs.h>
62 #include <linux/seq_file.h>
63 #include <linux/errno.h>
64 #include <linux/list.h>
65 #include <linux/slab.h>
66 #include <linux/usb.h>
67 #include <linux/usb/isp116x.h>
68 #include <linux/usb/hcd.h>
69 #include <linux/platform_device.h>
70
71 #include <asm/io.h>
72 #include <asm/irq.h>
73 #include <asm/byteorder.h>
74
75 #include "isp116x.h"
76
77 #define DRIVER_VERSION "03 Nov 2005"
78 #define DRIVER_DESC "ISP116x USB Host Controller Driver"
79
80 MODULE_DESCRIPTION(DRIVER_DESC);
81 MODULE_LICENSE("GPL");
82
83 static const char hcd_name[] = "isp116x-hcd";
84
85
86
87
88
89
90 static void write_ptddata_to_fifo(struct isp116x *isp116x, void *buf, int len)
91 {
92 u8 *dp = (u8 *) buf;
93 u16 *dp2 = (u16 *) buf;
94 u16 w;
95 int quot = len % 4;
96
97
98
99
100
101 if ((unsigned long)dp2 & 1) {
102
103 for (; len > 1; len -= 2) {
104 w = *dp++;
105 w |= *dp++ << 8;
106 isp116x_raw_write_data16(isp116x, w);
107 }
108 if (len)
109 isp116x_write_data16(isp116x, (u16) * dp);
110 } else {
111
112 for (; len > 1; len -= 2) {
113
114 isp116x_raw_write_data16(isp116x, cpu_to_le16(*dp2++));
115 }
116
117 if (len)
118 isp116x_write_data16(isp116x, 0xff & *((u8 *) dp2));
119 }
120 if (quot == 1 || quot == 2)
121 isp116x_raw_write_data16(isp116x, 0);
122 }
123
124
125
126
127 static void read_ptddata_from_fifo(struct isp116x *isp116x, void *buf, int len)
128 {
129 u8 *dp = (u8 *) buf;
130 u16 *dp2 = (u16 *) buf;
131 u16 w;
132 int quot = len % 4;
133
134
135
136
137
138 if ((unsigned long)dp2 & 1) {
139
140 for (; len > 1; len -= 2) {
141 w = isp116x_raw_read_data16(isp116x);
142 *dp++ = w & 0xff;
143 *dp++ = (w >> 8) & 0xff;
144 }
145
146 if (len)
147 *dp = 0xff & isp116x_read_data16(isp116x);
148 } else {
149
150 for (; len > 1; len -= 2) {
151
152 *dp2++ = le16_to_cpu(isp116x_raw_read_data16(isp116x));
153 }
154
155 if (len)
156 *(u8 *) dp2 = 0xff & isp116x_read_data16(isp116x);
157 }
158 if (quot == 1 || quot == 2)
159 isp116x_raw_read_data16(isp116x);
160 }
161
162
163
164
165
166 static void pack_fifo(struct isp116x *isp116x)
167 {
168 struct isp116x_ep *ep;
169 struct ptd *ptd;
170 int buflen = isp116x->atl_last_dir == PTD_DIR_IN
171 ? isp116x->atl_bufshrt : isp116x->atl_buflen;
172
173 isp116x_write_reg16(isp116x, HCuPINT, HCuPINT_AIIEOT);
174 isp116x_write_reg16(isp116x, HCXFERCTR, buflen);
175 isp116x_write_addr(isp116x, HCATLPORT | ISP116x_WRITE_OFFSET);
176 for (ep = isp116x->atl_active; ep; ep = ep->active) {
177 ptd = &ep->ptd;
178 dump_ptd(ptd);
179 dump_ptd_out_data(ptd, ep->data);
180 isp116x_write_data16(isp116x, ptd->count);
181 isp116x_write_data16(isp116x, ptd->mps);
182 isp116x_write_data16(isp116x, ptd->len);
183 isp116x_write_data16(isp116x, ptd->faddr);
184 buflen -= sizeof(struct ptd);
185
186 if (ep->active || (isp116x->atl_last_dir != PTD_DIR_IN)) {
187 write_ptddata_to_fifo(isp116x, ep->data, ep->length);
188 buflen -= ALIGN(ep->length, 4);
189 }
190 }
191 BUG_ON(buflen);
192 }
193
194
195
196
197
198 static void unpack_fifo(struct isp116x *isp116x)
199 {
200 struct isp116x_ep *ep;
201 struct ptd *ptd;
202 int buflen = isp116x->atl_last_dir == PTD_DIR_IN
203 ? isp116x->atl_buflen : isp116x->atl_bufshrt;
204
205 isp116x_write_reg16(isp116x, HCuPINT, HCuPINT_AIIEOT);
206 isp116x_write_reg16(isp116x, HCXFERCTR, buflen);
207 isp116x_write_addr(isp116x, HCATLPORT);
208 for (ep = isp116x->atl_active; ep; ep = ep->active) {
209 ptd = &ep->ptd;
210 ptd->count = isp116x_read_data16(isp116x);
211 ptd->mps = isp116x_read_data16(isp116x);
212 ptd->len = isp116x_read_data16(isp116x);
213 ptd->faddr = isp116x_read_data16(isp116x);
214 buflen -= sizeof(struct ptd);
215
216 if (ep->active || (isp116x->atl_last_dir == PTD_DIR_IN)) {
217 read_ptddata_from_fifo(isp116x, ep->data, ep->length);
218 buflen -= ALIGN(ep->length, 4);
219 }
220 dump_ptd(ptd);
221 dump_ptd_in_data(ptd, ep->data);
222 }
223 BUG_ON(buflen);
224 }
225
226
227
228
229
230
231 static void preproc_atl_queue(struct isp116x *isp116x)
232 {
233 struct isp116x_ep *ep;
234 struct urb *urb;
235 struct ptd *ptd;
236 u16 len;
237
238 for (ep = isp116x->atl_active; ep; ep = ep->active) {
239 u16 toggle = 0, dir = PTD_DIR_SETUP;
240
241 BUG_ON(list_empty(&ep->hep->urb_list));
242 urb = container_of(ep->hep->urb_list.next,
243 struct urb, urb_list);
244 ptd = &ep->ptd;
245 len = ep->length;
246 ep->data = (unsigned char *)urb->transfer_buffer
247 + urb->actual_length;
248
249 switch (ep->nextpid) {
250 case USB_PID_IN:
251 toggle = usb_gettoggle(urb->dev, ep->epnum, 0);
252 dir = PTD_DIR_IN;
253 break;
254 case USB_PID_OUT:
255 toggle = usb_gettoggle(urb->dev, ep->epnum, 1);
256 dir = PTD_DIR_OUT;
257 break;
258 case USB_PID_SETUP:
259 len = sizeof(struct usb_ctrlrequest);
260 ep->data = urb->setup_packet;
261 break;
262 case USB_PID_ACK:
263 toggle = 1;
264 len = 0;
265 dir = (urb->transfer_buffer_length
266 && usb_pipein(urb->pipe))
267 ? PTD_DIR_OUT : PTD_DIR_IN;
268 break;
269 default:
270 ERR("%s %d: ep->nextpid %d\n", __func__, __LINE__,
271 ep->nextpid);
272 BUG();
273 }
274
275 ptd->count = PTD_CC_MSK | PTD_ACTIVE_MSK | PTD_TOGGLE(toggle);
276 ptd->mps = PTD_MPS(ep->maxpacket)
277 | PTD_SPD(urb->dev->speed == USB_SPEED_LOW)
278 | PTD_EP(ep->epnum);
279 ptd->len = PTD_LEN(len) | PTD_DIR(dir);
280 ptd->faddr = PTD_FA(usb_pipedevice(urb->pipe));
281 if (!ep->active) {
282 ptd->mps |= PTD_LAST_MSK;
283 isp116x->atl_last_dir = dir;
284 }
285 isp116x->atl_bufshrt = sizeof(struct ptd) + isp116x->atl_buflen;
286 isp116x->atl_buflen = isp116x->atl_bufshrt + ALIGN(len, 4);
287 }
288 }
289
290
291
292
293
294 static void finish_request(struct isp116x *isp116x, struct isp116x_ep *ep,
295 struct urb *urb, int status)
296 __releases(isp116x->lock) __acquires(isp116x->lock)
297 {
298 unsigned i;
299
300 ep->error_count = 0;
301
302 if (usb_pipecontrol(urb->pipe))
303 ep->nextpid = USB_PID_SETUP;
304
305 urb_dbg(urb, "Finish");
306
307 usb_hcd_unlink_urb_from_ep(isp116x_to_hcd(isp116x), urb);
308 spin_unlock(&isp116x->lock);
309 usb_hcd_giveback_urb(isp116x_to_hcd(isp116x), urb, status);
310 spin_lock(&isp116x->lock);
311
312
313 if (!list_empty(&ep->hep->urb_list))
314 return;
315
316
317 if (!list_empty(&ep->schedule)) {
318 list_del_init(&ep->schedule);
319 return;
320 }
321
322
323 DBG("deschedule qh%d/%p branch %d\n", ep->period, ep, ep->branch);
324 for (i = ep->branch; i < PERIODIC_SIZE; i += ep->period) {
325 struct isp116x_ep *temp;
326 struct isp116x_ep **prev = &isp116x->periodic[i];
327
328 while (*prev && ((temp = *prev) != ep))
329 prev = &temp->next;
330 if (*prev)
331 *prev = ep->next;
332 isp116x->load[i] -= ep->load;
333 }
334 ep->branch = PERIODIC_SIZE;
335 isp116x_to_hcd(isp116x)->self.bandwidth_allocated -=
336 ep->load / ep->period;
337
338
339 if (!--isp116x->periodic_count) {
340 isp116x->irqenb &= ~HCuPINT_SOF;
341 isp116x->irqenb |= HCuPINT_ATL;
342 }
343 }
344
345
346
347
348 static void postproc_atl_queue(struct isp116x *isp116x)
349 {
350 struct isp116x_ep *ep;
351 struct urb *urb;
352 struct usb_device *udev;
353 struct ptd *ptd;
354 int short_not_ok;
355 int status;
356 u8 cc;
357
358 for (ep = isp116x->atl_active; ep; ep = ep->active) {
359 BUG_ON(list_empty(&ep->hep->urb_list));
360 urb =
361 container_of(ep->hep->urb_list.next, struct urb, urb_list);
362 udev = urb->dev;
363 ptd = &ep->ptd;
364 cc = PTD_GET_CC(ptd);
365 short_not_ok = 1;
366 status = -EINPROGRESS;
367
368
369
370
371
372
373 if (cc == TD_DATAUNDERRUN) {
374 if (!(urb->transfer_flags & URB_SHORT_NOT_OK) ||
375 usb_pipecontrol(urb->pipe)) {
376 DBG("Allowed or control data underrun\n");
377 cc = TD_CC_NOERROR;
378 short_not_ok = 0;
379 } else {
380 ep->error_count = 1;
381 usb_settoggle(udev, ep->epnum,
382 ep->nextpid == USB_PID_OUT,
383 PTD_GET_TOGGLE(ptd));
384 urb->actual_length += PTD_GET_COUNT(ptd);
385 status = cc_to_error[TD_DATAUNDERRUN];
386 goto done;
387 }
388 }
389
390 if (cc != TD_CC_NOERROR && cc != TD_NOTACCESSED
391 && (++ep->error_count >= 3 || cc == TD_CC_STALL
392 || cc == TD_DATAOVERRUN)) {
393 status = cc_to_error[cc];
394 if (ep->nextpid == USB_PID_ACK)
395 ep->nextpid = 0;
396 goto done;
397 }
398
399
400
401 if (usb_pipeint(urb->pipe) && !PTD_GET_LEN(ptd)) {
402 status = 0;
403 goto done;
404 }
405
406
407
408 if (ep->error_count
409 && (cc == TD_CC_NOERROR || cc == TD_NOTACCESSED))
410 ep->error_count = 0;
411
412
413
414 if (ep->nextpid == USB_PID_OUT)
415 usb_settoggle(udev, ep->epnum, 1, PTD_GET_TOGGLE(ptd)
416 ^ (ep->error_count > 0));
417 else if (ep->nextpid == USB_PID_IN)
418 usb_settoggle(udev, ep->epnum, 0, PTD_GET_TOGGLE(ptd)
419 ^ (ep->error_count > 0));
420
421 switch (ep->nextpid) {
422 case USB_PID_IN:
423 case USB_PID_OUT:
424 urb->actual_length += PTD_GET_COUNT(ptd);
425 if (PTD_GET_ACTIVE(ptd)
426 || (cc != TD_CC_NOERROR && cc < 0x0E))
427 break;
428 if (urb->transfer_buffer_length != urb->actual_length) {
429 if (short_not_ok)
430 break;
431 } else {
432 if (urb->transfer_flags & URB_ZERO_PACKET
433 && ep->nextpid == USB_PID_OUT
434 && !(PTD_GET_COUNT(ptd) % ep->maxpacket)) {
435 DBG("Zero packet requested\n");
436 break;
437 }
438 }
439
440 if (usb_pipecontrol(urb->pipe))
441 ep->nextpid = USB_PID_ACK;
442 else
443 status = 0;
444 break;
445 case USB_PID_SETUP:
446 if (PTD_GET_ACTIVE(ptd)
447 || (cc != TD_CC_NOERROR && cc < 0x0E))
448 break;
449 if (urb->transfer_buffer_length == urb->actual_length)
450 ep->nextpid = USB_PID_ACK;
451 else if (usb_pipeout(urb->pipe)) {
452 usb_settoggle(udev, 0, 1, 1);
453 ep->nextpid = USB_PID_OUT;
454 } else {
455 usb_settoggle(udev, 0, 0, 1);
456 ep->nextpid = USB_PID_IN;
457 }
458 break;
459 case USB_PID_ACK:
460 if (PTD_GET_ACTIVE(ptd)
461 || (cc != TD_CC_NOERROR && cc < 0x0E))
462 break;
463 status = 0;
464 ep->nextpid = 0;
465 break;
466 default:
467 BUG();
468 }
469
470 done:
471 if (status != -EINPROGRESS || urb->unlinked)
472 finish_request(isp116x, ep, urb, status);
473 }
474 }
475
476
477
478
479
480 static void start_atl_transfers(struct isp116x *isp116x)
481 {
482 struct isp116x_ep *last_ep = NULL, *ep;
483 struct urb *urb;
484 u16 load = 0;
485 int len, index, speed, byte_time;
486
487 if (atomic_read(&isp116x->atl_finishing))
488 return;
489
490 if (!HC_IS_RUNNING(isp116x_to_hcd(isp116x)->state))
491 return;
492
493
494 if (isp116x_read_reg16(isp116x, HCBUFSTAT) & HCBUFSTAT_ATL_FULL)
495 return;
496
497 isp116x->atl_active = NULL;
498 isp116x->atl_buflen = isp116x->atl_bufshrt = 0;
499
500
501 if (isp116x->periodic_count) {
502 isp116x->fmindex = index =
503 (isp116x->fmindex + 1) & (PERIODIC_SIZE - 1);
504 load = isp116x->load[index];
505 if (load) {
506
507
508 isp116x->atl_active = last_ep =
509 isp116x->periodic[index];
510 while (last_ep->next)
511 last_ep = (last_ep->active = last_ep->next);
512 last_ep->active = NULL;
513 }
514 }
515
516
517 list_for_each_entry(ep, &isp116x->async, schedule) {
518 urb = container_of(ep->hep->urb_list.next,
519 struct urb, urb_list);
520 speed = urb->dev->speed;
521 byte_time = speed == USB_SPEED_LOW
522 ? BYTE_TIME_LOWSPEED : BYTE_TIME_FULLSPEED;
523
524 if (ep->nextpid == USB_PID_SETUP) {
525 len = sizeof(struct usb_ctrlrequest);
526 } else if (ep->nextpid == USB_PID_ACK) {
527 len = 0;
528 } else {
529
530 len = (MAX_LOAD_LIMIT - load) / byte_time;
531
532
533 len = min(len, speed == USB_SPEED_LOW ?
534 MAX_TRANSFER_SIZE_LOWSPEED :
535 MAX_TRANSFER_SIZE_FULLSPEED);
536
537
538
539 if (len <
540 (urb->transfer_buffer_length -
541 urb->actual_length)) {
542 len -= len % ep->maxpacket;
543 if (!len)
544 continue;
545 } else
546 len = urb->transfer_buffer_length -
547 urb->actual_length;
548 BUG_ON(len < 0);
549 }
550
551 load += len * byte_time;
552 if (load > MAX_LOAD_LIMIT)
553 break;
554
555 ep->active = NULL;
556 ep->length = len;
557 if (last_ep)
558 last_ep->active = ep;
559 else
560 isp116x->atl_active = ep;
561 last_ep = ep;
562 }
563
564
565 if ((&isp116x->async)->next != (&isp116x->async)->prev)
566 list_move(&isp116x->async, (&isp116x->async)->next);
567
568 if (isp116x->atl_active) {
569 preproc_atl_queue(isp116x);
570 pack_fifo(isp116x);
571 }
572 }
573
574
575
576
577 static void finish_atl_transfers(struct isp116x *isp116x)
578 {
579 if (!isp116x->atl_active)
580 return;
581
582 if (!(isp116x_read_reg16(isp116x, HCBUFSTAT) & HCBUFSTAT_ATL_DONE))
583 return;
584
585 atomic_inc(&isp116x->atl_finishing);
586 unpack_fifo(isp116x);
587 postproc_atl_queue(isp116x);
588 atomic_dec(&isp116x->atl_finishing);
589 }
590
591 static irqreturn_t isp116x_irq(struct usb_hcd *hcd)
592 {
593 struct isp116x *isp116x = hcd_to_isp116x(hcd);
594 u16 irqstat;
595 irqreturn_t ret = IRQ_NONE;
596
597 spin_lock(&isp116x->lock);
598 isp116x_write_reg16(isp116x, HCuPINTENB, 0);
599 irqstat = isp116x_read_reg16(isp116x, HCuPINT);
600 isp116x_write_reg16(isp116x, HCuPINT, irqstat);
601
602 if (irqstat & (HCuPINT_ATL | HCuPINT_SOF)) {
603 ret = IRQ_HANDLED;
604 finish_atl_transfers(isp116x);
605 }
606
607 if (irqstat & HCuPINT_OPR) {
608 u32 intstat = isp116x_read_reg32(isp116x, HCINTSTAT);
609 isp116x_write_reg32(isp116x, HCINTSTAT, intstat);
610 if (intstat & HCINT_UE) {
611 ERR("Unrecoverable error, HC is dead!\n");
612
613
614 hcd->state = HC_STATE_HALT;
615 usb_hc_died(hcd);
616 ret = IRQ_HANDLED;
617 goto done;
618 }
619 if (intstat & HCINT_RHSC)
620
621
622
623 mod_timer(&hcd->rh_timer, jiffies
624 + msecs_to_jiffies(20) + 1);
625 if (intstat & HCINT_RD) {
626 DBG("---- remote wakeup\n");
627 usb_hcd_resume_root_hub(hcd);
628 }
629 irqstat &= ~HCuPINT_OPR;
630 ret = IRQ_HANDLED;
631 }
632
633 if (irqstat & (HCuPINT_ATL | HCuPINT_SOF)) {
634 start_atl_transfers(isp116x);
635 }
636
637 isp116x_write_reg16(isp116x, HCuPINTENB, isp116x->irqenb);
638 done:
639 spin_unlock(&isp116x->lock);
640 return ret;
641 }
642
643
644
645
646
647
648
649
650
651 #define MAX_PERIODIC_LOAD 600
652 static int balance(struct isp116x *isp116x, u16 period, u16 load)
653 {
654 int i, branch = -ENOSPC;
655
656
657
658 for (i = 0; i < period; i++) {
659 if (branch < 0 || isp116x->load[branch] > isp116x->load[i]) {
660 int j;
661
662 for (j = i; j < PERIODIC_SIZE; j += period) {
663 if ((isp116x->load[j] + load)
664 > MAX_PERIODIC_LOAD)
665 break;
666 }
667 if (j < PERIODIC_SIZE)
668 continue;
669 branch = i;
670 }
671 }
672 return branch;
673 }
674
675
676
677
678
679
680
681 static int isp116x_urb_enqueue(struct usb_hcd *hcd,
682 struct urb *urb,
683 gfp_t mem_flags)
684 {
685 struct isp116x *isp116x = hcd_to_isp116x(hcd);
686 struct usb_device *udev = urb->dev;
687 unsigned int pipe = urb->pipe;
688 int is_out = !usb_pipein(pipe);
689 int type = usb_pipetype(pipe);
690 int epnum = usb_pipeendpoint(pipe);
691 struct usb_host_endpoint *hep = urb->ep;
692 struct isp116x_ep *ep = NULL;
693 unsigned long flags;
694 int i;
695 int ret = 0;
696
697 urb_dbg(urb, "Enqueue");
698
699 if (type == PIPE_ISOCHRONOUS) {
700 ERR("Isochronous transfers not supported\n");
701 urb_dbg(urb, "Refused to enqueue");
702 return -ENXIO;
703 }
704
705 if (!hep->hcpriv) {
706 ep = kzalloc(sizeof *ep, mem_flags);
707 if (!ep)
708 return -ENOMEM;
709 }
710
711 spin_lock_irqsave(&isp116x->lock, flags);
712 if (!HC_IS_RUNNING(hcd->state)) {
713 kfree(ep);
714 ret = -ENODEV;
715 goto fail_not_linked;
716 }
717 ret = usb_hcd_link_urb_to_ep(hcd, urb);
718 if (ret) {
719 kfree(ep);
720 goto fail_not_linked;
721 }
722
723 if (hep->hcpriv)
724 ep = hep->hcpriv;
725 else {
726 INIT_LIST_HEAD(&ep->schedule);
727 ep->udev = udev;
728 ep->epnum = epnum;
729 ep->maxpacket = usb_maxpacket(udev, urb->pipe, is_out);
730 usb_settoggle(udev, epnum, is_out, 0);
731
732 if (type == PIPE_CONTROL) {
733 ep->nextpid = USB_PID_SETUP;
734 } else if (is_out) {
735 ep->nextpid = USB_PID_OUT;
736 } else {
737 ep->nextpid = USB_PID_IN;
738 }
739
740 if (urb->interval) {
741
742
743
744
745
746
747
748
749
750
751 if (urb->interval < 2)
752 urb->interval = 2;
753 if (urb->interval > 2 * PERIODIC_SIZE)
754 urb->interval = 2 * PERIODIC_SIZE;
755 ep->period = urb->interval >> 1;
756 ep->branch = PERIODIC_SIZE;
757 ep->load = usb_calc_bus_time(udev->speed,
758 !is_out,
759 (type == PIPE_ISOCHRONOUS),
760 usb_maxpacket(udev, pipe,
761 is_out)) /
762 1000;
763 }
764 hep->hcpriv = ep;
765 ep->hep = hep;
766 }
767
768
769 switch (type) {
770 case PIPE_CONTROL:
771 case PIPE_BULK:
772 if (list_empty(&ep->schedule))
773 list_add_tail(&ep->schedule, &isp116x->async);
774 break;
775 case PIPE_INTERRUPT:
776 urb->interval = ep->period;
777 ep->length = min_t(u32, ep->maxpacket,
778 urb->transfer_buffer_length);
779
780
781 if (ep->branch < PERIODIC_SIZE)
782 break;
783
784 ep->branch = ret = balance(isp116x, ep->period, ep->load);
785 if (ret < 0)
786 goto fail;
787 ret = 0;
788
789 urb->start_frame = (isp116x->fmindex & (PERIODIC_SIZE - 1))
790 + ep->branch;
791
792
793
794
795 DBG("schedule qh%d/%p branch %d\n", ep->period, ep, ep->branch);
796 for (i = ep->branch; i < PERIODIC_SIZE; i += ep->period) {
797 struct isp116x_ep **prev = &isp116x->periodic[i];
798 struct isp116x_ep *here = *prev;
799
800 while (here && ep != here) {
801 if (ep->period > here->period)
802 break;
803 prev = &here->next;
804 here = *prev;
805 }
806 if (ep != here) {
807 ep->next = here;
808 *prev = ep;
809 }
810 isp116x->load[i] += ep->load;
811 }
812 hcd->self.bandwidth_allocated += ep->load / ep->period;
813
814
815 if (!isp116x->periodic_count++) {
816 isp116x->irqenb &= ~HCuPINT_ATL;
817 isp116x->irqenb |= HCuPINT_SOF;
818 isp116x_write_reg16(isp116x, HCuPINTENB,
819 isp116x->irqenb);
820 }
821 }
822
823 urb->hcpriv = hep;
824 start_atl_transfers(isp116x);
825
826 fail:
827 if (ret)
828 usb_hcd_unlink_urb_from_ep(hcd, urb);
829 fail_not_linked:
830 spin_unlock_irqrestore(&isp116x->lock, flags);
831 return ret;
832 }
833
834
835
836
837 static int isp116x_urb_dequeue(struct usb_hcd *hcd, struct urb *urb,
838 int status)
839 {
840 struct isp116x *isp116x = hcd_to_isp116x(hcd);
841 struct usb_host_endpoint *hep;
842 struct isp116x_ep *ep, *ep_act;
843 unsigned long flags;
844 int rc;
845
846 spin_lock_irqsave(&isp116x->lock, flags);
847 rc = usb_hcd_check_unlink_urb(hcd, urb, status);
848 if (rc)
849 goto done;
850
851 hep = urb->hcpriv;
852 ep = hep->hcpriv;
853 WARN_ON(hep != ep->hep);
854
855
856 if (ep->hep->urb_list.next == &urb->urb_list)
857
858 for (ep_act = isp116x->atl_active; ep_act;
859 ep_act = ep_act->active)
860 if (ep_act == ep) {
861 VDBG("dequeue, urb %p active; wait for irq\n",
862 urb);
863 urb = NULL;
864 break;
865 }
866
867 if (urb)
868 finish_request(isp116x, ep, urb, status);
869 done:
870 spin_unlock_irqrestore(&isp116x->lock, flags);
871 return rc;
872 }
873
874 static void isp116x_endpoint_disable(struct usb_hcd *hcd,
875 struct usb_host_endpoint *hep)
876 {
877 int i;
878 struct isp116x_ep *ep = hep->hcpriv;
879
880 if (!ep)
881 return;
882
883
884 for (i = 0; i < 100 && !list_empty(&hep->urb_list); i++)
885 msleep(3);
886 if (!list_empty(&hep->urb_list))
887 WARNING("ep %p not empty?\n", ep);
888
889 kfree(ep);
890 hep->hcpriv = NULL;
891 }
892
893 static int isp116x_get_frame(struct usb_hcd *hcd)
894 {
895 struct isp116x *isp116x = hcd_to_isp116x(hcd);
896 u32 fmnum;
897 unsigned long flags;
898
899 spin_lock_irqsave(&isp116x->lock, flags);
900 fmnum = isp116x_read_reg32(isp116x, HCFMNUM);
901 spin_unlock_irqrestore(&isp116x->lock, flags);
902 return (int)fmnum;
903 }
904
905
906
907
908 static int isp116x_hub_status_data(struct usb_hcd *hcd, char *buf)
909 {
910 struct isp116x *isp116x = hcd_to_isp116x(hcd);
911 int ports, i, changed = 0;
912 unsigned long flags;
913
914 if (!HC_IS_RUNNING(hcd->state))
915 return -ESHUTDOWN;
916
917
918
919 if (timer_pending(&hcd->rh_timer))
920 return 0;
921
922 ports = isp116x->rhdesca & RH_A_NDP;
923 spin_lock_irqsave(&isp116x->lock, flags);
924 isp116x->rhstatus = isp116x_read_reg32(isp116x, HCRHSTATUS);
925 if (isp116x->rhstatus & (RH_HS_LPSC | RH_HS_OCIC))
926 buf[0] = changed = 1;
927 else
928 buf[0] = 0;
929
930 for (i = 0; i < ports; i++) {
931 u32 status = isp116x_read_reg32(isp116x, i ? HCRHPORT2 : HCRHPORT1);
932
933 if (status & (RH_PS_CSC | RH_PS_PESC | RH_PS_PSSC
934 | RH_PS_OCIC | RH_PS_PRSC)) {
935 changed = 1;
936 buf[0] |= 1 << (i + 1);
937 }
938 }
939 spin_unlock_irqrestore(&isp116x->lock, flags);
940 return changed;
941 }
942
943 static void isp116x_hub_descriptor(struct isp116x *isp116x,
944 struct usb_hub_descriptor *desc)
945 {
946 u32 reg = isp116x->rhdesca;
947
948 desc->bDescriptorType = USB_DT_HUB;
949 desc->bDescLength = 9;
950 desc->bHubContrCurrent = 0;
951 desc->bNbrPorts = (u8) (reg & 0x3);
952
953 desc->wHubCharacteristics = cpu_to_le16((u16) ((reg >> 8) &
954 (HUB_CHAR_LPSM |
955 HUB_CHAR_COMPOUND |
956 HUB_CHAR_OCPM)));
957 desc->bPwrOn2PwrGood = (u8) ((reg >> 24) & 0xff);
958
959 desc->u.hs.DeviceRemovable[0] = 0;
960 desc->u.hs.DeviceRemovable[1] = ~0;
961 }
962
963
964
965
966
967
968
969
970 static inline void root_port_reset(struct isp116x *isp116x, unsigned port)
971 {
972 u32 tmp;
973 unsigned long flags, t;
974
975
976
977 t = jiffies + msecs_to_jiffies(100);
978
979 while (time_before(jiffies, t)) {
980 spin_lock_irqsave(&isp116x->lock, flags);
981
982 for (;;) {
983 tmp = isp116x_read_reg32(isp116x, port ?
984 HCRHPORT2 : HCRHPORT1);
985 if (!(tmp & RH_PS_PRS))
986 break;
987 udelay(500);
988 }
989
990 if (!(tmp & RH_PS_CCS)) {
991 spin_unlock_irqrestore(&isp116x->lock, flags);
992 break;
993 }
994
995 isp116x_write_reg32(isp116x, port ? HCRHPORT2 :
996 HCRHPORT1, (RH_PS_PRS));
997 spin_unlock_irqrestore(&isp116x->lock, flags);
998 msleep(10);
999 }
1000 }
1001
1002
1003 static int isp116x_hub_control(struct usb_hcd *hcd,
1004 u16 typeReq,
1005 u16 wValue, u16 wIndex, char *buf, u16 wLength)
1006 {
1007 struct isp116x *isp116x = hcd_to_isp116x(hcd);
1008 int ret = 0;
1009 unsigned long flags;
1010 int ports = isp116x->rhdesca & RH_A_NDP;
1011 u32 tmp = 0;
1012
1013 switch (typeReq) {
1014 case ClearHubFeature:
1015 DBG("ClearHubFeature: ");
1016 switch (wValue) {
1017 case C_HUB_OVER_CURRENT:
1018 DBG("C_HUB_OVER_CURRENT\n");
1019 spin_lock_irqsave(&isp116x->lock, flags);
1020 isp116x_write_reg32(isp116x, HCRHSTATUS, RH_HS_OCIC);
1021 spin_unlock_irqrestore(&isp116x->lock, flags);
1022
1023 case C_HUB_LOCAL_POWER:
1024 DBG("C_HUB_LOCAL_POWER\n");
1025 break;
1026 default:
1027 goto error;
1028 }
1029 break;
1030 case SetHubFeature:
1031 DBG("SetHubFeature: ");
1032 switch (wValue) {
1033 case C_HUB_OVER_CURRENT:
1034 case C_HUB_LOCAL_POWER:
1035 DBG("C_HUB_OVER_CURRENT or C_HUB_LOCAL_POWER\n");
1036 break;
1037 default:
1038 goto error;
1039 }
1040 break;
1041 case GetHubDescriptor:
1042 DBG("GetHubDescriptor\n");
1043 isp116x_hub_descriptor(isp116x,
1044 (struct usb_hub_descriptor *)buf);
1045 break;
1046 case GetHubStatus:
1047 DBG("GetHubStatus\n");
1048 *(__le32 *) buf = 0;
1049 break;
1050 case GetPortStatus:
1051 DBG("GetPortStatus\n");
1052 if (!wIndex || wIndex > ports)
1053 goto error;
1054 spin_lock_irqsave(&isp116x->lock, flags);
1055 tmp = isp116x_read_reg32(isp116x, (--wIndex) ? HCRHPORT2 : HCRHPORT1);
1056 spin_unlock_irqrestore(&isp116x->lock, flags);
1057 *(__le32 *) buf = cpu_to_le32(tmp);
1058 DBG("GetPortStatus: port[%d] %08x\n", wIndex + 1, tmp);
1059 break;
1060 case ClearPortFeature:
1061 DBG("ClearPortFeature: ");
1062 if (!wIndex || wIndex > ports)
1063 goto error;
1064 wIndex--;
1065
1066 switch (wValue) {
1067 case USB_PORT_FEAT_ENABLE:
1068 DBG("USB_PORT_FEAT_ENABLE\n");
1069 tmp = RH_PS_CCS;
1070 break;
1071 case USB_PORT_FEAT_C_ENABLE:
1072 DBG("USB_PORT_FEAT_C_ENABLE\n");
1073 tmp = RH_PS_PESC;
1074 break;
1075 case USB_PORT_FEAT_SUSPEND:
1076 DBG("USB_PORT_FEAT_SUSPEND\n");
1077 tmp = RH_PS_POCI;
1078 break;
1079 case USB_PORT_FEAT_C_SUSPEND:
1080 DBG("USB_PORT_FEAT_C_SUSPEND\n");
1081 tmp = RH_PS_PSSC;
1082 break;
1083 case USB_PORT_FEAT_POWER:
1084 DBG("USB_PORT_FEAT_POWER\n");
1085 tmp = RH_PS_LSDA;
1086 break;
1087 case USB_PORT_FEAT_C_CONNECTION:
1088 DBG("USB_PORT_FEAT_C_CONNECTION\n");
1089 tmp = RH_PS_CSC;
1090 break;
1091 case USB_PORT_FEAT_C_OVER_CURRENT:
1092 DBG("USB_PORT_FEAT_C_OVER_CURRENT\n");
1093 tmp = RH_PS_OCIC;
1094 break;
1095 case USB_PORT_FEAT_C_RESET:
1096 DBG("USB_PORT_FEAT_C_RESET\n");
1097 tmp = RH_PS_PRSC;
1098 break;
1099 default:
1100 goto error;
1101 }
1102 spin_lock_irqsave(&isp116x->lock, flags);
1103 isp116x_write_reg32(isp116x, wIndex
1104 ? HCRHPORT2 : HCRHPORT1, tmp);
1105 spin_unlock_irqrestore(&isp116x->lock, flags);
1106 break;
1107 case SetPortFeature:
1108 DBG("SetPortFeature: ");
1109 if (!wIndex || wIndex > ports)
1110 goto error;
1111 wIndex--;
1112 switch (wValue) {
1113 case USB_PORT_FEAT_SUSPEND:
1114 DBG("USB_PORT_FEAT_SUSPEND\n");
1115 spin_lock_irqsave(&isp116x->lock, flags);
1116 isp116x_write_reg32(isp116x, wIndex
1117 ? HCRHPORT2 : HCRHPORT1, RH_PS_PSS);
1118 spin_unlock_irqrestore(&isp116x->lock, flags);
1119 break;
1120 case USB_PORT_FEAT_POWER:
1121 DBG("USB_PORT_FEAT_POWER\n");
1122 spin_lock_irqsave(&isp116x->lock, flags);
1123 isp116x_write_reg32(isp116x, wIndex
1124 ? HCRHPORT2 : HCRHPORT1, RH_PS_PPS);
1125 spin_unlock_irqrestore(&isp116x->lock, flags);
1126 break;
1127 case USB_PORT_FEAT_RESET:
1128 DBG("USB_PORT_FEAT_RESET\n");
1129 root_port_reset(isp116x, wIndex);
1130 break;
1131 default:
1132 goto error;
1133 }
1134 break;
1135
1136 default:
1137 error:
1138
1139 DBG("PROTOCOL STALL\n");
1140 ret = -EPIPE;
1141 }
1142 return ret;
1143 }
1144
1145
1146
1147 #ifdef CONFIG_DEBUG_FS
1148
1149 static void dump_irq(struct seq_file *s, char *label, u16 mask)
1150 {
1151 seq_printf(s, "%s %04x%s%s%s%s%s%s\n", label, mask,
1152 mask & HCuPINT_CLKRDY ? " clkrdy" : "",
1153 mask & HCuPINT_SUSP ? " susp" : "",
1154 mask & HCuPINT_OPR ? " opr" : "",
1155 mask & HCuPINT_AIIEOT ? " eot" : "",
1156 mask & HCuPINT_ATL ? " atl" : "",
1157 mask & HCuPINT_SOF ? " sof" : "");
1158 }
1159
1160 static void dump_int(struct seq_file *s, char *label, u32 mask)
1161 {
1162 seq_printf(s, "%s %08x%s%s%s%s%s%s%s\n", label, mask,
1163 mask & HCINT_MIE ? " MIE" : "",
1164 mask & HCINT_RHSC ? " rhsc" : "",
1165 mask & HCINT_FNO ? " fno" : "",
1166 mask & HCINT_UE ? " ue" : "",
1167 mask & HCINT_RD ? " rd" : "",
1168 mask & HCINT_SF ? " sof" : "", mask & HCINT_SO ? " so" : "");
1169 }
1170
1171 static int isp116x_debug_show(struct seq_file *s, void *unused)
1172 {
1173 struct isp116x *isp116x = s->private;
1174
1175 seq_printf(s, "%s\n%s version %s\n",
1176 isp116x_to_hcd(isp116x)->product_desc, hcd_name,
1177 DRIVER_VERSION);
1178
1179 if (HC_IS_SUSPENDED(isp116x_to_hcd(isp116x)->state)) {
1180 seq_printf(s, "HCD is suspended\n");
1181 return 0;
1182 }
1183 if (!HC_IS_RUNNING(isp116x_to_hcd(isp116x)->state)) {
1184 seq_printf(s, "HCD not running\n");
1185 return 0;
1186 }
1187
1188 spin_lock_irq(&isp116x->lock);
1189 dump_irq(s, "hc_irq_enable", isp116x_read_reg16(isp116x, HCuPINTENB));
1190 dump_irq(s, "hc_irq_status", isp116x_read_reg16(isp116x, HCuPINT));
1191 dump_int(s, "hc_int_enable", isp116x_read_reg32(isp116x, HCINTENB));
1192 dump_int(s, "hc_int_status", isp116x_read_reg32(isp116x, HCINTSTAT));
1193 isp116x_show_regs_seq(isp116x, s);
1194 spin_unlock_irq(&isp116x->lock);
1195 seq_printf(s, "\n");
1196
1197 return 0;
1198 }
1199 DEFINE_SHOW_ATTRIBUTE(isp116x_debug);
1200
1201 static void create_debug_file(struct isp116x *isp116x)
1202 {
1203 isp116x->dentry = debugfs_create_file(hcd_name,
1204 S_IRUGO, NULL, isp116x,
1205 &isp116x_debug_fops);
1206 }
1207
1208 static void remove_debug_file(struct isp116x *isp116x)
1209 {
1210 debugfs_remove(isp116x->dentry);
1211 }
1212
1213 #else
1214
1215 static inline void create_debug_file(struct isp116x *isp116x) { }
1216 static inline void remove_debug_file(struct isp116x *isp116x) { }
1217
1218 #endif
1219
1220
1221
1222
1223
1224
1225 static int isp116x_sw_reset(struct isp116x *isp116x)
1226 {
1227 int retries = 15;
1228 unsigned long flags;
1229 int ret = 0;
1230
1231 spin_lock_irqsave(&isp116x->lock, flags);
1232 isp116x_write_reg16(isp116x, HCSWRES, HCSWRES_MAGIC);
1233 isp116x_write_reg32(isp116x, HCCMDSTAT, HCCMDSTAT_HCR);
1234 while (--retries) {
1235
1236 mdelay(1);
1237 if (!(isp116x_read_reg32(isp116x, HCCMDSTAT) & HCCMDSTAT_HCR))
1238 break;
1239 }
1240 if (!retries) {
1241 ERR("Software reset timeout\n");
1242 ret = -ETIME;
1243 }
1244 spin_unlock_irqrestore(&isp116x->lock, flags);
1245 return ret;
1246 }
1247
1248 static int isp116x_reset(struct usb_hcd *hcd)
1249 {
1250 struct isp116x *isp116x = hcd_to_isp116x(hcd);
1251 unsigned long t;
1252 u16 clkrdy = 0;
1253 int ret, timeout = 15 ;
1254
1255 ret = isp116x_sw_reset(isp116x);
1256 if (ret)
1257 return ret;
1258
1259 t = jiffies + msecs_to_jiffies(timeout);
1260 while (time_before_eq(jiffies, t)) {
1261 msleep(4);
1262 spin_lock_irq(&isp116x->lock);
1263 clkrdy = isp116x_read_reg16(isp116x, HCuPINT) & HCuPINT_CLKRDY;
1264 spin_unlock_irq(&isp116x->lock);
1265 if (clkrdy)
1266 break;
1267 }
1268 if (!clkrdy) {
1269 ERR("Clock not ready after %dms\n", timeout);
1270
1271
1272 ERR("Please make sure that the H_WAKEUP pin is pulled low!\n");
1273 ret = -ENODEV;
1274 }
1275 return ret;
1276 }
1277
1278 static void isp116x_stop(struct usb_hcd *hcd)
1279 {
1280 struct isp116x *isp116x = hcd_to_isp116x(hcd);
1281 unsigned long flags;
1282 u32 val;
1283
1284 spin_lock_irqsave(&isp116x->lock, flags);
1285 isp116x_write_reg16(isp116x, HCuPINTENB, 0);
1286
1287
1288
1289 val = isp116x_read_reg32(isp116x, HCRHDESCA);
1290 val &= ~(RH_A_NPS | RH_A_PSM);
1291 isp116x_write_reg32(isp116x, HCRHDESCA, val);
1292 isp116x_write_reg32(isp116x, HCRHSTATUS, RH_HS_LPS);
1293 spin_unlock_irqrestore(&isp116x->lock, flags);
1294
1295 isp116x_sw_reset(isp116x);
1296 }
1297
1298
1299
1300
1301 static int isp116x_start(struct usb_hcd *hcd)
1302 {
1303 struct isp116x *isp116x = hcd_to_isp116x(hcd);
1304 struct isp116x_platform_data *board = isp116x->board;
1305 u32 val;
1306 unsigned long flags;
1307
1308 spin_lock_irqsave(&isp116x->lock, flags);
1309
1310
1311 isp116x_write_reg16(isp116x, HCuPINT, 0xff);
1312 isp116x_write_reg16(isp116x, HCuPINTENB, 0);
1313
1314 val = isp116x_read_reg16(isp116x, HCCHIPID);
1315 if ((val & HCCHIPID_MASK) != HCCHIPID_MAGIC) {
1316 ERR("Invalid chip ID %04x\n", val);
1317 spin_unlock_irqrestore(&isp116x->lock, flags);
1318 return -ENODEV;
1319 }
1320
1321
1322 hcd->uses_new_polling = 1;
1323
1324 isp116x_write_reg16(isp116x, HCITLBUFLEN, ISP116x_ITL_BUFSIZE);
1325 isp116x_write_reg16(isp116x, HCATLBUFLEN, ISP116x_ATL_BUFSIZE);
1326
1327
1328 val = HCHWCFG_INT_ENABLE | HCHWCFG_DBWIDTH(1);
1329 if (board->sel15Kres)
1330 val |= HCHWCFG_15KRSEL;
1331
1332 if (board->remote_wakeup_enable)
1333 val |= HCHWCFG_CLKNOTSTOP;
1334 if (board->oc_enable)
1335 val |= HCHWCFG_ANALOG_OC;
1336 if (board->int_act_high)
1337 val |= HCHWCFG_INT_POL;
1338 if (board->int_edge_triggered)
1339 val |= HCHWCFG_INT_TRIGGER;
1340 isp116x_write_reg16(isp116x, HCHWCFG, val);
1341
1342
1343 val = (25 << 24) & RH_A_POTPGT;
1344
1345
1346
1347 val |= RH_A_PSM;
1348
1349 val |= RH_A_OCPM;
1350 isp116x_write_reg32(isp116x, HCRHDESCA, val);
1351 isp116x->rhdesca = isp116x_read_reg32(isp116x, HCRHDESCA);
1352
1353 val = RH_B_PPCM;
1354 isp116x_write_reg32(isp116x, HCRHDESCB, val);
1355 isp116x->rhdescb = isp116x_read_reg32(isp116x, HCRHDESCB);
1356
1357 val = 0;
1358 if (board->remote_wakeup_enable) {
1359 if (!device_can_wakeup(hcd->self.controller))
1360 device_init_wakeup(hcd->self.controller, 1);
1361 val |= RH_HS_DRWE;
1362 }
1363 isp116x_write_reg32(isp116x, HCRHSTATUS, val);
1364 isp116x->rhstatus = isp116x_read_reg32(isp116x, HCRHSTATUS);
1365
1366 isp116x_write_reg32(isp116x, HCFMINTVL, 0x27782edf);
1367
1368 hcd->state = HC_STATE_RUNNING;
1369
1370
1371 isp116x->intenb = HCINT_MIE | HCINT_RHSC | HCINT_UE;
1372 if (board->remote_wakeup_enable)
1373 isp116x->intenb |= HCINT_RD;
1374 isp116x->irqenb = HCuPINT_ATL | HCuPINT_OPR;
1375 isp116x_write_reg32(isp116x, HCINTENB, isp116x->intenb);
1376 isp116x_write_reg16(isp116x, HCuPINTENB, isp116x->irqenb);
1377
1378
1379 val = HCCONTROL_USB_OPER;
1380 if (board->remote_wakeup_enable)
1381 val |= HCCONTROL_RWE;
1382 isp116x_write_reg32(isp116x, HCCONTROL, val);
1383
1384
1385 isp116x_write_reg32(isp116x, HCRHPORT1, RH_PS_CCS);
1386 isp116x_write_reg32(isp116x, HCRHPORT2, RH_PS_CCS);
1387
1388 isp116x_show_regs_log(isp116x);
1389 spin_unlock_irqrestore(&isp116x->lock, flags);
1390 return 0;
1391 }
1392
1393 #ifdef CONFIG_PM
1394
1395 static int isp116x_bus_suspend(struct usb_hcd *hcd)
1396 {
1397 struct isp116x *isp116x = hcd_to_isp116x(hcd);
1398 unsigned long flags;
1399 u32 val;
1400 int ret = 0;
1401
1402 spin_lock_irqsave(&isp116x->lock, flags);
1403 val = isp116x_read_reg32(isp116x, HCCONTROL);
1404
1405 switch (val & HCCONTROL_HCFS) {
1406 case HCCONTROL_USB_OPER:
1407 spin_unlock_irqrestore(&isp116x->lock, flags);
1408 val &= (~HCCONTROL_HCFS & ~HCCONTROL_RWE);
1409 val |= HCCONTROL_USB_SUSPEND;
1410 if (hcd->self.root_hub->do_remote_wakeup)
1411 val |= HCCONTROL_RWE;
1412
1413 msleep(2);
1414 spin_lock_irqsave(&isp116x->lock, flags);
1415 isp116x_write_reg32(isp116x, HCCONTROL, val);
1416 spin_unlock_irqrestore(&isp116x->lock, flags);
1417
1418 msleep(5);
1419 break;
1420 case HCCONTROL_USB_RESUME:
1421 isp116x_write_reg32(isp116x, HCCONTROL,
1422 (val & ~HCCONTROL_HCFS) |
1423 HCCONTROL_USB_RESET);
1424
1425 case HCCONTROL_USB_RESET:
1426 ret = -EBUSY;
1427
1428 default:
1429 spin_unlock_irqrestore(&isp116x->lock, flags);
1430 break;
1431 }
1432
1433 return ret;
1434 }
1435
1436 static int isp116x_bus_resume(struct usb_hcd *hcd)
1437 {
1438 struct isp116x *isp116x = hcd_to_isp116x(hcd);
1439 u32 val;
1440
1441 msleep(5);
1442 spin_lock_irq(&isp116x->lock);
1443
1444 val = isp116x_read_reg32(isp116x, HCCONTROL);
1445 switch (val & HCCONTROL_HCFS) {
1446 case HCCONTROL_USB_SUSPEND:
1447 val &= ~HCCONTROL_HCFS;
1448 val |= HCCONTROL_USB_RESUME;
1449 isp116x_write_reg32(isp116x, HCCONTROL, val);
1450 case HCCONTROL_USB_RESUME:
1451 break;
1452 case HCCONTROL_USB_OPER:
1453 spin_unlock_irq(&isp116x->lock);
1454 return 0;
1455 default:
1456
1457
1458 spin_unlock_irq(&isp116x->lock);
1459 DBG("Chip has been reset while suspended. Reinit from scratch.\n");
1460 isp116x_reset(hcd);
1461 isp116x_start(hcd);
1462 isp116x_hub_control(hcd, SetPortFeature,
1463 USB_PORT_FEAT_POWER, 1, NULL, 0);
1464 if ((isp116x->rhdesca & RH_A_NDP) == 2)
1465 isp116x_hub_control(hcd, SetPortFeature,
1466 USB_PORT_FEAT_POWER, 2, NULL, 0);
1467 return 0;
1468 }
1469
1470 val = isp116x->rhdesca & RH_A_NDP;
1471 while (val--) {
1472 u32 stat =
1473 isp116x_read_reg32(isp116x, val ? HCRHPORT2 : HCRHPORT1);
1474
1475 if (!(stat & RH_PS_PSS))
1476 continue;
1477 DBG("%s: Resuming port %d\n", __func__, val);
1478 isp116x_write_reg32(isp116x, RH_PS_POCI, val
1479 ? HCRHPORT2 : HCRHPORT1);
1480 }
1481 spin_unlock_irq(&isp116x->lock);
1482
1483 hcd->state = HC_STATE_RESUMING;
1484 msleep(USB_RESUME_TIMEOUT);
1485
1486
1487 spin_lock_irq(&isp116x->lock);
1488 val = isp116x_read_reg32(isp116x, HCCONTROL);
1489 isp116x_write_reg32(isp116x, HCCONTROL,
1490 (val & ~HCCONTROL_HCFS) | HCCONTROL_USB_OPER);
1491 spin_unlock_irq(&isp116x->lock);
1492 hcd->state = HC_STATE_RUNNING;
1493
1494 return 0;
1495 }
1496
1497 #else
1498
1499 #define isp116x_bus_suspend NULL
1500 #define isp116x_bus_resume NULL
1501
1502 #endif
1503
1504 static const struct hc_driver isp116x_hc_driver = {
1505 .description = hcd_name,
1506 .product_desc = "ISP116x Host Controller",
1507 .hcd_priv_size = sizeof(struct isp116x),
1508
1509 .irq = isp116x_irq,
1510 .flags = HCD_USB11,
1511
1512 .reset = isp116x_reset,
1513 .start = isp116x_start,
1514 .stop = isp116x_stop,
1515
1516 .urb_enqueue = isp116x_urb_enqueue,
1517 .urb_dequeue = isp116x_urb_dequeue,
1518 .endpoint_disable = isp116x_endpoint_disable,
1519
1520 .get_frame_number = isp116x_get_frame,
1521
1522 .hub_status_data = isp116x_hub_status_data,
1523 .hub_control = isp116x_hub_control,
1524 .bus_suspend = isp116x_bus_suspend,
1525 .bus_resume = isp116x_bus_resume,
1526 };
1527
1528
1529
1530 static int isp116x_remove(struct platform_device *pdev)
1531 {
1532 struct usb_hcd *hcd = platform_get_drvdata(pdev);
1533 struct isp116x *isp116x;
1534 struct resource *res;
1535
1536 if (!hcd)
1537 return 0;
1538 isp116x = hcd_to_isp116x(hcd);
1539 remove_debug_file(isp116x);
1540 usb_remove_hcd(hcd);
1541
1542 iounmap(isp116x->data_reg);
1543 res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
1544 release_mem_region(res->start, 2);
1545 iounmap(isp116x->addr_reg);
1546 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1547 release_mem_region(res->start, 2);
1548
1549 usb_put_hcd(hcd);
1550 return 0;
1551 }
1552
1553 static int isp116x_probe(struct platform_device *pdev)
1554 {
1555 struct usb_hcd *hcd;
1556 struct isp116x *isp116x;
1557 struct resource *addr, *data, *ires;
1558 void __iomem *addr_reg;
1559 void __iomem *data_reg;
1560 int irq;
1561 int ret = 0;
1562 unsigned long irqflags;
1563
1564 if (usb_disabled())
1565 return -ENODEV;
1566
1567 if (pdev->num_resources < 3) {
1568 ret = -ENODEV;
1569 goto err1;
1570 }
1571
1572 data = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1573 addr = platform_get_resource(pdev, IORESOURCE_MEM, 1);
1574 ires = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
1575
1576 if (!addr || !data || !ires) {
1577 ret = -ENODEV;
1578 goto err1;
1579 }
1580
1581 irq = ires->start;
1582 irqflags = ires->flags & IRQF_TRIGGER_MASK;
1583
1584 if (!request_mem_region(addr->start, 2, hcd_name)) {
1585 ret = -EBUSY;
1586 goto err1;
1587 }
1588 addr_reg = ioremap(addr->start, resource_size(addr));
1589 if (addr_reg == NULL) {
1590 ret = -ENOMEM;
1591 goto err2;
1592 }
1593 if (!request_mem_region(data->start, 2, hcd_name)) {
1594 ret = -EBUSY;
1595 goto err3;
1596 }
1597 data_reg = ioremap(data->start, resource_size(data));
1598 if (data_reg == NULL) {
1599 ret = -ENOMEM;
1600 goto err4;
1601 }
1602
1603
1604 hcd = usb_create_hcd(&isp116x_hc_driver, &pdev->dev, dev_name(&pdev->dev));
1605 if (!hcd) {
1606 ret = -ENOMEM;
1607 goto err5;
1608 }
1609
1610 hcd->rsrc_start = addr->start;
1611 isp116x = hcd_to_isp116x(hcd);
1612 isp116x->data_reg = data_reg;
1613 isp116x->addr_reg = addr_reg;
1614 spin_lock_init(&isp116x->lock);
1615 INIT_LIST_HEAD(&isp116x->async);
1616 isp116x->board = dev_get_platdata(&pdev->dev);
1617
1618 if (!isp116x->board) {
1619 ERR("Platform data structure not initialized\n");
1620 ret = -ENODEV;
1621 goto err6;
1622 }
1623 if (isp116x_check_platform_delay(isp116x)) {
1624 ERR("USE_PLATFORM_DELAY defined, but delay function not "
1625 "implemented.\n");
1626 ERR("See comments in drivers/usb/host/isp116x-hcd.c\n");
1627 ret = -ENODEV;
1628 goto err6;
1629 }
1630
1631 ret = usb_add_hcd(hcd, irq, irqflags);
1632 if (ret)
1633 goto err6;
1634
1635 device_wakeup_enable(hcd->self.controller);
1636
1637 create_debug_file(isp116x);
1638
1639 return 0;
1640
1641 err6:
1642 usb_put_hcd(hcd);
1643 err5:
1644 iounmap(data_reg);
1645 err4:
1646 release_mem_region(data->start, 2);
1647 err3:
1648 iounmap(addr_reg);
1649 err2:
1650 release_mem_region(addr->start, 2);
1651 err1:
1652 ERR("init error, %d\n", ret);
1653 return ret;
1654 }
1655
1656 #ifdef CONFIG_PM
1657
1658
1659
1660 static int isp116x_suspend(struct platform_device *dev, pm_message_t state)
1661 {
1662 VDBG("%s: state %x\n", __func__, state.event);
1663 return 0;
1664 }
1665
1666
1667
1668
1669 static int isp116x_resume(struct platform_device *dev)
1670 {
1671 VDBG("%s\n", __func__);
1672 return 0;
1673 }
1674
1675 #else
1676
1677 #define isp116x_suspend NULL
1678 #define isp116x_resume NULL
1679
1680 #endif
1681
1682
1683 MODULE_ALIAS("platform:isp116x-hcd");
1684
1685 static struct platform_driver isp116x_driver = {
1686 .probe = isp116x_probe,
1687 .remove = isp116x_remove,
1688 .suspend = isp116x_suspend,
1689 .resume = isp116x_resume,
1690 .driver = {
1691 .name = hcd_name,
1692 },
1693 };
1694
1695 module_platform_driver(isp116x_driver);