Implement a remove callback allowing the switch driver to cleanup
resources it used: interrupts and remapped register ranges.

Signed-off-by: Florian Fainelli <f.faine...@gmail.com>
Signed-off-by: Neil Armstrong <narmstr...@baylibre.com>
---
 drivers/net/dsa/bcm_sf2.c | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)

diff --git a/drivers/net/dsa/bcm_sf2.c b/drivers/net/dsa/bcm_sf2.c
index 6f946fe..e0be318 100644
--- a/drivers/net/dsa/bcm_sf2.c
+++ b/drivers/net/dsa/bcm_sf2.c
@@ -1054,6 +1054,25 @@ out_unmap:
        return ret;
 }

+static void bcm_sf2_sw_remove(struct dsa_switch *ds)
+{
+       struct bcm_sf2_priv *priv = ds_to_priv(ds);
+       void __iomem **base;
+       unsigned int i;
+
+       /* Disable all interrupts and free them */
+       bcm_sf2_intr_disable(priv);
+
+       free_irq(priv->irq0, priv);
+       free_irq(priv->irq1, priv);
+
+       base = &priv->core;
+       for (i = 0; i < BCM_SF2_REGS_NUM; i++) {
+               iounmap(*base);
+               base++;
+       }
+}
+
 static int bcm_sf2_sw_set_addr(struct dsa_switch *ds, u8 *addr)
 {
        return 0;
@@ -1367,6 +1386,7 @@ static struct dsa_switch_driver bcm_sf2_switch_driver = {
        .tag_protocol           = DSA_TAG_PROTO_BRCM,
        .priv_size              = sizeof(struct bcm_sf2_priv),
        .probe                  = bcm_sf2_sw_probe,
+       .remove                 = bcm_sf2_sw_remove,
        .setup                  = bcm_sf2_sw_setup,
        .set_addr               = bcm_sf2_sw_set_addr,
        .get_phy_flags          = bcm_sf2_sw_get_phy_flags,
-- 
1.9.1
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to