lkml.org 
[lkml]   [2020]   [Nov]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH net-next 15/15] net: phy: remove the .did_interrupt() and .ack_interrupt() callback
    Date
    From: Ioana Ciornei <ioana.ciornei@nxp.com>

    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>
    ---
    drivers/net/phy/phy.c | 48 ++----------------------------------
    drivers/net/phy/phy_device.c | 2 +-
    include/linux/phy.h | 19 +++-----------
    3 files changed, 7 insertions(+), 62 deletions(-)

    diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c
    index dce86bad8231..45f75533c47c 100644
    --- a/drivers/net/phy/phy.c
    +++ b/drivers/net/phy/phy.c
    @@ -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;
    + 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);
    }

    diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c
    index 81f672911305..80c2e646c093 100644
    --- a/drivers/net/phy/phy_device.c
    +++ b/drivers/net/phy/phy_device.c
    @@ -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;
    }

    /**
    diff --git a/include/linux/phy.h b/include/linux/phy.h
    index 8849a00a093f..381a95732b6a 100644
    --- a/include/linux/phy.h
    +++ b/include/linux/phy.h
    @@ -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;
    --
    2.28.0
    \
     
     \ /
      Last update: 2020-11-23 16:40    [W:2.635 / U:0.052 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site