Skip to content

Commit

Permalink
USB: UHCI: Support big endian GRUSBHC HC
Browse files Browse the repository at this point in the history
This patch adds support for big endian GRUSBHC UHCI controllers.
The HCD bus glue will probe the register interface to determine
the endianness of the controller.

Tested on GR-LEON4-ITX board which has a controller with little endian
interface and on custom LEON3 board with a BE controller.

Signed-off-by: Jan Andersson <[email protected]>
Acked-by: Alan Stern <[email protected]>
Signed-off-by: Greg Kroah-Hartman <[email protected]>
  • Loading branch information
jan-at-gaisler authored and gregkh committed May 19, 2011
1 parent c936503 commit fda928a
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 2 deletions.
6 changes: 4 additions & 2 deletions drivers/usb/host/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -418,11 +418,13 @@ config USB_UHCI_SUPPORT_NON_PCI_HC

config USB_UHCI_BIG_ENDIAN_MMIO
bool
depends on USB_UHCI_SUPPORT_NON_PCI_HC
depends on USB_UHCI_SUPPORT_NON_PCI_HC && SPARC_LEON
default y

config USB_UHCI_BIG_ENDIAN_DESC
bool
depends on USB_UHCI_SUPPORT_NON_PCI_HC
depends on USB_UHCI_SUPPORT_NON_PCI_HC && SPARC_LEON
default y

config USB_FHCI_HCD
tristate "Freescale QE USB Host Controller support"
Expand Down
14 changes: 14 additions & 0 deletions drivers/usb/host/uhci-grlib.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,20 @@ static int uhci_grlib_init(struct usb_hcd *hcd)
{
struct uhci_hcd *uhci = hcd_to_uhci(hcd);

/*
* Probe to determine the endianness of the controller.
* We know that bit 7 of the PORTSC1 register is always set
* and bit 15 is always clear. If uhci_readw() yields a value
* with bit 7 (0x80) turned on then the current little-endian
* setting is correct. Otherwise we assume the value was
* byte-swapped; hence the register interface and presumably
* also the descriptors are big-endian.
*/
if (!(uhci_readw(uhci, USBPORTSC1) & 0x80)) {
uhci->big_endian_mmio = 1;
uhci->big_endian_desc = 1;
}

uhci->rh_numports = uhci_count_ports(hcd);

/* Set up pointers to to generic functions */
Expand Down

0 comments on commit fda928a

Please sign in to comment.