Lines Matching +full:cts +full:- +full:gpios
1 // SPDX-License-Identifier: GPL-2.0+
32 { "cts", TIOCM_CTS, GPIOD_IN, },
46 * mctrl_gpio_set - set gpios according to mctrl state
47 * @gpios: gpios to set
50 * Set the gpios according to the mctrl state.
52 void mctrl_gpio_set(struct mctrl_gpios *gpios, unsigned int mctrl)
59 if (gpios == NULL)
63 if (gpios->gpio[i] && mctrl_gpio_flags_is_dir_out(i)) {
64 desc_array[count] = gpios->gpio[i];
74 * mctrl_gpio_to_gpiod - obtain gpio_desc of modem line index
75 * @gpios: gpios to look into
79 struct gpio_desc *mctrl_gpio_to_gpiod(struct mctrl_gpios *gpios,
82 if (gpios == NULL)
85 return gpios->gpio[gidx];
90 * mctrl_gpio_get - update mctrl with the gpios values.
91 * @gpios: gpios to get the info from
95 * Update mctrl with the gpios values.
97 unsigned int mctrl_gpio_get(struct mctrl_gpios *gpios, unsigned int *mctrl)
101 if (gpios == NULL)
105 if (gpios->gpio[i] && !mctrl_gpio_flags_is_dir_out(i)) {
106 if (gpiod_get_value(gpios->gpio[i]))
118 mctrl_gpio_get_outputs(struct mctrl_gpios *gpios, unsigned int *mctrl)
122 if (gpios == NULL)
126 if (gpios->gpio[i] && mctrl_gpio_flags_is_dir_out(i)) {
127 if (gpiod_get_value(gpios->gpio[i]))
140 struct mctrl_gpios *gpios;
143 gpios = devm_kzalloc(dev, sizeof(*gpios), GFP_KERNEL);
144 if (!gpios)
145 return ERR_PTR(-ENOMEM);
152 gpio_str = kasprintf(GFP_KERNEL, "%s-gpios",
162 gpios->gpio[i] =
168 if (IS_ERR(gpios->gpio[i]))
169 return ERR_CAST(gpios->gpio[i]);
172 return gpios;
179 struct mctrl_gpios *gpios = context;
180 struct uart_port *port = gpios->port;
181 u32 mctrl = gpios->mctrl_prev;
185 mctrl_gpio_get(gpios, &mctrl);
189 mctrl_diff = mctrl ^ gpios->mctrl_prev;
190 gpios->mctrl_prev = mctrl;
192 if (mctrl_diff & MCTRL_ANY_DELTA && port->state != NULL) {
194 port->icount.rng++;
197 port->icount.dsr++;
205 wake_up_interruptible(&port->state->port.delta_msr_wait);
214 * mctrl_gpio_init - initialize uart gpios
215 * @port: port to initialize gpios for
218 * This will get the {cts,rts,...}-gpios from device tree if they are present
226 struct mctrl_gpios *gpios;
229 gpios = mctrl_gpio_init_noauto(port->dev, idx);
230 if (IS_ERR(gpios))
231 return gpios;
233 gpios->port = port;
238 if (!gpios->gpio[i] || mctrl_gpio_flags_is_dir_out(i))
241 ret = gpiod_to_irq(gpios->gpio[i]);
243 dev_err(port->dev,
248 gpios->irq[i] = ret;
251 irq_set_status_flags(gpios->irq[i], IRQ_NOAUTOEN);
253 ret = devm_request_irq(port->dev, gpios->irq[i],
255 IRQ_TYPE_EDGE_BOTH, dev_name(port->dev),
256 gpios);
259 dev_err(port->dev,
266 return gpios;
271 * mctrl_gpio_enable_ms - enable irqs and handling of changes to the ms lines
272 * @gpios: gpios to enable
274 void mctrl_gpio_enable_ms(struct mctrl_gpios *gpios)
278 if (gpios == NULL)
282 if (gpios->mctrl_on)
285 gpios->mctrl_on = true;
287 /* get initial status of modem lines GPIOs */
288 mctrl_gpio_get(gpios, &gpios->mctrl_prev);
291 if (!gpios->irq[i])
294 enable_irq(gpios->irq[i]);
299 static void mctrl_gpio_disable_ms(struct mctrl_gpios *gpios, bool sync)
303 if (gpios == NULL)
306 if (!gpios->mctrl_on)
309 gpios->mctrl_on = false;
312 if (!gpios->irq[i])
316 disable_irq(gpios->irq[i]);
318 disable_irq_nosync(gpios->irq[i]);
323 * mctrl_gpio_disable_ms_sync - disable irqs and handling of changes to the ms
325 * @gpios: gpios to disable
327 void mctrl_gpio_disable_ms_sync(struct mctrl_gpios *gpios)
329 mctrl_gpio_disable_ms(gpios, true);
334 * mctrl_gpio_disable_ms_no_sync - disable irqs and handling of changes to the
336 * @gpios: gpios to disable
338 void mctrl_gpio_disable_ms_no_sync(struct mctrl_gpios *gpios)
340 mctrl_gpio_disable_ms(gpios, false);
344 void mctrl_gpio_enable_irq_wake(struct mctrl_gpios *gpios)
348 if (!gpios)
351 if (!gpios->mctrl_on)
355 if (!gpios->irq[i])
358 enable_irq_wake(gpios->irq[i]);
363 void mctrl_gpio_disable_irq_wake(struct mctrl_gpios *gpios)
367 if (!gpios)
370 if (!gpios->mctrl_on)
374 if (!gpios->irq[i])
377 disable_irq_wake(gpios->irq[i]);