net: stmmac: fix order of dwmac5 FlexPPS parametrization sequence
authorJohannes Zink <j.zink@pengutronix.de>
Fri, 10 Feb 2023 14:39:37 +0000 (15:39 +0100)
committerJakub Kicinski <kuba@kernel.org>
Tue, 14 Feb 2023 04:04:43 +0000 (20:04 -0800)
So far changing the period by just setting new period values while
running did not work.

The order as indicated by the publicly available reference manual of the i.MX8MP [1]
indicates a sequence:

 * initiate the programming sequence
 * set the values for PPS period and start time
 * start the pulse train generation.

This is currently not used in dwmac5_flex_pps_config(), which instead does:

 * initiate the programming sequence and immediately start the pulse train generation
 * set the values for PPS period and start time

This caused the period values written not to take effect until the FlexPPS output was
disabled and re-enabled again.

This patch fix the order and allows the period to be set immediately.

[1] https://www.nxp.com/webapp/Download?colCode=IMX8MPRM

Fixes: 9a8a02c9d46d ("net: stmmac: Add Flexible PPS support")
Signed-off-by: Johannes Zink <j.zink@pengutronix.de>
Link: https://lore.kernel.org/r/20230210143937.3427483-1-j.zink@pengutronix.de
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/stmicro/stmmac/dwmac5.c

index 413f660172199c7b893072befd3dce0170a43cc2..e95d35f1e5a0c8f7932601905bdf2b9fb7600e1e 100644 (file)
@@ -541,9 +541,9 @@ int dwmac5_flex_pps_config(void __iomem *ioaddr, int index,
                return 0;
        }
 
-       val |= PPSCMDx(index, 0x2);
        val |= TRGTMODSELx(index, 0x2);
        val |= PPSEN0;
+       writel(val, ioaddr + MAC_PPS_CONTROL);
 
        writel(cfg->start.tv_sec, ioaddr + MAC_PPSx_TARGET_TIME_SEC(index));
 
@@ -568,6 +568,7 @@ int dwmac5_flex_pps_config(void __iomem *ioaddr, int index,
        writel(period - 1, ioaddr + MAC_PPSx_WIDTH(index));
 
        /* Finally, activate it */
+       val |= PPSCMDx(index, 0x2);
        writel(val, ioaddr + MAC_PPS_CONTROL);
        return 0;
 }