Line data Source code
1 : /* SPDX-License-Identifier: GPL-2.0+ */
2 : /*
3 : * Helpers for controlling modem lines via GPIO
4 : *
5 : * Copyright (C) 2014 Paratronic S.A.
6 : */
7 :
8 : #ifndef __SERIAL_MCTRL_GPIO__
9 : #define __SERIAL_MCTRL_GPIO__
10 :
11 : #include <linux/err.h>
12 : #include <linux/device.h>
13 : #include <linux/gpio/consumer.h>
14 :
15 : struct uart_port;
16 :
17 : enum mctrl_gpio_idx {
18 : UART_GPIO_CTS,
19 : UART_GPIO_DSR,
20 : UART_GPIO_DCD,
21 : UART_GPIO_RNG,
22 : UART_GPIO_RI = UART_GPIO_RNG,
23 : UART_GPIO_RTS,
24 : UART_GPIO_DTR,
25 : UART_GPIO_MAX,
26 : };
27 :
28 : /*
29 : * Opaque descriptor for modem lines controlled by GPIOs
30 : */
31 : struct mctrl_gpios;
32 :
33 : #ifdef CONFIG_GPIOLIB
34 :
35 : /*
36 : * Set state of the modem control output lines via GPIOs.
37 : */
38 : void mctrl_gpio_set(struct mctrl_gpios *gpios, unsigned int mctrl);
39 :
40 : /*
41 : * Get state of the modem control input lines from GPIOs.
42 : * The mctrl flags are updated and returned.
43 : */
44 : unsigned int mctrl_gpio_get(struct mctrl_gpios *gpios, unsigned int *mctrl);
45 :
46 : /*
47 : * Get state of the modem control output lines from GPIOs.
48 : * The mctrl flags are updated and returned.
49 : */
50 : unsigned int
51 : mctrl_gpio_get_outputs(struct mctrl_gpios *gpios, unsigned int *mctrl);
52 :
53 : /*
54 : * Returns the associated struct gpio_desc to the modem line gidx
55 : */
56 : struct gpio_desc *mctrl_gpio_to_gpiod(struct mctrl_gpios *gpios,
57 : enum mctrl_gpio_idx gidx);
58 :
59 : /*
60 : * Request and set direction of modem control line GPIOs and set up irq
61 : * handling.
62 : * devm_* functions are used, so there's no need to explicitly free.
63 : * Returns a pointer to the allocated mctrl structure if ok, -ENOMEM on
64 : * allocation error.
65 : */
66 : struct mctrl_gpios *mctrl_gpio_init(struct uart_port *port, unsigned int idx);
67 :
68 : /*
69 : * Request and set direction of modem control line GPIOs.
70 : * devm_* functions are used, so there's no need to explicitly free.
71 : * Returns a pointer to the allocated mctrl structure if ok, -ENOMEM on
72 : * allocation error.
73 : */
74 : struct mctrl_gpios *mctrl_gpio_init_noauto(struct device *dev,
75 : unsigned int idx);
76 :
77 : /*
78 : * Enable gpio interrupts to report status line changes.
79 : */
80 : void mctrl_gpio_enable_ms(struct mctrl_gpios *gpios);
81 :
82 : /*
83 : * Disable gpio interrupts to report status line changes, and block until
84 : * any corresponding IRQ is processed
85 : */
86 : void mctrl_gpio_disable_ms_sync(struct mctrl_gpios *gpios);
87 :
88 : /*
89 : * Disable gpio interrupts to report status line changes, and return
90 : * immediately
91 : */
92 : void mctrl_gpio_disable_ms_no_sync(struct mctrl_gpios *gpios);
93 :
94 : /*
95 : * Enable gpio wakeup interrupts to enable wake up source.
96 : */
97 : void mctrl_gpio_enable_irq_wake(struct mctrl_gpios *gpios);
98 :
99 : /*
100 : * Disable gpio wakeup interrupts to enable wake up source.
101 : */
102 : void mctrl_gpio_disable_irq_wake(struct mctrl_gpios *gpios);
103 :
104 : #else /* GPIOLIB */
105 :
106 : static inline
107 0 : void mctrl_gpio_set(struct mctrl_gpios *gpios, unsigned int mctrl)
108 : {
109 0 : }
110 :
111 : static inline
112 0 : unsigned int mctrl_gpio_get(struct mctrl_gpios *gpios, unsigned int *mctrl)
113 : {
114 0 : return *mctrl;
115 : }
116 :
117 : static inline unsigned int
118 0 : mctrl_gpio_get_outputs(struct mctrl_gpios *gpios, unsigned int *mctrl)
119 : {
120 0 : return *mctrl;
121 : }
122 :
123 : static inline
124 : struct gpio_desc *mctrl_gpio_to_gpiod(struct mctrl_gpios *gpios,
125 : enum mctrl_gpio_idx gidx)
126 : {
127 : return NULL;
128 : }
129 :
130 : static inline
131 0 : struct mctrl_gpios *mctrl_gpio_init(struct uart_port *port, unsigned int idx)
132 : {
133 0 : return NULL;
134 : }
135 :
136 : static inline
137 : struct mctrl_gpios *mctrl_gpio_init_noauto(struct device *dev, unsigned int idx)
138 : {
139 : return NULL;
140 : }
141 :
142 0 : static inline void mctrl_gpio_enable_ms(struct mctrl_gpios *gpios)
143 : {
144 0 : }
145 :
146 : static inline void mctrl_gpio_disable_ms_sync(struct mctrl_gpios *gpios)
147 : {
148 : }
149 :
150 0 : static inline void mctrl_gpio_disable_ms_no_sync(struct mctrl_gpios *gpios)
151 : {
152 0 : }
153 :
154 : static inline void mctrl_gpio_enable_irq_wake(struct mctrl_gpios *gpios)
155 : {
156 : }
157 :
158 : static inline void mctrl_gpio_disable_irq_wake(struct mctrl_gpios *gpios)
159 : {
160 : }
161 :
162 : #endif /* GPIOLIB */
163 :
164 : #endif
|