diff options
| author | Paul Kocialkowski <paul.kocialkowski@bootlin.com> | 2019-02-27 01:51:38 -0500 |
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2019-02-27 09:51:02 -0500 |
| commit | a3a47548332864887c212bff14dd1d0013ca4547 (patch) | |
| tree | bba07408f8eb75f07bfbb67fad334842ad869523 /drivers/usb/chipidea | |
| parent | 68ef236274793066b9ba3154b16c0acc1c891e5c (diff) | |
usb: chipidea: Refactor USB PHY selection and keep a single PHY
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@bootlin.com>
Signed-off-by: Peter Chen <peter.chen@nxp.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/usb/chipidea')
| -rw-r--r-- | drivers/usb/chipidea/core.c | 49 |
1 files 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) | |||
| 954 | } else if (ci->platdata->usb_phy) { | 954 | } else if (ci->platdata->usb_phy) { |
| 955 | ci->usb_phy = ci->platdata->usb_phy; | 955 | ci->usb_phy = ci->platdata->usb_phy; |
| 956 | } else { | 956 | } else { |
| 957 | ci->usb_phy = devm_usb_get_phy_by_phandle(dev->parent, "phys", | 957 | /* Look for a generic PHY first */ |
| 958 | 0); | ||
| 959 | ci->phy = devm_phy_get(dev->parent, "usb-phy"); | 958 | ci->phy = devm_phy_get(dev->parent, "usb-phy"); |
| 960 | 959 | ||
| 961 | /* Fallback to grabbing any registered USB2 PHY */ | 960 | if (PTR_ERR(ci->phy) == -EPROBE_DEFER) { |
| 962 | if (IS_ERR(ci->usb_phy) && | 961 | ret = -EPROBE_DEFER; |
| 963 | PTR_ERR(ci->usb_phy) != -EPROBE_DEFER) | 962 | goto ulpi_exit; |
| 963 | } else if (IS_ERR(ci->phy)) { | ||
| 964 | ci->phy = NULL; | ||
| 965 | } | ||
| 966 | |||
| 967 | /* Look for a legacy USB PHY from device-tree next */ | ||
| 968 | if (!ci->phy) { | ||
| 969 | ci->usb_phy = devm_usb_get_phy_by_phandle(dev->parent, | ||
| 970 | "phys", 0); | ||
| 971 | |||
| 972 | if (PTR_ERR(ci->usb_phy) == -EPROBE_DEFER) { | ||
| 973 | ret = -EPROBE_DEFER; | ||
| 974 | goto ulpi_exit; | ||
| 975 | } else if (IS_ERR(ci->usb_phy)) { | ||
| 976 | ci->usb_phy = NULL; | ||
| 977 | } | ||
| 978 | } | ||
| 979 | |||
| 980 | /* Look for any registered legacy USB PHY as last resort */ | ||
| 981 | if (!ci->phy && !ci->usb_phy) { | ||
| 964 | ci->usb_phy = devm_usb_get_phy(dev->parent, | 982 | ci->usb_phy = devm_usb_get_phy(dev->parent, |
| 965 | USB_PHY_TYPE_USB2); | 983 | USB_PHY_TYPE_USB2); |
| 966 | 984 | ||
| 967 | /* if both generic PHY and USB PHY layers aren't enabled */ | 985 | if (PTR_ERR(ci->usb_phy) == -EPROBE_DEFER) { |
| 968 | if (PTR_ERR(ci->phy) == -ENOSYS && | 986 | ret = -EPROBE_DEFER; |
| 969 | PTR_ERR(ci->usb_phy) == -ENXIO) { | 987 | goto ulpi_exit; |
| 970 | ret = -ENXIO; | 988 | } else if (IS_ERR(ci->usb_phy)) { |
| 971 | goto ulpi_exit; | 989 | ci->usb_phy = NULL; |
| 990 | } | ||
| 972 | } | 991 | } |
| 973 | 992 | ||
| 974 | if (IS_ERR(ci->phy) && IS_ERR(ci->usb_phy)) { | 993 | /* No USB PHY was found in the end */ |
| 975 | ret = -EPROBE_DEFER; | 994 | if (!ci->phy && !ci->usb_phy) { |
| 995 | ret = -ENXIO; | ||
| 976 | goto ulpi_exit; | 996 | goto ulpi_exit; |
| 977 | } | 997 | } |
| 978 | |||
| 979 | if (IS_ERR(ci->phy)) | ||
| 980 | ci->phy = NULL; | ||
| 981 | else if (IS_ERR(ci->usb_phy)) | ||
| 982 | ci->usb_phy = NULL; | ||
| 983 | } | 998 | } |
| 984 | 999 | ||
| 985 | ret = ci_usb_phy_init(ci); | 1000 | ret = ci_usb_phy_init(ci); |
