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