net: phy: intel-xway: enable integrated led functions
authorMartin Schiller <ms@dev.tdt.de>
Wed, 21 Apr 2021 05:50:47 +0000 (07:50 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 14 May 2021 07:50:41 +0000 (09:50 +0200)
[ Upstream commit 357a07c26697a770d39d28b6b111f978deb4017d ]

The Intel xway phys offer the possibility to deactivate the integrated
LED function and to control the LEDs manually.
If this was set by the bootloader, it must be ensured that the
integrated LED function is enabled for all LEDs when loading the driver.

Before commit 6e2d85ec0559 ("net: phy: Stop with excessive soft reset")
the LEDs were enabled by a soft-reset of the PHY (using
genphy_soft_reset). Initialize the XWAY_MDIO_LED with it's default
value (which is applied during a soft reset) instead of adding back
the soft reset. This brings back the default LED configuration while
still preventing an excessive amount of soft resets.

Fixes: 6e2d85ec0559 ("net: phy: Stop with excessive soft reset")
Signed-off-by: Martin Schiller <ms@dev.tdt.de>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/net/phy/intel-xway.c

index b7875b36097fe246c8627717233ab04d03298b54..574a8bca1ec46913a8b0f7e65b429f523106ff49 100644 (file)
 
 #define XWAY_MDIO_IMASK                        0x19    /* interrupt mask */
 #define XWAY_MDIO_ISTAT                        0x1A    /* interrupt status */
+#define XWAY_MDIO_LED                  0x1B    /* led control */
+
+/* bit 15:12 are reserved */
+#define XWAY_MDIO_LED_LED3_EN          BIT(11) /* Enable the integrated function of LED3 */
+#define XWAY_MDIO_LED_LED2_EN          BIT(10) /* Enable the integrated function of LED2 */
+#define XWAY_MDIO_LED_LED1_EN          BIT(9)  /* Enable the integrated function of LED1 */
+#define XWAY_MDIO_LED_LED0_EN          BIT(8)  /* Enable the integrated function of LED0 */
+/* bit 7:4 are reserved */
+#define XWAY_MDIO_LED_LED3_DA          BIT(3)  /* Direct Access to LED3 */
+#define XWAY_MDIO_LED_LED2_DA          BIT(2)  /* Direct Access to LED2 */
+#define XWAY_MDIO_LED_LED1_DA          BIT(1)  /* Direct Access to LED1 */
+#define XWAY_MDIO_LED_LED0_DA          BIT(0)  /* Direct Access to LED0 */
 
 #define XWAY_MDIO_INIT_WOL             BIT(15) /* Wake-On-LAN */
 #define XWAY_MDIO_INIT_MSRE            BIT(14)
@@ -159,6 +171,15 @@ static int xway_gphy_config_init(struct phy_device *phydev)
        /* Clear all pending interrupts */
        phy_read(phydev, XWAY_MDIO_ISTAT);
 
+       /* Ensure that integrated led function is enabled for all leds */
+       err = phy_write(phydev, XWAY_MDIO_LED,
+                       XWAY_MDIO_LED_LED0_EN |
+                       XWAY_MDIO_LED_LED1_EN |
+                       XWAY_MDIO_LED_LED2_EN |
+                       XWAY_MDIO_LED_LED3_EN);
+       if (err)
+               return err;
+
        phy_write_mmd(phydev, MDIO_MMD_VEND2, XWAY_MMD_LEDCH,
                      XWAY_MMD_LEDCH_NACS_NONE |
                      XWAY_MMD_LEDCH_SBF_F02HZ |