net: mvmdio: fix interrupt disable in remove path
authorRussell King <rmk+kernel@armlinux.org.uk>
Mon, 10 Apr 2017 15:28:09 +0000 (16:28 +0100)
committerDavid S. Miller <davem@davemloft.net>
Thu, 13 Apr 2017 14:59:11 +0000 (10:59 -0400)
The pre-existing write to disable interrupts on the remove path happens
whether we have an interrupt or not.  While this may seem to be a good
idea, this driver is re-used in many different implementations, some
where the binding only specifies four bytes of register space.  This
access causes us to access registers outside of the binding.

Make it conditional on the interrupt being present, which is the same
condition used when enabling the interrupt in the first place.

Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/marvell/mvmdio.c

index 7aea0beca56e54e83ddf2814b5e82c779cb1333d..6ea5caddca62bb602b1f50c7aa041c40a1ab9e99 100644 (file)
@@ -263,7 +263,8 @@ static int orion_mdio_remove(struct platform_device *pdev)
        struct mii_bus *bus = platform_get_drvdata(pdev);
        struct orion_mdio_dev *dev = bus->priv;
 
-       writel(0, dev->regs + MVMDIO_ERR_INT_MASK);
+       if (dev->err_interrupt > 0)
+               writel(0, dev->regs + MVMDIO_ERR_INT_MASK);
        mdiobus_unregister(bus);
        if (!IS_ERR(dev->clk))
                clk_disable_unprepare(dev->clk);