diff options
author | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2017-06-27 11:35:31 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2017-06-27 11:35:31 -0400 |
commit | 6e5c7514e77d168da79a9ad1a430bd702ccf1659 (patch) | |
tree | f424bf8b978fe0256e3d92120d8bcdaf5404366e /drivers/usb/chipidea/core.c | |
parent | 9c691cc9f8b5f2f866f1235800f03a1d7a06c1af (diff) | |
parent | c4a0bbbdb7f6e3c37fa6deb3ef28c5ed99da6175 (diff) |
Merge tag 'usb-ci-v4.13-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/peter.chen/usb into usb-next
Peter writes:
One patch to improve error handling at chipidea core
Diffstat (limited to 'drivers/usb/chipidea/core.c')
-rw-r--r-- | drivers/usb/chipidea/core.c | 29 |
1 files changed, 21 insertions, 8 deletions
diff --git a/drivers/usb/chipidea/core.c b/drivers/usb/chipidea/core.c index fe4fe2440729..b17ed3a9a304 100644 --- a/drivers/usb/chipidea/core.c +++ b/drivers/usb/chipidea/core.c | |||
@@ -818,7 +818,7 @@ static inline void ci_role_destroy(struct ci_hdrc *ci) | |||
818 | { | 818 | { |
819 | ci_hdrc_gadget_destroy(ci); | 819 | ci_hdrc_gadget_destroy(ci); |
820 | ci_hdrc_host_destroy(ci); | 820 | ci_hdrc_host_destroy(ci); |
821 | if (ci->is_otg) | 821 | if (ci->is_otg && ci->roles[CI_ROLE_GADGET]) |
822 | ci_hdrc_otg_destroy(ci); | 822 | ci_hdrc_otg_destroy(ci); |
823 | } | 823 | } |
824 | 824 | ||
@@ -980,27 +980,35 @@ static int ci_hdrc_probe(struct platform_device *pdev) | |||
980 | /* initialize role(s) before the interrupt is requested */ | 980 | /* initialize role(s) before the interrupt is requested */ |
981 | if (dr_mode == USB_DR_MODE_OTG || dr_mode == USB_DR_MODE_HOST) { | 981 | if (dr_mode == USB_DR_MODE_OTG || dr_mode == USB_DR_MODE_HOST) { |
982 | ret = ci_hdrc_host_init(ci); | 982 | ret = ci_hdrc_host_init(ci); |
983 | if (ret) | 983 | if (ret) { |
984 | dev_info(dev, "doesn't support host\n"); | 984 | if (ret == -ENXIO) |
985 | dev_info(dev, "doesn't support host\n"); | ||
986 | else | ||
987 | goto deinit_phy; | ||
988 | } | ||
985 | } | 989 | } |
986 | 990 | ||
987 | if (dr_mode == USB_DR_MODE_OTG || dr_mode == USB_DR_MODE_PERIPHERAL) { | 991 | if (dr_mode == USB_DR_MODE_OTG || dr_mode == USB_DR_MODE_PERIPHERAL) { |
988 | ret = ci_hdrc_gadget_init(ci); | 992 | ret = ci_hdrc_gadget_init(ci); |
989 | if (ret) | 993 | if (ret) { |
990 | dev_info(dev, "doesn't support gadget\n"); | 994 | if (ret == -ENXIO) |
995 | dev_info(dev, "doesn't support gadget\n"); | ||
996 | else | ||
997 | goto deinit_host; | ||
998 | } | ||
991 | } | 999 | } |
992 | 1000 | ||
993 | if (!ci->roles[CI_ROLE_HOST] && !ci->roles[CI_ROLE_GADGET]) { | 1001 | if (!ci->roles[CI_ROLE_HOST] && !ci->roles[CI_ROLE_GADGET]) { |
994 | dev_err(dev, "no supported roles\n"); | 1002 | dev_err(dev, "no supported roles\n"); |
995 | ret = -ENODEV; | 1003 | ret = -ENODEV; |
996 | goto deinit_phy; | 1004 | goto deinit_gadget; |
997 | } | 1005 | } |
998 | 1006 | ||
999 | if (ci->is_otg && ci->roles[CI_ROLE_GADGET]) { | 1007 | if (ci->is_otg && ci->roles[CI_ROLE_GADGET]) { |
1000 | ret = ci_hdrc_otg_init(ci); | 1008 | ret = ci_hdrc_otg_init(ci); |
1001 | if (ret) { | 1009 | if (ret) { |
1002 | dev_err(dev, "init otg fails, ret = %d\n", ret); | 1010 | dev_err(dev, "init otg fails, ret = %d\n", ret); |
1003 | goto stop; | 1011 | goto deinit_gadget; |
1004 | } | 1012 | } |
1005 | } | 1013 | } |
1006 | 1014 | ||
@@ -1070,7 +1078,12 @@ static int ci_hdrc_probe(struct platform_device *pdev) | |||
1070 | remove_debug: | 1078 | remove_debug: |
1071 | dbg_remove_files(ci); | 1079 | dbg_remove_files(ci); |
1072 | stop: | 1080 | stop: |
1073 | ci_role_destroy(ci); | 1081 | if (ci->is_otg && ci->roles[CI_ROLE_GADGET]) |
1082 | ci_hdrc_otg_destroy(ci); | ||
1083 | deinit_gadget: | ||
1084 | ci_hdrc_gadget_destroy(ci); | ||
1085 | deinit_host: | ||
1086 | ci_hdrc_host_destroy(ci); | ||
1074 | deinit_phy: | 1087 | deinit_phy: |
1075 | ci_usb_phy_exit(ci); | 1088 | ci_usb_phy_exit(ci); |
1076 | ulpi_exit: | 1089 | ulpi_exit: |