[U-Boot] [PATCH v4 04/11] usb: host: xhci-rockchip: use fixed regulator to control vbus

rock-chips(daniel.meng) daniel.meng at rock-chips.com
Fri Jun 9 14:01:11 UTC 2017



On 2017/6/9 16:22, Marek Vasut wrote:
> On 06/09/2017 09:49 AM, rock-chips(daniel.meng) wrote:
>>
>> On 2017/6/8 21:17, Marek Vasut wrote:
>>> On 06/08/2017 09:31 AM, Meng Dongyang wrote:
>>>> Use fixed regulator to control the voltage of vbus and turn off
>>>> vbus when usb stop.
>>>>
>>>> Signed-off-by: Meng Dongyang <daniel.meng at rock-chips.com>
>>>> ---
>>>>
>>>> Changes in v4:
>>>> - Splited from patch [Uboot,v3,04/10]
>>>> - Define set vbus as empty function if the macros aren't set
>>>>
>>>> Changes in v3: None
>>>> Changes in v2:
>>>> - Use fixed regulator to control vbus instead of gpio
>>>>
>>>>    drivers/usb/host/xhci-rockchip.c | 41
>>>> +++++++++++++++++++++++++++++++---------
>>>>    1 file changed, 32 insertions(+), 9 deletions(-)
>>>>
>>>> diff --git a/drivers/usb/host/xhci-rockchip.c
>>>> b/drivers/usb/host/xhci-rockchip.c
>>>> index f559830..dc9cd56 100644
>>>> --- a/drivers/usb/host/xhci-rockchip.c
>>>> +++ b/drivers/usb/host/xhci-rockchip.c
>>>> @@ -11,10 +11,10 @@
>>>>    #include <malloc.h>
>>>>    #include <usb.h>
>>>>    #include <watchdog.h>
>>>> -#include <asm/gpio.h>
>>>>    #include <linux/errno.h>
>>>>    #include <linux/compat.h>
>>>>    #include <linux/usb/dwc3.h>
>>>> +#include <power/regulator.h>
>>>>      #include "xhci.h"
>>>>    @@ -23,7 +23,7 @@ DECLARE_GLOBAL_DATA_PTR;
>>>>    struct rockchip_xhci_platdata {
>>>>        fdt_addr_t hcd_base;
>>>>        fdt_addr_t phy_base;
>>>> -    struct gpio_desc vbus_gpio;
>>>> +    struct udevice *vbus_supply;
>>>>    };
>>>>      /*
>>>> @@ -66,15 +66,37 @@ static int xhci_usb_ofdata_to_platdata(struct
>>>> udevice *dev)
>>>>            return -ENXIO;
>>>>        }
>>>>    -    /* Vbus gpio */
>>>> -    ret = gpio_request_by_name(dev, "rockchip,vbus-gpio", 0,
>>>> -                   &plat->vbus_gpio, GPIOD_IS_OUT);
>>>> +#if defined(CONFIG_DM_USB) && defined(CONFIG_DM_REGULATOR)
>>>> +    /* Vbus regulator */
>>>> +    ret = device_get_supply_regulator(dev, "vbus-supply",
>>>> +                      &plat->vbus_supply);
>>>>        if (ret)
>>>> -        debug("rockchip,vbus-gpio node missing!");
>>>> +        debug("Can't get vbus supply\n");
>>> VBUS in caps
change the print message?
debug("Can't get VBUS regulator\n")  ?
>>>
>>>> +#endif
>>>>          return 0;
>>>>    }
>>>>    +#if defined(CONFIG_DM_USB) && defined(CONFIG_DM_REGULATOR)
>>>> +static int rockchip_xhci_set_vbus(struct rockchip_xhci_platdata *plat,
>>>> +                  bool value)
>>>> +{
>>>> +    int ret = 0;
>>> You don't need to init ret, it's always set right below.
OK, I will correct
>>>
>>>> +
>>>> +    ret = regulator_set_enable(plat->vbus_supply, value);
>>>> +    if (ret)
>>>> +        debug("XHCI: Failed to set vbus supply\n");
>>> That shouldn't be debug, that's a printf() because it's actually a
>>> failure. Or error() I guess ...
>> Considering the case vbus is always on, it is right with no vbus regulator.
>> So maybe it's not an error actually.
> Regulator failed to turn on, that's an error, right ?
> Why would VBUS be always on ? You can just add a GPIO-regulator into the
> DT and then the VBUS is no longer always on.
It's certainly right adding a GPIO-regulator into the DT. But when it's 
designed
as  a host only port, the VBUS would be fixed to on by hardware and 
there is no
gpio for it. In this case, setting regulator will return fail, but it's 
also a right case.
So I think it can be treated as  a debug or warning message.
>
>>>> +    return ret;
>>>> +}
>>>> +#else
>>>> +static int rockchip_xhci_set_vbus(struct rockchip_xhci_platdata *plat,
>>>> +                  bool value)
>>>> +{
>>>> +    return 0;
>>>> +}
>>>> +#endif
>>>> +
>>>>    /*
>>>>     * rockchip_dwc3_phy_setup() - Configure USB PHY Interface of DWC3
>>>> Core
>>>>     * @dwc: Pointer to our controller context structure
>>>> @@ -153,9 +175,7 @@ static int xhci_usb_probe(struct udevice *dev)
>>>>        hcor = (struct xhci_hcor *)((uint64_t)ctx->hcd +
>>>>                HC_LENGTH(xhci_readl(&ctx->hcd->cr_capbase)));
>>>>    -    /* setup the Vbus gpio here */
>>>> -    if (dm_gpio_is_valid(&plat->vbus_gpio))
>>>> -        dm_gpio_set_value(&plat->vbus_gpio, 1);
>>>> +    rockchip_xhci_set_vbus(plat, true);
>>> What about handling the return value ?
>> The return value can be ignored when vbus is always on. So is it enough
>> just print message in
>> the rockchip_xhci_set_vbus function?
> See above, why is VBUS always on
answer above
>
>>>>        ret = rockchip_xhci_core_init(ctx, dev);
>>>>        if (ret) {
>>>> @@ -168,6 +188,7 @@ static int xhci_usb_probe(struct udevice *dev)
>>>>      static int xhci_usb_remove(struct udevice *dev)
>>>>    {
>>>> +    struct rockchip_xhci_platdata *plat = dev_get_platdata(dev);
>>>>        struct rockchip_xhci *ctx = dev_get_priv(dev);
>>>>        int ret;
>>>>    @@ -178,6 +199,8 @@ static int xhci_usb_remove(struct udevice *dev)
>>>>        if (ret)
>>>>            return ret;
>>>>    +    rockchip_xhci_set_vbus(plat, false);
>>> Handle return value
I think print message may be  is enough.
>>>
>>>>        return 0;
>>>>    }
>>>>   
>>
>




More information about the U-Boot mailing list