Commit 6527b938 authored by Ioana Ciornei's avatar Ioana Ciornei Committed by Jakub Kicinski

net: phy: remove the .did_interrupt() and .ack_interrupt() callback

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: default avatarIoana Ciornei <ioana.ciornei@nxp.com>
Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent a1a44174
...@@ -113,23 +113,6 @@ void phy_print_status(struct phy_device *phydev) ...@@ -113,23 +113,6 @@ void phy_print_status(struct phy_device *phydev)
} }
EXPORT_SYMBOL(phy_print_status); 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 * phy_config_interrupt - configure the PHY device for the requested interrupts
* @phydev: the phy_device struct * @phydev: the phy_device struct
...@@ -943,15 +926,8 @@ EXPORT_SYMBOL(phy_error); ...@@ -943,15 +926,8 @@ EXPORT_SYMBOL(phy_error);
*/ */
int phy_disable_interrupts(struct phy_device *phydev) int phy_disable_interrupts(struct phy_device *phydev)
{ {
int err;
/* Disable PHY interrupts */ /* Disable PHY interrupts */
err = phy_config_interrupt(phydev, PHY_INTERRUPT_DISABLED); return phy_config_interrupt(phydev, PHY_INTERRUPT_DISABLED);
if (err)
return err;
/* Clear the interrupt */
return phy_clear_interrupt(phydev);
} }
/** /**
...@@ -966,22 +942,7 @@ static irqreturn_t phy_interrupt(int irq, void *phy_dat) ...@@ -966,22 +942,7 @@ static irqreturn_t phy_interrupt(int irq, void *phy_dat)
struct phy_device *phydev = phy_dat; struct phy_device *phydev = phy_dat;
struct phy_driver *drv = phydev->drv; struct phy_driver *drv = phydev->drv;
if (drv->handle_interrupt) return drv->handle_interrupt(phydev);
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;
} }
/** /**
...@@ -990,11 +951,6 @@ static irqreturn_t phy_interrupt(int irq, void *phy_dat) ...@@ -990,11 +951,6 @@ static irqreturn_t phy_interrupt(int irq, void *phy_dat)
*/ */
static int phy_enable_interrupts(struct phy_device *phydev) 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); return phy_config_interrupt(phydev, PHY_INTERRUPT_ENABLED);
} }
......
...@@ -2826,7 +2826,7 @@ EXPORT_SYMBOL(phy_get_internal_delay); ...@@ -2826,7 +2826,7 @@ EXPORT_SYMBOL(phy_get_internal_delay);
static bool phy_drv_supports_irq(struct phy_driver *phydrv) 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;
} }
/** /**
......
...@@ -743,18 +743,11 @@ struct phy_driver { ...@@ -743,18 +743,11 @@ struct phy_driver {
/** @read_status: Determines the negotiated speed and duplex */ /** @read_status: Determines the negotiated speed and duplex */
int (*read_status)(struct phy_device *phydev); int (*read_status)(struct phy_device *phydev);
/** @ack_interrupt: Clears any pending interrupts */ /** @config_intr: Enables or disables interrupts.
int (*ack_interrupt)(struct phy_device *phydev); * It should also clear any pending interrupts prior to enabling the
* IRQs and after disabling them.
/** @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.
*/ */
int (*did_interrupt)(struct phy_device *phydev); int (*config_intr)(struct phy_device *phydev);
/** @handle_interrupt: Override default interrupt handling */ /** @handle_interrupt: Override default interrupt handling */
irqreturn_t (*handle_interrupt)(struct phy_device *phydev); irqreturn_t (*handle_interrupt)(struct phy_device *phydev);
...@@ -1487,10 +1480,6 @@ static inline int genphy_config_aneg(struct phy_device *phydev) ...@@ -1487,10 +1480,6 @@ static inline int genphy_config_aneg(struct phy_device *phydev)
return __genphy_config_aneg(phydev, false); 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) static inline int genphy_no_config_intr(struct phy_device *phydev)
{ {
return 0; return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment