aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/chipidea
diff options
context:
space:
mode:
authorPaul Kocialkowski <paul.kocialkowski@bootlin.com>2019-02-27 01:51:38 -0500
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2019-02-27 09:51:02 -0500
commita3a47548332864887c212bff14dd1d0013ca4547 (patch)
treebba07408f8eb75f07bfbb67fad334842ad869523 /drivers/usb/chipidea
parent68ef236274793066b9ba3154b16c0acc1c891e5c (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.c49
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);