pcmcia: soc_common: add support for reset and bus enable GPIOs
authorRussell King <rmk+kernel@armlinux.org.uk>
Wed, 31 Aug 2016 07:49:45 +0000 (08:49 +0100)
committerRussell King <rmk+kernel@armlinux.org.uk>
Thu, 22 Sep 2016 08:38:59 +0000 (09:38 +0100)
Add support to soc_common for controlling reset and bus enable GPIOs
from within the generic soc_common layer, rather than having
individual drivers having to perform this themselves.

Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
drivers/pcmcia/soc_common.c
drivers/pcmcia/soc_common.h

index 4036454..f772127 100644 (file)
@@ -119,6 +119,7 @@ static void __soc_pcmcia_hw_shutdown(struct soc_pcmcia_socket *skt,
        if (skt->ops->hw_shutdown)
                skt->ops->hw_shutdown(skt);
 
+
        clk_disable_unprepare(skt->clk);
 }
 
@@ -286,6 +287,21 @@ static int soc_common_pcmcia_config_skt(
 
        ret = skt->ops->configure_socket(skt, state);
        if (ret == 0) {
+               struct gpio_desc *descs[2];
+               int values[2], n = 0;
+
+               if (skt->gpio_reset) {
+                       descs[n] = skt->gpio_reset;
+                       values[n++] = !!(state->flags & SS_RESET);
+               }
+               if (skt->gpio_bus_enable) {
+                       descs[n] = skt->gpio_bus_enable;
+                       values[n++] = !!(state->flags & SS_OUTPUT_ENA);
+               }
+
+               if (n)
+                       gpiod_set_array_value_cansleep(n, descs, values);
+
                /*
                 * This really needs a better solution.  The IRQ
                 * may or may not be claimed by the driver.
index ee40db1..686ba32 100644 (file)
@@ -62,6 +62,9 @@ struct soc_pcmcia_socket {
 #define SOC_STAT_BVD2          2       /* BATWARN / IOSPKR */
 #define SOC_STAT_RDY           3       /* Ready / Interrupt */
 
+       struct gpio_desc        *gpio_reset;
+       struct gpio_desc        *gpio_bus_enable;
+
        unsigned int            irq_state;
 
        struct timer_list       poll_timer;