blob: f2b5d6281c5d6a163e5a7fdd36024aedb1a9807b [file] [log] [blame]
Olav Kongas4808a1c2005-04-09 22:57:39 +03001/*
2 * ISP116x HCD (Host Controller Driver) for USB.
3 *
4 * Derived from the SL811 HCD, rewritten for ISP116x.
5 * Copyright (C) 2005 Olav Kongas <ok@artecdesign.ee>
6 *
7 * Portions:
8 * Copyright (C) 2004 Psion Teklogix (for NetBook PRO)
9 * Copyright (C) 2004 David Brownell
10 *
11 * Periodic scheduling is based on Roman's OHCI code
12 * Copyright (C) 1999 Roman Weissgaerber
13 *
14 */
15
16/*
17 * The driver basically works. A number of people have used it with a range
18 * of devices.
19 *
Olav Kongas17f8bb72005-06-23 20:12:24 +030020 * The driver passes all usbtests 1-14.
Olav Kongas4808a1c2005-04-09 22:57:39 +030021 *
22 * Suspending/resuming of root hub via sysfs works. Remote wakeup works too.
23 * And suspending/resuming of platform device works too. Suspend/resume
24 * via HCD operations vector is not implemented.
25 *
26 * Iso transfer support is not implemented. Adding this would include
27 * implementing recovery from the failure to service the processed ITL
28 * fifo ram in time, which will involve chip reset.
29 *
30 * TODO:
31 + More testing of suspend/resume.
32*/
33
34/*
35 ISP116x chips require certain delays between accesses to its
36 registers. The following timing options exist.
37
38 1. Configure your memory controller (the best)
39 2. Implement platform-specific delay function possibly
40 combined with configuring the memory controller; see
41 include/linux/usb-isp116x.h for more info. Some broken
42 memory controllers line LH7A400 SMC need this. Also,
43 uncomment for that to work the following
44 USE_PLATFORM_DELAY macro.
45 3. Use ndelay (easiest, poorest). For that, uncomment
46 the following USE_NDELAY macro.
47*/
48#define USE_PLATFORM_DELAY
49//#define USE_NDELAY
50
51//#define DEBUG
52//#define VERBOSE
53/* Transfer descriptors. See dump_ptd() for printout format */
54//#define PTD_TRACE
55/* enqueuing/finishing log of urbs */
56//#define URB_TRACE
57
Olav Kongas4808a1c2005-04-09 22:57:39 +030058#include <linux/module.h>
Olav Kongas4808a1c2005-04-09 22:57:39 +030059#include <linux/delay.h>
Olav Kongas959eea22005-11-03 17:38:14 +020060#include <linux/debugfs.h>
61#include <linux/seq_file.h>
Olav Kongas4808a1c2005-04-09 22:57:39 +030062#include <linux/errno.h>
63#include <linux/init.h>
64#include <linux/list.h>
Olav Kongas4808a1c2005-04-09 22:57:39 +030065#include <linux/usb.h>
David Brownell325a4af2006-06-13 09:59:32 -070066#include <linux/usb/isp116x.h>
Russell Kingd052d1b2005-10-29 19:07:23 +010067#include <linux/platform_device.h>
Olav Kongas4808a1c2005-04-09 22:57:39 +030068
69#include <asm/io.h>
70#include <asm/irq.h>
71#include <asm/system.h>
72#include <asm/byteorder.h>
73
Olav Kongas4808a1c2005-04-09 22:57:39 +030074#include "../core/hcd.h"
75#include "isp116x.h"
76
Olav Kongas959eea22005-11-03 17:38:14 +020077#define DRIVER_VERSION "03 Nov 2005"
Olav Kongas4808a1c2005-04-09 22:57:39 +030078#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 Write len bytes to fifo, pad till 32-bit boundary
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 /* not aligned */
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 /* aligned */
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 Read len bytes from fifo and then read till 32-bit boundary.
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 /* not aligned */
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 /* aligned */
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 Write ptd's and data for scheduled transfers into
149 the fifo ram. Fifo must be empty and ready.
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;
Olav Kongas4808a1c2005-04-09 22:57:39 +0300157
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) {
Olav Kongas4808a1c2005-04-09 22:57:39 +0300162 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 /* Skip writing data for last IN PTD */
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 Read the processed ptd's and data from fifo ram back to
181 URBs' buffers. Fifo must be full and done
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 /* Skip reading data for last Setup or Out PTD */
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 Set up PTD's.
215*/
216static void preproc_atl_queue(struct isp116x *isp116x)
217{
218 struct isp116x_ep *ep;
219 struct urb *urb;
220 struct ptd *ptd;
Olav Kongasf10eff22005-08-04 18:06:47 -0700221 u16 len;
Olav Kongas4808a1c2005-04-09 22:57:39 +0300222
223 for (ep = isp116x->atl_active; ep; ep = ep->active) {
Olav Kongasf10eff22005-08-04 18:06:47 -0700224 u16 toggle = 0, dir = PTD_DIR_SETUP;
225
Olav Kongas4808a1c2005-04-09 22:57:39 +0300226 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;
Olav Kongas4808a1c2005-04-09 22:57:39 +0300231 ep->data = (unsigned char *)urb->transfer_buffer
232 + urb->actual_length;
233
234 switch (ep->nextpid) {
235 case USB_PID_IN:
236 toggle = usb_gettoggle(urb->dev, ep->epnum, 0);
237 dir = PTD_DIR_IN;
238 break;
239 case USB_PID_OUT:
240 toggle = usb_gettoggle(urb->dev, ep->epnum, 1);
241 dir = PTD_DIR_OUT;
242 break;
243 case USB_PID_SETUP:
Olav Kongas4808a1c2005-04-09 22:57:39 +0300244 len = sizeof(struct usb_ctrlrequest);
245 ep->data = urb->setup_packet;
246 break;
247 case USB_PID_ACK:
248 toggle = 1;
249 len = 0;
250 dir = (urb->transfer_buffer_length
251 && usb_pipein(urb->pipe))
252 ? PTD_DIR_OUT : PTD_DIR_IN;
253 break;
254 default:
Olav Kongas4808a1c2005-04-09 22:57:39 +0300255 ERR("%s %d: ep->nextpid %d\n", __func__, __LINE__,
256 ep->nextpid);
Olav Kongas17f8bb72005-06-23 20:12:24 +0300257 BUG();
Olav Kongas4808a1c2005-04-09 22:57:39 +0300258 }
259
260 ptd->count = PTD_CC_MSK | PTD_ACTIVE_MSK | PTD_TOGGLE(toggle);
261 ptd->mps = PTD_MPS(ep->maxpacket)
262 | PTD_SPD(urb->dev->speed == USB_SPEED_LOW)
263 | PTD_EP(ep->epnum);
264 ptd->len = PTD_LEN(len) | PTD_DIR(dir);
265 ptd->faddr = PTD_FA(usb_pipedevice(urb->pipe));
Olav Kongas4808a1c2005-04-09 22:57:39 +0300266 if (!ep->active) {
267 ptd->mps |= PTD_LAST_MSK;
268 isp116x->atl_last_dir = dir;
269 }
270 isp116x->atl_bufshrt = sizeof(struct ptd) + isp116x->atl_buflen;
271 isp116x->atl_buflen = isp116x->atl_bufshrt + ALIGN(len, 4);
272 }
273}
274
275/*
Olav Kongas4808a1c2005-04-09 22:57:39 +0300276 Take done or failed requests out of schedule. Give back
277 processed urbs.
278*/
279static void finish_request(struct isp116x *isp116x, struct isp116x_ep *ep,
David Howells7d12e782006-10-05 14:55:46 +0100280 struct urb *urb)
Olav Kongas4808a1c2005-04-09 22:57:39 +0300281__releases(isp116x->lock) __acquires(isp116x->lock)
282{
283 unsigned i;
284
285 urb->hcpriv = NULL;
286 ep->error_count = 0;
287
288 if (usb_pipecontrol(urb->pipe))
289 ep->nextpid = USB_PID_SETUP;
290
291 urb_dbg(urb, "Finish");
292
Alan Sterne9df41c2007-08-08 11:48:02 -0400293 usb_hcd_unlink_urb_from_ep(isp116x_to_hcd(isp116x), urb);
Olav Kongas4808a1c2005-04-09 22:57:39 +0300294 spin_unlock(&isp116x->lock);
David Howells7d12e782006-10-05 14:55:46 +0100295 usb_hcd_giveback_urb(isp116x_to_hcd(isp116x), urb);
Olav Kongas4808a1c2005-04-09 22:57:39 +0300296 spin_lock(&isp116x->lock);
297
298 /* take idle endpoints out of the schedule */
299 if (!list_empty(&ep->hep->urb_list))
300 return;
301
302 /* async deschedule */
303 if (!list_empty(&ep->schedule)) {
304 list_del_init(&ep->schedule);
305 return;
306 }
307
308 /* periodic deschedule */
309 DBG("deschedule qh%d/%p branch %d\n", ep->period, ep, ep->branch);
310 for (i = ep->branch; i < PERIODIC_SIZE; i += ep->period) {
311 struct isp116x_ep *temp;
312 struct isp116x_ep **prev = &isp116x->periodic[i];
313
314 while (*prev && ((temp = *prev) != ep))
315 prev = &temp->next;
316 if (*prev)
317 *prev = ep->next;
318 isp116x->load[i] -= ep->load;
319 }
320 ep->branch = PERIODIC_SIZE;
321 isp116x_to_hcd(isp116x)->self.bandwidth_allocated -=
322 ep->load / ep->period;
323
324 /* switch irq type? */
325 if (!--isp116x->periodic_count) {
326 isp116x->irqenb &= ~HCuPINT_SOF;
327 isp116x->irqenb |= HCuPINT_ATL;
328 }
329}
330
331/*
Alan Stern1b4cd432007-07-12 17:03:01 -0400332 Analyze transfer results, handle partial transfers and errors
333*/
334static void postproc_atl_queue(struct isp116x *isp116x)
335{
336 struct isp116x_ep *ep;
337 struct urb *urb;
338 struct usb_device *udev;
339 struct ptd *ptd;
340 int short_not_ok;
341 int status;
342 u8 cc;
343
344 for (ep = isp116x->atl_active; ep; ep = ep->active) {
345 BUG_ON(list_empty(&ep->hep->urb_list));
346 urb =
347 container_of(ep->hep->urb_list.next, struct urb, urb_list);
348 udev = urb->dev;
349 ptd = &ep->ptd;
350 cc = PTD_GET_CC(ptd);
351 short_not_ok = 1;
352 status = -EINPROGRESS;
353
354 /* Data underrun is special. For allowed underrun
355 we clear the error and continue as normal. For
356 forbidden underrun we finish the DATA stage
357 immediately while for control transfer,
358 we do a STATUS stage. */
359 if (cc == TD_DATAUNDERRUN) {
360 if (!(urb->transfer_flags & URB_SHORT_NOT_OK) ||
361 usb_pipecontrol(urb->pipe)) {
362 DBG("Allowed or control data underrun\n");
363 cc = TD_CC_NOERROR;
364 short_not_ok = 0;
365 } else {
366 ep->error_count = 1;
367 usb_settoggle(udev, ep->epnum,
368 ep->nextpid == USB_PID_OUT,
369 PTD_GET_TOGGLE(ptd));
370 urb->actual_length += PTD_GET_COUNT(ptd);
371 status = cc_to_error[TD_DATAUNDERRUN];
372 goto done;
373 }
374 }
375
376 if (cc != TD_CC_NOERROR && cc != TD_NOTACCESSED
377 && (++ep->error_count >= 3 || cc == TD_CC_STALL
378 || cc == TD_DATAOVERRUN)) {
379 status = cc_to_error[cc];
380 if (ep->nextpid == USB_PID_ACK)
381 ep->nextpid = 0;
382 goto done;
383 }
384 /* According to usb spec, zero-length Int transfer signals
385 finishing of the urb. Hey, does this apply only
386 for IN endpoints? */
387 if (usb_pipeint(urb->pipe) && !PTD_GET_LEN(ptd)) {
388 status = 0;
389 goto done;
390 }
391
392 /* Relax after previously failed, but later succeeded
393 or correctly NAK'ed retransmission attempt */
394 if (ep->error_count
395 && (cc == TD_CC_NOERROR || cc == TD_NOTACCESSED))
396 ep->error_count = 0;
397
398 /* Take into account idiosyncracies of the isp116x chip
399 regarding toggle bit for failed transfers */
400 if (ep->nextpid == USB_PID_OUT)
401 usb_settoggle(udev, ep->epnum, 1, PTD_GET_TOGGLE(ptd)
402 ^ (ep->error_count > 0));
403 else if (ep->nextpid == USB_PID_IN)
404 usb_settoggle(udev, ep->epnum, 0, PTD_GET_TOGGLE(ptd)
405 ^ (ep->error_count > 0));
406
407 switch (ep->nextpid) {
408 case USB_PID_IN:
409 case USB_PID_OUT:
410 urb->actual_length += PTD_GET_COUNT(ptd);
411 if (PTD_GET_ACTIVE(ptd)
412 || (cc != TD_CC_NOERROR && cc < 0x0E))
413 break;
414 if (urb->transfer_buffer_length != urb->actual_length) {
415 if (short_not_ok)
416 break;
417 } else {
418 if (urb->transfer_flags & URB_ZERO_PACKET
419 && ep->nextpid == USB_PID_OUT
420 && !(PTD_GET_COUNT(ptd) % ep->maxpacket)) {
421 DBG("Zero packet requested\n");
422 break;
423 }
424 }
425 /* All data for this URB is transferred, let's finish */
426 if (usb_pipecontrol(urb->pipe))
427 ep->nextpid = USB_PID_ACK;
428 else
429 status = 0;
430 break;
431 case USB_PID_SETUP:
432 if (PTD_GET_ACTIVE(ptd)
433 || (cc != TD_CC_NOERROR && cc < 0x0E))
434 break;
435 if (urb->transfer_buffer_length == urb->actual_length)
436 ep->nextpid = USB_PID_ACK;
437 else if (usb_pipeout(urb->pipe)) {
438 usb_settoggle(udev, 0, 1, 1);
439 ep->nextpid = USB_PID_OUT;
440 } else {
441 usb_settoggle(udev, 0, 0, 1);
442 ep->nextpid = USB_PID_IN;
443 }
444 break;
445 case USB_PID_ACK:
446 if (PTD_GET_ACTIVE(ptd)
447 || (cc != TD_CC_NOERROR && cc < 0x0E))
448 break;
449 if ((urb->transfer_flags & URB_SHORT_NOT_OK) &&
450 urb->actual_length <
451 urb->transfer_buffer_length)
452 status = -EREMOTEIO;
453 else
454 status = 0;
455 ep->nextpid = 0;
456 break;
457 default:
458 BUG();
459 }
460
461 done:
462 if (status != -EINPROGRESS) {
463 spin_lock(&urb->lock);
464 if (urb->status == -EINPROGRESS)
465 urb->status = status;
466 spin_unlock(&urb->lock);
467 }
468 if (urb->status != -EINPROGRESS)
469 finish_request(isp116x, ep, urb);
470 }
471}
472
473/*
Olav Kongas4808a1c2005-04-09 22:57:39 +0300474 Scan transfer lists, schedule transfers, send data off
475 to chip.
476 */
477static void start_atl_transfers(struct isp116x *isp116x)
478{
479 struct isp116x_ep *last_ep = NULL, *ep;
480 struct urb *urb;
481 u16 load = 0;
482 int len, index, speed, byte_time;
483
484 if (atomic_read(&isp116x->atl_finishing))
485 return;
486
487 if (!HC_IS_RUNNING(isp116x_to_hcd(isp116x)->state))
488 return;
489
490 /* FIFO not empty? */
491 if (isp116x_read_reg16(isp116x, HCBUFSTAT) & HCBUFSTAT_ATL_FULL)
492 return;
493
494 isp116x->atl_active = NULL;
495 isp116x->atl_buflen = isp116x->atl_bufshrt = 0;
496
497 /* Schedule int transfers */
498 if (isp116x->periodic_count) {
499 isp116x->fmindex = index =
500 (isp116x->fmindex + 1) & (PERIODIC_SIZE - 1);
501 if ((load = isp116x->load[index])) {
502 /* Bring all int transfers for this frame
503 into the active queue */
504 isp116x->atl_active = last_ep =
505 isp116x->periodic[index];
506 while (last_ep->next)
507 last_ep = (last_ep->active = last_ep->next);
508 last_ep->active = NULL;
509 }
510 }
511
512 /* Schedule control/bulk transfers */
513 list_for_each_entry(ep, &isp116x->async, schedule) {
514 urb = container_of(ep->hep->urb_list.next,
515 struct urb, urb_list);
516 speed = urb->dev->speed;
517 byte_time = speed == USB_SPEED_LOW
518 ? BYTE_TIME_LOWSPEED : BYTE_TIME_FULLSPEED;
519
520 if (ep->nextpid == USB_PID_SETUP) {
521 len = sizeof(struct usb_ctrlrequest);
522 } else if (ep->nextpid == USB_PID_ACK) {
523 len = 0;
524 } else {
525 /* Find current free length ... */
526 len = (MAX_LOAD_LIMIT - load) / byte_time;
527
528 /* ... then limit it to configured max size ... */
529 len = min(len, speed == USB_SPEED_LOW ?
530 MAX_TRANSFER_SIZE_LOWSPEED :
531 MAX_TRANSFER_SIZE_FULLSPEED);
532
533 /* ... and finally cut to the multiple of MaxPacketSize,
534 or to the real length if there's enough room. */
535 if (len <
536 (urb->transfer_buffer_length -
537 urb->actual_length)) {
538 len -= len % ep->maxpacket;
539 if (!len)
540 continue;
541 } else
542 len = urb->transfer_buffer_length -
543 urb->actual_length;
544 BUG_ON(len < 0);
545 }
546
547 load += len * byte_time;
548 if (load > MAX_LOAD_LIMIT)
549 break;
550
551 ep->active = NULL;
552 ep->length = len;
553 if (last_ep)
554 last_ep->active = ep;
555 else
556 isp116x->atl_active = ep;
557 last_ep = ep;
558 }
559
560 /* Avoid starving of endpoints */
561 if ((&isp116x->async)->next != (&isp116x->async)->prev)
562 list_move(&isp116x->async, (&isp116x->async)->next);
563
564 if (isp116x->atl_active) {
565 preproc_atl_queue(isp116x);
566 pack_fifo(isp116x);
567 }
568}
569
570/*
571 Finish the processed transfers
572*/
David Howells7d12e782006-10-05 14:55:46 +0100573static void finish_atl_transfers(struct isp116x *isp116x)
Olav Kongas4808a1c2005-04-09 22:57:39 +0300574{
Olav Kongas4808a1c2005-04-09 22:57:39 +0300575 if (!isp116x->atl_active)
576 return;
577 /* Fifo not ready? */
578 if (!(isp116x_read_reg16(isp116x, HCBUFSTAT) & HCBUFSTAT_ATL_DONE))
579 return;
580
581 atomic_inc(&isp116x->atl_finishing);
582 unpack_fifo(isp116x);
583 postproc_atl_queue(isp116x);
Olav Kongas4808a1c2005-04-09 22:57:39 +0300584 atomic_dec(&isp116x->atl_finishing);
585}
586
David Howells7d12e782006-10-05 14:55:46 +0100587static irqreturn_t isp116x_irq(struct usb_hcd *hcd)
Olav Kongas4808a1c2005-04-09 22:57:39 +0300588{
589 struct isp116x *isp116x = hcd_to_isp116x(hcd);
590 u16 irqstat;
591 irqreturn_t ret = IRQ_NONE;
592
593 spin_lock(&isp116x->lock);
594 isp116x_write_reg16(isp116x, HCuPINTENB, 0);
595 irqstat = isp116x_read_reg16(isp116x, HCuPINT);
596 isp116x_write_reg16(isp116x, HCuPINT, irqstat);
597
598 if (irqstat & (HCuPINT_ATL | HCuPINT_SOF)) {
599 ret = IRQ_HANDLED;
David Howells7d12e782006-10-05 14:55:46 +0100600 finish_atl_transfers(isp116x);
Olav Kongas4808a1c2005-04-09 22:57:39 +0300601 }
602
603 if (irqstat & HCuPINT_OPR) {
604 u32 intstat = isp116x_read_reg32(isp116x, HCINTSTAT);
605 isp116x_write_reg32(isp116x, HCINTSTAT, intstat);
606 if (intstat & HCINT_UE) {
Olav Kongas959eea22005-11-03 17:38:14 +0200607 ERR("Unrecoverable error, HC is dead!\n");
608 /* IRQ's are off, we do no DMA,
609 perfectly ready to die ... */
610 hcd->state = HC_STATE_HALT;
611 ret = IRQ_HANDLED;
612 goto done;
Olav Kongas4808a1c2005-04-09 22:57:39 +0300613 }
Olav Kongas9a571162005-08-05 14:23:35 +0300614 if (intstat & HCINT_RHSC)
615 /* When root hub or any of its ports is going
616 to come out of suspend, it may take more
617 than 10ms for status bits to stabilize. */
618 mod_timer(&hcd->rh_timer, jiffies
619 + msecs_to_jiffies(20) + 1);
Olav Kongas4808a1c2005-04-09 22:57:39 +0300620 if (intstat & HCINT_RD) {
621 DBG("---- remote wakeup\n");
David Brownellccdcf772005-09-22 22:45:13 -0700622 usb_hcd_resume_root_hub(hcd);
Olav Kongas4808a1c2005-04-09 22:57:39 +0300623 }
624 irqstat &= ~HCuPINT_OPR;
625 ret = IRQ_HANDLED;
626 }
627
628 if (irqstat & (HCuPINT_ATL | HCuPINT_SOF)) {
629 start_atl_transfers(isp116x);
630 }
631
632 isp116x_write_reg16(isp116x, HCuPINTENB, isp116x->irqenb);
Olav Kongas959eea22005-11-03 17:38:14 +0200633 done:
Olav Kongas4808a1c2005-04-09 22:57:39 +0300634 spin_unlock(&isp116x->lock);
635 return ret;
636}
637
638/*-----------------------------------------------------------------*/
639
640/* usb 1.1 says max 90% of a frame is available for periodic transfers.
641 * this driver doesn't promise that much since it's got to handle an
642 * IRQ per packet; irq handling latencies also use up that time.
643 */
644
645/* out of 1000 us */
646#define MAX_PERIODIC_LOAD 600
647static int balance(struct isp116x *isp116x, u16 period, u16 load)
648{
649 int i, branch = -ENOSPC;
650
651 /* search for the least loaded schedule branch of that period
652 which has enough bandwidth left unreserved. */
653 for (i = 0; i < period; i++) {
654 if (branch < 0 || isp116x->load[branch] > isp116x->load[i]) {
655 int j;
656
657 for (j = i; j < PERIODIC_SIZE; j += period) {
658 if ((isp116x->load[j] + load)
659 > MAX_PERIODIC_LOAD)
660 break;
661 }
662 if (j < PERIODIC_SIZE)
663 continue;
664 branch = i;
665 }
666 }
667 return branch;
668}
669
670/* NB! ALL the code above this point runs with isp116x->lock
671 held, irqs off
672*/
673
674/*-----------------------------------------------------------------*/
675
676static int isp116x_urb_enqueue(struct usb_hcd *hcd,
Alan Sterne9df41c2007-08-08 11:48:02 -0400677 struct urb *urb,
Al Viro55016f12005-10-21 03:21:58 -0400678 gfp_t mem_flags)
Olav Kongas4808a1c2005-04-09 22:57:39 +0300679{
680 struct isp116x *isp116x = hcd_to_isp116x(hcd);
681 struct usb_device *udev = urb->dev;
682 unsigned int pipe = urb->pipe;
683 int is_out = !usb_pipein(pipe);
684 int type = usb_pipetype(pipe);
685 int epnum = usb_pipeendpoint(pipe);
Alan Sterne9df41c2007-08-08 11:48:02 -0400686 struct usb_host_endpoint *hep = urb->ep;
Olav Kongas4808a1c2005-04-09 22:57:39 +0300687 struct isp116x_ep *ep = NULL;
688 unsigned long flags;
689 int i;
690 int ret = 0;
691
692 urb_dbg(urb, "Enqueue");
693
694 if (type == PIPE_ISOCHRONOUS) {
695 ERR("Isochronous transfers not supported\n");
696 urb_dbg(urb, "Refused to enqueue");
697 return -ENXIO;
698 }
699 /* avoid all allocations within spinlocks: request or endpoint */
700 if (!hep->hcpriv) {
Pekka Enberg7b842b62005-09-06 15:18:34 -0700701 ep = kzalloc(sizeof *ep, mem_flags);
Olav Kongas4808a1c2005-04-09 22:57:39 +0300702 if (!ep)
703 return -ENOMEM;
704 }
705
706 spin_lock_irqsave(&isp116x->lock, flags);
707 if (!HC_IS_RUNNING(hcd->state)) {
Olav Kongas959eea22005-11-03 17:38:14 +0200708 kfree(ep);
Olav Kongas4808a1c2005-04-09 22:57:39 +0300709 ret = -ENODEV;
Alan Sterne9df41c2007-08-08 11:48:02 -0400710 goto fail_not_linked;
711 }
712 ret = usb_hcd_link_urb_to_ep(hcd, urb);
713 if (ret) {
714 kfree(ep);
715 goto fail_not_linked;
Olav Kongas4808a1c2005-04-09 22:57:39 +0300716 }
717
718 if (hep->hcpriv)
719 ep = hep->hcpriv;
720 else {
721 INIT_LIST_HEAD(&ep->schedule);
Alan Stern6a8e87b2006-01-19 10:46:27 -0500722 ep->udev = udev;
Olav Kongas4808a1c2005-04-09 22:57:39 +0300723 ep->epnum = epnum;
724 ep->maxpacket = usb_maxpacket(udev, urb->pipe, is_out);
725 usb_settoggle(udev, epnum, is_out, 0);
726
727 if (type == PIPE_CONTROL) {
728 ep->nextpid = USB_PID_SETUP;
729 } else if (is_out) {
730 ep->nextpid = USB_PID_OUT;
731 } else {
732 ep->nextpid = USB_PID_IN;
733 }
734
735 if (urb->interval) {
736 /*
737 With INT URBs submitted, the driver works with SOF
738 interrupt enabled and ATL interrupt disabled. After
739 the PTDs are written to fifo ram, the chip starts
740 fifo processing and usb transfers after the next
741 SOF and continues until the transfers are finished
742 (succeeded or failed) or the frame ends. Therefore,
743 the transfers occur only in every second frame,
744 while fifo reading/writing and data processing
745 occur in every other second frame. */
746 if (urb->interval < 2)
747 urb->interval = 2;
748 if (urb->interval > 2 * PERIODIC_SIZE)
749 urb->interval = 2 * PERIODIC_SIZE;
750 ep->period = urb->interval >> 1;
751 ep->branch = PERIODIC_SIZE;
752 ep->load = usb_calc_bus_time(udev->speed,
753 !is_out,
754 (type == PIPE_ISOCHRONOUS),
755 usb_maxpacket(udev, pipe,
756 is_out)) /
757 1000;
758 }
759 hep->hcpriv = ep;
760 ep->hep = hep;
761 }
762
763 /* maybe put endpoint into schedule */
764 switch (type) {
765 case PIPE_CONTROL:
766 case PIPE_BULK:
767 if (list_empty(&ep->schedule))
768 list_add_tail(&ep->schedule, &isp116x->async);
769 break;
770 case PIPE_INTERRUPT:
771 urb->interval = ep->period;
772 ep->length = min((int)ep->maxpacket,
773 urb->transfer_buffer_length);
774
775 /* urb submitted for already existing endpoint */
776 if (ep->branch < PERIODIC_SIZE)
777 break;
778
Eric Sesterhennd5ce1372006-06-01 20:48:45 -0700779 ep->branch = ret = balance(isp116x, ep->period, ep->load);
Olav Kongas4808a1c2005-04-09 22:57:39 +0300780 if (ret < 0)
781 goto fail;
782 ret = 0;
783
784 urb->start_frame = (isp116x->fmindex & (PERIODIC_SIZE - 1))
785 + ep->branch;
786
787 /* sort each schedule branch by period (slow before fast)
788 to share the faster parts of the tree without needing
789 dummy/placeholder nodes */
790 DBG("schedule qh%d/%p branch %d\n", ep->period, ep, ep->branch);
791 for (i = ep->branch; i < PERIODIC_SIZE; i += ep->period) {
792 struct isp116x_ep **prev = &isp116x->periodic[i];
793 struct isp116x_ep *here = *prev;
794
795 while (here && ep != here) {
796 if (ep->period > here->period)
797 break;
798 prev = &here->next;
799 here = *prev;
800 }
801 if (ep != here) {
802 ep->next = here;
803 *prev = ep;
804 }
805 isp116x->load[i] += ep->load;
806 }
807 hcd->self.bandwidth_allocated += ep->load / ep->period;
808
809 /* switch over to SOFint */
810 if (!isp116x->periodic_count++) {
811 isp116x->irqenb &= ~HCuPINT_ATL;
812 isp116x->irqenb |= HCuPINT_SOF;
813 isp116x_write_reg16(isp116x, HCuPINTENB,
814 isp116x->irqenb);
815 }
816 }
817
Olav Kongas4808a1c2005-04-09 22:57:39 +0300818 urb->hcpriv = hep;
Olav Kongas4808a1c2005-04-09 22:57:39 +0300819 start_atl_transfers(isp116x);
820
821 fail:
Alan Sterne9df41c2007-08-08 11:48:02 -0400822 if (ret)
823 usb_hcd_unlink_urb_from_ep(hcd, urb);
824 fail_not_linked:
Olav Kongas4808a1c2005-04-09 22:57:39 +0300825 spin_unlock_irqrestore(&isp116x->lock, flags);
826 return ret;
827}
828
829/*
830 Dequeue URBs.
831*/
Alan Sterne9df41c2007-08-08 11:48:02 -0400832static int isp116x_urb_dequeue(struct usb_hcd *hcd, struct urb *urb,
833 int status)
Olav Kongas4808a1c2005-04-09 22:57:39 +0300834{
835 struct isp116x *isp116x = hcd_to_isp116x(hcd);
836 struct usb_host_endpoint *hep;
837 struct isp116x_ep *ep, *ep_act;
838 unsigned long flags;
Alan Sterne9df41c2007-08-08 11:48:02 -0400839 int rc;
Olav Kongas4808a1c2005-04-09 22:57:39 +0300840
841 spin_lock_irqsave(&isp116x->lock, flags);
Alan Sterne9df41c2007-08-08 11:48:02 -0400842 rc = usb_hcd_check_unlink_urb(hcd, urb, status);
843 if (rc)
844 goto done;
845
Olav Kongas4808a1c2005-04-09 22:57:39 +0300846 hep = urb->hcpriv;
Olav Kongas4808a1c2005-04-09 22:57:39 +0300847 ep = hep->hcpriv;
848 WARN_ON(hep != ep->hep);
849
850 /* In front of queue? */
851 if (ep->hep->urb_list.next == &urb->urb_list)
852 /* active? */
853 for (ep_act = isp116x->atl_active; ep_act;
854 ep_act = ep_act->active)
855 if (ep_act == ep) {
856 VDBG("dequeue, urb %p active; wait for irq\n",
857 urb);
858 urb = NULL;
859 break;
860 }
861
862 if (urb)
David Howells7d12e782006-10-05 14:55:46 +0100863 finish_request(isp116x, ep, urb);
Alan Sterne9df41c2007-08-08 11:48:02 -0400864 done:
Olav Kongas4808a1c2005-04-09 22:57:39 +0300865 spin_unlock_irqrestore(&isp116x->lock, flags);
Alan Sterne9df41c2007-08-08 11:48:02 -0400866 return rc;
Olav Kongas4808a1c2005-04-09 22:57:39 +0300867}
868
869static void isp116x_endpoint_disable(struct usb_hcd *hcd,
870 struct usb_host_endpoint *hep)
871{
872 int i;
Olav Kongas959eea22005-11-03 17:38:14 +0200873 struct isp116x_ep *ep = hep->hcpriv;
Olav Kongas4808a1c2005-04-09 22:57:39 +0300874
875 if (!ep)
876 return;
877
878 /* assume we'd just wait for the irq */
879 for (i = 0; i < 100 && !list_empty(&hep->urb_list); i++)
880 msleep(3);
881 if (!list_empty(&hep->urb_list))
882 WARN("ep %p not empty?\n", ep);
883
Olav Kongas4808a1c2005-04-09 22:57:39 +0300884 kfree(ep);
885 hep->hcpriv = NULL;
886}
887
888static int isp116x_get_frame(struct usb_hcd *hcd)
889{
890 struct isp116x *isp116x = hcd_to_isp116x(hcd);
891 u32 fmnum;
892 unsigned long flags;
893
894 spin_lock_irqsave(&isp116x->lock, flags);
895 fmnum = isp116x_read_reg32(isp116x, HCFMNUM);
896 spin_unlock_irqrestore(&isp116x->lock, flags);
897 return (int)fmnum;
898}
899
Olav Kongas4808a1c2005-04-09 22:57:39 +0300900/*
901 Adapted from ohci-hub.c. Currently we don't support autosuspend.
902*/
903static int isp116x_hub_status_data(struct usb_hcd *hcd, char *buf)
904{
905 struct isp116x *isp116x = hcd_to_isp116x(hcd);
906 int ports, i, changed = 0;
Olav Kongas9a571162005-08-05 14:23:35 +0300907 unsigned long flags;
Olav Kongas4808a1c2005-04-09 22:57:39 +0300908
909 if (!HC_IS_RUNNING(hcd->state))
910 return -ESHUTDOWN;
911
Olav Kongas9a571162005-08-05 14:23:35 +0300912 /* Report no status change now, if we are scheduled to be
913 called later */
914 if (timer_pending(&hcd->rh_timer))
915 return 0;
Olav Kongas4808a1c2005-04-09 22:57:39 +0300916
Olav Kongas9a571162005-08-05 14:23:35 +0300917 ports = isp116x->rhdesca & RH_A_NDP;
918 spin_lock_irqsave(&isp116x->lock, flags);
919 isp116x->rhstatus = isp116x_read_reg32(isp116x, HCRHSTATUS);
Olav Kongas4808a1c2005-04-09 22:57:39 +0300920 if (isp116x->rhstatus & (RH_HS_LPSC | RH_HS_OCIC))
921 buf[0] = changed = 1;
922 else
923 buf[0] = 0;
924
925 for (i = 0; i < ports; i++) {
Olav Kongas9a571162005-08-05 14:23:35 +0300926 u32 status = isp116x->rhport[i] =
927 isp116x_read_reg32(isp116x, i ? HCRHPORT2 : HCRHPORT1);
Olav Kongas4808a1c2005-04-09 22:57:39 +0300928
929 if (status & (RH_PS_CSC | RH_PS_PESC | RH_PS_PSSC
930 | RH_PS_OCIC | RH_PS_PRSC)) {
931 changed = 1;
932 buf[0] |= 1 << (i + 1);
933 continue;
934 }
935 }
Olav Kongas9a571162005-08-05 14:23:35 +0300936 spin_unlock_irqrestore(&isp116x->lock, flags);
Olav Kongas4808a1c2005-04-09 22:57:39 +0300937 return changed;
938}
939
940static void isp116x_hub_descriptor(struct isp116x *isp116x,
941 struct usb_hub_descriptor *desc)
942{
943 u32 reg = isp116x->rhdesca;
944
945 desc->bDescriptorType = 0x29;
946 desc->bDescLength = 9;
947 desc->bHubContrCurrent = 0;
948 desc->bNbrPorts = (u8) (reg & 0x3);
949 /* Power switching, device type, overcurrent. */
Olav Kongas959eea22005-11-03 17:38:14 +0200950 desc->wHubCharacteristics = cpu_to_le16((u16) ((reg >> 8) & 0x1f));
Olav Kongas4808a1c2005-04-09 22:57:39 +0300951 desc->bPwrOn2PwrGood = (u8) ((reg >> 24) & 0xff);
952 /* two bitmaps: ports removable, and legacy PortPwrCtrlMask */
Olav Kongas959eea22005-11-03 17:38:14 +0200953 desc->bitmap[0] = 0;
Olav Kongas4808a1c2005-04-09 22:57:39 +0300954 desc->bitmap[1] = ~0;
955}
956
957/* Perform reset of a given port.
958 It would be great to just start the reset and let the
959 USB core to clear the reset in due time. However,
960 root hub ports should be reset for at least 50 ms, while
961 our chip stays in reset for about 10 ms. I.e., we must
962 repeatedly reset it ourself here.
963*/
964static inline void root_port_reset(struct isp116x *isp116x, unsigned port)
965{
966 u32 tmp;
967 unsigned long flags, t;
968
969 /* Root hub reset should be 50 ms, but some devices
970 want it even longer. */
971 t = jiffies + msecs_to_jiffies(100);
972
973 while (time_before(jiffies, t)) {
974 spin_lock_irqsave(&isp116x->lock, flags);
975 /* spin until any current reset finishes */
976 for (;;) {
977 tmp = isp116x_read_reg32(isp116x, port ?
978 HCRHPORT2 : HCRHPORT1);
979 if (!(tmp & RH_PS_PRS))
980 break;
981 udelay(500);
982 }
983 /* Don't reset a disconnected port */
984 if (!(tmp & RH_PS_CCS)) {
985 spin_unlock_irqrestore(&isp116x->lock, flags);
986 break;
987 }
988 /* Reset lasts 10ms (claims datasheet) */
989 isp116x_write_reg32(isp116x, port ? HCRHPORT2 :
990 HCRHPORT1, (RH_PS_PRS));
991 spin_unlock_irqrestore(&isp116x->lock, flags);
992 msleep(10);
993 }
994}
995
996/* Adapted from ohci-hub.c */
997static int isp116x_hub_control(struct usb_hcd *hcd,
998 u16 typeReq,
999 u16 wValue, u16 wIndex, char *buf, u16 wLength)
1000{
1001 struct isp116x *isp116x = hcd_to_isp116x(hcd);
1002 int ret = 0;
1003 unsigned long flags;
1004 int ports = isp116x->rhdesca & RH_A_NDP;
1005 u32 tmp = 0;
1006
1007 switch (typeReq) {
1008 case ClearHubFeature:
1009 DBG("ClearHubFeature: ");
1010 switch (wValue) {
1011 case C_HUB_OVER_CURRENT:
1012 DBG("C_HUB_OVER_CURRENT\n");
1013 spin_lock_irqsave(&isp116x->lock, flags);
1014 isp116x_write_reg32(isp116x, HCRHSTATUS, RH_HS_OCIC);
1015 spin_unlock_irqrestore(&isp116x->lock, flags);
1016 case C_HUB_LOCAL_POWER:
1017 DBG("C_HUB_LOCAL_POWER\n");
1018 break;
1019 default:
1020 goto error;
1021 }
1022 break;
1023 case SetHubFeature:
1024 DBG("SetHubFeature: ");
1025 switch (wValue) {
1026 case C_HUB_OVER_CURRENT:
1027 case C_HUB_LOCAL_POWER:
1028 DBG("C_HUB_OVER_CURRENT or C_HUB_LOCAL_POWER\n");
1029 break;
1030 default:
1031 goto error;
1032 }
1033 break;
1034 case GetHubDescriptor:
1035 DBG("GetHubDescriptor\n");
1036 isp116x_hub_descriptor(isp116x,
1037 (struct usb_hub_descriptor *)buf);
1038 break;
1039 case GetHubStatus:
1040 DBG("GetHubStatus\n");
Olav Kongas17f8bb72005-06-23 20:12:24 +03001041 *(__le32 *) buf = 0;
Olav Kongas4808a1c2005-04-09 22:57:39 +03001042 break;
1043 case GetPortStatus:
1044 DBG("GetPortStatus\n");
1045 if (!wIndex || wIndex > ports)
1046 goto error;
1047 tmp = isp116x->rhport[--wIndex];
1048 *(__le32 *) buf = cpu_to_le32(tmp);
1049 DBG("GetPortStatus: port[%d] %08x\n", wIndex + 1, tmp);
1050 break;
1051 case ClearPortFeature:
1052 DBG("ClearPortFeature: ");
1053 if (!wIndex || wIndex > ports)
1054 goto error;
1055 wIndex--;
1056
1057 switch (wValue) {
1058 case USB_PORT_FEAT_ENABLE:
1059 DBG("USB_PORT_FEAT_ENABLE\n");
1060 tmp = RH_PS_CCS;
1061 break;
1062 case USB_PORT_FEAT_C_ENABLE:
1063 DBG("USB_PORT_FEAT_C_ENABLE\n");
1064 tmp = RH_PS_PESC;
1065 break;
1066 case USB_PORT_FEAT_SUSPEND:
1067 DBG("USB_PORT_FEAT_SUSPEND\n");
1068 tmp = RH_PS_POCI;
1069 break;
1070 case USB_PORT_FEAT_C_SUSPEND:
1071 DBG("USB_PORT_FEAT_C_SUSPEND\n");
1072 tmp = RH_PS_PSSC;
1073 break;
1074 case USB_PORT_FEAT_POWER:
1075 DBG("USB_PORT_FEAT_POWER\n");
1076 tmp = RH_PS_LSDA;
1077 break;
1078 case USB_PORT_FEAT_C_CONNECTION:
1079 DBG("USB_PORT_FEAT_C_CONNECTION\n");
1080 tmp = RH_PS_CSC;
1081 break;
1082 case USB_PORT_FEAT_C_OVER_CURRENT:
1083 DBG("USB_PORT_FEAT_C_OVER_CURRENT\n");
1084 tmp = RH_PS_OCIC;
1085 break;
1086 case USB_PORT_FEAT_C_RESET:
1087 DBG("USB_PORT_FEAT_C_RESET\n");
1088 tmp = RH_PS_PRSC;
1089 break;
1090 default:
1091 goto error;
1092 }
1093 spin_lock_irqsave(&isp116x->lock, flags);
1094 isp116x_write_reg32(isp116x, wIndex
1095 ? HCRHPORT2 : HCRHPORT1, tmp);
1096 isp116x->rhport[wIndex] =
1097 isp116x_read_reg32(isp116x, wIndex ? HCRHPORT2 : HCRHPORT1);
1098 spin_unlock_irqrestore(&isp116x->lock, flags);
1099 break;
1100 case SetPortFeature:
1101 DBG("SetPortFeature: ");
1102 if (!wIndex || wIndex > ports)
1103 goto error;
1104 wIndex--;
1105 switch (wValue) {
1106 case USB_PORT_FEAT_SUSPEND:
1107 DBG("USB_PORT_FEAT_SUSPEND\n");
1108 spin_lock_irqsave(&isp116x->lock, flags);
1109 isp116x_write_reg32(isp116x, wIndex
1110 ? HCRHPORT2 : HCRHPORT1, RH_PS_PSS);
1111 break;
1112 case USB_PORT_FEAT_POWER:
1113 DBG("USB_PORT_FEAT_POWER\n");
1114 spin_lock_irqsave(&isp116x->lock, flags);
1115 isp116x_write_reg32(isp116x, wIndex
1116 ? HCRHPORT2 : HCRHPORT1, RH_PS_PPS);
1117 break;
1118 case USB_PORT_FEAT_RESET:
1119 DBG("USB_PORT_FEAT_RESET\n");
1120 root_port_reset(isp116x, wIndex);
1121 spin_lock_irqsave(&isp116x->lock, flags);
1122 break;
1123 default:
1124 goto error;
1125 }
1126 isp116x->rhport[wIndex] =
1127 isp116x_read_reg32(isp116x, wIndex ? HCRHPORT2 : HCRHPORT1);
1128 spin_unlock_irqrestore(&isp116x->lock, flags);
1129 break;
1130
1131 default:
1132 error:
1133 /* "protocol stall" on error */
1134 DBG("PROTOCOL STALL\n");
1135 ret = -EPIPE;
1136 }
1137 return ret;
1138}
1139
Olav Kongas4808a1c2005-04-09 22:57:39 +03001140/*-----------------------------------------------------------------*/
1141
Olav Kongas959eea22005-11-03 17:38:14 +02001142#ifdef CONFIG_DEBUG_FS
Olav Kongas4808a1c2005-04-09 22:57:39 +03001143
1144static void dump_irq(struct seq_file *s, char *label, u16 mask)
1145{
1146 seq_printf(s, "%s %04x%s%s%s%s%s%s\n", label, mask,
1147 mask & HCuPINT_CLKRDY ? " clkrdy" : "",
1148 mask & HCuPINT_SUSP ? " susp" : "",
1149 mask & HCuPINT_OPR ? " opr" : "",
1150 mask & HCuPINT_AIIEOT ? " eot" : "",
1151 mask & HCuPINT_ATL ? " atl" : "",
1152 mask & HCuPINT_SOF ? " sof" : "");
1153}
1154
1155static void dump_int(struct seq_file *s, char *label, u32 mask)
1156{
1157 seq_printf(s, "%s %08x%s%s%s%s%s%s%s\n", label, mask,
1158 mask & HCINT_MIE ? " MIE" : "",
1159 mask & HCINT_RHSC ? " rhsc" : "",
1160 mask & HCINT_FNO ? " fno" : "",
1161 mask & HCINT_UE ? " ue" : "",
1162 mask & HCINT_RD ? " rd" : "",
1163 mask & HCINT_SF ? " sof" : "", mask & HCINT_SO ? " so" : "");
1164}
1165
Olav Kongas959eea22005-11-03 17:38:14 +02001166static int isp116x_show_dbg(struct seq_file *s, void *unused)
Olav Kongas4808a1c2005-04-09 22:57:39 +03001167{
1168 struct isp116x *isp116x = s->private;
Olav Kongas4808a1c2005-04-09 22:57:39 +03001169
1170 seq_printf(s, "%s\n%s version %s\n",
1171 isp116x_to_hcd(isp116x)->product_desc, hcd_name,
1172 DRIVER_VERSION);
1173
1174 if (HC_IS_SUSPENDED(isp116x_to_hcd(isp116x)->state)) {
1175 seq_printf(s, "HCD is suspended\n");
1176 return 0;
1177 }
1178 if (!HC_IS_RUNNING(isp116x_to_hcd(isp116x)->state)) {
1179 seq_printf(s, "HCD not running\n");
1180 return 0;
1181 }
1182
1183 spin_lock_irq(&isp116x->lock);
Olav Kongas4808a1c2005-04-09 22:57:39 +03001184 dump_irq(s, "hc_irq_enable", isp116x_read_reg16(isp116x, HCuPINTENB));
1185 dump_irq(s, "hc_irq_status", isp116x_read_reg16(isp116x, HCuPINT));
1186 dump_int(s, "hc_int_enable", isp116x_read_reg32(isp116x, HCINTENB));
1187 dump_int(s, "hc_int_status", isp116x_read_reg32(isp116x, HCINTSTAT));
Olav Kongas959eea22005-11-03 17:38:14 +02001188 isp116x_show_regs_seq(isp116x, s);
Olav Kongas4808a1c2005-04-09 22:57:39 +03001189 spin_unlock_irq(&isp116x->lock);
1190 seq_printf(s, "\n");
1191
1192 return 0;
1193}
1194
Olav Kongas959eea22005-11-03 17:38:14 +02001195static int isp116x_open_seq(struct inode *inode, struct file *file)
Olav Kongas4808a1c2005-04-09 22:57:39 +03001196{
Theodore Ts'o8e18e292006-09-27 01:50:46 -07001197 return single_open(file, isp116x_show_dbg, inode->i_private);
Olav Kongas4808a1c2005-04-09 22:57:39 +03001198}
1199
Luiz Fernando N. Capitulino066202d2006-08-05 20:37:11 -03001200static const struct file_operations isp116x_debug_fops = {
Olav Kongas959eea22005-11-03 17:38:14 +02001201 .open = isp116x_open_seq,
Olav Kongas4808a1c2005-04-09 22:57:39 +03001202 .read = seq_read,
1203 .llseek = seq_lseek,
1204 .release = single_release,
1205};
1206
Olav Kongas959eea22005-11-03 17:38:14 +02001207static int create_debug_file(struct isp116x *isp116x)
Olav Kongas4808a1c2005-04-09 22:57:39 +03001208{
Olav Kongas959eea22005-11-03 17:38:14 +02001209 isp116x->dentry = debugfs_create_file(hcd_name,
1210 S_IRUGO, NULL, isp116x,
1211 &isp116x_debug_fops);
1212 if (!isp116x->dentry)
1213 return -ENOMEM;
1214 return 0;
Olav Kongas4808a1c2005-04-09 22:57:39 +03001215}
1216
1217static void remove_debug_file(struct isp116x *isp116x)
1218{
Olav Kongas959eea22005-11-03 17:38:14 +02001219 debugfs_remove(isp116x->dentry);
Olav Kongas4808a1c2005-04-09 22:57:39 +03001220}
1221
Olav Kongas959eea22005-11-03 17:38:14 +02001222#else
1223
1224#define create_debug_file(d) 0
1225#define remove_debug_file(d) do{}while(0)
1226
1227#endif /* CONFIG_DEBUG_FS */
Olav Kongas4808a1c2005-04-09 22:57:39 +03001228
1229/*-----------------------------------------------------------------*/
1230
1231/*
1232 Software reset - can be called from any contect.
1233*/
1234static int isp116x_sw_reset(struct isp116x *isp116x)
1235{
1236 int retries = 15;
1237 unsigned long flags;
1238 int ret = 0;
1239
1240 spin_lock_irqsave(&isp116x->lock, flags);
1241 isp116x_write_reg16(isp116x, HCSWRES, HCSWRES_MAGIC);
1242 isp116x_write_reg32(isp116x, HCCMDSTAT, HCCMDSTAT_HCR);
1243 while (--retries) {
1244 /* It usually resets within 1 ms */
1245 mdelay(1);
1246 if (!(isp116x_read_reg32(isp116x, HCCMDSTAT) & HCCMDSTAT_HCR))
1247 break;
1248 }
1249 if (!retries) {
1250 ERR("Software reset timeout\n");
1251 ret = -ETIME;
1252 }
1253 spin_unlock_irqrestore(&isp116x->lock, flags);
1254 return ret;
1255}
1256
Olav Kongas4808a1c2005-04-09 22:57:39 +03001257static int isp116x_reset(struct usb_hcd *hcd)
1258{
1259 struct isp116x *isp116x = hcd_to_isp116x(hcd);
1260 unsigned long t;
1261 u16 clkrdy = 0;
Olav Kongas959eea22005-11-03 17:38:14 +02001262 int ret, timeout = 15 /* ms */ ;
Olav Kongas4808a1c2005-04-09 22:57:39 +03001263
Olav Kongasf8d23d32005-08-04 17:02:54 +03001264 ret = isp116x_sw_reset(isp116x);
Olav Kongas4808a1c2005-04-09 22:57:39 +03001265 if (ret)
1266 return ret;
1267
1268 t = jiffies + msecs_to_jiffies(timeout);
1269 while (time_before_eq(jiffies, t)) {
1270 msleep(4);
1271 spin_lock_irq(&isp116x->lock);
1272 clkrdy = isp116x_read_reg16(isp116x, HCuPINT) & HCuPINT_CLKRDY;
1273 spin_unlock_irq(&isp116x->lock);
1274 if (clkrdy)
1275 break;
1276 }
1277 if (!clkrdy) {
Olav Kongas959eea22005-11-03 17:38:14 +02001278 ERR("Clock not ready after %dms\n", timeout);
Olav Kongas589a0082005-04-21 17:12:59 +03001279 /* After sw_reset the clock won't report to be ready, if
1280 H_WAKEUP pin is high. */
Olav Kongasf8d23d32005-08-04 17:02:54 +03001281 ERR("Please make sure that the H_WAKEUP pin is pulled low!\n");
Olav Kongas4808a1c2005-04-09 22:57:39 +03001282 ret = -ENODEV;
1283 }
1284 return ret;
1285}
1286
1287static void isp116x_stop(struct usb_hcd *hcd)
1288{
1289 struct isp116x *isp116x = hcd_to_isp116x(hcd);
1290 unsigned long flags;
1291 u32 val;
1292
1293 spin_lock_irqsave(&isp116x->lock, flags);
1294 isp116x_write_reg16(isp116x, HCuPINTENB, 0);
1295
1296 /* Switch off ports' power, some devices don't come up
1297 after next 'insmod' without this */
1298 val = isp116x_read_reg32(isp116x, HCRHDESCA);
1299 val &= ~(RH_A_NPS | RH_A_PSM);
1300 isp116x_write_reg32(isp116x, HCRHDESCA, val);
1301 isp116x_write_reg32(isp116x, HCRHSTATUS, RH_HS_LPS);
1302 spin_unlock_irqrestore(&isp116x->lock, flags);
1303
Olav Kongasf8d23d32005-08-04 17:02:54 +03001304 isp116x_sw_reset(isp116x);
Olav Kongas4808a1c2005-04-09 22:57:39 +03001305}
1306
1307/*
1308 Configure the chip. The chip must be successfully reset by now.
1309*/
1310static int isp116x_start(struct usb_hcd *hcd)
1311{
1312 struct isp116x *isp116x = hcd_to_isp116x(hcd);
1313 struct isp116x_platform_data *board = isp116x->board;
Olav Kongas4808a1c2005-04-09 22:57:39 +03001314 u32 val;
1315 unsigned long flags;
1316
1317 spin_lock_irqsave(&isp116x->lock, flags);
1318
1319 /* clear interrupt status and disable all interrupt sources */
1320 isp116x_write_reg16(isp116x, HCuPINT, 0xff);
1321 isp116x_write_reg16(isp116x, HCuPINTENB, 0);
1322
1323 val = isp116x_read_reg16(isp116x, HCCHIPID);
1324 if ((val & HCCHIPID_MASK) != HCCHIPID_MAGIC) {
1325 ERR("Invalid chip ID %04x\n", val);
1326 spin_unlock_irqrestore(&isp116x->lock, flags);
1327 return -ENODEV;
1328 }
1329
Olav Kongas9a571162005-08-05 14:23:35 +03001330 /* To be removed in future */
1331 hcd->uses_new_polling = 1;
1332
Olav Kongas4808a1c2005-04-09 22:57:39 +03001333 isp116x_write_reg16(isp116x, HCITLBUFLEN, ISP116x_ITL_BUFSIZE);
1334 isp116x_write_reg16(isp116x, HCATLBUFLEN, ISP116x_ATL_BUFSIZE);
1335
1336 /* ----- HW conf */
1337 val = HCHWCFG_INT_ENABLE | HCHWCFG_DBWIDTH(1);
1338 if (board->sel15Kres)
1339 val |= HCHWCFG_15KRSEL;
1340 /* Remote wakeup won't work without working clock */
Olav Kongasd4d62862005-08-04 16:48:19 +03001341 if (board->remote_wakeup_enable)
Olav Kongas4808a1c2005-04-09 22:57:39 +03001342 val |= HCHWCFG_CLKNOTSTOP;
1343 if (board->oc_enable)
1344 val |= HCHWCFG_ANALOG_OC;
1345 if (board->int_act_high)
1346 val |= HCHWCFG_INT_POL;
1347 if (board->int_edge_triggered)
1348 val |= HCHWCFG_INT_TRIGGER;
1349 isp116x_write_reg16(isp116x, HCHWCFG, val);
1350
1351 /* ----- Root hub conf */
Olav Kongasdc5bed02005-08-04 16:46:28 +03001352 val = (25 << 24) & RH_A_POTPGT;
Olav Kongas165c0f32005-08-04 16:52:31 +03001353 /* AN10003_1.pdf recommends RH_A_NPS (no power switching) to
1354 be always set. Yet, instead, we request individual port
1355 power switching. */
1356 val |= RH_A_PSM;
Olav Kongas9d233d92005-08-04 16:54:08 +03001357 /* Report overcurrent per port */
1358 val |= RH_A_OCPM;
Olav Kongas4808a1c2005-04-09 22:57:39 +03001359 isp116x_write_reg32(isp116x, HCRHDESCA, val);
1360 isp116x->rhdesca = isp116x_read_reg32(isp116x, HCRHDESCA);
1361
1362 val = RH_B_PPCM;
1363 isp116x_write_reg32(isp116x, HCRHDESCB, val);
1364 isp116x->rhdescb = isp116x_read_reg32(isp116x, HCRHDESCB);
1365
1366 val = 0;
1367 if (board->remote_wakeup_enable) {
David Brownell704aa0b2005-11-07 15:38:24 -08001368 if (!device_can_wakeup(hcd->self.controller))
1369 device_init_wakeup(hcd->self.controller, 1);
Olav Kongas4808a1c2005-04-09 22:57:39 +03001370 val |= RH_HS_DRWE;
1371 }
1372 isp116x_write_reg32(isp116x, HCRHSTATUS, val);
1373 isp116x->rhstatus = isp116x_read_reg32(isp116x, HCRHSTATUS);
1374
1375 isp116x_write_reg32(isp116x, HCFMINTVL, 0x27782edf);
Olav Kongas4808a1c2005-04-09 22:57:39 +03001376
Olav Kongas4808a1c2005-04-09 22:57:39 +03001377 hcd->state = HC_STATE_RUNNING;
1378
Olav Kongas4808a1c2005-04-09 22:57:39 +03001379 /* Set up interrupts */
1380 isp116x->intenb = HCINT_MIE | HCINT_RHSC | HCINT_UE;
1381 if (board->remote_wakeup_enable)
1382 isp116x->intenb |= HCINT_RD;
1383 isp116x->irqenb = HCuPINT_ATL | HCuPINT_OPR; /* | HCuPINT_SUSP; */
1384 isp116x_write_reg32(isp116x, HCINTENB, isp116x->intenb);
1385 isp116x_write_reg16(isp116x, HCuPINTENB, isp116x->irqenb);
1386
1387 /* Go operational */
1388 val = HCCONTROL_USB_OPER;
Olav Kongas4808a1c2005-04-09 22:57:39 +03001389 if (board->remote_wakeup_enable)
1390 val |= HCCONTROL_RWE;
1391 isp116x_write_reg32(isp116x, HCCONTROL, val);
1392
1393 /* Disable ports to avoid race in device enumeration */
1394 isp116x_write_reg32(isp116x, HCRHPORT1, RH_PS_CCS);
1395 isp116x_write_reg32(isp116x, HCRHPORT2, RH_PS_CCS);
1396
Olav Kongas959eea22005-11-03 17:38:14 +02001397 isp116x_show_regs_log(isp116x);
Olav Kongas4808a1c2005-04-09 22:57:39 +03001398 spin_unlock_irqrestore(&isp116x->lock, flags);
1399 return 0;
1400}
1401
Olav Kongas959eea22005-11-03 17:38:14 +02001402#ifdef CONFIG_PM
1403
1404static int isp116x_bus_suspend(struct usb_hcd *hcd)
1405{
1406 struct isp116x *isp116x = hcd_to_isp116x(hcd);
1407 unsigned long flags;
1408 u32 val;
1409 int ret = 0;
1410
1411 spin_lock_irqsave(&isp116x->lock, flags);
Olav Kongas959eea22005-11-03 17:38:14 +02001412 val = isp116x_read_reg32(isp116x, HCCONTROL);
Olav Kongas0be930c2005-12-27 16:04:02 +02001413
Olav Kongas959eea22005-11-03 17:38:14 +02001414 switch (val & HCCONTROL_HCFS) {
1415 case HCCONTROL_USB_OPER:
Olav Kongas0be930c2005-12-27 16:04:02 +02001416 spin_unlock_irqrestore(&isp116x->lock, flags);
Olav Kongas959eea22005-11-03 17:38:14 +02001417 val &= (~HCCONTROL_HCFS & ~HCCONTROL_RWE);
1418 val |= HCCONTROL_USB_SUSPEND;
David Brownell704aa0b2005-11-07 15:38:24 -08001419 if (device_may_wakeup(&hcd->self.root_hub->dev))
Olav Kongas959eea22005-11-03 17:38:14 +02001420 val |= HCCONTROL_RWE;
1421 /* Wait for usb transfers to finish */
Olav Kongas0be930c2005-12-27 16:04:02 +02001422 msleep(2);
1423 spin_lock_irqsave(&isp116x->lock, flags);
Olav Kongas959eea22005-11-03 17:38:14 +02001424 isp116x_write_reg32(isp116x, HCCONTROL, val);
Olav Kongas0be930c2005-12-27 16:04:02 +02001425 spin_unlock_irqrestore(&isp116x->lock, flags);
Olav Kongas959eea22005-11-03 17:38:14 +02001426 /* Wait for devices to suspend */
Olav Kongas0be930c2005-12-27 16:04:02 +02001427 msleep(5);
Olav Kongas959eea22005-11-03 17:38:14 +02001428 break;
1429 case HCCONTROL_USB_RESUME:
1430 isp116x_write_reg32(isp116x, HCCONTROL,
1431 (val & ~HCCONTROL_HCFS) |
1432 HCCONTROL_USB_RESET);
1433 case HCCONTROL_USB_RESET:
1434 ret = -EBUSY;
Olav Kongas0be930c2005-12-27 16:04:02 +02001435 default: /* HCCONTROL_USB_SUSPEND */
1436 spin_unlock_irqrestore(&isp116x->lock, flags);
Olav Kongas959eea22005-11-03 17:38:14 +02001437 break;
Olav Kongas959eea22005-11-03 17:38:14 +02001438 }
1439
Olav Kongas959eea22005-11-03 17:38:14 +02001440 return ret;
1441}
1442
1443static int isp116x_bus_resume(struct usb_hcd *hcd)
1444{
1445 struct isp116x *isp116x = hcd_to_isp116x(hcd);
1446 u32 val;
1447
1448 msleep(5);
1449 spin_lock_irq(&isp116x->lock);
1450
1451 val = isp116x_read_reg32(isp116x, HCCONTROL);
1452 switch (val & HCCONTROL_HCFS) {
1453 case HCCONTROL_USB_SUSPEND:
1454 val &= ~HCCONTROL_HCFS;
1455 val |= HCCONTROL_USB_RESUME;
1456 isp116x_write_reg32(isp116x, HCCONTROL, val);
1457 case HCCONTROL_USB_RESUME:
1458 break;
1459 case HCCONTROL_USB_OPER:
1460 spin_unlock_irq(&isp116x->lock);
1461 /* Without setting power_state here the
1462 SUSPENDED state won't be removed from
1463 sysfs/usbN/power.state as a response to remote
1464 wakeup. Maybe in the future. */
1465 hcd->self.root_hub->dev.power.power_state = PMSG_ON;
1466 return 0;
1467 default:
1468 /* HCCONTROL_USB_RESET: this may happen, when during
1469 suspension the HC lost power. Reinitialize completely */
1470 spin_unlock_irq(&isp116x->lock);
1471 DBG("Chip has been reset while suspended. Reinit from scratch.\n");
1472 isp116x_reset(hcd);
1473 isp116x_start(hcd);
1474 isp116x_hub_control(hcd, SetPortFeature,
1475 USB_PORT_FEAT_POWER, 1, NULL, 0);
1476 if ((isp116x->rhdesca & RH_A_NDP) == 2)
1477 isp116x_hub_control(hcd, SetPortFeature,
1478 USB_PORT_FEAT_POWER, 2, NULL, 0);
1479 hcd->self.root_hub->dev.power.power_state = PMSG_ON;
1480 return 0;
1481 }
1482
1483 val = isp116x->rhdesca & RH_A_NDP;
1484 while (val--) {
1485 u32 stat =
1486 isp116x_read_reg32(isp116x, val ? HCRHPORT2 : HCRHPORT1);
1487 /* force global, not selective, resume */
1488 if (!(stat & RH_PS_PSS))
1489 continue;
1490 DBG("%s: Resuming port %d\n", __func__, val);
1491 isp116x_write_reg32(isp116x, RH_PS_POCI, val
1492 ? HCRHPORT2 : HCRHPORT1);
1493 }
1494 spin_unlock_irq(&isp116x->lock);
1495
1496 hcd->state = HC_STATE_RESUMING;
1497 msleep(20);
1498
1499 /* Go operational */
1500 spin_lock_irq(&isp116x->lock);
1501 val = isp116x_read_reg32(isp116x, HCCONTROL);
1502 isp116x_write_reg32(isp116x, HCCONTROL,
1503 (val & ~HCCONTROL_HCFS) | HCCONTROL_USB_OPER);
1504 spin_unlock_irq(&isp116x->lock);
1505 /* see analogous comment above */
1506 hcd->self.root_hub->dev.power.power_state = PMSG_ON;
1507 hcd->state = HC_STATE_RUNNING;
1508
1509 return 0;
1510}
1511
1512#else
1513
1514#define isp116x_bus_suspend NULL
1515#define isp116x_bus_resume NULL
1516
1517#endif
Olav Kongas4808a1c2005-04-09 22:57:39 +03001518
1519static struct hc_driver isp116x_hc_driver = {
1520 .description = hcd_name,
1521 .product_desc = "ISP116x Host Controller",
1522 .hcd_priv_size = sizeof(struct isp116x),
1523
1524 .irq = isp116x_irq,
1525 .flags = HCD_USB11,
1526
1527 .reset = isp116x_reset,
1528 .start = isp116x_start,
1529 .stop = isp116x_stop,
1530
1531 .urb_enqueue = isp116x_urb_enqueue,
1532 .urb_dequeue = isp116x_urb_dequeue,
1533 .endpoint_disable = isp116x_endpoint_disable,
1534
1535 .get_frame_number = isp116x_get_frame,
1536
1537 .hub_status_data = isp116x_hub_status_data,
1538 .hub_control = isp116x_hub_control,
Alan Stern0c0382e2005-10-13 17:08:02 -04001539 .bus_suspend = isp116x_bus_suspend,
1540 .bus_resume = isp116x_bus_resume,
Olav Kongas4808a1c2005-04-09 22:57:39 +03001541};
1542
1543/*----------------------------------------------------------------*/
1544
Greg Kroah-Hartmanb7125482006-03-17 17:40:08 -08001545static int isp116x_remove(struct platform_device *pdev)
Olav Kongas4808a1c2005-04-09 22:57:39 +03001546{
Russell King3ae5eae2005-11-09 22:32:44 +00001547 struct usb_hcd *hcd = platform_get_drvdata(pdev);
Olav Kongas589a0082005-04-21 17:12:59 +03001548 struct isp116x *isp116x;
Olav Kongas4808a1c2005-04-09 22:57:39 +03001549 struct resource *res;
1550
Olav Kongas9a571162005-08-05 14:23:35 +03001551 if (!hcd)
Olav Kongas589a0082005-04-21 17:12:59 +03001552 return 0;
1553 isp116x = hcd_to_isp116x(hcd);
Olav Kongas4808a1c2005-04-09 22:57:39 +03001554 remove_debug_file(isp116x);
1555 usb_remove_hcd(hcd);
1556
1557 iounmap(isp116x->data_reg);
1558 res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
1559 release_mem_region(res->start, 2);
1560 iounmap(isp116x->addr_reg);
1561 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1562 release_mem_region(res->start, 2);
1563
1564 usb_put_hcd(hcd);
1565 return 0;
1566}
1567
1568#define resource_len(r) (((r)->end - (r)->start) + 1)
1569
Prarit Bhargava5bcd70e2007-02-09 01:51:15 -08001570static int __devinit isp116x_probe(struct platform_device *pdev)
Olav Kongas4808a1c2005-04-09 22:57:39 +03001571{
1572 struct usb_hcd *hcd;
1573 struct isp116x *isp116x;
Olav Kongas4808a1c2005-04-09 22:57:39 +03001574 struct resource *addr, *data;
1575 void __iomem *addr_reg;
1576 void __iomem *data_reg;
1577 int irq;
1578 int ret = 0;
1579
Olav Kongas4808a1c2005-04-09 22:57:39 +03001580 if (pdev->num_resources < 3) {
1581 ret = -ENODEV;
1582 goto err1;
1583 }
1584
1585 data = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1586 addr = platform_get_resource(pdev, IORESOURCE_MEM, 1);
1587 irq = platform_get_irq(pdev, 0);
1588 if (!addr || !data || irq < 0) {
1589 ret = -ENODEV;
1590 goto err1;
1591 }
1592
Russell King3ae5eae2005-11-09 22:32:44 +00001593 if (pdev->dev.dma_mask) {
Olav Kongas4808a1c2005-04-09 22:57:39 +03001594 DBG("DMA not supported\n");
1595 ret = -EINVAL;
1596 goto err1;
1597 }
1598
1599 if (!request_mem_region(addr->start, 2, hcd_name)) {
1600 ret = -EBUSY;
1601 goto err1;
1602 }
1603 addr_reg = ioremap(addr->start, resource_len(addr));
1604 if (addr_reg == NULL) {
1605 ret = -ENOMEM;
1606 goto err2;
1607 }
1608 if (!request_mem_region(data->start, 2, hcd_name)) {
1609 ret = -EBUSY;
1610 goto err3;
1611 }
1612 data_reg = ioremap(data->start, resource_len(data));
1613 if (data_reg == NULL) {
1614 ret = -ENOMEM;
1615 goto err4;
1616 }
1617
1618 /* allocate and initialize hcd */
Russell King3ae5eae2005-11-09 22:32:44 +00001619 hcd = usb_create_hcd(&isp116x_hc_driver, &pdev->dev, pdev->dev.bus_id);
Olav Kongas4808a1c2005-04-09 22:57:39 +03001620 if (!hcd) {
1621 ret = -ENOMEM;
1622 goto err5;
1623 }
1624 /* this rsrc_start is bogus */
1625 hcd->rsrc_start = addr->start;
1626 isp116x = hcd_to_isp116x(hcd);
1627 isp116x->data_reg = data_reg;
1628 isp116x->addr_reg = addr_reg;
1629 spin_lock_init(&isp116x->lock);
1630 INIT_LIST_HEAD(&isp116x->async);
Russell King3ae5eae2005-11-09 22:32:44 +00001631 isp116x->board = pdev->dev.platform_data;
Olav Kongas4808a1c2005-04-09 22:57:39 +03001632
1633 if (!isp116x->board) {
1634 ERR("Platform data structure not initialized\n");
1635 ret = -ENODEV;
1636 goto err6;
1637 }
1638 if (isp116x_check_platform_delay(isp116x)) {
1639 ERR("USE_PLATFORM_DELAY defined, but delay function not "
1640 "implemented.\n");
1641 ERR("See comments in drivers/usb/host/isp116x-hcd.c\n");
1642 ret = -ENODEV;
1643 goto err6;
1644 }
1645
Thomas Gleixnerd54b5ca2006-07-01 19:29:44 -07001646 ret = usb_add_hcd(hcd, irq, IRQF_DISABLED);
Olav Kongas959eea22005-11-03 17:38:14 +02001647 if (ret)
Olav Kongas4808a1c2005-04-09 22:57:39 +03001648 goto err6;
1649
Olav Kongas959eea22005-11-03 17:38:14 +02001650 ret = create_debug_file(isp116x);
1651 if (ret) {
1652 ERR("Couldn't create debugfs entry\n");
1653 goto err7;
1654 }
1655
Olav Kongas4808a1c2005-04-09 22:57:39 +03001656 return 0;
1657
Olav Kongas959eea22005-11-03 17:38:14 +02001658 err7:
1659 usb_remove_hcd(hcd);
Olav Kongas4808a1c2005-04-09 22:57:39 +03001660 err6:
1661 usb_put_hcd(hcd);
1662 err5:
1663 iounmap(data_reg);
1664 err4:
1665 release_mem_region(data->start, 2);
1666 err3:
1667 iounmap(addr_reg);
1668 err2:
1669 release_mem_region(addr->start, 2);
1670 err1:
1671 ERR("init error, %d\n", ret);
1672 return ret;
1673}
1674
1675#ifdef CONFIG_PM
1676/*
1677 Suspend of platform device
1678*/
Russell King3ae5eae2005-11-09 22:32:44 +00001679static int isp116x_suspend(struct platform_device *dev, pm_message_t state)
Olav Kongas4808a1c2005-04-09 22:57:39 +03001680{
Olav Kongas959eea22005-11-03 17:38:14 +02001681 VDBG("%s: state %x\n", __func__, state.event);
Russell King3ae5eae2005-11-09 22:32:44 +00001682 dev->dev.power.power_state = state;
Olav Kongas959eea22005-11-03 17:38:14 +02001683 return 0;
Olav Kongas4808a1c2005-04-09 22:57:39 +03001684}
1685
1686/*
1687 Resume platform device
1688*/
Russell King3ae5eae2005-11-09 22:32:44 +00001689static int isp116x_resume(struct platform_device *dev)
Olav Kongas4808a1c2005-04-09 22:57:39 +03001690{
Olav Kongas959eea22005-11-03 17:38:14 +02001691 VDBG("%s: state %x\n", __func__, dev->power.power_state.event);
Russell King3ae5eae2005-11-09 22:32:44 +00001692 dev->dev.power.power_state = PMSG_ON;
Olav Kongas959eea22005-11-03 17:38:14 +02001693 return 0;
Olav Kongas4808a1c2005-04-09 22:57:39 +03001694}
1695
1696#else
1697
1698#define isp116x_suspend NULL
1699#define isp116x_resume NULL
1700
1701#endif
1702
Russell King3ae5eae2005-11-09 22:32:44 +00001703static struct platform_driver isp116x_driver = {
Olav Kongas4808a1c2005-04-09 22:57:39 +03001704 .probe = isp116x_probe,
1705 .remove = isp116x_remove,
1706 .suspend = isp116x_suspend,
1707 .resume = isp116x_resume,
Olav Kongas0be930c2005-12-27 16:04:02 +02001708 .driver = {
1709 .name = (char *)hcd_name,
1710 },
Olav Kongas4808a1c2005-04-09 22:57:39 +03001711};
1712
1713/*-----------------------------------------------------------------*/
1714
1715static int __init isp116x_init(void)
1716{
1717 if (usb_disabled())
1718 return -ENODEV;
1719
1720 INFO("driver %s, %s\n", hcd_name, DRIVER_VERSION);
Russell King3ae5eae2005-11-09 22:32:44 +00001721 return platform_driver_register(&isp116x_driver);
Olav Kongas4808a1c2005-04-09 22:57:39 +03001722}
1723
1724module_init(isp116x_init);
1725
1726static void __exit isp116x_cleanup(void)
1727{
Russell King3ae5eae2005-11-09 22:32:44 +00001728 platform_driver_unregister(&isp116x_driver);
Olav Kongas4808a1c2005-04-09 22:57:39 +03001729}
1730
1731module_exit(isp116x_cleanup);