net: dsa: microchip: ptp: lan937x: Enable periodic output in LED pins
authorArun Ramadoss <arun.ramadoss@microchip.com>
Tue, 10 Jan 2023 08:49:30 +0000 (14:19 +0530)
committerDavid S. Miller <davem@davemloft.net>
Fri, 13 Jan 2023 08:40:41 +0000 (08:40 +0000)
There is difference in implementation of per_out pins between KSZ9563
and LAN937x. In KSZ9563, Timestamping control register (0x052C) bit 6,
if 1 - timestamp input and 0 - trigger output. But it is opposite for
LAN937x 1 - trigger output and 0 - timestamp input.
As per per_out gpio pins, KSZ9563 has four Led pins and two dedicated
gpio pins. But in LAN937x dedicated gpio pins are removed instead there
are up to 10 LED pins out of which LED_0 and LED_1 can be mapped to PTP
tou 0, 1 or 2. This patch sets the bit 6 in 0x052C register and
configure the LED override and source register for LAN937x series of
switches alone.

Signed-off-by: Arun Ramadoss <arun.ramadoss@microchip.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/dsa/microchip/ksz_ptp.c
drivers/net/dsa/microchip/ksz_ptp_reg.h

index 3ba36d33e8304d9361a08e28d1af03eb678d941b..a66a256f881420df412601a3c115794a2f67b988 100644 (file)
 
 #define KSZ_PTP_INT_START 13
 
+static int ksz_ptp_tou_gpio(struct ksz_device *dev)
+{
+       int ret;
+
+       if (!is_lan937x(dev))
+               return 0;
+
+       ret = ksz_rmw32(dev, REG_PTP_CTRL_STAT__4, GPIO_OUT,
+                       GPIO_OUT);
+       if (ret)
+               return ret;
+
+       ret = ksz_rmw32(dev, REG_SW_GLOBAL_LED_OVR__4, LED_OVR_1 | LED_OVR_2,
+                       LED_OVR_1 | LED_OVR_2);
+       if (ret)
+               return ret;
+
+       return ksz_rmw32(dev, REG_SW_GLOBAL_LED_SRC__4,
+                        LED_SRC_PTP_GPIO_1 | LED_SRC_PTP_GPIO_2,
+                        LED_SRC_PTP_GPIO_1 | LED_SRC_PTP_GPIO_2);
+}
+
 static int ksz_ptp_tou_reset(struct ksz_device *dev, u8 unit)
 {
        u32 data;
@@ -224,6 +246,10 @@ static int ksz_ptp_enable_perout(struct ksz_device *dev,
        if (ret)
                return ret;
 
+       ret = ksz_ptp_tou_gpio(dev);
+       if (ret)
+               return ret;
+
        ret = ksz_ptp_tou_start(dev, request->index);
        if (ret)
                return ret;
index c5c76b9a4329613f6d20f31ff48e93108bf52230..d71e85510cda56b6ddfefd4ed65564dfb4be7c88 100644 (file)
@@ -6,6 +6,14 @@
 #ifndef __KSZ_PTP_REGS_H
 #define __KSZ_PTP_REGS_H
 
+#define REG_SW_GLOBAL_LED_OVR__4       0x0120
+#define LED_OVR_2                      BIT(1)
+#define LED_OVR_1                      BIT(0)
+
+#define REG_SW_GLOBAL_LED_SRC__4       0x0128
+#define LED_SRC_PTP_GPIO_1             BIT(3)
+#define LED_SRC_PTP_GPIO_2             BIT(2)
+
 /* 5 - PTP Clock */
 #define REG_PTP_CLK_CTRL               0x0500