コード例 #1
0
ファイル: device.c プロジェクト: leehongming/wr-switch-sw
/* 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;
}
コード例 #2
0
ファイル: device.c プロジェクト: Reedgarden/WRS-SW
/* 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;
}