Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 10bdaaa0 authored by Russell King's avatar Russell King Committed by Russell King
Browse files

[ARM] ecard: add ecardm_iomap() / ecardm_iounmap()



Add devres ecardm_iomap() and ecardm_iounmap() for Acorn expansion
cards.  Convert all expansion card drivers to use them.

Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
parent c7b87f3d
Loading
Loading
Loading
Loading
+18 −1
Original line number Diff line number Diff line
@@ -41,11 +41,11 @@
#include <linux/init.h>
#include <linux/mutex.h>
#include <linux/kthread.h>
#include <linux/io.h>

#include <asm/dma.h>
#include <asm/ecard.h>
#include <asm/hardware.h>
#include <asm/io.h>
#include <asm/irq.h>
#include <asm/mmu_context.h>
#include <asm/mach/irq.h>
@@ -966,6 +966,23 @@ void ecard_setirq(struct expansion_card *ec, const struct expansion_card_ops *op
}
EXPORT_SYMBOL(ecard_setirq);

void __iomem *ecardm_iomap(struct expansion_card *ec, unsigned int res,
			   unsigned long offset, unsigned long maxsize)
{
	unsigned long start = ecard_resource_start(ec, res);
	unsigned long end = ecard_resource_end(ec, res);

	if (offset > (end - start))
		return NULL;

	start += offset;
	if (maxsize && end - start > maxsize)
		end = start + maxsize;
	
	return devm_ioremap(&ec->dev, start, end - start);
}
EXPORT_SYMBOL(ecardm_iomap);

/*
 * Probe for an expansion card.
 *
+9 −26
Original line number Diff line number Diff line
@@ -425,8 +425,7 @@ pata_icside_register_v5(struct ata_probe_ent *ae, struct expansion_card *ec)
	struct pata_icside_state *state = ae->private_data;
	void __iomem *base;

	base = ioremap(ecard_resource_start(ec, ECARD_RES_MEMC),
		       ecard_resource_len(ec, ECARD_RES_MEMC));
	base = ecardm_iomap(info->ec, ECARD_RES_MEMC, 0, 0);
	if (!base)
		return -ENOMEM;

@@ -453,24 +452,17 @@ pata_icside_register_v6(struct ata_probe_ent *ae, struct expansion_card *ec)
	struct pata_icside_state *state = ae->private_data;
	void __iomem *ioc_base, *easi_base;
	unsigned int sel = 0;
	int ret;

	ioc_base = ioremap(ecard_resource_start(ec, ECARD_RES_IOCFAST),
			   ecard_resource_len(ec, ECARD_RES_IOCFAST));
	if (!ioc_base) {
		ret = -ENOMEM;
		goto out;
	}
	ioc_base = ecardm_iomap(ec, ECARD_RES_IOCFAST, 0, 0);
	if (!ioc_base)
		return -ENOMEM;

	easi_base = ioc_base;

	if (ecard_resource_flags(ec, ECARD_RES_EASI)) {
		easi_base = ioremap(ecard_resource_start(ec, ECARD_RES_EASI),
				    ecard_resource_len(ec, ECARD_RES_EASI));
		if (!easi_base) {
			ret = -ENOMEM;
			goto unmap_slot;
		}
		easi_base = ecardm_iomap(ec, ECARD_RES_EASI, 0, 0);
		if (!easi_base)
			return -ENOMEM;

		/*
		 * Enable access to the EASI region.
@@ -507,10 +499,6 @@ pata_icside_register_v6(struct ata_probe_ent *ae, struct expansion_card *ec)

	return icside_dma_init(ae, ec);

 unmap_slot:
	iounmap(ioc_base);
 out:
	return ret;
}

static int __devinit
@@ -534,8 +522,7 @@ pata_icside_probe(struct expansion_card *ec, const struct ecard_id *id)
	state->type = ICS_TYPE_NOTYPE;
	state->dma = NO_DMA;

	idmem = ioremap(ecard_resource_start(ec, ECARD_RES_IOCFAST),
			ecard_resource_len(ec, ECARD_RES_IOCFAST));
	idmem = ecardm_iomap(ec, ECARD_RES_IOCFAST, 0, 0);
	if (idmem) {
		unsigned int type;

@@ -543,7 +530,7 @@ pata_icside_probe(struct expansion_card *ec, const struct ecard_id *id)
		type |= (readb(idmem + ICS_IDENT_OFFSET + 4) & 1) << 1;
		type |= (readb(idmem + ICS_IDENT_OFFSET + 8) & 1) << 2;
		type |= (readb(idmem + ICS_IDENT_OFFSET + 12) & 1) << 3;
		iounmap(idmem);
		ecardm_iounmap(ec, idmem);

		state->type = type;
	}
@@ -638,10 +625,6 @@ static void __devexit pata_icside_remove(struct expansion_card *ec)
	 */
	if (state->dma != NO_DMA)
		free_dma(state->dma);
	if (state->ioc_base)
		iounmap(state->ioc_base);
	if (state->ioc_base != state->irq_port)
		iounmap(state->irq_port);

	kfree(state);
	ecard_release_resources(ec);
+8 −24
Original line number Diff line number Diff line
@@ -565,8 +565,7 @@ icside_register_v5(struct icside_state *state, struct expansion_card *ec)
	ide_hwif_t *hwif;
	void __iomem *base;

	base = ioremap(ecard_resource_start(ec, ECARD_RES_MEMC),
		       ecard_resource_len(ec, ECARD_RES_MEMC));
	base = ecardm_iomap(ec, ECARD_RES_MEMC, 0, 0);
	if (!base)
		return -ENOMEM;

@@ -583,10 +582,8 @@ icside_register_v5(struct icside_state *state, struct expansion_card *ec)
	icside_irqdisable_arcin_v5(ec, 0);

	hwif = icside_setup(base, &icside_cardinfo_v5, ec);
	if (!hwif) {
		iounmap(base);
	if (!hwif)
		return -ENODEV;
	}

	state->hwif[0] = hwif;

@@ -605,8 +602,7 @@ icside_register_v6(struct icside_state *state, struct expansion_card *ec)
	unsigned int sel = 0;
	int ret;

	ioc_base = ioremap(ecard_resource_start(ec, ECARD_RES_IOCFAST),
			   ecard_resource_len(ec, ECARD_RES_IOCFAST));
	ioc_base = ecardm_iomap(ec, ECARD_RES_IOCFAST, 0, 0);
	if (!ioc_base) {
		ret = -ENOMEM;
		goto out;
@@ -615,11 +611,10 @@ icside_register_v6(struct icside_state *state, struct expansion_card *ec)
	easi_base = ioc_base;

	if (ecard_resource_flags(ec, ECARD_RES_EASI)) {
		easi_base = ioremap(ecard_resource_start(ec, ECARD_RES_EASI),
				    ecard_resource_len(ec, ECARD_RES_EASI));
		easi_base = ecardm_iomap(ec, ECARD_RES_EASI, 0, 0);
		if (!easi_base) {
			ret = -ENOMEM;
			goto unmap_slot;
			goto out;
		}

		/*
@@ -648,7 +643,7 @@ icside_register_v6(struct icside_state *state, struct expansion_card *ec)

	if (!hwif || !mate) {
		ret = -ENODEV;
		goto unmap_port;
		goto out;
	}

	state->hwif[0]    = hwif;
@@ -685,11 +680,6 @@ icside_register_v6(struct icside_state *state, struct expansion_card *ec)

	return 0;

 unmap_port:
	if (easi_base != ioc_base)
		iounmap(easi_base);
 unmap_slot:
	iounmap(ioc_base);
 out:
	return ret;
}
@@ -715,8 +705,7 @@ icside_probe(struct expansion_card *ec, const struct ecard_id *id)
	state->type	= ICS_TYPE_NOTYPE;
	state->dev	= &ec->dev;

	idmem = ioremap(ecard_resource_start(ec, ECARD_RES_IOCFAST),
			ecard_resource_len(ec, ECARD_RES_IOCFAST));
	idmem = ecardm_iomap(ec, ECARD_RES_IOCFAST, 0, 0);
	if (idmem) {
		unsigned int type;

@@ -724,7 +713,7 @@ icside_probe(struct expansion_card *ec, const struct ecard_id *id)
		type |= (readb(idmem + ICS_IDENT_OFFSET + 4) & 1) << 1;
		type |= (readb(idmem + ICS_IDENT_OFFSET + 8) & 1) << 2;
		type |= (readb(idmem + ICS_IDENT_OFFSET + 12) & 1) << 3;
		iounmap(idmem);
		ecardm_iounmap(ec, idmem);

		state->type = type;
	}
@@ -793,11 +782,6 @@ static void __devexit icside_remove(struct expansion_card *ec)

	ecard_set_drvdata(ec, NULL);

	if (state->ioc_base)
		iounmap(state->ioc_base);
	if (state->ioc_base != state->irq_port)
		iounmap(state->irq_port);

	kfree(state);
	ecard_release_resources(ec);
}
+1 −4
Original line number Diff line number Diff line
@@ -63,8 +63,7 @@ rapide_probe(struct expansion_card *ec, const struct ecard_id *id)
	if (ret)
		goto out;

	base = ioremap(ecard_resource_start(ec, ECARD_RES_MEMC),
		       ecard_resource_len(ec, ECARD_RES_MEMC));
	base = ecardm_iomap(ec, ECARD_RES_MEMC, 0, 0);
	if (!base) {
		ret = -ENOMEM;
		goto release;
@@ -81,7 +80,6 @@ rapide_probe(struct expansion_card *ec, const struct ecard_id *id)
		goto out;
	}

	iounmap(base);
 release:
	ecard_release_resources(ec);
 out:
@@ -96,7 +94,6 @@ static void __devexit rapide_remove(struct expansion_card *ec)

	/* there must be a better way */
	ide_unregister(hwif - ide_hwifs);
	iounmap(hwif->hwif_data);
	ecard_release_resources(ec);
}

+1 −5
Original line number Diff line number Diff line
@@ -1014,8 +1014,7 @@ ether1_probe(struct expansion_card *ec, const struct ecard_id *id)
	SET_NETDEV_DEV(dev, &ec->dev);

	dev->irq = ec->irq;
	priv(dev)->base = ioremap(ecard_resource_start(ec, ECARD_RES_IOCFAST),
				  ecard_resource_len(ec, ECARD_RES_IOCFAST));
	priv(dev)->base = ecardm_iomap(ec, ECARD_RES_IOCFAST, 0, 0);
	if (!priv(dev)->base) {
		ret = -ENOMEM;
		goto free;
@@ -1056,8 +1055,6 @@ ether1_probe(struct expansion_card *ec, const struct ecard_id *id)
	return 0;

 free:
	if (priv(dev)->base)
		iounmap(priv(dev)->base);
	free_netdev(dev);
 release:
	ecard_release_resources(ec);
@@ -1072,7 +1069,6 @@ static void __devexit ether1_remove(struct expansion_card *ec)
	ecard_set_drvdata(ec, NULL);	

	unregister_netdev(dev);
	iounmap(priv(dev)->base);
	free_netdev(dev);
	ecard_release_resources(ec);
}
Loading