net: ethernet: ti: am65-cpsw/cpts: Fix CPTS release action
[linux-2.6-block.git] / drivers / net / ethernet / ti / am65-cpts.c
index bf0f74b20ba6f516c0874badf10e55a72303e8a8..16ee9c29cb35a5c77bfc186d7903a70519060b7b 100644 (file)
@@ -1052,14 +1052,13 @@ static int am65_cpts_of_parse(struct am65_cpts *cpts, struct device_node *node)
        return cpts_of_mux_clk_setup(cpts, node);
 }
 
-static void am65_cpts_release(void *data)
+void am65_cpts_release(struct am65_cpts *cpts)
 {
-       struct am65_cpts *cpts = data;
-
        ptp_clock_unregister(cpts->ptp_clock);
        am65_cpts_disable(cpts);
        clk_disable_unprepare(cpts->refclk);
 }
+EXPORT_SYMBOL_GPL(am65_cpts_release);
 
 struct am65_cpts *am65_cpts_create(struct device *dev, void __iomem *regs,
                                   struct device_node *node)
@@ -1139,18 +1138,12 @@ struct am65_cpts *am65_cpts_create(struct device *dev, void __iomem *regs,
        }
        cpts->phc_index = ptp_clock_index(cpts->ptp_clock);
 
-       ret = devm_add_action_or_reset(dev, am65_cpts_release, cpts);
-       if (ret) {
-               dev_err(dev, "failed to add ptpclk reset action %d", ret);
-               return ERR_PTR(ret);
-       }
-
        ret = devm_request_threaded_irq(dev, cpts->irq, NULL,
                                        am65_cpts_interrupt,
                                        IRQF_ONESHOT, dev_name(dev), cpts);
        if (ret < 0) {
                dev_err(cpts->dev, "error attaching irq %d\n", ret);
-               return ERR_PTR(ret);
+               goto reset_ptpclk;
        }
 
        dev_info(dev, "CPTS ver 0x%08x, freq:%u, add_val:%u pps:%d\n",
@@ -1159,6 +1152,8 @@ struct am65_cpts *am65_cpts_create(struct device *dev, void __iomem *regs,
 
        return cpts;
 
+reset_ptpclk:
+       am65_cpts_release(cpts);
 refclk_disable:
        clk_disable_unprepare(cpts->refclk);
        return ERR_PTR(ret);