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 call mctrl_gpio_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 call mctrl_gpio_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 | * Free the mctrl_gpios structure. |
79 | * Normally, this function will not be called, as the GPIOs will |
80 | * be disposed of by the resource management code. |
81 | */ |
82 | void mctrl_gpio_free(struct device *dev, struct mctrl_gpios *gpios); |
83 | |
84 | /* |
85 | * Enable gpio interrupts to report status line changes. |
86 | */ |
87 | void mctrl_gpio_enable_ms(struct mctrl_gpios *gpios); |
88 | |
89 | /* |
90 | * Disable gpio interrupts to report status line changes. |
91 | */ |
92 | void mctrl_gpio_disable_ms(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 | void mctrl_gpio_set(struct mctrl_gpios *gpios, unsigned int mctrl) |
108 | { |
109 | } |
110 | |
111 | static inline |
112 | unsigned int mctrl_gpio_get(struct mctrl_gpios *gpios, unsigned int *mctrl) |
113 | { |
114 | return *mctrl; |
115 | } |
116 | |
117 | static inline unsigned int |
118 | mctrl_gpio_get_outputs(struct mctrl_gpios *gpios, unsigned int *mctrl) |
119 | { |
120 | 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 | struct mctrl_gpios *mctrl_gpio_init(struct uart_port *port, unsigned int idx) |
132 | { |
133 | 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 | static inline |
143 | void mctrl_gpio_free(struct device *dev, struct mctrl_gpios *gpios) |
144 | { |
145 | } |
146 | |
147 | static inline void mctrl_gpio_enable_ms(struct mctrl_gpios *gpios) |
148 | { |
149 | } |
150 | |
151 | static inline void mctrl_gpio_disable_ms(struct mctrl_gpios *gpios) |
152 | { |
153 | } |
154 | |
155 | static inline void mctrl_gpio_enable_irq_wake(struct mctrl_gpios *gpios) |
156 | { |
157 | } |
158 | |
159 | static inline void mctrl_gpio_disable_irq_wake(struct mctrl_gpios *gpios) |
160 | { |
161 | } |
162 | |
163 | #endif /* GPIOLIB */ |
164 | |
165 | #endif |
166 | |