aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/chipidea/core.c
diff options
context:
space:
mode:
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>2017-06-27 11:35:31 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2017-06-27 11:35:31 -0400
commit6e5c7514e77d168da79a9ad1a430bd702ccf1659 (patch)
treef424bf8b978fe0256e3d92120d8bcdaf5404366e /drivers/usb/chipidea/core.c
parent9c691cc9f8b5f2f866f1235800f03a1d7a06c1af (diff)
parentc4a0bbbdb7f6e3c37fa6deb3ef28c5ed99da6175 (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.c29
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)
1070remove_debug: 1078remove_debug:
1071 dbg_remove_files(ci); 1079 dbg_remove_files(ci);
1072stop: 1080stop:
1073 ci_role_destroy(ci); 1081 if (ci->is_otg && ci->roles[CI_ROLE_GADGET])
1082 ci_hdrc_otg_destroy(ci);
1083deinit_gadget:
1084 ci_hdrc_gadget_destroy(ci);
1085deinit_host:
1086 ci_hdrc_host_destroy(ci);
1074deinit_phy: 1087deinit_phy:
1075 ci_usb_phy_exit(ci); 1088 ci_usb_phy_exit(ci);
1076ulpi_exit: 1089ulpi_exit: