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: Dominik Brodowski <linux@dominikbrodowski.net> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
This commit is contained in:
@@ -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 @@
|
|||||||
|
|
||||||
#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)
|
|||||||
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,
|
|||||||
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,
|
|||||||
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 @@
|
|||||||
#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)
|
|||||||
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)
|
|||||||
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 @@
|
|||||||
#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)
|
|||||||
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)
|
|||||||
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[] = {
|
|||||||
{ 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)
|
|||||||
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 @@
|
|||||||
|
|
||||||
#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";
|
||||||
|
} else {
|
||||||
|
skt->stat[SOC_STAT_CD].gpio = GPIO_E740_PCMCIA_CD1;
|
||||||
|
skt->stat[SOC_STAT_CD].name = "Wifi switch";
|
||||||
|
skt->stat[SOC_STAT_RDY].gpio = GPIO_E740_PCMCIA_RDY1;
|
||||||
|
skt->stat[SOC_STAT_RDY].name = "Wifi ready";
|
||||||
|
}
|
||||||
|
|
||||||
cd_irqs[0].irq = gpio_to_irq(GPIO_E740_PCMCIA_CD0);
|
return 0;
|
||||||
cd_irqs[1].irq = gpio_to_irq(GPIO_E740_PCMCIA_CD1);
|
|
||||||
|
|
||||||
return soc_pcmcia_request_irqs(skt, &cd_irqs[skt->nr], 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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,
|
|||||||
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 @@
|
|||||||
#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,
|
|||||||
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 @@
|
|||||||
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)
|
|||||||
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,
|
|||||||
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[] = {
|
|||||||
{ 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)
|
|||||||
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,
|
|||||||
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[] = {
|
|||||||
{ 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)
|
|||||||
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,
|
|||||||
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)
|
|||||||
|
|
||||||
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)
|
|||||||
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)
|
|||||||
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 @@
|
|||||||
#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[] = {
|
|||||||
|
|
||||||
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,
|
|||||||
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 @@
|
|||||||
|
|
||||||
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)
|
|||||||
/* 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,
|
|||||||
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)
|
|||||||
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 @@
|
|||||||
|
|
||||||
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)
|
|||||||
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)
|
|||||||
{
|
{
|
||||||
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 @@
|
|||||||
#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)
|
|||||||
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)
|
|||||||
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,
|
|||||||
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 = {
|
|||||||
|
|
||||||
.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;
|
||||||
|
|||||||
Reference in New Issue
Block a user