Skip to content
  • Stephen Warren's avatar
    ARM: tegra: always enable USB VBUS regulators · 30ca2226
    Stephen Warren authored
    This fixes a regression exposed during the merge window by commit
    9f310ded "ARM: tegra: fix VBUS regulator GPIO polarity in DT"; namely that
    USB VBUS doesn't get turned on, so USB devices are not detected. This
    affects the internal USB port on TrimSlice (i.e. the USB->SATA bridge, to
    which the SSD is connected) and the external port(s) on Seaboard/
    Springbank and Whistler.
    
    The Tegra DT as written in v3.11 allows two paths to enable USB VBUS:
    
    1) Via the legacy DT binding for the USB controller; it can directly
       acquire a VBUS GPIO and activate it.
    
    2) Via a regulator for VBUS, which is referenced by the new DT binding
       for the USB controller.
    
    Those two methods both use the same GPIO, and hence whichever of the
    USB controller and regulator gets probed first ends up owning the GPIO.
    In practice, the USB driver only supports path (1) above, since the
    patches to support the new USB binding are not present until v3.12:-(
    
    In practice, the regulator ends up being probed first and owning the
    GPIO. Since nothing enables the regulator (the USB driver code is not
    yet present), the regulator ends up being turned off. This originally
    caused no problem, because the polarity in the regulator definition was
    incorrect, so attempting to turn off the regulator actually turned it
    on, and everything worked:-(
    
    However, when testing the new USB driver code in v3.12, I noticed the
    incorrect polarity and fixed it in commit 9f310ded
    
     "ARM: tegra: fix VBUS
    regulator GPIO polarity in DT". In the context of v3.11, this patch then
    caused the USB VBUS to actually turn off, which broke USB ports with VBUS
    control. I got this patch included in v3.11-rc1 since it fixed a bug in
    device tree (incorrect polarity specification), and hence was suitable to
    be included early in the rc series. I evidently did not test the patch at
    all, or correctly, in the context of v3.11, and hence did not notice the
    issue that I have explained above:-(
    
    Fix this by making the USB VBUS regulators always enabled. This way, if
    the regulator owns the GPIO, it will always be turned on, even if there
    is no USB driver code to request the regulator be turned on. Even
    ignoring this bug, this is a reasonable way to configure the HW anyway.
    
    If this patch is applied to v3.11, it will cause a couple pretty trivial
    conflicts in tegra20-{trimslice,seaboard}.dts when creating v3.12, since
    the context right above the added lines changed in patches destined for
    v3.12.
    
    Reported-by: default avatarKyle McMartin <kmcmarti@redhat.com>
    Signed-off-by: default avatarStephen Warren <swarren@nvidia.com>
    Signed-off-by: default avatarOlof Johansson <olof@lixom.net>
    30ca2226