USB: dwc3: qcom: simplify wakeup interrupt setup
[linux-2.6-microblaze.git] / drivers / usb / dwc3 / dwc3-qcom.c
index 79b22ab..8a76973 100644 (file)
@@ -167,7 +167,8 @@ static int dwc3_qcom_register_extcon(struct dwc3_qcom *qcom)
 
        qcom->edev = extcon_get_edev_by_phandle(dev, 0);
        if (IS_ERR(qcom->edev))
-               return PTR_ERR(qcom->edev);
+               return dev_err_probe(dev, PTR_ERR(qcom->edev),
+                                    "Failed to get extcon\n");
 
        qcom->vbus_nb.notifier_call = dwc3_qcom_vbus_notifier;
 
@@ -252,16 +253,14 @@ static int dwc3_qcom_interconnect_init(struct dwc3_qcom *qcom)
 
        qcom->icc_path_ddr = of_icc_get(dev, "usb-ddr");
        if (IS_ERR(qcom->icc_path_ddr)) {
-               dev_err(dev, "failed to get usb-ddr path: %ld\n",
-                               PTR_ERR(qcom->icc_path_ddr));
-               return PTR_ERR(qcom->icc_path_ddr);
+               return dev_err_probe(dev, PTR_ERR(qcom->icc_path_ddr),
+                                    "failed to get usb-ddr path\n");
        }
 
        qcom->icc_path_apps = of_icc_get(dev, "apps-usb");
        if (IS_ERR(qcom->icc_path_apps)) {
-               dev_err(dev, "failed to get apps-usb path: %ld\n",
-                               PTR_ERR(qcom->icc_path_apps));
-               ret = PTR_ERR(qcom->icc_path_apps);
+               ret = dev_err_probe(dev, PTR_ERR(qcom->icc_path_apps),
+                                   "failed to get apps-usb path\n");
                goto put_path_ddr;
        }
 
@@ -547,10 +546,9 @@ static int dwc3_qcom_setup_irq(struct platform_device *pdev)
                                pdata ? pdata->hs_phy_irq_index : -1);
        if (irq > 0) {
                /* Keep wakeup interrupts disabled until suspend */
-               irq_set_status_flags(irq, IRQ_NOAUTOEN);
                ret = devm_request_threaded_irq(qcom->dev, irq, NULL,
                                        qcom_dwc3_resume_irq,
-                                       IRQF_TRIGGER_HIGH | IRQF_ONESHOT,
+                                       IRQF_ONESHOT | IRQF_NO_AUTOEN,
                                        "qcom_dwc3 HS", qcom);
                if (ret) {
                        dev_err(qcom->dev, "hs_phy_irq failed: %d\n", ret);
@@ -562,10 +560,9 @@ static int dwc3_qcom_setup_irq(struct platform_device *pdev)
        irq = dwc3_qcom_get_irq(pdev, "dp_hs_phy_irq",
                                pdata ? pdata->dp_hs_phy_irq_index : -1);
        if (irq > 0) {
-               irq_set_status_flags(irq, IRQ_NOAUTOEN);
                ret = devm_request_threaded_irq(qcom->dev, irq, NULL,
                                        qcom_dwc3_resume_irq,
-                                       IRQF_TRIGGER_HIGH | IRQF_ONESHOT,
+                                       IRQF_ONESHOT | IRQF_NO_AUTOEN,
                                        "qcom_dwc3 DP_HS", qcom);
                if (ret) {
                        dev_err(qcom->dev, "dp_hs_phy_irq failed: %d\n", ret);
@@ -577,10 +574,9 @@ static int dwc3_qcom_setup_irq(struct platform_device *pdev)
        irq = dwc3_qcom_get_irq(pdev, "dm_hs_phy_irq",
                                pdata ? pdata->dm_hs_phy_irq_index : -1);
        if (irq > 0) {
-               irq_set_status_flags(irq, IRQ_NOAUTOEN);
                ret = devm_request_threaded_irq(qcom->dev, irq, NULL,
                                        qcom_dwc3_resume_irq,
-                                       IRQF_TRIGGER_HIGH | IRQF_ONESHOT,
+                                       IRQF_ONESHOT | IRQF_NO_AUTOEN,
                                        "qcom_dwc3 DM_HS", qcom);
                if (ret) {
                        dev_err(qcom->dev, "dm_hs_phy_irq failed: %d\n", ret);
@@ -592,10 +588,9 @@ static int dwc3_qcom_setup_irq(struct platform_device *pdev)
        irq = dwc3_qcom_get_irq(pdev, "ss_phy_irq",
                                pdata ? pdata->ss_phy_irq_index : -1);
        if (irq > 0) {
-               irq_set_status_flags(irq, IRQ_NOAUTOEN);
                ret = devm_request_threaded_irq(qcom->dev, irq, NULL,
                                        qcom_dwc3_resume_irq,
-                                       IRQF_TRIGGER_HIGH | IRQF_ONESHOT,
+                                       IRQF_ONESHOT | IRQF_NO_AUTOEN,
                                        "qcom_dwc3 SS", qcom);
                if (ret) {
                        dev_err(qcom->dev, "ss_phy_irq failed: %d\n", ret);
@@ -800,6 +795,7 @@ static int dwc3_qcom_probe(struct platform_device *pdev)
        struct device           *dev = &pdev->dev;
        struct dwc3_qcom        *qcom;
        struct resource         *res, *parent_res = NULL;
+       struct resource         local_res;
        int                     ret, i;
        bool                    ignore_pipe_clk;
        bool                    wakeup_source;
@@ -821,9 +817,8 @@ static int dwc3_qcom_probe(struct platform_device *pdev)
 
        qcom->resets = devm_reset_control_array_get_optional_exclusive(dev);
        if (IS_ERR(qcom->resets)) {
-               ret = PTR_ERR(qcom->resets);
-               dev_err(&pdev->dev, "failed to get resets, err=%d\n", ret);
-               return ret;
+               return dev_err_probe(&pdev->dev, PTR_ERR(qcom->resets),
+                                    "failed to get resets\n");
        }
 
        ret = reset_control_assert(qcom->resets);
@@ -842,7 +837,7 @@ static int dwc3_qcom_probe(struct platform_device *pdev)
 
        ret = dwc3_qcom_clk_init(qcom, of_clk_get_parent_count(np));
        if (ret) {
-               dev_err(dev, "failed to get clocks\n");
+               dev_err_probe(dev, ret, "failed to get clocks\n");
                goto reset_assert;
        }
 
@@ -851,9 +846,8 @@ static int dwc3_qcom_probe(struct platform_device *pdev)
        if (np) {
                parent_res = res;
        } else {
-               parent_res = kmemdup(res, sizeof(struct resource), GFP_KERNEL);
-               if (!parent_res)
-                       return -ENOMEM;
+               memcpy(&local_res, res, sizeof(struct resource));
+               parent_res = &local_res;
 
                parent_res->start = res->start +
                        qcom->acpi_pdata->qscratch_base_offset;
@@ -865,9 +859,10 @@ static int dwc3_qcom_probe(struct platform_device *pdev)
                        if (IS_ERR_OR_NULL(qcom->urs_usb)) {
                                dev_err(dev, "failed to create URS USB platdev\n");
                                if (!qcom->urs_usb)
-                                       return -ENODEV;
+                                       ret = -ENODEV;
                                else
-                                       return PTR_ERR(qcom->urs_usb);
+                                       ret = PTR_ERR(qcom->urs_usb);
+                               goto clk_disable;
                        }
                }
        }
@@ -947,14 +942,18 @@ reset_assert:
        return ret;
 }
 
-static int dwc3_qcom_remove(struct platform_device *pdev)
+static void dwc3_qcom_remove(struct platform_device *pdev)
 {
        struct dwc3_qcom *qcom = platform_get_drvdata(pdev);
+       struct device_node *np = pdev->dev.of_node;
        struct device *dev = &pdev->dev;
        int i;
 
        device_remove_software_node(&qcom->dwc3->dev);
-       of_platform_depopulate(dev);
+       if (np)
+               of_platform_depopulate(&pdev->dev);
+       else
+               platform_device_put(pdev);
 
        for (i = qcom->num_clocks - 1; i >= 0; i--) {
                clk_disable_unprepare(qcom->clks[i]);
@@ -967,8 +966,6 @@ static int dwc3_qcom_remove(struct platform_device *pdev)
 
        pm_runtime_allow(dev);
        pm_runtime_disable(dev);
-
-       return 0;
 }
 
 static int __maybe_unused dwc3_qcom_pm_suspend(struct device *dev)
@@ -1061,7 +1058,7 @@ MODULE_DEVICE_TABLE(acpi, dwc3_qcom_acpi_match);
 
 static struct platform_driver dwc3_qcom_driver = {
        .probe          = dwc3_qcom_probe,
-       .remove         = dwc3_qcom_remove,
+       .remove_new     = dwc3_qcom_remove,
        .driver         = {
                .name   = "dwc3-qcom",
                .pm     = &dwc3_qcom_dev_pm_ops,