Some SoCs (like freescale MXC) require configuring a device register to set the bank mapped into the memory window.
Also allow interrupt flags to be configured (to support shared interrupts). Signed-off-by: Martin Fuzzey <mfuz...@gmail.com> --- drivers/pcmcia/soc_common.c | 21 +++++++++++++++------ drivers/pcmcia/soc_common.h | 7 +++++++ 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/drivers/pcmcia/soc_common.c b/drivers/pcmcia/soc_common.c index 6f1a86b..feab118 100644 --- a/drivers/pcmcia/soc_common.c +++ b/drivers/pcmcia/soc_common.c @@ -257,7 +257,8 @@ static irqreturn_t soc_common_pcmcia_interrupt(int irq, void *dev) struct soc_pcmcia_socket *skt = dev; debug(skt, 3, "servicing IRQ %d\n", irq); - + if (skt->ops->ack_interrupt) + skt->ops->ack_interrupt(skt); soc_common_check_status(skt); return IRQ_HANDLED; @@ -335,6 +336,7 @@ soc_common_pcmcia_set_io_map(struct pcmcia_socket *sock, struct pccard_io_map *m { struct soc_pcmcia_socket *skt = to_soc_pcmcia_socket(sock); unsigned short speed = map->speed; + int ret = 0; debug(skt, 2, "map %u speed %u start 0x%08llx stop 0x%08llx\n", map->map, map->speed, (unsigned long long)map->start, @@ -368,11 +370,14 @@ soc_common_pcmcia_set_io_map(struct pcmcia_socket *sock, struct pccard_io_map *m if (map->stop == 1) map->stop = PAGE_SIZE-1; + if (skt->ops->set_io_map) + ret = skt->ops->set_io_map(skt, map); + map->stop -= map->start; map->stop += skt->socket.io_offset; map->start = skt->socket.io_offset; - return 0; + return ret; } @@ -390,6 +395,7 @@ soc_common_pcmcia_set_mem_map(struct pcmcia_socket *sock, struct pccard_mem_map struct soc_pcmcia_socket *skt = to_soc_pcmcia_socket(sock); struct resource *res; unsigned short speed = map->speed; + int ret = 0; debug(skt, 2, "map %u speed %u card_start %08x\n", map->map, map->speed, map->card_start); @@ -424,10 +430,12 @@ soc_common_pcmcia_set_mem_map(struct pcmcia_socket *sock, struct pccard_mem_map } skt->ops->set_timing(skt); + if (skt->ops->set_mem_map) + ret = skt->ops->set_mem_map(skt, map); + else + map->static_start = res->start + map->card_start; - map->static_start = res->start + map->card_start; - - return 0; + return ret; } struct bittbl { @@ -521,7 +529,8 @@ int soc_pcmcia_request_irqs(struct soc_pcmcia_socket *skt, if (irqs[i].sock != skt->nr) continue; res = request_irq(irqs[i].irq, soc_common_pcmcia_interrupt, - IRQF_DISABLED, irqs[i].str, skt); + IRQF_DISABLED | irqs[i].flags, + irqs[i].str, skt); if (res) break; set_irq_type(irqs[i].irq, IRQ_TYPE_NONE); diff --git a/drivers/pcmcia/soc_common.h b/drivers/pcmcia/soc_common.h index e40824c..f0c7a15 100644 --- a/drivers/pcmcia/soc_common.h +++ b/drivers/pcmcia/soc_common.h @@ -111,6 +111,12 @@ struct pcmcia_low_level { */ int (*frequency_change)(struct soc_pcmcia_socket *, unsigned long, struct cpufreq_freqs *); #endif + void (*ack_interrupt)(struct soc_pcmcia_socket *); + + /* Hardware specific mapping */ + int (*set_mem_map)(struct soc_pcmcia_socket *, struct pccard_mem_map *); + int (*set_io_map)(struct soc_pcmcia_socket *, struct pccard_io_map *map); + }; @@ -118,6 +124,7 @@ struct pcmcia_irqs { int sock; int irq; const char *str; + unsigned long flags; }; struct soc_pcmcia_timing { _______________________________________________ Linux PCMCIA reimplementation list http://lists.infradead.org/mailman/listinfo/linux-pcmcia