* [U-Boot] [PATCH 1/3] usb: tegra: fix PHY selection code
@ 2014-04-30 21:09 Stephen Warren
2014-04-30 21:09 ` [U-Boot] [PATCH 2/3] usb: tegra: refactor PHY type selection Stephen Warren
` (3 more replies)
0 siblings, 4 replies; 10+ messages in thread
From: Stephen Warren @ 2014-04-30 21:09 UTC (permalink / raw)
To: u-boot
From: Stephen Warren <swarren@nvidia.com>
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 7e44d9320ed4 "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>
---
drivers/usb/host/ehci-tegra.c | 21 ++++++++-------------
1 file changed, 8 insertions(+), 13 deletions(-)
diff --git a/drivers/usb/host/ehci-tegra.c b/drivers/usb/host/ehci-tegra.c
index 38db18e2c9ea..9a9a1277d160 100644
--- a/drivers/usb/host/ehci-tegra.c
+++ b/drivers/usb/host/ehci-tegra.c
@@ -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;
}
--
1.8.1.5
^ permalink raw reply related [flat|nested] 10+ messages in thread* [U-Boot] [PATCH 2/3] usb: tegra: refactor PHY type selection 2014-04-30 21:09 [U-Boot] [PATCH 1/3] usb: tegra: fix PHY selection code Stephen Warren @ 2014-04-30 21:09 ` Stephen Warren 2014-04-30 21:09 ` [U-Boot] [PATCH 3/3] usb: tegra: support device mode Stephen Warren ` (2 subsequent siblings) 3 siblings, 0 replies; 10+ messages in thread From: Stephen Warren @ 2014-04-30 21:09 UTC (permalink / raw) To: u-boot From: Stephen Warren <swarren@nvidia.com> Both init_{utmi,ulpi}_usb_controller() have nearly identical code for PHY type selection. Pull this out into a common function to remove the duplication. Cc: Jim Lin <jilin@nvidia.com> Cc: Stefan Agner <stefan@agner.ch> Signed-off-by: Stephen Warren <swarren@nvidia.com> --- drivers/usb/host/ehci-tegra.c | 58 +++++++++++++++++++++---------------------- 1 file changed, 28 insertions(+), 30 deletions(-) diff --git a/drivers/usb/host/ehci-tegra.c b/drivers/usb/host/ehci-tegra.c index 9a9a1277d160..55a546e4d3da 100644 --- a/drivers/usb/host/ehci-tegra.c +++ b/drivers/usb/host/ehci-tegra.c @@ -293,6 +293,32 @@ static const unsigned *get_pll_timing(void) return timing; } +/* select the PHY to use with a USB controller */ +static void init_phy_mux(struct fdt_usb *config, uint pts) +{ + struct usb_ctlr *usbctlr = config->reg; + +#if defined(CONFIG_TEGRA20) + if (config->periph_id == PERIPH_ID_USBD) { + clrsetbits_le32(&usbctlr->port_sc1, PTS1_MASK, + PTS_UTMI << PTS1_SHIFT); + clrbits_le32(&usbctlr->port_sc1, STS1); + } else { + clrsetbits_le32(&usbctlr->port_sc1, PTS_MASK, + PTS_UTMI << PTS_SHIFT); + 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 << PTS_SHIFT); + clrbits_le32(&usbctlr->hostpc1_devlc, STS); +#endif +} + /* set up the UTMI USB controller with the parameters provided */ static int init_utmi_usb_controller(struct fdt_usb *config) { @@ -485,25 +511,7 @@ static int init_utmi_usb_controller(struct fdt_usb *config) clrbits_le32(&usbctlr->icusb_ctrl, IC_ENB1); /* Select UTMI parallel interface */ -#if defined(CONFIG_TEGRA20) - if (config->periph_id == PERIPH_ID_USBD) { - clrsetbits_le32(&usbctlr->port_sc1, PTS1_MASK, - PTS_UTMI << PTS1_SHIFT); - clrbits_le32(&usbctlr->port_sc1, STS1); - } else { - clrsetbits_le32(&usbctlr->port_sc1, PTS_MASK, - PTS_UTMI << PTS_SHIFT); - 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); -#endif + init_phy_mux(config, PTS_UTMI); /* Deassert power down state */ clrbits_le32(&usbctlr->utmip_xcvr_cfg0, UTMIP_FORCE_PD_POWERDOWN | @@ -561,17 +569,7 @@ static int init_ulpi_usb_controller(struct fdt_usb *config) ULPI_CLKOUT_PINMUX_BYP | ULPI_OUTPUT_PINMUX_BYP); /* Select ULPI parallel interface */ -#if defined(CONFIG_TEGRA20) - 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 + init_phy_mux(config, PTS_ULPI); /* enable ULPI transceiver */ setbits_le32(&usbctlr->susp_ctrl, ULPI_PHY_ENB); -- 1.8.1.5 ^ permalink raw reply related [flat|nested] 10+ messages in thread
* [U-Boot] [PATCH 3/3] usb: tegra: support device mode 2014-04-30 21:09 [U-Boot] [PATCH 1/3] usb: tegra: fix PHY selection code Stephen Warren 2014-04-30 21:09 ` [U-Boot] [PATCH 2/3] usb: tegra: refactor PHY type selection Stephen Warren @ 2014-04-30 21:09 ` Stephen Warren 2014-05-01 10:49 ` [U-Boot] [PATCH 1/3] usb: tegra: fix PHY selection code Marek Vasut 2014-05-12 12:34 ` Stefan Agner 3 siblings, 0 replies; 10+ messages in thread From: Stephen Warren @ 2014-04-30 21:09 UTC (permalink / raw) To: u-boot From: Stephen Warren <swarren@nvidia.com> A few changes are made to the Tegra EHCI driver so that it can set everything up for device-mode operation on the first USB controller. This can be used in conjunction with ci_udc.c to operate as a USB device. Detailed changes are: * Rename set_host_mode() to set_up_vbus() since that's really what it does. * Modify set_up_vbus() to know whether it's initializing in host or device mode, and: - Skip the external VBUS check in device mode, since external VBUS is expected in this case. - Disable VBUS output in device mode. * Modify init_phy_mux() to know whether it's initializing in host or device mode, and hence skip setting USBMODE_CM_HC (which enables host mode) in device mode. See the comments in that function for why this is safe w.r.t. the ordering requirements of PHY selection. * Modify init_utmi_usb_controller() to force "b session valid" in device mode, since the HW requires this. This is done in UTMI-specific code, since we only support device mode on the first USB controller, and that controller can only talk to a UTMI PHY. * Enhance ehci_hcd_init() to error-check the requested host-/device-mode vs. the dr_mode (dual-role mode) value present in device tree, and the HW configurations which support device mode. * Enhance ehci_hcd_init() not to skip HW initialization when switching between host and device mode on a controller. This requires remembering which mode the last initialization used. Cc: Jim Lin <jilin@nvidia.com> Cc: Stefan Agner <stefan@agner.ch> Signed-off-by: Stephen Warren <swarren@nvidia.com> --- arch/arm/include/asm/arch-tegra/usb.h | 2 + drivers/usb/host/ehci-tegra.c | 114 +++++++++++++++++++++++++--------- 2 files changed, 86 insertions(+), 30 deletions(-) diff --git a/arch/arm/include/asm/arch-tegra/usb.h b/arch/arm/include/asm/arch-tegra/usb.h index ceb7bcd9cfb9..c817088fa57e 100644 --- a/arch/arm/include/asm/arch-tegra/usb.h +++ b/arch/arm/include/asm/arch-tegra/usb.h @@ -349,6 +349,8 @@ struct usb_ctlr { /* USB3_IF_USB_PHY_VBUS_SENSORS_0 */ #define VBUS_VLD_STS (1 << 26) +#define VBUS_B_SESS_VLD_SW_VALUE (1 << 12) +#define VBUS_B_SESS_VLD_SW_EN (1 << 11) /* Setup USB on the board */ int usb_process_devicetree(const void *blob); diff --git a/drivers/usb/host/ehci-tegra.c b/drivers/usb/host/ehci-tegra.c index 55a546e4d3da..33e5ea9ebdd0 100644 --- a/drivers/usb/host/ehci-tegra.c +++ b/drivers/usb/host/ehci-tegra.c @@ -69,6 +69,7 @@ struct fdt_usb { unsigned enabled:1; /* 1 to enable, 0 to disable */ unsigned has_legacy_mode:1; /* 1 if this port has legacy mode */ unsigned initialized:1; /* has this port already been initialized? */ + enum usb_init_type init_type; enum dr_mode dr_mode; /* dual role mode */ enum periph_id periph_id;/* peripheral id */ struct fdt_gpio_state vbus_gpio; /* GPIO for vbus enable */ @@ -237,29 +238,31 @@ int ehci_get_port_speed(struct ehci_hcor *hcor, uint32_t reg) return PORTSC_PSPD(reg); } -/* Put the port into host mode */ -static void set_host_mode(struct fdt_usb *config) +/* Set up VBUS for host/device mode */ +static void set_up_vbus(struct fdt_usb *config, enum usb_init_type init) { /* - * If we are an OTG port, check if remote host is driving VBus and - * bail out in this case. + * If we are an OTG port initializing in host mode, + * check if remote host is driving VBus and bail out in this case. */ - if (config->dr_mode == DR_MODE_OTG && - (readl(&config->reg->phy_vbus_sensors) & VBUS_VLD_STS)) + if (init == USB_INIT_HOST && + config->dr_mode == DR_MODE_OTG && + (readl(&config->reg->phy_vbus_sensors) & VBUS_VLD_STS)) { + printf("tegrausb: VBUS input active; not enabling as host\n"); return; + } - /* - * If not driving, we set the GPIO to enable VBUS. We assume - * that the pinmux is set up correctly for this. - */ if (fdt_gpio_isvalid(&config->vbus_gpio)) { + int vbus_value; + fdtdec_setup_gpio(&config->vbus_gpio); - gpio_direction_output(config->vbus_gpio.gpio, - (config->vbus_gpio.flags & FDT_GPIO_ACTIVE_LOW) ? - 0 : 1); - debug("set_host_mode: GPIO %d %s\n", config->vbus_gpio.gpio, - (config->vbus_gpio.flags & FDT_GPIO_ACTIVE_LOW) ? - "low" : "high"); + + vbus_value = (init == USB_INIT_HOST) ^ + !!(config->vbus_gpio.flags & FDT_GPIO_ACTIVE_LOW); + gpio_direction_output(config->vbus_gpio.gpio, vbus_value); + + debug("set_up_vbus: GPIO %d %d\n", config->vbus_gpio.gpio, + vbus_value); } } @@ -294,7 +297,8 @@ static const unsigned *get_pll_timing(void) } /* select the PHY to use with a USB controller */ -static void init_phy_mux(struct fdt_usb *config, uint pts) +static void init_phy_mux(struct fdt_usb *config, uint pts, + enum usb_init_type init) { struct usb_ctlr *usbctlr = config->reg; @@ -309,10 +313,16 @@ static void init_phy_mux(struct fdt_usb *config, uint pts) clrbits_le32(&usbctlr->port_sc1, STS); } #else - /* Set to Host mode after Controller Reset was done */ + /* Set to Host mode (if applicable) after Controller Reset was done */ clrsetbits_le32(&usbctlr->usb_mode, USBMODE_CM_HC, - USBMODE_CM_HC); - /* Select PHY interface after setting host mode */ + (init == USB_INIT_HOST) ? USBMODE_CM_HC : 0); + /* + * Select PHY interface after setting host mode. + * For device mode, the ordering requirement is not an issue, since + * only the first USB controller supports device mode, and that USB + * controller can only talk to a UTMI PHY, so the PHY selection is + * already made at reset time, so this write is a no-op. + */ clrsetbits_le32(&usbctlr->hostpc1_devlc, PTS_MASK, pts << PTS_SHIFT); clrbits_le32(&usbctlr->hostpc1_devlc, STS); @@ -320,9 +330,10 @@ static void init_phy_mux(struct fdt_usb *config, uint pts) } /* set up the UTMI USB controller with the parameters provided */ -static int init_utmi_usb_controller(struct fdt_usb *config) +static int init_utmi_usb_controller(struct fdt_usb *config, + enum usb_init_type init) { - u32 val; + u32 b_sess_valid_mask, val; int loop_count; const unsigned *timing; struct usb_ctlr *usbctlr = config->reg; @@ -340,6 +351,10 @@ static int init_utmi_usb_controller(struct fdt_usb *config) /* Follow the crystal clock disable by >100ns delay */ udelay(1); + b_sess_valid_mask = (VBUS_B_SESS_VLD_SW_VALUE | VBUS_B_SESS_VLD_SW_EN); + clrsetbits_le32(&usbctlr->phy_vbus_sensors, b_sess_valid_mask, + (init == USB_INIT_DEVICE) ? b_sess_valid_mask : 0); + /* * To Use the A Session Valid for cable detection logic, VBUS_WAKEUP * mux must be switched to actually use a_sess_vld threshold. @@ -511,7 +526,7 @@ static int init_utmi_usb_controller(struct fdt_usb *config) clrbits_le32(&usbctlr->icusb_ctrl, IC_ENB1); /* Select UTMI parallel interface */ - init_phy_mux(config, PTS_UTMI); + init_phy_mux(config, PTS_UTMI, init); /* Deassert power down state */ clrbits_le32(&usbctlr->utmip_xcvr_cfg0, UTMIP_FORCE_PD_POWERDOWN | @@ -541,7 +556,8 @@ static int init_utmi_usb_controller(struct fdt_usb *config) #endif /* set up the ULPI USB controller with the parameters provided */ -static int init_ulpi_usb_controller(struct fdt_usb *config) +static int init_ulpi_usb_controller(struct fdt_usb *config, + enum usb_init_type init) { u32 val; int loop_count; @@ -569,7 +585,7 @@ static int init_ulpi_usb_controller(struct fdt_usb *config) ULPI_CLKOUT_PINMUX_BYP | ULPI_OUTPUT_PINMUX_BYP); /* Select ULPI parallel interface */ - init_phy_mux(config, PTS_ULPI); + init_phy_mux(config, PTS_ULPI, init); /* enable ULPI transceiver */ setbits_le32(&usbctlr->susp_ctrl, ULPI_PHY_ENB); @@ -618,7 +634,8 @@ static int init_ulpi_usb_controller(struct fdt_usb *config) return 0; } #else -static int init_ulpi_usb_controller(struct fdt_usb *config) +static int init_ulpi_usb_controller(struct fdt_usb *config, + enum usb_init_type init) { printf("No code to set up ULPI controller, please enable" "CONFIG_USB_ULPI and CONFIG_USB_ULPI_VIEWPORT"); @@ -771,23 +788,60 @@ int ehci_hcd_init(int index, enum usb_init_type init, config = &port[index]; + switch (init) { + case USB_INIT_HOST: + switch (config->dr_mode) { + case DR_MODE_HOST: + case DR_MODE_OTG: + break; + default: + printf("tegrausb: Invalid dr_mode %d for host mode\n", + config->dr_mode); + return -1; + } + break; + case USB_INIT_DEVICE: + if (config->periph_id != PERIPH_ID_USBD) { + printf("tegrausb: Device mode only supported on first USB controller\n"); + return -1; + } + if (!config->utmi) { + printf("tegrausb: Device mode only supported with UTMI PHY\n"); + return -1; + } + switch (config->dr_mode) { + case DR_MODE_DEVICE: + case DR_MODE_OTG: + break; + default: + printf("tegrausb: Invalid dr_mode %d for device mode\n", + config->dr_mode); + return -1; + } + break; + default: + printf("tegrausb: Unknown USB_INIT_* %d\n", init); + return -1; + } + /* skip init, if the port is already initialized */ - if (config->initialized) + if (config->initialized && config->init_type == init) goto success; - if (config->utmi && init_utmi_usb_controller(config)) { + if (config->utmi && init_utmi_usb_controller(config, init)) { printf("tegrausb: Cannot init port %d\n", index); return -1; } - if (config->ulpi && init_ulpi_usb_controller(config)) { + if (config->ulpi && init_ulpi_usb_controller(config, init)) { printf("tegrausb: Cannot init port %d\n", index); return -1; } - set_host_mode(config); + set_up_vbus(config, init); config->initialized = 1; + config->init_type = init; success: usbctlr = config->reg; -- 1.8.1.5 ^ permalink raw reply related [flat|nested] 10+ messages in thread
* [U-Boot] [PATCH 1/3] usb: tegra: fix PHY selection code 2014-04-30 21:09 [U-Boot] [PATCH 1/3] usb: tegra: fix PHY selection code Stephen Warren 2014-04-30 21:09 ` [U-Boot] [PATCH 2/3] usb: tegra: refactor PHY type selection Stephen Warren 2014-04-30 21:09 ` [U-Boot] [PATCH 3/3] usb: tegra: support device mode Stephen Warren @ 2014-05-01 10:49 ` Marek Vasut 2014-05-01 16:56 ` Stephen Warren 2014-05-12 12:34 ` Stefan Agner 3 siblings, 1 reply; 10+ messages in thread From: Marek Vasut @ 2014-05-01 10:49 UTC (permalink / raw) To: u-boot On Wednesday, April 30, 2014 at 11:09:55 PM, Stephen Warren wrote: > From: Stephen Warren <swarren@nvidia.com> > > 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 7e44d9320ed4 "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. This doesn't apply on u-boot-usb/master , so I cannot pick this, sorry . Best regards, Marek Vasut ^ permalink raw reply [flat|nested] 10+ messages in thread
* [U-Boot] [PATCH 1/3] usb: tegra: fix PHY selection code 2014-05-01 10:49 ` [U-Boot] [PATCH 1/3] usb: tegra: fix PHY selection code Marek Vasut @ 2014-05-01 16:56 ` Stephen Warren 2014-05-02 4:47 ` Marek Vasut 0 siblings, 1 reply; 10+ messages in thread From: Stephen Warren @ 2014-05-01 16:56 UTC (permalink / raw) To: u-boot On 05/01/2014 04:49 AM, Marek Vasut wrote: > On Wednesday, April 30, 2014 at 11:09:55 PM, Stephen Warren wrote: >> From: Stephen Warren <swarren@nvidia.com> >> >> 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 7e44d9320ed4 "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. > > This doesn't apply on u-boot-usb/master , so I cannot pick this, sorry . Ah right. That's because I'm working on top of a merge of u-boot-arm/master and u-boot/master, and that includes the following changes to the Tegra USB driver that went in through u-boot-tegra/master -> u-boot-arm/master rather than the USB tree: 8f9fd6caafb8 usb: tegra: combine header file b1d615f3f102 usb: tegra: fix PHY configuration b03f4b3742a7 usb: tegra: fix USB2 powerdown for Tegra30 and later What's the best fix here: * Wait until the previous patches get into u-boot/master, and u-boot-usb/master picks them up, and then apply this series. * Apply this series to u-boot-tegra/master with your ack? There's little point my rebasing this series on top of u-boot-usb/master, and applying it right now, since that will just cause the same conflicts when u-boot-usb/master gets merged into u-boot/master. Thanks. ^ permalink raw reply [flat|nested] 10+ messages in thread
* [U-Boot] [PATCH 1/3] usb: tegra: fix PHY selection code 2014-05-01 16:56 ` Stephen Warren @ 2014-05-02 4:47 ` Marek Vasut 2014-05-09 22:56 ` Stephen Warren 2014-05-14 17:26 ` Stephen Warren 0 siblings, 2 replies; 10+ messages in thread From: Marek Vasut @ 2014-05-02 4:47 UTC (permalink / raw) To: u-boot On Thursday, May 01, 2014 at 06:56:24 PM, Stephen Warren wrote: > On 05/01/2014 04:49 AM, Marek Vasut wrote: > > On Wednesday, April 30, 2014 at 11:09:55 PM, Stephen Warren wrote: > >> From: Stephen Warren <swarren@nvidia.com> > >> > >> 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 7e44d9320ed4 "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. > > > > This doesn't apply on u-boot-usb/master , so I cannot pick this, sorry . > > Ah right. That's because I'm working on top of a merge of > u-boot-arm/master and u-boot/master, and that includes the following > changes to the Tegra USB driver that went in through u-boot-tegra/master > -> u-boot-arm/master rather than the USB tree: > > 8f9fd6caafb8 usb: tegra: combine header file > b1d615f3f102 usb: tegra: fix PHY configuration > b03f4b3742a7 usb: tegra: fix USB2 powerdown for Tegra30 and later > > What's the best fix here: > > * Wait until the previous patches get into u-boot/master, and > u-boot-usb/master picks them up, and then apply this series. > > * Apply this series to u-boot-tegra/master with your ack? > > There's little point my rebasing this series on top of > u-boot-usb/master, and applying it right now, since that will just cause > the same conflicts when u-boot-usb/master gets merged into u-boot/master. Fine, can you poke me when this happens so I can apply ? Thanks! Best regards, Marek Vasut ^ permalink raw reply [flat|nested] 10+ messages in thread
* [U-Boot] [PATCH 1/3] usb: tegra: fix PHY selection code 2014-05-02 4:47 ` Marek Vasut @ 2014-05-09 22:56 ` Stephen Warren 2014-05-14 17:26 ` Stephen Warren 1 sibling, 0 replies; 10+ messages in thread From: Stephen Warren @ 2014-05-09 22:56 UTC (permalink / raw) To: u-boot On 05/01/2014 10:47 PM, Marek Vasut wrote: > On Thursday, May 01, 2014 at 06:56:24 PM, Stephen Warren wrote: >> On 05/01/2014 04:49 AM, Marek Vasut wrote: >>> On Wednesday, April 30, 2014 at 11:09:55 PM, Stephen Warren wrote: >>>> From: Stephen Warren <swarren@nvidia.com> >>>> >>>> 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 7e44d9320ed4 "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. >>> >>> This doesn't apply on u-boot-usb/master , so I cannot pick this, sorry . >> >> Ah right. That's because I'm working on top of a merge of >> u-boot-arm/master and u-boot/master, and that includes the following >> changes to the Tegra USB driver that went in through u-boot-tegra/master >> -> u-boot-arm/master rather than the USB tree: >> >> 8f9fd6caafb8 usb: tegra: combine header file >> b1d615f3f102 usb: tegra: fix PHY configuration >> b03f4b3742a7 usb: tegra: fix USB2 powerdown for Tegra30 and later >> >> What's the best fix here: >> >> * Wait until the previous patches get into u-boot/master, and >> u-boot-usb/master picks them up, and then apply this series. >> >> * Apply this series to u-boot-tegra/master with your ack? >> >> There's little point my rebasing this series on top of >> u-boot-usb/master, and applying it right now, since that will just cause >> the same conflicts when u-boot-usb/master gets merged into u-boot/master. > > Fine, can you poke me when this happens so I can apply ? Everything that's needed to apply these patches is now in u-boot/master. I validated that the patches apply there without git issues. ^ permalink raw reply [flat|nested] 10+ messages in thread
* [U-Boot] [PATCH 1/3] usb: tegra: fix PHY selection code 2014-05-02 4:47 ` Marek Vasut 2014-05-09 22:56 ` Stephen Warren @ 2014-05-14 17:26 ` Stephen Warren 2014-05-14 22:21 ` Marek Vasut 1 sibling, 1 reply; 10+ messages in thread From: Stephen Warren @ 2014-05-14 17:26 UTC (permalink / raw) To: u-boot On 05/01/2014 10:47 PM, Marek Vasut wrote: > On Thursday, May 01, 2014 at 06:56:24 PM, Stephen Warren wrote: >> On 05/01/2014 04:49 AM, Marek Vasut wrote: >>> On Wednesday, April 30, 2014 at 11:09:55 PM, Stephen Warren wrote: >>>> From: Stephen Warren <swarren@nvidia.com> >>>> >>>> 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 7e44d9320ed4 "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. >>> >>> This doesn't apply on u-boot-usb/master , so I cannot pick this, sorry . >> >> Ah right. That's because I'm working on top of a merge of >> u-boot-arm/master and u-boot/master, and that includes the following >> changes to the Tegra USB driver that went in through u-boot-tegra/master >> -> u-boot-arm/master rather than the USB tree: >> >> 8f9fd6caafb8 usb: tegra: combine header file >> b1d615f3f102 usb: tegra: fix PHY configuration >> b03f4b3742a7 usb: tegra: fix USB2 powerdown for Tegra30 and later >> >> What's the best fix here: >> >> * Wait until the previous patches get into u-boot/master, and >> u-boot-usb/master picks them up, and then apply this series. >> >> * Apply this series to u-boot-tegra/master with your ack? >> >> There's little point my rebasing this series on top of >> u-boot-usb/master, and applying it right now, since that will just cause >> the same conflicts when u-boot-usb/master gets merged into u-boot/master. > > Fine, can you poke me when this happens so I can apply ? Marek, these patches should apply now. I assume you still have a copy, or should I resend them? ^ permalink raw reply [flat|nested] 10+ messages in thread
* [U-Boot] [PATCH 1/3] usb: tegra: fix PHY selection code 2014-05-14 17:26 ` Stephen Warren @ 2014-05-14 22:21 ` Marek Vasut 0 siblings, 0 replies; 10+ messages in thread From: Marek Vasut @ 2014-05-14 22:21 UTC (permalink / raw) To: u-boot On Wednesday, May 14, 2014 at 07:26:36 PM, Stephen Warren wrote: > On 05/01/2014 10:47 PM, Marek Vasut wrote: > > On Thursday, May 01, 2014 at 06:56:24 PM, Stephen Warren wrote: > >> On 05/01/2014 04:49 AM, Marek Vasut wrote: > >>> On Wednesday, April 30, 2014 at 11:09:55 PM, Stephen Warren wrote: > >>>> From: Stephen Warren <swarren@nvidia.com> > >>>> > >>>> 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 7e44d9320ed4 "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. > >>> > >>> This doesn't apply on u-boot-usb/master , so I cannot pick this, sorry > >>> . Applied, thanks. Best regards, Marek Vasut ^ permalink raw reply [flat|nested] 10+ messages in thread
* [U-Boot] [PATCH 1/3] usb: tegra: fix PHY selection code 2014-04-30 21:09 [U-Boot] [PATCH 1/3] usb: tegra: fix PHY selection code Stephen Warren ` (2 preceding siblings ...) 2014-05-01 10:49 ` [U-Boot] [PATCH 1/3] usb: tegra: fix PHY selection code Marek Vasut @ 2014-05-12 12:34 ` Stefan Agner 3 siblings, 0 replies; 10+ messages in thread From: Stefan Agner @ 2014-05-12 12:34 UTC (permalink / raw) To: u-boot Am 2014-04-30 23:09, schrieb Stephen Warren: > From: Stephen Warren <swarren@nvidia.com> > > 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 7e44d9320ed4 "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. On Toradex Colibri T30, all USB, including USB2, are using the UTMI phy. I successfully tested this patchset on the Colibri T30 module (not yet in mainline U-Boot). Tested-by <stefan@agner.ch> -- Stefan ^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2014-05-14 22:21 UTC | newest] Thread overview: 10+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2014-04-30 21:09 [U-Boot] [PATCH 1/3] usb: tegra: fix PHY selection code Stephen Warren 2014-04-30 21:09 ` [U-Boot] [PATCH 2/3] usb: tegra: refactor PHY type selection Stephen Warren 2014-04-30 21:09 ` [U-Boot] [PATCH 3/3] usb: tegra: support device mode Stephen Warren 2014-05-01 10:49 ` [U-Boot] [PATCH 1/3] usb: tegra: fix PHY selection code Marek Vasut 2014-05-01 16:56 ` Stephen Warren 2014-05-02 4:47 ` Marek Vasut 2014-05-09 22:56 ` Stephen Warren 2014-05-14 17:26 ` Stephen Warren 2014-05-14 22:21 ` Marek Vasut 2014-05-12 12:34 ` Stefan Agner
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox