net: phy: add callback for custom interrupt handler to struct phy_driver
authorHeiner Kallweit <hkallweit1@gmail.com>
Thu, 30 May 2019 13:10:06 +0000 (15:10 +0200)
committerDavid S. Miller <davem@davemloft.net>
Thu, 30 May 2019 22:02:33 +0000 (15:02 -0700)
The phylib interrupt handler handles link change events only currently.
However PHY drivers may want to use other interrupt sources too,
e.g. to report temperature monitoring events. Therefore add a callback
to struct phy_driver allowing PHY drivers to implement a custom
interrupt handler.

Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
Suggested-by: Russell King - ARM Linux admin <linux@armlinux.org.uk>
Acked-by: Russell King <rmk+kernel@armlinux.org.uk>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/phy/phy.c
include/linux/phy.h

index 4ba71dc..c6b0010 100644 (file)
@@ -772,8 +772,13 @@ static irqreturn_t phy_interrupt(int irq, void *phy_dat)
        if (phydev->drv->did_interrupt && !phydev->drv->did_interrupt(phydev))
                return IRQ_NONE;
 
-       /* reschedule state queue work to run as soon as possible */
-       phy_trigger_machine(phydev);
+       if (phydev->drv->handle_interrupt) {
+               if (phydev->drv->handle_interrupt(phydev))
+                       goto phy_err;
+       } else {
+               /* reschedule state queue work to run as soon as possible */
+               phy_trigger_machine(phydev);
+       }
 
        if (phy_clear_interrupt(phydev))
                goto phy_err;
index 72e1196..16cd339 100644 (file)
@@ -537,6 +537,9 @@ struct phy_driver {
         */
        int (*did_interrupt)(struct phy_device *phydev);
 
+       /* Override default interrupt handling */
+       int (*handle_interrupt)(struct phy_device *phydev);
+
        /* Clears up any memory if needed */
        void (*remove)(struct phy_device *phydev);