net: dsa: mv88e6xxx: Fix unconditional irq freeing
authorAndrew Lunn <andrew@lunn.ch>
Sun, 20 Nov 2016 19:14:15 +0000 (20:14 +0100)
committerDavid S. Miller <davem@davemloft.net>
Mon, 21 Nov 2016 02:16:13 +0000 (21:16 -0500)
Trying to remove an IRQ domain that was not created results in an
Opps. Add the necessary checks that the irqs were created before
freeing them.

Signed-off-by: Andrew Lunn <andrew@lunn.ch>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/dsa/mv88e6xxx/chip.c

index 6aa81d2..b843052 100644 (file)
@@ -3897,10 +3897,11 @@ static int mv88e6xxx_probe(struct mdio_device *mdiodev)
 out_mdio:
        mv88e6xxx_mdio_unregister(chip);
 out_g2_irq:
-       if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_G2_INT))
+       if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_G2_INT) && chip->irq > 0)
                mv88e6xxx_g2_irq_free(chip);
 out_g1_irq:
-       mv88e6xxx_g1_irq_free(chip);
+       if (chip->irq > 0)
+               mv88e6xxx_g1_irq_free(chip);
 out:
        return err;
 }
@@ -3914,9 +3915,11 @@ static void mv88e6xxx_remove(struct mdio_device *mdiodev)
        mv88e6xxx_unregister_switch(chip);
        mv88e6xxx_mdio_unregister(chip);
 
-       if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_G2_INT))
-               mv88e6xxx_g2_irq_free(chip);
-       mv88e6xxx_g1_irq_free(chip);
+       if (chip->irq > 0) {
+               if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_G2_INT))
+                       mv88e6xxx_g2_irq_free(chip);
+               mv88e6xxx_g1_irq_free(chip);
+       }
 }
 
 static const struct of_device_id mv88e6xxx_of_match[] = {