mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-29 08:01:08 +00:00
usb: tegra: fix PHY selection code
The TRM for Tegra30 and later all state that USBMODE_CM_HC must be set
before writing to hostpc1_devlc to select which PHY to use for a USB
controller. However, neither init_{utmi,ulpi}_usb_controller() do this
today, so the register writes they perform for PHY selection do not
work.
For the UTMI case, this was hacked around in commit 7e44d9320e
"ARM:
Tegra: USB: EHCI: Add support for Tegra30/Tegra114" by adding code to
ehci_hcd_init() which sets USBMODE_CM_HC and duplicates the PHY
selection register write. This code doesn't cover the ULPI case, so I
wouldn't be surprised if ULPI doesn't work with the current code, unless
the ordering requirement only ends up being an issue in HW for UTMI not
ULPI.
This patch fixes init_{utmi,ulpi}_usb_controller() to correctly set
USBMODE_CM_HC before selecting the PHY. Now that this works, we can
remove the duplicate UTMI-specific code in ehci_hcd_init(), thus
simplifying that function.
Cc: Jim Lin <jilin@nvidia.com>
Cc: Stefan Agner <stefan@agner.ch>
Signed-off-by: Stephen Warren <swarren@nvidia.com>
This commit is contained in:
parent
4180b3dba2
commit
9b20fe6f1a
1 changed files with 8 additions and 13 deletions
|
@ -496,6 +496,10 @@ static int init_utmi_usb_controller(struct fdt_usb *config)
|
|||
clrbits_le32(&usbctlr->port_sc1, STS);
|
||||
}
|
||||
#else
|
||||
/* Set to Host mode after Controller Reset was done */
|
||||
clrsetbits_le32(&usbctlr->usb_mode, USBMODE_CM_HC,
|
||||
USBMODE_CM_HC);
|
||||
/* Select PHY interface after setting host mode */
|
||||
clrsetbits_le32(&usbctlr->hostpc1_devlc, PTS_MASK,
|
||||
PTS_UTMI << PTS_SHIFT);
|
||||
clrbits_le32(&usbctlr->hostpc1_devlc, STS);
|
||||
|
@ -561,6 +565,10 @@ static int init_ulpi_usb_controller(struct fdt_usb *config)
|
|||
clrsetbits_le32(&usbctlr->port_sc1, PTS_MASK,
|
||||
PTS_ULPI << PTS_SHIFT);
|
||||
#else
|
||||
/* Set to Host mode after Controller Reset was done */
|
||||
clrsetbits_le32(&usbctlr->usb_mode, USBMODE_CM_HC,
|
||||
USBMODE_CM_HC);
|
||||
/* Select PHY interface after setting host mode */
|
||||
clrsetbits_le32(&usbctlr->hostpc1_devlc, PTS_MASK,
|
||||
PTS_ULPI << PTS_SHIFT);
|
||||
#endif
|
||||
|
@ -788,19 +796,6 @@ success:
|
|||
*hccr = (struct ehci_hccr *)&usbctlr->cap_length;
|
||||
*hcor = (struct ehci_hcor *)&usbctlr->usb_cmd;
|
||||
|
||||
if (controller->has_hostpc) {
|
||||
/* Set to Host mode after Controller Reset was done */
|
||||
clrsetbits_le32(&usbctlr->usb_mode, USBMODE_CM_HC,
|
||||
USBMODE_CM_HC);
|
||||
/* Select UTMI parallel interface after setting host mode */
|
||||
if (config->utmi) {
|
||||
clrsetbits_le32((char *)&usbctlr->usb_cmd +
|
||||
HOSTPC1_DEVLC, PTS_MASK,
|
||||
PTS_UTMI << PTS_SHIFT);
|
||||
clrbits_le32((char *)&usbctlr->usb_cmd +
|
||||
HOSTPC1_DEVLC, STS);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue