]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
net: sparx5: move PTP IRQ handling out of sparx5_start()
authorDaniel Machon <daniel.machon@microchip.com>
Fri, 27 Feb 2026 14:56:45 +0000 (15:56 +0100)
committerJakub Kicinski <kuba@kernel.org>
Tue, 3 Mar 2026 02:46:22 +0000 (18:46 -0800)
Move the PTP IRQ request into sparx5_ptp_init() so all PTP setup is
done in one place.

Also move the sparx5_ptp_init() call to right before
sparx5_register_netdevs() and add a cleanup_ptp label. Update remove()
to disable the PTP IRQ and reorder ptp_deinit accordingly.

Signed-off-by: Daniel Machon <daniel.machon@microchip.com>
Link: https://patch.msgid.link/20260227-sparx5-init-deinit-v2-7-10ba54ccf005@microchip.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/microchip/sparx5/sparx5_main.c
drivers/net/ethernet/microchip/sparx5/sparx5_ptp.c

index c2f8a6635715e310413221b08c76821e25eaaf6c..bea3959be58442e74878c9ebcf7cde5279ff3adb 100644 (file)
@@ -761,18 +761,6 @@ static int sparx5_start(struct sparx5 *sparx5)
                sparx5->xtr_irq = -ENXIO;
        }
 
-       if (sparx5->ptp_irq >= 0 &&
-           sparx5_has_feature(sparx5, SPX5_FEATURE_PTP)) {
-               err = devm_request_threaded_irq(sparx5->dev, sparx5->ptp_irq,
-                                               NULL, ops->ptp_irq_handler,
-                                               IRQF_ONESHOT, "sparx5-ptp",
-                                               sparx5);
-               if (err)
-                       sparx5->ptp_irq = -ENXIO;
-
-               sparx5->ptp = 1;
-       }
-
        return err;
 }
 
@@ -956,16 +944,10 @@ static int mchp_sparx5_probe(struct platform_device *pdev)
                goto cleanup_ports;
        }
 
-       err = sparx5_ptp_init(sparx5);
-       if (err) {
-               dev_err(sparx5->dev, "PTP failed\n");
-               goto cleanup_ports;
-       }
-
        err = sparx5_vcap_init(sparx5);
        if (err) {
                dev_err(sparx5->dev, "Failed to initialize VCAP\n");
-               goto cleanup_ptp;
+               goto cleanup_ports;
        }
 
        err = sparx5_mact_init(sparx5);
@@ -982,10 +964,16 @@ static int mchp_sparx5_probe(struct platform_device *pdev)
 
        INIT_LIST_HEAD(&sparx5->mall_entries);
 
+       err = sparx5_ptp_init(sparx5);
+       if (err) {
+               dev_err(sparx5->dev, "Failed to initialize PTP\n");
+               goto cleanup_stats;
+       }
+
        err = sparx5_register_netdevs(sparx5);
        if (err) {
                dev_err(sparx5->dev, "Failed to register net devices\n");
-               goto cleanup_stats;
+               goto cleanup_ptp;
        }
 
        err = sparx5_register_notifier_blocks(sparx5);
@@ -998,14 +986,14 @@ static int mchp_sparx5_probe(struct platform_device *pdev)
 
 cleanup_netdevs:
        sparx5_unregister_netdevs(sparx5);
+cleanup_ptp:
+       sparx5_ptp_deinit(sparx5);
 cleanup_stats:
        sparx5_stats_deinit(sparx5);
 cleanup_mact:
        sparx5_mact_deinit(sparx5);
 cleanup_vcap:
        sparx5_vcap_deinit(sparx5);
-cleanup_ptp:
-       sparx5_ptp_deinit(sparx5);
 cleanup_ports:
        sparx5_destroy_netdevs(sparx5);
 cleanup_config:
@@ -1031,10 +1019,10 @@ static void mchp_sparx5_remove(struct platform_device *pdev)
        }
        sparx5_unregister_notifier_blocks(sparx5);
        sparx5_unregister_netdevs(sparx5);
+       sparx5_ptp_deinit(sparx5);
        sparx5_stats_deinit(sparx5);
        sparx5_mact_deinit(sparx5);
        sparx5_vcap_deinit(sparx5);
-       sparx5_ptp_deinit(sparx5);
        ops->fdma_deinit(sparx5);
        sparx5_destroy_netdevs(sparx5);
 }
index 8b2e07821a950532e3cf065db3c75c406828209d..a16ec8136d6d635bd93ec277aeb1e1524d6543eb 100644 (file)
@@ -606,9 +606,22 @@ static int sparx5_ptp_phc_init(struct sparx5 *sparx5,
 int sparx5_ptp_init(struct sparx5 *sparx5)
 {
        u64 tod_adj = sparx5_ptp_get_nominal_value(sparx5);
+       const struct sparx5_ops *ops = sparx5->data->ops;
        struct sparx5_port *port;
        int err, i;
 
+       if (sparx5->ptp_irq >= 0 &&
+           sparx5_has_feature(sparx5, SPX5_FEATURE_PTP)) {
+               err = devm_request_threaded_irq(sparx5->dev, sparx5->ptp_irq,
+                                               NULL, ops->ptp_irq_handler,
+                                               IRQF_ONESHOT, "sparx5-ptp",
+                                               sparx5);
+               if (err)
+                       sparx5->ptp_irq = -ENXIO;
+
+               sparx5->ptp = 1;
+       }
+
        if (!sparx5->ptp)
                return 0;
 
@@ -660,6 +673,11 @@ void sparx5_ptp_deinit(struct sparx5 *sparx5)
        struct sparx5_port *port;
        int i;
 
+       if (sparx5->ptp_irq >= 0) {
+               disable_irq(sparx5->ptp_irq);
+               sparx5->ptp_irq = -ENXIO;
+       }
+
        for (i = 0; i < sparx5->data->consts->n_ports; i++) {
                port = sparx5->ports[i];
                if (!port)