blob: 35b3507ff401f47066258c615c92eddcff3bb512 [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
Olav Kongas4808a1c2005-04-09 22:57:39 +0300285 ep->error_count = 0;
286
287 if (usb_pipecontrol(urb->pipe))
288 ep->nextpid = USB_PID_SETUP;
289
290 urb_dbg(urb, "Finish");
291
Alan Sterne9df41c2007-08-08 11:48:02 -0400292 usb_hcd_unlink_urb_from_ep(isp116x_to_hcd(isp116x), urb);
Olav Kongas4808a1c2005-04-09 22:57:39 +0300293 spin_unlock(&isp116x->lock);
David Howells7d12e782006-10-05 14:55:46 +0100294 usb_hcd_giveback_urb(isp116x_to_hcd(isp116x), urb);
Olav Kongas4808a1c2005-04-09 22:57:39 +0300295 spin_lock(&isp116x->lock);
296
297 /* take idle endpoints out of the schedule */
298 if (!list_empty(&ep->hep->urb_list))
299 return;
300
301 /* async deschedule */
302 if (!list_empty(&ep->schedule)) {
303 list_del_init(&ep->schedule);
304 return;
305 }
306
307 /* periodic deschedule */
308 DBG("deschedule qh%d/%p branch %d\n", ep->period, ep, ep->branch);
309 for (i = ep->branch; i < PERIODIC_SIZE; i += ep->period) {
310 struct isp116x_ep *temp;
311 struct isp116x_ep **prev = &isp116x->periodic[i];
312
313 while (*prev && ((temp = *prev) != ep))
314 prev = &temp->next;
315 if (*prev)
316 *prev = ep->next;
317 isp116x->load[i] -= ep->load;
318 }
319 ep->branch = PERIODIC_SIZE;
320 isp116x_to_hcd(isp116x)->self.bandwidth_allocated -=
321 ep->load / ep->period;
322
323 /* switch irq type? */
324 if (!--isp116x->periodic_count) {
325 isp116x->irqenb &= ~HCuPINT_SOF;
326 isp116x->irqenb |= HCuPINT_ATL;
327 }
328}
329
330/*
Alan Stern1b4cd432007-07-12 17:03:01 -0400331 Analyze transfer results, handle partial transfers and errors
332*/
333static void postproc_atl_queue(struct isp116x *isp116x)
334{
335 struct isp116x_ep *ep;
336 struct urb *urb;
337 struct usb_device *udev;
338 struct ptd *ptd;
339 int short_not_ok;
340 int status;
341 u8 cc;
342
343 for (ep = isp116x->atl_active; ep; ep = ep->active) {
344 BUG_ON(list_empty(&ep->hep->urb_list));
345 urb =
346 container_of(ep->hep->urb_list.next, struct urb, urb_list);
347 udev = urb->dev;
348 ptd = &ep->ptd;
349 cc = PTD_GET_CC(ptd);
350 short_not_ok = 1;
351 status = -EINPROGRESS;
352
353 /* Data underrun is special. For allowed underrun
354 we clear the error and continue as normal. For
355 forbidden underrun we finish the DATA stage
356 immediately while for control transfer,
357 we do a STATUS stage. */
358 if (cc == TD_DATAUNDERRUN) {
359 if (!(urb->transfer_flags & URB_SHORT_NOT_OK) ||
360 usb_pipecontrol(urb->pipe)) {
361 DBG("Allowed or control data underrun\n");
362 cc = TD_CC_NOERROR;
363 short_not_ok = 0;
364 } else {
365 ep->error_count = 1;
366 usb_settoggle(udev, ep->epnum,
367 ep->nextpid == USB_PID_OUT,
368 PTD_GET_TOGGLE(ptd));
369 urb->actual_length += PTD_GET_COUNT(ptd);
370 status = cc_to_error[TD_DATAUNDERRUN];
371 goto done;
372 }
373 }
374
375 if (cc != TD_CC_NOERROR && cc != TD_NOTACCESSED
376 && (++ep->error_count >= 3 || cc == TD_CC_STALL
377 || cc == TD_DATAOVERRUN)) {
378 status = cc_to_error[cc];
379 if (ep->nextpid == USB_PID_ACK)
380 ep->nextpid = 0;
381 goto done;
382 }
383 /* According to usb spec, zero-length Int transfer signals
384 finishing of the urb. Hey, does this apply only
385 for IN endpoints? */
386 if (usb_pipeint(urb->pipe) && !PTD_GET_LEN(ptd)) {
387 status = 0;
388 goto done;
389 }
390
391 /* Relax after previously failed, but later succeeded
392 or correctly NAK'ed retransmission attempt */
393 if (ep->error_count
394 && (cc == TD_CC_NOERROR || cc == TD_NOTACCESSED))
395 ep->error_count = 0;
396
397 /* Take into account idiosyncracies of the isp116x chip
398 regarding toggle bit for failed transfers */
399 if (ep->nextpid == USB_PID_OUT)
400 usb_settoggle(udev, ep->epnum, 1, PTD_GET_TOGGLE(ptd)
401 ^ (ep->error_count > 0));
402 else if (ep->nextpid == USB_PID_IN)
403 usb_settoggle(udev, ep->epnum, 0, PTD_GET_TOGGLE(ptd)
404 ^ (ep->error_count > 0));
405
406 switch (ep->nextpid) {
407 case USB_PID_IN:
408 case USB_PID_OUT:
409 urb->actual_length += PTD_GET_COUNT(ptd);
410 if (PTD_GET_ACTIVE(ptd)
411 || (cc != TD_CC_NOERROR && cc < 0x0E))
412 break;
413 if (urb->transfer_buffer_length != urb->actual_length) {
414 if (short_not_ok)
415 break;
416 } else {
417 if (urb->transfer_flags & URB_ZERO_PACKET
418 && ep->nextpid == USB_PID_OUT
419 && !(PTD_GET_COUNT(ptd) % ep->maxpacket)) {
420 DBG("Zero packet requested\n");
421 break;
422 }
423 }
424 /* All data for this URB is transferred, let's finish */
425 if (usb_pipecontrol(urb->pipe))
426 ep->nextpid = USB_PID_ACK;
427 else
428 status = 0;
429 break;
430 case USB_PID_SETUP:
431 if (PTD_GET_ACTIVE(ptd)
432 || (cc != TD_CC_NOERROR && cc < 0x0E))
433 break;
434 if (urb->transfer_buffer_length == urb->actual_length)
435 ep->nextpid = USB_PID_ACK;
436 else if (usb_pipeout(urb->pipe)) {
437 usb_settoggle(udev, 0, 1, 1);
438 ep->nextpid = USB_PID_OUT;
439 } else {
440 usb_settoggle(udev, 0, 0, 1);
441 ep->nextpid = USB_PID_IN;
442 }
443 break;
444 case USB_PID_ACK:
445 if (PTD_GET_ACTIVE(ptd)
446 || (cc != TD_CC_NOERROR && cc < 0x0E))
447 break;
Alan Sternb0d9efb2007-08-21 15:39:21 -0400448 status = 0;
Alan Stern1b4cd432007-07-12 17:03:01 -0400449 ep->nextpid = 0;
450 break;
451 default:
452 BUG();
453 }
454
455 done:
456 if (status != -EINPROGRESS) {
457 spin_lock(&urb->lock);
Alan Sterneb231052007-08-21 15:40:36 -0400458 urb->status = status;
Alan Stern1b4cd432007-07-12 17:03:01 -0400459 spin_unlock(&urb->lock);
460 }
Alan Sterneb231052007-08-21 15:40:36 -0400461 if (urb->status != -EINPROGRESS || urb->unlinked)
Alan Stern1b4cd432007-07-12 17:03:01 -0400462 finish_request(isp116x, ep, urb);
463 }
464}
465
466/*
Olav Kongas4808a1c2005-04-09 22:57:39 +0300467 Scan transfer lists, schedule transfers, send data off
468 to chip.
469 */
470static void start_atl_transfers(struct isp116x *isp116x)
471{
472 struct isp116x_ep *last_ep = NULL, *ep;
473 struct urb *urb;
474 u16 load = 0;
475 int len, index, speed, byte_time;
476
477 if (atomic_read(&isp116x->atl_finishing))
478 return;
479
480 if (!HC_IS_RUNNING(isp116x_to_hcd(isp116x)->state))
481 return;
482
483 /* FIFO not empty? */
484 if (isp116x_read_reg16(isp116x, HCBUFSTAT) & HCBUFSTAT_ATL_FULL)
485 return;
486
487 isp116x->atl_active = NULL;
488 isp116x->atl_buflen = isp116x->atl_bufshrt = 0;
489
490 /* Schedule int transfers */
491 if (isp116x->periodic_count) {
492 isp116x->fmindex = index =
493 (isp116x->fmindex + 1) & (PERIODIC_SIZE - 1);
494 if ((load = isp116x->load[index])) {
495 /* Bring all int transfers for this frame
496 into the active queue */
497 isp116x->atl_active = last_ep =
498 isp116x->periodic[index];
499 while (last_ep->next)
500 last_ep = (last_ep->active = last_ep->next);
501 last_ep->active = NULL;
502 }
503 }
504
505 /* Schedule control/bulk transfers */
506 list_for_each_entry(ep, &isp116x->async, schedule) {
507 urb = container_of(ep->hep->urb_list.next,
508 struct urb, urb_list);
509 speed = urb->dev->speed;
510 byte_time = speed == USB_SPEED_LOW
511 ? BYTE_TIME_LOWSPEED : BYTE_TIME_FULLSPEED;
512
513 if (ep->nextpid == USB_PID_SETUP) {
514 len = sizeof(struct usb_ctrlrequest);
515 } else if (ep->nextpid == USB_PID_ACK) {
516 len = 0;
517 } else {
518 /* Find current free length ... */
519 len = (MAX_LOAD_LIMIT - load) / byte_time;
520
521 /* ... then limit it to configured max size ... */
522 len = min(len, speed == USB_SPEED_LOW ?
523 MAX_TRANSFER_SIZE_LOWSPEED :
524 MAX_TRANSFER_SIZE_FULLSPEED);
525
526 /* ... and finally cut to the multiple of MaxPacketSize,
527 or to the real length if there's enough room. */
528 if (len <
529 (urb->transfer_buffer_length -
530 urb->actual_length)) {
531 len -= len % ep->maxpacket;
532 if (!len)
533 continue;
534 } else
535 len = urb->transfer_buffer_length -
536 urb->actual_length;
537 BUG_ON(len < 0);
538 }
539
540 load += len * byte_time;
541 if (load > MAX_LOAD_LIMIT)
542 break;
543
544 ep->active = NULL;
545 ep->length = len;
546 if (last_ep)
547 last_ep->active = ep;
548 else
549 isp116x->atl_active = ep;
550 last_ep = ep;
551 }
552
553 /* Avoid starving of endpoints */
554 if ((&isp116x->async)->next != (&isp116x->async)->prev)
555 list_move(&isp116x->async, (&isp116x->async)->next);
556
557 if (isp116x->atl_active) {
558 preproc_atl_queue(isp116x);
559 pack_fifo(isp116x);
560 }
561}
562
563/*
564 Finish the processed transfers
565*/
David Howells7d12e782006-10-05 14:55:46 +0100566static void finish_atl_transfers(struct isp116x *isp116x)
Olav Kongas4808a1c2005-04-09 22:57:39 +0300567{
Olav Kongas4808a1c2005-04-09 22:57:39 +0300568 if (!isp116x->atl_active)
569 return;
570 /* Fifo not ready? */
571 if (!(isp116x_read_reg16(isp116x, HCBUFSTAT) & HCBUFSTAT_ATL_DONE))
572 return;
573
574 atomic_inc(&isp116x->atl_finishing);
575 unpack_fifo(isp116x);
576 postproc_atl_queue(isp116x);
Olav Kongas4808a1c2005-04-09 22:57:39 +0300577 atomic_dec(&isp116x->atl_finishing);
578}
579
David Howells7d12e782006-10-05 14:55:46 +0100580static irqreturn_t isp116x_irq(struct usb_hcd *hcd)
Olav Kongas4808a1c2005-04-09 22:57:39 +0300581{
582 struct isp116x *isp116x = hcd_to_isp116x(hcd);
583 u16 irqstat;
584 irqreturn_t ret = IRQ_NONE;
585
586 spin_lock(&isp116x->lock);
587 isp116x_write_reg16(isp116x, HCuPINTENB, 0);
588 irqstat = isp116x_read_reg16(isp116x, HCuPINT);
589 isp116x_write_reg16(isp116x, HCuPINT, irqstat);
590
591 if (irqstat & (HCuPINT_ATL | HCuPINT_SOF)) {
592 ret = IRQ_HANDLED;
David Howells7d12e782006-10-05 14:55:46 +0100593 finish_atl_transfers(isp116x);
Olav Kongas4808a1c2005-04-09 22:57:39 +0300594 }
595
596 if (irqstat & HCuPINT_OPR) {
597 u32 intstat = isp116x_read_reg32(isp116x, HCINTSTAT);
598 isp116x_write_reg32(isp116x, HCINTSTAT, intstat);
599 if (intstat & HCINT_UE) {
Olav Kongas959eea22005-11-03 17:38:14 +0200600 ERR("Unrecoverable error, HC is dead!\n");
601 /* IRQ's are off, we do no DMA,
602 perfectly ready to die ... */
603 hcd->state = HC_STATE_HALT;
604 ret = IRQ_HANDLED;
605 goto done;
Olav Kongas4808a1c2005-04-09 22:57:39 +0300606 }
Olav Kongas9a571162005-08-05 14:23:35 +0300607 if (intstat & HCINT_RHSC)
608 /* When root hub or any of its ports is going
609 to come out of suspend, it may take more
610 than 10ms for status bits to stabilize. */
611 mod_timer(&hcd->rh_timer, jiffies
612 + msecs_to_jiffies(20) + 1);
Olav Kongas4808a1c2005-04-09 22:57:39 +0300613 if (intstat & HCINT_RD) {
614 DBG("---- remote wakeup\n");
David Brownellccdcf772005-09-22 22:45:13 -0700615 usb_hcd_resume_root_hub(hcd);
Olav Kongas4808a1c2005-04-09 22:57:39 +0300616 }
617 irqstat &= ~HCuPINT_OPR;
618 ret = IRQ_HANDLED;
619 }
620
621 if (irqstat & (HCuPINT_ATL | HCuPINT_SOF)) {
622 start_atl_transfers(isp116x);
623 }
624
625 isp116x_write_reg16(isp116x, HCuPINTENB, isp116x->irqenb);
Olav Kongas959eea22005-11-03 17:38:14 +0200626 done:
Olav Kongas4808a1c2005-04-09 22:57:39 +0300627 spin_unlock(&isp116x->lock);
628 return ret;
629}
630
631/*-----------------------------------------------------------------*/
632
633/* usb 1.1 says max 90% of a frame is available for periodic transfers.
634 * this driver doesn't promise that much since it's got to handle an
635 * IRQ per packet; irq handling latencies also use up that time.
636 */
637
638/* out of 1000 us */
639#define MAX_PERIODIC_LOAD 600
640static int balance(struct isp116x *isp116x, u16 period, u16 load)
641{
642 int i, branch = -ENOSPC;
643
644 /* search for the least loaded schedule branch of that period
645 which has enough bandwidth left unreserved. */
646 for (i = 0; i < period; i++) {
647 if (branch < 0 || isp116x->load[branch] > isp116x->load[i]) {
648 int j;
649
650 for (j = i; j < PERIODIC_SIZE; j += period) {
651 if ((isp116x->load[j] + load)
652 > MAX_PERIODIC_LOAD)
653 break;
654 }
655 if (j < PERIODIC_SIZE)
656 continue;
657 branch = i;
658 }
659 }
660 return branch;
661}
662
663/* NB! ALL the code above this point runs with isp116x->lock
664 held, irqs off
665*/
666
667/*-----------------------------------------------------------------*/
668
669static int isp116x_urb_enqueue(struct usb_hcd *hcd,
Alan Sterne9df41c2007-08-08 11:48:02 -0400670 struct urb *urb,
Al Viro55016f12005-10-21 03:21:58 -0400671 gfp_t mem_flags)
Olav Kongas4808a1c2005-04-09 22:57:39 +0300672{
673 struct isp116x *isp116x = hcd_to_isp116x(hcd);
674 struct usb_device *udev = urb->dev;
675 unsigned int pipe = urb->pipe;
676 int is_out = !usb_pipein(pipe);
677 int type = usb_pipetype(pipe);
678 int epnum = usb_pipeendpoint(pipe);
Alan Sterne9df41c2007-08-08 11:48:02 -0400679 struct usb_host_endpoint *hep = urb->ep;
Olav Kongas4808a1c2005-04-09 22:57:39 +0300680 struct isp116x_ep *ep = NULL;
681 unsigned long flags;
682 int i;
683 int ret = 0;
684
685 urb_dbg(urb, "Enqueue");
686
687 if (type == PIPE_ISOCHRONOUS) {
688 ERR("Isochronous transfers not supported\n");
689 urb_dbg(urb, "Refused to enqueue");
690 return -ENXIO;
691 }
692 /* avoid all allocations within spinlocks: request or endpoint */
693 if (!hep->hcpriv) {
Pekka Enberg7b842b62005-09-06 15:18:34 -0700694 ep = kzalloc(sizeof *ep, mem_flags);
Olav Kongas4808a1c2005-04-09 22:57:39 +0300695 if (!ep)
696 return -ENOMEM;
697 }
698
699 spin_lock_irqsave(&isp116x->lock, flags);
700 if (!HC_IS_RUNNING(hcd->state)) {
Olav Kongas959eea22005-11-03 17:38:14 +0200701 kfree(ep);
Olav Kongas4808a1c2005-04-09 22:57:39 +0300702 ret = -ENODEV;
Alan Sterne9df41c2007-08-08 11:48:02 -0400703 goto fail_not_linked;
704 }
705 ret = usb_hcd_link_urb_to_ep(hcd, urb);
706 if (ret) {
707 kfree(ep);
708 goto fail_not_linked;
Olav Kongas4808a1c2005-04-09 22:57:39 +0300709 }
710
711 if (hep->hcpriv)
712 ep = hep->hcpriv;
713 else {
714 INIT_LIST_HEAD(&ep->schedule);
Alan Stern6a8e87b2006-01-19 10:46:27 -0500715 ep->udev = udev;
Olav Kongas4808a1c2005-04-09 22:57:39 +0300716 ep->epnum = epnum;
717 ep->maxpacket = usb_maxpacket(udev, urb->pipe, is_out);
718 usb_settoggle(udev, epnum, is_out, 0);
719
720 if (type == PIPE_CONTROL) {
721 ep->nextpid = USB_PID_SETUP;
722 } else if (is_out) {
723 ep->nextpid = USB_PID_OUT;
724 } else {
725 ep->nextpid = USB_PID_IN;
726 }
727
728 if (urb->interval) {
729 /*
730 With INT URBs submitted, the driver works with SOF
731 interrupt enabled and ATL interrupt disabled. After
732 the PTDs are written to fifo ram, the chip starts
733 fifo processing and usb transfers after the next
734 SOF and continues until the transfers are finished
735 (succeeded or failed) or the frame ends. Therefore,
736 the transfers occur only in every second frame,
737 while fifo reading/writing and data processing
738 occur in every other second frame. */
739 if (urb->interval < 2)
740 urb->interval = 2;
741 if (urb->interval > 2 * PERIODIC_SIZE)
742 urb->interval = 2 * PERIODIC_SIZE;
743 ep->period = urb->interval >> 1;
744 ep->branch = PERIODIC_SIZE;
745 ep->load = usb_calc_bus_time(udev->speed,
746 !is_out,
747 (type == PIPE_ISOCHRONOUS),
748 usb_maxpacket(udev, pipe,
749 is_out)) /
750 1000;
751 }
752 hep->hcpriv = ep;
753 ep->hep = hep;
754 }
755
756 /* maybe put endpoint into schedule */
757 switch (type) {
758 case PIPE_CONTROL:
759 case PIPE_BULK:
760 if (list_empty(&ep->schedule))
761 list_add_tail(&ep->schedule, &isp116x->async);
762 break;
763 case PIPE_INTERRUPT:
764 urb->interval = ep->period;
765 ep->length = min((int)ep->maxpacket,
766 urb->transfer_buffer_length);
767
768 /* urb submitted for already existing endpoint */
769 if (ep->branch < PERIODIC_SIZE)
770 break;
771
Eric Sesterhennd5ce1372006-06-01 20:48:45 -0700772 ep->branch = ret = balance(isp116x, ep->period, ep->load);
Olav Kongas4808a1c2005-04-09 22:57:39 +0300773 if (ret < 0)
774 goto fail;
775 ret = 0;
776
777 urb->start_frame = (isp116x->fmindex & (PERIODIC_SIZE - 1))
778 + ep->branch;
779
780 /* sort each schedule branch by period (slow before fast)
781 to share the faster parts of the tree without needing
782 dummy/placeholder nodes */
783 DBG("schedule qh%d/%p branch %d\n", ep->period, ep, ep->branch);
784 for (i = ep->branch; i < PERIODIC_SIZE; i += ep->period) {
785 struct isp116x_ep **prev = &isp116x->periodic[i];
786 struct isp116x_ep *here = *prev;
787
788 while (here && ep != here) {
789 if (ep->period > here->period)
790 break;
791 prev = &here->next;
792 here = *prev;
793 }
794 if (ep != here) {
795 ep->next = here;
796 *prev = ep;
797 }
798 isp116x->load[i] += ep->load;
799 }
800 hcd->self.bandwidth_allocated += ep->load / ep->period;
801
802 /* switch over to SOFint */
803 if (!isp116x->periodic_count++) {
804 isp116x->irqenb &= ~HCuPINT_ATL;
805 isp116x->irqenb |= HCuPINT_SOF;
806 isp116x_write_reg16(isp116x, HCuPINTENB,
807 isp116x->irqenb);
808 }
809 }
810
Olav Kongas4808a1c2005-04-09 22:57:39 +0300811 urb->hcpriv = hep;
Olav Kongas4808a1c2005-04-09 22:57:39 +0300812 start_atl_transfers(isp116x);
813
814 fail:
Alan Sterne9df41c2007-08-08 11:48:02 -0400815 if (ret)
816 usb_hcd_unlink_urb_from_ep(hcd, urb);
817 fail_not_linked:
Olav Kongas4808a1c2005-04-09 22:57:39 +0300818 spin_unlock_irqrestore(&isp116x->lock, flags);
819 return ret;
820}
821
822/*
823 Dequeue URBs.
824*/
Alan Sterne9df41c2007-08-08 11:48:02 -0400825static int isp116x_urb_dequeue(struct usb_hcd *hcd, struct urb *urb,
826 int status)
Olav Kongas4808a1c2005-04-09 22:57:39 +0300827{
828 struct isp116x *isp116x = hcd_to_isp116x(hcd);
829 struct usb_host_endpoint *hep;
830 struct isp116x_ep *ep, *ep_act;
831 unsigned long flags;
Alan Sterne9df41c2007-08-08 11:48:02 -0400832 int rc;
Olav Kongas4808a1c2005-04-09 22:57:39 +0300833
834 spin_lock_irqsave(&isp116x->lock, flags);
Alan Sterne9df41c2007-08-08 11:48:02 -0400835 rc = usb_hcd_check_unlink_urb(hcd, urb, status);
836 if (rc)
837 goto done;
838
Olav Kongas4808a1c2005-04-09 22:57:39 +0300839 hep = urb->hcpriv;
Olav Kongas4808a1c2005-04-09 22:57:39 +0300840 ep = hep->hcpriv;
841 WARN_ON(hep != ep->hep);
842
843 /* In front of queue? */
844 if (ep->hep->urb_list.next == &urb->urb_list)
845 /* active? */
846 for (ep_act = isp116x->atl_active; ep_act;
847 ep_act = ep_act->active)
848 if (ep_act == ep) {
849 VDBG("dequeue, urb %p active; wait for irq\n",
850 urb);
851 urb = NULL;
852 break;
853 }
854
855 if (urb)
David Howells7d12e782006-10-05 14:55:46 +0100856 finish_request(isp116x, ep, urb);
Alan Sterne9df41c2007-08-08 11:48:02 -0400857 done:
Olav Kongas4808a1c2005-04-09 22:57:39 +0300858 spin_unlock_irqrestore(&isp116x->lock, flags);
Alan Sterne9df41c2007-08-08 11:48:02 -0400859 return rc;
Olav Kongas4808a1c2005-04-09 22:57:39 +0300860}
861
862static void isp116x_endpoint_disable(struct usb_hcd *hcd,
863 struct usb_host_endpoint *hep)
864{
865 int i;
Olav Kongas959eea22005-11-03 17:38:14 +0200866 struct isp116x_ep *ep = hep->hcpriv;
Olav Kongas4808a1c2005-04-09 22:57:39 +0300867
868 if (!ep)
869 return;
870
871 /* assume we'd just wait for the irq */
872 for (i = 0; i < 100 && !list_empty(&hep->urb_list); i++)
873 msleep(3);
874 if (!list_empty(&hep->urb_list))
875 WARN("ep %p not empty?\n", ep);
876
Olav Kongas4808a1c2005-04-09 22:57:39 +0300877 kfree(ep);
878 hep->hcpriv = NULL;
879}
880
881static int isp116x_get_frame(struct usb_hcd *hcd)
882{
883 struct isp116x *isp116x = hcd_to_isp116x(hcd);
884 u32 fmnum;
885 unsigned long flags;
886
887 spin_lock_irqsave(&isp116x->lock, flags);
888 fmnum = isp116x_read_reg32(isp116x, HCFMNUM);
889 spin_unlock_irqrestore(&isp116x->lock, flags);
890 return (int)fmnum;
891}
892
Olav Kongas4808a1c2005-04-09 22:57:39 +0300893/*
894 Adapted from ohci-hub.c. Currently we don't support autosuspend.
895*/
896static int isp116x_hub_status_data(struct usb_hcd *hcd, char *buf)
897{
898 struct isp116x *isp116x = hcd_to_isp116x(hcd);
899 int ports, i, changed = 0;
Olav Kongas9a571162005-08-05 14:23:35 +0300900 unsigned long flags;
Olav Kongas4808a1c2005-04-09 22:57:39 +0300901
902 if (!HC_IS_RUNNING(hcd->state))
903 return -ESHUTDOWN;
904
Olav Kongas9a571162005-08-05 14:23:35 +0300905 /* Report no status change now, if we are scheduled to be
906 called later */
907 if (timer_pending(&hcd->rh_timer))
908 return 0;
Olav Kongas4808a1c2005-04-09 22:57:39 +0300909
Olav Kongas9a571162005-08-05 14:23:35 +0300910 ports = isp116x->rhdesca & RH_A_NDP;
911 spin_lock_irqsave(&isp116x->lock, flags);
912 isp116x->rhstatus = isp116x_read_reg32(isp116x, HCRHSTATUS);
Olav Kongas4808a1c2005-04-09 22:57:39 +0300913 if (isp116x->rhstatus & (RH_HS_LPSC | RH_HS_OCIC))
914 buf[0] = changed = 1;
915 else
916 buf[0] = 0;
917
918 for (i = 0; i < ports; i++) {
Olav Kongas9a571162005-08-05 14:23:35 +0300919 u32 status = isp116x->rhport[i] =
920 isp116x_read_reg32(isp116x, i ? HCRHPORT2 : HCRHPORT1);
Olav Kongas4808a1c2005-04-09 22:57:39 +0300921
922 if (status & (RH_PS_CSC | RH_PS_PESC | RH_PS_PSSC
923 | RH_PS_OCIC | RH_PS_PRSC)) {
924 changed = 1;
925 buf[0] |= 1 << (i + 1);
926 continue;
927 }
928 }
Olav Kongas9a571162005-08-05 14:23:35 +0300929 spin_unlock_irqrestore(&isp116x->lock, flags);
Olav Kongas4808a1c2005-04-09 22:57:39 +0300930 return changed;
931}
932
933static void isp116x_hub_descriptor(struct isp116x *isp116x,
934 struct usb_hub_descriptor *desc)
935{
936 u32 reg = isp116x->rhdesca;
937
938 desc->bDescriptorType = 0x29;
939 desc->bDescLength = 9;
940 desc->bHubContrCurrent = 0;
941 desc->bNbrPorts = (u8) (reg & 0x3);
942 /* Power switching, device type, overcurrent. */
Olav Kongas959eea22005-11-03 17:38:14 +0200943 desc->wHubCharacteristics = cpu_to_le16((u16) ((reg >> 8) & 0x1f));
Olav Kongas4808a1c2005-04-09 22:57:39 +0300944 desc->bPwrOn2PwrGood = (u8) ((reg >> 24) & 0xff);
945 /* two bitmaps: ports removable, and legacy PortPwrCtrlMask */
Olav Kongas959eea22005-11-03 17:38:14 +0200946 desc->bitmap[0] = 0;
Olav Kongas4808a1c2005-04-09 22:57:39 +0300947 desc->bitmap[1] = ~0;
948}
949
950/* Perform reset of a given port.
951 It would be great to just start the reset and let the
952 USB core to clear the reset in due time. However,
953 root hub ports should be reset for at least 50 ms, while
954 our chip stays in reset for about 10 ms. I.e., we must
955 repeatedly reset it ourself here.
956*/
957static inline void root_port_reset(struct isp116x *isp116x, unsigned port)
958{
959 u32 tmp;
960 unsigned long flags, t;
961
962 /* Root hub reset should be 50 ms, but some devices
963 want it even longer. */
964 t = jiffies + msecs_to_jiffies(100);
965
966 while (time_before(jiffies, t)) {
967 spin_lock_irqsave(&isp116x->lock, flags);
968 /* spin until any current reset finishes */
969 for (;;) {
970 tmp = isp116x_read_reg32(isp116x, port ?
971 HCRHPORT2 : HCRHPORT1);
972 if (!(tmp & RH_PS_PRS))
973 break;
974 udelay(500);
975 }
976 /* Don't reset a disconnected port */
977 if (!(tmp & RH_PS_CCS)) {
978 spin_unlock_irqrestore(&isp116x->lock, flags);
979 break;
980 }
981 /* Reset lasts 10ms (claims datasheet) */
982 isp116x_write_reg32(isp116x, port ? HCRHPORT2 :
983 HCRHPORT1, (RH_PS_PRS));
984 spin_unlock_irqrestore(&isp116x->lock, flags);
985 msleep(10);
986 }
987}
988
989/* Adapted from ohci-hub.c */
990static int isp116x_hub_control(struct usb_hcd *hcd,
991 u16 typeReq,
992 u16 wValue, u16 wIndex, char *buf, u16 wLength)
993{
994 struct isp116x *isp116x = hcd_to_isp116x(hcd);
995 int ret = 0;
996 unsigned long flags;
997 int ports = isp116x->rhdesca & RH_A_NDP;
998 u32 tmp = 0;
999
1000 switch (typeReq) {
1001 case ClearHubFeature:
1002 DBG("ClearHubFeature: ");
1003 switch (wValue) {
1004 case C_HUB_OVER_CURRENT:
1005 DBG("C_HUB_OVER_CURRENT\n");
1006 spin_lock_irqsave(&isp116x->lock, flags);
1007 isp116x_write_reg32(isp116x, HCRHSTATUS, RH_HS_OCIC);
1008 spin_unlock_irqrestore(&isp116x->lock, flags);
1009 case C_HUB_LOCAL_POWER:
1010 DBG("C_HUB_LOCAL_POWER\n");
1011 break;
1012 default:
1013 goto error;
1014 }
1015 break;
1016 case SetHubFeature:
1017 DBG("SetHubFeature: ");
1018 switch (wValue) {
1019 case C_HUB_OVER_CURRENT:
1020 case C_HUB_LOCAL_POWER:
1021 DBG("C_HUB_OVER_CURRENT or C_HUB_LOCAL_POWER\n");
1022 break;
1023 default:
1024 goto error;
1025 }
1026 break;
1027 case GetHubDescriptor:
1028 DBG("GetHubDescriptor\n");
1029 isp116x_hub_descriptor(isp116x,
1030 (struct usb_hub_descriptor *)buf);
1031 break;
1032 case GetHubStatus:
1033 DBG("GetHubStatus\n");
Olav Kongas17f8bb72005-06-23 20:12:24 +03001034 *(__le32 *) buf = 0;
Olav Kongas4808a1c2005-04-09 22:57:39 +03001035 break;
1036 case GetPortStatus:
1037 DBG("GetPortStatus\n");
1038 if (!wIndex || wIndex > ports)
1039 goto error;
1040 tmp = isp116x->rhport[--wIndex];
1041 *(__le32 *) buf = cpu_to_le32(tmp);
1042 DBG("GetPortStatus: port[%d] %08x\n", wIndex + 1, tmp);
1043 break;
1044 case ClearPortFeature:
1045 DBG("ClearPortFeature: ");
1046 if (!wIndex || wIndex > ports)
1047 goto error;
1048 wIndex--;
1049
1050 switch (wValue) {
1051 case USB_PORT_FEAT_ENABLE:
1052 DBG("USB_PORT_FEAT_ENABLE\n");
1053 tmp = RH_PS_CCS;
1054 break;
1055 case USB_PORT_FEAT_C_ENABLE:
1056 DBG("USB_PORT_FEAT_C_ENABLE\n");
1057 tmp = RH_PS_PESC;
1058 break;
1059 case USB_PORT_FEAT_SUSPEND:
1060 DBG("USB_PORT_FEAT_SUSPEND\n");
1061 tmp = RH_PS_POCI;
1062 break;
1063 case USB_PORT_FEAT_C_SUSPEND:
1064 DBG("USB_PORT_FEAT_C_SUSPEND\n");
1065 tmp = RH_PS_PSSC;
1066 break;
1067 case USB_PORT_FEAT_POWER:
1068 DBG("USB_PORT_FEAT_POWER\n");
1069 tmp = RH_PS_LSDA;
1070 break;
1071 case USB_PORT_FEAT_C_CONNECTION:
1072 DBG("USB_PORT_FEAT_C_CONNECTION\n");
1073 tmp = RH_PS_CSC;
1074 break;
1075 case USB_PORT_FEAT_C_OVER_CURRENT:
1076 DBG("USB_PORT_FEAT_C_OVER_CURRENT\n");
1077 tmp = RH_PS_OCIC;
1078 break;
1079 case USB_PORT_FEAT_C_RESET:
1080 DBG("USB_PORT_FEAT_C_RESET\n");
1081 tmp = RH_PS_PRSC;
1082 break;
1083 default:
1084 goto error;
1085 }
1086 spin_lock_irqsave(&isp116x->lock, flags);
1087 isp116x_write_reg32(isp116x, wIndex
1088 ? HCRHPORT2 : HCRHPORT1, tmp);
1089 isp116x->rhport[wIndex] =
1090 isp116x_read_reg32(isp116x, wIndex ? HCRHPORT2 : HCRHPORT1);
1091 spin_unlock_irqrestore(&isp116x->lock, flags);
1092 break;
1093 case SetPortFeature:
1094 DBG("SetPortFeature: ");
1095 if (!wIndex || wIndex > ports)
1096 goto error;
1097 wIndex--;
1098 switch (wValue) {
1099 case USB_PORT_FEAT_SUSPEND:
1100 DBG("USB_PORT_FEAT_SUSPEND\n");
1101 spin_lock_irqsave(&isp116x->lock, flags);
1102 isp116x_write_reg32(isp116x, wIndex
1103 ? HCRHPORT2 : HCRHPORT1, RH_PS_PSS);
1104 break;
1105 case USB_PORT_FEAT_POWER:
1106 DBG("USB_PORT_FEAT_POWER\n");
1107 spin_lock_irqsave(&isp116x->lock, flags);
1108 isp116x_write_reg32(isp116x, wIndex
1109 ? HCRHPORT2 : HCRHPORT1, RH_PS_PPS);
1110 break;
1111 case USB_PORT_FEAT_RESET:
1112 DBG("USB_PORT_FEAT_RESET\n");
1113 root_port_reset(isp116x, wIndex);
1114 spin_lock_irqsave(&isp116x->lock, flags);
1115 break;
1116 default:
1117 goto error;
1118 }
1119 isp116x->rhport[wIndex] =
1120 isp116x_read_reg32(isp116x, wIndex ? HCRHPORT2 : HCRHPORT1);
1121 spin_unlock_irqrestore(&isp116x->lock, flags);
1122 break;
1123
1124 default:
1125 error:
1126 /* "protocol stall" on error */
1127 DBG("PROTOCOL STALL\n");
1128 ret = -EPIPE;
1129 }
1130 return ret;
1131}
1132
Olav Kongas4808a1c2005-04-09 22:57:39 +03001133/*-----------------------------------------------------------------*/
1134
Olav Kongas959eea22005-11-03 17:38:14 +02001135#ifdef CONFIG_DEBUG_FS
Olav Kongas4808a1c2005-04-09 22:57:39 +03001136
1137static void dump_irq(struct seq_file *s, char *label, u16 mask)
1138{
1139 seq_printf(s, "%s %04x%s%s%s%s%s%s\n", label, mask,
1140 mask & HCuPINT_CLKRDY ? " clkrdy" : "",
1141 mask & HCuPINT_SUSP ? " susp" : "",
1142 mask & HCuPINT_OPR ? " opr" : "",
1143 mask & HCuPINT_AIIEOT ? " eot" : "",
1144 mask & HCuPINT_ATL ? " atl" : "",
1145 mask & HCuPINT_SOF ? " sof" : "");
1146}
1147
1148static void dump_int(struct seq_file *s, char *label, u32 mask)
1149{
1150 seq_printf(s, "%s %08x%s%s%s%s%s%s%s\n", label, mask,
1151 mask & HCINT_MIE ? " MIE" : "",
1152 mask & HCINT_RHSC ? " rhsc" : "",
1153 mask & HCINT_FNO ? " fno" : "",
1154 mask & HCINT_UE ? " ue" : "",
1155 mask & HCINT_RD ? " rd" : "",
1156 mask & HCINT_SF ? " sof" : "", mask & HCINT_SO ? " so" : "");
1157}
1158
Olav Kongas959eea22005-11-03 17:38:14 +02001159static int isp116x_show_dbg(struct seq_file *s, void *unused)
Olav Kongas4808a1c2005-04-09 22:57:39 +03001160{
1161 struct isp116x *isp116x = s->private;
Olav Kongas4808a1c2005-04-09 22:57:39 +03001162
1163 seq_printf(s, "%s\n%s version %s\n",
1164 isp116x_to_hcd(isp116x)->product_desc, hcd_name,
1165 DRIVER_VERSION);
1166
1167 if (HC_IS_SUSPENDED(isp116x_to_hcd(isp116x)->state)) {
1168 seq_printf(s, "HCD is suspended\n");
1169 return 0;
1170 }
1171 if (!HC_IS_RUNNING(isp116x_to_hcd(isp116x)->state)) {
1172 seq_printf(s, "HCD not running\n");
1173 return 0;
1174 }
1175
1176 spin_lock_irq(&isp116x->lock);
Olav Kongas4808a1c2005-04-09 22:57:39 +03001177 dump_irq(s, "hc_irq_enable", isp116x_read_reg16(isp116x, HCuPINTENB));
1178 dump_irq(s, "hc_irq_status", isp116x_read_reg16(isp116x, HCuPINT));
1179 dump_int(s, "hc_int_enable", isp116x_read_reg32(isp116x, HCINTENB));
1180 dump_int(s, "hc_int_status", isp116x_read_reg32(isp116x, HCINTSTAT));
Olav Kongas959eea22005-11-03 17:38:14 +02001181 isp116x_show_regs_seq(isp116x, s);
Olav Kongas4808a1c2005-04-09 22:57:39 +03001182 spin_unlock_irq(&isp116x->lock);
1183 seq_printf(s, "\n");
1184
1185 return 0;
1186}
1187
Olav Kongas959eea22005-11-03 17:38:14 +02001188static int isp116x_open_seq(struct inode *inode, struct file *file)
Olav Kongas4808a1c2005-04-09 22:57:39 +03001189{
Theodore Ts'o8e18e292006-09-27 01:50:46 -07001190 return single_open(file, isp116x_show_dbg, inode->i_private);
Olav Kongas4808a1c2005-04-09 22:57:39 +03001191}
1192
Luiz Fernando N. Capitulino066202d2006-08-05 20:37:11 -03001193static const struct file_operations isp116x_debug_fops = {
Olav Kongas959eea22005-11-03 17:38:14 +02001194 .open = isp116x_open_seq,
Olav Kongas4808a1c2005-04-09 22:57:39 +03001195 .read = seq_read,
1196 .llseek = seq_lseek,
1197 .release = single_release,
1198};
1199
Olav Kongas959eea22005-11-03 17:38:14 +02001200static int create_debug_file(struct isp116x *isp116x)
Olav Kongas4808a1c2005-04-09 22:57:39 +03001201{
Olav Kongas959eea22005-11-03 17:38:14 +02001202 isp116x->dentry = debugfs_create_file(hcd_name,
1203 S_IRUGO, NULL, isp116x,
1204 &isp116x_debug_fops);
1205 if (!isp116x->dentry)
1206 return -ENOMEM;
1207 return 0;
Olav Kongas4808a1c2005-04-09 22:57:39 +03001208}
1209
1210static void remove_debug_file(struct isp116x *isp116x)
1211{
Olav Kongas959eea22005-11-03 17:38:14 +02001212 debugfs_remove(isp116x->dentry);
Olav Kongas4808a1c2005-04-09 22:57:39 +03001213}
1214
Olav Kongas959eea22005-11-03 17:38:14 +02001215#else
1216
1217#define create_debug_file(d) 0
1218#define remove_debug_file(d) do{}while(0)
1219
1220#endif /* CONFIG_DEBUG_FS */
Olav Kongas4808a1c2005-04-09 22:57:39 +03001221
1222/*-----------------------------------------------------------------*/
1223
1224/*
1225 Software reset - can be called from any contect.
1226*/
1227static int isp116x_sw_reset(struct isp116x *isp116x)
1228{
1229 int retries = 15;
1230 unsigned long flags;
1231 int ret = 0;
1232
1233 spin_lock_irqsave(&isp116x->lock, flags);
1234 isp116x_write_reg16(isp116x, HCSWRES, HCSWRES_MAGIC);
1235 isp116x_write_reg32(isp116x, HCCMDSTAT, HCCMDSTAT_HCR);
1236 while (--retries) {
1237 /* It usually resets within 1 ms */
1238 mdelay(1);
1239 if (!(isp116x_read_reg32(isp116x, HCCMDSTAT) & HCCMDSTAT_HCR))
1240 break;
1241 }
1242 if (!retries) {
1243 ERR("Software reset timeout\n");
1244 ret = -ETIME;
1245 }
1246 spin_unlock_irqrestore(&isp116x->lock, flags);
1247 return ret;
1248}
1249
Olav Kongas4808a1c2005-04-09 22:57:39 +03001250static int isp116x_reset(struct usb_hcd *hcd)
1251{
1252 struct isp116x *isp116x = hcd_to_isp116x(hcd);
1253 unsigned long t;
1254 u16 clkrdy = 0;
Olav Kongas959eea22005-11-03 17:38:14 +02001255 int ret, timeout = 15 /* ms */ ;
Olav Kongas4808a1c2005-04-09 22:57:39 +03001256
Olav Kongasf8d23d32005-08-04 17:02:54 +03001257 ret = isp116x_sw_reset(isp116x);
Olav Kongas4808a1c2005-04-09 22:57:39 +03001258 if (ret)
1259 return ret;
1260
1261 t = jiffies + msecs_to_jiffies(timeout);
1262 while (time_before_eq(jiffies, t)) {
1263 msleep(4);
1264 spin_lock_irq(&isp116x->lock);
1265 clkrdy = isp116x_read_reg16(isp116x, HCuPINT) & HCuPINT_CLKRDY;
1266 spin_unlock_irq(&isp116x->lock);
1267 if (clkrdy)
1268 break;
1269 }
1270 if (!clkrdy) {
Olav Kongas959eea22005-11-03 17:38:14 +02001271 ERR("Clock not ready after %dms\n", timeout);
Olav Kongas589a0082005-04-21 17:12:59 +03001272 /* After sw_reset the clock won't report to be ready, if
1273 H_WAKEUP pin is high. */
Olav Kongasf8d23d32005-08-04 17:02:54 +03001274 ERR("Please make sure that the H_WAKEUP pin is pulled low!\n");
Olav Kongas4808a1c2005-04-09 22:57:39 +03001275 ret = -ENODEV;
1276 }
1277 return ret;
1278}
1279
1280static void isp116x_stop(struct usb_hcd *hcd)
1281{
1282 struct isp116x *isp116x = hcd_to_isp116x(hcd);
1283 unsigned long flags;
1284 u32 val;
1285
1286 spin_lock_irqsave(&isp116x->lock, flags);
1287 isp116x_write_reg16(isp116x, HCuPINTENB, 0);
1288
1289 /* Switch off ports' power, some devices don't come up
1290 after next 'insmod' without this */
1291 val = isp116x_read_reg32(isp116x, HCRHDESCA);
1292 val &= ~(RH_A_NPS | RH_A_PSM);
1293 isp116x_write_reg32(isp116x, HCRHDESCA, val);
1294 isp116x_write_reg32(isp116x, HCRHSTATUS, RH_HS_LPS);
1295 spin_unlock_irqrestore(&isp116x->lock, flags);
1296
Olav Kongasf8d23d32005-08-04 17:02:54 +03001297 isp116x_sw_reset(isp116x);
Olav Kongas4808a1c2005-04-09 22:57:39 +03001298}
1299
1300/*
1301 Configure the chip. The chip must be successfully reset by now.
1302*/
1303static int isp116x_start(struct usb_hcd *hcd)
1304{
1305 struct isp116x *isp116x = hcd_to_isp116x(hcd);
1306 struct isp116x_platform_data *board = isp116x->board;
Olav Kongas4808a1c2005-04-09 22:57:39 +03001307 u32 val;
1308 unsigned long flags;
1309
1310 spin_lock_irqsave(&isp116x->lock, flags);
1311
1312 /* clear interrupt status and disable all interrupt sources */
1313 isp116x_write_reg16(isp116x, HCuPINT, 0xff);
1314 isp116x_write_reg16(isp116x, HCuPINTENB, 0);
1315
1316 val = isp116x_read_reg16(isp116x, HCCHIPID);
1317 if ((val & HCCHIPID_MASK) != HCCHIPID_MAGIC) {
1318 ERR("Invalid chip ID %04x\n", val);
1319 spin_unlock_irqrestore(&isp116x->lock, flags);
1320 return -ENODEV;
1321 }
1322
Olav Kongas9a571162005-08-05 14:23:35 +03001323 /* To be removed in future */
1324 hcd->uses_new_polling = 1;
1325
Olav Kongas4808a1c2005-04-09 22:57:39 +03001326 isp116x_write_reg16(isp116x, HCITLBUFLEN, ISP116x_ITL_BUFSIZE);
1327 isp116x_write_reg16(isp116x, HCATLBUFLEN, ISP116x_ATL_BUFSIZE);
1328
1329 /* ----- HW conf */
1330 val = HCHWCFG_INT_ENABLE | HCHWCFG_DBWIDTH(1);
1331 if (board->sel15Kres)
1332 val |= HCHWCFG_15KRSEL;
1333 /* Remote wakeup won't work without working clock */
Olav Kongasd4d62862005-08-04 16:48:19 +03001334 if (board->remote_wakeup_enable)
Olav Kongas4808a1c2005-04-09 22:57:39 +03001335 val |= HCHWCFG_CLKNOTSTOP;
1336 if (board->oc_enable)
1337 val |= HCHWCFG_ANALOG_OC;
1338 if (board->int_act_high)
1339 val |= HCHWCFG_INT_POL;
1340 if (board->int_edge_triggered)
1341 val |= HCHWCFG_INT_TRIGGER;
1342 isp116x_write_reg16(isp116x, HCHWCFG, val);
1343
1344 /* ----- Root hub conf */
Olav Kongasdc5bed02005-08-04 16:46:28 +03001345 val = (25 << 24) & RH_A_POTPGT;
Olav Kongas165c0f32005-08-04 16:52:31 +03001346 /* AN10003_1.pdf recommends RH_A_NPS (no power switching) to
1347 be always set. Yet, instead, we request individual port
1348 power switching. */
1349 val |= RH_A_PSM;
Olav Kongas9d233d92005-08-04 16:54:08 +03001350 /* Report overcurrent per port */
1351 val |= RH_A_OCPM;
Olav Kongas4808a1c2005-04-09 22:57:39 +03001352 isp116x_write_reg32(isp116x, HCRHDESCA, val);
1353 isp116x->rhdesca = isp116x_read_reg32(isp116x, HCRHDESCA);
1354
1355 val = RH_B_PPCM;
1356 isp116x_write_reg32(isp116x, HCRHDESCB, val);
1357 isp116x->rhdescb = isp116x_read_reg32(isp116x, HCRHDESCB);
1358
1359 val = 0;
1360 if (board->remote_wakeup_enable) {
David Brownell704aa0b2005-11-07 15:38:24 -08001361 if (!device_can_wakeup(hcd->self.controller))
1362 device_init_wakeup(hcd->self.controller, 1);
Olav Kongas4808a1c2005-04-09 22:57:39 +03001363 val |= RH_HS_DRWE;
1364 }
1365 isp116x_write_reg32(isp116x, HCRHSTATUS, val);
1366 isp116x->rhstatus = isp116x_read_reg32(isp116x, HCRHSTATUS);
1367
1368 isp116x_write_reg32(isp116x, HCFMINTVL, 0x27782edf);
Olav Kongas4808a1c2005-04-09 22:57:39 +03001369
Olav Kongas4808a1c2005-04-09 22:57:39 +03001370 hcd->state = HC_STATE_RUNNING;
1371
Olav Kongas4808a1c2005-04-09 22:57:39 +03001372 /* Set up interrupts */
1373 isp116x->intenb = HCINT_MIE | HCINT_RHSC | HCINT_UE;
1374 if (board->remote_wakeup_enable)
1375 isp116x->intenb |= HCINT_RD;
1376 isp116x->irqenb = HCuPINT_ATL | HCuPINT_OPR; /* | HCuPINT_SUSP; */
1377 isp116x_write_reg32(isp116x, HCINTENB, isp116x->intenb);
1378 isp116x_write_reg16(isp116x, HCuPINTENB, isp116x->irqenb);
1379
1380 /* Go operational */
1381 val = HCCONTROL_USB_OPER;
Olav Kongas4808a1c2005-04-09 22:57:39 +03001382 if (board->remote_wakeup_enable)
1383 val |= HCCONTROL_RWE;
1384 isp116x_write_reg32(isp116x, HCCONTROL, val);
1385
1386 /* Disable ports to avoid race in device enumeration */
1387 isp116x_write_reg32(isp116x, HCRHPORT1, RH_PS_CCS);
1388 isp116x_write_reg32(isp116x, HCRHPORT2, RH_PS_CCS);
1389
Olav Kongas959eea22005-11-03 17:38:14 +02001390 isp116x_show_regs_log(isp116x);
Olav Kongas4808a1c2005-04-09 22:57:39 +03001391 spin_unlock_irqrestore(&isp116x->lock, flags);
1392 return 0;
1393}
1394
Olav Kongas959eea22005-11-03 17:38:14 +02001395#ifdef CONFIG_PM
1396
1397static int isp116x_bus_suspend(struct usb_hcd *hcd)
1398{
1399 struct isp116x *isp116x = hcd_to_isp116x(hcd);
1400 unsigned long flags;
1401 u32 val;
1402 int ret = 0;
1403
1404 spin_lock_irqsave(&isp116x->lock, flags);
Olav Kongas959eea22005-11-03 17:38:14 +02001405 val = isp116x_read_reg32(isp116x, HCCONTROL);
Olav Kongas0be930c2005-12-27 16:04:02 +02001406
Olav Kongas959eea22005-11-03 17:38:14 +02001407 switch (val & HCCONTROL_HCFS) {
1408 case HCCONTROL_USB_OPER:
Olav Kongas0be930c2005-12-27 16:04:02 +02001409 spin_unlock_irqrestore(&isp116x->lock, flags);
Olav Kongas959eea22005-11-03 17:38:14 +02001410 val &= (~HCCONTROL_HCFS & ~HCCONTROL_RWE);
1411 val |= HCCONTROL_USB_SUSPEND;
David Brownell704aa0b2005-11-07 15:38:24 -08001412 if (device_may_wakeup(&hcd->self.root_hub->dev))
Olav Kongas959eea22005-11-03 17:38:14 +02001413 val |= HCCONTROL_RWE;
1414 /* Wait for usb transfers to finish */
Olav Kongas0be930c2005-12-27 16:04:02 +02001415 msleep(2);
1416 spin_lock_irqsave(&isp116x->lock, flags);
Olav Kongas959eea22005-11-03 17:38:14 +02001417 isp116x_write_reg32(isp116x, HCCONTROL, val);
Olav Kongas0be930c2005-12-27 16:04:02 +02001418 spin_unlock_irqrestore(&isp116x->lock, flags);
Olav Kongas959eea22005-11-03 17:38:14 +02001419 /* Wait for devices to suspend */
Olav Kongas0be930c2005-12-27 16:04:02 +02001420 msleep(5);
Olav Kongas959eea22005-11-03 17:38:14 +02001421 break;
1422 case HCCONTROL_USB_RESUME:
1423 isp116x_write_reg32(isp116x, HCCONTROL,
1424 (val & ~HCCONTROL_HCFS) |
1425 HCCONTROL_USB_RESET);
1426 case HCCONTROL_USB_RESET:
1427 ret = -EBUSY;
Olav Kongas0be930c2005-12-27 16:04:02 +02001428 default: /* HCCONTROL_USB_SUSPEND */
1429 spin_unlock_irqrestore(&isp116x->lock, flags);
Olav Kongas959eea22005-11-03 17:38:14 +02001430 break;
Olav Kongas959eea22005-11-03 17:38:14 +02001431 }
1432
Olav Kongas959eea22005-11-03 17:38:14 +02001433 return ret;
1434}
1435
1436static int isp116x_bus_resume(struct usb_hcd *hcd)
1437{
1438 struct isp116x *isp116x = hcd_to_isp116x(hcd);
1439 u32 val;
1440
1441 msleep(5);
1442 spin_lock_irq(&isp116x->lock);
1443
1444 val = isp116x_read_reg32(isp116x, HCCONTROL);
1445 switch (val & HCCONTROL_HCFS) {
1446 case HCCONTROL_USB_SUSPEND:
1447 val &= ~HCCONTROL_HCFS;
1448 val |= HCCONTROL_USB_RESUME;
1449 isp116x_write_reg32(isp116x, HCCONTROL, val);
1450 case HCCONTROL_USB_RESUME:
1451 break;
1452 case HCCONTROL_USB_OPER:
1453 spin_unlock_irq(&isp116x->lock);
1454 /* Without setting power_state here the
1455 SUSPENDED state won't be removed from
1456 sysfs/usbN/power.state as a response to remote
1457 wakeup. Maybe in the future. */
1458 hcd->self.root_hub->dev.power.power_state = PMSG_ON;
1459 return 0;
1460 default:
1461 /* HCCONTROL_USB_RESET: this may happen, when during
1462 suspension the HC lost power. Reinitialize completely */
1463 spin_unlock_irq(&isp116x->lock);
1464 DBG("Chip has been reset while suspended. Reinit from scratch.\n");
1465 isp116x_reset(hcd);
1466 isp116x_start(hcd);
1467 isp116x_hub_control(hcd, SetPortFeature,
1468 USB_PORT_FEAT_POWER, 1, NULL, 0);
1469 if ((isp116x->rhdesca & RH_A_NDP) == 2)
1470 isp116x_hub_control(hcd, SetPortFeature,
1471 USB_PORT_FEAT_POWER, 2, NULL, 0);
1472 hcd->self.root_hub->dev.power.power_state = PMSG_ON;
1473 return 0;
1474 }
1475
1476 val = isp116x->rhdesca & RH_A_NDP;
1477 while (val--) {
1478 u32 stat =
1479 isp116x_read_reg32(isp116x, val ? HCRHPORT2 : HCRHPORT1);
1480 /* force global, not selective, resume */
1481 if (!(stat & RH_PS_PSS))
1482 continue;
1483 DBG("%s: Resuming port %d\n", __func__, val);
1484 isp116x_write_reg32(isp116x, RH_PS_POCI, val
1485 ? HCRHPORT2 : HCRHPORT1);
1486 }
1487 spin_unlock_irq(&isp116x->lock);
1488
1489 hcd->state = HC_STATE_RESUMING;
1490 msleep(20);
1491
1492 /* Go operational */
1493 spin_lock_irq(&isp116x->lock);
1494 val = isp116x_read_reg32(isp116x, HCCONTROL);
1495 isp116x_write_reg32(isp116x, HCCONTROL,
1496 (val & ~HCCONTROL_HCFS) | HCCONTROL_USB_OPER);
1497 spin_unlock_irq(&isp116x->lock);
1498 /* see analogous comment above */
1499 hcd->self.root_hub->dev.power.power_state = PMSG_ON;
1500 hcd->state = HC_STATE_RUNNING;
1501
1502 return 0;
1503}
1504
1505#else
1506
1507#define isp116x_bus_suspend NULL
1508#define isp116x_bus_resume NULL
1509
1510#endif
Olav Kongas4808a1c2005-04-09 22:57:39 +03001511
1512static struct hc_driver isp116x_hc_driver = {
1513 .description = hcd_name,
1514 .product_desc = "ISP116x Host Controller",
1515 .hcd_priv_size = sizeof(struct isp116x),
1516
1517 .irq = isp116x_irq,
1518 .flags = HCD_USB11,
1519
1520 .reset = isp116x_reset,
1521 .start = isp116x_start,
1522 .stop = isp116x_stop,
1523
1524 .urb_enqueue = isp116x_urb_enqueue,
1525 .urb_dequeue = isp116x_urb_dequeue,
1526 .endpoint_disable = isp116x_endpoint_disable,
1527
1528 .get_frame_number = isp116x_get_frame,
1529
1530 .hub_status_data = isp116x_hub_status_data,
1531 .hub_control = isp116x_hub_control,
Alan Stern0c0382e2005-10-13 17:08:02 -04001532 .bus_suspend = isp116x_bus_suspend,
1533 .bus_resume = isp116x_bus_resume,
Olav Kongas4808a1c2005-04-09 22:57:39 +03001534};
1535
1536/*----------------------------------------------------------------*/
1537
Greg Kroah-Hartmanb7125482006-03-17 17:40:08 -08001538static int isp116x_remove(struct platform_device *pdev)
Olav Kongas4808a1c2005-04-09 22:57:39 +03001539{
Russell King3ae5eae2005-11-09 22:32:44 +00001540 struct usb_hcd *hcd = platform_get_drvdata(pdev);
Olav Kongas589a0082005-04-21 17:12:59 +03001541 struct isp116x *isp116x;
Olav Kongas4808a1c2005-04-09 22:57:39 +03001542 struct resource *res;
1543
Olav Kongas9a571162005-08-05 14:23:35 +03001544 if (!hcd)
Olav Kongas589a0082005-04-21 17:12:59 +03001545 return 0;
1546 isp116x = hcd_to_isp116x(hcd);
Olav Kongas4808a1c2005-04-09 22:57:39 +03001547 remove_debug_file(isp116x);
1548 usb_remove_hcd(hcd);
1549
1550 iounmap(isp116x->data_reg);
1551 res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
1552 release_mem_region(res->start, 2);
1553 iounmap(isp116x->addr_reg);
1554 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1555 release_mem_region(res->start, 2);
1556
1557 usb_put_hcd(hcd);
1558 return 0;
1559}
1560
1561#define resource_len(r) (((r)->end - (r)->start) + 1)
1562
Prarit Bhargava5bcd70e2007-02-09 01:51:15 -08001563static int __devinit isp116x_probe(struct platform_device *pdev)
Olav Kongas4808a1c2005-04-09 22:57:39 +03001564{
1565 struct usb_hcd *hcd;
1566 struct isp116x *isp116x;
Olav Kongas4808a1c2005-04-09 22:57:39 +03001567 struct resource *addr, *data;
1568 void __iomem *addr_reg;
1569 void __iomem *data_reg;
1570 int irq;
1571 int ret = 0;
1572
Olav Kongas4808a1c2005-04-09 22:57:39 +03001573 if (pdev->num_resources < 3) {
1574 ret = -ENODEV;
1575 goto err1;
1576 }
1577
1578 data = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1579 addr = platform_get_resource(pdev, IORESOURCE_MEM, 1);
1580 irq = platform_get_irq(pdev, 0);
1581 if (!addr || !data || irq < 0) {
1582 ret = -ENODEV;
1583 goto err1;
1584 }
1585
Russell King3ae5eae2005-11-09 22:32:44 +00001586 if (pdev->dev.dma_mask) {
Olav Kongas4808a1c2005-04-09 22:57:39 +03001587 DBG("DMA not supported\n");
1588 ret = -EINVAL;
1589 goto err1;
1590 }
1591
1592 if (!request_mem_region(addr->start, 2, hcd_name)) {
1593 ret = -EBUSY;
1594 goto err1;
1595 }
1596 addr_reg = ioremap(addr->start, resource_len(addr));
1597 if (addr_reg == NULL) {
1598 ret = -ENOMEM;
1599 goto err2;
1600 }
1601 if (!request_mem_region(data->start, 2, hcd_name)) {
1602 ret = -EBUSY;
1603 goto err3;
1604 }
1605 data_reg = ioremap(data->start, resource_len(data));
1606 if (data_reg == NULL) {
1607 ret = -ENOMEM;
1608 goto err4;
1609 }
1610
1611 /* allocate and initialize hcd */
Russell King3ae5eae2005-11-09 22:32:44 +00001612 hcd = usb_create_hcd(&isp116x_hc_driver, &pdev->dev, pdev->dev.bus_id);
Olav Kongas4808a1c2005-04-09 22:57:39 +03001613 if (!hcd) {
1614 ret = -ENOMEM;
1615 goto err5;
1616 }
1617 /* this rsrc_start is bogus */
1618 hcd->rsrc_start = addr->start;
1619 isp116x = hcd_to_isp116x(hcd);
1620 isp116x->data_reg = data_reg;
1621 isp116x->addr_reg = addr_reg;
1622 spin_lock_init(&isp116x->lock);
1623 INIT_LIST_HEAD(&isp116x->async);
Russell King3ae5eae2005-11-09 22:32:44 +00001624 isp116x->board = pdev->dev.platform_data;
Olav Kongas4808a1c2005-04-09 22:57:39 +03001625
1626 if (!isp116x->board) {
1627 ERR("Platform data structure not initialized\n");
1628 ret = -ENODEV;
1629 goto err6;
1630 }
1631 if (isp116x_check_platform_delay(isp116x)) {
1632 ERR("USE_PLATFORM_DELAY defined, but delay function not "
1633 "implemented.\n");
1634 ERR("See comments in drivers/usb/host/isp116x-hcd.c\n");
1635 ret = -ENODEV;
1636 goto err6;
1637 }
1638
Thomas Gleixnerd54b5ca2006-07-01 19:29:44 -07001639 ret = usb_add_hcd(hcd, irq, IRQF_DISABLED);
Olav Kongas959eea22005-11-03 17:38:14 +02001640 if (ret)
Olav Kongas4808a1c2005-04-09 22:57:39 +03001641 goto err6;
1642
Olav Kongas959eea22005-11-03 17:38:14 +02001643 ret = create_debug_file(isp116x);
1644 if (ret) {
1645 ERR("Couldn't create debugfs entry\n");
1646 goto err7;
1647 }
1648
Olav Kongas4808a1c2005-04-09 22:57:39 +03001649 return 0;
1650
Olav Kongas959eea22005-11-03 17:38:14 +02001651 err7:
1652 usb_remove_hcd(hcd);
Olav Kongas4808a1c2005-04-09 22:57:39 +03001653 err6:
1654 usb_put_hcd(hcd);
1655 err5:
1656 iounmap(data_reg);
1657 err4:
1658 release_mem_region(data->start, 2);
1659 err3:
1660 iounmap(addr_reg);
1661 err2:
1662 release_mem_region(addr->start, 2);
1663 err1:
1664 ERR("init error, %d\n", ret);
1665 return ret;
1666}
1667
1668#ifdef CONFIG_PM
1669/*
1670 Suspend of platform device
1671*/
Russell King3ae5eae2005-11-09 22:32:44 +00001672static int isp116x_suspend(struct platform_device *dev, pm_message_t state)
Olav Kongas4808a1c2005-04-09 22:57:39 +03001673{
Olav Kongas959eea22005-11-03 17:38:14 +02001674 VDBG("%s: state %x\n", __func__, state.event);
Russell King3ae5eae2005-11-09 22:32:44 +00001675 dev->dev.power.power_state = state;
Olav Kongas959eea22005-11-03 17:38:14 +02001676 return 0;
Olav Kongas4808a1c2005-04-09 22:57:39 +03001677}
1678
1679/*
1680 Resume platform device
1681*/
Russell King3ae5eae2005-11-09 22:32:44 +00001682static int isp116x_resume(struct platform_device *dev)
Olav Kongas4808a1c2005-04-09 22:57:39 +03001683{
Olav Kongas959eea22005-11-03 17:38:14 +02001684 VDBG("%s: state %x\n", __func__, dev->power.power_state.event);
Russell King3ae5eae2005-11-09 22:32:44 +00001685 dev->dev.power.power_state = PMSG_ON;
Olav Kongas959eea22005-11-03 17:38:14 +02001686 return 0;
Olav Kongas4808a1c2005-04-09 22:57:39 +03001687}
1688
1689#else
1690
1691#define isp116x_suspend NULL
1692#define isp116x_resume NULL
1693
1694#endif
1695
Russell King3ae5eae2005-11-09 22:32:44 +00001696static struct platform_driver isp116x_driver = {
Olav Kongas4808a1c2005-04-09 22:57:39 +03001697 .probe = isp116x_probe,
1698 .remove = isp116x_remove,
1699 .suspend = isp116x_suspend,
1700 .resume = isp116x_resume,
Olav Kongas0be930c2005-12-27 16:04:02 +02001701 .driver = {
1702 .name = (char *)hcd_name,
1703 },
Olav Kongas4808a1c2005-04-09 22:57:39 +03001704};
1705
1706/*-----------------------------------------------------------------*/
1707
1708static int __init isp116x_init(void)
1709{
1710 if (usb_disabled())
1711 return -ENODEV;
1712
1713 INFO("driver %s, %s\n", hcd_name, DRIVER_VERSION);
Russell King3ae5eae2005-11-09 22:32:44 +00001714 return platform_driver_register(&isp116x_driver);
Olav Kongas4808a1c2005-04-09 22:57:39 +03001715}
1716
1717module_init(isp116x_init);
1718
1719static void __exit isp116x_cleanup(void)
1720{
Russell King3ae5eae2005-11-09 22:32:44 +00001721 platform_driver_unregister(&isp116x_driver);
Olav Kongas4808a1c2005-04-09 22:57:39 +03001722}
1723
1724module_exit(isp116x_cleanup);