blob: 0130fd8571e4018549db9a5003bd432b72645878 [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,
Alan Stern4a000272007-08-24 15:42:24 -0400280 struct urb *urb, int status)
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);
Alan Stern4a000272007-08-24 15:42:24 -0400294 usb_hcd_giveback_urb(isp116x_to_hcd(isp116x), urb, status);
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:
Alan Stern4a000272007-08-24 15:42:24 -0400456 if (status != -EINPROGRESS || urb->unlinked)
457 finish_request(isp116x, ep, urb, status);
Alan Stern1b4cd432007-07-12 17:03:01 -0400458 }
459}
460
461/*
Olav Kongas4808a1c2005-04-09 22:57:39 +0300462 Scan transfer lists, schedule transfers, send data off
463 to chip.
464 */
465static void start_atl_transfers(struct isp116x *isp116x)
466{
467 struct isp116x_ep *last_ep = NULL, *ep;
468 struct urb *urb;
469 u16 load = 0;
470 int len, index, speed, byte_time;
471
472 if (atomic_read(&isp116x->atl_finishing))
473 return;
474
475 if (!HC_IS_RUNNING(isp116x_to_hcd(isp116x)->state))
476 return;
477
478 /* FIFO not empty? */
479 if (isp116x_read_reg16(isp116x, HCBUFSTAT) & HCBUFSTAT_ATL_FULL)
480 return;
481
482 isp116x->atl_active = NULL;
483 isp116x->atl_buflen = isp116x->atl_bufshrt = 0;
484
485 /* Schedule int transfers */
486 if (isp116x->periodic_count) {
487 isp116x->fmindex = index =
488 (isp116x->fmindex + 1) & (PERIODIC_SIZE - 1);
489 if ((load = isp116x->load[index])) {
490 /* Bring all int transfers for this frame
491 into the active queue */
492 isp116x->atl_active = last_ep =
493 isp116x->periodic[index];
494 while (last_ep->next)
495 last_ep = (last_ep->active = last_ep->next);
496 last_ep->active = NULL;
497 }
498 }
499
500 /* Schedule control/bulk transfers */
501 list_for_each_entry(ep, &isp116x->async, schedule) {
502 urb = container_of(ep->hep->urb_list.next,
503 struct urb, urb_list);
504 speed = urb->dev->speed;
505 byte_time = speed == USB_SPEED_LOW
506 ? BYTE_TIME_LOWSPEED : BYTE_TIME_FULLSPEED;
507
508 if (ep->nextpid == USB_PID_SETUP) {
509 len = sizeof(struct usb_ctrlrequest);
510 } else if (ep->nextpid == USB_PID_ACK) {
511 len = 0;
512 } else {
513 /* Find current free length ... */
514 len = (MAX_LOAD_LIMIT - load) / byte_time;
515
516 /* ... then limit it to configured max size ... */
517 len = min(len, speed == USB_SPEED_LOW ?
518 MAX_TRANSFER_SIZE_LOWSPEED :
519 MAX_TRANSFER_SIZE_FULLSPEED);
520
521 /* ... and finally cut to the multiple of MaxPacketSize,
522 or to the real length if there's enough room. */
523 if (len <
524 (urb->transfer_buffer_length -
525 urb->actual_length)) {
526 len -= len % ep->maxpacket;
527 if (!len)
528 continue;
529 } else
530 len = urb->transfer_buffer_length -
531 urb->actual_length;
532 BUG_ON(len < 0);
533 }
534
535 load += len * byte_time;
536 if (load > MAX_LOAD_LIMIT)
537 break;
538
539 ep->active = NULL;
540 ep->length = len;
541 if (last_ep)
542 last_ep->active = ep;
543 else
544 isp116x->atl_active = ep;
545 last_ep = ep;
546 }
547
548 /* Avoid starving of endpoints */
549 if ((&isp116x->async)->next != (&isp116x->async)->prev)
550 list_move(&isp116x->async, (&isp116x->async)->next);
551
552 if (isp116x->atl_active) {
553 preproc_atl_queue(isp116x);
554 pack_fifo(isp116x);
555 }
556}
557
558/*
559 Finish the processed transfers
560*/
David Howells7d12e782006-10-05 14:55:46 +0100561static void finish_atl_transfers(struct isp116x *isp116x)
Olav Kongas4808a1c2005-04-09 22:57:39 +0300562{
Olav Kongas4808a1c2005-04-09 22:57:39 +0300563 if (!isp116x->atl_active)
564 return;
565 /* Fifo not ready? */
566 if (!(isp116x_read_reg16(isp116x, HCBUFSTAT) & HCBUFSTAT_ATL_DONE))
567 return;
568
569 atomic_inc(&isp116x->atl_finishing);
570 unpack_fifo(isp116x);
571 postproc_atl_queue(isp116x);
Olav Kongas4808a1c2005-04-09 22:57:39 +0300572 atomic_dec(&isp116x->atl_finishing);
573}
574
David Howells7d12e782006-10-05 14:55:46 +0100575static irqreturn_t isp116x_irq(struct usb_hcd *hcd)
Olav Kongas4808a1c2005-04-09 22:57:39 +0300576{
577 struct isp116x *isp116x = hcd_to_isp116x(hcd);
578 u16 irqstat;
579 irqreturn_t ret = IRQ_NONE;
580
581 spin_lock(&isp116x->lock);
582 isp116x_write_reg16(isp116x, HCuPINTENB, 0);
583 irqstat = isp116x_read_reg16(isp116x, HCuPINT);
584 isp116x_write_reg16(isp116x, HCuPINT, irqstat);
585
586 if (irqstat & (HCuPINT_ATL | HCuPINT_SOF)) {
587 ret = IRQ_HANDLED;
David Howells7d12e782006-10-05 14:55:46 +0100588 finish_atl_transfers(isp116x);
Olav Kongas4808a1c2005-04-09 22:57:39 +0300589 }
590
591 if (irqstat & HCuPINT_OPR) {
592 u32 intstat = isp116x_read_reg32(isp116x, HCINTSTAT);
593 isp116x_write_reg32(isp116x, HCINTSTAT, intstat);
594 if (intstat & HCINT_UE) {
Olav Kongas959eea22005-11-03 17:38:14 +0200595 ERR("Unrecoverable error, HC is dead!\n");
596 /* IRQ's are off, we do no DMA,
597 perfectly ready to die ... */
598 hcd->state = HC_STATE_HALT;
599 ret = IRQ_HANDLED;
600 goto done;
Olav Kongas4808a1c2005-04-09 22:57:39 +0300601 }
Olav Kongas9a571162005-08-05 14:23:35 +0300602 if (intstat & HCINT_RHSC)
603 /* When root hub or any of its ports is going
604 to come out of suspend, it may take more
605 than 10ms for status bits to stabilize. */
606 mod_timer(&hcd->rh_timer, jiffies
607 + msecs_to_jiffies(20) + 1);
Olav Kongas4808a1c2005-04-09 22:57:39 +0300608 if (intstat & HCINT_RD) {
609 DBG("---- remote wakeup\n");
David Brownellccdcf772005-09-22 22:45:13 -0700610 usb_hcd_resume_root_hub(hcd);
Olav Kongas4808a1c2005-04-09 22:57:39 +0300611 }
612 irqstat &= ~HCuPINT_OPR;
613 ret = IRQ_HANDLED;
614 }
615
616 if (irqstat & (HCuPINT_ATL | HCuPINT_SOF)) {
617 start_atl_transfers(isp116x);
618 }
619
620 isp116x_write_reg16(isp116x, HCuPINTENB, isp116x->irqenb);
Olav Kongas959eea22005-11-03 17:38:14 +0200621 done:
Olav Kongas4808a1c2005-04-09 22:57:39 +0300622 spin_unlock(&isp116x->lock);
623 return ret;
624}
625
626/*-----------------------------------------------------------------*/
627
628/* usb 1.1 says max 90% of a frame is available for periodic transfers.
629 * this driver doesn't promise that much since it's got to handle an
630 * IRQ per packet; irq handling latencies also use up that time.
631 */
632
633/* out of 1000 us */
634#define MAX_PERIODIC_LOAD 600
635static int balance(struct isp116x *isp116x, u16 period, u16 load)
636{
637 int i, branch = -ENOSPC;
638
639 /* search for the least loaded schedule branch of that period
640 which has enough bandwidth left unreserved. */
641 for (i = 0; i < period; i++) {
642 if (branch < 0 || isp116x->load[branch] > isp116x->load[i]) {
643 int j;
644
645 for (j = i; j < PERIODIC_SIZE; j += period) {
646 if ((isp116x->load[j] + load)
647 > MAX_PERIODIC_LOAD)
648 break;
649 }
650 if (j < PERIODIC_SIZE)
651 continue;
652 branch = i;
653 }
654 }
655 return branch;
656}
657
658/* NB! ALL the code above this point runs with isp116x->lock
659 held, irqs off
660*/
661
662/*-----------------------------------------------------------------*/
663
664static int isp116x_urb_enqueue(struct usb_hcd *hcd,
Alan Sterne9df41c2007-08-08 11:48:02 -0400665 struct urb *urb,
Al Viro55016f12005-10-21 03:21:58 -0400666 gfp_t mem_flags)
Olav Kongas4808a1c2005-04-09 22:57:39 +0300667{
668 struct isp116x *isp116x = hcd_to_isp116x(hcd);
669 struct usb_device *udev = urb->dev;
670 unsigned int pipe = urb->pipe;
671 int is_out = !usb_pipein(pipe);
672 int type = usb_pipetype(pipe);
673 int epnum = usb_pipeendpoint(pipe);
Alan Sterne9df41c2007-08-08 11:48:02 -0400674 struct usb_host_endpoint *hep = urb->ep;
Olav Kongas4808a1c2005-04-09 22:57:39 +0300675 struct isp116x_ep *ep = NULL;
676 unsigned long flags;
677 int i;
678 int ret = 0;
679
680 urb_dbg(urb, "Enqueue");
681
682 if (type == PIPE_ISOCHRONOUS) {
683 ERR("Isochronous transfers not supported\n");
684 urb_dbg(urb, "Refused to enqueue");
685 return -ENXIO;
686 }
687 /* avoid all allocations within spinlocks: request or endpoint */
688 if (!hep->hcpriv) {
Pekka Enberg7b842b62005-09-06 15:18:34 -0700689 ep = kzalloc(sizeof *ep, mem_flags);
Olav Kongas4808a1c2005-04-09 22:57:39 +0300690 if (!ep)
691 return -ENOMEM;
692 }
693
694 spin_lock_irqsave(&isp116x->lock, flags);
695 if (!HC_IS_RUNNING(hcd->state)) {
Olav Kongas959eea22005-11-03 17:38:14 +0200696 kfree(ep);
Olav Kongas4808a1c2005-04-09 22:57:39 +0300697 ret = -ENODEV;
Alan Sterne9df41c2007-08-08 11:48:02 -0400698 goto fail_not_linked;
699 }
700 ret = usb_hcd_link_urb_to_ep(hcd, urb);
701 if (ret) {
702 kfree(ep);
703 goto fail_not_linked;
Olav Kongas4808a1c2005-04-09 22:57:39 +0300704 }
705
706 if (hep->hcpriv)
707 ep = hep->hcpriv;
708 else {
709 INIT_LIST_HEAD(&ep->schedule);
Alan Stern6a8e87b2006-01-19 10:46:27 -0500710 ep->udev = udev;
Olav Kongas4808a1c2005-04-09 22:57:39 +0300711 ep->epnum = epnum;
712 ep->maxpacket = usb_maxpacket(udev, urb->pipe, is_out);
713 usb_settoggle(udev, epnum, is_out, 0);
714
715 if (type == PIPE_CONTROL) {
716 ep->nextpid = USB_PID_SETUP;
717 } else if (is_out) {
718 ep->nextpid = USB_PID_OUT;
719 } else {
720 ep->nextpid = USB_PID_IN;
721 }
722
723 if (urb->interval) {
724 /*
725 With INT URBs submitted, the driver works with SOF
726 interrupt enabled and ATL interrupt disabled. After
727 the PTDs are written to fifo ram, the chip starts
728 fifo processing and usb transfers after the next
729 SOF and continues until the transfers are finished
730 (succeeded or failed) or the frame ends. Therefore,
731 the transfers occur only in every second frame,
732 while fifo reading/writing and data processing
733 occur in every other second frame. */
734 if (urb->interval < 2)
735 urb->interval = 2;
736 if (urb->interval > 2 * PERIODIC_SIZE)
737 urb->interval = 2 * PERIODIC_SIZE;
738 ep->period = urb->interval >> 1;
739 ep->branch = PERIODIC_SIZE;
740 ep->load = usb_calc_bus_time(udev->speed,
741 !is_out,
742 (type == PIPE_ISOCHRONOUS),
743 usb_maxpacket(udev, pipe,
744 is_out)) /
745 1000;
746 }
747 hep->hcpriv = ep;
748 ep->hep = hep;
749 }
750
751 /* maybe put endpoint into schedule */
752 switch (type) {
753 case PIPE_CONTROL:
754 case PIPE_BULK:
755 if (list_empty(&ep->schedule))
756 list_add_tail(&ep->schedule, &isp116x->async);
757 break;
758 case PIPE_INTERRUPT:
759 urb->interval = ep->period;
760 ep->length = min((int)ep->maxpacket,
761 urb->transfer_buffer_length);
762
763 /* urb submitted for already existing endpoint */
764 if (ep->branch < PERIODIC_SIZE)
765 break;
766
Eric Sesterhennd5ce1372006-06-01 20:48:45 -0700767 ep->branch = ret = balance(isp116x, ep->period, ep->load);
Olav Kongas4808a1c2005-04-09 22:57:39 +0300768 if (ret < 0)
769 goto fail;
770 ret = 0;
771
772 urb->start_frame = (isp116x->fmindex & (PERIODIC_SIZE - 1))
773 + ep->branch;
774
775 /* sort each schedule branch by period (slow before fast)
776 to share the faster parts of the tree without needing
777 dummy/placeholder nodes */
778 DBG("schedule qh%d/%p branch %d\n", ep->period, ep, ep->branch);
779 for (i = ep->branch; i < PERIODIC_SIZE; i += ep->period) {
780 struct isp116x_ep **prev = &isp116x->periodic[i];
781 struct isp116x_ep *here = *prev;
782
783 while (here && ep != here) {
784 if (ep->period > here->period)
785 break;
786 prev = &here->next;
787 here = *prev;
788 }
789 if (ep != here) {
790 ep->next = here;
791 *prev = ep;
792 }
793 isp116x->load[i] += ep->load;
794 }
795 hcd->self.bandwidth_allocated += ep->load / ep->period;
796
797 /* switch over to SOFint */
798 if (!isp116x->periodic_count++) {
799 isp116x->irqenb &= ~HCuPINT_ATL;
800 isp116x->irqenb |= HCuPINT_SOF;
801 isp116x_write_reg16(isp116x, HCuPINTENB,
802 isp116x->irqenb);
803 }
804 }
805
Olav Kongas4808a1c2005-04-09 22:57:39 +0300806 urb->hcpriv = hep;
Olav Kongas4808a1c2005-04-09 22:57:39 +0300807 start_atl_transfers(isp116x);
808
809 fail:
Alan Sterne9df41c2007-08-08 11:48:02 -0400810 if (ret)
811 usb_hcd_unlink_urb_from_ep(hcd, urb);
812 fail_not_linked:
Olav Kongas4808a1c2005-04-09 22:57:39 +0300813 spin_unlock_irqrestore(&isp116x->lock, flags);
814 return ret;
815}
816
817/*
818 Dequeue URBs.
819*/
Alan Sterne9df41c2007-08-08 11:48:02 -0400820static int isp116x_urb_dequeue(struct usb_hcd *hcd, struct urb *urb,
821 int status)
Olav Kongas4808a1c2005-04-09 22:57:39 +0300822{
823 struct isp116x *isp116x = hcd_to_isp116x(hcd);
824 struct usb_host_endpoint *hep;
825 struct isp116x_ep *ep, *ep_act;
826 unsigned long flags;
Alan Sterne9df41c2007-08-08 11:48:02 -0400827 int rc;
Olav Kongas4808a1c2005-04-09 22:57:39 +0300828
829 spin_lock_irqsave(&isp116x->lock, flags);
Alan Sterne9df41c2007-08-08 11:48:02 -0400830 rc = usb_hcd_check_unlink_urb(hcd, urb, status);
831 if (rc)
832 goto done;
833
Olav Kongas4808a1c2005-04-09 22:57:39 +0300834 hep = urb->hcpriv;
Olav Kongas4808a1c2005-04-09 22:57:39 +0300835 ep = hep->hcpriv;
836 WARN_ON(hep != ep->hep);
837
838 /* In front of queue? */
839 if (ep->hep->urb_list.next == &urb->urb_list)
840 /* active? */
841 for (ep_act = isp116x->atl_active; ep_act;
842 ep_act = ep_act->active)
843 if (ep_act == ep) {
844 VDBG("dequeue, urb %p active; wait for irq\n",
845 urb);
846 urb = NULL;
847 break;
848 }
849
850 if (urb)
Alan Stern4a000272007-08-24 15:42:24 -0400851 finish_request(isp116x, ep, urb, status);
Alan Sterne9df41c2007-08-08 11:48:02 -0400852 done:
Olav Kongas4808a1c2005-04-09 22:57:39 +0300853 spin_unlock_irqrestore(&isp116x->lock, flags);
Alan Sterne9df41c2007-08-08 11:48:02 -0400854 return rc;
Olav Kongas4808a1c2005-04-09 22:57:39 +0300855}
856
857static void isp116x_endpoint_disable(struct usb_hcd *hcd,
858 struct usb_host_endpoint *hep)
859{
860 int i;
Olav Kongas959eea22005-11-03 17:38:14 +0200861 struct isp116x_ep *ep = hep->hcpriv;
Olav Kongas4808a1c2005-04-09 22:57:39 +0300862
863 if (!ep)
864 return;
865
866 /* assume we'd just wait for the irq */
867 for (i = 0; i < 100 && !list_empty(&hep->urb_list); i++)
868 msleep(3);
869 if (!list_empty(&hep->urb_list))
870 WARN("ep %p not empty?\n", ep);
871
Olav Kongas4808a1c2005-04-09 22:57:39 +0300872 kfree(ep);
873 hep->hcpriv = NULL;
874}
875
876static int isp116x_get_frame(struct usb_hcd *hcd)
877{
878 struct isp116x *isp116x = hcd_to_isp116x(hcd);
879 u32 fmnum;
880 unsigned long flags;
881
882 spin_lock_irqsave(&isp116x->lock, flags);
883 fmnum = isp116x_read_reg32(isp116x, HCFMNUM);
884 spin_unlock_irqrestore(&isp116x->lock, flags);
885 return (int)fmnum;
886}
887
Olav Kongas4808a1c2005-04-09 22:57:39 +0300888/*
889 Adapted from ohci-hub.c. Currently we don't support autosuspend.
890*/
891static int isp116x_hub_status_data(struct usb_hcd *hcd, char *buf)
892{
893 struct isp116x *isp116x = hcd_to_isp116x(hcd);
894 int ports, i, changed = 0;
Olav Kongas9a571162005-08-05 14:23:35 +0300895 unsigned long flags;
Olav Kongas4808a1c2005-04-09 22:57:39 +0300896
897 if (!HC_IS_RUNNING(hcd->state))
898 return -ESHUTDOWN;
899
Olav Kongas9a571162005-08-05 14:23:35 +0300900 /* Report no status change now, if we are scheduled to be
901 called later */
902 if (timer_pending(&hcd->rh_timer))
903 return 0;
Olav Kongas4808a1c2005-04-09 22:57:39 +0300904
Olav Kongas9a571162005-08-05 14:23:35 +0300905 ports = isp116x->rhdesca & RH_A_NDP;
906 spin_lock_irqsave(&isp116x->lock, flags);
907 isp116x->rhstatus = isp116x_read_reg32(isp116x, HCRHSTATUS);
Olav Kongas4808a1c2005-04-09 22:57:39 +0300908 if (isp116x->rhstatus & (RH_HS_LPSC | RH_HS_OCIC))
909 buf[0] = changed = 1;
910 else
911 buf[0] = 0;
912
913 for (i = 0; i < ports; i++) {
Olav Kongas9a571162005-08-05 14:23:35 +0300914 u32 status = isp116x->rhport[i] =
915 isp116x_read_reg32(isp116x, i ? HCRHPORT2 : HCRHPORT1);
Olav Kongas4808a1c2005-04-09 22:57:39 +0300916
917 if (status & (RH_PS_CSC | RH_PS_PESC | RH_PS_PSSC
918 | RH_PS_OCIC | RH_PS_PRSC)) {
919 changed = 1;
920 buf[0] |= 1 << (i + 1);
Olav Kongas4808a1c2005-04-09 22:57:39 +0300921 }
922 }
Olav Kongas9a571162005-08-05 14:23:35 +0300923 spin_unlock_irqrestore(&isp116x->lock, flags);
Olav Kongas4808a1c2005-04-09 22:57:39 +0300924 return changed;
925}
926
927static void isp116x_hub_descriptor(struct isp116x *isp116x,
928 struct usb_hub_descriptor *desc)
929{
930 u32 reg = isp116x->rhdesca;
931
932 desc->bDescriptorType = 0x29;
933 desc->bDescLength = 9;
934 desc->bHubContrCurrent = 0;
935 desc->bNbrPorts = (u8) (reg & 0x3);
936 /* Power switching, device type, overcurrent. */
Olav Kongas959eea22005-11-03 17:38:14 +0200937 desc->wHubCharacteristics = cpu_to_le16((u16) ((reg >> 8) & 0x1f));
Olav Kongas4808a1c2005-04-09 22:57:39 +0300938 desc->bPwrOn2PwrGood = (u8) ((reg >> 24) & 0xff);
939 /* two bitmaps: ports removable, and legacy PortPwrCtrlMask */
Olav Kongas959eea22005-11-03 17:38:14 +0200940 desc->bitmap[0] = 0;
Olav Kongas4808a1c2005-04-09 22:57:39 +0300941 desc->bitmap[1] = ~0;
942}
943
944/* Perform reset of a given port.
945 It would be great to just start the reset and let the
946 USB core to clear the reset in due time. However,
947 root hub ports should be reset for at least 50 ms, while
948 our chip stays in reset for about 10 ms. I.e., we must
949 repeatedly reset it ourself here.
950*/
951static inline void root_port_reset(struct isp116x *isp116x, unsigned port)
952{
953 u32 tmp;
954 unsigned long flags, t;
955
956 /* Root hub reset should be 50 ms, but some devices
957 want it even longer. */
958 t = jiffies + msecs_to_jiffies(100);
959
960 while (time_before(jiffies, t)) {
961 spin_lock_irqsave(&isp116x->lock, flags);
962 /* spin until any current reset finishes */
963 for (;;) {
964 tmp = isp116x_read_reg32(isp116x, port ?
965 HCRHPORT2 : HCRHPORT1);
966 if (!(tmp & RH_PS_PRS))
967 break;
968 udelay(500);
969 }
970 /* Don't reset a disconnected port */
971 if (!(tmp & RH_PS_CCS)) {
972 spin_unlock_irqrestore(&isp116x->lock, flags);
973 break;
974 }
975 /* Reset lasts 10ms (claims datasheet) */
976 isp116x_write_reg32(isp116x, port ? HCRHPORT2 :
977 HCRHPORT1, (RH_PS_PRS));
978 spin_unlock_irqrestore(&isp116x->lock, flags);
979 msleep(10);
980 }
981}
982
983/* Adapted from ohci-hub.c */
984static int isp116x_hub_control(struct usb_hcd *hcd,
985 u16 typeReq,
986 u16 wValue, u16 wIndex, char *buf, u16 wLength)
987{
988 struct isp116x *isp116x = hcd_to_isp116x(hcd);
989 int ret = 0;
990 unsigned long flags;
991 int ports = isp116x->rhdesca & RH_A_NDP;
992 u32 tmp = 0;
993
994 switch (typeReq) {
995 case ClearHubFeature:
996 DBG("ClearHubFeature: ");
997 switch (wValue) {
998 case C_HUB_OVER_CURRENT:
999 DBG("C_HUB_OVER_CURRENT\n");
1000 spin_lock_irqsave(&isp116x->lock, flags);
1001 isp116x_write_reg32(isp116x, HCRHSTATUS, RH_HS_OCIC);
1002 spin_unlock_irqrestore(&isp116x->lock, flags);
1003 case C_HUB_LOCAL_POWER:
1004 DBG("C_HUB_LOCAL_POWER\n");
1005 break;
1006 default:
1007 goto error;
1008 }
1009 break;
1010 case SetHubFeature:
1011 DBG("SetHubFeature: ");
1012 switch (wValue) {
1013 case C_HUB_OVER_CURRENT:
1014 case C_HUB_LOCAL_POWER:
1015 DBG("C_HUB_OVER_CURRENT or C_HUB_LOCAL_POWER\n");
1016 break;
1017 default:
1018 goto error;
1019 }
1020 break;
1021 case GetHubDescriptor:
1022 DBG("GetHubDescriptor\n");
1023 isp116x_hub_descriptor(isp116x,
1024 (struct usb_hub_descriptor *)buf);
1025 break;
1026 case GetHubStatus:
1027 DBG("GetHubStatus\n");
Olav Kongas17f8bb72005-06-23 20:12:24 +03001028 *(__le32 *) buf = 0;
Olav Kongas4808a1c2005-04-09 22:57:39 +03001029 break;
1030 case GetPortStatus:
1031 DBG("GetPortStatus\n");
1032 if (!wIndex || wIndex > ports)
1033 goto error;
1034 tmp = isp116x->rhport[--wIndex];
1035 *(__le32 *) buf = cpu_to_le32(tmp);
1036 DBG("GetPortStatus: port[%d] %08x\n", wIndex + 1, tmp);
1037 break;
1038 case ClearPortFeature:
1039 DBG("ClearPortFeature: ");
1040 if (!wIndex || wIndex > ports)
1041 goto error;
1042 wIndex--;
1043
1044 switch (wValue) {
1045 case USB_PORT_FEAT_ENABLE:
1046 DBG("USB_PORT_FEAT_ENABLE\n");
1047 tmp = RH_PS_CCS;
1048 break;
1049 case USB_PORT_FEAT_C_ENABLE:
1050 DBG("USB_PORT_FEAT_C_ENABLE\n");
1051 tmp = RH_PS_PESC;
1052 break;
1053 case USB_PORT_FEAT_SUSPEND:
1054 DBG("USB_PORT_FEAT_SUSPEND\n");
1055 tmp = RH_PS_POCI;
1056 break;
1057 case USB_PORT_FEAT_C_SUSPEND:
1058 DBG("USB_PORT_FEAT_C_SUSPEND\n");
1059 tmp = RH_PS_PSSC;
1060 break;
1061 case USB_PORT_FEAT_POWER:
1062 DBG("USB_PORT_FEAT_POWER\n");
1063 tmp = RH_PS_LSDA;
1064 break;
1065 case USB_PORT_FEAT_C_CONNECTION:
1066 DBG("USB_PORT_FEAT_C_CONNECTION\n");
1067 tmp = RH_PS_CSC;
1068 break;
1069 case USB_PORT_FEAT_C_OVER_CURRENT:
1070 DBG("USB_PORT_FEAT_C_OVER_CURRENT\n");
1071 tmp = RH_PS_OCIC;
1072 break;
1073 case USB_PORT_FEAT_C_RESET:
1074 DBG("USB_PORT_FEAT_C_RESET\n");
1075 tmp = RH_PS_PRSC;
1076 break;
1077 default:
1078 goto error;
1079 }
1080 spin_lock_irqsave(&isp116x->lock, flags);
1081 isp116x_write_reg32(isp116x, wIndex
1082 ? HCRHPORT2 : HCRHPORT1, tmp);
1083 isp116x->rhport[wIndex] =
1084 isp116x_read_reg32(isp116x, wIndex ? HCRHPORT2 : HCRHPORT1);
1085 spin_unlock_irqrestore(&isp116x->lock, flags);
1086 break;
1087 case SetPortFeature:
1088 DBG("SetPortFeature: ");
1089 if (!wIndex || wIndex > ports)
1090 goto error;
1091 wIndex--;
1092 switch (wValue) {
1093 case USB_PORT_FEAT_SUSPEND:
1094 DBG("USB_PORT_FEAT_SUSPEND\n");
1095 spin_lock_irqsave(&isp116x->lock, flags);
1096 isp116x_write_reg32(isp116x, wIndex
1097 ? HCRHPORT2 : HCRHPORT1, RH_PS_PSS);
1098 break;
1099 case USB_PORT_FEAT_POWER:
1100 DBG("USB_PORT_FEAT_POWER\n");
1101 spin_lock_irqsave(&isp116x->lock, flags);
1102 isp116x_write_reg32(isp116x, wIndex
1103 ? HCRHPORT2 : HCRHPORT1, RH_PS_PPS);
1104 break;
1105 case USB_PORT_FEAT_RESET:
1106 DBG("USB_PORT_FEAT_RESET\n");
1107 root_port_reset(isp116x, wIndex);
1108 spin_lock_irqsave(&isp116x->lock, flags);
1109 break;
1110 default:
1111 goto error;
1112 }
1113 isp116x->rhport[wIndex] =
1114 isp116x_read_reg32(isp116x, wIndex ? HCRHPORT2 : HCRHPORT1);
1115 spin_unlock_irqrestore(&isp116x->lock, flags);
1116 break;
1117
1118 default:
1119 error:
1120 /* "protocol stall" on error */
1121 DBG("PROTOCOL STALL\n");
1122 ret = -EPIPE;
1123 }
1124 return ret;
1125}
1126
Olav Kongas4808a1c2005-04-09 22:57:39 +03001127/*-----------------------------------------------------------------*/
1128
Olav Kongas959eea22005-11-03 17:38:14 +02001129#ifdef CONFIG_DEBUG_FS
Olav Kongas4808a1c2005-04-09 22:57:39 +03001130
1131static void dump_irq(struct seq_file *s, char *label, u16 mask)
1132{
1133 seq_printf(s, "%s %04x%s%s%s%s%s%s\n", label, mask,
1134 mask & HCuPINT_CLKRDY ? " clkrdy" : "",
1135 mask & HCuPINT_SUSP ? " susp" : "",
1136 mask & HCuPINT_OPR ? " opr" : "",
1137 mask & HCuPINT_AIIEOT ? " eot" : "",
1138 mask & HCuPINT_ATL ? " atl" : "",
1139 mask & HCuPINT_SOF ? " sof" : "");
1140}
1141
1142static void dump_int(struct seq_file *s, char *label, u32 mask)
1143{
1144 seq_printf(s, "%s %08x%s%s%s%s%s%s%s\n", label, mask,
1145 mask & HCINT_MIE ? " MIE" : "",
1146 mask & HCINT_RHSC ? " rhsc" : "",
1147 mask & HCINT_FNO ? " fno" : "",
1148 mask & HCINT_UE ? " ue" : "",
1149 mask & HCINT_RD ? " rd" : "",
1150 mask & HCINT_SF ? " sof" : "", mask & HCINT_SO ? " so" : "");
1151}
1152
Olav Kongas959eea22005-11-03 17:38:14 +02001153static int isp116x_show_dbg(struct seq_file *s, void *unused)
Olav Kongas4808a1c2005-04-09 22:57:39 +03001154{
1155 struct isp116x *isp116x = s->private;
Olav Kongas4808a1c2005-04-09 22:57:39 +03001156
1157 seq_printf(s, "%s\n%s version %s\n",
1158 isp116x_to_hcd(isp116x)->product_desc, hcd_name,
1159 DRIVER_VERSION);
1160
1161 if (HC_IS_SUSPENDED(isp116x_to_hcd(isp116x)->state)) {
1162 seq_printf(s, "HCD is suspended\n");
1163 return 0;
1164 }
1165 if (!HC_IS_RUNNING(isp116x_to_hcd(isp116x)->state)) {
1166 seq_printf(s, "HCD not running\n");
1167 return 0;
1168 }
1169
1170 spin_lock_irq(&isp116x->lock);
Olav Kongas4808a1c2005-04-09 22:57:39 +03001171 dump_irq(s, "hc_irq_enable", isp116x_read_reg16(isp116x, HCuPINTENB));
1172 dump_irq(s, "hc_irq_status", isp116x_read_reg16(isp116x, HCuPINT));
1173 dump_int(s, "hc_int_enable", isp116x_read_reg32(isp116x, HCINTENB));
1174 dump_int(s, "hc_int_status", isp116x_read_reg32(isp116x, HCINTSTAT));
Olav Kongas959eea22005-11-03 17:38:14 +02001175 isp116x_show_regs_seq(isp116x, s);
Olav Kongas4808a1c2005-04-09 22:57:39 +03001176 spin_unlock_irq(&isp116x->lock);
1177 seq_printf(s, "\n");
1178
1179 return 0;
1180}
1181
Olav Kongas959eea22005-11-03 17:38:14 +02001182static int isp116x_open_seq(struct inode *inode, struct file *file)
Olav Kongas4808a1c2005-04-09 22:57:39 +03001183{
Theodore Ts'o8e18e292006-09-27 01:50:46 -07001184 return single_open(file, isp116x_show_dbg, inode->i_private);
Olav Kongas4808a1c2005-04-09 22:57:39 +03001185}
1186
Luiz Fernando N. Capitulino066202d2006-08-05 20:37:11 -03001187static const struct file_operations isp116x_debug_fops = {
Olav Kongas959eea22005-11-03 17:38:14 +02001188 .open = isp116x_open_seq,
Olav Kongas4808a1c2005-04-09 22:57:39 +03001189 .read = seq_read,
1190 .llseek = seq_lseek,
1191 .release = single_release,
1192};
1193
Olav Kongas959eea22005-11-03 17:38:14 +02001194static int create_debug_file(struct isp116x *isp116x)
Olav Kongas4808a1c2005-04-09 22:57:39 +03001195{
Olav Kongas959eea22005-11-03 17:38:14 +02001196 isp116x->dentry = debugfs_create_file(hcd_name,
1197 S_IRUGO, NULL, isp116x,
1198 &isp116x_debug_fops);
1199 if (!isp116x->dentry)
1200 return -ENOMEM;
1201 return 0;
Olav Kongas4808a1c2005-04-09 22:57:39 +03001202}
1203
1204static void remove_debug_file(struct isp116x *isp116x)
1205{
Olav Kongas959eea22005-11-03 17:38:14 +02001206 debugfs_remove(isp116x->dentry);
Olav Kongas4808a1c2005-04-09 22:57:39 +03001207}
1208
Olav Kongas959eea22005-11-03 17:38:14 +02001209#else
1210
1211#define create_debug_file(d) 0
1212#define remove_debug_file(d) do{}while(0)
1213
1214#endif /* CONFIG_DEBUG_FS */
Olav Kongas4808a1c2005-04-09 22:57:39 +03001215
1216/*-----------------------------------------------------------------*/
1217
1218/*
1219 Software reset - can be called from any contect.
1220*/
1221static int isp116x_sw_reset(struct isp116x *isp116x)
1222{
1223 int retries = 15;
1224 unsigned long flags;
1225 int ret = 0;
1226
1227 spin_lock_irqsave(&isp116x->lock, flags);
1228 isp116x_write_reg16(isp116x, HCSWRES, HCSWRES_MAGIC);
1229 isp116x_write_reg32(isp116x, HCCMDSTAT, HCCMDSTAT_HCR);
1230 while (--retries) {
1231 /* It usually resets within 1 ms */
1232 mdelay(1);
1233 if (!(isp116x_read_reg32(isp116x, HCCMDSTAT) & HCCMDSTAT_HCR))
1234 break;
1235 }
1236 if (!retries) {
1237 ERR("Software reset timeout\n");
1238 ret = -ETIME;
1239 }
1240 spin_unlock_irqrestore(&isp116x->lock, flags);
1241 return ret;
1242}
1243
Olav Kongas4808a1c2005-04-09 22:57:39 +03001244static int isp116x_reset(struct usb_hcd *hcd)
1245{
1246 struct isp116x *isp116x = hcd_to_isp116x(hcd);
1247 unsigned long t;
1248 u16 clkrdy = 0;
Olav Kongas959eea22005-11-03 17:38:14 +02001249 int ret, timeout = 15 /* ms */ ;
Olav Kongas4808a1c2005-04-09 22:57:39 +03001250
Olav Kongasf8d23d32005-08-04 17:02:54 +03001251 ret = isp116x_sw_reset(isp116x);
Olav Kongas4808a1c2005-04-09 22:57:39 +03001252 if (ret)
1253 return ret;
1254
1255 t = jiffies + msecs_to_jiffies(timeout);
1256 while (time_before_eq(jiffies, t)) {
1257 msleep(4);
1258 spin_lock_irq(&isp116x->lock);
1259 clkrdy = isp116x_read_reg16(isp116x, HCuPINT) & HCuPINT_CLKRDY;
1260 spin_unlock_irq(&isp116x->lock);
1261 if (clkrdy)
1262 break;
1263 }
1264 if (!clkrdy) {
Olav Kongas959eea22005-11-03 17:38:14 +02001265 ERR("Clock not ready after %dms\n", timeout);
Olav Kongas589a0082005-04-21 17:12:59 +03001266 /* After sw_reset the clock won't report to be ready, if
1267 H_WAKEUP pin is high. */
Olav Kongasf8d23d32005-08-04 17:02:54 +03001268 ERR("Please make sure that the H_WAKEUP pin is pulled low!\n");
Olav Kongas4808a1c2005-04-09 22:57:39 +03001269 ret = -ENODEV;
1270 }
1271 return ret;
1272}
1273
1274static void isp116x_stop(struct usb_hcd *hcd)
1275{
1276 struct isp116x *isp116x = hcd_to_isp116x(hcd);
1277 unsigned long flags;
1278 u32 val;
1279
1280 spin_lock_irqsave(&isp116x->lock, flags);
1281 isp116x_write_reg16(isp116x, HCuPINTENB, 0);
1282
1283 /* Switch off ports' power, some devices don't come up
1284 after next 'insmod' without this */
1285 val = isp116x_read_reg32(isp116x, HCRHDESCA);
1286 val &= ~(RH_A_NPS | RH_A_PSM);
1287 isp116x_write_reg32(isp116x, HCRHDESCA, val);
1288 isp116x_write_reg32(isp116x, HCRHSTATUS, RH_HS_LPS);
1289 spin_unlock_irqrestore(&isp116x->lock, flags);
1290
Olav Kongasf8d23d32005-08-04 17:02:54 +03001291 isp116x_sw_reset(isp116x);
Olav Kongas4808a1c2005-04-09 22:57:39 +03001292}
1293
1294/*
1295 Configure the chip. The chip must be successfully reset by now.
1296*/
1297static int isp116x_start(struct usb_hcd *hcd)
1298{
1299 struct isp116x *isp116x = hcd_to_isp116x(hcd);
1300 struct isp116x_platform_data *board = isp116x->board;
Olav Kongas4808a1c2005-04-09 22:57:39 +03001301 u32 val;
1302 unsigned long flags;
1303
1304 spin_lock_irqsave(&isp116x->lock, flags);
1305
1306 /* clear interrupt status and disable all interrupt sources */
1307 isp116x_write_reg16(isp116x, HCuPINT, 0xff);
1308 isp116x_write_reg16(isp116x, HCuPINTENB, 0);
1309
1310 val = isp116x_read_reg16(isp116x, HCCHIPID);
1311 if ((val & HCCHIPID_MASK) != HCCHIPID_MAGIC) {
1312 ERR("Invalid chip ID %04x\n", val);
1313 spin_unlock_irqrestore(&isp116x->lock, flags);
1314 return -ENODEV;
1315 }
1316
Olav Kongas9a571162005-08-05 14:23:35 +03001317 /* To be removed in future */
1318 hcd->uses_new_polling = 1;
1319
Olav Kongas4808a1c2005-04-09 22:57:39 +03001320 isp116x_write_reg16(isp116x, HCITLBUFLEN, ISP116x_ITL_BUFSIZE);
1321 isp116x_write_reg16(isp116x, HCATLBUFLEN, ISP116x_ATL_BUFSIZE);
1322
1323 /* ----- HW conf */
1324 val = HCHWCFG_INT_ENABLE | HCHWCFG_DBWIDTH(1);
1325 if (board->sel15Kres)
1326 val |= HCHWCFG_15KRSEL;
1327 /* Remote wakeup won't work without working clock */
Olav Kongasd4d62862005-08-04 16:48:19 +03001328 if (board->remote_wakeup_enable)
Olav Kongas4808a1c2005-04-09 22:57:39 +03001329 val |= HCHWCFG_CLKNOTSTOP;
1330 if (board->oc_enable)
1331 val |= HCHWCFG_ANALOG_OC;
1332 if (board->int_act_high)
1333 val |= HCHWCFG_INT_POL;
1334 if (board->int_edge_triggered)
1335 val |= HCHWCFG_INT_TRIGGER;
1336 isp116x_write_reg16(isp116x, HCHWCFG, val);
1337
1338 /* ----- Root hub conf */
Olav Kongasdc5bed02005-08-04 16:46:28 +03001339 val = (25 << 24) & RH_A_POTPGT;
Olav Kongas165c0f32005-08-04 16:52:31 +03001340 /* AN10003_1.pdf recommends RH_A_NPS (no power switching) to
1341 be always set. Yet, instead, we request individual port
1342 power switching. */
1343 val |= RH_A_PSM;
Olav Kongas9d233d92005-08-04 16:54:08 +03001344 /* Report overcurrent per port */
1345 val |= RH_A_OCPM;
Olav Kongas4808a1c2005-04-09 22:57:39 +03001346 isp116x_write_reg32(isp116x, HCRHDESCA, val);
1347 isp116x->rhdesca = isp116x_read_reg32(isp116x, HCRHDESCA);
1348
1349 val = RH_B_PPCM;
1350 isp116x_write_reg32(isp116x, HCRHDESCB, val);
1351 isp116x->rhdescb = isp116x_read_reg32(isp116x, HCRHDESCB);
1352
1353 val = 0;
1354 if (board->remote_wakeup_enable) {
David Brownell704aa0b2005-11-07 15:38:24 -08001355 if (!device_can_wakeup(hcd->self.controller))
1356 device_init_wakeup(hcd->self.controller, 1);
Olav Kongas4808a1c2005-04-09 22:57:39 +03001357 val |= RH_HS_DRWE;
1358 }
1359 isp116x_write_reg32(isp116x, HCRHSTATUS, val);
1360 isp116x->rhstatus = isp116x_read_reg32(isp116x, HCRHSTATUS);
1361
1362 isp116x_write_reg32(isp116x, HCFMINTVL, 0x27782edf);
Olav Kongas4808a1c2005-04-09 22:57:39 +03001363
Olav Kongas4808a1c2005-04-09 22:57:39 +03001364 hcd->state = HC_STATE_RUNNING;
1365
Olav Kongas4808a1c2005-04-09 22:57:39 +03001366 /* Set up interrupts */
1367 isp116x->intenb = HCINT_MIE | HCINT_RHSC | HCINT_UE;
1368 if (board->remote_wakeup_enable)
1369 isp116x->intenb |= HCINT_RD;
1370 isp116x->irqenb = HCuPINT_ATL | HCuPINT_OPR; /* | HCuPINT_SUSP; */
1371 isp116x_write_reg32(isp116x, HCINTENB, isp116x->intenb);
1372 isp116x_write_reg16(isp116x, HCuPINTENB, isp116x->irqenb);
1373
1374 /* Go operational */
1375 val = HCCONTROL_USB_OPER;
Olav Kongas4808a1c2005-04-09 22:57:39 +03001376 if (board->remote_wakeup_enable)
1377 val |= HCCONTROL_RWE;
1378 isp116x_write_reg32(isp116x, HCCONTROL, val);
1379
1380 /* Disable ports to avoid race in device enumeration */
1381 isp116x_write_reg32(isp116x, HCRHPORT1, RH_PS_CCS);
1382 isp116x_write_reg32(isp116x, HCRHPORT2, RH_PS_CCS);
1383
Olav Kongas959eea22005-11-03 17:38:14 +02001384 isp116x_show_regs_log(isp116x);
Olav Kongas4808a1c2005-04-09 22:57:39 +03001385 spin_unlock_irqrestore(&isp116x->lock, flags);
1386 return 0;
1387}
1388
Olav Kongas959eea22005-11-03 17:38:14 +02001389#ifdef CONFIG_PM
1390
1391static int isp116x_bus_suspend(struct usb_hcd *hcd)
1392{
1393 struct isp116x *isp116x = hcd_to_isp116x(hcd);
1394 unsigned long flags;
1395 u32 val;
1396 int ret = 0;
1397
1398 spin_lock_irqsave(&isp116x->lock, flags);
Olav Kongas959eea22005-11-03 17:38:14 +02001399 val = isp116x_read_reg32(isp116x, HCCONTROL);
Olav Kongas0be930c2005-12-27 16:04:02 +02001400
Olav Kongas959eea22005-11-03 17:38:14 +02001401 switch (val & HCCONTROL_HCFS) {
1402 case HCCONTROL_USB_OPER:
Olav Kongas0be930c2005-12-27 16:04:02 +02001403 spin_unlock_irqrestore(&isp116x->lock, flags);
Olav Kongas959eea22005-11-03 17:38:14 +02001404 val &= (~HCCONTROL_HCFS & ~HCCONTROL_RWE);
1405 val |= HCCONTROL_USB_SUSPEND;
David Brownell704aa0b2005-11-07 15:38:24 -08001406 if (device_may_wakeup(&hcd->self.root_hub->dev))
Olav Kongas959eea22005-11-03 17:38:14 +02001407 val |= HCCONTROL_RWE;
1408 /* Wait for usb transfers to finish */
Olav Kongas0be930c2005-12-27 16:04:02 +02001409 msleep(2);
1410 spin_lock_irqsave(&isp116x->lock, flags);
Olav Kongas959eea22005-11-03 17:38:14 +02001411 isp116x_write_reg32(isp116x, HCCONTROL, val);
Olav Kongas0be930c2005-12-27 16:04:02 +02001412 spin_unlock_irqrestore(&isp116x->lock, flags);
Olav Kongas959eea22005-11-03 17:38:14 +02001413 /* Wait for devices to suspend */
Olav Kongas0be930c2005-12-27 16:04:02 +02001414 msleep(5);
Olav Kongas959eea22005-11-03 17:38:14 +02001415 break;
1416 case HCCONTROL_USB_RESUME:
1417 isp116x_write_reg32(isp116x, HCCONTROL,
1418 (val & ~HCCONTROL_HCFS) |
1419 HCCONTROL_USB_RESET);
1420 case HCCONTROL_USB_RESET:
1421 ret = -EBUSY;
Olav Kongas0be930c2005-12-27 16:04:02 +02001422 default: /* HCCONTROL_USB_SUSPEND */
1423 spin_unlock_irqrestore(&isp116x->lock, flags);
Olav Kongas959eea22005-11-03 17:38:14 +02001424 break;
Olav Kongas959eea22005-11-03 17:38:14 +02001425 }
1426
Olav Kongas959eea22005-11-03 17:38:14 +02001427 return ret;
1428}
1429
1430static int isp116x_bus_resume(struct usb_hcd *hcd)
1431{
1432 struct isp116x *isp116x = hcd_to_isp116x(hcd);
1433 u32 val;
1434
1435 msleep(5);
1436 spin_lock_irq(&isp116x->lock);
1437
1438 val = isp116x_read_reg32(isp116x, HCCONTROL);
1439 switch (val & HCCONTROL_HCFS) {
1440 case HCCONTROL_USB_SUSPEND:
1441 val &= ~HCCONTROL_HCFS;
1442 val |= HCCONTROL_USB_RESUME;
1443 isp116x_write_reg32(isp116x, HCCONTROL, val);
1444 case HCCONTROL_USB_RESUME:
1445 break;
1446 case HCCONTROL_USB_OPER:
1447 spin_unlock_irq(&isp116x->lock);
1448 /* Without setting power_state here the
1449 SUSPENDED state won't be removed from
1450 sysfs/usbN/power.state as a response to remote
1451 wakeup. Maybe in the future. */
1452 hcd->self.root_hub->dev.power.power_state = PMSG_ON;
1453 return 0;
1454 default:
1455 /* HCCONTROL_USB_RESET: this may happen, when during
1456 suspension the HC lost power. Reinitialize completely */
1457 spin_unlock_irq(&isp116x->lock);
1458 DBG("Chip has been reset while suspended. Reinit from scratch.\n");
1459 isp116x_reset(hcd);
1460 isp116x_start(hcd);
1461 isp116x_hub_control(hcd, SetPortFeature,
1462 USB_PORT_FEAT_POWER, 1, NULL, 0);
1463 if ((isp116x->rhdesca & RH_A_NDP) == 2)
1464 isp116x_hub_control(hcd, SetPortFeature,
1465 USB_PORT_FEAT_POWER, 2, NULL, 0);
1466 hcd->self.root_hub->dev.power.power_state = PMSG_ON;
1467 return 0;
1468 }
1469
1470 val = isp116x->rhdesca & RH_A_NDP;
1471 while (val--) {
1472 u32 stat =
1473 isp116x_read_reg32(isp116x, val ? HCRHPORT2 : HCRHPORT1);
1474 /* force global, not selective, resume */
1475 if (!(stat & RH_PS_PSS))
1476 continue;
1477 DBG("%s: Resuming port %d\n", __func__, val);
1478 isp116x_write_reg32(isp116x, RH_PS_POCI, val
1479 ? HCRHPORT2 : HCRHPORT1);
1480 }
1481 spin_unlock_irq(&isp116x->lock);
1482
1483 hcd->state = HC_STATE_RESUMING;
1484 msleep(20);
1485
1486 /* Go operational */
1487 spin_lock_irq(&isp116x->lock);
1488 val = isp116x_read_reg32(isp116x, HCCONTROL);
1489 isp116x_write_reg32(isp116x, HCCONTROL,
1490 (val & ~HCCONTROL_HCFS) | HCCONTROL_USB_OPER);
1491 spin_unlock_irq(&isp116x->lock);
1492 /* see analogous comment above */
1493 hcd->self.root_hub->dev.power.power_state = PMSG_ON;
1494 hcd->state = HC_STATE_RUNNING;
1495
1496 return 0;
1497}
1498
1499#else
1500
1501#define isp116x_bus_suspend NULL
1502#define isp116x_bus_resume NULL
1503
1504#endif
Olav Kongas4808a1c2005-04-09 22:57:39 +03001505
1506static struct hc_driver isp116x_hc_driver = {
1507 .description = hcd_name,
1508 .product_desc = "ISP116x Host Controller",
1509 .hcd_priv_size = sizeof(struct isp116x),
1510
1511 .irq = isp116x_irq,
1512 .flags = HCD_USB11,
1513
1514 .reset = isp116x_reset,
1515 .start = isp116x_start,
1516 .stop = isp116x_stop,
1517
1518 .urb_enqueue = isp116x_urb_enqueue,
1519 .urb_dequeue = isp116x_urb_dequeue,
1520 .endpoint_disable = isp116x_endpoint_disable,
1521
1522 .get_frame_number = isp116x_get_frame,
1523
1524 .hub_status_data = isp116x_hub_status_data,
1525 .hub_control = isp116x_hub_control,
Alan Stern0c0382e2005-10-13 17:08:02 -04001526 .bus_suspend = isp116x_bus_suspend,
1527 .bus_resume = isp116x_bus_resume,
Olav Kongas4808a1c2005-04-09 22:57:39 +03001528};
1529
1530/*----------------------------------------------------------------*/
1531
Greg Kroah-Hartmanb7125482006-03-17 17:40:08 -08001532static int isp116x_remove(struct platform_device *pdev)
Olav Kongas4808a1c2005-04-09 22:57:39 +03001533{
Russell King3ae5eae2005-11-09 22:32:44 +00001534 struct usb_hcd *hcd = platform_get_drvdata(pdev);
Olav Kongas589a0082005-04-21 17:12:59 +03001535 struct isp116x *isp116x;
Olav Kongas4808a1c2005-04-09 22:57:39 +03001536 struct resource *res;
1537
Olav Kongas9a571162005-08-05 14:23:35 +03001538 if (!hcd)
Olav Kongas589a0082005-04-21 17:12:59 +03001539 return 0;
1540 isp116x = hcd_to_isp116x(hcd);
Olav Kongas4808a1c2005-04-09 22:57:39 +03001541 remove_debug_file(isp116x);
1542 usb_remove_hcd(hcd);
1543
1544 iounmap(isp116x->data_reg);
1545 res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
1546 release_mem_region(res->start, 2);
1547 iounmap(isp116x->addr_reg);
1548 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1549 release_mem_region(res->start, 2);
1550
1551 usb_put_hcd(hcd);
1552 return 0;
1553}
1554
1555#define resource_len(r) (((r)->end - (r)->start) + 1)
1556
Prarit Bhargava5bcd70e2007-02-09 01:51:15 -08001557static int __devinit isp116x_probe(struct platform_device *pdev)
Olav Kongas4808a1c2005-04-09 22:57:39 +03001558{
1559 struct usb_hcd *hcd;
1560 struct isp116x *isp116x;
Olav Kongas4808a1c2005-04-09 22:57:39 +03001561 struct resource *addr, *data;
1562 void __iomem *addr_reg;
1563 void __iomem *data_reg;
1564 int irq;
1565 int ret = 0;
1566
Olav Kongas4808a1c2005-04-09 22:57:39 +03001567 if (pdev->num_resources < 3) {
1568 ret = -ENODEV;
1569 goto err1;
1570 }
1571
1572 data = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1573 addr = platform_get_resource(pdev, IORESOURCE_MEM, 1);
1574 irq = platform_get_irq(pdev, 0);
1575 if (!addr || !data || irq < 0) {
1576 ret = -ENODEV;
1577 goto err1;
1578 }
1579
Russell King3ae5eae2005-11-09 22:32:44 +00001580 if (pdev->dev.dma_mask) {
Olav Kongas4808a1c2005-04-09 22:57:39 +03001581 DBG("DMA not supported\n");
1582 ret = -EINVAL;
1583 goto err1;
1584 }
1585
1586 if (!request_mem_region(addr->start, 2, hcd_name)) {
1587 ret = -EBUSY;
1588 goto err1;
1589 }
1590 addr_reg = ioremap(addr->start, resource_len(addr));
1591 if (addr_reg == NULL) {
1592 ret = -ENOMEM;
1593 goto err2;
1594 }
1595 if (!request_mem_region(data->start, 2, hcd_name)) {
1596 ret = -EBUSY;
1597 goto err3;
1598 }
1599 data_reg = ioremap(data->start, resource_len(data));
1600 if (data_reg == NULL) {
1601 ret = -ENOMEM;
1602 goto err4;
1603 }
1604
1605 /* allocate and initialize hcd */
Russell King3ae5eae2005-11-09 22:32:44 +00001606 hcd = usb_create_hcd(&isp116x_hc_driver, &pdev->dev, pdev->dev.bus_id);
Olav Kongas4808a1c2005-04-09 22:57:39 +03001607 if (!hcd) {
1608 ret = -ENOMEM;
1609 goto err5;
1610 }
1611 /* this rsrc_start is bogus */
1612 hcd->rsrc_start = addr->start;
1613 isp116x = hcd_to_isp116x(hcd);
1614 isp116x->data_reg = data_reg;
1615 isp116x->addr_reg = addr_reg;
1616 spin_lock_init(&isp116x->lock);
1617 INIT_LIST_HEAD(&isp116x->async);
Russell King3ae5eae2005-11-09 22:32:44 +00001618 isp116x->board = pdev->dev.platform_data;
Olav Kongas4808a1c2005-04-09 22:57:39 +03001619
1620 if (!isp116x->board) {
1621 ERR("Platform data structure not initialized\n");
1622 ret = -ENODEV;
1623 goto err6;
1624 }
1625 if (isp116x_check_platform_delay(isp116x)) {
1626 ERR("USE_PLATFORM_DELAY defined, but delay function not "
1627 "implemented.\n");
1628 ERR("See comments in drivers/usb/host/isp116x-hcd.c\n");
1629 ret = -ENODEV;
1630 goto err6;
1631 }
1632
Thomas Gleixnerd54b5ca2006-07-01 19:29:44 -07001633 ret = usb_add_hcd(hcd, irq, IRQF_DISABLED);
Olav Kongas959eea22005-11-03 17:38:14 +02001634 if (ret)
Olav Kongas4808a1c2005-04-09 22:57:39 +03001635 goto err6;
1636
Olav Kongas959eea22005-11-03 17:38:14 +02001637 ret = create_debug_file(isp116x);
1638 if (ret) {
1639 ERR("Couldn't create debugfs entry\n");
1640 goto err7;
1641 }
1642
Olav Kongas4808a1c2005-04-09 22:57:39 +03001643 return 0;
1644
Olav Kongas959eea22005-11-03 17:38:14 +02001645 err7:
1646 usb_remove_hcd(hcd);
Olav Kongas4808a1c2005-04-09 22:57:39 +03001647 err6:
1648 usb_put_hcd(hcd);
1649 err5:
1650 iounmap(data_reg);
1651 err4:
1652 release_mem_region(data->start, 2);
1653 err3:
1654 iounmap(addr_reg);
1655 err2:
1656 release_mem_region(addr->start, 2);
1657 err1:
1658 ERR("init error, %d\n", ret);
1659 return ret;
1660}
1661
1662#ifdef CONFIG_PM
1663/*
1664 Suspend of platform device
1665*/
Russell King3ae5eae2005-11-09 22:32:44 +00001666static int isp116x_suspend(struct platform_device *dev, pm_message_t state)
Olav Kongas4808a1c2005-04-09 22:57:39 +03001667{
Olav Kongas959eea22005-11-03 17:38:14 +02001668 VDBG("%s: state %x\n", __func__, state.event);
Russell King3ae5eae2005-11-09 22:32:44 +00001669 dev->dev.power.power_state = state;
Olav Kongas959eea22005-11-03 17:38:14 +02001670 return 0;
Olav Kongas4808a1c2005-04-09 22:57:39 +03001671}
1672
1673/*
1674 Resume platform device
1675*/
Russell King3ae5eae2005-11-09 22:32:44 +00001676static int isp116x_resume(struct platform_device *dev)
Olav Kongas4808a1c2005-04-09 22:57:39 +03001677{
Olav Kongas959eea22005-11-03 17:38:14 +02001678 VDBG("%s: state %x\n", __func__, dev->power.power_state.event);
Russell King3ae5eae2005-11-09 22:32:44 +00001679 dev->dev.power.power_state = PMSG_ON;
Olav Kongas959eea22005-11-03 17:38:14 +02001680 return 0;
Olav Kongas4808a1c2005-04-09 22:57:39 +03001681}
1682
1683#else
1684
1685#define isp116x_suspend NULL
1686#define isp116x_resume NULL
1687
1688#endif
1689
Russell King3ae5eae2005-11-09 22:32:44 +00001690static struct platform_driver isp116x_driver = {
Olav Kongas4808a1c2005-04-09 22:57:39 +03001691 .probe = isp116x_probe,
1692 .remove = isp116x_remove,
1693 .suspend = isp116x_suspend,
1694 .resume = isp116x_resume,
Olav Kongas0be930c2005-12-27 16:04:02 +02001695 .driver = {
1696 .name = (char *)hcd_name,
1697 },
Olav Kongas4808a1c2005-04-09 22:57:39 +03001698};
1699
1700/*-----------------------------------------------------------------*/
1701
1702static int __init isp116x_init(void)
1703{
1704 if (usb_disabled())
1705 return -ENODEV;
1706
1707 INFO("driver %s, %s\n", hcd_name, DRIVER_VERSION);
Russell King3ae5eae2005-11-09 22:32:44 +00001708 return platform_driver_register(&isp116x_driver);
Olav Kongas4808a1c2005-04-09 22:57:39 +03001709}
1710
1711module_init(isp116x_init);
1712
1713static void __exit isp116x_cleanup(void)
1714{
Russell King3ae5eae2005-11-09 22:32:44 +00001715 platform_driver_unregister(&isp116x_driver);
Olav Kongas4808a1c2005-04-09 22:57:39 +03001716}
1717
1718module_exit(isp116x_cleanup);