ARM: 7902/1: sa1100: h3xxx: move serial port GPIO handling to common place
authorDmitry Eremin-Solenikov <dbaryshkov@gmail.com>
Tue, 26 Nov 2013 10:11:00 +0000 (11:11 +0100)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Wed, 12 Feb 2014 10:36:02 +0000 (10:36 +0000)
Both h3100 and h3600 request UART gpios during init_machine time. As
sa1100 gpio driver is going to become proper machine driver, move gpio
handling to UART port functions. Request all gpios using gpio_request
array once and then guard them from rerequesting with bool variable.

Signed-off-by: Dmitry Eremin-Solenikov <dbaryshkov@gmail.com>
Acked-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
arch/arm/mach-sa1100/h3100.c
arch/arm/mach-sa1100/h3600.c
arch/arm/mach-sa1100/h3xxx.c

index daa27c4..3c43219 100644 (file)
@@ -122,15 +122,8 @@ static struct irda_platform_data h3100_irda_data = {
        .shutdown       = h3100_irda_shutdown,
 };
 
-static struct gpio_default_state h3100_default_gpio[] = {
-       { H3XXX_GPIO_COM_DCD,   GPIO_MODE_IN,   "COM DCD" },
-       { H3XXX_GPIO_COM_CTS,   GPIO_MODE_IN,   "COM CTS" },
-       { H3XXX_GPIO_COM_RTS,   GPIO_MODE_OUT0, "COM RTS" },
-};
-
 static void __init h3100_mach_init(void)
 {
-       h3xxx_init_gpio(h3100_default_gpio, ARRAY_SIZE(h3100_default_gpio));
        h3xxx_mach_init();
 
        sa11x0_register_lcd(&h3100_lcd_info);
index a663e72..5be54c2 100644 (file)
@@ -130,15 +130,8 @@ static struct irda_platform_data h3600_irda_data = {
        .shutdown       = h3600_irda_shutdown,
 };
 
-static struct gpio_default_state h3600_default_gpio[] = {
-       { H3XXX_GPIO_COM_DCD,   GPIO_MODE_IN,   "COM DCD" },
-       { H3XXX_GPIO_COM_CTS,   GPIO_MODE_IN,   "COM CTS" },
-       { H3XXX_GPIO_COM_RTS,   GPIO_MODE_OUT0, "COM RTS" },
-};
-
 static void __init h3600_mach_init(void)
 {
-       h3xxx_init_gpio(h3600_default_gpio, ARRAY_SIZE(h3600_default_gpio));
        h3xxx_mach_init();
 
        sa11x0_register_lcd(&h3600_lcd_info);
index f17e738..82e8702 100644 (file)
@@ -116,9 +116,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 +153,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
                 */