mirror of
https://github.com/followmsi/android_kernel_google_msm.git
synced 2024-11-06 23:17:41 +00:00
PCMCIA: sa11x0: h3600: convert to use new irq/gpio management
Convert iPAQ socket driver to use the new irq/gpio management. As this already uses the GPIO subsystem, these changes are localized to just the PCMCIA directory. Acked-by: Dominik Brodowski <linux@dominikbrodowski.net> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
This commit is contained in:
parent
b1d8a5f917
commit
65474b457c
1 changed files with 15 additions and 80 deletions
|
@ -19,36 +19,20 @@
|
||||||
|
|
||||||
#include "sa1100_generic.h"
|
#include "sa1100_generic.h"
|
||||||
|
|
||||||
static struct pcmcia_irqs irqs[] = {
|
|
||||||
{ .sock = 0, .str = "PCMCIA CD0" }, /* .irq will be filled later */
|
|
||||||
{ .sock = 1, .str = "PCMCIA CD1" }
|
|
||||||
};
|
|
||||||
|
|
||||||
static int h3600_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
|
static int h3600_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
|
||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
switch (skt->nr) {
|
switch (skt->nr) {
|
||||||
case 0:
|
case 0:
|
||||||
err = gpio_request(H3XXX_GPIO_PCMCIA_IRQ0, "PCMCIA IRQ0");
|
skt->stat[SOC_STAT_CD].gpio = H3XXX_GPIO_PCMCIA_CD0;
|
||||||
if (err)
|
skt->stat[SOC_STAT_CD].name = "PCMCIA CD0";
|
||||||
goto err00;
|
skt->stat[SOC_STAT_RDY].gpio = H3XXX_GPIO_PCMCIA_IRQ0;
|
||||||
err = gpio_direction_input(H3XXX_GPIO_PCMCIA_IRQ0);
|
skt->stat[SOC_STAT_RDY].name = "PCMCIA IRQ0";
|
||||||
if (err)
|
|
||||||
goto err01;
|
|
||||||
skt->socket.pci_irq = gpio_to_irq(H3XXX_GPIO_PCMCIA_IRQ0);
|
|
||||||
|
|
||||||
err = gpio_request(H3XXX_GPIO_PCMCIA_CD0, "PCMCIA CD0");
|
|
||||||
if (err)
|
|
||||||
goto err01;
|
|
||||||
err = gpio_direction_input(H3XXX_GPIO_PCMCIA_CD0);
|
|
||||||
if (err)
|
|
||||||
goto err02;
|
|
||||||
irqs[0].irq = gpio_to_irq(H3XXX_GPIO_PCMCIA_CD0);
|
|
||||||
|
|
||||||
err = gpio_request(H3XXX_EGPIO_OPT_NVRAM_ON, "OPT NVRAM ON");
|
err = gpio_request(H3XXX_EGPIO_OPT_NVRAM_ON, "OPT NVRAM ON");
|
||||||
if (err)
|
if (err)
|
||||||
goto err02;
|
goto err01;
|
||||||
err = gpio_direction_output(H3XXX_EGPIO_OPT_NVRAM_ON, 0);
|
err = gpio_direction_output(H3XXX_EGPIO_OPT_NVRAM_ON, 0);
|
||||||
if (err)
|
if (err)
|
||||||
goto err03;
|
goto err03;
|
||||||
|
@ -68,32 +52,14 @@ static int h3600_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
|
||||||
if (err)
|
if (err)
|
||||||
goto err05;
|
goto err05;
|
||||||
err = gpio_direction_output(H3XXX_EGPIO_CARD_RESET, 0);
|
err = gpio_direction_output(H3XXX_EGPIO_CARD_RESET, 0);
|
||||||
if (err)
|
|
||||||
goto err06;
|
|
||||||
err = soc_pcmcia_request_irqs(skt, irqs, ARRAY_SIZE(irqs));
|
|
||||||
if (err)
|
if (err)
|
||||||
goto err06;
|
goto err06;
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
err = gpio_request(H3XXX_GPIO_PCMCIA_IRQ1, "PCMCIA IRQ1");
|
skt->stat[SOC_STAT_CD].gpio = H3XXX_GPIO_PCMCIA_CD1;
|
||||||
if (err)
|
skt->stat[SOC_STAT_CD].name = "PCMCIA CD1";
|
||||||
goto err10;
|
skt->stat[SOC_STAT_RDY].gpio = H3XXX_GPIO_PCMCIA_IRQ1;
|
||||||
err = gpio_direction_input(H3XXX_GPIO_PCMCIA_IRQ1);
|
skt->stat[SOC_STAT_RDY].name = "PCMCIA IRQ1";
|
||||||
if (err)
|
|
||||||
goto err11;
|
|
||||||
skt->socket.pci_irq = gpio_to_irq(H3XXX_GPIO_PCMCIA_IRQ1);
|
|
||||||
|
|
||||||
err = gpio_request(H3XXX_GPIO_PCMCIA_CD1, "PCMCIA CD1");
|
|
||||||
if (err)
|
|
||||||
goto err11;
|
|
||||||
err = gpio_direction_input(H3XXX_GPIO_PCMCIA_CD1);
|
|
||||||
if (err)
|
|
||||||
goto err12;
|
|
||||||
irqs[1].irq = gpio_to_irq(H3XXX_GPIO_PCMCIA_CD1);
|
|
||||||
|
|
||||||
err = soc_pcmcia_request_irqs(skt, irqs, ARRAY_SIZE(irqs));
|
|
||||||
if (err)
|
|
||||||
goto err12;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -102,19 +68,12 @@ err06: gpio_free(H3XXX_EGPIO_CARD_RESET);
|
||||||
err05: gpio_free(H3XXX_EGPIO_OPT_RESET);
|
err05: gpio_free(H3XXX_EGPIO_OPT_RESET);
|
||||||
err04: gpio_free(H3XXX_EGPIO_OPT_ON);
|
err04: gpio_free(H3XXX_EGPIO_OPT_ON);
|
||||||
err03: gpio_free(H3XXX_EGPIO_OPT_NVRAM_ON);
|
err03: gpio_free(H3XXX_EGPIO_OPT_NVRAM_ON);
|
||||||
err02: gpio_free(H3XXX_GPIO_PCMCIA_CD0);
|
|
||||||
err01: gpio_free(H3XXX_GPIO_PCMCIA_IRQ0);
|
err01: gpio_free(H3XXX_GPIO_PCMCIA_IRQ0);
|
||||||
err00: return err;
|
return err;
|
||||||
|
|
||||||
err12: gpio_free(H3XXX_GPIO_PCMCIA_CD0);
|
|
||||||
err11: gpio_free(H3XXX_GPIO_PCMCIA_IRQ0);
|
|
||||||
err10: return err;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void h3600_pcmcia_hw_shutdown(struct soc_pcmcia_socket *skt)
|
static void h3600_pcmcia_hw_shutdown(struct soc_pcmcia_socket *skt)
|
||||||
{
|
{
|
||||||
soc_pcmcia_free_irqs(skt, irqs, ARRAY_SIZE(irqs));
|
|
||||||
|
|
||||||
switch (skt->nr) {
|
switch (skt->nr) {
|
||||||
case 0:
|
case 0:
|
||||||
/* Disable CF bus: */
|
/* Disable CF bus: */
|
||||||
|
@ -126,12 +85,8 @@ static void h3600_pcmcia_hw_shutdown(struct soc_pcmcia_socket *skt)
|
||||||
gpio_free(H3XXX_EGPIO_OPT_RESET);
|
gpio_free(H3XXX_EGPIO_OPT_RESET);
|
||||||
gpio_free(H3XXX_EGPIO_OPT_ON);
|
gpio_free(H3XXX_EGPIO_OPT_ON);
|
||||||
gpio_free(H3XXX_EGPIO_OPT_NVRAM_ON);
|
gpio_free(H3XXX_EGPIO_OPT_NVRAM_ON);
|
||||||
gpio_free(H3XXX_GPIO_PCMCIA_CD0);
|
|
||||||
gpio_free(H3XXX_GPIO_PCMCIA_IRQ0);
|
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
gpio_free(H3XXX_GPIO_PCMCIA_CD1);
|
|
||||||
gpio_free(H3XXX_GPIO_PCMCIA_IRQ1);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -139,27 +94,11 @@ static void h3600_pcmcia_hw_shutdown(struct soc_pcmcia_socket *skt)
|
||||||
static void
|
static void
|
||||||
h3600_pcmcia_socket_state(struct soc_pcmcia_socket *skt, struct pcmcia_state *state)
|
h3600_pcmcia_socket_state(struct soc_pcmcia_socket *skt, struct pcmcia_state *state)
|
||||||
{
|
{
|
||||||
switch (skt->nr) {
|
state->bvd1 = 0;
|
||||||
case 0:
|
state->bvd2 = 0;
|
||||||
state->detect = !gpio_get_value(H3XXX_GPIO_PCMCIA_CD0);
|
state->wrprot = 0; /* Not available on H3600. */
|
||||||
state->ready = !!gpio_get_value(H3XXX_GPIO_PCMCIA_IRQ0);
|
state->vs_3v = 0;
|
||||||
state->bvd1 = 0;
|
state->vs_Xv = 0;
|
||||||
state->bvd2 = 0;
|
|
||||||
state->wrprot = 0; /* Not available on H3600. */
|
|
||||||
state->vs_3v = 0;
|
|
||||||
state->vs_Xv = 0;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 1:
|
|
||||||
state->detect = !gpio_get_value(H3XXX_GPIO_PCMCIA_CD1);
|
|
||||||
state->ready = !!gpio_get_value(H3XXX_GPIO_PCMCIA_IRQ1);
|
|
||||||
state->bvd1 = 0;
|
|
||||||
state->bvd2 = 0;
|
|
||||||
state->wrprot = 0; /* Not available on H3600. */
|
|
||||||
state->vs_3v = 0;
|
|
||||||
state->vs_Xv = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
@ -186,14 +125,10 @@ static void h3600_pcmcia_socket_init(struct soc_pcmcia_socket *skt)
|
||||||
gpio_set_value(H3XXX_EGPIO_OPT_RESET, 0);
|
gpio_set_value(H3XXX_EGPIO_OPT_RESET, 0);
|
||||||
|
|
||||||
msleep(10);
|
msleep(10);
|
||||||
|
|
||||||
soc_pcmcia_enable_irqs(skt, irqs, ARRAY_SIZE(irqs));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void h3600_pcmcia_socket_suspend(struct soc_pcmcia_socket *skt)
|
static void h3600_pcmcia_socket_suspend(struct soc_pcmcia_socket *skt)
|
||||||
{
|
{
|
||||||
soc_pcmcia_disable_irqs(skt, irqs, ARRAY_SIZE(irqs));
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* FIXME: This doesn't fit well. We don't have the mechanism in
|
* FIXME: This doesn't fit well. We don't have the mechanism in
|
||||||
* the generic PCMCIA layer to deal with the idea of two sockets
|
* the generic PCMCIA layer to deal with the idea of two sockets
|
||||||
|
|
Loading…
Reference in a new issue