/* The remove function is used by probe, so it's not __devexit */ static int wrn_remove(struct platform_device *pdev) { struct wrn_dev *wrn = wrn_from_pdev(pdev); int i, irq; struct irq_domain *irqdomain; irqdomain = irq_find_host((struct device_node *)irqdomain_name); if (!irqdomain) { dev_err(&pdev->dev, "The IRQ domain %s does not exist\n", irqdomain_name); return -EINVAL; } if (WR_IS_SWITCH) { spin_lock(&wrn->lock); --wrn->use_count; /* Hmmm... looks like overkill... */ spin_unlock(&wrn->lock); } /* First of all, stop any transmission */ writel(0, &wrn->regs->CR); /* Then remove devices, memory maps, interrupts */ for (i = 0; i < WRN_NR_ENDPOINTS; i++) { if (wrn->dev[i]) { wrn_mezzanine_exit(wrn->dev[i]); wrn_endpoint_remove(wrn->dev[i]); free_netdev(wrn->dev[i]); wrn->dev[i] = NULL; } } for (i = 0; i < ARRAY_SIZE(wrn->bases); i++) { if (wrn->bases[i]) iounmap(wrn->bases[i]); } /* Unregister all interrupts that were registered */ for (i = 0; wrn->irq_registered; i++) { static int irqs[] = WRN_IRQ_NUMBERS; if (wrn->irq_registered & (1 << i)) { irq = irq_find_mapping(irqdomain, irqs[i]); free_irq(irq, wrn); } wrn->irq_registered &= ~(1 << i); } return 0; }
/* The remove function is used by probe, so it's not __devexit */ static int wrn_remove(struct platform_device *pdev) { struct wrn_dev *wrn = wrn_from_pdev(pdev); int i; if (WR_IS_SWITCH) { spin_lock(&wrn->lock); --wrn->use_count; /* Hmmm... looks like overkill... */ spin_unlock(&wrn->lock); } /* First of all, stop any transmission */ writel(0, &wrn->regs->CR); /* Then remove devices, memory maps, interrupts */ for (i = 0; i < WRN_NR_ENDPOINTS; i++) { if (wrn->dev[i]) { wrn_mezzanine_exit(wrn->dev[i]); wrn_endpoint_remove(wrn->dev[i]); free_netdev(wrn->dev[i]); wrn->dev[i] = NULL; } } for (i = 0; i < ARRAY_SIZE(wrn->bases); i++) { if (wrn->bases[i]) iounmap(wrn->bases[i]); } /* Unregister all interrupts that were registered */ for (i = 0; wrn->irq_registered; i++) { static int irqs[] = WRN_IRQ_NUMBERS; if (wrn->irq_registered & (1 << i)) free_irq(irqs[i], wrn); wrn->irq_registered &= ~(1 << i); } return 0; }