diff options
Diffstat (limited to 'drivers/usb/host/ehci.h')
| -rw-r--r-- | drivers/usb/host/ehci.h | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/drivers/usb/host/ehci.h b/drivers/usb/host/ehci.h index c7d4b5a06bdb..fb7054ccf4fc 100644 --- a/drivers/usb/host/ehci.h +++ b/drivers/usb/host/ehci.h | |||
| @@ -120,6 +120,16 @@ struct ehci_hcd { /* one per controller */ | |||
| 120 | unsigned has_fsl_port_bug:1; /* FreeScale */ | 120 | unsigned has_fsl_port_bug:1; /* FreeScale */ |
| 121 | unsigned big_endian_mmio:1; | 121 | unsigned big_endian_mmio:1; |
| 122 | unsigned big_endian_desc:1; | 122 | unsigned big_endian_desc:1; |
| 123 | unsigned has_amcc_usb23:1; | ||
| 124 | |||
| 125 | /* required for usb32 quirk */ | ||
| 126 | #define OHCI_CTRL_HCFS (3 << 6) | ||
| 127 | #define OHCI_USB_OPER (2 << 6) | ||
| 128 | #define OHCI_USB_SUSPEND (3 << 6) | ||
| 129 | |||
| 130 | #define OHCI_HCCTRL_OFFSET 0x4 | ||
| 131 | #define OHCI_HCCTRL_LEN 0x4 | ||
| 132 | __hc32 *ohci_hcctrl_reg; | ||
| 123 | 133 | ||
| 124 | u8 sbrn; /* packed release number */ | 134 | u8 sbrn; /* packed release number */ |
| 125 | 135 | ||
| @@ -636,6 +646,30 @@ static inline void ehci_writel(const struct ehci_hcd *ehci, | |||
| 636 | #endif | 646 | #endif |
| 637 | } | 647 | } |
| 638 | 648 | ||
| 649 | /* | ||
| 650 | * On certain ppc-44x SoC there is a HW issue, that could only worked around with | ||
| 651 | * explicit suspend/operate of OHCI. This function hereby makes sense only on that arch. | ||
| 652 | * Other common bits are dependant on has_amcc_usb23 quirk flag. | ||
| 653 | */ | ||
| 654 | #ifdef CONFIG_44x | ||
| 655 | static inline void set_ohci_hcfs(struct ehci_hcd *ehci, int operational) | ||
| 656 | { | ||
| 657 | u32 hc_control; | ||
| 658 | |||
| 659 | hc_control = (readl_be(ehci->ohci_hcctrl_reg) & ~OHCI_CTRL_HCFS); | ||
| 660 | if (operational) | ||
| 661 | hc_control |= OHCI_USB_OPER; | ||
| 662 | else | ||
| 663 | hc_control |= OHCI_USB_SUSPEND; | ||
| 664 | |||
| 665 | writel_be(hc_control, ehci->ohci_hcctrl_reg); | ||
| 666 | (void) readl_be(ehci->ohci_hcctrl_reg); | ||
| 667 | } | ||
| 668 | #else | ||
| 669 | static inline void set_ohci_hcfs(struct ehci_hcd *ehci, int operational) | ||
| 670 | { } | ||
| 671 | #endif | ||
| 672 | |||
| 639 | /*-------------------------------------------------------------------------*/ | 673 | /*-------------------------------------------------------------------------*/ |
| 640 | 674 | ||
| 641 | /* | 675 | /* |
