phy: msm: usb: Fix driver probe error path

Fix error path recovery of msm_otg_probe which leads to bootup
time warnings. Also use proper syntax for requesting IRQs and
GPIOs.

Change-Id: Ifac505b32c41f81f90ff5b942bf06c6714fa764d
Signed-off-by: Ajay Agarwal <ajaya@codeaurora.org>
diff --git a/drivers/usb/phy/phy-msm-usb.c b/drivers/usb/phy/phy-msm-usb.c
index d9a9546..936f7b2 100644
--- a/drivers/usb/phy/phy-msm-usb.c
+++ b/drivers/usb/phy/phy-msm-usb.c
@@ -3927,9 +3927,9 @@
 
 	if (!init) {
 		if (gadget_pdev) {
-			platform_device_unregister(gadget_pdev);
 			device_remove_file(&gadget_pdev->dev,
 					   &dev_attr_perf_mode);
+			platform_device_unregister(gadget_pdev);
 		}
 		if (host_pdev)
 			platform_device_unregister(host_pdev);
@@ -4845,7 +4845,7 @@
 		goto disable_core_clk;
 	}
 
-	ret = request_irq(motg->irq, msm_otg_irq, IRQF_SHARED,
+	ret = devm_request_irq(&pdev->dev, motg->irq, msm_otg_irq, IRQF_SHARED,
 					"msm_otg", motg);
 	if (ret) {
 		dev_err(&pdev->dev, "request irq failed\n");
@@ -4870,19 +4870,20 @@
 		udelay(200);
 		writeb_relaxed(0x0, USB2_PHY_USB_PHY_IRQ_CMD);
 
-		ret = request_irq(motg->phy_irq, msm_otg_phy_irq_handler,
-				IRQF_TRIGGER_RISING, "msm_otg_phy_irq", motg);
+		ret = devm_request_irq(&pdev->dev, motg->phy_irq,
+			msm_otg_phy_irq_handler, IRQF_TRIGGER_RISING,
+			"msm_otg_phy_irq", motg);
 		if (ret < 0) {
 			dev_err(&pdev->dev, "phy_irq request fail %d\n", ret);
-			goto free_irq;
+			goto destroy_wq;
 		}
 	}
 
-	ret = request_irq(motg->async_irq, msm_otg_irq,
+	ret = devm_request_irq(&pdev->dev, motg->async_irq, msm_otg_irq,
 				IRQF_TRIGGER_RISING, "msm_otg", motg);
 	if (ret) {
 		dev_err(&pdev->dev, "request irq failed (ASYNC INT)\n");
-		goto free_phy_irq;
+		goto destroy_wq;
 	}
 	disable_irq(motg->async_irq);
 
@@ -4905,7 +4906,7 @@
 	ret = usb_add_phy(&motg->phy, USB_PHY_TYPE_USB2);
 	if (ret) {
 		dev_err(&pdev->dev, "usb_add_phy failed\n");
-		goto free_async_irq;
+		goto destroy_wq;
 	}
 
 	ret = usb_phy_regulator_init(motg);
@@ -4920,12 +4921,12 @@
 
 		if (gpio_is_valid(motg->pdata->usb_id_gpio)) {
 			/* usb_id_gpio request */
-			ret = gpio_request(motg->pdata->usb_id_gpio,
-							"USB_ID_GPIO");
+			ret = devm_gpio_request(&pdev->dev,
+						motg->pdata->usb_id_gpio,
+						"USB_ID_GPIO");
 			if (ret < 0) {
 				dev_err(&pdev->dev, "gpio req failed for id\n");
-				motg->pdata->usb_id_gpio = 0;
-				goto remove_phy;
+				goto phy_reg_deinit;
 			}
 
 			/*
@@ -4942,7 +4943,7 @@
 						"qcom,hub-reset-gpio");
 				if (ret < 0) {
 					dev_err(&pdev->dev, "gpio req failed for hub reset\n");
-					goto remove_phy;
+					goto phy_reg_deinit;
 				}
 				gpio_direction_output(
 					motg->pdata->hub_reset_gpio, 1);
@@ -4954,7 +4955,7 @@
 						"qcom,sw-sel-gpio");
 				if (ret < 0) {
 					dev_err(&pdev->dev, "gpio req failed for switch sel\n");
-					goto remove_phy;
+					goto phy_reg_deinit;
 				}
 				if (gpio_get_value(motg->pdata->usb_id_gpio))
 					gpio_direction_input(
@@ -4974,14 +4975,14 @@
 		}
 
 		if (id_irq) {
-			ret = request_irq(id_irq,
+			ret = devm_request_irq(&pdev->dev, id_irq,
 					  msm_id_irq,
 					  IRQF_TRIGGER_RISING |
 					  IRQF_TRIGGER_FALLING,
 					  "msm_otg", motg);
 			if (ret) {
 				dev_err(&pdev->dev, "request irq failed for ID\n");
-				goto remove_phy;
+				goto phy_reg_deinit;
 			}
 		} else {
 			/* PMIC does USB ID detection and notifies through
@@ -5122,21 +5123,17 @@
 	if (pdev->dev.of_node)
 		msm_otg_setup_devices(pdev, motg->pdata->mode, false);
 remove_cdev:
-	if (!motg->ext_chg_device) {
+	if (motg->ext_chg_device) {
 		device_destroy(motg->ext_chg_class, motg->ext_chg_dev);
 		cdev_del(&motg->ext_chg_cdev);
 		class_destroy(motg->ext_chg_class);
 		unregister_chrdev_region(motg->ext_chg_dev, 1);
 	}
+	pm_runtime_disable(&pdev->dev);
+phy_reg_deinit:
+	devm_regulator_unregister(motg->phy.dev, motg->dpdm_rdev);
 remove_phy:
 	usb_remove_phy(&motg->phy);
-free_async_irq:
-	free_irq(motg->async_irq, motg);
-free_phy_irq:
-	if (motg->phy_irq)
-		free_irq(motg->phy_irq, motg);
-free_irq:
-	free_irq(motg->irq, motg);
 destroy_wq:
 	destroy_workqueue(motg->otg_wq);
 disable_core_clk:
@@ -5202,7 +5199,7 @@
 	extcon_unregister_notifier(motg->extcon_vbus, EXTCON_USB,
 							&motg->vbus_nb);
 
-	if (!motg->ext_chg_device) {
+	if (motg->ext_chg_device) {
 		device_destroy(motg->ext_chg_class, motg->ext_chg_dev);
 		cdev_del(&motg->ext_chg_cdev);
 		class_destroy(motg->ext_chg_class);
@@ -5226,12 +5223,7 @@
 	device_init_wakeup(&pdev->dev, 0);
 	pm_runtime_disable(&pdev->dev);
 
-	if (motg->phy_irq)
-		free_irq(motg->phy_irq, motg);
-	if (motg->pdata->pmic_id_irq)
-		free_irq(motg->pdata->pmic_id_irq, motg);
 	usb_remove_phy(phy);
-	free_irq(motg->irq, motg);
 
 	device_remove_file(&pdev->dev, &dev_attr_dpdm_pulldown_enable);