serial: mctrl_gpio: Use gpiod flags directly
authorAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Wed, 14 Aug 2019 14:07:59 +0000 (17:07 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 4 Sep 2019 10:43:55 +0000 (12:43 +0200)
Description of the modem line control GPIOs contain a boolean type to set
direction of the line. Since GPIO library provides an enumerator type of flags,
we may utilize it and allow a bit more flexibility on the choice of the type of
the line parameters. It also removes an additional layer of value conversion.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Reviewed-by: Stefan Roese <sr@denx.de>
Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
Link: https://lore.kernel.org/r/20190814140759.17486-1-andriy.shevchenko@linux.intel.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/serial/serial_mctrl_gpio.c

index 2b40018..d907430 100644 (file)
@@ -27,16 +27,21 @@ struct mctrl_gpios {
 static const struct {
        const char *name;
        unsigned int mctrl;
-       bool dir_out;
+       enum gpiod_flags flags;
 } mctrl_gpios_desc[UART_GPIO_MAX] = {
-       { "cts", TIOCM_CTS, false, },
-       { "dsr", TIOCM_DSR, false, },
-       { "dcd", TIOCM_CD, false, },
-       { "rng", TIOCM_RNG, false, },
-       { "rts", TIOCM_RTS, true, },
-       { "dtr", TIOCM_DTR, true, },
+       { "cts", TIOCM_CTS, GPIOD_IN, },
+       { "dsr", TIOCM_DSR, GPIOD_IN, },
+       { "dcd", TIOCM_CD,  GPIOD_IN, },
+       { "rng", TIOCM_RNG, GPIOD_IN, },
+       { "rts", TIOCM_RTS, GPIOD_OUT_LOW, },
+       { "dtr", TIOCM_DTR, GPIOD_OUT_LOW, },
 };
 
+static bool mctrl_gpio_flags_is_dir_out(unsigned int idx)
+{
+       return mctrl_gpios_desc[idx].flags & GPIOD_FLAGS_BIT_DIR_OUT;
+}
+
 void mctrl_gpio_set(struct mctrl_gpios *gpios, unsigned int mctrl)
 {
        enum mctrl_gpio_idx i;
@@ -48,7 +53,7 @@ void mctrl_gpio_set(struct mctrl_gpios *gpios, unsigned int mctrl)
                return;
 
        for (i = 0; i < UART_GPIO_MAX; i++)
-               if (gpios->gpio[i] && mctrl_gpios_desc[i].dir_out) {
+               if (gpios->gpio[i] && mctrl_gpio_flags_is_dir_out(i)) {
                        desc_array[count] = gpios->gpio[i];
                        __assign_bit(count, values,
                                     mctrl & mctrl_gpios_desc[i].mctrl);
@@ -73,7 +78,7 @@ unsigned int mctrl_gpio_get(struct mctrl_gpios *gpios, unsigned int *mctrl)
                return *mctrl;
 
        for (i = 0; i < UART_GPIO_MAX; i++) {
-               if (gpios->gpio[i] && !mctrl_gpios_desc[i].dir_out) {
+               if (gpios->gpio[i] && !mctrl_gpio_flags_is_dir_out(i)) {
                        if (gpiod_get_value(gpios->gpio[i]))
                                *mctrl |= mctrl_gpios_desc[i].mctrl;
                        else
@@ -94,7 +99,7 @@ mctrl_gpio_get_outputs(struct mctrl_gpios *gpios, unsigned int *mctrl)
                return *mctrl;
 
        for (i = 0; i < UART_GPIO_MAX; i++) {
-               if (gpios->gpio[i] && mctrl_gpios_desc[i].dir_out) {
+               if (gpios->gpio[i] && mctrl_gpio_flags_is_dir_out(i)) {
                        if (gpiod_get_value(gpios->gpio[i]))
                                *mctrl |= mctrl_gpios_desc[i].mctrl;
                        else
@@ -116,7 +121,6 @@ struct mctrl_gpios *mctrl_gpio_init_noauto(struct device *dev, unsigned int idx)
                return ERR_PTR(-ENOMEM);
 
        for (i = 0; i < UART_GPIO_MAX; i++) {
-               enum gpiod_flags flags;
                char *gpio_str;
                bool present;
 
@@ -131,15 +135,11 @@ struct mctrl_gpios *mctrl_gpio_init_noauto(struct device *dev, unsigned int idx)
                if (!present)
                        continue;
 
-               if (mctrl_gpios_desc[i].dir_out)
-                       flags = GPIOD_OUT_LOW;
-               else
-                       flags = GPIOD_IN;
-
                gpios->gpio[i] =
                        devm_gpiod_get_index_optional(dev,
                                                      mctrl_gpios_desc[i].name,
-                                                     idx, flags);
+                                                     idx,
+                                                     mctrl_gpios_desc[i].flags);
 
                if (IS_ERR(gpios->gpio[i]))
                        return ERR_CAST(gpios->gpio[i]);
@@ -200,7 +200,7 @@ struct mctrl_gpios *mctrl_gpio_init(struct uart_port *port, unsigned int idx)
        for (i = 0; i < UART_GPIO_MAX; ++i) {
                int ret;
 
-               if (!gpios->gpio[i] || mctrl_gpios_desc[i].dir_out)
+               if (!gpios->gpio[i] || mctrl_gpio_flags_is_dir_out(i))
                        continue;
 
                ret = gpiod_to_irq(gpios->gpio[i]);