usb: renesas_usbhs: shrink spin lock area
[pandora-kernel.git] / drivers / usb / host / ehci-hub.c
1 /*
2  * Copyright (C) 2001-2004 by David Brownell
3  *
4  * This program is free software; you can redistribute it and/or modify it
5  * under the terms of the GNU General Public License as published by the
6  * Free Software Foundation; either version 2 of the License, or (at your
7  * option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful, but
10  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
11  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12  * for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17  */
18
19 /* this file is part of ehci-hcd.c */
20
21 /*-------------------------------------------------------------------------*/
22
23 /*
24  * EHCI Root Hub ... the nonsharable stuff
25  *
26  * Registers don't need cpu_to_le32, that happens transparently
27  */
28
29 /*-------------------------------------------------------------------------*/
30 #include <linux/usb/otg.h>
31
32 #define PORT_WAKE_BITS  (PORT_WKOC_E|PORT_WKDISC_E|PORT_WKCONN_E)
33
34 #ifdef  CONFIG_PM
35
36 static int ehci_hub_control(
37         struct usb_hcd  *hcd,
38         u16             typeReq,
39         u16             wValue,
40         u16             wIndex,
41         char            *buf,
42         u16             wLength
43 );
44
45 /* After a power loss, ports that were owned by the companion must be
46  * reset so that the companion can still own them.
47  */
48 static void ehci_handover_companion_ports(struct ehci_hcd *ehci)
49 {
50         u32 __iomem     *reg;
51         u32             status;
52         int             port;
53         __le32          buf;
54         struct usb_hcd  *hcd = ehci_to_hcd(ehci);
55
56         if (!ehci->owned_ports)
57                 return;
58
59         /* Give the connections some time to appear */
60         msleep(20);
61
62         port = HCS_N_PORTS(ehci->hcs_params);
63         while (port--) {
64                 if (test_bit(port, &ehci->owned_ports)) {
65                         reg = &ehci->regs->port_status[port];
66                         status = ehci_readl(ehci, reg) & ~PORT_RWC_BITS;
67
68                         /* Port already owned by companion? */
69                         if (status & PORT_OWNER)
70                                 clear_bit(port, &ehci->owned_ports);
71                         else if (test_bit(port, &ehci->companion_ports))
72                                 ehci_writel(ehci, status & ~PORT_PE, reg);
73                         else
74                                 ehci_hub_control(hcd, SetPortFeature,
75                                                 USB_PORT_FEAT_RESET, port + 1,
76                                                 NULL, 0);
77                 }
78         }
79
80         if (!ehci->owned_ports)
81                 return;
82         msleep(90);             /* Wait for resets to complete */
83
84         port = HCS_N_PORTS(ehci->hcs_params);
85         while (port--) {
86                 if (test_bit(port, &ehci->owned_ports)) {
87                         ehci_hub_control(hcd, GetPortStatus,
88                                         0, port + 1,
89                                         (char *) &buf, sizeof(buf));
90
91                         /* The companion should now own the port,
92                          * but if something went wrong the port must not
93                          * remain enabled.
94                          */
95                         reg = &ehci->regs->port_status[port];
96                         status = ehci_readl(ehci, reg) & ~PORT_RWC_BITS;
97                         if (status & PORT_OWNER)
98                                 ehci_writel(ehci, status | PORT_CSC, reg);
99                         else {
100                                 ehci_dbg(ehci, "failed handover port %d: %x\n",
101                                                 port + 1, status);
102                                 ehci_writel(ehci, status & ~PORT_PE, reg);
103                         }
104                 }
105         }
106
107         ehci->owned_ports = 0;
108 }
109
110 static int ehci_port_change(struct ehci_hcd *ehci)
111 {
112         int i = HCS_N_PORTS(ehci->hcs_params);
113
114         /* First check if the controller indicates a change event */
115
116         if (ehci_readl(ehci, &ehci->regs->status) & STS_PCD)
117                 return 1;
118
119         /*
120          * Not all controllers appear to update this while going from D3 to D0,
121          * so check the individual port status registers as well
122          */
123
124         while (i--)
125                 if (ehci_readl(ehci, &ehci->regs->port_status[i]) & PORT_CSC)
126                         return 1;
127
128         return 0;
129 }
130
131 static __maybe_unused void ehci_adjust_port_wakeup_flags(struct ehci_hcd *ehci,
132                 bool suspending, bool do_wakeup)
133 {
134         int             port;
135         u32             temp;
136         unsigned long   flags;
137
138         /* If remote wakeup is enabled for the root hub but disabled
139          * for the controller, we must adjust all the port wakeup flags
140          * when the controller is suspended or resumed.  In all other
141          * cases they don't need to be changed.
142          */
143         if (!ehci_to_hcd(ehci)->self.root_hub->do_remote_wakeup || do_wakeup)
144                 return;
145
146         spin_lock_irqsave(&ehci->lock, flags);
147
148         /* clear phy low-power mode before changing wakeup flags */
149         if (ehci->has_hostpc) {
150                 port = HCS_N_PORTS(ehci->hcs_params);
151                 while (port--) {
152                         u32 __iomem     *hostpc_reg;
153
154                         hostpc_reg = (u32 __iomem *)((u8 *) ehci->regs
155                                         + HOSTPC0 + 4 * port);
156                         temp = ehci_readl(ehci, hostpc_reg);
157                         ehci_writel(ehci, temp & ~HOSTPC_PHCD, hostpc_reg);
158                 }
159                 spin_unlock_irqrestore(&ehci->lock, flags);
160                 msleep(5);
161                 spin_lock_irqsave(&ehci->lock, flags);
162         }
163
164         port = HCS_N_PORTS(ehci->hcs_params);
165         while (port--) {
166                 u32 __iomem     *reg = &ehci->regs->port_status[port];
167                 u32             t1 = ehci_readl(ehci, reg) & ~PORT_RWC_BITS;
168                 u32             t2 = t1 & ~PORT_WAKE_BITS;
169
170                 /* If we are suspending the controller, clear the flags.
171                  * If we are resuming the controller, set the wakeup flags.
172                  */
173                 if (!suspending) {
174                         if (t1 & PORT_CONNECT)
175                                 t2 |= PORT_WKOC_E | PORT_WKDISC_E;
176                         else
177                                 t2 |= PORT_WKOC_E | PORT_WKCONN_E;
178                 }
179                 ehci_vdbg(ehci, "port %d, %08x -> %08x\n",
180                                 port + 1, t1, t2);
181                 ehci_writel(ehci, t2, reg);
182         }
183
184         /* enter phy low-power mode again */
185         if (ehci->has_hostpc) {
186                 port = HCS_N_PORTS(ehci->hcs_params);
187                 while (port--) {
188                         u32 __iomem     *hostpc_reg;
189
190                         hostpc_reg = (u32 __iomem *)((u8 *) ehci->regs
191                                         + HOSTPC0 + 4 * port);
192                         temp = ehci_readl(ehci, hostpc_reg);
193                         ehci_writel(ehci, temp | HOSTPC_PHCD, hostpc_reg);
194                 }
195         }
196
197         /* Does the root hub have a port wakeup pending? */
198         if (!suspending && ehci_port_change(ehci))
199                 usb_hcd_resume_root_hub(ehci_to_hcd(ehci));
200
201         spin_unlock_irqrestore(&ehci->lock, flags);
202 }
203
204 static int ehci_bus_suspend (struct usb_hcd *hcd)
205 {
206         struct ehci_hcd         *ehci = hcd_to_ehci (hcd);
207         int                     port;
208         int                     mask;
209         int                     changed;
210
211         ehci_dbg(ehci, "suspend root hub\n");
212
213         if (time_before (jiffies, ehci->next_statechange))
214                 msleep(5);
215         del_timer_sync(&ehci->watchdog);
216         del_timer_sync(&ehci->iaa_watchdog);
217
218         spin_lock_irq (&ehci->lock);
219
220         /* Once the controller is stopped, port resumes that are already
221          * in progress won't complete.  Hence if remote wakeup is enabled
222          * for the root hub and any ports are in the middle of a resume or
223          * remote wakeup, we must fail the suspend.
224          */
225         if (hcd->self.root_hub->do_remote_wakeup) {
226                 port = HCS_N_PORTS(ehci->hcs_params);
227                 while (port--) {
228                         if (ehci->reset_done[port] != 0) {
229                                 spin_unlock_irq(&ehci->lock);
230                                 ehci_dbg(ehci, "suspend failed because "
231                                                 "port %d is resuming\n",
232                                                 port + 1);
233                                 return -EBUSY;
234                         }
235                 }
236         }
237
238         /* stop schedules, clean any completed work */
239         if (HC_IS_RUNNING(hcd->state)) {
240                 ehci_quiesce (ehci);
241                 hcd->state = HC_STATE_QUIESCING;
242         }
243         ehci->command = ehci_readl(ehci, &ehci->regs->command);
244         ehci_work(ehci);
245
246         /* Unlike other USB host controller types, EHCI doesn't have
247          * any notion of "global" or bus-wide suspend.  The driver has
248          * to manually suspend all the active unsuspended ports, and
249          * then manually resume them in the bus_resume() routine.
250          */
251         ehci->bus_suspended = 0;
252         ehci->owned_ports = 0;
253         changed = 0;
254         port = HCS_N_PORTS(ehci->hcs_params);
255         while (port--) {
256                 u32 __iomem     *reg = &ehci->regs->port_status [port];
257                 u32             t1 = ehci_readl(ehci, reg) & ~PORT_RWC_BITS;
258                 u32             t2 = t1 & ~PORT_WAKE_BITS;
259
260                 /* keep track of which ports we suspend */
261                 if (t1 & PORT_OWNER)
262                         set_bit(port, &ehci->owned_ports);
263                 else if ((t1 & PORT_PE) && !(t1 & PORT_SUSPEND)) {
264                         t2 |= PORT_SUSPEND;
265                         set_bit(port, &ehci->bus_suspended);
266                 }
267
268                 /* enable remote wakeup on all ports, if told to do so */
269                 if (hcd->self.root_hub->do_remote_wakeup) {
270                         /* only enable appropriate wake bits, otherwise the
271                          * hardware can not go phy low power mode. If a race
272                          * condition happens here(connection change during bits
273                          * set), the port change detection will finally fix it.
274                          */
275                         if (t1 & PORT_CONNECT)
276                                 t2 |= PORT_WKOC_E | PORT_WKDISC_E;
277                         else
278                                 t2 |= PORT_WKOC_E | PORT_WKCONN_E;
279                 }
280
281                 if (t1 != t2) {
282                         ehci_vdbg (ehci, "port %d, %08x -> %08x\n",
283                                 port + 1, t1, t2);
284                         ehci_writel(ehci, t2, reg);
285                         changed = 1;
286                 }
287         }
288
289         if (changed && ehci->has_hostpc) {
290                 spin_unlock_irq(&ehci->lock);
291                 msleep(5);      /* 5 ms for HCD to enter low-power mode */
292                 spin_lock_irq(&ehci->lock);
293
294                 port = HCS_N_PORTS(ehci->hcs_params);
295                 while (port--) {
296                         u32 __iomem     *hostpc_reg;
297                         u32             t3;
298
299                         hostpc_reg = (u32 __iomem *)((u8 *) ehci->regs
300                                         + HOSTPC0 + 4 * port);
301                         t3 = ehci_readl(ehci, hostpc_reg);
302                         ehci_writel(ehci, t3 | HOSTPC_PHCD, hostpc_reg);
303                         t3 = ehci_readl(ehci, hostpc_reg);
304                         ehci_dbg(ehci, "Port %d phy low-power mode %s\n",
305                                         port, (t3 & HOSTPC_PHCD) ?
306                                         "succeeded" : "failed");
307                 }
308         }
309
310         /* Apparently some devices need a >= 1-uframe delay here */
311         if (ehci->bus_suspended)
312                 udelay(150);
313
314         /* turn off now-idle HC */
315         ehci_halt (ehci);
316         hcd->state = HC_STATE_SUSPENDED;
317
318         if (ehci->reclaim)
319                 end_unlink_async(ehci);
320
321         /* allow remote wakeup */
322         mask = INTR_MASK;
323         if (!hcd->self.root_hub->do_remote_wakeup)
324                 mask &= ~STS_PCD;
325         ehci_writel(ehci, mask, &ehci->regs->intr_enable);
326         ehci_readl(ehci, &ehci->regs->intr_enable);
327
328         ehci->next_statechange = jiffies + msecs_to_jiffies(10);
329         spin_unlock_irq (&ehci->lock);
330
331         /* ehci_work() may have re-enabled the watchdog timer, which we do not
332          * want, and so we must delete any pending watchdog timer events.
333          */
334         del_timer_sync(&ehci->watchdog);
335         return 0;
336 }
337
338
339 /* caller has locked the root hub, and should reset/reinit on error */
340 static int ehci_bus_resume (struct usb_hcd *hcd)
341 {
342         struct ehci_hcd         *ehci = hcd_to_ehci (hcd);
343         u32                     temp;
344         u32                     power_okay;
345         int                     i;
346         u8                      resume_needed = 0;
347
348         if (time_before (jiffies, ehci->next_statechange))
349                 msleep(5);
350         spin_lock_irq (&ehci->lock);
351         if (!HCD_HW_ACCESSIBLE(hcd)) {
352                 spin_unlock_irq(&ehci->lock);
353                 return -ESHUTDOWN;
354         }
355
356         if (unlikely(ehci->debug)) {
357                 if (!dbgp_reset_prep())
358                         ehci->debug = NULL;
359                 else
360                         dbgp_external_startup();
361         }
362
363         /* Ideally and we've got a real resume here, and no port's power
364          * was lost.  (For PCI, that means Vaux was maintained.)  But we
365          * could instead be restoring a swsusp snapshot -- so that BIOS was
366          * the last user of the controller, not reset/pm hardware keeping
367          * state we gave to it.
368          */
369         power_okay = ehci_readl(ehci, &ehci->regs->intr_enable);
370         ehci_dbg(ehci, "resume root hub%s\n",
371                         power_okay ? "" : " after power loss");
372
373         /* at least some APM implementations will try to deliver
374          * IRQs right away, so delay them until we're ready.
375          */
376         ehci_writel(ehci, 0, &ehci->regs->intr_enable);
377
378         /* re-init operational registers */
379         ehci_writel(ehci, 0, &ehci->regs->segment);
380         ehci_writel(ehci, ehci->periodic_dma, &ehci->regs->frame_list);
381         ehci_writel(ehci, (u32) ehci->async->qh_dma, &ehci->regs->async_next);
382
383         /* restore CMD_RUN, framelist size, and irq threshold */
384         ehci_writel(ehci, ehci->command, &ehci->regs->command);
385
386         /* Some controller/firmware combinations need a delay during which
387          * they set up the port statuses.  See Bugzilla #8190. */
388         spin_unlock_irq(&ehci->lock);
389         msleep(8);
390         spin_lock_irq(&ehci->lock);
391
392         /* clear phy low-power mode before resume */
393         if (ehci->bus_suspended && ehci->has_hostpc) {
394                 i = HCS_N_PORTS(ehci->hcs_params);
395                 while (i--) {
396                         if (test_bit(i, &ehci->bus_suspended)) {
397                                 u32 __iomem     *hostpc_reg;
398
399                                 hostpc_reg = (u32 __iomem *)((u8 *) ehci->regs
400                                                 + HOSTPC0 + 4 * i);
401                                 temp = ehci_readl(ehci, hostpc_reg);
402                                 ehci_writel(ehci, temp & ~HOSTPC_PHCD,
403                                                 hostpc_reg);
404                         }
405                 }
406                 spin_unlock_irq(&ehci->lock);
407                 msleep(5);
408                 spin_lock_irq(&ehci->lock);
409         }
410
411         /* manually resume the ports we suspended during bus_suspend() */
412         i = HCS_N_PORTS (ehci->hcs_params);
413         while (i--) {
414                 temp = ehci_readl(ehci, &ehci->regs->port_status [i]);
415                 temp &= ~(PORT_RWC_BITS | PORT_WAKE_BITS);
416                 if (test_bit(i, &ehci->bus_suspended) &&
417                                 (temp & PORT_SUSPEND)) {
418                         temp |= PORT_RESUME;
419                         resume_needed = 1;
420                 }
421                 ehci_writel(ehci, temp, &ehci->regs->port_status [i]);
422         }
423
424         /* msleep for 20ms only if code is trying to resume port */
425         if (resume_needed) {
426                 spin_unlock_irq(&ehci->lock);
427                 msleep(20);
428                 spin_lock_irq(&ehci->lock);
429         }
430
431         i = HCS_N_PORTS (ehci->hcs_params);
432         while (i--) {
433                 temp = ehci_readl(ehci, &ehci->regs->port_status [i]);
434                 if (test_bit(i, &ehci->bus_suspended) &&
435                                 (temp & PORT_SUSPEND)) {
436                         temp &= ~(PORT_RWC_BITS | PORT_RESUME);
437                         ehci_writel(ehci, temp, &ehci->regs->port_status [i]);
438                         ehci_vdbg (ehci, "resumed port %d\n", i + 1);
439                 }
440         }
441         (void) ehci_readl(ehci, &ehci->regs->command);
442
443         /* maybe re-activate the schedule(s) */
444         temp = 0;
445         if (ehci->async->qh_next.qh)
446                 temp |= CMD_ASE;
447         if (ehci->periodic_sched)
448                 temp |= CMD_PSE;
449         if (temp) {
450                 ehci->command |= temp;
451                 ehci_writel(ehci, ehci->command, &ehci->regs->command);
452         }
453
454         ehci->next_statechange = jiffies + msecs_to_jiffies(5);
455         hcd->state = HC_STATE_RUNNING;
456
457         /* Now we can safely re-enable irqs */
458         ehci_writel(ehci, INTR_MASK, &ehci->regs->intr_enable);
459
460         spin_unlock_irq (&ehci->lock);
461         ehci_handover_companion_ports(ehci);
462         return 0;
463 }
464
465 #else
466
467 #define ehci_bus_suspend        NULL
468 #define ehci_bus_resume         NULL
469
470 #endif  /* CONFIG_PM */
471
472 /*-------------------------------------------------------------------------*/
473
474 /* Display the ports dedicated to the companion controller */
475 static ssize_t show_companion(struct device *dev,
476                               struct device_attribute *attr,
477                               char *buf)
478 {
479         struct ehci_hcd         *ehci;
480         int                     nports, index, n;
481         int                     count = PAGE_SIZE;
482         char                    *ptr = buf;
483
484         ehci = hcd_to_ehci(bus_to_hcd(dev_get_drvdata(dev)));
485         nports = HCS_N_PORTS(ehci->hcs_params);
486
487         for (index = 0; index < nports; ++index) {
488                 if (test_bit(index, &ehci->companion_ports)) {
489                         n = scnprintf(ptr, count, "%d\n", index + 1);
490                         ptr += n;
491                         count -= n;
492                 }
493         }
494         return ptr - buf;
495 }
496
497 /*
498  * Sets the owner of a port
499  */
500 static void set_owner(struct ehci_hcd *ehci, int portnum, int new_owner)
501 {
502         u32 __iomem             *status_reg;
503         u32                     port_status;
504         int                     try;
505
506         status_reg = &ehci->regs->port_status[portnum];
507
508         /*
509          * The controller won't set the OWNER bit if the port is
510          * enabled, so this loop will sometimes require at least two
511          * iterations: one to disable the port and one to set OWNER.
512          */
513         for (try = 4; try > 0; --try) {
514                 spin_lock_irq(&ehci->lock);
515                 port_status = ehci_readl(ehci, status_reg);
516                 if ((port_status & PORT_OWNER) == new_owner
517                                 || (port_status & (PORT_OWNER | PORT_CONNECT))
518                                         == 0)
519                         try = 0;
520                 else {
521                         port_status ^= PORT_OWNER;
522                         port_status &= ~(PORT_PE | PORT_RWC_BITS);
523                         ehci_writel(ehci, port_status, status_reg);
524                 }
525                 spin_unlock_irq(&ehci->lock);
526                 if (try > 1)
527                         msleep(5);
528         }
529 }
530
531 /*
532  * Dedicate or undedicate a port to the companion controller.
533  * Syntax is "[-]portnum", where a leading '-' sign means
534  * return control of the port to the EHCI controller.
535  */
536 static ssize_t store_companion(struct device *dev,
537                                struct device_attribute *attr,
538                                const char *buf, size_t count)
539 {
540         struct ehci_hcd         *ehci;
541         int                     portnum, new_owner;
542
543         ehci = hcd_to_ehci(bus_to_hcd(dev_get_drvdata(dev)));
544         new_owner = PORT_OWNER;         /* Owned by companion */
545         if (sscanf(buf, "%d", &portnum) != 1)
546                 return -EINVAL;
547         if (portnum < 0) {
548                 portnum = - portnum;
549                 new_owner = 0;          /* Owned by EHCI */
550         }
551         if (portnum <= 0 || portnum > HCS_N_PORTS(ehci->hcs_params))
552                 return -ENOENT;
553         portnum--;
554         if (new_owner)
555                 set_bit(portnum, &ehci->companion_ports);
556         else
557                 clear_bit(portnum, &ehci->companion_ports);
558         set_owner(ehci, portnum, new_owner);
559         return count;
560 }
561 static DEVICE_ATTR(companion, 0644, show_companion, store_companion);
562
563 static inline int create_companion_file(struct ehci_hcd *ehci)
564 {
565         int     i = 0;
566
567         /* with integrated TT there is no companion! */
568         if (!ehci_is_TDI(ehci))
569                 i = device_create_file(ehci_to_hcd(ehci)->self.controller,
570                                        &dev_attr_companion);
571         return i;
572 }
573
574 static inline void remove_companion_file(struct ehci_hcd *ehci)
575 {
576         /* with integrated TT there is no companion! */
577         if (!ehci_is_TDI(ehci))
578                 device_remove_file(ehci_to_hcd(ehci)->self.controller,
579                                    &dev_attr_companion);
580 }
581
582
583 /*-------------------------------------------------------------------------*/
584
585 static int check_reset_complete (
586         struct ehci_hcd *ehci,
587         int             index,
588         u32 __iomem     *status_reg,
589         int             port_status
590 ) {
591         if (!(port_status & PORT_CONNECT))
592                 return port_status;
593
594         /* if reset finished and it's still not enabled -- handoff */
595         if (!(port_status & PORT_PE)) {
596
597                 /* with integrated TT, there's nobody to hand it to! */
598                 if (ehci_is_TDI(ehci)) {
599                         ehci_dbg (ehci,
600                                 "Failed to enable port %d on root hub TT\n",
601                                 index+1);
602                         return port_status;
603                 }
604
605                 ehci_dbg (ehci, "port %d full speed --> companion\n",
606                         index + 1);
607
608                 // what happens if HCS_N_CC(params) == 0 ?
609                 port_status |= PORT_OWNER;
610                 port_status &= ~PORT_RWC_BITS;
611                 ehci_writel(ehci, port_status, status_reg);
612
613                 /* ensure 440EPX ohci controller state is operational */
614                 if (ehci->has_amcc_usb23)
615                         set_ohci_hcfs(ehci, 1);
616         } else {
617                 ehci_dbg (ehci, "port %d high speed\n", index + 1);
618                 /* ensure 440EPx ohci controller state is suspended */
619                 if (ehci->has_amcc_usb23)
620                         set_ohci_hcfs(ehci, 0);
621         }
622
623         return port_status;
624 }
625
626 /*-------------------------------------------------------------------------*/
627
628
629 /* build "status change" packet (one or two bytes) from HC registers */
630
631 static int
632 ehci_hub_status_data (struct usb_hcd *hcd, char *buf)
633 {
634         struct ehci_hcd *ehci = hcd_to_ehci (hcd);
635         u32             temp, status = 0;
636         u32             mask;
637         int             ports, i, retval = 1;
638         unsigned long   flags;
639         u32             ppcd = 0;
640
641         /* if !USB_SUSPEND, root hub timers won't get shut down ... */
642         if (!HC_IS_RUNNING(hcd->state))
643                 return 0;
644
645         /* init status to no-changes */
646         buf [0] = 0;
647         ports = HCS_N_PORTS (ehci->hcs_params);
648         if (ports > 7) {
649                 buf [1] = 0;
650                 retval++;
651         }
652
653         /* Some boards (mostly VIA?) report bogus overcurrent indications,
654          * causing massive log spam unless we completely ignore them.  It
655          * may be relevant that VIA VT8235 controllers, where PORT_POWER is
656          * always set, seem to clear PORT_OCC and PORT_CSC when writing to
657          * PORT_POWER; that's surprising, but maybe within-spec.
658          */
659         if (!ignore_oc)
660                 mask = PORT_CSC | PORT_PEC | PORT_OCC;
661         else
662                 mask = PORT_CSC | PORT_PEC;
663         // PORT_RESUME from hardware ~= PORT_STAT_C_SUSPEND
664
665         /* no hub change reports (bit 0) for now (power, ...) */
666
667         /* port N changes (bit N)? */
668         spin_lock_irqsave (&ehci->lock, flags);
669
670         /* get per-port change detect bits */
671         if (ehci->has_ppcd)
672                 ppcd = ehci_readl(ehci, &ehci->regs->status) >> 16;
673
674         for (i = 0; i < ports; i++) {
675                 /* leverage per-port change bits feature */
676                 if (ehci->has_ppcd && !(ppcd & (1 << i)))
677                         continue;
678                 temp = ehci_readl(ehci, &ehci->regs->port_status [i]);
679
680                 /*
681                  * Return status information even for ports with OWNER set.
682                  * Otherwise khubd wouldn't see the disconnect event when a
683                  * high-speed device is switched over to the companion
684                  * controller by the user.
685                  */
686
687                 if ((temp & mask) != 0 || test_bit(i, &ehci->port_c_suspend)
688                                 || (ehci->reset_done[i] && time_after_eq(
689                                         jiffies, ehci->reset_done[i]))) {
690                         if (i < 7)
691                             buf [0] |= 1 << (i + 1);
692                         else
693                             buf [1] |= 1 << (i - 7);
694                         status = STS_PCD;
695                 }
696         }
697         /* FIXME autosuspend idle root hubs */
698         spin_unlock_irqrestore (&ehci->lock, flags);
699         return status ? retval : 0;
700 }
701
702 /*-------------------------------------------------------------------------*/
703
704 static void
705 ehci_hub_descriptor (
706         struct ehci_hcd                 *ehci,
707         struct usb_hub_descriptor       *desc
708 ) {
709         int             ports = HCS_N_PORTS (ehci->hcs_params);
710         u16             temp;
711
712         desc->bDescriptorType = 0x29;
713         desc->bPwrOn2PwrGood = 10;      /* ehci 1.0, 2.3.9 says 20ms max */
714         desc->bHubContrCurrent = 0;
715
716         desc->bNbrPorts = ports;
717         temp = 1 + (ports / 8);
718         desc->bDescLength = 7 + 2 * temp;
719
720         /* two bitmaps:  ports removable, and usb 1.0 legacy PortPwrCtrlMask */
721         memset(&desc->u.hs.DeviceRemovable[0], 0, temp);
722         memset(&desc->u.hs.DeviceRemovable[temp], 0xff, temp);
723
724         temp = 0x0008;                  /* per-port overcurrent reporting */
725         if (HCS_PPC (ehci->hcs_params))
726                 temp |= 0x0001;         /* per-port power control */
727         else
728                 temp |= 0x0002;         /* no power switching */
729 #if 0
730 // re-enable when we support USB_PORT_FEAT_INDICATOR below.
731         if (HCS_INDICATOR (ehci->hcs_params))
732                 temp |= 0x0080;         /* per-port indicators (LEDs) */
733 #endif
734         desc->wHubCharacteristics = cpu_to_le16(temp);
735 }
736
737 /*-------------------------------------------------------------------------*/
738
739 static int ehci_hub_control (
740         struct usb_hcd  *hcd,
741         u16             typeReq,
742         u16             wValue,
743         u16             wIndex,
744         char            *buf,
745         u16             wLength
746 ) {
747         struct ehci_hcd *ehci = hcd_to_ehci (hcd);
748         int             ports = HCS_N_PORTS (ehci->hcs_params);
749         u32 __iomem     *status_reg = &ehci->regs->port_status[
750                                 (wIndex & 0xff) - 1];
751         u32 __iomem     *hostpc_reg = NULL;
752         u32             temp, temp1, status;
753         unsigned long   flags;
754         int             retval = 0;
755         unsigned        selector;
756
757         /*
758          * FIXME:  support SetPortFeatures USB_PORT_FEAT_INDICATOR.
759          * HCS_INDICATOR may say we can change LEDs to off/amber/green.
760          * (track current state ourselves) ... blink for diagnostics,
761          * power, "this is the one", etc.  EHCI spec supports this.
762          */
763
764         if (ehci->has_hostpc)
765                 hostpc_reg = (u32 __iomem *)((u8 *)ehci->regs
766                                 + HOSTPC0 + 4 * ((wIndex & 0xff) - 1));
767         spin_lock_irqsave (&ehci->lock, flags);
768         switch (typeReq) {
769         case ClearHubFeature:
770                 switch (wValue) {
771                 case C_HUB_LOCAL_POWER:
772                 case C_HUB_OVER_CURRENT:
773                         /* no hub-wide feature/status flags */
774                         break;
775                 default:
776                         goto error;
777                 }
778                 break;
779         case ClearPortFeature:
780                 if (!wIndex || wIndex > ports)
781                         goto error;
782                 wIndex--;
783                 temp = ehci_readl(ehci, status_reg);
784
785                 /*
786                  * Even if OWNER is set, so the port is owned by the
787                  * companion controller, khubd needs to be able to clear
788                  * the port-change status bits (especially
789                  * USB_PORT_STAT_C_CONNECTION).
790                  */
791
792                 switch (wValue) {
793                 case USB_PORT_FEAT_ENABLE:
794                         ehci_writel(ehci, temp & ~PORT_PE, status_reg);
795                         break;
796                 case USB_PORT_FEAT_C_ENABLE:
797                         ehci_writel(ehci, (temp & ~PORT_RWC_BITS) | PORT_PEC,
798                                         status_reg);
799                         break;
800                 case USB_PORT_FEAT_SUSPEND:
801                         if (temp & PORT_RESET)
802                                 goto error;
803                         if (ehci->no_selective_suspend)
804                                 break;
805 #ifdef CONFIG_USB_OTG
806                         if ((hcd->self.otg_port == (wIndex + 1))
807                             && hcd->self.b_hnp_enable) {
808                                 otg_start_hnp(ehci->transceiver);
809                                 break;
810                         }
811 #endif
812                         if (!(temp & PORT_SUSPEND))
813                                 break;
814                         if ((temp & PORT_PE) == 0)
815                                 goto error;
816
817                         /* clear phy low-power mode before resume */
818                         if (hostpc_reg) {
819                                 temp1 = ehci_readl(ehci, hostpc_reg);
820                                 ehci_writel(ehci, temp1 & ~HOSTPC_PHCD,
821                                                 hostpc_reg);
822                                 spin_unlock_irqrestore(&ehci->lock, flags);
823                                 msleep(5);/* wait to leave low-power mode */
824                                 spin_lock_irqsave(&ehci->lock, flags);
825                         }
826                         /* resume signaling for 20 msec */
827                         temp &= ~(PORT_RWC_BITS | PORT_WAKE_BITS);
828                         ehci_writel(ehci, temp | PORT_RESUME, status_reg);
829                         ehci->reset_done[wIndex] = jiffies
830                                         + msecs_to_jiffies(20);
831                         break;
832                 case USB_PORT_FEAT_C_SUSPEND:
833                         clear_bit(wIndex, &ehci->port_c_suspend);
834                         break;
835                 case USB_PORT_FEAT_POWER:
836                         if (HCS_PPC (ehci->hcs_params))
837                                 ehci_writel(ehci,
838                                           temp & ~(PORT_RWC_BITS | PORT_POWER),
839                                           status_reg);
840                         break;
841                 case USB_PORT_FEAT_C_CONNECTION:
842                         if (ehci->has_lpm) {
843                                 /* clear PORTSC bits on disconnect */
844                                 temp &= ~PORT_LPM;
845                                 temp &= ~PORT_DEV_ADDR;
846                         }
847                         ehci_writel(ehci, (temp & ~PORT_RWC_BITS) | PORT_CSC,
848                                         status_reg);
849                         break;
850                 case USB_PORT_FEAT_C_OVER_CURRENT:
851                         ehci_writel(ehci, (temp & ~PORT_RWC_BITS) | PORT_OCC,
852                                         status_reg);
853                         break;
854                 case USB_PORT_FEAT_C_RESET:
855                         /* GetPortStatus clears reset */
856                         break;
857                 default:
858                         goto error;
859                 }
860                 ehci_readl(ehci, &ehci->regs->command); /* unblock posted write */
861                 break;
862         case GetHubDescriptor:
863                 ehci_hub_descriptor (ehci, (struct usb_hub_descriptor *)
864                         buf);
865                 break;
866         case GetHubStatus:
867                 /* no hub-wide feature/status flags */
868                 memset (buf, 0, 4);
869                 //cpu_to_le32s ((u32 *) buf);
870                 break;
871         case GetPortStatus:
872                 if (!wIndex || wIndex > ports)
873                         goto error;
874                 wIndex--;
875                 status = 0;
876                 temp = ehci_readl(ehci, status_reg);
877
878                 // wPortChange bits
879                 if (temp & PORT_CSC)
880                         status |= USB_PORT_STAT_C_CONNECTION << 16;
881                 if (temp & PORT_PEC)
882                         status |= USB_PORT_STAT_C_ENABLE << 16;
883
884                 if ((temp & PORT_OCC) && !ignore_oc){
885                         status |= USB_PORT_STAT_C_OVERCURRENT << 16;
886
887                         /*
888                          * Hubs should disable port power on over-current.
889                          * However, not all EHCI implementations do this
890                          * automatically, even if they _do_ support per-port
891                          * power switching; they're allowed to just limit the
892                          * current.  khubd will turn the power back on.
893                          */
894                         if (HCS_PPC (ehci->hcs_params)){
895                                 ehci_writel(ehci,
896                                         temp & ~(PORT_RWC_BITS | PORT_POWER),
897                                         status_reg);
898                         }
899                 }
900
901                 /* whoever resumes must GetPortStatus to complete it!! */
902                 if (temp & PORT_RESUME) {
903
904                         /* Remote Wakeup received? */
905                         if (!ehci->reset_done[wIndex]) {
906                                 /* resume signaling for 20 msec */
907                                 ehci->reset_done[wIndex] = jiffies
908                                                 + msecs_to_jiffies(20);
909                                 /* check the port again */
910                                 mod_timer(&ehci_to_hcd(ehci)->rh_timer,
911                                                 ehci->reset_done[wIndex]);
912                         }
913
914                         /* resume completed? */
915                         else if (time_after_eq(jiffies,
916                                         ehci->reset_done[wIndex])) {
917                                 clear_bit(wIndex, &ehci->suspended_ports);
918                                 set_bit(wIndex, &ehci->port_c_suspend);
919                                 ehci->reset_done[wIndex] = 0;
920
921                                 /* stop resume signaling */
922                                 temp = ehci_readl(ehci, status_reg);
923                                 ehci_writel(ehci,
924                                         temp & ~(PORT_RWC_BITS | PORT_RESUME),
925                                         status_reg);
926                                 retval = handshake(ehci, status_reg,
927                                            PORT_RESUME, 0, 2000 /* 2msec */);
928                                 if (retval != 0) {
929                                         ehci_err(ehci,
930                                                 "port %d resume error %d\n",
931                                                 wIndex + 1, retval);
932                                         goto error;
933                                 }
934                                 temp &= ~(PORT_SUSPEND|PORT_RESUME|(3<<10));
935                         }
936                 }
937
938                 /* whoever resets must GetPortStatus to complete it!! */
939                 if ((temp & PORT_RESET)
940                                 && time_after_eq(jiffies,
941                                         ehci->reset_done[wIndex])) {
942                         status |= USB_PORT_STAT_C_RESET << 16;
943                         ehci->reset_done [wIndex] = 0;
944
945                         /* force reset to complete */
946                         ehci_writel(ehci, temp & ~(PORT_RWC_BITS | PORT_RESET),
947                                         status_reg);
948                         /* REVISIT:  some hardware needs 550+ usec to clear
949                          * this bit; seems too long to spin routinely...
950                          */
951                         retval = handshake(ehci, status_reg,
952                                         PORT_RESET, 0, 1000);
953                         if (retval != 0) {
954                                 ehci_err (ehci, "port %d reset error %d\n",
955                                         wIndex + 1, retval);
956                                 goto error;
957                         }
958
959                         /* see what we found out */
960                         temp = check_reset_complete (ehci, wIndex, status_reg,
961                                         ehci_readl(ehci, status_reg));
962                 }
963
964                 if (!(temp & (PORT_RESUME|PORT_RESET)))
965                         ehci->reset_done[wIndex] = 0;
966
967                 /* transfer dedicated ports to the companion hc */
968                 if ((temp & PORT_CONNECT) &&
969                                 test_bit(wIndex, &ehci->companion_ports)) {
970                         temp &= ~PORT_RWC_BITS;
971                         temp |= PORT_OWNER;
972                         ehci_writel(ehci, temp, status_reg);
973                         ehci_dbg(ehci, "port %d --> companion\n", wIndex + 1);
974                         temp = ehci_readl(ehci, status_reg);
975                 }
976
977                 /*
978                  * Even if OWNER is set, there's no harm letting khubd
979                  * see the wPortStatus values (they should all be 0 except
980                  * for PORT_POWER anyway).
981                  */
982
983                 if (temp & PORT_CONNECT) {
984                         status |= USB_PORT_STAT_CONNECTION;
985                         // status may be from integrated TT
986                         if (ehci->has_hostpc) {
987                                 temp1 = ehci_readl(ehci, hostpc_reg);
988                                 status |= ehci_port_speed(ehci, temp1);
989                         } else
990                                 status |= ehci_port_speed(ehci, temp);
991                 }
992                 if (temp & PORT_PE)
993                         status |= USB_PORT_STAT_ENABLE;
994
995                 /* maybe the port was unsuspended without our knowledge */
996                 if (temp & (PORT_SUSPEND|PORT_RESUME)) {
997                         status |= USB_PORT_STAT_SUSPEND;
998                 } else if (test_bit(wIndex, &ehci->suspended_ports)) {
999                         clear_bit(wIndex, &ehci->suspended_ports);
1000                         ehci->reset_done[wIndex] = 0;
1001                         if (temp & PORT_PE)
1002                                 set_bit(wIndex, &ehci->port_c_suspend);
1003                 }
1004
1005                 if (temp & PORT_OC)
1006                         status |= USB_PORT_STAT_OVERCURRENT;
1007                 if (temp & PORT_RESET)
1008                         status |= USB_PORT_STAT_RESET;
1009                 if (temp & PORT_POWER)
1010                         status |= USB_PORT_STAT_POWER;
1011                 if (test_bit(wIndex, &ehci->port_c_suspend))
1012                         status |= USB_PORT_STAT_C_SUSPEND << 16;
1013
1014 #ifndef VERBOSE_DEBUG
1015         if (status & ~0xffff)   /* only if wPortChange is interesting */
1016 #endif
1017                 dbg_port (ehci, "GetStatus", wIndex + 1, temp);
1018                 put_unaligned_le32(status, buf);
1019                 break;
1020         case SetHubFeature:
1021                 switch (wValue) {
1022                 case C_HUB_LOCAL_POWER:
1023                 case C_HUB_OVER_CURRENT:
1024                         /* no hub-wide feature/status flags */
1025                         break;
1026                 default:
1027                         goto error;
1028                 }
1029                 break;
1030         case SetPortFeature:
1031                 selector = wIndex >> 8;
1032                 wIndex &= 0xff;
1033                 if (unlikely(ehci->debug)) {
1034                         /* If the debug port is active any port
1035                          * feature requests should get denied */
1036                         if (wIndex == HCS_DEBUG_PORT(ehci->hcs_params) &&
1037                             (readl(&ehci->debug->control) & DBGP_ENABLED)) {
1038                                 retval = -ENODEV;
1039                                 goto error_exit;
1040                         }
1041                 }
1042                 if (!wIndex || wIndex > ports)
1043                         goto error;
1044                 wIndex--;
1045                 temp = ehci_readl(ehci, status_reg);
1046                 if (temp & PORT_OWNER)
1047                         break;
1048
1049                 temp &= ~PORT_RWC_BITS;
1050                 switch (wValue) {
1051                 case USB_PORT_FEAT_SUSPEND:
1052                         if (ehci->no_selective_suspend)
1053                                 break;
1054                         if ((temp & PORT_PE) == 0
1055                                         || (temp & PORT_RESET) != 0)
1056                                 goto error;
1057
1058                         /* After above check the port must be connected.
1059                          * Set appropriate bit thus could put phy into low power
1060                          * mode if we have hostpc feature
1061                          */
1062                         temp &= ~PORT_WKCONN_E;
1063                         temp |= PORT_WKDISC_E | PORT_WKOC_E;
1064                         ehci_writel(ehci, temp | PORT_SUSPEND, status_reg);
1065                         if (hostpc_reg) {
1066                                 spin_unlock_irqrestore(&ehci->lock, flags);
1067                                 msleep(5);/* 5ms for HCD enter low pwr mode */
1068                                 spin_lock_irqsave(&ehci->lock, flags);
1069                                 temp1 = ehci_readl(ehci, hostpc_reg);
1070                                 ehci_writel(ehci, temp1 | HOSTPC_PHCD,
1071                                         hostpc_reg);
1072                                 temp1 = ehci_readl(ehci, hostpc_reg);
1073                                 ehci_dbg(ehci, "Port%d phy low pwr mode %s\n",
1074                                         wIndex, (temp1 & HOSTPC_PHCD) ?
1075                                         "succeeded" : "failed");
1076                         }
1077                         set_bit(wIndex, &ehci->suspended_ports);
1078                         break;
1079                 case USB_PORT_FEAT_POWER:
1080                         if (HCS_PPC (ehci->hcs_params))
1081                                 ehci_writel(ehci, temp | PORT_POWER,
1082                                                 status_reg);
1083                         break;
1084                 case USB_PORT_FEAT_RESET:
1085                         if (temp & PORT_RESUME)
1086                                 goto error;
1087                         /* line status bits may report this as low speed,
1088                          * which can be fine if this root hub has a
1089                          * transaction translator built in.
1090                          */
1091                         if ((temp & (PORT_PE|PORT_CONNECT)) == PORT_CONNECT
1092                                         && !ehci_is_TDI(ehci)
1093                                         && PORT_USB11 (temp)) {
1094                                 ehci_dbg (ehci,
1095                                         "port %d low speed --> companion\n",
1096                                         wIndex + 1);
1097                                 temp |= PORT_OWNER;
1098                         } else {
1099                                 ehci_vdbg (ehci, "port %d reset\n", wIndex + 1);
1100                                 temp |= PORT_RESET;
1101                                 temp &= ~PORT_PE;
1102
1103                                 /*
1104                                  * caller must wait, then call GetPortStatus
1105                                  * usb 2.0 spec says 50 ms resets on root
1106                                  */
1107                                 ehci->reset_done [wIndex] = jiffies
1108                                                 + msecs_to_jiffies (50);
1109                         }
1110                         ehci_writel(ehci, temp, status_reg);
1111                         break;
1112
1113                 /* For downstream facing ports (these):  one hub port is put
1114                  * into test mode according to USB2 11.24.2.13, then the hub
1115                  * must be reset (which for root hub now means rmmod+modprobe,
1116                  * or else system reboot).  See EHCI 2.3.9 and 4.14 for info
1117                  * about the EHCI-specific stuff.
1118                  */
1119                 case USB_PORT_FEAT_TEST:
1120                         if (!selector || selector > 5)
1121                                 goto error;
1122                         ehci_quiesce(ehci);
1123                         ehci_halt(ehci);
1124                         temp |= selector << 16;
1125                         ehci_writel(ehci, temp, status_reg);
1126                         break;
1127
1128                 default:
1129                         goto error;
1130                 }
1131                 ehci_readl(ehci, &ehci->regs->command); /* unblock posted writes */
1132                 break;
1133
1134         default:
1135 error:
1136                 /* "stall" on error */
1137                 retval = -EPIPE;
1138         }
1139 error_exit:
1140         spin_unlock_irqrestore (&ehci->lock, flags);
1141         return retval;
1142 }
1143
1144 static void ehci_relinquish_port(struct usb_hcd *hcd, int portnum)
1145 {
1146         struct ehci_hcd         *ehci = hcd_to_ehci(hcd);
1147
1148         if (ehci_is_TDI(ehci))
1149                 return;
1150         set_owner(ehci, --portnum, PORT_OWNER);
1151 }
1152
1153 static int ehci_port_handed_over(struct usb_hcd *hcd, int portnum)
1154 {
1155         struct ehci_hcd         *ehci = hcd_to_ehci(hcd);
1156         u32 __iomem             *reg;
1157
1158         if (ehci_is_TDI(ehci))
1159                 return 0;
1160         reg = &ehci->regs->port_status[portnum - 1];
1161         return ehci_readl(ehci, reg) & PORT_OWNER;
1162 }