lkml.org 
[lkml]   [2020]   [Nov]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH net-next 09/18] net: phy: nxp-tja11xx: implement generic .handle_interrupt() callback
    Date
    From: Ioana Ciornei <ioana.ciornei@nxp.com>

    In an attempt to actually support shared IRQs in phylib, we now move the
    responsibility of triggering the phylib state machine or just returning
    IRQ_NONE, based on the IRQ status register, to the PHY driver. Having
    3 different IRQ handling callbacks (.handle_interrupt(),
    .did_interrupt() and .ack_interrupt() ) is confusing so let the PHY
    driver implement directly an IRQ handler like any other device driver.
    Make this driver follow the new convention.

    Cc: Marek Vasut <marex@denx.de>
    Cc: Oleksij Rempel <o.rempel@pengutronix.de>
    Signed-off-by: Ioana Ciornei <ioana.ciornei@nxp.com>
    ---
    drivers/net/phy/nxp-tja11xx.c | 23 +++++++++++++++++++++++
    1 file changed, 23 insertions(+)

    diff --git a/drivers/net/phy/nxp-tja11xx.c b/drivers/net/phy/nxp-tja11xx.c
    index a72fa0d2e7c7..1c4c5c267fe6 100644
    --- a/drivers/net/phy/nxp-tja11xx.c
    +++ b/drivers/net/phy/nxp-tja11xx.c
    @@ -44,6 +44,9 @@
    #define MII_CFG2_SLEEP_REQUEST_TO_16MS 0x3

    #define MII_INTSRC 21
    +#define MII_INTSRC_LINK_FAIL BIT(10)
    +#define MII_INTSRC_LINK_UP BIT(9)
    +#define MII_INTSRC_MASK (MII_INTSRC_LINK_FAIL | MII_INTSRC_LINK_UP)
    #define MII_INTSRC_TEMP_ERR BIT(1)
    #define MII_INTSRC_UV_ERR BIT(3)

    @@ -604,6 +607,24 @@ static int tja11xx_config_intr(struct phy_device *phydev)
    return phy_write(phydev, MII_INTEN, value);
    }

    +static irqreturn_t tja11xx_handle_interrupt(struct phy_device *phydev)
    +{
    + int irq_status;
    +
    + irq_status = phy_read(phydev, MII_INTSRC);
    + if (irq_status < 0) {
    + phy_error(phydev);
    + return IRQ_NONE;
    + }
    +
    + if (!(irq_status & MII_INTSRC_MASK))
    + return IRQ_NONE;
    +
    + phy_trigger_machine(phydev);
    +
    + return IRQ_HANDLED;
    +}
    +
    static int tja11xx_cable_test_start(struct phy_device *phydev)
    {
    int ret;
    @@ -749,6 +770,7 @@ static struct phy_driver tja11xx_driver[] = {
    .get_stats = tja11xx_get_stats,
    .ack_interrupt = tja11xx_ack_interrupt,
    .config_intr = tja11xx_config_intr,
    + .handle_interrupt = tja11xx_handle_interrupt,
    .cable_test_start = tja11xx_cable_test_start,
    .cable_test_get_status = tja11xx_cable_test_get_status,
    }, {
    @@ -772,6 +794,7 @@ static struct phy_driver tja11xx_driver[] = {
    .get_stats = tja11xx_get_stats,
    .ack_interrupt = tja11xx_ack_interrupt,
    .config_intr = tja11xx_config_intr,
    + .handle_interrupt = tja11xx_handle_interrupt,
    .cable_test_start = tja11xx_cable_test_start,
    .cable_test_get_status = tja11xx_cable_test_get_status,
    }
    --
    2.28.0
    \
     
     \ /
      Last update: 2020-11-12 17:00    [W:4.280 / U:0.876 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site