diff options
Diffstat (limited to 'drivers/pcmcia')
-rw-r--r-- | drivers/pcmcia/soc_common.c | 17 |
1 files changed, 9 insertions, 8 deletions
diff --git a/drivers/pcmcia/soc_common.c b/drivers/pcmcia/soc_common.c index 9276a628473d..61b0c8952bb5 100644 --- a/drivers/pcmcia/soc_common.c +++ b/drivers/pcmcia/soc_common.c @@ -46,6 +46,7 @@ #include <linux/regulator/consumer.h> #include <linux/spinlock.h> #include <linux/timer.h> +#include <linux/pci.h> #include "soc_common.h" @@ -782,8 +783,7 @@ void soc_pcmcia_remove_one(struct soc_pcmcia_socket *skt) /* should not be required; violates some lowlevel drivers */ soc_common_pcmcia_config_skt(skt, &dead_socket); - iounmap(skt->virt_io); - skt->virt_io = NULL; + iounmap(PCI_IOBASE + skt->res_io_io.start); release_resource(&skt->res_attr); release_resource(&skt->res_mem); release_resource(&skt->res_io); @@ -816,11 +816,12 @@ int soc_pcmcia_add_one(struct soc_pcmcia_socket *skt) if (ret) goto out_err_4; - skt->virt_io = ioremap(skt->res_io.start, 0x10000); - if (skt->virt_io == NULL) { - ret = -ENOMEM; + skt->res_io_io = (struct resource) + DEFINE_RES_IO_NAMED(skt->nr * 0x1000 + 0x10000, 0x1000, + "PCMCIA I/O"); + ret = pci_remap_iospace(&skt->res_io_io, skt->res_io.start); + if (ret) goto out_err_5; - } /* * We initialize default socket timing here, because @@ -838,7 +839,7 @@ int soc_pcmcia_add_one(struct soc_pcmcia_socket *skt) skt->socket.resource_ops = &pccard_static_ops; skt->socket.irq_mask = 0; skt->socket.map_size = PAGE_SIZE; - skt->socket.io_offset = (unsigned long)skt->virt_io; + skt->socket.io_offset = (unsigned long)skt->res_io_io.start; skt->status = soc_common_pcmcia_skt_state(skt); @@ -872,7 +873,7 @@ int soc_pcmcia_add_one(struct soc_pcmcia_socket *skt) out_err_7: soc_pcmcia_hw_shutdown(skt); out_err_6: - iounmap(skt->virt_io); + iounmap(PCI_IOBASE + skt->res_io_io.start); out_err_5: release_resource(&skt->res_attr); out_err_4: |