Add serdev helper functions for handling of cts and rts lines using the serdev's tiocm functions.
Signed-off-by: Sebastian Reichel <s...@kernel.org> --- include/linux/serdev.h | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/include/linux/serdev.h b/include/linux/serdev.h index 3ad1d695f947..8cdce2ea0d51 100644 --- a/include/linux/serdev.h +++ b/include/linux/serdev.h @@ -16,6 +16,7 @@ #include <linux/types.h> #include <linux/device.h> #include <asm-generic/termios.h> +#include <linux/delay.h> struct serdev_controller; struct serdev_device; @@ -254,6 +255,36 @@ static inline int serdev_device_write_room(struct serdev_device *sdev) #endif /* CONFIG_SERIAL_DEV_BUS */ +static inline bool serdev_device_get_cts(struct serdev_device *serdev) +{ + int status = serdev_device_get_tiocm(serdev); + return !!(status & TIOCM_CTS); +} + +static inline int serdev_device_wait_for_cts(struct serdev_device *serdev, bool state, int timeout_ms) +{ + unsigned long timeout; + bool signal; + + timeout = jiffies + msecs_to_jiffies(timeout_ms); + while (!time_after(jiffies, timeout)) { + signal = serdev_device_get_cts(serdev); + if (signal == state) + return 0; + usleep_range(1000, 2000); + } + + return -ETIMEDOUT; +} + +static inline int serdev_device_set_rts(struct serdev_device *serdev, bool enable) +{ + if (enable) + return serdev_device_set_tiocm(serdev, TIOCM_OUT2 | TIOCM_RTS, 0); + else + return serdev_device_set_tiocm(serdev, 0, TIOCM_OUT2 | TIOCM_RTS); +} + /* * serdev hooks into TTY core */ -- 2.11.0