[U-Boot] [PATCH v3 4/6] mvebu: usb: xhci: Add VBUS regulator supply to the host driver

Konstantin Porotchkin kostap at marvell.com
Wed Feb 8 15:45:25 UTC 2017


Hi, Marek,

On 02/08/2017 05:35 PM, Marek Vasut wrote:
> On 02/08/2017 04:34 PM, kostap at marvell.com wrote:
> > From: Konstantin Porotchkin <kostap at marvell.com>
> >
> > The USB device should linked to VBUS regulator through "vbus-supply"
> > DTS property.
> > This patch adds handling for "vbus-supply" property inside the USB
> > device entry for turning on the VBUS regulator upon the host adapter probe.
> >
> > Change-Id: Ibcf72d82298be42353ca03fee064ae8077a7b9de
> > Signed-off-by: Konstantin Porotchkin <kostap at marvell.com>
> > Cc: Stefan Roese <sr at denx.de>
> > Cc: Marek Vasut <marex at denx.de>
> > Cc: Nadav Haklai <nadavh at marvell.com>
> > Cc: Neta Zur Hershkovits <neta at marvell.com>
> > Cc: Igal Liberman <igall at marvell.com>
> > Cc: Haim Boot <hayim at marvell.com>
> > ---
> > Changes for v3:
> > - Moved VBUS control from private GPIO to a fixed regulator
> > - Rebase on top of master branch
> >
> >
> >  doc/device-tree-bindings/usb/marvell.xhci-usb.txt | 28 ++++++++++++++++++++
> >  drivers/usb/host/xhci-mvebu.c                     | 31 +++++++++++++++++++++++
> >  2 files changed, 59 insertions(+)
> >  create mode 100644 doc/device-tree-bindings/usb/marvell.xhci-usb.txt
> >
> > diff --git a/doc/device-tree-bindings/usb/marvell.xhci-usb.txt b/doc/device-tree-bindings/usb/marvell.xhci-usb.txt
> > new file mode 100644
> > index 0000000..672a829
> > --- /dev/null
> > +++ b/doc/device-tree-bindings/usb/marvell.xhci-usb.txt
> > @@ -0,0 +1,28 @@
> > +Marvell SOC USB controllers
> > +
> > +This controller is integrated in Armada 3700/8K.
> > +It uses the same properties as a generic XHCI host controller
> > +
> > +Required properties :
> > + - compatible: should be one or more of:
> > +   - "marvell,armada3700-xhci", "generic-xhci" for Armada 37xx SoCs
> > +   - "marvell,armada-8k-xhci", "generic-xhci" for Armada A8K SoCs
> > + - reg: should contain address and length of the standard XHCI
> > +   register set for the device.
> > + - interrupts: one XHCI interrupt should be described here.
> > +
> > +Optional properties:
> > + - clocks: reference to a clock
>
> What clock ? Why are clock optional ?
> This probably needs clock-names too.
This is the way it defined in Linux Kernel.
I took the Documentation/devicetree/bindings/usb/usb-xhci.txt file as a base for my add-on
>
> > + - vbus-supply : If present, specifies the fixed regulator to be turned on
> > +   for providing power to the USB VBUS rail.
> > +
> > +Example:
> > +    cpm_usb3_0: usb3 at 500000 {
> > +        compatible = "marvell,armada-8k-xhci",
> > +                 "generic-xhci";
> > +        reg = <0x500000 0x4000>;
> > +        interrupts = <GIC_SPI 62 IRQ_TYPE_LEVEL_HIGH>;
> > +        clocks = <&cpm_syscon0 1 22>;
> > +        vbus-supply = <&reg_usb3h0_vbus>;
> > +        status = "disabled";
> > +    };
> > diff --git a/drivers/usb/host/xhci-mvebu.c b/drivers/usb/host/xhci-mvebu.c
> > index 46eb937..149f6a4 100644
> > --- a/drivers/usb/host/xhci-mvebu.c
> > +++ b/drivers/usb/host/xhci-mvebu.c
> > @@ -45,7 +45,38 @@ static int xhci_usb_probe(struct udevice *dev)
> >      struct mvebu_xhci *ctx = dev_get_priv(dev);
> >      struct xhci_hcor *hcor;
> >      int len;
> > +#ifdef CONFIG_DM_REGULATOR_FIXED
>
> Just make the driver depend on REGULATOR_FIXED
I think the driver can work without regulator if the VBUS rail wired to the 5V power line.
We only need regulator support if this is GPIO controlled
>
> > +    const void *fdt = gd->fdt_blob;
> > +    int node = dev->of_offset;
> > +    const fdt32_t *regulator;
> > +    int size;
> >
> > +    /*
> > +     * The VBUS supply regulator is not probed automatically
> > +     * Trigger the regulator probe upon USB port bring up
> > +     */
> > +    regulator = fdt_getprop(fdt, node, "vbus-supply", &size);
> > +    if (regulator) {
> > +        uint32_t phandle;
> > +        struct udevice *config;
> > +        int reg_node, ret;
> > +
> > +        phandle = fdt32_to_cpu(*regulator);
> > +        reg_node = fdt_node_offset_by_phandle(fdt, phandle);
> > +        if (reg_node < 0) {
> > +            dev_err(dev, "vbus-supply has invalid phandle\n");
> > +            return -EINVAL;
> > +        }
> > +        ret = uclass_get_device_by_of_offset(UCLASS_REGULATOR,
> > +                             reg_node, &config);
> > +        if (ret) {
> > +            dev_err(dev, "failed to get VBUS regulator device\n");
> > +            return ret;
>
> Where is the regulator enabled ?
The regulator is fixed and it is "always-on", so assumed it is enough to probe it.
I have found that once it probed, the USB device becomes powered.
>
> > +        }
> > +    }
> > +#else
> > +    debug("VBUS regulator support is missing\n");
> > +#endif
> >      ctx->hcd = (struct xhci_hccr *)plat->hcd_base;
> >      len = HC_LENGTH(xhci_readl(&ctx->hcd->cr_capbase));
> >      hcor = (struct xhci_hcor *)((uintptr_t)ctx->hcd + len);
> >
>
>



More information about the U-Boot mailing list