On 10.03.2014 17:45, Richard Genoud wrote:
> This patch add some helpers to control modem lines (CTS/RTS/DSR...) via
> GPIO.
> This will be useful for many boards which have a serial controller that
> only handle CTS/RTS pins (or even just RX/TX).
> 
> Signed-off-by: Richard Genoud <[email protected]>

....

> +
> +struct mctrl_gpios {
> +     struct gpio_desc *gpio[UART_GPIO_MAX];
> +};
> +
> +static const struct {
> +     const char *name;
> +     unsigned int mctrl;
> +     bool dir_out;
> +} 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, },
> +     { "out1", TIOCM_OUT1, true, },
> +     { "out2", TIOCM_OUT2, true, },
> +};
> +
> +void mctrl_gpio_set(struct mctrl_gpios *gpios, unsigned int mctrl)
> +{
> +     enum mctrl_gpio_idx i;
> +
> +     if (IS_ERR_OR_NULL(gpios))
> +             return;
> +
> +     for (i = 0; i < UART_GPIO_MAX; i++)
> +             if (!IS_ERR_OR_NULL(gpios->gpio[i]) &&
> +                 mctrl_gpios_desc[i].dir_out)
> +                     gpiod_set_value(gpios->gpio[i],
> +                                     !!(mctrl & mctrl_gpios_desc[i].mctrl));
> +}
> +EXPORT_SYMBOL_GPL(mctrl_gpio_set);
> +
> +struct gpio_desc *mctrl_gpio_to_gpiod(struct mctrl_gpios *gpios,
> +                                   enum mctrl_gpio_idx gidx)
> +{
> +     if (!IS_ERR_OR_NULL(gpios) && !IS_ERR_OR_NULL(gpios->gpio[gidx]))
> +             return gpios->gpio[gidx];
> +     else
> +             return NULL;
> +}
> +EXPORT_SYMBOL_GPL(mctrl_gpio_to_gpiod);
> +
> +unsigned int mctrl_gpio_get(struct mctrl_gpios *gpios, unsigned int *mctrl)
> +{
> +     enum mctrl_gpio_idx i;
> +
> +     /*
> +      * return it unchanged if the structure is not allocated
> +      */
> +     if (IS_ERR_OR_NULL(gpios))
> +             return *mctrl;
> +
> +     for (i = 0; i < UART_GPIO_MAX; i++) {
> +             if (!IS_ERR_OR_NULL(gpios->gpio[i]) &&
> +                 !mctrl_gpios_desc[i].dir_out) {
> +                     if (gpiod_get_value(gpios->gpio[i]))
> +                             *mctrl |= mctrl_gpios_desc[i].mctrl;
> +                     else
> +                             *mctrl &= ~mctrl_gpios_desc[i].mctrl;
> +             }
> +     }
> +
> +     return *mctrl;
> +}
> +EXPORT_SYMBOL_GPL(mctrl_gpio_get);

Should this routine be renamed to msr_gpio_get() or perhaps better to give all 
values (inputs and outputs)?

I'm trying to port this approach to omap-serial to implement RS485 switching. I 
need to know if RTS is already on or not and set it accordingly.

What would be the best solution for this task using this new API?

Yegor
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to