提交 a9bb5a4b 编写于 作者: R Russell King

PCMCIA: pxa: convert PXA socket drivers to use new irq/gpio management

Convert all the PXA platform socket drivers to use the new irq/gpio
management provided by soc_common.  This relieves these drivers from
having to do anything with these GPIOs other than provide the numbers
to soc_common.
Acked-by: NDominik Brodowski <linux@dominikbrodowski.net>
Signed-off-by: NRussell King <rmk+kernel@arm.linux.org.uk>
上级 d9dc8787
...@@ -174,7 +174,6 @@ enum balloon3_features { ...@@ -174,7 +174,6 @@ enum balloon3_features {
#define BALLOON3_AUX_NIRQ PXA_GPIO_TO_IRQ(BALLOON3_GPIO_AUX_NIRQ) #define BALLOON3_AUX_NIRQ PXA_GPIO_TO_IRQ(BALLOON3_GPIO_AUX_NIRQ)
#define BALLOON3_CODEC_IRQ PXA_GPIO_TO_IRQ(BALLOON3_GPIO_CODEC_IRQ) #define BALLOON3_CODEC_IRQ PXA_GPIO_TO_IRQ(BALLOON3_GPIO_CODEC_IRQ)
#define BALLOON3_S0_CD_IRQ PXA_GPIO_TO_IRQ(BALLOON3_GPIO_S0_CD)
#define BALLOON3_NR_IRQS (IRQ_BOARD_START + 16) #define BALLOON3_NR_IRQS (IRQ_BOARD_START + 16)
......
...@@ -29,15 +29,6 @@ ...@@ -29,15 +29,6 @@
#include "soc_common.h" #include "soc_common.h"
/*
* These are a list of interrupt sources that provokes a polled
* check of status
*/
static struct pcmcia_irqs irqs[] = {
{ 0, BALLOON3_S0_CD_IRQ, "PCMCIA0 CD" },
{ 0, BALLOON3_BP_NSTSCHG_IRQ, "PCMCIA0 STSCHG" },
};
static int balloon3_pcmcia_hw_init(struct soc_pcmcia_socket *skt) static int balloon3_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
{ {
uint16_t ver; uint16_t ver;
...@@ -49,12 +40,12 @@ static int balloon3_pcmcia_hw_init(struct soc_pcmcia_socket *skt) ...@@ -49,12 +40,12 @@ static int balloon3_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
ver); ver);
skt->socket.pci_irq = BALLOON3_BP_CF_NRDY_IRQ; skt->socket.pci_irq = BALLOON3_BP_CF_NRDY_IRQ;
return soc_pcmcia_request_irqs(skt, irqs, ARRAY_SIZE(irqs)); skt->stat[SOC_STAT_CD].gpio = BALLOON3_GPIO_S0_CD;
} skt->stat[SOC_STAT_CD].name = "PCMCIA0 CD";
skt->stat[SOC_STAT_BVD1].irq = BALLOON3_BP_NSTSCHG_IRQ;
skt->stat[SOC_STAT_BVD1].name = "PCMCIA0 STSCHG";
static void balloon3_pcmcia_hw_shutdown(struct soc_pcmcia_socket *skt) return 0;
{
soc_pcmcia_free_irqs(skt, irqs, ARRAY_SIZE(irqs));
} }
static unsigned long balloon3_pcmcia_status[2] = { static unsigned long balloon3_pcmcia_status[2] = {
...@@ -85,7 +76,6 @@ static void balloon3_pcmcia_socket_state(struct soc_pcmcia_socket *skt, ...@@ -85,7 +76,6 @@ static void balloon3_pcmcia_socket_state(struct soc_pcmcia_socket *skt,
disable_irq(BALLOON3_BP_NSTSCHG_IRQ); disable_irq(BALLOON3_BP_NSTSCHG_IRQ);
} }
state->detect = !gpio_get_value(BALLOON3_GPIO_S0_CD);
state->ready = !!(status & BALLOON3_CF_nIRQ); state->ready = !!(status & BALLOON3_CF_nIRQ);
state->bvd1 = !!(status & BALLOON3_CF_nSTSCHG_BVD1); state->bvd1 = !!(status & BALLOON3_CF_nSTSCHG_BVD1);
state->bvd2 = 0; /* not available */ state->bvd2 = 0; /* not available */
...@@ -106,7 +96,6 @@ static int balloon3_pcmcia_configure_socket(struct soc_pcmcia_socket *skt, ...@@ -106,7 +96,6 @@ static int balloon3_pcmcia_configure_socket(struct soc_pcmcia_socket *skt,
static struct pcmcia_low_level balloon3_pcmcia_ops = { static struct pcmcia_low_level balloon3_pcmcia_ops = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.hw_init = balloon3_pcmcia_hw_init, .hw_init = balloon3_pcmcia_hw_init,
.hw_shutdown = balloon3_pcmcia_hw_shutdown,
.socket_state = balloon3_pcmcia_socket_state, .socket_state = balloon3_pcmcia_socket_state,
.configure_socket = balloon3_pcmcia_configure_socket, .configure_socket = balloon3_pcmcia_configure_socket,
.first = 0, .first = 0,
......
...@@ -25,17 +25,6 @@ ...@@ -25,17 +25,6 @@
#define GPIO_PCMCIA_S1_RDYINT (8) #define GPIO_PCMCIA_S1_RDYINT (8)
#define GPIO_PCMCIA_RESET (9) #define GPIO_PCMCIA_RESET (9)
#define PCMCIA_S0_CD_VALID gpio_to_irq(GPIO_PCMCIA_S0_CD_VALID)
#define PCMCIA_S1_CD_VALID gpio_to_irq(GPIO_PCMCIA_S1_CD_VALID)
#define PCMCIA_S0_RDYINT gpio_to_irq(GPIO_PCMCIA_S0_RDYINT)
#define PCMCIA_S1_RDYINT gpio_to_irq(GPIO_PCMCIA_S1_RDYINT)
static struct pcmcia_irqs irqs[] = {
{ .sock = 0, .str = "PCMCIA0 CD" },
{ .sock = 1, .str = "PCMCIA1 CD" },
};
static int cmx255_pcmcia_hw_init(struct soc_pcmcia_socket *skt) static int cmx255_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
{ {
int ret = gpio_request(GPIO_PCMCIA_RESET, "PCCard reset"); int ret = gpio_request(GPIO_PCMCIA_RESET, "PCCard reset");
...@@ -43,19 +32,23 @@ static int cmx255_pcmcia_hw_init(struct soc_pcmcia_socket *skt) ...@@ -43,19 +32,23 @@ static int cmx255_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
return ret; return ret;
gpio_direction_output(GPIO_PCMCIA_RESET, 0); gpio_direction_output(GPIO_PCMCIA_RESET, 0);
skt->socket.pci_irq = skt->nr == 0 ? PCMCIA_S0_RDYINT : PCMCIA_S1_RDYINT; if (skt->nr == 0) {
irqs[0].irq = PCMCIA_S0_CD_VALID; skt->stat[SOC_STAT_CD].gpio = GPIO_PCMCIA_S0_CD_VALID;
irqs[1].irq = PCMCIA_S1_CD_VALID; skt->stat[SOC_STAT_CD].name = "PCMCIA0 CD";
ret = soc_pcmcia_request_irqs(skt, irqs, ARRAY_SIZE(irqs)); skt->stat[SOC_STAT_RDY].gpio = GPIO_PCMCIA_S0_RDYINT;
if (!ret) skt->stat[SOC_STAT_RDY].name = "PCMCIA0 RDY";
gpio_free(GPIO_PCMCIA_RESET); } else {
skt->stat[SOC_STAT_CD].gpio = GPIO_PCMCIA_S1_CD_VALID;
skt->stat[SOC_STAT_CD].name = "PCMCIA1 CD";
skt->stat[SOC_STAT_RDY].gpio = GPIO_PCMCIA_S1_RDYINT;
skt->stat[SOC_STAT_RDY].name = "PCMCIA1 RDY";
}
return ret; return 0;
} }
static void cmx255_pcmcia_shutdown(struct soc_pcmcia_socket *skt) static void cmx255_pcmcia_shutdown(struct soc_pcmcia_socket *skt)
{ {
soc_pcmcia_free_irqs(skt, irqs, ARRAY_SIZE(irqs));
gpio_free(GPIO_PCMCIA_RESET); gpio_free(GPIO_PCMCIA_RESET);
} }
...@@ -63,13 +56,6 @@ static void cmx255_pcmcia_shutdown(struct soc_pcmcia_socket *skt) ...@@ -63,13 +56,6 @@ static void cmx255_pcmcia_shutdown(struct soc_pcmcia_socket *skt)
static void cmx255_pcmcia_socket_state(struct soc_pcmcia_socket *skt, static void cmx255_pcmcia_socket_state(struct soc_pcmcia_socket *skt,
struct pcmcia_state *state) struct pcmcia_state *state)
{ {
int cd = skt->nr ? GPIO_PCMCIA_S1_CD_VALID : GPIO_PCMCIA_S0_CD_VALID;
int rdy = skt->nr ? GPIO_PCMCIA_S1_RDYINT : GPIO_PCMCIA_S0_RDYINT;
state->detect = !gpio_get_value(cd);
state->ready = !!gpio_get_value(rdy);
state->bvd1 = 1;
state->bvd2 = 1;
state->vs_3v = 0; state->vs_3v = 0;
state->vs_Xv = 0; state->vs_Xv = 0;
state->wrprot = 0; /* not available */ state->wrprot = 0; /* not available */
......
...@@ -22,14 +22,6 @@ ...@@ -22,14 +22,6 @@
#define GPIO_PCMCIA_S0_RDYINT (82) #define GPIO_PCMCIA_S0_RDYINT (82)
#define GPIO_PCMCIA_RESET (53) #define GPIO_PCMCIA_RESET (53)
#define PCMCIA_S0_CD_VALID gpio_to_irq(GPIO_PCMCIA_S0_CD_VALID)
#define PCMCIA_S0_RDYINT gpio_to_irq(GPIO_PCMCIA_S0_RDYINT)
static struct pcmcia_irqs irqs[] = {
{ .sock = 0, .str = "PCMCIA0 CD" },
};
static int cmx270_pcmcia_hw_init(struct soc_pcmcia_socket *skt) static int cmx270_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
{ {
int ret = gpio_request(GPIO_PCMCIA_RESET, "PCCard reset"); int ret = gpio_request(GPIO_PCMCIA_RESET, "PCCard reset");
...@@ -37,18 +29,16 @@ static int cmx270_pcmcia_hw_init(struct soc_pcmcia_socket *skt) ...@@ -37,18 +29,16 @@ static int cmx270_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
return ret; return ret;
gpio_direction_output(GPIO_PCMCIA_RESET, 0); gpio_direction_output(GPIO_PCMCIA_RESET, 0);
skt->socket.pci_irq = PCMCIA_S0_RDYINT; skt->stat[SOC_STAT_CD].gpio = GPIO_PCMCIA_S0_CD_VALID;
irqs[0].irq = PCMCIA_S0_CD_VALID; skt->stat[SOC_STAT_CD].name = "PCMCIA0 CD";
ret = soc_pcmcia_request_irqs(skt, irqs, ARRAY_SIZE(irqs)); skt->stat[SOC_STAT_RDY].gpio = GPIO_PCMCIA_S0_RDYINT;
if (!ret) skt->stat[SOC_STAT_RDY].name = "PCMCIA0 RDY";
gpio_free(GPIO_PCMCIA_RESET);
return ret; return ret;
} }
static void cmx270_pcmcia_shutdown(struct soc_pcmcia_socket *skt) static void cmx270_pcmcia_shutdown(struct soc_pcmcia_socket *skt)
{ {
soc_pcmcia_free_irqs(skt, irqs, ARRAY_SIZE(irqs));
gpio_free(GPIO_PCMCIA_RESET); gpio_free(GPIO_PCMCIA_RESET);
} }
...@@ -56,10 +46,6 @@ static void cmx270_pcmcia_shutdown(struct soc_pcmcia_socket *skt) ...@@ -56,10 +46,6 @@ static void cmx270_pcmcia_shutdown(struct soc_pcmcia_socket *skt)
static void cmx270_pcmcia_socket_state(struct soc_pcmcia_socket *skt, static void cmx270_pcmcia_socket_state(struct soc_pcmcia_socket *skt,
struct pcmcia_state *state) struct pcmcia_state *state)
{ {
state->detect = (gpio_get_value(GPIO_PCMCIA_S0_CD_VALID) == 0) ? 1 : 0;
state->ready = (gpio_get_value(GPIO_PCMCIA_S0_RDYINT) == 0) ? 0 : 1;
state->bvd1 = 1;
state->bvd2 = 1;
state->vs_3v = 0; state->vs_3v = 0;
state->vs_Xv = 0; state->vs_Xv = 0;
state->wrprot = 0; /* not available */ state->wrprot = 0; /* not available */
......
...@@ -53,13 +53,6 @@ static struct gpio colibri_pcmcia_gpios[] = { ...@@ -53,13 +53,6 @@ static struct gpio colibri_pcmcia_gpios[] = {
{ 0, GPIOF_INIT_HIGH,"PCMCIA Reset" }, { 0, GPIOF_INIT_HIGH,"PCMCIA Reset" },
}; };
static struct pcmcia_irqs colibri_irqs[] = {
{
.sock = 0,
.str = "PCMCIA CD"
},
};
static int colibri_pcmcia_hw_init(struct soc_pcmcia_socket *skt) static int colibri_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
{ {
int ret; int ret;
...@@ -69,19 +62,10 @@ static int colibri_pcmcia_hw_init(struct soc_pcmcia_socket *skt) ...@@ -69,19 +62,10 @@ static int colibri_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
if (ret) if (ret)
goto err1; goto err1;
colibri_irqs[0].irq = gpio_to_irq(colibri_pcmcia_gpios[DETECT].gpio);
skt->socket.pci_irq = gpio_to_irq(colibri_pcmcia_gpios[READY].gpio); skt->socket.pci_irq = gpio_to_irq(colibri_pcmcia_gpios[READY].gpio);
skt->stat[SOC_STAT_CD].irq = gpio_to_irq(colibri_pcmcia_gpios[DETECT].gpio);
skt->stat[SOC_STAT_CD].name = "PCMCIA CD";
ret = soc_pcmcia_request_irqs(skt, colibri_irqs,
ARRAY_SIZE(colibri_irqs));
if (ret)
goto err2;
return ret;
err2:
gpio_free_array(colibri_pcmcia_gpios,
ARRAY_SIZE(colibri_pcmcia_gpios));
err1: err1:
return ret; return ret;
} }
......
...@@ -23,52 +23,27 @@ ...@@ -23,52 +23,27 @@
#include "soc_common.h" #include "soc_common.h"
static struct pcmcia_irqs cd_irqs[] = {
{
.sock = 0,
.str = "CF card detect"
},
{
.sock = 1,
.str = "Wifi switch"
},
};
static int e740_pcmcia_hw_init(struct soc_pcmcia_socket *skt) static int e740_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
{ {
if (skt->nr == 0) if (skt->nr == 0) {
skt->socket.pci_irq = gpio_to_irq(GPIO_E740_PCMCIA_RDY0); skt->stat[SOC_STAT_CD].gpio = GPIO_E740_PCMCIA_CD0;
else skt->stat[SOC_STAT_CD].name = "CF card detect";
skt->socket.pci_irq = gpio_to_irq(GPIO_E740_PCMCIA_RDY1); skt->stat[SOC_STAT_RDY].gpio = GPIO_E740_PCMCIA_RDY0;
skt->stat[SOC_STAT_RDY].name = "CF ready";
cd_irqs[0].irq = gpio_to_irq(GPIO_E740_PCMCIA_CD0); } else {
cd_irqs[1].irq = gpio_to_irq(GPIO_E740_PCMCIA_CD1); skt->stat[SOC_STAT_CD].gpio = GPIO_E740_PCMCIA_CD1;
skt->stat[SOC_STAT_CD].name = "Wifi switch";
return soc_pcmcia_request_irqs(skt, &cd_irqs[skt->nr], 1); skt->stat[SOC_STAT_RDY].gpio = GPIO_E740_PCMCIA_RDY1;
} skt->stat[SOC_STAT_RDY].name = "Wifi ready";
}
/* return 0;
* Release all resources.
*/
static void e740_pcmcia_hw_shutdown(struct soc_pcmcia_socket *skt)
{
soc_pcmcia_free_irqs(skt, &cd_irqs[skt->nr], 1);
} }
static void e740_pcmcia_socket_state(struct soc_pcmcia_socket *skt, static void e740_pcmcia_socket_state(struct soc_pcmcia_socket *skt,
struct pcmcia_state *state) struct pcmcia_state *state)
{ {
if (skt->nr == 0) {
state->detect = gpio_get_value(GPIO_E740_PCMCIA_CD0) ? 0 : 1;
state->ready = gpio_get_value(GPIO_E740_PCMCIA_RDY0) ? 1 : 0;
} else {
state->detect = gpio_get_value(GPIO_E740_PCMCIA_CD1) ? 0 : 1;
state->ready = gpio_get_value(GPIO_E740_PCMCIA_RDY1) ? 1 : 0;
}
state->vs_3v = 1; state->vs_3v = 1;
state->bvd1 = 1;
state->bvd2 = 1;
state->wrprot = 0; state->wrprot = 0;
state->vs_Xv = 0; state->vs_Xv = 0;
} }
...@@ -109,32 +84,11 @@ static int e740_pcmcia_configure_socket(struct soc_pcmcia_socket *skt, ...@@ -109,32 +84,11 @@ static int e740_pcmcia_configure_socket(struct soc_pcmcia_socket *skt,
return 0; return 0;
} }
/*
* Enable card status IRQs on (re-)initialisation. This can
* be called at initialisation, power management event, or
* pcmcia event.
*/
static void e740_pcmcia_socket_init(struct soc_pcmcia_socket *skt)
{
soc_pcmcia_enable_irqs(skt, cd_irqs, ARRAY_SIZE(cd_irqs));
}
/*
* Disable card status IRQs on suspend.
*/
static void e740_pcmcia_socket_suspend(struct soc_pcmcia_socket *skt)
{
soc_pcmcia_disable_irqs(skt, cd_irqs, ARRAY_SIZE(cd_irqs));
}
static struct pcmcia_low_level e740_pcmcia_ops = { static struct pcmcia_low_level e740_pcmcia_ops = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.hw_init = e740_pcmcia_hw_init, .hw_init = e740_pcmcia_hw_init,
.hw_shutdown = e740_pcmcia_hw_shutdown,
.socket_state = e740_pcmcia_socket_state, .socket_state = e740_pcmcia_socket_state,
.configure_socket = e740_pcmcia_configure_socket, .configure_socket = e740_pcmcia_configure_socket,
.socket_init = e740_pcmcia_socket_init,
.socket_suspend = e740_pcmcia_socket_suspend,
.nr = 2, .nr = 2,
}; };
......
...@@ -30,27 +30,26 @@ ...@@ -30,27 +30,26 @@
#include "soc_common.h" #include "soc_common.h"
static struct pcmcia_irqs irqs[] = {
{ 0, MAINSTONE_S0_CD_IRQ, "PCMCIA0 CD" },
{ 1, MAINSTONE_S1_CD_IRQ, "PCMCIA1 CD" },
{ 0, MAINSTONE_S0_STSCHG_IRQ, "PCMCIA0 STSCHG" },
{ 1, MAINSTONE_S1_STSCHG_IRQ, "PCMCIA1 STSCHG" },
};
static int mst_pcmcia_hw_init(struct soc_pcmcia_socket *skt) static int mst_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
{ {
/* /*
* Setup default state of GPIO outputs * Setup default state of GPIO outputs
* before we enable them as outputs. * before we enable them as outputs.
*/ */
if (skt->nr == 0) {
skt->socket.pci_irq = (skt->nr == 0) ? MAINSTONE_S0_IRQ : MAINSTONE_S1_IRQ; skt->socket.pci_irq = MAINSTONE_S0_IRQ;
return soc_pcmcia_request_irqs(skt, irqs, ARRAY_SIZE(irqs)); skt->stat[SOC_STAT_CD].irq = MAINSTONE_S0_CD_IRQ;
} skt->stat[SOC_STAT_CD].name = "PCMCIA0 CD";
skt->stat[SOC_STAT_BVD1].irq = MAINSTONE_S0_STSCHG_IRQ;
static void mst_pcmcia_hw_shutdown(struct soc_pcmcia_socket *skt) skt->stat[SOC_STAT_BVD1].name = "PCMCIA0 STSCHG";
{ } else {
soc_pcmcia_free_irqs(skt, irqs, ARRAY_SIZE(irqs)); skt->socket.pci_irq = MAINSTONE_S1_IRQ;
skt->stat[SOC_STAT_CD].irq = MAINSTONE_S1_CD_IRQ;
skt->stat[SOC_STAT_CD].name = "PCMCIA1 CD";
skt->stat[SOC_STAT_BVD1].irq = MAINSTONE_S1_STSCHG_IRQ;
skt->stat[SOC_STAT_BVD1].name = "PCMCIA1 STSCHG";
}
return 0;
} }
static unsigned long mst_pcmcia_status[2]; static unsigned long mst_pcmcia_status[2];
...@@ -131,7 +130,6 @@ static int mst_pcmcia_configure_socket(struct soc_pcmcia_socket *skt, ...@@ -131,7 +130,6 @@ static int mst_pcmcia_configure_socket(struct soc_pcmcia_socket *skt,
static struct pcmcia_low_level mst_pcmcia_ops __initdata = { static struct pcmcia_low_level mst_pcmcia_ops __initdata = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.hw_init = mst_pcmcia_hw_init, .hw_init = mst_pcmcia_hw_init,
.hw_shutdown = mst_pcmcia_hw_shutdown,
.socket_state = mst_pcmcia_socket_state, .socket_state = mst_pcmcia_socket_state,
.configure_socket = mst_pcmcia_configure_socket, .configure_socket = mst_pcmcia_configure_socket,
.nr = 2, .nr = 2,
......
...@@ -23,7 +23,6 @@ ...@@ -23,7 +23,6 @@
static struct gpio palmld_pcmcia_gpios[] = { static struct gpio palmld_pcmcia_gpios[] = {
{ GPIO_NR_PALMLD_PCMCIA_POWER, GPIOF_INIT_LOW, "PCMCIA Power" }, { GPIO_NR_PALMLD_PCMCIA_POWER, GPIOF_INIT_LOW, "PCMCIA Power" },
{ GPIO_NR_PALMLD_PCMCIA_RESET, GPIOF_INIT_HIGH,"PCMCIA Reset" }, { GPIO_NR_PALMLD_PCMCIA_RESET, GPIOF_INIT_HIGH,"PCMCIA Reset" },
{ GPIO_NR_PALMLD_PCMCIA_READY, GPIOF_IN, "PCMCIA Ready" },
}; };
static int palmld_pcmcia_hw_init(struct soc_pcmcia_socket *skt) static int palmld_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
...@@ -33,7 +32,8 @@ static int palmld_pcmcia_hw_init(struct soc_pcmcia_socket *skt) ...@@ -33,7 +32,8 @@ static int palmld_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
ret = gpio_request_array(palmld_pcmcia_gpios, ret = gpio_request_array(palmld_pcmcia_gpios,
ARRAY_SIZE(palmld_pcmcia_gpios)); ARRAY_SIZE(palmld_pcmcia_gpios));
skt->socket.pci_irq = gpio_to_irq(GPIO_NR_PALMLD_PCMCIA_READY); skt->stat[SOC_STAT_RDY].gpio = GPIO_NR_PALMLD_PCMCIA_READY;
skt->stat[SOC_STAT_RDY].name = "PCMCIA Ready";
return ret; return ret;
} }
...@@ -47,9 +47,6 @@ static void palmld_pcmcia_socket_state(struct soc_pcmcia_socket *skt, ...@@ -47,9 +47,6 @@ static void palmld_pcmcia_socket_state(struct soc_pcmcia_socket *skt,
struct pcmcia_state *state) struct pcmcia_state *state)
{ {
state->detect = 1; /* always inserted */ state->detect = 1; /* always inserted */
state->ready = !!gpio_get_value(GPIO_NR_PALMLD_PCMCIA_READY);
state->bvd1 = 1;
state->bvd2 = 1;
state->wrprot = 0; state->wrprot = 0;
state->vs_3v = 1; state->vs_3v = 1;
state->vs_Xv = 0; state->vs_Xv = 0;
......
...@@ -26,7 +26,6 @@ static struct gpio palmtc_pcmcia_gpios[] = { ...@@ -26,7 +26,6 @@ static struct gpio palmtc_pcmcia_gpios[] = {
{ GPIO_NR_PALMTC_PCMCIA_POWER2, GPIOF_INIT_LOW, "PCMCIA Power 2" }, { GPIO_NR_PALMTC_PCMCIA_POWER2, GPIOF_INIT_LOW, "PCMCIA Power 2" },
{ GPIO_NR_PALMTC_PCMCIA_POWER3, GPIOF_INIT_LOW, "PCMCIA Power 3" }, { GPIO_NR_PALMTC_PCMCIA_POWER3, GPIOF_INIT_LOW, "PCMCIA Power 3" },
{ GPIO_NR_PALMTC_PCMCIA_RESET, GPIOF_INIT_HIGH,"PCMCIA Reset" }, { GPIO_NR_PALMTC_PCMCIA_RESET, GPIOF_INIT_HIGH,"PCMCIA Reset" },
{ GPIO_NR_PALMTC_PCMCIA_READY, GPIOF_IN, "PCMCIA Ready" },
{ GPIO_NR_PALMTC_PCMCIA_PWRREADY, GPIOF_IN, "PCMCIA Power Ready" }, { GPIO_NR_PALMTC_PCMCIA_PWRREADY, GPIOF_IN, "PCMCIA Power Ready" },
}; };
...@@ -37,7 +36,8 @@ static int palmtc_pcmcia_hw_init(struct soc_pcmcia_socket *skt) ...@@ -37,7 +36,8 @@ static int palmtc_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
ret = gpio_request_array(palmtc_pcmcia_gpios, ret = gpio_request_array(palmtc_pcmcia_gpios,
ARRAY_SIZE(palmtc_pcmcia_gpios)); ARRAY_SIZE(palmtc_pcmcia_gpios));
skt->socket.pci_irq = gpio_to_irq(GPIO_NR_PALMTC_PCMCIA_READY); skt->stat[SOC_STAT_RDY].gpio = GPIO_NR_PALMTC_PCMCIA_READY;
skt->stat[SOC_STAT_RDY].name = "PCMCIA Ready";
return ret; return ret;
} }
...@@ -51,9 +51,6 @@ static void palmtc_pcmcia_socket_state(struct soc_pcmcia_socket *skt, ...@@ -51,9 +51,6 @@ static void palmtc_pcmcia_socket_state(struct soc_pcmcia_socket *skt,
struct pcmcia_state *state) struct pcmcia_state *state)
{ {
state->detect = 1; /* always inserted */ state->detect = 1; /* always inserted */
state->ready = !!gpio_get_value(GPIO_NR_PALMTC_PCMCIA_READY);
state->bvd1 = 1;
state->bvd2 = 1;
state->wrprot = 0; state->wrprot = 0;
state->vs_3v = 1; state->vs_3v = 1;
state->vs_Xv = 0; state->vs_Xv = 0;
......
...@@ -23,7 +23,6 @@ static struct gpio palmtx_pcmcia_gpios[] = { ...@@ -23,7 +23,6 @@ static struct gpio palmtx_pcmcia_gpios[] = {
{ GPIO_NR_PALMTX_PCMCIA_POWER1, GPIOF_INIT_LOW, "PCMCIA Power 1" }, { GPIO_NR_PALMTX_PCMCIA_POWER1, GPIOF_INIT_LOW, "PCMCIA Power 1" },
{ GPIO_NR_PALMTX_PCMCIA_POWER2, GPIOF_INIT_LOW, "PCMCIA Power 2" }, { GPIO_NR_PALMTX_PCMCIA_POWER2, GPIOF_INIT_LOW, "PCMCIA Power 2" },
{ GPIO_NR_PALMTX_PCMCIA_RESET, GPIOF_INIT_HIGH,"PCMCIA Reset" }, { GPIO_NR_PALMTX_PCMCIA_RESET, GPIOF_INIT_HIGH,"PCMCIA Reset" },
{ GPIO_NR_PALMTX_PCMCIA_READY, GPIOF_IN, "PCMCIA Ready" },
}; };
static int palmtx_pcmcia_hw_init(struct soc_pcmcia_socket *skt) static int palmtx_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
...@@ -33,7 +32,8 @@ static int palmtx_pcmcia_hw_init(struct soc_pcmcia_socket *skt) ...@@ -33,7 +32,8 @@ static int palmtx_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
ret = gpio_request_array(palmtx_pcmcia_gpios, ret = gpio_request_array(palmtx_pcmcia_gpios,
ARRAY_SIZE(palmtx_pcmcia_gpios)); ARRAY_SIZE(palmtx_pcmcia_gpios));
skt->socket.pci_irq = gpio_to_irq(GPIO_NR_PALMTX_PCMCIA_READY); skt->stat[SOC_STAT_RDY].gpio = GPIO_NR_PALMTX_PCMCIA_READY;
skt->stat[SOC_STAT_RDY].name = "PCMCIA Ready";
return ret; return ret;
} }
...@@ -47,9 +47,6 @@ static void palmtx_pcmcia_socket_state(struct soc_pcmcia_socket *skt, ...@@ -47,9 +47,6 @@ static void palmtx_pcmcia_socket_state(struct soc_pcmcia_socket *skt,
struct pcmcia_state *state) struct pcmcia_state *state)
{ {
state->detect = 1; /* always inserted */ state->detect = 1; /* always inserted */
state->ready = !!gpio_get_value(GPIO_NR_PALMTX_PCMCIA_READY);
state->bvd1 = 1;
state->bvd2 = 1;
state->wrprot = 0; state->wrprot = 0;
state->vs_3v = 1; state->vs_3v = 1;
state->vs_Xv = 0; state->vs_Xv = 0;
......
...@@ -46,21 +46,9 @@ static void sharpsl_pcmcia_init_reset(struct soc_pcmcia_socket *skt) ...@@ -46,21 +46,9 @@ static void sharpsl_pcmcia_init_reset(struct soc_pcmcia_socket *skt)
static int sharpsl_pcmcia_hw_init(struct soc_pcmcia_socket *skt) static int sharpsl_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
{ {
int ret;
/* Register interrupts */
if (SCOOP_DEV[skt->nr].cd_irq >= 0) { if (SCOOP_DEV[skt->nr].cd_irq >= 0) {
struct pcmcia_irqs cd_irq; skt->stat[SOC_STAT_CD].irq = SCOOP_DEV[skt->nr].cd_irq;
skt->stat[SOC_STAT_CD].name = SCOOP_DEV[skt->nr].cd_irq_str;
cd_irq.sock = skt->nr;
cd_irq.irq = SCOOP_DEV[skt->nr].cd_irq;
cd_irq.str = SCOOP_DEV[skt->nr].cd_irq_str;
ret = soc_pcmcia_request_irqs(skt, &cd_irq, 1);
if (ret) {
printk(KERN_ERR "Request for Compact Flash IRQ failed\n");
return ret;
}
} }
skt->socket.pci_irq = SCOOP_DEV[skt->nr].irq; skt->socket.pci_irq = SCOOP_DEV[skt->nr].irq;
...@@ -68,19 +56,6 @@ static int sharpsl_pcmcia_hw_init(struct soc_pcmcia_socket *skt) ...@@ -68,19 +56,6 @@ static int sharpsl_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
return 0; return 0;
} }
static void sharpsl_pcmcia_hw_shutdown(struct soc_pcmcia_socket *skt)
{
if (SCOOP_DEV[skt->nr].cd_irq >= 0) {
struct pcmcia_irqs cd_irq;
cd_irq.sock = skt->nr;
cd_irq.irq = SCOOP_DEV[skt->nr].cd_irq;
cd_irq.str = SCOOP_DEV[skt->nr].cd_irq_str;
soc_pcmcia_free_irqs(skt, &cd_irq, 1);
}
}
static void sharpsl_pcmcia_socket_state(struct soc_pcmcia_socket *skt, static void sharpsl_pcmcia_socket_state(struct soc_pcmcia_socket *skt,
struct pcmcia_state *state) struct pcmcia_state *state)
{ {
...@@ -222,7 +197,6 @@ static void sharpsl_pcmcia_socket_suspend(struct soc_pcmcia_socket *skt) ...@@ -222,7 +197,6 @@ static void sharpsl_pcmcia_socket_suspend(struct soc_pcmcia_socket *skt)
static struct pcmcia_low_level sharpsl_pcmcia_ops __initdata = { static struct pcmcia_low_level sharpsl_pcmcia_ops __initdata = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.hw_init = sharpsl_pcmcia_hw_init, .hw_init = sharpsl_pcmcia_hw_init,
.hw_shutdown = sharpsl_pcmcia_hw_shutdown,
.socket_state = sharpsl_pcmcia_socket_state, .socket_state = sharpsl_pcmcia_socket_state,
.configure_socket = sharpsl_pcmcia_configure_socket, .configure_socket = sharpsl_pcmcia_configure_socket,
.socket_init = sharpsl_pcmcia_socket_init, .socket_init = sharpsl_pcmcia_socket_init,
......
...@@ -33,10 +33,6 @@ ...@@ -33,10 +33,6 @@
#define SG2_S0_GPIO_DETECT 53 #define SG2_S0_GPIO_DETECT 53
#define SG2_S0_GPIO_READY 81 #define SG2_S0_GPIO_READY 81
static struct pcmcia_irqs irqs[] = {
{.sock = 0, .str = "PCMCIA0 CD" },
};
static struct gpio sg2_pcmcia_gpios[] = { static struct gpio sg2_pcmcia_gpios[] = {
{ SG2_S0_GPIO_RESET, GPIOF_OUT_INIT_HIGH, "PCMCIA Reset" }, { SG2_S0_GPIO_RESET, GPIOF_OUT_INIT_HIGH, "PCMCIA Reset" },
{ SG2_S0_POWER_CTL, GPIOF_OUT_INIT_HIGH, "PCMCIA Power Ctrl" }, { SG2_S0_POWER_CTL, GPIOF_OUT_INIT_HIGH, "PCMCIA Power Ctrl" },
...@@ -44,22 +40,16 @@ static struct gpio sg2_pcmcia_gpios[] = { ...@@ -44,22 +40,16 @@ static struct gpio sg2_pcmcia_gpios[] = {
static int sg2_pcmcia_hw_init(struct soc_pcmcia_socket *skt) static int sg2_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
{ {
skt->socket.pci_irq = gpio_to_irq(SG2_S0_GPIO_READY); skt->stat[SOC_STAT_CD].gpio = SG2_S0_GPIO_DETECT;
irqs[0].irq = gpio_to_irq(SG2_S0_GPIO_DETECT); skt->stat[SOC_STAT_CD].name = "PCMCIA0 CD";
skt->stat[SOC_STAT_RDY].gpio = SG2_S0_GPIO_READY;
return soc_pcmcia_request_irqs(skt, irqs, ARRAY_SIZE(irqs)); skt->stat[SOC_STAT_RDY].name = "PCMCIA0 RDY";
} return 0;
static void sg2_pcmcia_hw_shutdown(struct soc_pcmcia_socket *skt)
{
soc_pcmcia_free_irqs(skt, irqs, ARRAY_SIZE(irqs));
} }
static void sg2_pcmcia_socket_state(struct soc_pcmcia_socket *skt, static void sg2_pcmcia_socket_state(struct soc_pcmcia_socket *skt,
struct pcmcia_state *state) struct pcmcia_state *state)
{ {
state->detect = !gpio_get_value(SG2_S0_GPIO_DETECT);
state->ready = !!gpio_get_value(SG2_S0_GPIO_READY);
state->bvd1 = 0; /* not available - battery detect on card */ state->bvd1 = 0; /* not available - battery detect on card */
state->bvd2 = 0; /* not available */ state->bvd2 = 0; /* not available */
state->vs_3v = 1; /* not available - voltage detect for card */ state->vs_3v = 1; /* not available - voltage detect for card */
...@@ -94,24 +84,11 @@ static int sg2_pcmcia_configure_socket(struct soc_pcmcia_socket *skt, ...@@ -94,24 +84,11 @@ static int sg2_pcmcia_configure_socket(struct soc_pcmcia_socket *skt,
return 0; return 0;
} }
static void sg2_pcmcia_socket_init(struct soc_pcmcia_socket *skt)
{
soc_pcmcia_enable_irqs(skt, irqs, ARRAY_SIZE(irqs));
}
static void sg2_pcmcia_socket_suspend(struct soc_pcmcia_socket *skt)
{
soc_pcmcia_disable_irqs(skt, irqs, ARRAY_SIZE(irqs));
}
static struct pcmcia_low_level sg2_pcmcia_ops __initdata = { static struct pcmcia_low_level sg2_pcmcia_ops __initdata = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.hw_init = sg2_pcmcia_hw_init, .hw_init = sg2_pcmcia_hw_init,
.hw_shutdown = sg2_pcmcia_hw_shutdown,
.socket_state = sg2_pcmcia_socket_state, .socket_state = sg2_pcmcia_socket_state,
.configure_socket = sg2_pcmcia_configure_socket, .configure_socket = sg2_pcmcia_configure_socket,
.socket_init = sg2_pcmcia_socket_init,
.socket_suspend = sg2_pcmcia_socket_suspend,
.nr = 1, .nr = 1,
}; };
......
...@@ -29,32 +29,17 @@ ...@@ -29,32 +29,17 @@
extern void board_pcmcia_power(int power); extern void board_pcmcia_power(int power);
static struct pcmcia_irqs irqs[] = {
{ .sock = 0, .str = "cs0_cd" }
/* on other baseboards we can have more inputs */
};
static int trizeps_pcmcia_hw_init(struct soc_pcmcia_socket *skt) static int trizeps_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
{ {
int ret, i;
/* we dont have voltage/card/ready detection /* we dont have voltage/card/ready detection
* so we dont need interrupts for it * so we dont need interrupts for it
*/ */
switch (skt->nr) { switch (skt->nr) {
case 0: case 0:
if (gpio_request(GPIO_PRDY, "cf_irq") < 0) { skt->stat[SOC_STAT_CD].gpio = GPIO_PCD;
pr_err("%s: sock %d unable to request gpio %d\n", __func__, skt->stat[SOC_STAT_CD].name = "cs0_cd";
skt->nr, GPIO_PRDY); skt->stat[SOC_STAT_RDY].gpio = GPIO_PRDY;
return -EBUSY; skt->stat[SOC_STAT_RDY].name = "cs0_rdy";
}
if (gpio_direction_input(GPIO_PRDY) < 0) {
pr_err("%s: sock %d unable to set input gpio %d\n", __func__,
skt->nr, GPIO_PRDY);
gpio_free(GPIO_PRDY);
return -EINVAL;
}
skt->socket.pci_irq = gpio_to_irq(GPIO_PRDY);
irqs[0].irq = gpio_to_irq(GPIO_PCD);
break; break;
default: default:
break; break;
...@@ -62,39 +47,7 @@ static int trizeps_pcmcia_hw_init(struct soc_pcmcia_socket *skt) ...@@ -62,39 +47,7 @@ static int trizeps_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
/* release the reset of this card */ /* release the reset of this card */
pr_debug("%s: sock %d irq %d\n", __func__, skt->nr, skt->socket.pci_irq); pr_debug("%s: sock %d irq %d\n", __func__, skt->nr, skt->socket.pci_irq);
/* supplementory irqs for the socket */ return 0;
for (i = 0; i < ARRAY_SIZE(irqs); i++) {
if (irqs[i].sock != skt->nr)
continue;
if (gpio_request(irq_to_gpio(irqs[i].irq), irqs[i].str) < 0) {
pr_err("%s: sock %d unable to request gpio %d\n",
__func__, skt->nr, irq_to_gpio(irqs[i].irq));
ret = -EBUSY;
goto error;
}
if (gpio_direction_input(irq_to_gpio(irqs[i].irq)) < 0) {
pr_err("%s: sock %d unable to set input gpio %d\n",
__func__, skt->nr, irq_to_gpio(irqs[i].irq));
ret = -EINVAL;
goto error;
}
}
return soc_pcmcia_request_irqs(skt, irqs, ARRAY_SIZE(irqs));
error:
for (; i >= 0; i--) {
gpio_free(irq_to_gpio(irqs[i].irq));
}
return (ret);
}
static void trizeps_pcmcia_hw_shutdown(struct soc_pcmcia_socket *skt)
{
int i;
/* free allocated gpio's */
gpio_free(GPIO_PRDY);
for (i = 0; i < ARRAY_SIZE(irqs); i++)
gpio_free(irq_to_gpio(irqs[i].irq));
} }
static unsigned long trizeps_pcmcia_status[2]; static unsigned long trizeps_pcmcia_status[2];
...@@ -118,8 +71,6 @@ static void trizeps_pcmcia_socket_state(struct soc_pcmcia_socket *skt, ...@@ -118,8 +71,6 @@ static void trizeps_pcmcia_socket_state(struct soc_pcmcia_socket *skt,
switch (skt->nr) { switch (skt->nr) {
case 0: case 0:
/* just fill in fix states */ /* just fill in fix states */
state->detect = gpio_get_value(GPIO_PCD) ? 0 : 1;
state->ready = gpio_get_value(GPIO_PRDY) ? 1 : 0;
state->bvd1 = (status & ConXS_CFSR_BVD1) ? 1 : 0; state->bvd1 = (status & ConXS_CFSR_BVD1) ? 1 : 0;
state->bvd2 = (status & ConXS_CFSR_BVD2) ? 1 : 0; state->bvd2 = (status & ConXS_CFSR_BVD2) ? 1 : 0;
state->vs_3v = (status & ConXS_CFSR_VS1) ? 0 : 1; state->vs_3v = (status & ConXS_CFSR_VS1) ? 0 : 1;
...@@ -204,7 +155,6 @@ static void trizeps_pcmcia_socket_suspend(struct soc_pcmcia_socket *skt) ...@@ -204,7 +155,6 @@ static void trizeps_pcmcia_socket_suspend(struct soc_pcmcia_socket *skt)
static struct pcmcia_low_level trizeps_pcmcia_ops = { static struct pcmcia_low_level trizeps_pcmcia_ops = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.hw_init = trizeps_pcmcia_hw_init, .hw_init = trizeps_pcmcia_hw_init,
.hw_shutdown = trizeps_pcmcia_hw_shutdown,
.socket_state = trizeps_pcmcia_socket_state, .socket_state = trizeps_pcmcia_socket_state,
.configure_socket = trizeps_pcmcia_configure_socket, .configure_socket = trizeps_pcmcia_configure_socket,
.socket_init = trizeps_pcmcia_socket_init, .socket_init = trizeps_pcmcia_socket_init,
......
...@@ -32,13 +32,6 @@ ...@@ -32,13 +32,6 @@
static struct platform_device *arcom_pcmcia_dev; static struct platform_device *arcom_pcmcia_dev;
static struct pcmcia_irqs irqs[] = {
{
.sock = 0,
.str = "PCMCIA_CD",
},
};
static inline struct arcom_pcmcia_pdata *viper_get_pdata(void) static inline struct arcom_pcmcia_pdata *viper_get_pdata(void)
{ {
return arcom_pcmcia_dev->dev.platform_data; return arcom_pcmcia_dev->dev.platform_data;
...@@ -49,38 +42,28 @@ static int viper_pcmcia_hw_init(struct soc_pcmcia_socket *skt) ...@@ -49,38 +42,28 @@ static int viper_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
struct arcom_pcmcia_pdata *pdata = viper_get_pdata(); struct arcom_pcmcia_pdata *pdata = viper_get_pdata();
unsigned long flags; unsigned long flags;
skt->socket.pci_irq = gpio_to_irq(pdata->rdy_gpio); skt->stat[SOC_STAT_CD].gpio = pdata->cd_gpio;
irqs[0].irq = gpio_to_irq(pdata->cd_gpio); skt->stat[SOC_STAT_CD].name = "PCMCIA_CD";
skt->stat[SOC_STAT_RDY].gpio = pdata->rdy_gpio;
if (gpio_request(pdata->cd_gpio, "CF detect")) skt->stat[SOC_STAT_RDY].name = "CF ready";
goto err_request_cd;
if (gpio_request(pdata->rdy_gpio, "CF ready"))
goto err_request_rdy;
if (gpio_request(pdata->pwr_gpio, "CF power")) if (gpio_request(pdata->pwr_gpio, "CF power"))
goto err_request_pwr; goto err_request_pwr;
local_irq_save(flags); local_irq_save(flags);
if (gpio_direction_output(pdata->pwr_gpio, 0) || if (gpio_direction_output(pdata->pwr_gpio, 0)) {
gpio_direction_input(pdata->cd_gpio) ||
gpio_direction_input(pdata->rdy_gpio)) {
local_irq_restore(flags); local_irq_restore(flags);
goto err_dir; goto err_dir;
} }
local_irq_restore(flags); local_irq_restore(flags);
return soc_pcmcia_request_irqs(skt, irqs, ARRAY_SIZE(irqs)); return 0;
err_dir: err_dir:
gpio_free(pdata->pwr_gpio); gpio_free(pdata->pwr_gpio);
err_request_pwr: err_request_pwr:
gpio_free(pdata->rdy_gpio);
err_request_rdy:
gpio_free(pdata->cd_gpio);
err_request_cd:
dev_err(&arcom_pcmcia_dev->dev, "Failed to setup PCMCIA GPIOs\n"); dev_err(&arcom_pcmcia_dev->dev, "Failed to setup PCMCIA GPIOs\n");
return -1; return -1;
} }
...@@ -92,21 +75,12 @@ static void viper_pcmcia_hw_shutdown(struct soc_pcmcia_socket *skt) ...@@ -92,21 +75,12 @@ static void viper_pcmcia_hw_shutdown(struct soc_pcmcia_socket *skt)
{ {
struct arcom_pcmcia_pdata *pdata = viper_get_pdata(); struct arcom_pcmcia_pdata *pdata = viper_get_pdata();
soc_pcmcia_free_irqs(skt, irqs, ARRAY_SIZE(irqs));
gpio_free(pdata->pwr_gpio); gpio_free(pdata->pwr_gpio);
gpio_free(pdata->rdy_gpio);
gpio_free(pdata->cd_gpio);
} }
static void viper_pcmcia_socket_state(struct soc_pcmcia_socket *skt, static void viper_pcmcia_socket_state(struct soc_pcmcia_socket *skt,
struct pcmcia_state *state) struct pcmcia_state *state)
{ {
struct arcom_pcmcia_pdata *pdata = viper_get_pdata();
state->detect = !gpio_get_value(pdata->cd_gpio);
state->ready = !!gpio_get_value(pdata->rdy_gpio);
state->bvd1 = 1;
state->bvd2 = 1;
state->wrprot = 0; state->wrprot = 0;
state->vs_3v = 1; /* Can only apply 3.3V */ state->vs_3v = 1; /* Can only apply 3.3V */
state->vs_Xv = 0; state->vs_Xv = 0;
......
...@@ -23,29 +23,14 @@ ...@@ -23,29 +23,14 @@
#include "soc_common.h" #include "soc_common.h"
static struct gpio vpac270_pcmcia_gpios[] = { static struct gpio vpac270_pcmcia_gpios[] = {
{ GPIO84_VPAC270_PCMCIA_CD, GPIOF_IN, "PCMCIA Card Detect" },
{ GPIO35_VPAC270_PCMCIA_RDY, GPIOF_IN, "PCMCIA Ready" },
{ GPIO107_VPAC270_PCMCIA_PPEN, GPIOF_INIT_LOW, "PCMCIA PPEN" }, { GPIO107_VPAC270_PCMCIA_PPEN, GPIOF_INIT_LOW, "PCMCIA PPEN" },
{ GPIO11_VPAC270_PCMCIA_RESET, GPIOF_INIT_LOW, "PCMCIA Reset" }, { GPIO11_VPAC270_PCMCIA_RESET, GPIOF_INIT_LOW, "PCMCIA Reset" },
}; };
static struct gpio vpac270_cf_gpios[] = { static struct gpio vpac270_cf_gpios[] = {
{ GPIO17_VPAC270_CF_CD, GPIOF_IN, "CF Card Detect" },
{ GPIO12_VPAC270_CF_RDY, GPIOF_IN, "CF Ready" },
{ GPIO16_VPAC270_CF_RESET, GPIOF_INIT_LOW, "CF Reset" }, { GPIO16_VPAC270_CF_RESET, GPIOF_INIT_LOW, "CF Reset" },
}; };
static struct pcmcia_irqs cd_irqs[] = {
{
.sock = 0,
.str = "PCMCIA CD"
},
{
.sock = 1,
.str = "CF CD"
},
};
static int vpac270_pcmcia_hw_init(struct soc_pcmcia_socket *skt) static int vpac270_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
{ {
int ret; int ret;
...@@ -54,20 +39,18 @@ static int vpac270_pcmcia_hw_init(struct soc_pcmcia_socket *skt) ...@@ -54,20 +39,18 @@ static int vpac270_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
ret = gpio_request_array(vpac270_pcmcia_gpios, ret = gpio_request_array(vpac270_pcmcia_gpios,
ARRAY_SIZE(vpac270_pcmcia_gpios)); ARRAY_SIZE(vpac270_pcmcia_gpios));
skt->socket.pci_irq = gpio_to_irq(GPIO35_VPAC270_PCMCIA_RDY); skt->stat[SOC_STAT_CD].gpio = GPIO84_VPAC270_PCMCIA_CD;
cd_irqs[0].irq = gpio_to_irq(GPIO84_VPAC270_PCMCIA_CD); skt->stat[SOC_STAT_CD].name = "PCMCIA CD";
skt->stat[SOC_STAT_RDY].gpio = GPIO35_VPAC270_PCMCIA_RDY;
if (!ret) skt->stat[SOC_STAT_RDY].name = "PCMCIA Ready";
ret = soc_pcmcia_request_irqs(skt, &cd_irqs[0], 1);
} else { } else {
ret = gpio_request_array(vpac270_cf_gpios, ret = gpio_request_array(vpac270_cf_gpios,
ARRAY_SIZE(vpac270_cf_gpios)); ARRAY_SIZE(vpac270_cf_gpios));
skt->socket.pci_irq = gpio_to_irq(GPIO12_VPAC270_CF_RDY); skt->stat[SOC_STAT_CD].gpio = GPIO17_VPAC270_CF_CD;
cd_irqs[1].irq = gpio_to_irq(GPIO17_VPAC270_CF_CD); skt->stat[SOC_STAT_CD].name = "CF CD";
skt->stat[SOC_STAT_RDY].gpio = GPIO12_VPAC270_CF_RDY;
if (!ret) skt->stat[SOC_STAT_RDY].name = "CF Ready";
ret = soc_pcmcia_request_irqs(skt, &cd_irqs[1], 1);
} }
return ret; return ret;
...@@ -86,15 +69,6 @@ static void vpac270_pcmcia_hw_shutdown(struct soc_pcmcia_socket *skt) ...@@ -86,15 +69,6 @@ static void vpac270_pcmcia_hw_shutdown(struct soc_pcmcia_socket *skt)
static void vpac270_pcmcia_socket_state(struct soc_pcmcia_socket *skt, static void vpac270_pcmcia_socket_state(struct soc_pcmcia_socket *skt,
struct pcmcia_state *state) struct pcmcia_state *state)
{ {
if (skt->nr == 0) {
state->detect = !gpio_get_value(GPIO84_VPAC270_PCMCIA_CD);
state->ready = !!gpio_get_value(GPIO35_VPAC270_PCMCIA_RDY);
} else {
state->detect = !gpio_get_value(GPIO17_VPAC270_CF_CD);
state->ready = !!gpio_get_value(GPIO12_VPAC270_CF_RDY);
}
state->bvd1 = 1;
state->bvd2 = 1;
state->wrprot = 0; state->wrprot = 0;
state->vs_3v = 1; state->vs_3v = 1;
state->vs_Xv = 0; state->vs_Xv = 0;
...@@ -117,14 +91,6 @@ vpac270_pcmcia_configure_socket(struct soc_pcmcia_socket *skt, ...@@ -117,14 +91,6 @@ vpac270_pcmcia_configure_socket(struct soc_pcmcia_socket *skt,
return 0; return 0;
} }
static void vpac270_pcmcia_socket_init(struct soc_pcmcia_socket *skt)
{
}
static void vpac270_pcmcia_socket_suspend(struct soc_pcmcia_socket *skt)
{
}
static struct pcmcia_low_level vpac270_pcmcia_ops = { static struct pcmcia_low_level vpac270_pcmcia_ops = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
...@@ -136,9 +102,6 @@ static struct pcmcia_low_level vpac270_pcmcia_ops = { ...@@ -136,9 +102,6 @@ static struct pcmcia_low_level vpac270_pcmcia_ops = {
.socket_state = vpac270_pcmcia_socket_state, .socket_state = vpac270_pcmcia_socket_state,
.configure_socket = vpac270_pcmcia_configure_socket, .configure_socket = vpac270_pcmcia_configure_socket,
.socket_init = vpac270_pcmcia_socket_init,
.socket_suspend = vpac270_pcmcia_socket_suspend,
}; };
static struct platform_device *vpac270_pcmcia_device; static struct platform_device *vpac270_pcmcia_device;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册