ARM: 7903/1: sa1100: h3xxx: drop hand-coded gpio_request_array analogue
[cascardo/linux.git] / arch / arm / mach-sa1100 / h3xxx.c
index f17e738..c79bf46 100644 (file)
 
 #include "generic.h"
 
-void h3xxx_init_gpio(struct gpio_default_state *s, size_t n)
-{
-       while (n--) {
-               const char *name = s->name;
-               int err;
-
-               if (!name)
-                       name = "[init]";
-               err = gpio_request(s->gpio, name);
-               if (err) {
-                       printk(KERN_ERR "gpio%u: unable to request: %d\n",
-                               s->gpio, err);
-                       continue;
-               }
-               if (s->mode >= 0) {
-                       err = gpio_direction_output(s->gpio, s->mode);
-               } else {
-                       err = gpio_direction_input(s->gpio);
-               }
-               if (err) {
-                       printk(KERN_ERR "gpio%u: unable to set direction: %d\n",
-                               s->gpio, err);
-                       continue;
-               }
-               if (!s->name)
-                       gpio_free(s->gpio);
-               s++;
-       }
-}
-
-
 /*
  * H3xxx flash support
  */
@@ -116,9 +85,34 @@ static struct resource h3xxx_flash_resource =
 /*
  * H3xxx uart support
  */
+static struct gpio h3xxx_uart_gpio[] = {
+       { H3XXX_GPIO_COM_DCD,   GPIOF_IN,               "COM DCD" },
+       { H3XXX_GPIO_COM_CTS,   GPIOF_IN,               "COM CTS" },
+       { H3XXX_GPIO_COM_RTS,   GPIOF_OUT_INIT_LOW,     "COM RTS" },
+};
+
+static bool h3xxx_uart_request_gpios(void)
+{
+       static bool h3xxx_uart_gpio_ok;
+       int rc;
+
+       if (h3xxx_uart_gpio_ok)
+               return true;
+
+       rc = gpio_request_array(h3xxx_uart_gpio, ARRAY_SIZE(h3xxx_uart_gpio));
+       if (rc)
+               pr_err("h3xxx_uart_request_gpios: error %d\n", rc);
+       else
+               h3xxx_uart_gpio_ok = true;
+
+       return h3xxx_uart_gpio_ok;
+}
+
 static void h3xxx_uart_set_mctrl(struct uart_port *port, u_int mctrl)
 {
        if (port->mapbase == _Ser3UTCR0) {
+               if (!h3xxx_uart_request_gpios())
+                       return;
                gpio_set_value(H3XXX_GPIO_COM_RTS, !(mctrl & TIOCM_RTS));
        }
 }
@@ -128,6 +122,8 @@ static u_int h3xxx_uart_get_mctrl(struct uart_port *port)
        u_int ret = TIOCM_CD | TIOCM_CTS | TIOCM_DSR;
 
        if (port->mapbase == _Ser3UTCR0) {
+               if (!h3xxx_uart_request_gpios())
+                       return ret;
                /*
                 * DCD and CTS bits are inverted in GPLR by RS232 transceiver
                 */