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 3ba36d3..a66a256 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 c5c76b9..d71e855 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