PCMCIA: pxa: convert PXA socket drivers to use new irq/gpio management
authorRussell King <rmk+kernel@arm.linux.org.uk>
Fri, 13 Jan 2012 22:56:32 +0000 (22:56 +0000)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Sat, 4 Feb 2012 14:32:22 +0000 (14:32 +0000)
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>
15 files changed:
arch/arm/mach-pxa/include/mach/balloon3.h
drivers/pcmcia/pxa2xx_balloon3.c
drivers/pcmcia/pxa2xx_cm_x255.c
drivers/pcmcia/pxa2xx_cm_x270.c
drivers/pcmcia/pxa2xx_colibri.c
drivers/pcmcia/pxa2xx_e740.c
drivers/pcmcia/pxa2xx_mainstone.c
drivers/pcmcia/pxa2xx_palmld.c
drivers/pcmcia/pxa2xx_palmtc.c
drivers/pcmcia/pxa2xx_palmtx.c
drivers/pcmcia/pxa2xx_sharpsl.c
drivers/pcmcia/pxa2xx_stargate2.c
drivers/pcmcia/pxa2xx_trizeps4.c
drivers/pcmcia/pxa2xx_viper.c
drivers/pcmcia/pxa2xx_vpac270.c

index f02fa1e6ba8619d995773d831bdd04bb7ad34802..954641e6c8b1cec4f1b0f29ea8fae26f0cbfcdf3 100644 (file)
@@ -174,7 +174,6 @@ enum balloon3_features {
 
 #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_S0_CD_IRQ     PXA_GPIO_TO_IRQ(BALLOON3_GPIO_S0_CD)
 
 #define BALLOON3_NR_IRQS       (IRQ_BOARD_START + 16)
 
index 22a75e610f122d15961847d01fd8d90c818208cc..12e38b497719a5201ed99ea5a9dc209256e7bea5 100644 (file)
 
 #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)
 {
        uint16_t ver;
@@ -49,12 +40,12 @@ static int balloon3_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
                        ver);
 
        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)
-{
-       soc_pcmcia_free_irqs(skt, irqs, ARRAY_SIZE(irqs));
+       return 0;
 }
 
 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);
        }
 
-       state->detect   = !gpio_get_value(BALLOON3_GPIO_S0_CD);
        state->ready    = !!(status & BALLOON3_CF_nIRQ);
        state->bvd1     = !!(status & BALLOON3_CF_nSTSCHG_BVD1);
        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 = {
        .owner                  = THIS_MODULE,
        .hw_init                = balloon3_pcmcia_hw_init,
-       .hw_shutdown            = balloon3_pcmcia_hw_shutdown,
        .socket_state           = balloon3_pcmcia_socket_state,
        .configure_socket       = balloon3_pcmcia_configure_socket,
        .first                  = 0,
index 31ab6ddf52c932c1791e87a874a2c6ace211e073..f90e7b1a59586e386b7a62c183c972a1cd772165 100644 (file)
 #define GPIO_PCMCIA_S1_RDYINT  (8)
 #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)
 {
        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;
        gpio_direction_output(GPIO_PCMCIA_RESET, 0);
 
-       skt->socket.pci_irq = skt->nr == 0 ? PCMCIA_S0_RDYINT : PCMCIA_S1_RDYINT;
-       irqs[0].irq = PCMCIA_S0_CD_VALID;
-       irqs[1].irq = PCMCIA_S1_CD_VALID;
-       ret = soc_pcmcia_request_irqs(skt, irqs, ARRAY_SIZE(irqs));
-       if (!ret)
-               gpio_free(GPIO_PCMCIA_RESET);
+       if (skt->nr == 0) {
+               skt->stat[SOC_STAT_CD].gpio = GPIO_PCMCIA_S0_CD_VALID;
+               skt->stat[SOC_STAT_CD].name = "PCMCIA0 CD";
+               skt->stat[SOC_STAT_RDY].gpio = GPIO_PCMCIA_S0_RDYINT;
+               skt->stat[SOC_STAT_RDY].name = "PCMCIA0 RDY";
+       } 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)
 {
-       soc_pcmcia_free_irqs(skt, irqs, ARRAY_SIZE(irqs));
        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,
                                       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_Xv  = 0;
        state->wrprot = 0;  /* not available */
index 3dc7621a076701a843fe0722d0340db703830fa8..efb5f132851b67d1d47dedd8ae1795fd60f51986 100644 (file)
 #define GPIO_PCMCIA_S0_RDYINT  (82)
 #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)
 {
        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;
        gpio_direction_output(GPIO_PCMCIA_RESET, 0);
 
-       skt->socket.pci_irq = PCMCIA_S0_RDYINT;
-       irqs[0].irq = PCMCIA_S0_CD_VALID;
-       ret = soc_pcmcia_request_irqs(skt, irqs, ARRAY_SIZE(irqs));
-       if (!ret)
-               gpio_free(GPIO_PCMCIA_RESET);
+       skt->stat[SOC_STAT_CD].gpio = GPIO_PCMCIA_S0_CD_VALID;
+       skt->stat[SOC_STAT_CD].name = "PCMCIA0 CD";
+       skt->stat[SOC_STAT_RDY].gpio = GPIO_PCMCIA_S0_RDYINT;
+       skt->stat[SOC_STAT_RDY].name = "PCMCIA0 RDY";
 
        return ret;
 }
 
 static void cmx270_pcmcia_shutdown(struct soc_pcmcia_socket *skt)
 {
-       soc_pcmcia_free_irqs(skt, irqs, ARRAY_SIZE(irqs));
        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,
                                       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_Xv  = 0;
        state->wrprot = 0;  /* not available */
index c6dec572a05da6593bac0bce1777042393f66e03..3565169a00f2a71bd74d358de04ecb0d25187b2c 100644 (file)
@@ -53,13 +53,6 @@ static struct gpio colibri_pcmcia_gpios[] = {
        { 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)
 {
        int ret;
@@ -69,19 +62,10 @@ static int colibri_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
        if (ret)
                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->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:
        return ret;
 }
index 17cd2ce7428f76881c3e20b6fca1eebbb5f246a6..24e00a503d088ca5292ceef3017ccfbf7a132675 100644 (file)
 
 #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)
 {
-       if (skt->nr == 0)
-               skt->socket.pci_irq = gpio_to_irq(GPIO_E740_PCMCIA_RDY0);
-       else
-               skt->socket.pci_irq = gpio_to_irq(GPIO_E740_PCMCIA_RDY1);
-
-       cd_irqs[0].irq = gpio_to_irq(GPIO_E740_PCMCIA_CD0);
-       cd_irqs[1].irq = gpio_to_irq(GPIO_E740_PCMCIA_CD1);
-
-       return soc_pcmcia_request_irqs(skt, &cd_irqs[skt->nr], 1);
-}
+       if (skt->nr == 0) {
+               skt->stat[SOC_STAT_CD].gpio = GPIO_E740_PCMCIA_CD0;
+               skt->stat[SOC_STAT_CD].name = "CF card detect";
+               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";
+       }
 
-/*
- * Release all resources.
- */
-static void e740_pcmcia_hw_shutdown(struct soc_pcmcia_socket *skt)
-{
-       soc_pcmcia_free_irqs(skt, &cd_irqs[skt->nr], 1);
+       return 0;
 }
 
 static void e740_pcmcia_socket_state(struct soc_pcmcia_socket *skt,
                                        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->bvd1   = 1;
-       state->bvd2   = 1;
        state->wrprot = 0;
        state->vs_Xv  = 0;
 }
@@ -109,32 +84,11 @@ static int e740_pcmcia_configure_socket(struct soc_pcmcia_socket *skt,
        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 = {
        .owner            = THIS_MODULE,
        .hw_init          = e740_pcmcia_hw_init,
-       .hw_shutdown      = e740_pcmcia_hw_shutdown,
        .socket_state     = e740_pcmcia_socket_state,
        .configure_socket = e740_pcmcia_configure_socket,
-       .socket_init      = e740_pcmcia_socket_init,
-       .socket_suspend   = e740_pcmcia_socket_suspend,
        .nr               = 2,
 };
 
index aded706c0b9fa941a98a94ff84a3881f38a1da42..b0ea4d3f8a1cf45fe0b6866fc14a82c31f314c92 100644 (file)
 #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)
 {
        /*
         * Setup default state of GPIO outputs
         * before we enable them as outputs.
         */
-
-       skt->socket.pci_irq = (skt->nr == 0) ? MAINSTONE_S0_IRQ : MAINSTONE_S1_IRQ;
-       return soc_pcmcia_request_irqs(skt, irqs, ARRAY_SIZE(irqs));
-}
-
-static void mst_pcmcia_hw_shutdown(struct soc_pcmcia_socket *skt)
-{
-       soc_pcmcia_free_irqs(skt, irqs, ARRAY_SIZE(irqs));
+       if (skt->nr == 0) {
+               skt->socket.pci_irq = MAINSTONE_S0_IRQ;
+               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;
+               skt->stat[SOC_STAT_BVD1].name = "PCMCIA0 STSCHG";
+       } else {
+               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];
@@ -131,7 +130,6 @@ static int mst_pcmcia_configure_socket(struct soc_pcmcia_socket *skt,
 static struct pcmcia_low_level mst_pcmcia_ops __initdata = {
        .owner                  = THIS_MODULE,
        .hw_init                = mst_pcmcia_hw_init,
-       .hw_shutdown            = mst_pcmcia_hw_shutdown,
        .socket_state           = mst_pcmcia_socket_state,
        .configure_socket       = mst_pcmcia_configure_socket,
        .nr                     = 2,
index 6a8e011a8c130b0e2a3df3d832bf896ab867ccb0..4bf68144c36503196d8df7f35b4fc5acf29222f9 100644 (file)
@@ -23,7 +23,6 @@
 static struct gpio palmld_pcmcia_gpios[] = {
        { GPIO_NR_PALMLD_PCMCIA_POWER,  GPIOF_INIT_LOW, "PCMCIA Power" },
        { 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)
@@ -33,7 +32,8 @@ static int palmld_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
        ret = gpio_request_array(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;
 }
@@ -47,9 +47,6 @@ static void palmld_pcmcia_socket_state(struct soc_pcmcia_socket *skt,
                                        struct pcmcia_state *state)
 {
        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->vs_3v  = 1;
        state->vs_Xv  = 0;
index 9e38de769ba3b30cbcd3d8f067783f1f314ab488..b32d05f86789202c1171981778dfca214e0e4ffa 100644 (file)
@@ -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_POWER3, GPIOF_INIT_LOW, "PCMCIA Power 3" },
        { 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" },
 };
 
@@ -37,7 +36,8 @@ static int palmtc_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
        ret = gpio_request_array(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;
 }
@@ -51,9 +51,6 @@ static void palmtc_pcmcia_socket_state(struct soc_pcmcia_socket *skt,
                                        struct pcmcia_state *state)
 {
        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->vs_3v  = 1;
        state->vs_Xv  = 0;
index 80645a688ee3cf7b2fc3ddc1e55ddda02058e842..ee024ff0980a6327a97b77ce427f4e555de4f54d 100644 (file)
@@ -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_POWER2, GPIOF_INIT_LOW, "PCMCIA Power 2" },
        { 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)
@@ -33,7 +32,8 @@ static int palmtx_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
        ret = gpio_request_array(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;
 }
@@ -47,9 +47,6 @@ static void palmtx_pcmcia_socket_state(struct soc_pcmcia_socket *skt,
                                        struct pcmcia_state *state)
 {
        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->vs_3v  = 1;
        state->vs_Xv  = 0;
index 69ae2fd22400a7b9db6f59420f90b9c29dfd5ade..b066273b6b4f4dc5a87ee9c37ee589938f8b0d39 100644 (file)
@@ -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)
 {
-       int ret;
-
-       /* Register interrupts */
        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;
-               ret = soc_pcmcia_request_irqs(skt, &cd_irq, 1);
-
-               if (ret) {
-                       printk(KERN_ERR "Request for Compact Flash IRQ failed\n");
-                       return ret;
-               }
+               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;
        }
 
        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;
 }
 
-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,
                                    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 = {
        .owner                  = THIS_MODULE,
        .hw_init                = sharpsl_pcmcia_hw_init,
-       .hw_shutdown            = sharpsl_pcmcia_hw_shutdown,
        .socket_state           = sharpsl_pcmcia_socket_state,
        .configure_socket       = sharpsl_pcmcia_configure_socket,
        .socket_init            = sharpsl_pcmcia_socket_init,
index 6c2366b74a35957af5c471ce10f2f2e10b9ccb12..e7c7eb530cb1c06011c92fc1dc1e029cead764a8 100644 (file)
 #define SG2_S0_GPIO_DETECT     53
 #define SG2_S0_GPIO_READY      81
 
-static struct pcmcia_irqs irqs[] = {
-       {.sock = 0, .str = "PCMCIA0 CD" },
-};
-
 static struct gpio sg2_pcmcia_gpios[] = {
        { SG2_S0_GPIO_RESET, GPIOF_OUT_INIT_HIGH, "PCMCIA Reset" },
        { 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)
 {
-       skt->socket.pci_irq = gpio_to_irq(SG2_S0_GPIO_READY);
-       irqs[0].irq = gpio_to_irq(SG2_S0_GPIO_DETECT);
-
-       return soc_pcmcia_request_irqs(skt, irqs, ARRAY_SIZE(irqs));
-}
-
-static void sg2_pcmcia_hw_shutdown(struct soc_pcmcia_socket *skt)
-{
-       soc_pcmcia_free_irqs(skt, irqs, ARRAY_SIZE(irqs));
+       skt->stat[SOC_STAT_CD].gpio = SG2_S0_GPIO_DETECT;
+       skt->stat[SOC_STAT_CD].name = "PCMCIA0 CD";
+       skt->stat[SOC_STAT_RDY].gpio = SG2_S0_GPIO_READY;
+       skt->stat[SOC_STAT_RDY].name = "PCMCIA0 RDY";
+       return 0;
 }
 
 static void sg2_pcmcia_socket_state(struct soc_pcmcia_socket *skt,
                                    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->bvd2   = 0; /* not available */
        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;
 }
 
-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 = {
        .owner                  = THIS_MODULE,
        .hw_init                = sg2_pcmcia_hw_init,
-       .hw_shutdown            = sg2_pcmcia_hw_shutdown,
        .socket_state           = sg2_pcmcia_socket_state,
        .configure_socket       = sg2_pcmcia_configure_socket,
-       .socket_init            = sg2_pcmcia_socket_init,
-       .socket_suspend         = sg2_pcmcia_socket_suspend,
        .nr                     = 1,
 };
 
index 7c33f898135ab165bf876d3267f072ef40ad282b..31fd9344991388dc56f7db5419aeb4e8eacb5248 100644 (file)
 
 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)
 {
-       int ret, i;
        /* we dont have voltage/card/ready detection
         * so we dont need interrupts for it
         */
        switch (skt->nr) {
        case 0:
-               if (gpio_request(GPIO_PRDY, "cf_irq") < 0) {
-                       pr_err("%s: sock %d unable to request gpio %d\n", __func__,
-                               skt->nr, GPIO_PRDY);
-                       return -EBUSY;
-               }
-               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);
+               skt->stat[SOC_STAT_CD].gpio = GPIO_PCD;
+               skt->stat[SOC_STAT_CD].name = "cs0_cd";
+               skt->stat[SOC_STAT_RDY].gpio = GPIO_PRDY;
+               skt->stat[SOC_STAT_RDY].name = "cs0_rdy";
                break;
        default:
                break;
@@ -62,39 +47,7 @@ static int trizeps_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
        /* release the reset of this card */
        pr_debug("%s: sock %d irq %d\n", __func__, skt->nr, skt->socket.pci_irq);
 
-       /* supplementory irqs for the socket */
-       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));
+       return 0;
 }
 
 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) {
        case 0:
                /* 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->bvd2   = (status & ConXS_CFSR_BVD2) ? 1 : 0;
                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 = {
        .owner                  = THIS_MODULE,
        .hw_init                = trizeps_pcmcia_hw_init,
-       .hw_shutdown            = trizeps_pcmcia_hw_shutdown,
        .socket_state           = trizeps_pcmcia_socket_state,
        .configure_socket       = trizeps_pcmcia_configure_socket,
        .socket_init            = trizeps_pcmcia_socket_init,
index 1064b1c2869d002634b92dfbd7ffa5709825b8bc..6100ef8ce53ed87a70def137ce1c8a7e607140b3 100644 (file)
 
 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)
 {
        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();
        unsigned long flags;
 
-       skt->socket.pci_irq = gpio_to_irq(pdata->rdy_gpio);
-       irqs[0].irq = gpio_to_irq(pdata->cd_gpio);
-
-       if (gpio_request(pdata->cd_gpio, "CF detect"))
-               goto err_request_cd;
-
-       if (gpio_request(pdata->rdy_gpio, "CF ready"))
-               goto err_request_rdy;
+       skt->stat[SOC_STAT_CD].gpio = pdata->cd_gpio;
+       skt->stat[SOC_STAT_CD].name = "PCMCIA_CD";
+       skt->stat[SOC_STAT_RDY].gpio = pdata->rdy_gpio;
+       skt->stat[SOC_STAT_RDY].name = "CF ready";
 
        if (gpio_request(pdata->pwr_gpio, "CF power"))
                goto err_request_pwr;
 
        local_irq_save(flags);
 
-       if (gpio_direction_output(pdata->pwr_gpio, 0) ||
-           gpio_direction_input(pdata->cd_gpio) ||
-           gpio_direction_input(pdata->rdy_gpio)) {
+       if (gpio_direction_output(pdata->pwr_gpio, 0)) {
                local_irq_restore(flags);
                goto err_dir;
        }
 
        local_irq_restore(flags);
 
-       return soc_pcmcia_request_irqs(skt, irqs, ARRAY_SIZE(irqs));
+       return 0;
 
 err_dir:
        gpio_free(pdata->pwr_gpio);
 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");
        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();
 
-       soc_pcmcia_free_irqs(skt, irqs, ARRAY_SIZE(irqs));
        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,
                                      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->vs_3v  = 1; /* Can only apply 3.3V */
        state->vs_Xv  = 0;
index 61b17d235dbe9ee12d7d584f9fbf9943644f7f23..cf07d88255130f14c470d0622a5540571cd72807 100644 (file)
 #include "soc_common.h"
 
 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" },
        { GPIO11_VPAC270_PCMCIA_RESET,  GPIOF_INIT_LOW, "PCMCIA Reset" },
 };
 
 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" },
 };
 
-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)
 {
        int ret;
@@ -54,20 +39,18 @@ static int vpac270_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
                ret = gpio_request_array(vpac270_pcmcia_gpios,
                                ARRAY_SIZE(vpac270_pcmcia_gpios));
 
-               skt->socket.pci_irq = gpio_to_irq(GPIO35_VPAC270_PCMCIA_RDY);
-               cd_irqs[0].irq = gpio_to_irq(GPIO84_VPAC270_PCMCIA_CD);
-
-               if (!ret)
-                       ret = soc_pcmcia_request_irqs(skt, &cd_irqs[0], 1);
+               skt->stat[SOC_STAT_CD].gpio = GPIO84_VPAC270_PCMCIA_CD;
+               skt->stat[SOC_STAT_CD].name = "PCMCIA CD";
+               skt->stat[SOC_STAT_RDY].gpio = GPIO35_VPAC270_PCMCIA_RDY;
+               skt->stat[SOC_STAT_RDY].name = "PCMCIA Ready";
        } else {
                ret = gpio_request_array(vpac270_cf_gpios,
                                ARRAY_SIZE(vpac270_cf_gpios));
 
-               skt->socket.pci_irq = gpio_to_irq(GPIO12_VPAC270_CF_RDY);
-               cd_irqs[1].irq = gpio_to_irq(GPIO17_VPAC270_CF_CD);
-
-               if (!ret)
-                       ret = soc_pcmcia_request_irqs(skt, &cd_irqs[1], 1);
+               skt->stat[SOC_STAT_CD].gpio = GPIO17_VPAC270_CF_CD;
+               skt->stat[SOC_STAT_CD].name = "CF CD";
+               skt->stat[SOC_STAT_RDY].gpio = GPIO12_VPAC270_CF_RDY;
+               skt->stat[SOC_STAT_RDY].name = "CF Ready";
        }
 
        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,
                                        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->vs_3v  = 1;
        state->vs_Xv  = 0;
@@ -117,14 +91,6 @@ vpac270_pcmcia_configure_socket(struct soc_pcmcia_socket *skt,
        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 = {
        .owner                  = THIS_MODULE,
 
@@ -136,9 +102,6 @@ static struct pcmcia_low_level vpac270_pcmcia_ops = {
 
        .socket_state           = vpac270_pcmcia_socket_state,
        .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;