forked from Minki/linux
e8b2a61875
If CONFIG_GPIOLIB is not enabled, mctrl_gpio_init() and mctrl_gpio_init_noauto() will currently return an error pointer with -ENOSYS. As the mctrl GPIOs are usually optional, drivers need to check for this condition to allow continue probing. To avoid the need for this check in each driver, we return NULL instead, as all the mctrl_gpio_*() functions are skipped anyway. We also adapt mctrl_gpio_to_gpiod() to be in line with this change. Reviewed-by: Fabio Estevam <festevam@gmail.com> Signed-off-by: Frieder Schrempf <frieder.schrempf@kontron.de> Reviewed-by: Uwe Kleine-Knig <u.kleine-koenig@pengutronix.de> Link: https://lore.kernel.org/r/20190802100349.8659-1-frieder.schrempf@kontron.de Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
148 lines
3.3 KiB
C
148 lines
3.3 KiB
C
// SPDX-License-Identifier: GPL-2.0+
|
|
/*
|
|
* Helpers for controlling modem lines via GPIO
|
|
*
|
|
* Copyright (C) 2014 Paratronic S.A.
|
|
*/
|
|
|
|
#ifndef __SERIAL_MCTRL_GPIO__
|
|
#define __SERIAL_MCTRL_GPIO__
|
|
|
|
#include <linux/err.h>
|
|
#include <linux/device.h>
|
|
#include <linux/gpio/consumer.h>
|
|
|
|
struct uart_port;
|
|
|
|
enum mctrl_gpio_idx {
|
|
UART_GPIO_CTS,
|
|
UART_GPIO_DSR,
|
|
UART_GPIO_DCD,
|
|
UART_GPIO_RNG,
|
|
UART_GPIO_RI = UART_GPIO_RNG,
|
|
UART_GPIO_RTS,
|
|
UART_GPIO_DTR,
|
|
UART_GPIO_MAX,
|
|
};
|
|
|
|
/*
|
|
* Opaque descriptor for modem lines controlled by GPIOs
|
|
*/
|
|
struct mctrl_gpios;
|
|
|
|
#ifdef CONFIG_GPIOLIB
|
|
|
|
/*
|
|
* Set state of the modem control output lines via GPIOs.
|
|
*/
|
|
void mctrl_gpio_set(struct mctrl_gpios *gpios, unsigned int mctrl);
|
|
|
|
/*
|
|
* Get state of the modem control input lines from GPIOs.
|
|
* The mctrl flags are updated and returned.
|
|
*/
|
|
unsigned int mctrl_gpio_get(struct mctrl_gpios *gpios, unsigned int *mctrl);
|
|
|
|
/*
|
|
* Get state of the modem control output lines from GPIOs.
|
|
* The mctrl flags are updated and returned.
|
|
*/
|
|
unsigned int
|
|
mctrl_gpio_get_outputs(struct mctrl_gpios *gpios, unsigned int *mctrl);
|
|
|
|
/*
|
|
* Returns the associated struct gpio_desc to the modem line gidx
|
|
*/
|
|
struct gpio_desc *mctrl_gpio_to_gpiod(struct mctrl_gpios *gpios,
|
|
enum mctrl_gpio_idx gidx);
|
|
|
|
/*
|
|
* Request and set direction of modem control line GPIOs and set up irq
|
|
* handling.
|
|
* devm_* functions are used, so there's no need to call mctrl_gpio_free().
|
|
* Returns a pointer to the allocated mctrl structure if ok, -ENOMEM on
|
|
* allocation error.
|
|
*/
|
|
struct mctrl_gpios *mctrl_gpio_init(struct uart_port *port, unsigned int idx);
|
|
|
|
/*
|
|
* Request and set direction of modem control line GPIOs.
|
|
* devm_* functions are used, so there's no need to call mctrl_gpio_free().
|
|
* Returns a pointer to the allocated mctrl structure if ok, -ENOMEM on
|
|
* allocation error.
|
|
*/
|
|
struct mctrl_gpios *mctrl_gpio_init_noauto(struct device *dev,
|
|
unsigned int idx);
|
|
|
|
/*
|
|
* Free the mctrl_gpios structure.
|
|
* Normally, this function will not be called, as the GPIOs will
|
|
* be disposed of by the resource management code.
|
|
*/
|
|
void mctrl_gpio_free(struct device *dev, struct mctrl_gpios *gpios);
|
|
|
|
/*
|
|
* Enable gpio interrupts to report status line changes.
|
|
*/
|
|
void mctrl_gpio_enable_ms(struct mctrl_gpios *gpios);
|
|
|
|
/*
|
|
* Disable gpio interrupts to report status line changes.
|
|
*/
|
|
void mctrl_gpio_disable_ms(struct mctrl_gpios *gpios);
|
|
|
|
#else /* GPIOLIB */
|
|
|
|
static inline
|
|
void mctrl_gpio_set(struct mctrl_gpios *gpios, unsigned int mctrl)
|
|
{
|
|
}
|
|
|
|
static inline
|
|
unsigned int mctrl_gpio_get(struct mctrl_gpios *gpios, unsigned int *mctrl)
|
|
{
|
|
return *mctrl;
|
|
}
|
|
|
|
static inline unsigned int
|
|
mctrl_gpio_get_outputs(struct mctrl_gpios *gpios, unsigned int *mctrl)
|
|
{
|
|
return *mctrl;
|
|
}
|
|
|
|
static inline
|
|
struct gpio_desc *mctrl_gpio_to_gpiod(struct mctrl_gpios *gpios,
|
|
enum mctrl_gpio_idx gidx)
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
static inline
|
|
struct mctrl_gpios *mctrl_gpio_init(struct uart_port *port, unsigned int idx)
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
static inline
|
|
struct mctrl_gpios *mctrl_gpio_init_noauto(struct device *dev, unsigned int idx)
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
static inline
|
|
void mctrl_gpio_free(struct device *dev, struct mctrl_gpios *gpios)
|
|
{
|
|
}
|
|
|
|
static inline void mctrl_gpio_enable_ms(struct mctrl_gpios *gpios)
|
|
{
|
|
}
|
|
|
|
static inline void mctrl_gpio_disable_ms(struct mctrl_gpios *gpios)
|
|
{
|
|
}
|
|
|
|
#endif /* GPIOLIB */
|
|
|
|
#endif
|