RE: [PATCH v4 2/2] usb: chipidea: Refactor USB PHY selection and keep a single PHY

From: Peter Chen
Date: Fri Feb 22 2019 - 04:40:54 EST



>
> Refactor the code in charge of looking up the USB PHY when no platdata is
> provided. Attempt to get a generic USB PHY first, then look for a legacy USB PHY
> through device-tree and finally get any registered PHY with the correct type.
>
> This way, only a single USB PHY is obtained and the flow is easier to understand
> and follow.
>
> All error pointers (except for EPROBE_DEFER) are considered as PHY not found.
>
> Signed-off-by: Paul Kocialkowski <paul.kocialkowski@xxxxxxxxxxx>
> ---
> drivers/usb/chipidea/core.c | 49 ++++++++++++++++++++++++-------------
> 1 file changed, 32 insertions(+), 17 deletions(-)
>
> diff --git a/drivers/usb/chipidea/core.c b/drivers/usb/chipidea/core.c index
> 016e4004fe9d..27749ace2d93 100644
> --- a/drivers/usb/chipidea/core.c
> +++ b/drivers/usb/chipidea/core.c
> @@ -954,32 +954,47 @@ static int ci_hdrc_probe(struct platform_device *pdev)
> } else if (ci->platdata->usb_phy) {
> ci->usb_phy = ci->platdata->usb_phy;
> } else {
> - ci->usb_phy = devm_usb_get_phy_by_phandle(dev->parent, "phys",
> - 0);
> + /* Look for a generic PHY first */
> ci->phy = devm_phy_get(dev->parent, "usb-phy");
>
> - /* Fallback to grabbing any registered USB2 PHY */
> - if (IS_ERR(ci->usb_phy) &&
> - PTR_ERR(ci->usb_phy) != -EPROBE_DEFER)
> + if (PTR_ERR(ci->phy) == -EPROBE_DEFER) {
> + ret = -EPROBE_DEFER;
> + goto ulpi_exit;
> + } else if (IS_ERR(ci->phy)) {
> + ci->phy = NULL;
> + }
> +
> + /* Look for a legacy USB PHY from device-tree next */
> + if (!ci->phy) {
> + ci->usb_phy = devm_usb_get_phy_by_phandle(dev->parent,
> + "phys", 0);
> +
> + if (PTR_ERR(ci->usb_phy) == -EPROBE_DEFER) {
> + ret = -EPROBE_DEFER;
> + goto ulpi_exit;
> + } else if (IS_ERR(ci->usb_phy)) {
> + ci->usb_phy = NULL;
> + }
> + }
> +
> + /* Look for any registered legacy USB PHY as last resort */
> + if (!ci->phy && !ci->usb_phy) {
> ci->usb_phy = devm_usb_get_phy(dev->parent,
> USB_PHY_TYPE_USB2);
>
> - /* if both generic PHY and USB PHY layers aren't enabled */
> - if (PTR_ERR(ci->phy) == -ENOSYS &&
> - PTR_ERR(ci->usb_phy) == -ENXIO) {
> - ret = -ENXIO;
> - goto ulpi_exit;
> + if (PTR_ERR(ci->usb_phy) == -EPROBE_DEFER) {
> + ret = -EPROBE_DEFER;
> + goto ulpi_exit;
> + } else if (IS_ERR(ci->usb_phy)) {
> + ci->usb_phy = NULL;
> + }
> }
>
> - if (IS_ERR(ci->phy) && IS_ERR(ci->usb_phy)) {
> - ret = -EPROBE_DEFER;
> + /* No USB PHY was found in the end */
> + if (!ci->phy && !ci->usb_phy) {
> + ret = -ENXIO;
> goto ulpi_exit;
> }
> -
> - if (IS_ERR(ci->phy))
> - ci->phy = NULL;
> - else if (IS_ERR(ci->usb_phy))
> - ci->usb_phy = NULL;
> }
>

This patch should work, I will queue it if test is ok.

Peter