OSDN Git Service

net: phy: remove the .did_interrupt() and .ack_interrupt() callback
authorIoana Ciornei <ioana.ciornei@nxp.com>
Mon, 23 Nov 2020 15:38:17 +0000 (17:38 +0200)
committerJakub Kicinski <kuba@kernel.org>
Wed, 25 Nov 2020 19:18:38 +0000 (11:18 -0800)
Now that all the PHY drivers have been migrated to directly implement
the generic .handle_interrupt() callback for a seamless support of
shared IRQs and all the .config_inter() implementations clear any
pending interrupts, we can safely remove the two callbacks.

With this patch, phylib has a proper support for shared IRQs (and not
just for multi-PHY devices. A PHY driver must implement both the
.handle_interrupt() and .config_intr() callbacks for the IRQs to be
actually used.

Signed-off-by: Ioana Ciornei <ioana.ciornei@nxp.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/phy/phy.c
drivers/net/phy/phy_device.c
include/linux/phy.h

index dce86ba..45f7553 100644 (file)
@@ -114,23 +114,6 @@ void phy_print_status(struct phy_device *phydev)
 EXPORT_SYMBOL(phy_print_status);
 
 /**
- * phy_clear_interrupt - Ack the phy device's interrupt
- * @phydev: the phy_device struct
- *
- * If the @phydev driver has an ack_interrupt function, call it to
- * ack and clear the phy device's interrupt.
- *
- * Returns 0 on success or < 0 on error.
- */
-static int phy_clear_interrupt(struct phy_device *phydev)
-{
-       if (phydev->drv->ack_interrupt)
-               return phydev->drv->ack_interrupt(phydev);
-
-       return 0;
-}
-
-/**
  * phy_config_interrupt - configure the PHY device for the requested interrupts
  * @phydev: the phy_device struct
  * @interrupts: interrupt flags to configure for this @phydev
@@ -943,15 +926,8 @@ EXPORT_SYMBOL(phy_error);
  */
 int phy_disable_interrupts(struct phy_device *phydev)
 {
-       int err;
-
        /* Disable PHY interrupts */
-       err = phy_config_interrupt(phydev, PHY_INTERRUPT_DISABLED);
-       if (err)
-               return err;
-
-       /* Clear the interrupt */
-       return phy_clear_interrupt(phydev);
+       return phy_config_interrupt(phydev, PHY_INTERRUPT_DISABLED);
 }
 
 /**
@@ -966,22 +942,7 @@ static irqreturn_t phy_interrupt(int irq, void *phy_dat)
        struct phy_device *phydev = phy_dat;
        struct phy_driver *drv = phydev->drv;
 
-       if (drv->handle_interrupt)
-               return drv->handle_interrupt(phydev);
-
-       if (drv->did_interrupt && !drv->did_interrupt(phydev))
-               return IRQ_NONE;
-
-       /* reschedule state queue work to run as soon as possible */
-       phy_trigger_machine(phydev);
-
-       /* did_interrupt() may have cleared the interrupt already */
-       if (!drv->did_interrupt && phy_clear_interrupt(phydev)) {
-               phy_error(phydev);
-               return IRQ_NONE;
-       }
-
-       return IRQ_HANDLED;
+       return drv->handle_interrupt(phydev);
 }
 
 /**
@@ -990,11 +951,6 @@ static irqreturn_t phy_interrupt(int irq, void *phy_dat)
  */
 static int phy_enable_interrupts(struct phy_device *phydev)
 {
-       int err = phy_clear_interrupt(phydev);
-
-       if (err < 0)
-               return err;
-
        return phy_config_interrupt(phydev, PHY_INTERRUPT_ENABLED);
 }
 
index 81f6729..80c2e64 100644 (file)
@@ -2826,7 +2826,7 @@ EXPORT_SYMBOL(phy_get_internal_delay);
 
 static bool phy_drv_supports_irq(struct phy_driver *phydrv)
 {
-       return phydrv->config_intr && (phydrv->ack_interrupt || phydrv->handle_interrupt);
+       return phydrv->config_intr && phydrv->handle_interrupt;
 }
 
 /**
index 8849a00..381a957 100644 (file)
@@ -743,18 +743,11 @@ struct phy_driver {
        /** @read_status: Determines the negotiated speed and duplex */
        int (*read_status)(struct phy_device *phydev);
 
-       /** @ack_interrupt: Clears any pending interrupts */
-       int (*ack_interrupt)(struct phy_device *phydev);
-
-       /** @config_intr: Enables or disables interrupts */
-       int (*config_intr)(struct phy_device *phydev);
-
-       /**
-        * @did_interrupt: Checks if the PHY generated an interrupt.
-        * For multi-PHY devices with shared PHY interrupt pin
-        * Set interrupt bits have to be cleared.
+       /** @config_intr: Enables or disables interrupts.
+        * It should also clear any pending interrupts prior to enabling the
+        * IRQs and after disabling them.
         */
-       int (*did_interrupt)(struct phy_device *phydev);
+       int (*config_intr)(struct phy_device *phydev);
 
        /** @handle_interrupt: Override default interrupt handling */
        irqreturn_t (*handle_interrupt)(struct phy_device *phydev);
@@ -1487,10 +1480,6 @@ static inline int genphy_config_aneg(struct phy_device *phydev)
        return __genphy_config_aneg(phydev, false);
 }
 
-static inline int genphy_no_ack_interrupt(struct phy_device *phydev)
-{
-       return 0;
-}
 static inline int genphy_no_config_intr(struct phy_device *phydev)
 {
        return 0;