1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40#ifdef CONFIG_USB_DEBUG
41# define ISP1362_DEBUG
42#else
43# undef ISP1362_DEBUG
44#endif
45
46
47
48
49
50
51
52
53
54#undef BUGGY_PXA2XX_UDC_USBTEST
55
56#undef PTD_TRACE
57#undef URB_TRACE
58#undef VERBOSE
59#undef REGISTERS
60
61
62
63
64#undef CHIP_BUFFER_TEST
65
66#include <linux/module.h>
67#include <linux/moduleparam.h>
68#include <linux/kernel.h>
69#include <linux/delay.h>
70#include <linux/ioport.h>
71#include <linux/sched.h>
72#include <linux/slab.h>
73#include <linux/errno.h>
74#include <linux/init.h>
75#include <linux/list.h>
76#include <linux/interrupt.h>
77#include <linux/usb.h>
78#include <linux/usb/isp1362.h>
79#include <linux/usb/hcd.h>
80#include <linux/platform_device.h>
81#include <linux/pm.h>
82#include <linux/io.h>
83#include <linux/bitmap.h>
84#include <linux/prefetch.h>
85
86#include <asm/irq.h>
87#include <asm/system.h>
88#include <asm/byteorder.h>
89#include <asm/unaligned.h>
90
91static int dbg_level;
92#ifdef ISP1362_DEBUG
93module_param(dbg_level, int, 0644);
94#else
95module_param(dbg_level, int, 0);
96#define STUB_DEBUG_FILE
97#endif
98
99#include "../core/usb.h"
100#include "isp1362.h"
101
102
103#define DRIVER_VERSION "2005-04-04"
104#define DRIVER_DESC "ISP1362 USB Host Controller Driver"
105
106MODULE_DESCRIPTION(DRIVER_DESC);
107MODULE_LICENSE("GPL");
108
109static const char hcd_name[] = "isp1362-hcd";
110
111static void isp1362_hc_stop(struct usb_hcd *hcd);
112static int isp1362_hc_start(struct usb_hcd *hcd);
113
114
115
116
117
118
119
120
121
122
123static inline void isp1362_enable_int(struct isp1362_hcd *isp1362_hcd, u16 mask)
124{
125 if ((isp1362_hcd->irqenb | mask) == isp1362_hcd->irqenb)
126 return;
127 if (mask & ~isp1362_hcd->irqenb)
128 isp1362_write_reg16(isp1362_hcd, HCuPINT, mask & ~isp1362_hcd->irqenb);
129 isp1362_hcd->irqenb |= mask;
130 if (isp1362_hcd->irq_active)
131 return;
132 isp1362_write_reg16(isp1362_hcd, HCuPINTENB, isp1362_hcd->irqenb);
133}
134
135
136
137static inline struct isp1362_ep_queue *get_ptd_queue(struct isp1362_hcd *isp1362_hcd,
138 u16 offset)
139{
140 struct isp1362_ep_queue *epq = NULL;
141
142 if (offset < isp1362_hcd->istl_queue[1].buf_start)
143 epq = &isp1362_hcd->istl_queue[0];
144 else if (offset < isp1362_hcd->intl_queue.buf_start)
145 epq = &isp1362_hcd->istl_queue[1];
146 else if (offset < isp1362_hcd->atl_queue.buf_start)
147 epq = &isp1362_hcd->intl_queue;
148 else if (offset < isp1362_hcd->atl_queue.buf_start +
149 isp1362_hcd->atl_queue.buf_size)
150 epq = &isp1362_hcd->atl_queue;
151
152 if (epq)
153 DBG(1, "%s: PTD $%04x is on %s queue\n", __func__, offset, epq->name);
154 else
155 pr_warning("%s: invalid PTD $%04x\n", __func__, offset);
156
157 return epq;
158}
159
160static inline int get_ptd_offset(struct isp1362_ep_queue *epq, u8 index)
161{
162 int offset;
163
164 if (index * epq->blk_size > epq->buf_size) {
165 pr_warning("%s: Bad %s index %d(%d)\n", __func__, epq->name, index,
166 epq->buf_size / epq->blk_size);
167 return -EINVAL;
168 }
169 offset = epq->buf_start + index * epq->blk_size;
170 DBG(3, "%s: %s PTD[%02x] # %04x\n", __func__, epq->name, index, offset);
171
172 return offset;
173}
174
175
176
177static inline u16 max_transfer_size(struct isp1362_ep_queue *epq, size_t size,
178 int mps)
179{
180 u16 xfer_size = min_t(size_t, MAX_XFER_SIZE, size);
181
182 xfer_size = min_t(size_t, xfer_size, epq->buf_avail * epq->blk_size - PTD_HEADER_SIZE);
183 if (xfer_size < size && xfer_size % mps)
184 xfer_size -= xfer_size % mps;
185
186 return xfer_size;
187}
188
189static int claim_ptd_buffers(struct isp1362_ep_queue *epq,
190 struct isp1362_ep *ep, u16 len)
191{
192 int ptd_offset = -EINVAL;
193 int num_ptds = ((len + PTD_HEADER_SIZE - 1) / epq->blk_size) + 1;
194 int found;
195
196 BUG_ON(len > epq->buf_size);
197
198 if (!epq->buf_avail)
199 return -ENOMEM;
200
201 if (ep->num_ptds)
202 pr_err("%s: %s len %d/%d num_ptds %d buf_map %08lx skip_map %08lx\n", __func__,
203 epq->name, len, epq->blk_size, num_ptds, epq->buf_map, epq->skip_map);
204 BUG_ON(ep->num_ptds != 0);
205
206 found = bitmap_find_next_zero_area(&epq->buf_map, epq->buf_count, 0,
207 num_ptds, 0);
208 if (found >= epq->buf_count)
209 return -EOVERFLOW;
210
211 DBG(1, "%s: Found %d PTDs[%d] for %d/%d byte\n", __func__,
212 num_ptds, found, len, (int)(epq->blk_size - PTD_HEADER_SIZE));
213 ptd_offset = get_ptd_offset(epq, found);
214 WARN_ON(ptd_offset < 0);
215 ep->ptd_offset = ptd_offset;
216 ep->num_ptds += num_ptds;
217 epq->buf_avail -= num_ptds;
218 BUG_ON(epq->buf_avail > epq->buf_count);
219 ep->ptd_index = found;
220 bitmap_set(&epq->buf_map, found, num_ptds);
221 DBG(1, "%s: Done %s PTD[%d] $%04x, avail %d count %d claimed %d %08lx:%08lx\n",
222 __func__, epq->name, ep->ptd_index, ep->ptd_offset,
223 epq->buf_avail, epq->buf_count, num_ptds, epq->buf_map, epq->skip_map);
224
225 return found;
226}
227
228static inline void release_ptd_buffers(struct isp1362_ep_queue *epq, struct isp1362_ep *ep)
229{
230 int last = ep->ptd_index + ep->num_ptds;
231
232 if (last > epq->buf_count)
233 pr_err("%s: ep %p req %d len %d %s PTD[%d] $%04x num_ptds %d buf_count %d buf_avail %d buf_map %08lx skip_map %08lx\n",
234 __func__, ep, ep->num_req, ep->length, epq->name, ep->ptd_index,
235 ep->ptd_offset, ep->num_ptds, epq->buf_count, epq->buf_avail,
236 epq->buf_map, epq->skip_map);
237 BUG_ON(last > epq->buf_count);
238
239 bitmap_clear(&epq->buf_map, ep->ptd_index, ep->num_ptds);
240 bitmap_set(&epq->skip_map, ep->ptd_index, ep->num_ptds);
241 epq->buf_avail += ep->num_ptds;
242 epq->ptd_count--;
243
244 BUG_ON(epq->buf_avail > epq->buf_count);
245 BUG_ON(epq->ptd_count > epq->buf_count);
246
247 DBG(1, "%s: Done %s PTDs $%04x released %d avail %d count %d\n",
248 __func__, epq->name,
249 ep->ptd_offset, ep->num_ptds, epq->buf_avail, epq->buf_count);
250 DBG(1, "%s: buf_map %08lx skip_map %08lx\n", __func__,
251 epq->buf_map, epq->skip_map);
252
253 ep->num_ptds = 0;
254 ep->ptd_offset = -EINVAL;
255 ep->ptd_index = -EINVAL;
256}
257
258
259
260
261
262
263static void prepare_ptd(struct isp1362_hcd *isp1362_hcd, struct urb *urb,
264 struct isp1362_ep *ep, struct isp1362_ep_queue *epq,
265 u16 fno)
266{
267 struct ptd *ptd;
268 int toggle;
269 int dir;
270 u16 len;
271 size_t buf_len = urb->transfer_buffer_length - urb->actual_length;
272
273 DBG(3, "%s: %s ep %p\n", __func__, epq->name, ep);
274
275 ptd = &ep->ptd;
276
277 ep->data = (unsigned char *)urb->transfer_buffer + urb->actual_length;
278
279 switch (ep->nextpid) {
280 case USB_PID_IN:
281 toggle = usb_gettoggle(urb->dev, ep->epnum, 0);
282 dir = PTD_DIR_IN;
283 if (usb_pipecontrol(urb->pipe)) {
284 len = min_t(size_t, ep->maxpacket, buf_len);
285 } else if (usb_pipeisoc(urb->pipe)) {
286 len = min_t(size_t, urb->iso_frame_desc[fno].length, MAX_XFER_SIZE);
287 ep->data = urb->transfer_buffer + urb->iso_frame_desc[fno].offset;
288 } else
289 len = max_transfer_size(epq, buf_len, ep->maxpacket);
290 DBG(1, "%s: IN len %d/%d/%d from URB\n", __func__, len, ep->maxpacket,
291 (int)buf_len);
292 break;
293 case USB_PID_OUT:
294 toggle = usb_gettoggle(urb->dev, ep->epnum, 1);
295 dir = PTD_DIR_OUT;
296 if (usb_pipecontrol(urb->pipe))
297 len = min_t(size_t, ep->maxpacket, buf_len);
298 else if (usb_pipeisoc(urb->pipe))
299 len = min_t(size_t, urb->iso_frame_desc[0].length, MAX_XFER_SIZE);
300 else
301 len = max_transfer_size(epq, buf_len, ep->maxpacket);
302 if (len == 0)
303 pr_info("%s: Sending ZERO packet: %d\n", __func__,
304 urb->transfer_flags & URB_ZERO_PACKET);
305 DBG(1, "%s: OUT len %d/%d/%d from URB\n", __func__, len, ep->maxpacket,
306 (int)buf_len);
307 break;
308 case USB_PID_SETUP:
309 toggle = 0;
310 dir = PTD_DIR_SETUP;
311 len = sizeof(struct usb_ctrlrequest);
312 DBG(1, "%s: SETUP len %d\n", __func__, len);
313 ep->data = urb->setup_packet;
314 break;
315 case USB_PID_ACK:
316 toggle = 1;
317 len = 0;
318 dir = (urb->transfer_buffer_length && usb_pipein(urb->pipe)) ?
319 PTD_DIR_OUT : PTD_DIR_IN;
320 DBG(1, "%s: ACK len %d\n", __func__, len);
321 break;
322 default:
323 toggle = dir = len = 0;
324 pr_err("%s@%d: ep->nextpid %02x\n", __func__, __LINE__, ep->nextpid);
325 BUG_ON(1);
326 }
327
328 ep->length = len;
329 if (!len)
330 ep->data = NULL;
331
332 ptd->count = PTD_CC_MSK | PTD_ACTIVE_MSK | PTD_TOGGLE(toggle);
333 ptd->mps = PTD_MPS(ep->maxpacket) | PTD_SPD(urb->dev->speed == USB_SPEED_LOW) |
334 PTD_EP(ep->epnum);
335 ptd->len = PTD_LEN(len) | PTD_DIR(dir);
336 ptd->faddr = PTD_FA(usb_pipedevice(urb->pipe));
337
338 if (usb_pipeint(urb->pipe)) {
339 ptd->faddr |= PTD_SF_INT(ep->branch);
340 ptd->faddr |= PTD_PR(ep->interval ? __ffs(ep->interval) : 0);
341 }
342 if (usb_pipeisoc(urb->pipe))
343 ptd->faddr |= PTD_SF_ISO(fno);
344
345 DBG(1, "%s: Finished\n", __func__);
346}
347
348static void isp1362_write_ptd(struct isp1362_hcd *isp1362_hcd, struct isp1362_ep *ep,
349 struct isp1362_ep_queue *epq)
350{
351 struct ptd *ptd = &ep->ptd;
352 int len = PTD_GET_DIR(ptd) == PTD_DIR_IN ? 0 : ep->length;
353
354 _BUG_ON(ep->ptd_offset < 0);
355
356 prefetch(ptd);
357 isp1362_write_buffer(isp1362_hcd, ptd, ep->ptd_offset, PTD_HEADER_SIZE);
358 if (len)
359 isp1362_write_buffer(isp1362_hcd, ep->data,
360 ep->ptd_offset + PTD_HEADER_SIZE, len);
361
362 dump_ptd(ptd);
363 dump_ptd_out_data(ptd, ep->data);
364}
365
366static void isp1362_read_ptd(struct isp1362_hcd *isp1362_hcd, struct isp1362_ep *ep,
367 struct isp1362_ep_queue *epq)
368{
369 struct ptd *ptd = &ep->ptd;
370 int act_len;
371
372 WARN_ON(list_empty(&ep->active));
373 BUG_ON(ep->ptd_offset < 0);
374
375 list_del_init(&ep->active);
376 DBG(1, "%s: ep %p removed from active list %p\n", __func__, ep, &epq->active);
377
378 prefetchw(ptd);
379 isp1362_read_buffer(isp1362_hcd, ptd, ep->ptd_offset, PTD_HEADER_SIZE);
380 dump_ptd(ptd);
381 act_len = PTD_GET_COUNT(ptd);
382 if (PTD_GET_DIR(ptd) != PTD_DIR_IN || act_len == 0)
383 return;
384 if (act_len > ep->length)
385 pr_err("%s: ep %p PTD $%04x act_len %d ep->length %d\n", __func__, ep,
386 ep->ptd_offset, act_len, ep->length);
387 BUG_ON(act_len > ep->length);
388
389
390
391
392 prefetchw(ep->data);
393 isp1362_read_buffer(isp1362_hcd, ep->data,
394 ep->ptd_offset + PTD_HEADER_SIZE, act_len);
395 dump_ptd_in_data(ptd, ep->data);
396}
397
398
399
400
401
402
403static void remove_ptd(struct isp1362_hcd *isp1362_hcd, struct isp1362_ep *ep)
404
405{
406 int index;
407 struct isp1362_ep_queue *epq;
408
409 DBG(1, "%s: ep %p PTD[%d] $%04x\n", __func__, ep, ep->ptd_index, ep->ptd_offset);
410 BUG_ON(ep->ptd_offset < 0);
411
412 epq = get_ptd_queue(isp1362_hcd, ep->ptd_offset);
413 BUG_ON(!epq);
414
415
416 WARN_ON(!list_empty(&ep->remove_list));
417 list_add_tail(&ep->remove_list, &isp1362_hcd->remove_list);
418
419 isp1362_enable_int(isp1362_hcd, HCuPINT_SOF);
420
421 index = ep->ptd_index;
422 if (index < 0)
423
424 return;
425
426 DBG(1, "%s: Disabling PTD[%02x] $%04x %08lx|%08x\n", __func__,
427 index, ep->ptd_offset, epq->skip_map, 1 << index);
428
429
430 epq->skip_map |= 1 << index;
431 if (epq == &isp1362_hcd->atl_queue) {
432 DBG(2, "%s: ATLSKIP = %08x -> %08lx\n", __func__,
433 isp1362_read_reg32(isp1362_hcd, HCATLSKIP), epq->skip_map);
434 isp1362_write_reg32(isp1362_hcd, HCATLSKIP, epq->skip_map);
435 if (~epq->skip_map == 0)
436 isp1362_clr_mask16(isp1362_hcd, HCBUFSTAT, HCBUFSTAT_ATL_ACTIVE);
437 } else if (epq == &isp1362_hcd->intl_queue) {
438 DBG(2, "%s: INTLSKIP = %08x -> %08lx\n", __func__,
439 isp1362_read_reg32(isp1362_hcd, HCINTLSKIP), epq->skip_map);
440 isp1362_write_reg32(isp1362_hcd, HCINTLSKIP, epq->skip_map);
441 if (~epq->skip_map == 0)
442 isp1362_clr_mask16(isp1362_hcd, HCBUFSTAT, HCBUFSTAT_INTL_ACTIVE);
443 }
444}
445
446
447
448
449
450static void finish_request(struct isp1362_hcd *isp1362_hcd, struct isp1362_ep *ep,
451 struct urb *urb, int status)
452 __releases(isp1362_hcd->lock)
453 __acquires(isp1362_hcd->lock)
454{
455 urb->hcpriv = NULL;
456 ep->error_count = 0;
457
458 if (usb_pipecontrol(urb->pipe))
459 ep->nextpid = USB_PID_SETUP;
460
461 URB_DBG("%s: req %d FA %d ep%d%s %s: len %d/%d %s stat %d\n", __func__,
462 ep->num_req, usb_pipedevice(urb->pipe),
463 usb_pipeendpoint(urb->pipe),
464 !usb_pipein(urb->pipe) ? "out" : "in",
465 usb_pipecontrol(urb->pipe) ? "ctrl" :
466 usb_pipeint(urb->pipe) ? "int" :
467 usb_pipebulk(urb->pipe) ? "bulk" :
468 "iso",
469 urb->actual_length, urb->transfer_buffer_length,
470 !(urb->transfer_flags & URB_SHORT_NOT_OK) ?
471 "short_ok" : "", urb->status);
472
473
474 usb_hcd_unlink_urb_from_ep(isp1362_hcd_to_hcd(isp1362_hcd), urb);
475 spin_unlock(&isp1362_hcd->lock);
476 usb_hcd_giveback_urb(isp1362_hcd_to_hcd(isp1362_hcd), urb, status);
477 spin_lock(&isp1362_hcd->lock);
478
479
480 if (!list_empty(&ep->hep->urb_list))
481 return;
482
483
484 if (!list_empty(&ep->schedule)) {
485 list_del_init(&ep->schedule);
486 return;
487 }
488
489
490 if (ep->interval) {
491
492 DBG(1, "deschedule qh%d/%p branch %d load %d bandwidth %d -> %d\n", ep->interval,
493 ep, ep->branch, ep->load,
494 isp1362_hcd->load[ep->branch],
495 isp1362_hcd->load[ep->branch] - ep->load);
496 isp1362_hcd->load[ep->branch] -= ep->load;
497 ep->branch = PERIODIC_SIZE;
498 }
499}
500
501
502
503
504static void postproc_ep(struct isp1362_hcd *isp1362_hcd, struct isp1362_ep *ep)
505{
506 struct urb *urb = get_urb(ep);
507 struct usb_device *udev;
508 struct ptd *ptd;
509 int short_ok;
510 u16 len;
511 int urbstat = -EINPROGRESS;
512 u8 cc;
513
514 DBG(2, "%s: ep %p req %d\n", __func__, ep, ep->num_req);
515
516 udev = urb->dev;
517 ptd = &ep->ptd;
518 cc = PTD_GET_CC(ptd);
519 if (cc == PTD_NOTACCESSED) {
520 pr_err("%s: req %d PTD %p Untouched by ISP1362\n", __func__,
521 ep->num_req, ptd);
522 cc = PTD_DEVNOTRESP;
523 }
524
525 short_ok = !(urb->transfer_flags & URB_SHORT_NOT_OK);
526 len = urb->transfer_buffer_length - urb->actual_length;
527
528
529
530
531
532
533
534 if (cc == PTD_DATAUNDERRUN) {
535 if (short_ok) {
536 DBG(1, "%s: req %d Allowed data underrun short_%sok %d/%d/%d byte\n",
537 __func__, ep->num_req, short_ok ? "" : "not_",
538 PTD_GET_COUNT(ptd), ep->maxpacket, len);
539 cc = PTD_CC_NOERROR;
540 urbstat = 0;
541 } else {
542 DBG(1, "%s: req %d Data Underrun %s nextpid %02x short_%sok %d/%d/%d byte\n",
543 __func__, ep->num_req,
544 usb_pipein(urb->pipe) ? "IN" : "OUT", ep->nextpid,
545 short_ok ? "" : "not_",
546 PTD_GET_COUNT(ptd), ep->maxpacket, len);
547 if (usb_pipecontrol(urb->pipe)) {
548 ep->nextpid = USB_PID_ACK;
549
550
551
552 urb->actual_length += PTD_GET_COUNT(ptd);
553 BUG_ON(urb->actual_length > urb->transfer_buffer_length);
554
555 if (urb->status == -EINPROGRESS)
556 urb->status = cc_to_error[PTD_DATAUNDERRUN];
557 } else {
558 usb_settoggle(udev, ep->epnum, ep->nextpid == USB_PID_OUT,
559 PTD_GET_TOGGLE(ptd));
560 urbstat = cc_to_error[PTD_DATAUNDERRUN];
561 }
562 goto out;
563 }
564 }
565
566 if (cc != PTD_CC_NOERROR) {
567 if (++ep->error_count >= 3 || cc == PTD_CC_STALL || cc == PTD_DATAOVERRUN) {
568 urbstat = cc_to_error[cc];
569 DBG(1, "%s: req %d nextpid %02x, status %d, error %d, error_count %d\n",
570 __func__, ep->num_req, ep->nextpid, urbstat, cc,
571 ep->error_count);
572 }
573 goto out;
574 }
575
576 switch (ep->nextpid) {
577 case USB_PID_OUT:
578 if (PTD_GET_COUNT(ptd) != ep->length)
579 pr_err("%s: count=%d len=%d\n", __func__,
580 PTD_GET_COUNT(ptd), ep->length);
581 BUG_ON(PTD_GET_COUNT(ptd) != ep->length);
582 urb->actual_length += ep->length;
583 BUG_ON(urb->actual_length > urb->transfer_buffer_length);
584 usb_settoggle(udev, ep->epnum, 1, PTD_GET_TOGGLE(ptd));
585 if (urb->actual_length == urb->transfer_buffer_length) {
586 DBG(3, "%s: req %d xfer complete %d/%d status %d -> 0\n", __func__,
587 ep->num_req, len, ep->maxpacket, urbstat);
588 if (usb_pipecontrol(urb->pipe)) {
589 DBG(3, "%s: req %d %s Wait for ACK\n", __func__,
590 ep->num_req,
591 usb_pipein(urb->pipe) ? "IN" : "OUT");
592 ep->nextpid = USB_PID_ACK;
593 } else {
594 if (len % ep->maxpacket ||
595 !(urb->transfer_flags & URB_ZERO_PACKET)) {
596 urbstat = 0;
597 DBG(3, "%s: req %d URB %s status %d count %d/%d/%d\n",
598 __func__, ep->num_req, usb_pipein(urb->pipe) ? "IN" : "OUT",
599 urbstat, len, ep->maxpacket, urb->actual_length);
600 }
601 }
602 }
603 break;
604 case USB_PID_IN:
605 len = PTD_GET_COUNT(ptd);
606 BUG_ON(len > ep->length);
607 urb->actual_length += len;
608 BUG_ON(urb->actual_length > urb->transfer_buffer_length);
609 usb_settoggle(udev, ep->epnum, 0, PTD_GET_TOGGLE(ptd));
610
611 if ((urb->transfer_buffer_length == urb->actual_length) ||
612 len % ep->maxpacket) {
613 DBG(3, "%s: req %d xfer complete %d/%d status %d -> 0\n", __func__,
614 ep->num_req, len, ep->maxpacket, urbstat);
615 if (usb_pipecontrol(urb->pipe)) {
616 DBG(3, "%s: req %d %s Wait for ACK\n", __func__,
617 ep->num_req,
618 usb_pipein(urb->pipe) ? "IN" : "OUT");
619 ep->nextpid = USB_PID_ACK;
620 } else {
621 urbstat = 0;
622 DBG(3, "%s: req %d URB %s status %d count %d/%d/%d\n",
623 __func__, ep->num_req, usb_pipein(urb->pipe) ? "IN" : "OUT",
624 urbstat, len, ep->maxpacket, urb->actual_length);
625 }
626 }
627 break;
628 case USB_PID_SETUP:
629 if (urb->transfer_buffer_length == urb->actual_length) {
630 ep->nextpid = USB_PID_ACK;
631 } else if (usb_pipeout(urb->pipe)) {
632 usb_settoggle(udev, 0, 1, 1);
633 ep->nextpid = USB_PID_OUT;
634 } else {
635 usb_settoggle(udev, 0, 0, 1);
636 ep->nextpid = USB_PID_IN;
637 }
638 break;
639 case USB_PID_ACK:
640 DBG(3, "%s: req %d got ACK %d -> 0\n", __func__, ep->num_req,
641 urbstat);
642 WARN_ON(urbstat != -EINPROGRESS);
643 urbstat = 0;
644 ep->nextpid = 0;
645 break;
646 default:
647 BUG_ON(1);
648 }
649
650 out:
651 if (urbstat != -EINPROGRESS) {
652 DBG(2, "%s: Finishing ep %p req %d urb %p status %d\n", __func__,
653 ep, ep->num_req, urb, urbstat);
654 finish_request(isp1362_hcd, ep, urb, urbstat);
655 }
656}
657
658static void finish_unlinks(struct isp1362_hcd *isp1362_hcd)
659{
660 struct isp1362_ep *ep;
661 struct isp1362_ep *tmp;
662
663 list_for_each_entry_safe(ep, tmp, &isp1362_hcd->remove_list, remove_list) {
664 struct isp1362_ep_queue *epq =
665 get_ptd_queue(isp1362_hcd, ep->ptd_offset);
666 int index = ep->ptd_index;
667
668 BUG_ON(epq == NULL);
669 if (index >= 0) {
670 DBG(1, "%s: remove PTD[%d] $%04x\n", __func__, index, ep->ptd_offset);
671 BUG_ON(ep->num_ptds == 0);
672 release_ptd_buffers(epq, ep);
673 }
674 if (!list_empty(&ep->hep->urb_list)) {
675 struct urb *urb = get_urb(ep);
676
677 DBG(1, "%s: Finishing req %d ep %p from remove_list\n", __func__,
678 ep->num_req, ep);
679 finish_request(isp1362_hcd, ep, urb, -ESHUTDOWN);
680 }
681 WARN_ON(list_empty(&ep->active));
682 if (!list_empty(&ep->active)) {
683 list_del_init(&ep->active);
684 DBG(1, "%s: ep %p removed from active list\n", __func__, ep);
685 }
686 list_del_init(&ep->remove_list);
687 DBG(1, "%s: ep %p removed from remove_list\n", __func__, ep);
688 }
689 DBG(1, "%s: Done\n", __func__);
690}
691
692static inline void enable_atl_transfers(struct isp1362_hcd *isp1362_hcd, int count)
693{
694 if (count > 0) {
695 if (count < isp1362_hcd->atl_queue.ptd_count)
696 isp1362_write_reg16(isp1362_hcd, HCATLDTC, count);
697 isp1362_enable_int(isp1362_hcd, HCuPINT_ATL);
698 isp1362_write_reg32(isp1362_hcd, HCATLSKIP, isp1362_hcd->atl_queue.skip_map);
699 isp1362_set_mask16(isp1362_hcd, HCBUFSTAT, HCBUFSTAT_ATL_ACTIVE);
700 } else
701 isp1362_enable_int(isp1362_hcd, HCuPINT_SOF);
702}
703
704static inline void enable_intl_transfers(struct isp1362_hcd *isp1362_hcd)
705{
706 isp1362_enable_int(isp1362_hcd, HCuPINT_INTL);
707 isp1362_set_mask16(isp1362_hcd, HCBUFSTAT, HCBUFSTAT_INTL_ACTIVE);
708 isp1362_write_reg32(isp1362_hcd, HCINTLSKIP, isp1362_hcd->intl_queue.skip_map);
709}
710
711static inline void enable_istl_transfers(struct isp1362_hcd *isp1362_hcd, int flip)
712{
713 isp1362_enable_int(isp1362_hcd, flip ? HCuPINT_ISTL1 : HCuPINT_ISTL0);
714 isp1362_set_mask16(isp1362_hcd, HCBUFSTAT, flip ?
715 HCBUFSTAT_ISTL1_FULL : HCBUFSTAT_ISTL0_FULL);
716}
717
718static int submit_req(struct isp1362_hcd *isp1362_hcd, struct urb *urb,
719 struct isp1362_ep *ep, struct isp1362_ep_queue *epq)
720{
721 int index = epq->free_ptd;
722
723 prepare_ptd(isp1362_hcd, urb, ep, epq, 0);
724 index = claim_ptd_buffers(epq, ep, ep->length);
725 if (index == -ENOMEM) {
726 DBG(1, "%s: req %d No free %s PTD available: %d, %08lx:%08lx\n", __func__,
727 ep->num_req, epq->name, ep->num_ptds, epq->buf_map, epq->skip_map);
728 return index;
729 } else if (index == -EOVERFLOW) {
730 DBG(1, "%s: req %d Not enough space for %d byte %s PTD %d %08lx:%08lx\n",
731 __func__, ep->num_req, ep->length, epq->name, ep->num_ptds,
732 epq->buf_map, epq->skip_map);
733 return index;
734 } else
735 BUG_ON(index < 0);
736 list_add_tail(&ep->active, &epq->active);
737 DBG(1, "%s: ep %p req %d len %d added to active list %p\n", __func__,
738 ep, ep->num_req, ep->length, &epq->active);
739 DBG(1, "%s: Submitting %s PTD $%04x for ep %p req %d\n", __func__, epq->name,
740 ep->ptd_offset, ep, ep->num_req);
741 isp1362_write_ptd(isp1362_hcd, ep, epq);
742 __clear_bit(ep->ptd_index, &epq->skip_map);
743
744 return 0;
745}
746
747static void start_atl_transfers(struct isp1362_hcd *isp1362_hcd)
748{
749 int ptd_count = 0;
750 struct isp1362_ep_queue *epq = &isp1362_hcd->atl_queue;
751 struct isp1362_ep *ep;
752 int defer = 0;
753
754 if (atomic_read(&epq->finishing)) {
755 DBG(1, "%s: finish_transfers is active for %s\n", __func__, epq->name);
756 return;
757 }
758
759 list_for_each_entry(ep, &isp1362_hcd->async, schedule) {
760 struct urb *urb = get_urb(ep);
761 int ret;
762
763 if (!list_empty(&ep->active)) {
764 DBG(2, "%s: Skipping active %s ep %p\n", __func__, epq->name, ep);
765 continue;
766 }
767
768 DBG(1, "%s: Processing %s ep %p req %d\n", __func__, epq->name,
769 ep, ep->num_req);
770
771 ret = submit_req(isp1362_hcd, urb, ep, epq);
772 if (ret == -ENOMEM) {
773 defer = 1;
774 break;
775 } else if (ret == -EOVERFLOW) {
776 defer = 1;
777 continue;
778 }
779#ifdef BUGGY_PXA2XX_UDC_USBTEST
780 defer = ep->nextpid == USB_PID_SETUP;
781#endif
782 ptd_count++;
783 }
784
785
786 if (isp1362_hcd->async.next != isp1362_hcd->async.prev) {
787 DBG(2, "%s: Cycling ASYNC schedule %d\n", __func__, ptd_count);
788 list_move(&isp1362_hcd->async, isp1362_hcd->async.next);
789 }
790 if (ptd_count || defer)
791 enable_atl_transfers(isp1362_hcd, defer ? 0 : ptd_count);
792
793 epq->ptd_count += ptd_count;
794 if (epq->ptd_count > epq->stat_maxptds) {
795 epq->stat_maxptds = epq->ptd_count;
796 DBG(0, "%s: max_ptds: %d\n", __func__, epq->stat_maxptds);
797 }
798}
799
800static void start_intl_transfers(struct isp1362_hcd *isp1362_hcd)
801{
802 int ptd_count = 0;
803 struct isp1362_ep_queue *epq = &isp1362_hcd->intl_queue;
804 struct isp1362_ep *ep;
805
806 if (atomic_read(&epq->finishing)) {
807 DBG(1, "%s: finish_transfers is active for %s\n", __func__, epq->name);
808 return;
809 }
810
811 list_for_each_entry(ep, &isp1362_hcd->periodic, schedule) {
812 struct urb *urb = get_urb(ep);
813 int ret;
814
815 if (!list_empty(&ep->active)) {
816 DBG(1, "%s: Skipping active %s ep %p\n", __func__,
817 epq->name, ep);
818 continue;
819 }
820
821 DBG(1, "%s: Processing %s ep %p req %d\n", __func__,
822 epq->name, ep, ep->num_req);
823 ret = submit_req(isp1362_hcd, urb, ep, epq);
824 if (ret == -ENOMEM)
825 break;
826 else if (ret == -EOVERFLOW)
827 continue;
828 ptd_count++;
829 }
830
831 if (ptd_count) {
832 static int last_count;
833
834 if (ptd_count != last_count) {
835 DBG(0, "%s: ptd_count: %d\n", __func__, ptd_count);
836 last_count = ptd_count;
837 }
838 enable_intl_transfers(isp1362_hcd);
839 }
840
841 epq->ptd_count += ptd_count;
842 if (epq->ptd_count > epq->stat_maxptds)
843 epq->stat_maxptds = epq->ptd_count;
844}
845
846static inline int next_ptd(struct isp1362_ep_queue *epq, struct isp1362_ep *ep)
847{
848 u16 ptd_offset = ep->ptd_offset;
849 int num_ptds = (ep->length + PTD_HEADER_SIZE + (epq->blk_size - 1)) / epq->blk_size;
850
851 DBG(2, "%s: PTD offset $%04x + %04x => %d * %04x -> $%04x\n", __func__, ptd_offset,
852 ep->length, num_ptds, epq->blk_size, ptd_offset + num_ptds * epq->blk_size);
853
854 ptd_offset += num_ptds * epq->blk_size;
855 if (ptd_offset < epq->buf_start + epq->buf_size)
856 return ptd_offset;
857 else
858 return -ENOMEM;
859}
860
861static void start_iso_transfers(struct isp1362_hcd *isp1362_hcd)
862{
863 int ptd_count = 0;
864 int flip = isp1362_hcd->istl_flip;
865 struct isp1362_ep_queue *epq;
866 int ptd_offset;
867 struct isp1362_ep *ep;
868 struct isp1362_ep *tmp;
869 u16 fno = isp1362_read_reg32(isp1362_hcd, HCFMNUM);
870
871 fill2:
872 epq = &isp1362_hcd->istl_queue[flip];
873 if (atomic_read(&epq->finishing)) {
874 DBG(1, "%s: finish_transfers is active for %s\n", __func__, epq->name);
875 return;
876 }
877
878 if (!list_empty(&epq->active))
879 return;
880
881 ptd_offset = epq->buf_start;
882 list_for_each_entry_safe(ep, tmp, &isp1362_hcd->isoc, schedule) {
883 struct urb *urb = get_urb(ep);
884 s16 diff = fno - (u16)urb->start_frame;
885
886 DBG(1, "%s: Processing %s ep %p\n", __func__, epq->name, ep);
887
888 if (diff > urb->number_of_packets) {
889
890 finish_request(isp1362_hcd, ep, urb, -EOVERFLOW);
891 continue;
892 } else if (diff < -1) {
893
894
895
896
897
898 } else if (diff == -1) {
899
900 prepare_ptd(isp1362_hcd, urb, ep, epq, fno);
901 if (ptd_offset + PTD_HEADER_SIZE + ep->length >
902 epq->buf_start + epq->buf_size) {
903 pr_err("%s: Not enough ISO buffer space for %d byte PTD\n",
904 __func__, ep->length);
905 continue;
906 }
907 ep->ptd_offset = ptd_offset;
908 list_add_tail(&ep->active, &epq->active);
909
910 ptd_offset = next_ptd(epq, ep);
911 if (ptd_offset < 0) {
912 pr_warning("%s: req %d No more %s PTD buffers available\n", __func__,
913 ep->num_req, epq->name);
914 break;
915 }
916 }
917 }
918 list_for_each_entry(ep, &epq->active, active) {
919 if (epq->active.next == &ep->active)
920 ep->ptd.mps |= PTD_LAST_MSK;
921 isp1362_write_ptd(isp1362_hcd, ep, epq);
922 ptd_count++;
923 }
924
925 if (ptd_count)
926 enable_istl_transfers(isp1362_hcd, flip);
927
928 epq->ptd_count += ptd_count;
929 if (epq->ptd_count > epq->stat_maxptds)
930 epq->stat_maxptds = epq->ptd_count;
931
932
933 if (!(isp1362_read_reg16(isp1362_hcd, HCBUFSTAT) &
934 (flip ? HCBUFSTAT_ISTL0_FULL : HCBUFSTAT_ISTL1_FULL))) {
935 fno++;
936 ptd_count = 0;
937 flip = 1 - flip;
938 goto fill2;
939 }
940}
941
942static void finish_transfers(struct isp1362_hcd *isp1362_hcd, unsigned long done_map,
943 struct isp1362_ep_queue *epq)
944{
945 struct isp1362_ep *ep;
946 struct isp1362_ep *tmp;
947
948 if (list_empty(&epq->active)) {
949 DBG(1, "%s: Nothing to do for %s queue\n", __func__, epq->name);
950 return;
951 }
952
953 DBG(1, "%s: Finishing %s transfers %08lx\n", __func__, epq->name, done_map);
954
955 atomic_inc(&epq->finishing);
956 list_for_each_entry_safe(ep, tmp, &epq->active, active) {
957 int index = ep->ptd_index;
958
959 DBG(1, "%s: Checking %s PTD[%02x] $%04x\n", __func__, epq->name,
960 index, ep->ptd_offset);
961
962 BUG_ON(index < 0);
963 if (__test_and_clear_bit(index, &done_map)) {
964 isp1362_read_ptd(isp1362_hcd, ep, epq);
965 epq->free_ptd = index;
966 BUG_ON(ep->num_ptds == 0);
967 release_ptd_buffers(epq, ep);
968
969 DBG(1, "%s: ep %p req %d removed from active list\n", __func__,
970 ep, ep->num_req);
971 if (!list_empty(&ep->remove_list)) {
972 list_del_init(&ep->remove_list);
973 DBG(1, "%s: ep %p removed from remove list\n", __func__, ep);
974 }
975 DBG(1, "%s: Postprocessing %s ep %p req %d\n", __func__, epq->name,
976 ep, ep->num_req);
977 postproc_ep(isp1362_hcd, ep);
978 }
979 if (!done_map)
980 break;
981 }
982 if (done_map)
983 pr_warning("%s: done_map not clear: %08lx:%08lx\n", __func__, done_map,
984 epq->skip_map);
985 atomic_dec(&epq->finishing);
986}
987
988static void finish_iso_transfers(struct isp1362_hcd *isp1362_hcd, struct isp1362_ep_queue *epq)
989{
990 struct isp1362_ep *ep;
991 struct isp1362_ep *tmp;
992
993 if (list_empty(&epq->active)) {
994 DBG(1, "%s: Nothing to do for %s queue\n", __func__, epq->name);
995 return;
996 }
997
998 DBG(1, "%s: Finishing %s transfers\n", __func__, epq->name);
999
1000 atomic_inc(&epq->finishing);
1001 list_for_each_entry_safe(ep, tmp, &epq->active, active) {
1002 DBG(1, "%s: Checking PTD $%04x\n", __func__, ep->ptd_offset);
1003
1004 isp1362_read_ptd(isp1362_hcd, ep, epq);
1005 DBG(1, "%s: Postprocessing %s ep %p\n", __func__, epq->name, ep);
1006 postproc_ep(isp1362_hcd, ep);
1007 }
1008 WARN_ON(epq->blk_size != 0);
1009 atomic_dec(&epq->finishing);
1010}
1011
1012static irqreturn_t isp1362_irq(struct usb_hcd *hcd)
1013{
1014 int handled = 0;
1015 struct isp1362_hcd *isp1362_hcd = hcd_to_isp1362_hcd(hcd);
1016 u16 irqstat;
1017 u16 svc_mask;
1018
1019 spin_lock(&isp1362_hcd->lock);
1020
1021 BUG_ON(isp1362_hcd->irq_active++);
1022
1023 isp1362_write_reg16(isp1362_hcd, HCuPINTENB, 0);
1024
1025 irqstat = isp1362_read_reg16(isp1362_hcd, HCuPINT);
1026 DBG(3, "%s: got IRQ %04x:%04x\n", __func__, irqstat, isp1362_hcd->irqenb);
1027
1028
1029 irqstat &= isp1362_hcd->irqenb;
1030 isp1362_write_reg16(isp1362_hcd, HCuPINT, irqstat);
1031 svc_mask = irqstat;
1032
1033 if (irqstat & HCuPINT_SOF) {
1034 isp1362_hcd->irqenb &= ~HCuPINT_SOF;
1035 isp1362_hcd->irq_stat[ISP1362_INT_SOF]++;
1036 handled = 1;
1037 svc_mask &= ~HCuPINT_SOF;
1038 DBG(3, "%s: SOF\n", __func__);
1039 isp1362_hcd->fmindex = isp1362_read_reg32(isp1362_hcd, HCFMNUM);
1040 if (!list_empty(&isp1362_hcd->remove_list))
1041 finish_unlinks(isp1362_hcd);
1042 if (!list_empty(&isp1362_hcd->async) && !(irqstat & HCuPINT_ATL)) {
1043 if (list_empty(&isp1362_hcd->atl_queue.active)) {
1044 start_atl_transfers(isp1362_hcd);
1045 } else {
1046 isp1362_enable_int(isp1362_hcd, HCuPINT_ATL);
1047 isp1362_write_reg32(isp1362_hcd, HCATLSKIP,
1048 isp1362_hcd->atl_queue.skip_map);
1049 isp1362_set_mask16(isp1362_hcd, HCBUFSTAT, HCBUFSTAT_ATL_ACTIVE);
1050 }
1051 }
1052 }
1053
1054 if (irqstat & HCuPINT_ISTL0) {
1055 isp1362_hcd->irq_stat[ISP1362_INT_ISTL0]++;
1056 handled = 1;
1057 svc_mask &= ~HCuPINT_ISTL0;
1058 isp1362_clr_mask16(isp1362_hcd, HCBUFSTAT, HCBUFSTAT_ISTL0_FULL);
1059 DBG(1, "%s: ISTL0\n", __func__);
1060 WARN_ON((int)!!isp1362_hcd->istl_flip);
1061 WARN_ON(isp1362_read_reg16(isp1362_hcd, HCBUFSTAT) &
1062 HCBUFSTAT_ISTL0_ACTIVE);
1063 WARN_ON(!(isp1362_read_reg16(isp1362_hcd, HCBUFSTAT) &
1064 HCBUFSTAT_ISTL0_DONE));
1065 isp1362_hcd->irqenb &= ~HCuPINT_ISTL0;
1066 }
1067
1068 if (irqstat & HCuPINT_ISTL1) {
1069 isp1362_hcd->irq_stat[ISP1362_INT_ISTL1]++;
1070 handled = 1;
1071 svc_mask &= ~HCuPINT_ISTL1;
1072 isp1362_clr_mask16(isp1362_hcd, HCBUFSTAT, HCBUFSTAT_ISTL1_FULL);
1073 DBG(1, "%s: ISTL1\n", __func__);
1074 WARN_ON(!(int)isp1362_hcd->istl_flip);
1075 WARN_ON(isp1362_read_reg16(isp1362_hcd, HCBUFSTAT) &
1076 HCBUFSTAT_ISTL1_ACTIVE);
1077 WARN_ON(!(isp1362_read_reg16(isp1362_hcd, HCBUFSTAT) &
1078 HCBUFSTAT_ISTL1_DONE));
1079 isp1362_hcd->irqenb &= ~HCuPINT_ISTL1;
1080 }
1081
1082 if (irqstat & (HCuPINT_ISTL0 | HCuPINT_ISTL1)) {
1083 WARN_ON((irqstat & (HCuPINT_ISTL0 | HCuPINT_ISTL1)) ==
1084 (HCuPINT_ISTL0 | HCuPINT_ISTL1));
1085 finish_iso_transfers(isp1362_hcd,
1086 &isp1362_hcd->istl_queue[isp1362_hcd->istl_flip]);
1087 start_iso_transfers(isp1362_hcd);
1088 isp1362_hcd->istl_flip = 1 - isp1362_hcd->istl_flip;
1089 }
1090
1091 if (irqstat & HCuPINT_INTL) {
1092 u32 done_map = isp1362_read_reg32(isp1362_hcd, HCINTLDONE);
1093 u32 skip_map = isp1362_read_reg32(isp1362_hcd, HCINTLSKIP);
1094 isp1362_hcd->irq_stat[ISP1362_INT_INTL]++;
1095
1096 DBG(2, "%s: INTL\n", __func__);
1097
1098 svc_mask &= ~HCuPINT_INTL;
1099
1100 isp1362_write_reg32(isp1362_hcd, HCINTLSKIP, skip_map | done_map);
1101 if (~(done_map | skip_map) == 0)
1102
1103 isp1362_clr_mask16(isp1362_hcd, HCBUFSTAT, HCBUFSTAT_INTL_ACTIVE);
1104
1105 handled = 1;
1106 WARN_ON(!done_map);
1107 if (done_map) {
1108 DBG(3, "%s: INTL done_map %08x\n", __func__, done_map);
1109 finish_transfers(isp1362_hcd, done_map, &isp1362_hcd->intl_queue);
1110 start_intl_transfers(isp1362_hcd);
1111 }
1112 }
1113
1114 if (irqstat & HCuPINT_ATL) {
1115 u32 done_map = isp1362_read_reg32(isp1362_hcd, HCATLDONE);
1116 u32 skip_map = isp1362_read_reg32(isp1362_hcd, HCATLSKIP);
1117 isp1362_hcd->irq_stat[ISP1362_INT_ATL]++;
1118
1119 DBG(2, "%s: ATL\n", __func__);
1120
1121 svc_mask &= ~HCuPINT_ATL;
1122
1123 isp1362_write_reg32(isp1362_hcd, HCATLSKIP, skip_map | done_map);
1124 if (~(done_map | skip_map) == 0)
1125 isp1362_clr_mask16(isp1362_hcd, HCBUFSTAT, HCBUFSTAT_ATL_ACTIVE);
1126 if (done_map) {
1127 DBG(3, "%s: ATL done_map %08x\n", __func__, done_map);
1128 finish_transfers(isp1362_hcd, done_map, &isp1362_hcd->atl_queue);
1129 start_atl_transfers(isp1362_hcd);
1130 }
1131 handled = 1;
1132 }
1133
1134 if (irqstat & HCuPINT_OPR) {
1135 u32 intstat = isp1362_read_reg32(isp1362_hcd, HCINTSTAT);
1136 isp1362_hcd->irq_stat[ISP1362_INT_OPR]++;
1137
1138 svc_mask &= ~HCuPINT_OPR;
1139 DBG(2, "%s: OPR %08x:%08x\n", __func__, intstat, isp1362_hcd->intenb);
1140 intstat &= isp1362_hcd->intenb;
1141 if (intstat & OHCI_INTR_UE) {
1142 pr_err("Unrecoverable error\n");
1143
1144 }
1145 if (intstat & OHCI_INTR_RHSC) {
1146 isp1362_hcd->rhstatus = isp1362_read_reg32(isp1362_hcd, HCRHSTATUS);
1147 isp1362_hcd->rhport[0] = isp1362_read_reg32(isp1362_hcd, HCRHPORT1);
1148 isp1362_hcd->rhport[1] = isp1362_read_reg32(isp1362_hcd, HCRHPORT2);
1149 }
1150 if (intstat & OHCI_INTR_RD) {
1151 pr_info("%s: RESUME DETECTED\n", __func__);
1152 isp1362_show_reg(isp1362_hcd, HCCONTROL);
1153 usb_hcd_resume_root_hub(hcd);
1154 }
1155 isp1362_write_reg32(isp1362_hcd, HCINTSTAT, intstat);
1156 irqstat &= ~HCuPINT_OPR;
1157 handled = 1;
1158 }
1159
1160 if (irqstat & HCuPINT_SUSP) {
1161 isp1362_hcd->irq_stat[ISP1362_INT_SUSP]++;
1162 handled = 1;
1163 svc_mask &= ~HCuPINT_SUSP;
1164
1165 pr_info("%s: SUSPEND IRQ\n", __func__);
1166 }
1167
1168 if (irqstat & HCuPINT_CLKRDY) {
1169 isp1362_hcd->irq_stat[ISP1362_INT_CLKRDY]++;
1170 handled = 1;
1171 isp1362_hcd->irqenb &= ~HCuPINT_CLKRDY;
1172 svc_mask &= ~HCuPINT_CLKRDY;
1173 pr_info("%s: CLKRDY IRQ\n", __func__);
1174 }
1175
1176 if (svc_mask)
1177 pr_err("%s: Unserviced interrupt(s) %04x\n", __func__, svc_mask);
1178
1179 isp1362_write_reg16(isp1362_hcd, HCuPINTENB, isp1362_hcd->irqenb);
1180 isp1362_hcd->irq_active--;
1181 spin_unlock(&isp1362_hcd->lock);
1182
1183 return IRQ_RETVAL(handled);
1184}
1185
1186
1187
1188#define MAX_PERIODIC_LOAD 900
1189static int balance(struct isp1362_hcd *isp1362_hcd, u16 interval, u16 load)
1190{
1191 int i, branch = -ENOSPC;
1192
1193
1194
1195
1196 for (i = 0; i < interval; i++) {
1197 if (branch < 0 || isp1362_hcd->load[branch] > isp1362_hcd->load[i]) {
1198 int j;
1199
1200 for (j = i; j < PERIODIC_SIZE; j += interval) {
1201 if ((isp1362_hcd->load[j] + load) > MAX_PERIODIC_LOAD) {
1202 pr_err("%s: new load %d load[%02x] %d max %d\n", __func__,
1203 load, j, isp1362_hcd->load[j], MAX_PERIODIC_LOAD);
1204 break;
1205 }
1206 }
1207 if (j < PERIODIC_SIZE)
1208 continue;
1209 branch = i;
1210 }
1211 }
1212 return branch;
1213}
1214
1215
1216
1217
1218
1219
1220
1221static int isp1362_urb_enqueue(struct usb_hcd *hcd,
1222 struct urb *urb,
1223 gfp_t mem_flags)
1224{
1225 struct isp1362_hcd *isp1362_hcd = hcd_to_isp1362_hcd(hcd);
1226 struct usb_device *udev = urb->dev;
1227 unsigned int pipe = urb->pipe;
1228 int is_out = !usb_pipein(pipe);
1229 int type = usb_pipetype(pipe);
1230 int epnum = usb_pipeendpoint(pipe);
1231 struct usb_host_endpoint *hep = urb->ep;
1232 struct isp1362_ep *ep = NULL;
1233 unsigned long flags;
1234 int retval = 0;
1235
1236 DBG(3, "%s: urb %p\n", __func__, urb);
1237
1238 if (type == PIPE_ISOCHRONOUS) {
1239 pr_err("Isochronous transfers not supported\n");
1240 return -ENOSPC;
1241 }
1242
1243 URB_DBG("%s: FA %d ep%d%s %s: len %d %s%s\n", __func__,
1244 usb_pipedevice(pipe), epnum,
1245 is_out ? "out" : "in",
1246 usb_pipecontrol(pipe) ? "ctrl" :
1247 usb_pipeint(pipe) ? "int" :
1248 usb_pipebulk(pipe) ? "bulk" :
1249 "iso",
1250 urb->transfer_buffer_length,
1251 (urb->transfer_flags & URB_ZERO_PACKET) ? "ZERO_PACKET " : "",
1252 !(urb->transfer_flags & URB_SHORT_NOT_OK) ?
1253 "short_ok" : "");
1254
1255
1256 if (!hep->hcpriv) {
1257 ep = kzalloc(sizeof *ep, mem_flags);
1258 if (!ep)
1259 return -ENOMEM;
1260 }
1261 spin_lock_irqsave(&isp1362_hcd->lock, flags);
1262
1263
1264 if (!((isp1362_hcd->rhport[0] | isp1362_hcd->rhport[1]) &
1265 USB_PORT_STAT_ENABLE) ||
1266 !HC_IS_RUNNING(hcd->state)) {
1267 kfree(ep);
1268 retval = -ENODEV;
1269 goto fail_not_linked;
1270 }
1271
1272 retval = usb_hcd_link_urb_to_ep(hcd, urb);
1273 if (retval) {
1274 kfree(ep);
1275 goto fail_not_linked;
1276 }
1277
1278 if (hep->hcpriv) {
1279 ep = hep->hcpriv;
1280 } else {
1281 INIT_LIST_HEAD(&ep->schedule);
1282 INIT_LIST_HEAD(&ep->active);
1283 INIT_LIST_HEAD(&ep->remove_list);
1284 ep->udev = usb_get_dev(udev);
1285 ep->hep = hep;
1286 ep->epnum = epnum;
1287 ep->maxpacket = usb_maxpacket(udev, urb->pipe, is_out);
1288 ep->ptd_offset = -EINVAL;
1289 ep->ptd_index = -EINVAL;
1290 usb_settoggle(udev, epnum, is_out, 0);
1291
1292 if (type == PIPE_CONTROL)
1293 ep->nextpid = USB_PID_SETUP;
1294 else if (is_out)
1295 ep->nextpid = USB_PID_OUT;
1296 else
1297 ep->nextpid = USB_PID_IN;
1298
1299 switch (type) {
1300 case PIPE_ISOCHRONOUS:
1301 case PIPE_INTERRUPT:
1302 if (urb->interval > PERIODIC_SIZE)
1303 urb->interval = PERIODIC_SIZE;
1304 ep->interval = urb->interval;
1305 ep->branch = PERIODIC_SIZE;
1306 ep->load = usb_calc_bus_time(udev->speed, !is_out,
1307 (type == PIPE_ISOCHRONOUS),
1308 usb_maxpacket(udev, pipe, is_out)) / 1000;
1309 break;
1310 }
1311 hep->hcpriv = ep;
1312 }
1313 ep->num_req = isp1362_hcd->req_serial++;
1314
1315
1316 switch (type) {
1317 case PIPE_CONTROL:
1318 case PIPE_BULK:
1319 if (list_empty(&ep->schedule)) {
1320 DBG(1, "%s: Adding ep %p req %d to async schedule\n",
1321 __func__, ep, ep->num_req);
1322 list_add_tail(&ep->schedule, &isp1362_hcd->async);
1323 }
1324 break;
1325 case PIPE_ISOCHRONOUS:
1326 case PIPE_INTERRUPT:
1327 urb->interval = ep->interval;
1328
1329
1330 if (ep->branch < PERIODIC_SIZE)
1331 break;
1332
1333 retval = balance(isp1362_hcd, ep->interval, ep->load);
1334 if (retval < 0) {
1335 pr_err("%s: balance returned %d\n", __func__, retval);
1336 goto fail;
1337 }
1338 ep->branch = retval;
1339 retval = 0;
1340 isp1362_hcd->fmindex = isp1362_read_reg32(isp1362_hcd, HCFMNUM);
1341 DBG(1, "%s: Current frame %04x branch %02x start_frame %04x(%04x)\n",
1342 __func__, isp1362_hcd->fmindex, ep->branch,
1343 ((isp1362_hcd->fmindex + PERIODIC_SIZE - 1) &
1344 ~(PERIODIC_SIZE - 1)) + ep->branch,
1345 (isp1362_hcd->fmindex & (PERIODIC_SIZE - 1)) + ep->branch);
1346
1347 if (list_empty(&ep->schedule)) {
1348 if (type == PIPE_ISOCHRONOUS) {
1349 u16 frame = isp1362_hcd->fmindex;
1350
1351 frame += max_t(u16, 8, ep->interval);
1352 frame &= ~(ep->interval - 1);
1353 frame |= ep->branch;
1354 if (frame_before(frame, isp1362_hcd->fmindex))
1355 frame += ep->interval;
1356 urb->start_frame = frame;
1357
1358 DBG(1, "%s: Adding ep %p to isoc schedule\n", __func__, ep);
1359 list_add_tail(&ep->schedule, &isp1362_hcd->isoc);
1360 } else {
1361 DBG(1, "%s: Adding ep %p to periodic schedule\n", __func__, ep);
1362 list_add_tail(&ep->schedule, &isp1362_hcd->periodic);
1363 }
1364 } else
1365 DBG(1, "%s: ep %p already scheduled\n", __func__, ep);
1366
1367 DBG(2, "%s: load %d bandwidth %d -> %d\n", __func__,
1368 ep->load / ep->interval, isp1362_hcd->load[ep->branch],
1369 isp1362_hcd->load[ep->branch] + ep->load);
1370 isp1362_hcd->load[ep->branch] += ep->load;
1371 }
1372
1373 urb->hcpriv = hep;
1374 ALIGNSTAT(isp1362_hcd, urb->transfer_buffer);
1375
1376 switch (type) {
1377 case PIPE_CONTROL:
1378 case PIPE_BULK:
1379 start_atl_transfers(isp1362_hcd);
1380 break;
1381 case PIPE_INTERRUPT:
1382 start_intl_transfers(isp1362_hcd);
1383 break;
1384 case PIPE_ISOCHRONOUS:
1385 start_iso_transfers(isp1362_hcd);
1386 break;
1387 default:
1388 BUG();
1389 }
1390 fail:
1391 if (retval)
1392 usb_hcd_unlink_urb_from_ep(hcd, urb);
1393
1394
1395 fail_not_linked:
1396 spin_unlock_irqrestore(&isp1362_hcd->lock, flags);
1397 if (retval)
1398 DBG(0, "%s: urb %p failed with %d\n", __func__, urb, retval);
1399 return retval;
1400}
1401
1402static int isp1362_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status)
1403{
1404 struct isp1362_hcd *isp1362_hcd = hcd_to_isp1362_hcd(hcd);
1405 struct usb_host_endpoint *hep;
1406 unsigned long flags;
1407 struct isp1362_ep *ep;
1408 int retval = 0;
1409
1410 DBG(3, "%s: urb %p\n", __func__, urb);
1411
1412 spin_lock_irqsave(&isp1362_hcd->lock, flags);
1413 retval = usb_hcd_check_unlink_urb(hcd, urb, status);
1414 if (retval)
1415 goto done;
1416
1417 hep = urb->hcpriv;
1418
1419 if (!hep) {
1420 spin_unlock_irqrestore(&isp1362_hcd->lock, flags);
1421 return -EIDRM;
1422 }
1423
1424 ep = hep->hcpriv;
1425 if (ep) {
1426
1427 if (ep->hep->urb_list.next == &urb->urb_list) {
1428 if (!list_empty(&ep->active)) {
1429 DBG(1, "%s: urb %p ep %p req %d active PTD[%d] $%04x\n", __func__,
1430 urb, ep, ep->num_req, ep->ptd_index, ep->ptd_offset);
1431
1432 remove_ptd(isp1362_hcd, ep);
1433 urb = NULL;
1434 }
1435 }
1436 if (urb) {
1437 DBG(1, "%s: Finishing ep %p req %d\n", __func__, ep,
1438 ep->num_req);
1439 finish_request(isp1362_hcd, ep, urb, status);
1440 } else
1441 DBG(1, "%s: urb %p active; wait4irq\n", __func__, urb);
1442 } else {
1443 pr_warning("%s: No EP in URB %p\n", __func__, urb);
1444 retval = -EINVAL;
1445 }
1446done:
1447 spin_unlock_irqrestore(&isp1362_hcd->lock, flags);
1448
1449 DBG(3, "%s: exit\n", __func__);
1450
1451 return retval;
1452}
1453
1454static void isp1362_endpoint_disable(struct usb_hcd *hcd, struct usb_host_endpoint *hep)
1455{
1456 struct isp1362_ep *ep = hep->hcpriv;
1457 struct isp1362_hcd *isp1362_hcd = hcd_to_isp1362_hcd(hcd);
1458 unsigned long flags;
1459
1460 DBG(1, "%s: ep %p\n", __func__, ep);
1461 if (!ep)
1462 return;
1463 spin_lock_irqsave(&isp1362_hcd->lock, flags);
1464 if (!list_empty(&hep->urb_list)) {
1465 if (!list_empty(&ep->active) && list_empty(&ep->remove_list)) {
1466 DBG(1, "%s: Removing ep %p req %d PTD[%d] $%04x\n", __func__,
1467 ep, ep->num_req, ep->ptd_index, ep->ptd_offset);
1468 remove_ptd(isp1362_hcd, ep);
1469 pr_info("%s: Waiting for Interrupt to clean up\n", __func__);
1470 }
1471 }
1472 spin_unlock_irqrestore(&isp1362_hcd->lock, flags);
1473
1474 while (!list_empty(&ep->active))
1475 msleep(1);
1476
1477 DBG(1, "%s: Freeing EP %p\n", __func__, ep);
1478
1479 usb_put_dev(ep->udev);
1480 kfree(ep);
1481 hep->hcpriv = NULL;
1482}
1483
1484static int isp1362_get_frame(struct usb_hcd *hcd)
1485{
1486 struct isp1362_hcd *isp1362_hcd = hcd_to_isp1362_hcd(hcd);
1487 u32 fmnum;
1488 unsigned long flags;
1489
1490 spin_lock_irqsave(&isp1362_hcd->lock, flags);
1491 fmnum = isp1362_read_reg32(isp1362_hcd, HCFMNUM);
1492 spin_unlock_irqrestore(&isp1362_hcd->lock, flags);
1493
1494 return (int)fmnum;
1495}
1496
1497
1498
1499
1500static int isp1362_hub_status_data(struct usb_hcd *hcd, char *buf)
1501{
1502 struct isp1362_hcd *isp1362_hcd = hcd_to_isp1362_hcd(hcd);
1503 int ports, i, changed = 0;
1504 unsigned long flags;
1505
1506 if (!HC_IS_RUNNING(hcd->state))
1507 return -ESHUTDOWN;
1508
1509
1510
1511 if (timer_pending(&hcd->rh_timer))
1512 return 0;
1513
1514 ports = isp1362_hcd->rhdesca & RH_A_NDP;
1515 BUG_ON(ports > 2);
1516
1517 spin_lock_irqsave(&isp1362_hcd->lock, flags);
1518
1519 if (isp1362_hcd->rhstatus & (RH_HS_LPSC | RH_HS_OCIC))
1520 buf[0] = changed = 1;
1521 else
1522 buf[0] = 0;
1523
1524 for (i = 0; i < ports; i++) {
1525 u32 status = isp1362_hcd->rhport[i];
1526
1527 if (status & (RH_PS_CSC | RH_PS_PESC | RH_PS_PSSC |
1528 RH_PS_OCIC | RH_PS_PRSC)) {
1529 changed = 1;
1530 buf[0] |= 1 << (i + 1);
1531 continue;
1532 }
1533
1534 if (!(status & RH_PS_CCS))
1535 continue;
1536 }
1537 spin_unlock_irqrestore(&isp1362_hcd->lock, flags);
1538 return changed;
1539}
1540
1541static void isp1362_hub_descriptor(struct isp1362_hcd *isp1362_hcd,
1542 struct usb_hub_descriptor *desc)
1543{
1544 u32 reg = isp1362_hcd->rhdesca;
1545
1546 DBG(3, "%s: enter\n", __func__);
1547
1548 desc->bDescriptorType = 0x29;
1549 desc->bDescLength = 9;
1550 desc->bHubContrCurrent = 0;
1551 desc->bNbrPorts = reg & 0x3;
1552
1553 desc->wHubCharacteristics = cpu_to_le16((reg >> 8) & 0x1f);
1554 DBG(0, "%s: hubcharacteristics = %02x\n", __func__, cpu_to_le16((reg >> 8) & 0x1f));
1555 desc->bPwrOn2PwrGood = (reg >> 24) & 0xff;
1556
1557 desc->u.hs.DeviceRemovable[0] = desc->bNbrPorts == 1 ? 1 << 1 : 3 << 1;
1558 desc->u.hs.DeviceRemovable[1] = ~0;
1559
1560 DBG(3, "%s: exit\n", __func__);
1561}
1562
1563
1564static int isp1362_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
1565 u16 wIndex, char *buf, u16 wLength)
1566{
1567 struct isp1362_hcd *isp1362_hcd = hcd_to_isp1362_hcd(hcd);
1568 int retval = 0;
1569 unsigned long flags;
1570 unsigned long t1;
1571 int ports = isp1362_hcd->rhdesca & RH_A_NDP;
1572 u32 tmp = 0;
1573
1574 switch (typeReq) {
1575 case ClearHubFeature:
1576 DBG(0, "ClearHubFeature: ");
1577 switch (wValue) {
1578 case C_HUB_OVER_CURRENT:
1579 _DBG(0, "C_HUB_OVER_CURRENT\n");
1580 spin_lock_irqsave(&isp1362_hcd->lock, flags);
1581 isp1362_write_reg32(isp1362_hcd, HCRHSTATUS, RH_HS_OCIC);
1582 spin_unlock_irqrestore(&isp1362_hcd->lock, flags);
1583 case C_HUB_LOCAL_POWER:
1584 _DBG(0, "C_HUB_LOCAL_POWER\n");
1585 break;
1586 default:
1587 goto error;
1588 }
1589 break;
1590 case SetHubFeature:
1591 DBG(0, "SetHubFeature: ");
1592 switch (wValue) {
1593 case C_HUB_OVER_CURRENT:
1594 case C_HUB_LOCAL_POWER:
1595 _DBG(0, "C_HUB_OVER_CURRENT or C_HUB_LOCAL_POWER\n");
1596 break;
1597 default:
1598 goto error;
1599 }
1600 break;
1601 case GetHubDescriptor:
1602 DBG(0, "GetHubDescriptor\n");
1603 isp1362_hub_descriptor(isp1362_hcd, (struct usb_hub_descriptor *)buf);
1604 break;
1605 case GetHubStatus:
1606 DBG(0, "GetHubStatus\n");
1607 put_unaligned(cpu_to_le32(0), (__le32 *) buf);
1608 break;
1609 case GetPortStatus:
1610#ifndef VERBOSE
1611 DBG(0, "GetPortStatus\n");
1612#endif
1613 if (!wIndex || wIndex > ports)
1614 goto error;
1615 tmp = isp1362_hcd->rhport[--wIndex];
1616 put_unaligned(cpu_to_le32(tmp), (__le32 *) buf);
1617 break;
1618 case ClearPortFeature:
1619 DBG(0, "ClearPortFeature: ");
1620 if (!wIndex || wIndex > ports)
1621 goto error;
1622 wIndex--;
1623
1624 switch (wValue) {
1625 case USB_PORT_FEAT_ENABLE:
1626 _DBG(0, "USB_PORT_FEAT_ENABLE\n");
1627 tmp = RH_PS_CCS;
1628 break;
1629 case USB_PORT_FEAT_C_ENABLE:
1630 _DBG(0, "USB_PORT_FEAT_C_ENABLE\n");
1631 tmp = RH_PS_PESC;
1632 break;
1633 case USB_PORT_FEAT_SUSPEND:
1634 _DBG(0, "USB_PORT_FEAT_SUSPEND\n");
1635 tmp = RH_PS_POCI;
1636 break;
1637 case USB_PORT_FEAT_C_SUSPEND:
1638 _DBG(0, "USB_PORT_FEAT_C_SUSPEND\n");
1639 tmp = RH_PS_PSSC;
1640 break;
1641 case USB_PORT_FEAT_POWER:
1642 _DBG(0, "USB_PORT_FEAT_POWER\n");
1643 tmp = RH_PS_LSDA;
1644
1645 break;
1646 case USB_PORT_FEAT_C_CONNECTION:
1647 _DBG(0, "USB_PORT_FEAT_C_CONNECTION\n");
1648 tmp = RH_PS_CSC;
1649 break;
1650 case USB_PORT_FEAT_C_OVER_CURRENT:
1651 _DBG(0, "USB_PORT_FEAT_C_OVER_CURRENT\n");
1652 tmp = RH_PS_OCIC;
1653 break;
1654 case USB_PORT_FEAT_C_RESET:
1655 _DBG(0, "USB_PORT_FEAT_C_RESET\n");
1656 tmp = RH_PS_PRSC;
1657 break;
1658 default:
1659 goto error;
1660 }
1661
1662 spin_lock_irqsave(&isp1362_hcd->lock, flags);
1663 isp1362_write_reg32(isp1362_hcd, HCRHPORT1 + wIndex, tmp);
1664 isp1362_hcd->rhport[wIndex] =
1665 isp1362_read_reg32(isp1362_hcd, HCRHPORT1 + wIndex);
1666 spin_unlock_irqrestore(&isp1362_hcd->lock, flags);
1667 break;
1668 case SetPortFeature:
1669 DBG(0, "SetPortFeature: ");
1670 if (!wIndex || wIndex > ports)
1671 goto error;
1672 wIndex--;
1673 switch (wValue) {
1674 case USB_PORT_FEAT_SUSPEND:
1675 _DBG(0, "USB_PORT_FEAT_SUSPEND\n");
1676 spin_lock_irqsave(&isp1362_hcd->lock, flags);
1677 isp1362_write_reg32(isp1362_hcd, HCRHPORT1 + wIndex, RH_PS_PSS);
1678 isp1362_hcd->rhport[wIndex] =
1679 isp1362_read_reg32(isp1362_hcd, HCRHPORT1 + wIndex);
1680 spin_unlock_irqrestore(&isp1362_hcd->lock, flags);
1681 break;
1682 case USB_PORT_FEAT_POWER:
1683 _DBG(0, "USB_PORT_FEAT_POWER\n");
1684 spin_lock_irqsave(&isp1362_hcd->lock, flags);
1685 isp1362_write_reg32(isp1362_hcd, HCRHPORT1 + wIndex, RH_PS_PPS);
1686 isp1362_hcd->rhport[wIndex] =
1687 isp1362_read_reg32(isp1362_hcd, HCRHPORT1 + wIndex);
1688 spin_unlock_irqrestore(&isp1362_hcd->lock, flags);
1689 break;
1690 case USB_PORT_FEAT_RESET:
1691 _DBG(0, "USB_PORT_FEAT_RESET\n");
1692 spin_lock_irqsave(&isp1362_hcd->lock, flags);
1693
1694 t1 = jiffies + msecs_to_jiffies(USB_RESET_WIDTH);
1695 while (time_before(jiffies, t1)) {
1696
1697 for (;;) {
1698 tmp = isp1362_read_reg32(isp1362_hcd, HCRHPORT1 + wIndex);
1699 if (!(tmp & RH_PS_PRS))
1700 break;
1701 udelay(500);
1702 }
1703 if (!(tmp & RH_PS_CCS))
1704 break;
1705
1706 isp1362_write_reg32(isp1362_hcd, HCRHPORT1 + wIndex, (RH_PS_PRS));
1707
1708 spin_unlock_irqrestore(&isp1362_hcd->lock, flags);
1709 msleep(10);
1710 spin_lock_irqsave(&isp1362_hcd->lock, flags);
1711 }
1712
1713 isp1362_hcd->rhport[wIndex] = isp1362_read_reg32(isp1362_hcd,
1714 HCRHPORT1 + wIndex);
1715 spin_unlock_irqrestore(&isp1362_hcd->lock, flags);
1716 break;
1717 default:
1718 goto error;
1719 }
1720 break;
1721
1722 default:
1723 error:
1724
1725 _DBG(0, "PROTOCOL STALL\n");
1726 retval = -EPIPE;
1727 }
1728
1729 return retval;
1730}
1731
1732#ifdef CONFIG_PM
1733static int isp1362_bus_suspend(struct usb_hcd *hcd)
1734{
1735 int status = 0;
1736 struct isp1362_hcd *isp1362_hcd = hcd_to_isp1362_hcd(hcd);
1737 unsigned long flags;
1738
1739 if (time_before(jiffies, isp1362_hcd->next_statechange))
1740 msleep(5);
1741
1742 spin_lock_irqsave(&isp1362_hcd->lock, flags);
1743
1744 isp1362_hcd->hc_control = isp1362_read_reg32(isp1362_hcd, HCCONTROL);
1745 switch (isp1362_hcd->hc_control & OHCI_CTRL_HCFS) {
1746 case OHCI_USB_RESUME:
1747 DBG(0, "%s: resume/suspend?\n", __func__);
1748 isp1362_hcd->hc_control &= ~OHCI_CTRL_HCFS;
1749 isp1362_hcd->hc_control |= OHCI_USB_RESET;
1750 isp1362_write_reg32(isp1362_hcd, HCCONTROL, isp1362_hcd->hc_control);
1751
1752 case OHCI_USB_RESET:
1753 status = -EBUSY;
1754 pr_warning("%s: needs reinit!\n", __func__);
1755 goto done;
1756 case OHCI_USB_SUSPEND:
1757 pr_warning("%s: already suspended?\n", __func__);
1758 goto done;
1759 }
1760 DBG(0, "%s: suspend root hub\n", __func__);
1761
1762
1763 hcd->state = HC_STATE_QUIESCING;
1764 if (!list_empty(&isp1362_hcd->atl_queue.active) ||
1765 !list_empty(&isp1362_hcd->intl_queue.active) ||
1766 !list_empty(&isp1362_hcd->istl_queue[0] .active) ||
1767 !list_empty(&isp1362_hcd->istl_queue[1] .active)) {
1768 int limit;
1769
1770 isp1362_write_reg32(isp1362_hcd, HCATLSKIP, ~0);
1771 isp1362_write_reg32(isp1362_hcd, HCINTLSKIP, ~0);
1772 isp1362_write_reg16(isp1362_hcd, HCBUFSTAT, 0);
1773 isp1362_write_reg16(isp1362_hcd, HCuPINTENB, 0);
1774 isp1362_write_reg32(isp1362_hcd, HCINTSTAT, OHCI_INTR_SF);
1775
1776 DBG(0, "%s: stopping schedules ...\n", __func__);
1777 limit = 2000;
1778 while (limit > 0) {
1779 udelay(250);
1780 limit -= 250;
1781 if (isp1362_read_reg32(isp1362_hcd, HCINTSTAT) & OHCI_INTR_SF)
1782 break;
1783 }
1784 mdelay(7);
1785 if (isp1362_read_reg16(isp1362_hcd, HCuPINT) & HCuPINT_ATL) {
1786 u32 done_map = isp1362_read_reg32(isp1362_hcd, HCATLDONE);
1787 finish_transfers(isp1362_hcd, done_map, &isp1362_hcd->atl_queue);
1788 }
1789 if (isp1362_read_reg16(isp1362_hcd, HCuPINT) & HCuPINT_INTL) {
1790 u32 done_map = isp1362_read_reg32(isp1362_hcd, HCINTLDONE);
1791 finish_transfers(isp1362_hcd, done_map, &isp1362_hcd->intl_queue);
1792 }
1793 if (isp1362_read_reg16(isp1362_hcd, HCuPINT) & HCuPINT_ISTL0)
1794 finish_iso_transfers(isp1362_hcd, &isp1362_hcd->istl_queue[0]);
1795 if (isp1362_read_reg16(isp1362_hcd, HCuPINT) & HCuPINT_ISTL1)
1796 finish_iso_transfers(isp1362_hcd, &isp1362_hcd->istl_queue[1]);
1797 }
1798 DBG(0, "%s: HCINTSTAT: %08x\n", __func__,
1799 isp1362_read_reg32(isp1362_hcd, HCINTSTAT));
1800 isp1362_write_reg32(isp1362_hcd, HCINTSTAT,
1801 isp1362_read_reg32(isp1362_hcd, HCINTSTAT));
1802
1803
1804 isp1362_hcd->hc_control = OHCI_USB_SUSPEND;
1805 isp1362_show_reg(isp1362_hcd, HCCONTROL);
1806 isp1362_write_reg32(isp1362_hcd, HCCONTROL, isp1362_hcd->hc_control);
1807 isp1362_show_reg(isp1362_hcd, HCCONTROL);
1808
1809#if 1
1810 isp1362_hcd->hc_control = isp1362_read_reg32(isp1362_hcd, HCCONTROL);
1811 if ((isp1362_hcd->hc_control & OHCI_CTRL_HCFS) != OHCI_USB_SUSPEND) {
1812 pr_err("%s: controller won't suspend %08x\n", __func__,
1813 isp1362_hcd->hc_control);
1814 status = -EBUSY;
1815 } else
1816#endif
1817 {
1818
1819 isp1362_hcd->next_statechange = jiffies + msecs_to_jiffies(5);
1820 }
1821done:
1822 if (status == 0) {
1823 hcd->state = HC_STATE_SUSPENDED;
1824 DBG(0, "%s: HCD suspended: %08x\n", __func__,
1825 isp1362_read_reg32(isp1362_hcd, HCCONTROL));
1826 }
1827 spin_unlock_irqrestore(&isp1362_hcd->lock, flags);
1828 return status;
1829}
1830
1831static int isp1362_bus_resume(struct usb_hcd *hcd)
1832{
1833 struct isp1362_hcd *isp1362_hcd = hcd_to_isp1362_hcd(hcd);
1834 u32 port;
1835 unsigned long flags;
1836 int status = -EINPROGRESS;
1837
1838 if (time_before(jiffies, isp1362_hcd->next_statechange))
1839 msleep(5);
1840
1841 spin_lock_irqsave(&isp1362_hcd->lock, flags);
1842 isp1362_hcd->hc_control = isp1362_read_reg32(isp1362_hcd, HCCONTROL);
1843 pr_info("%s: HCCONTROL: %08x\n", __func__, isp1362_hcd->hc_control);
1844 if (hcd->state == HC_STATE_RESUMING) {
1845 pr_warning("%s: duplicate resume\n", __func__);
1846 status = 0;
1847 } else
1848 switch (isp1362_hcd->hc_control & OHCI_CTRL_HCFS) {
1849 case OHCI_USB_SUSPEND:
1850 DBG(0, "%s: resume root hub\n", __func__);
1851 isp1362_hcd->hc_control &= ~OHCI_CTRL_HCFS;
1852 isp1362_hcd->hc_control |= OHCI_USB_RESUME;
1853 isp1362_write_reg32(isp1362_hcd, HCCONTROL, isp1362_hcd->hc_control);
1854 break;
1855 case OHCI_USB_RESUME:
1856
1857 DBG(0, "%s: remote wakeup\n", __func__);
1858 break;
1859 case OHCI_USB_OPER:
1860 DBG(0, "%s: odd resume\n", __func__);
1861 status = 0;
1862 hcd->self.root_hub->dev.power.power_state = PMSG_ON;
1863 break;
1864 default:
1865 DBG(0, "%s: root hub hardware reset\n", __func__);
1866 status = -EBUSY;
1867 }
1868 spin_unlock_irqrestore(&isp1362_hcd->lock, flags);
1869 if (status == -EBUSY) {
1870 DBG(0, "%s: Restarting HC\n", __func__);
1871 isp1362_hc_stop(hcd);
1872 return isp1362_hc_start(hcd);
1873 }
1874 if (status != -EINPROGRESS)
1875 return status;
1876 spin_lock_irqsave(&isp1362_hcd->lock, flags);
1877 port = isp1362_read_reg32(isp1362_hcd, HCRHDESCA) & RH_A_NDP;
1878 while (port--) {
1879 u32 stat = isp1362_read_reg32(isp1362_hcd, HCRHPORT1 + port);
1880
1881
1882 if (!(stat & RH_PS_PSS)) {
1883 DBG(0, "%s: Not Resuming RH port %d\n", __func__, port);
1884 continue;
1885 }
1886 DBG(0, "%s: Resuming RH port %d\n", __func__, port);
1887 isp1362_write_reg32(isp1362_hcd, HCRHPORT1 + port, RH_PS_POCI);
1888 }
1889 spin_unlock_irqrestore(&isp1362_hcd->lock, flags);
1890
1891
1892 hcd->state = HC_STATE_RESUMING;
1893 mdelay(20 + 15);
1894
1895 isp1362_hcd->hc_control = OHCI_USB_OPER;
1896 spin_lock_irqsave(&isp1362_hcd->lock, flags);
1897 isp1362_show_reg(isp1362_hcd, HCCONTROL);
1898 isp1362_write_reg32(isp1362_hcd, HCCONTROL, isp1362_hcd->hc_control);
1899 spin_unlock_irqrestore(&isp1362_hcd->lock, flags);
1900
1901 msleep(10);
1902
1903
1904 isp1362_hcd->next_statechange = jiffies + msecs_to_jiffies(250);
1905
1906 hcd->self.root_hub->dev.power.power_state = PMSG_ON;
1907 hcd->state = HC_STATE_RUNNING;
1908 return 0;
1909}
1910#else
1911#define isp1362_bus_suspend NULL
1912#define isp1362_bus_resume NULL
1913#endif
1914
1915
1916
1917#ifdef STUB_DEBUG_FILE
1918
1919static inline void create_debug_file(struct isp1362_hcd *isp1362_hcd)
1920{
1921}
1922static inline void remove_debug_file(struct isp1362_hcd *isp1362_hcd)
1923{
1924}
1925
1926#else
1927
1928#include <linux/proc_fs.h>
1929#include <linux/seq_file.h>
1930
1931static void dump_irq(struct seq_file *s, char *label, u16 mask)
1932{
1933 seq_printf(s, "%-15s %04x%s%s%s%s%s%s\n", label, mask,
1934 mask & HCuPINT_CLKRDY ? " clkrdy" : "",
1935 mask & HCuPINT_SUSP ? " susp" : "",
1936 mask & HCuPINT_OPR ? " opr" : "",
1937 mask & HCuPINT_EOT ? " eot" : "",
1938 mask & HCuPINT_ATL ? " atl" : "",
1939 mask & HCuPINT_SOF ? " sof" : "");
1940}
1941
1942static void dump_int(struct seq_file *s, char *label, u32 mask)
1943{
1944 seq_printf(s, "%-15s %08x%s%s%s%s%s%s%s\n", label, mask,
1945 mask & OHCI_INTR_MIE ? " MIE" : "",
1946 mask & OHCI_INTR_RHSC ? " rhsc" : "",
1947 mask & OHCI_INTR_FNO ? " fno" : "",
1948 mask & OHCI_INTR_UE ? " ue" : "",
1949 mask & OHCI_INTR_RD ? " rd" : "",
1950 mask & OHCI_INTR_SF ? " sof" : "",
1951 mask & OHCI_INTR_SO ? " so" : "");
1952}
1953
1954static void dump_ctrl(struct seq_file *s, char *label, u32 mask)
1955{
1956 seq_printf(s, "%-15s %08x%s%s%s\n", label, mask,
1957 mask & OHCI_CTRL_RWC ? " rwc" : "",
1958 mask & OHCI_CTRL_RWE ? " rwe" : "",
1959 ({
1960 char *hcfs;
1961 switch (mask & OHCI_CTRL_HCFS) {
1962 case OHCI_USB_OPER:
1963 hcfs = " oper";
1964 break;
1965 case OHCI_USB_RESET:
1966 hcfs = " reset";
1967 break;
1968 case OHCI_USB_RESUME:
1969 hcfs = " resume";
1970 break;
1971 case OHCI_USB_SUSPEND:
1972 hcfs = " suspend";
1973 break;
1974 default:
1975 hcfs = " ?";
1976 }
1977 hcfs;
1978 }));
1979}
1980
1981static void dump_regs(struct seq_file *s, struct isp1362_hcd *isp1362_hcd)
1982{
1983 seq_printf(s, "HCREVISION [%02x] %08x\n", ISP1362_REG_NO(ISP1362_REG_HCREVISION),
1984 isp1362_read_reg32(isp1362_hcd, HCREVISION));
1985 seq_printf(s, "HCCONTROL [%02x] %08x\n", ISP1362_REG_NO(ISP1362_REG_HCCONTROL),
1986 isp1362_read_reg32(isp1362_hcd, HCCONTROL));
1987 seq_printf(s, "HCCMDSTAT [%02x] %08x\n", ISP1362_REG_NO(ISP1362_REG_HCCMDSTAT),
1988 isp1362_read_reg32(isp1362_hcd, HCCMDSTAT));
1989 seq_printf(s, "HCINTSTAT [%02x] %08x\n", ISP1362_REG_NO(ISP1362_REG_HCINTSTAT),
1990 isp1362_read_reg32(isp1362_hcd, HCINTSTAT));
1991 seq_printf(s, "HCINTENB [%02x] %08x\n", ISP1362_REG_NO(ISP1362_REG_HCINTENB),
1992 isp1362_read_reg32(isp1362_hcd, HCINTENB));
1993 seq_printf(s, "HCFMINTVL [%02x] %08x\n", ISP1362_REG_NO(ISP1362_REG_HCFMINTVL),
1994 isp1362_read_reg32(isp1362_hcd, HCFMINTVL));
1995 seq_printf(s, "HCFMREM [%02x] %08x\n", ISP1362_REG_NO(ISP1362_REG_HCFMREM),
1996 isp1362_read_reg32(isp1362_hcd, HCFMREM));
1997 seq_printf(s, "HCFMNUM [%02x] %08x\n", ISP1362_REG_NO(ISP1362_REG_HCFMNUM),
1998 isp1362_read_reg32(isp1362_hcd, HCFMNUM));
1999 seq_printf(s, "HCLSTHRESH [%02x] %08x\n", ISP1362_REG_NO(ISP1362_REG_HCLSTHRESH),
2000 isp1362_read_reg32(isp1362_hcd, HCLSTHRESH));
2001 seq_printf(s, "HCRHDESCA [%02x] %08x\n", ISP1362_REG_NO(ISP1362_REG_HCRHDESCA),
2002 isp1362_read_reg32(isp1362_hcd, HCRHDESCA));
2003 seq_printf(s, "HCRHDESCB [%02x] %08x\n", ISP1362_REG_NO(ISP1362_REG_HCRHDESCB),
2004 isp1362_read_reg32(isp1362_hcd, HCRHDESCB));
2005 seq_printf(s, "HCRHSTATUS [%02x] %08x\n", ISP1362_REG_NO(ISP1362_REG_HCRHSTATUS),
2006 isp1362_read_reg32(isp1362_hcd, HCRHSTATUS));
2007 seq_printf(s, "HCRHPORT1 [%02x] %08x\n", ISP1362_REG_NO(ISP1362_REG_HCRHPORT1),
2008 isp1362_read_reg32(isp1362_hcd, HCRHPORT1));
2009 seq_printf(s, "HCRHPORT2 [%02x] %08x\n", ISP1362_REG_NO(ISP1362_REG_HCRHPORT2),
2010 isp1362_read_reg32(isp1362_hcd, HCRHPORT2));
2011 seq_printf(s, "\n");
2012 seq_printf(s, "HCHWCFG [%02x] %04x\n", ISP1362_REG_NO(ISP1362_REG_HCHWCFG),
2013 isp1362_read_reg16(isp1362_hcd, HCHWCFG));
2014 seq_printf(s, "HCDMACFG [%02x] %04x\n", ISP1362_REG_NO(ISP1362_REG_HCDMACFG),
2015 isp1362_read_reg16(isp1362_hcd, HCDMACFG));
2016 seq_printf(s, "HCXFERCTR [%02x] %04x\n", ISP1362_REG_NO(ISP1362_REG_HCXFERCTR),
2017 isp1362_read_reg16(isp1362_hcd, HCXFERCTR));
2018 seq_printf(s, "HCuPINT [%02x] %04x\n", ISP1362_REG_NO(ISP1362_REG_HCuPINT),
2019 isp1362_read_reg16(isp1362_hcd, HCuPINT));
2020 seq_printf(s, "HCuPINTENB [%02x] %04x\n", ISP1362_REG_NO(ISP1362_REG_HCuPINTENB),
2021 isp1362_read_reg16(isp1362_hcd, HCuPINTENB));
2022 seq_printf(s, "HCCHIPID [%02x] %04x\n", ISP1362_REG_NO(ISP1362_REG_HCCHIPID),
2023 isp1362_read_reg16(isp1362_hcd, HCCHIPID));
2024 seq_printf(s, "HCSCRATCH [%02x] %04x\n", ISP1362_REG_NO(ISP1362_REG_HCSCRATCH),
2025 isp1362_read_reg16(isp1362_hcd, HCSCRATCH));
2026 seq_printf(s, "HCBUFSTAT [%02x] %04x\n", ISP1362_REG_NO(ISP1362_REG_HCBUFSTAT),
2027 isp1362_read_reg16(isp1362_hcd, HCBUFSTAT));
2028 seq_printf(s, "HCDIRADDR [%02x] %08x\n", ISP1362_REG_NO(ISP1362_REG_HCDIRADDR),
2029 isp1362_read_reg32(isp1362_hcd, HCDIRADDR));
2030#if 0
2031 seq_printf(s, "HCDIRDATA [%02x] %04x\n", ISP1362_REG_NO(HCDIRDATA),
2032 isp1362_read_reg16(isp1362_hcd, HCDIRDATA));
2033#endif
2034 seq_printf(s, "HCISTLBUFSZ[%02x] %04x\n", ISP1362_REG_NO(ISP1362_REG_HCISTLBUFSZ),
2035 isp1362_read_reg16(isp1362_hcd, HCISTLBUFSZ));
2036 seq_printf(s, "HCISTLRATE [%02x] %04x\n", ISP1362_REG_NO(ISP1362_REG_HCISTLRATE),
2037 isp1362_read_reg16(isp1362_hcd, HCISTLRATE));
2038 seq_printf(s, "\n");
2039 seq_printf(s, "HCINTLBUFSZ[%02x] %04x\n", ISP1362_REG_NO(ISP1362_REG_HCINTLBUFSZ),
2040 isp1362_read_reg16(isp1362_hcd, HCINTLBUFSZ));
2041 seq_printf(s, "HCINTLBLKSZ[%02x] %04x\n", ISP1362_REG_NO(ISP1362_REG_HCINTLBLKSZ),
2042 isp1362_read_reg16(isp1362_hcd, HCINTLBLKSZ));
2043 seq_printf(s, "HCINTLDONE [%02x] %08x\n", ISP1362_REG_NO(ISP1362_REG_HCINTLDONE),
2044 isp1362_read_reg32(isp1362_hcd, HCINTLDONE));
2045 seq_printf(s, "HCINTLSKIP [%02x] %08x\n", ISP1362_REG_NO(ISP1362_REG_HCINTLSKIP),
2046 isp1362_read_reg32(isp1362_hcd, HCINTLSKIP));
2047 seq_printf(s, "HCINTLLAST [%02x] %08x\n", ISP1362_REG_NO(ISP1362_REG_HCINTLLAST),
2048 isp1362_read_reg32(isp1362_hcd, HCINTLLAST));
2049 seq_printf(s, "HCINTLCURR [%02x] %04x\n", ISP1362_REG_NO(ISP1362_REG_HCINTLCURR),
2050 isp1362_read_reg16(isp1362_hcd, HCINTLCURR));
2051 seq_printf(s, "\n");
2052 seq_printf(s, "HCATLBUFSZ [%02x] %04x\n", ISP1362_REG_NO(ISP1362_REG_HCATLBUFSZ),
2053 isp1362_read_reg16(isp1362_hcd, HCATLBUFSZ));
2054 seq_printf(s, "HCATLBLKSZ [%02x] %04x\n", ISP1362_REG_NO(ISP1362_REG_HCATLBLKSZ),
2055 isp1362_read_reg16(isp1362_hcd, HCATLBLKSZ));
2056#if 0
2057 seq_printf(s, "HCATLDONE [%02x] %08x\n", ISP1362_REG_NO(ISP1362_REG_HCATLDONE),
2058 isp1362_read_reg32(isp1362_hcd, HCATLDONE));
2059#endif
2060 seq_printf(s, "HCATLSKIP [%02x] %08x\n", ISP1362_REG_NO(ISP1362_REG_HCATLSKIP),
2061 isp1362_read_reg32(isp1362_hcd, HCATLSKIP));
2062 seq_printf(s, "HCATLLAST [%02x] %08x\n", ISP1362_REG_NO(ISP1362_REG_HCATLLAST),
2063 isp1362_read_reg32(isp1362_hcd, HCATLLAST));
2064 seq_printf(s, "HCATLCURR [%02x] %04x\n", ISP1362_REG_NO(ISP1362_REG_HCATLCURR),
2065 isp1362_read_reg16(isp1362_hcd, HCATLCURR));
2066 seq_printf(s, "\n");
2067 seq_printf(s, "HCATLDTC [%02x] %04x\n", ISP1362_REG_NO(ISP1362_REG_HCATLDTC),
2068 isp1362_read_reg16(isp1362_hcd, HCATLDTC));
2069 seq_printf(s, "HCATLDTCTO [%02x] %04x\n", ISP1362_REG_NO(ISP1362_REG_HCATLDTCTO),
2070 isp1362_read_reg16(isp1362_hcd, HCATLDTCTO));
2071}
2072
2073static int proc_isp1362_show(struct seq_file *s, void *unused)
2074{
2075 struct isp1362_hcd *isp1362_hcd = s->private;
2076 struct isp1362_ep *ep;
2077 int i;
2078
2079 seq_printf(s, "%s\n%s version %s\n",
2080 isp1362_hcd_to_hcd(isp1362_hcd)->product_desc, hcd_name, DRIVER_VERSION);
2081
2082
2083
2084
2085 seq_printf(s, "alignment: 16b/%ld 8b/%ld 4b/%ld 2b/%ld 1b/%ld\n",
2086 isp1362_hcd->stat16, isp1362_hcd->stat8, isp1362_hcd->stat4,
2087 isp1362_hcd->stat2, isp1362_hcd->stat1);
2088 seq_printf(s, "max # ptds in ATL fifo: %d\n", isp1362_hcd->atl_queue.stat_maxptds);
2089 seq_printf(s, "max # ptds in INTL fifo: %d\n", isp1362_hcd->intl_queue.stat_maxptds);
2090 seq_printf(s, "max # ptds in ISTL fifo: %d\n",
2091 max(isp1362_hcd->istl_queue[0] .stat_maxptds,
2092 isp1362_hcd->istl_queue[1] .stat_maxptds));
2093
2094
2095 spin_lock_irq(&isp1362_hcd->lock);
2096
2097 dump_irq(s, "hc_irq_enable", isp1362_read_reg16(isp1362_hcd, HCuPINTENB));
2098 dump_irq(s, "hc_irq_status", isp1362_read_reg16(isp1362_hcd, HCuPINT));
2099 dump_int(s, "ohci_int_enable", isp1362_read_reg32(isp1362_hcd, HCINTENB));
2100 dump_int(s, "ohci_int_status", isp1362_read_reg32(isp1362_hcd, HCINTSTAT));
2101 dump_ctrl(s, "ohci_control", isp1362_read_reg32(isp1362_hcd, HCCONTROL));
2102
2103 for (i = 0; i < NUM_ISP1362_IRQS; i++)
2104 if (isp1362_hcd->irq_stat[i])
2105 seq_printf(s, "%-15s: %d\n",
2106 ISP1362_INT_NAME(i), isp1362_hcd->irq_stat[i]);
2107
2108 dump_regs(s, isp1362_hcd);
2109 list_for_each_entry(ep, &isp1362_hcd->async, schedule) {
2110 struct urb *urb;
2111
2112 seq_printf(s, "%p, ep%d%s, maxpacket %d:\n", ep, ep->epnum,
2113 ({
2114 char *s;
2115 switch (ep->nextpid) {
2116 case USB_PID_IN:
2117 s = "in";
2118 break;
2119 case USB_PID_OUT:
2120 s = "out";
2121 break;
2122 case USB_PID_SETUP:
2123 s = "setup";
2124 break;
2125 case USB_PID_ACK:
2126 s = "status";
2127 break;
2128 default:
2129 s = "?";
2130 break;
2131 };
2132 s;}), ep->maxpacket) ;
2133 list_for_each_entry(urb, &ep->hep->urb_list, urb_list) {
2134 seq_printf(s, " urb%p, %d/%d\n", urb,
2135 urb->actual_length,
2136 urb->transfer_buffer_length);
2137 }
2138 }
2139 if (!list_empty(&isp1362_hcd->async))
2140 seq_printf(s, "\n");
2141 dump_ptd_queue(&isp1362_hcd->atl_queue);
2142
2143 seq_printf(s, "periodic size= %d\n", PERIODIC_SIZE);
2144
2145 list_for_each_entry(ep, &isp1362_hcd->periodic, schedule) {
2146 seq_printf(s, "branch:%2d load:%3d PTD[%d] $%04x:\n", ep->branch,
2147 isp1362_hcd->load[ep->branch], ep->ptd_index, ep->ptd_offset);
2148
2149 seq_printf(s, " %d/%p (%sdev%d ep%d%s max %d)\n",
2150 ep->interval, ep,
2151 (ep->udev->speed == USB_SPEED_FULL) ? "" : "ls ",
2152 ep->udev->devnum, ep->epnum,
2153 (ep->epnum == 0) ? "" :
2154 ((ep->nextpid == USB_PID_IN) ?
2155 "in" : "out"), ep->maxpacket);
2156 }
2157 dump_ptd_queue(&isp1362_hcd->intl_queue);
2158
2159 seq_printf(s, "ISO:\n");
2160
2161 list_for_each_entry(ep, &isp1362_hcd->isoc, schedule) {
2162 seq_printf(s, " %d/%p (%sdev%d ep%d%s max %d)\n",
2163 ep->interval, ep,
2164 (ep->udev->speed == USB_SPEED_FULL) ? "" : "ls ",
2165 ep->udev->devnum, ep->epnum,
2166 (ep->epnum == 0) ? "" :
2167 ((ep->nextpid == USB_PID_IN) ?
2168 "in" : "out"), ep->maxpacket);
2169 }
2170
2171 spin_unlock_irq(&isp1362_hcd->lock);
2172 seq_printf(s, "\n");
2173
2174 return 0;
2175}
2176
2177static int proc_isp1362_open(struct inode *inode, struct file *file)
2178{
2179 return single_open(file, proc_isp1362_show, PDE(inode)->data);
2180}
2181
2182static const struct file_operations proc_ops = {
2183 .open = proc_isp1362_open,
2184 .read = seq_read,
2185 .llseek = seq_lseek,
2186 .release = single_release,
2187};
2188
2189
2190static const char proc_filename[] = "driver/isp1362";
2191
2192static void create_debug_file(struct isp1362_hcd *isp1362_hcd)
2193{
2194 struct proc_dir_entry *pde;
2195
2196 pde = create_proc_entry(proc_filename, 0, NULL);
2197 if (pde == NULL) {
2198 pr_warning("%s: Failed to create debug file '%s'\n", __func__, proc_filename);
2199 return;
2200 }
2201
2202 pde->proc_fops = &proc_ops;
2203 pde->data = isp1362_hcd;
2204 isp1362_hcd->pde = pde;
2205}
2206
2207static void remove_debug_file(struct isp1362_hcd *isp1362_hcd)
2208{
2209 if (isp1362_hcd->pde)
2210 remove_proc_entry(proc_filename, NULL);
2211}
2212
2213#endif
2214
2215
2216
2217static void __isp1362_sw_reset(struct isp1362_hcd *isp1362_hcd)
2218{
2219 int tmp = 20;
2220
2221 isp1362_write_reg16(isp1362_hcd, HCSWRES, HCSWRES_MAGIC);
2222 isp1362_write_reg32(isp1362_hcd, HCCMDSTAT, OHCI_HCR);
2223 while (--tmp) {
2224 mdelay(1);
2225 if (!(isp1362_read_reg32(isp1362_hcd, HCCMDSTAT) & OHCI_HCR))
2226 break;
2227 }
2228 if (!tmp)
2229 pr_err("Software reset timeout\n");
2230}
2231
2232static void isp1362_sw_reset(struct isp1362_hcd *isp1362_hcd)
2233{
2234 unsigned long flags;
2235
2236 spin_lock_irqsave(&isp1362_hcd->lock, flags);
2237 __isp1362_sw_reset(isp1362_hcd);
2238 spin_unlock_irqrestore(&isp1362_hcd->lock, flags);
2239}
2240
2241static int isp1362_mem_config(struct usb_hcd *hcd)
2242{
2243 struct isp1362_hcd *isp1362_hcd = hcd_to_isp1362_hcd(hcd);
2244 unsigned long flags;
2245 u32 total;
2246 u16 istl_size = ISP1362_ISTL_BUFSIZE;
2247 u16 intl_blksize = ISP1362_INTL_BLKSIZE + PTD_HEADER_SIZE;
2248 u16 intl_size = ISP1362_INTL_BUFFERS * intl_blksize;
2249 u16 atl_blksize = ISP1362_ATL_BLKSIZE + PTD_HEADER_SIZE;
2250 u16 atl_buffers = (ISP1362_BUF_SIZE - (istl_size + intl_size)) / atl_blksize;
2251 u16 atl_size;
2252 int i;
2253
2254 WARN_ON(istl_size & 3);
2255 WARN_ON(atl_blksize & 3);
2256 WARN_ON(intl_blksize & 3);
2257 WARN_ON(atl_blksize < PTD_HEADER_SIZE);
2258 WARN_ON(intl_blksize < PTD_HEADER_SIZE);
2259
2260 BUG_ON((unsigned)ISP1362_INTL_BUFFERS > 32);
2261 if (atl_buffers > 32)
2262 atl_buffers = 32;
2263 atl_size = atl_buffers * atl_blksize;
2264 total = atl_size + intl_size + istl_size;
2265 dev_info(hcd->self.controller, "ISP1362 Memory usage:\n");
2266 dev_info(hcd->self.controller, " ISTL: 2 * %4d: %4d @ $%04x:$%04x\n",
2267 istl_size / 2, istl_size, 0, istl_size / 2);
2268 dev_info(hcd->self.controller, " INTL: %4d * (%3zu+8): %4d @ $%04x\n",
2269 ISP1362_INTL_BUFFERS, intl_blksize - PTD_HEADER_SIZE,
2270 intl_size, istl_size);
2271 dev_info(hcd->self.controller, " ATL : %4d * (%3zu+8): %4d @ $%04x\n",
2272 atl_buffers, atl_blksize - PTD_HEADER_SIZE,
2273 atl_size, istl_size + intl_size);
2274 dev_info(hcd->self.controller, " USED/FREE: %4d %4d\n", total,
2275 ISP1362_BUF_SIZE - total);
2276
2277 if (total > ISP1362_BUF_SIZE) {
2278 dev_err(hcd->self.controller, "%s: Memory requested: %d, available %d\n",
2279 __func__, total, ISP1362_BUF_SIZE);
2280 return -ENOMEM;
2281 }
2282
2283 total = istl_size + intl_size + atl_size;
2284 spin_lock_irqsave(&isp1362_hcd->lock, flags);
2285
2286 for (i = 0; i < 2; i++) {
2287 isp1362_hcd->istl_queue[i].buf_start = i * istl_size / 2,
2288 isp1362_hcd->istl_queue[i].buf_size = istl_size / 2;
2289 isp1362_hcd->istl_queue[i].blk_size = 4;
2290 INIT_LIST_HEAD(&isp1362_hcd->istl_queue[i].active);
2291 snprintf(isp1362_hcd->istl_queue[i].name,
2292 sizeof(isp1362_hcd->istl_queue[i].name), "ISTL%d", i);
2293 DBG(3, "%s: %5s buf $%04x %d\n", __func__,
2294 isp1362_hcd->istl_queue[i].name,
2295 isp1362_hcd->istl_queue[i].buf_start,
2296 isp1362_hcd->istl_queue[i].buf_size);
2297 }
2298 isp1362_write_reg16(isp1362_hcd, HCISTLBUFSZ, istl_size / 2);
2299
2300 isp1362_hcd->intl_queue.buf_start = istl_size;
2301 isp1362_hcd->intl_queue.buf_size = intl_size;
2302 isp1362_hcd->intl_queue.buf_count = ISP1362_INTL_BUFFERS;
2303 isp1362_hcd->intl_queue.blk_size = intl_blksize;
2304 isp1362_hcd->intl_queue.buf_avail = isp1362_hcd->intl_queue.buf_count;
2305 isp1362_hcd->intl_queue.skip_map = ~0;
2306 INIT_LIST_HEAD(&isp1362_hcd->intl_queue.active);
2307
2308 isp1362_write_reg16(isp1362_hcd, HCINTLBUFSZ,
2309 isp1362_hcd->intl_queue.buf_size);
2310 isp1362_write_reg16(isp1362_hcd, HCINTLBLKSZ,
2311 isp1362_hcd->intl_queue.blk_size - PTD_HEADER_SIZE);
2312 isp1362_write_reg32(isp1362_hcd, HCINTLSKIP, ~0);
2313 isp1362_write_reg32(isp1362_hcd, HCINTLLAST,
2314 1 << (ISP1362_INTL_BUFFERS - 1));
2315
2316 isp1362_hcd->atl_queue.buf_start = istl_size + intl_size;
2317 isp1362_hcd->atl_queue.buf_size = atl_size;
2318 isp1362_hcd->atl_queue.buf_count = atl_buffers;
2319 isp1362_hcd->atl_queue.blk_size = atl_blksize;
2320 isp1362_hcd->atl_queue.buf_avail = isp1362_hcd->atl_queue.buf_count;
2321 isp1362_hcd->atl_queue.skip_map = ~0;
2322 INIT_LIST_HEAD(&isp1362_hcd->atl_queue.active);
2323
2324 isp1362_write_reg16(isp1362_hcd, HCATLBUFSZ,
2325 isp1362_hcd->atl_queue.buf_size);
2326 isp1362_write_reg16(isp1362_hcd, HCATLBLKSZ,
2327 isp1362_hcd->atl_queue.blk_size - PTD_HEADER_SIZE);
2328 isp1362_write_reg32(isp1362_hcd, HCATLSKIP, ~0);
2329 isp1362_write_reg32(isp1362_hcd, HCATLLAST,
2330 1 << (atl_buffers - 1));
2331
2332 snprintf(isp1362_hcd->atl_queue.name,
2333 sizeof(isp1362_hcd->atl_queue.name), "ATL");
2334 snprintf(isp1362_hcd->intl_queue.name,
2335 sizeof(isp1362_hcd->intl_queue.name), "INTL");
2336 DBG(3, "%s: %5s buf $%04x %2d * %4d = %4d\n", __func__,
2337 isp1362_hcd->intl_queue.name,
2338 isp1362_hcd->intl_queue.buf_start,
2339 ISP1362_INTL_BUFFERS, isp1362_hcd->intl_queue.blk_size,
2340 isp1362_hcd->intl_queue.buf_size);
2341 DBG(3, "%s: %5s buf $%04x %2d * %4d = %4d\n", __func__,
2342 isp1362_hcd->atl_queue.name,
2343 isp1362_hcd->atl_queue.buf_start,
2344 atl_buffers, isp1362_hcd->atl_queue.blk_size,
2345 isp1362_hcd->atl_queue.buf_size);
2346
2347 spin_unlock_irqrestore(&isp1362_hcd->lock, flags);
2348
2349 return 0;
2350}
2351
2352static int isp1362_hc_reset(struct usb_hcd *hcd)
2353{
2354 int ret = 0;
2355 struct isp1362_hcd *isp1362_hcd = hcd_to_isp1362_hcd(hcd);
2356 unsigned long t;
2357 unsigned long timeout = 100;
2358 unsigned long flags;
2359 int clkrdy = 0;
2360
2361 pr_debug("%s:\n", __func__);
2362
2363 if (isp1362_hcd->board && isp1362_hcd->board->reset) {
2364 isp1362_hcd->board->reset(hcd->self.controller, 1);
2365 msleep(20);
2366 if (isp1362_hcd->board->clock)
2367 isp1362_hcd->board->clock(hcd->self.controller, 1);
2368 isp1362_hcd->board->reset(hcd->self.controller, 0);
2369 } else
2370 isp1362_sw_reset(isp1362_hcd);
2371
2372
2373 t = jiffies + msecs_to_jiffies(timeout);
2374 while (!clkrdy && time_before_eq(jiffies, t)) {
2375 spin_lock_irqsave(&isp1362_hcd->lock, flags);
2376 clkrdy = isp1362_read_reg16(isp1362_hcd, HCuPINT) & HCuPINT_CLKRDY;
2377 spin_unlock_irqrestore(&isp1362_hcd->lock, flags);
2378 if (!clkrdy)
2379 msleep(4);
2380 }
2381
2382 spin_lock_irqsave(&isp1362_hcd->lock, flags);
2383 isp1362_write_reg16(isp1362_hcd, HCuPINT, HCuPINT_CLKRDY);
2384 spin_unlock_irqrestore(&isp1362_hcd->lock, flags);
2385 if (!clkrdy) {
2386 pr_err("Clock not ready after %lums\n", timeout);
2387 ret = -ENODEV;
2388 }
2389 return ret;
2390}
2391
2392static void isp1362_hc_stop(struct usb_hcd *hcd)
2393{
2394 struct isp1362_hcd *isp1362_hcd = hcd_to_isp1362_hcd(hcd);
2395 unsigned long flags;
2396 u32 tmp;
2397
2398 pr_debug("%s:\n", __func__);
2399
2400 del_timer_sync(&hcd->rh_timer);
2401
2402 spin_lock_irqsave(&isp1362_hcd->lock, flags);
2403
2404 isp1362_write_reg16(isp1362_hcd, HCuPINTENB, 0);
2405
2406
2407 tmp = isp1362_read_reg32(isp1362_hcd, HCRHDESCA);
2408 tmp &= ~(RH_A_NPS | RH_A_PSM);
2409 isp1362_write_reg32(isp1362_hcd, HCRHDESCA, tmp);
2410 isp1362_write_reg32(isp1362_hcd, HCRHSTATUS, RH_HS_LPS);
2411
2412
2413 if (isp1362_hcd->board && isp1362_hcd->board->reset)
2414 isp1362_hcd->board->reset(hcd->self.controller, 1);
2415 else
2416 __isp1362_sw_reset(isp1362_hcd);
2417
2418 if (isp1362_hcd->board && isp1362_hcd->board->clock)
2419 isp1362_hcd->board->clock(hcd->self.controller, 0);
2420
2421 spin_unlock_irqrestore(&isp1362_hcd->lock, flags);
2422}
2423
2424#ifdef CHIP_BUFFER_TEST
2425static int isp1362_chip_test(struct isp1362_hcd *isp1362_hcd)
2426{
2427 int ret = 0;
2428 u16 *ref;
2429 unsigned long flags;
2430
2431 ref = kmalloc(2 * ISP1362_BUF_SIZE, GFP_KERNEL);
2432 if (ref) {
2433 int offset;
2434 u16 *tst = &ref[ISP1362_BUF_SIZE / 2];
2435
2436 for (offset = 0; offset < ISP1362_BUF_SIZE / 2; offset++) {
2437 ref[offset] = ~offset;
2438 tst[offset] = offset;
2439 }
2440
2441 for (offset = 0; offset < 4; offset++) {
2442 int j;
2443
2444 for (j = 0; j < 8; j++) {
2445 spin_lock_irqsave(&isp1362_hcd->lock, flags);
2446 isp1362_write_buffer(isp1362_hcd, (u8 *)ref + offset, 0, j);
2447 isp1362_read_buffer(isp1362_hcd, (u8 *)tst + offset, 0, j);
2448 spin_unlock_irqrestore(&isp1362_hcd->lock, flags);
2449
2450 if (memcmp(ref, tst, j)) {
2451 ret = -ENODEV;
2452 pr_err("%s: memory check with %d byte offset %d failed\n",
2453 __func__, j, offset);
2454 dump_data((u8 *)ref + offset, j);
2455 dump_data((u8 *)tst + offset, j);
2456 }
2457 }
2458 }
2459
2460 spin_lock_irqsave(&isp1362_hcd->lock, flags);
2461 isp1362_write_buffer(isp1362_hcd, ref, 0, ISP1362_BUF_SIZE);
2462 isp1362_read_buffer(isp1362_hcd, tst, 0, ISP1362_BUF_SIZE);
2463 spin_unlock_irqrestore(&isp1362_hcd->lock, flags);
2464
2465 if (memcmp(ref, tst, ISP1362_BUF_SIZE)) {
2466 ret = -ENODEV;
2467 pr_err("%s: memory check failed\n", __func__);
2468 dump_data((u8 *)tst, ISP1362_BUF_SIZE / 2);
2469 }
2470
2471 for (offset = 0; offset < 256; offset++) {
2472 int test_size = 0;
2473
2474 yield();
2475
2476 memset(tst, 0, ISP1362_BUF_SIZE);
2477 spin_lock_irqsave(&isp1362_hcd->lock, flags);
2478 isp1362_write_buffer(isp1362_hcd, tst, 0, ISP1362_BUF_SIZE);
2479 isp1362_read_buffer(isp1362_hcd, tst, 0, ISP1362_BUF_SIZE);
2480 spin_unlock_irqrestore(&isp1362_hcd->lock, flags);
2481 if (memcmp(tst, tst + (ISP1362_BUF_SIZE / (2 * sizeof(*tst))),
2482 ISP1362_BUF_SIZE / 2)) {
2483 pr_err("%s: Failed to clear buffer\n", __func__);
2484 dump_data((u8 *)tst, ISP1362_BUF_SIZE);
2485 break;
2486 }
2487 spin_lock_irqsave(&isp1362_hcd->lock, flags);
2488 isp1362_write_buffer(isp1362_hcd, ref, offset * 2, PTD_HEADER_SIZE);
2489 isp1362_write_buffer(isp1362_hcd, ref + PTD_HEADER_SIZE / sizeof(*ref),
2490 offset * 2 + PTD_HEADER_SIZE, test_size);
2491 isp1362_read_buffer(isp1362_hcd, tst, offset * 2,
2492 PTD_HEADER_SIZE + test_size);
2493 spin_unlock_irqrestore(&isp1362_hcd->lock, flags);
2494 if (memcmp(ref, tst, PTD_HEADER_SIZE + test_size)) {
2495 dump_data(((u8 *)ref) + offset, PTD_HEADER_SIZE + test_size);
2496 dump_data((u8 *)tst, PTD_HEADER_SIZE + test_size);
2497 spin_lock_irqsave(&isp1362_hcd->lock, flags);
2498 isp1362_read_buffer(isp1362_hcd, tst, offset * 2,
2499 PTD_HEADER_SIZE + test_size);
2500 spin_unlock_irqrestore(&isp1362_hcd->lock, flags);
2501 if (memcmp(ref, tst, PTD_HEADER_SIZE + test_size)) {
2502 ret = -ENODEV;
2503 pr_err("%s: memory check with offset %02x failed\n",
2504 __func__, offset);
2505 break;
2506 }
2507 pr_warning("%s: memory check with offset %02x ok after second read\n",
2508 __func__, offset);
2509 }
2510 }
2511 kfree(ref);
2512 }
2513 return ret;
2514}
2515#endif
2516
2517static int isp1362_hc_start(struct usb_hcd *hcd)
2518{
2519 int ret;
2520 struct isp1362_hcd *isp1362_hcd = hcd_to_isp1362_hcd(hcd);
2521 struct isp1362_platform_data *board = isp1362_hcd->board;
2522 u16 hwcfg;
2523 u16 chipid;
2524 unsigned long flags;
2525
2526 pr_debug("%s:\n", __func__);
2527
2528 spin_lock_irqsave(&isp1362_hcd->lock, flags);
2529 chipid = isp1362_read_reg16(isp1362_hcd, HCCHIPID);
2530 spin_unlock_irqrestore(&isp1362_hcd->lock, flags);
2531
2532 if ((chipid & HCCHIPID_MASK) != HCCHIPID_MAGIC) {
2533 pr_err("%s: Invalid chip ID %04x\n", __func__, chipid);
2534 return -ENODEV;
2535 }
2536
2537#ifdef CHIP_BUFFER_TEST
2538 ret = isp1362_chip_test(isp1362_hcd);
2539 if (ret)
2540 return -ENODEV;
2541#endif
2542 spin_lock_irqsave(&isp1362_hcd->lock, flags);
2543
2544 isp1362_write_reg16(isp1362_hcd, HCuPINT, 0xff);
2545 isp1362_write_reg16(isp1362_hcd, HCuPINTENB, 0);
2546
2547
2548 hwcfg = HCHWCFG_INT_ENABLE | HCHWCFG_DBWIDTH(1);
2549 if (board->sel15Kres)
2550 hwcfg |= HCHWCFG_PULLDOWN_DS2 |
2551 ((MAX_ROOT_PORTS > 1) ? HCHWCFG_PULLDOWN_DS1 : 0);
2552 if (board->clknotstop)
2553 hwcfg |= HCHWCFG_CLKNOTSTOP;
2554 if (board->oc_enable)
2555 hwcfg |= HCHWCFG_ANALOG_OC;
2556 if (board->int_act_high)
2557 hwcfg |= HCHWCFG_INT_POL;
2558 if (board->int_edge_triggered)
2559 hwcfg |= HCHWCFG_INT_TRIGGER;
2560 if (board->dreq_act_high)
2561 hwcfg |= HCHWCFG_DREQ_POL;
2562 if (board->dack_act_high)
2563 hwcfg |= HCHWCFG_DACK_POL;
2564 isp1362_write_reg16(isp1362_hcd, HCHWCFG, hwcfg);
2565 isp1362_show_reg(isp1362_hcd, HCHWCFG);
2566 isp1362_write_reg16(isp1362_hcd, HCDMACFG, 0);
2567 spin_unlock_irqrestore(&isp1362_hcd->lock, flags);
2568
2569 ret = isp1362_mem_config(hcd);
2570 if (ret)
2571 return ret;
2572
2573 spin_lock_irqsave(&isp1362_hcd->lock, flags);
2574
2575
2576 isp1362_hcd->rhdesca = 0;
2577 if (board->no_power_switching)
2578 isp1362_hcd->rhdesca |= RH_A_NPS;
2579 if (board->power_switching_mode)
2580 isp1362_hcd->rhdesca |= RH_A_PSM;
2581 if (board->potpg)
2582 isp1362_hcd->rhdesca |= (board->potpg << 24) & RH_A_POTPGT;
2583 else
2584 isp1362_hcd->rhdesca |= (25 << 24) & RH_A_POTPGT;
2585
2586 isp1362_write_reg32(isp1362_hcd, HCRHDESCA, isp1362_hcd->rhdesca & ~RH_A_OCPM);
2587 isp1362_write_reg32(isp1362_hcd, HCRHDESCA, isp1362_hcd->rhdesca | RH_A_OCPM);
2588 isp1362_hcd->rhdesca = isp1362_read_reg32(isp1362_hcd, HCRHDESCA);
2589
2590 isp1362_hcd->rhdescb = RH_B_PPCM;
2591 isp1362_write_reg32(isp1362_hcd, HCRHDESCB, isp1362_hcd->rhdescb);
2592 isp1362_hcd->rhdescb = isp1362_read_reg32(isp1362_hcd, HCRHDESCB);
2593
2594 isp1362_read_reg32(isp1362_hcd, HCFMINTVL);
2595 isp1362_write_reg32(isp1362_hcd, HCFMINTVL, (FSMP(FI) << 16) | FI);
2596 isp1362_write_reg32(isp1362_hcd, HCLSTHRESH, LSTHRESH);
2597
2598 spin_unlock_irqrestore(&isp1362_hcd->lock, flags);
2599
2600 isp1362_hcd->hc_control = OHCI_USB_OPER;
2601 hcd->state = HC_STATE_RUNNING;
2602
2603 spin_lock_irqsave(&isp1362_hcd->lock, flags);
2604
2605 isp1362_hcd->intenb = OHCI_INTR_MIE | OHCI_INTR_RHSC | OHCI_INTR_UE;
2606 isp1362_hcd->intenb |= OHCI_INTR_RD;
2607 isp1362_hcd->irqenb = HCuPINT_OPR | HCuPINT_SUSP;
2608 isp1362_write_reg32(isp1362_hcd, HCINTENB, isp1362_hcd->intenb);
2609 isp1362_write_reg16(isp1362_hcd, HCuPINTENB, isp1362_hcd->irqenb);
2610
2611
2612 isp1362_write_reg32(isp1362_hcd, HCCONTROL, isp1362_hcd->hc_control);
2613
2614 isp1362_write_reg32(isp1362_hcd, HCRHSTATUS, RH_HS_LPSC | RH_HS_DRWE);
2615
2616 spin_unlock_irqrestore(&isp1362_hcd->lock, flags);
2617
2618 return 0;
2619}
2620
2621
2622
2623static struct hc_driver isp1362_hc_driver = {
2624 .description = hcd_name,
2625 .product_desc = "ISP1362 Host Controller",
2626 .hcd_priv_size = sizeof(struct isp1362_hcd),
2627
2628 .irq = isp1362_irq,
2629 .flags = HCD_USB11 | HCD_MEMORY,
2630
2631 .reset = isp1362_hc_reset,
2632 .start = isp1362_hc_start,
2633 .stop = isp1362_hc_stop,
2634
2635 .urb_enqueue = isp1362_urb_enqueue,
2636 .urb_dequeue = isp1362_urb_dequeue,
2637 .endpoint_disable = isp1362_endpoint_disable,
2638
2639 .get_frame_number = isp1362_get_frame,
2640
2641 .hub_status_data = isp1362_hub_status_data,
2642 .hub_control = isp1362_hub_control,
2643 .bus_suspend = isp1362_bus_suspend,
2644 .bus_resume = isp1362_bus_resume,
2645};
2646
2647
2648
2649static int __devexit isp1362_remove(struct platform_device *pdev)
2650{
2651 struct usb_hcd *hcd = platform_get_drvdata(pdev);
2652 struct isp1362_hcd *isp1362_hcd = hcd_to_isp1362_hcd(hcd);
2653 struct resource *res;
2654
2655 remove_debug_file(isp1362_hcd);
2656 DBG(0, "%s: Removing HCD\n", __func__);
2657 usb_remove_hcd(hcd);
2658
2659 DBG(0, "%s: Unmapping data_reg @ %p\n", __func__,
2660 isp1362_hcd->data_reg);
2661 iounmap(isp1362_hcd->data_reg);
2662
2663 DBG(0, "%s: Unmapping addr_reg @ %p\n", __func__,
2664 isp1362_hcd->addr_reg);
2665 iounmap(isp1362_hcd->addr_reg);
2666
2667 res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
2668 DBG(0, "%s: release mem_region: %08lx\n", __func__, (long unsigned int)res->start);
2669 if (res)
2670 release_mem_region(res->start, resource_size(res));
2671
2672 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
2673 DBG(0, "%s: release mem_region: %08lx\n", __func__, (long unsigned int)res->start);
2674 if (res)
2675 release_mem_region(res->start, resource_size(res));
2676
2677 DBG(0, "%s: put_hcd\n", __func__);
2678 usb_put_hcd(hcd);
2679 DBG(0, "%s: Done\n", __func__);
2680
2681 return 0;
2682}
2683
2684static int __devinit isp1362_probe(struct platform_device *pdev)
2685{
2686 struct usb_hcd *hcd;
2687 struct isp1362_hcd *isp1362_hcd;
2688 struct resource *addr, *data;
2689 void __iomem *addr_reg;
2690 void __iomem *data_reg;
2691 int irq;
2692 int retval = 0;
2693 struct resource *irq_res;
2694 unsigned int irq_flags = 0;
2695
2696
2697
2698
2699
2700
2701 if (pdev->num_resources < 3) {
2702 retval = -ENODEV;
2703 goto err1;
2704 }
2705
2706 data = platform_get_resource(pdev, IORESOURCE_MEM, 0);
2707 addr = platform_get_resource(pdev, IORESOURCE_MEM, 1);
2708 irq_res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
2709 if (!addr || !data || !irq_res) {
2710 retval = -ENODEV;
2711 goto err1;
2712 }
2713 irq = irq_res->start;
2714
2715 if (pdev->dev.dma_mask) {
2716 DBG(1, "won't do DMA");
2717 retval = -ENODEV;
2718 goto err1;
2719 }
2720
2721 if (!request_mem_region(addr->start, resource_size(addr), hcd_name)) {
2722 retval = -EBUSY;
2723 goto err1;
2724 }
2725 addr_reg = ioremap(addr->start, resource_size(addr));
2726 if (addr_reg == NULL) {
2727 retval = -ENOMEM;
2728 goto err2;
2729 }
2730
2731 if (!request_mem_region(data->start, resource_size(data), hcd_name)) {
2732 retval = -EBUSY;
2733 goto err3;
2734 }
2735 data_reg = ioremap(data->start, resource_size(data));
2736 if (data_reg == NULL) {
2737 retval = -ENOMEM;
2738 goto err4;
2739 }
2740
2741
2742 hcd = usb_create_hcd(&isp1362_hc_driver, &pdev->dev, dev_name(&pdev->dev));
2743 if (!hcd) {
2744 retval = -ENOMEM;
2745 goto err5;
2746 }
2747 hcd->rsrc_start = data->start;
2748 isp1362_hcd = hcd_to_isp1362_hcd(hcd);
2749 isp1362_hcd->data_reg = data_reg;
2750 isp1362_hcd->addr_reg = addr_reg;
2751
2752 isp1362_hcd->next_statechange = jiffies;
2753 spin_lock_init(&isp1362_hcd->lock);
2754 INIT_LIST_HEAD(&isp1362_hcd->async);
2755 INIT_LIST_HEAD(&isp1362_hcd->periodic);
2756 INIT_LIST_HEAD(&isp1362_hcd->isoc);
2757 INIT_LIST_HEAD(&isp1362_hcd->remove_list);
2758 isp1362_hcd->board = pdev->dev.platform_data;
2759#if USE_PLATFORM_DELAY
2760 if (!isp1362_hcd->board->delay) {
2761 dev_err(hcd->self.controller, "No platform delay function given\n");
2762 retval = -ENODEV;
2763 goto err6;
2764 }
2765#endif
2766
2767 if (irq_res->flags & IORESOURCE_IRQ_HIGHEDGE)
2768 irq_flags |= IRQF_TRIGGER_RISING;
2769 if (irq_res->flags & IORESOURCE_IRQ_LOWEDGE)
2770 irq_flags |= IRQF_TRIGGER_FALLING;
2771 if (irq_res->flags & IORESOURCE_IRQ_HIGHLEVEL)
2772 irq_flags |= IRQF_TRIGGER_HIGH;
2773 if (irq_res->flags & IORESOURCE_IRQ_LOWLEVEL)
2774 irq_flags |= IRQF_TRIGGER_LOW;
2775
2776 retval = usb_add_hcd(hcd, irq, irq_flags | IRQF_SHARED);
2777 if (retval != 0)
2778 goto err6;
2779 pr_info("%s, irq %d\n", hcd->product_desc, irq);
2780
2781 create_debug_file(isp1362_hcd);
2782
2783 return 0;
2784
2785 err6:
2786 DBG(0, "%s: Freeing dev %p\n", __func__, isp1362_hcd);
2787 usb_put_hcd(hcd);
2788 err5:
2789 DBG(0, "%s: Unmapping data_reg @ %p\n", __func__, data_reg);
2790 iounmap(data_reg);
2791 err4:
2792 DBG(0, "%s: Releasing mem region %08lx\n", __func__, (long unsigned int)data->start);
2793 release_mem_region(data->start, resource_size(data));
2794 err3:
2795 DBG(0, "%s: Unmapping addr_reg @ %p\n", __func__, addr_reg);
2796 iounmap(addr_reg);
2797 err2:
2798 DBG(0, "%s: Releasing mem region %08lx\n", __func__, (long unsigned int)addr->start);
2799 release_mem_region(addr->start, resource_size(addr));
2800 err1:
2801 pr_err("%s: init error, %d\n", __func__, retval);
2802
2803 return retval;
2804}
2805
2806#ifdef CONFIG_PM
2807static int isp1362_suspend(struct platform_device *pdev, pm_message_t state)
2808{
2809 struct usb_hcd *hcd = platform_get_drvdata(pdev);
2810 struct isp1362_hcd *isp1362_hcd = hcd_to_isp1362_hcd(hcd);
2811 unsigned long flags;
2812 int retval = 0;
2813
2814 DBG(0, "%s: Suspending device\n", __func__);
2815
2816 if (state.event == PM_EVENT_FREEZE) {
2817 DBG(0, "%s: Suspending root hub\n", __func__);
2818 retval = isp1362_bus_suspend(hcd);
2819 } else {
2820 DBG(0, "%s: Suspending RH ports\n", __func__);
2821 spin_lock_irqsave(&isp1362_hcd->lock, flags);
2822 isp1362_write_reg32(isp1362_hcd, HCRHSTATUS, RH_HS_LPS);
2823 spin_unlock_irqrestore(&isp1362_hcd->lock, flags);
2824 }
2825 if (retval == 0)
2826 pdev->dev.power.power_state = state;
2827 return retval;
2828}
2829
2830static int isp1362_resume(struct platform_device *pdev)
2831{
2832 struct usb_hcd *hcd = platform_get_drvdata(pdev);
2833 struct isp1362_hcd *isp1362_hcd = hcd_to_isp1362_hcd(hcd);
2834 unsigned long flags;
2835
2836 DBG(0, "%s: Resuming\n", __func__);
2837
2838 if (pdev->dev.power.power_state.event == PM_EVENT_SUSPEND) {
2839 DBG(0, "%s: Resume RH ports\n", __func__);
2840 spin_lock_irqsave(&isp1362_hcd->lock, flags);
2841 isp1362_write_reg32(isp1362_hcd, HCRHSTATUS, RH_HS_LPSC);
2842 spin_unlock_irqrestore(&isp1362_hcd->lock, flags);
2843 return 0;
2844 }
2845
2846 pdev->dev.power.power_state = PMSG_ON;
2847
2848 return isp1362_bus_resume(isp1362_hcd_to_hcd(isp1362_hcd));
2849}
2850#else
2851#define isp1362_suspend NULL
2852#define isp1362_resume NULL
2853#endif
2854
2855static struct platform_driver isp1362_driver = {
2856 .probe = isp1362_probe,
2857 .remove = __devexit_p(isp1362_remove),
2858
2859 .suspend = isp1362_suspend,
2860 .resume = isp1362_resume,
2861 .driver = {
2862 .name = (char *)hcd_name,
2863 .owner = THIS_MODULE,
2864 },
2865};
2866
2867
2868
2869static int __init isp1362_init(void)
2870{
2871 if (usb_disabled())
2872 return -ENODEV;
2873 pr_info("driver %s, %s\n", hcd_name, DRIVER_VERSION);
2874 return platform_driver_register(&isp1362_driver);
2875}
2876module_init(isp1362_init);
2877
2878static void __exit isp1362_cleanup(void)
2879{
2880 platform_driver_unregister(&isp1362_driver);
2881}
2882module_exit(isp1362_cleanup);
2883