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

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
Loading
Loading
Loading
Loading
+2 −46
Original line number Diff line number Diff line
@@ -113,23 +113,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
@@ -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;
}

/**
@@ -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);
}

+1 −1
Original line number Diff line number Diff line
@@ -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;
}

/**
+4 −15
Original line number Diff line number Diff line
@@ -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;