Lines Matching +full:dcd +full:- +full:gpios

1 // SPDX-License-Identifier: GPL-2.0+
34 { "dcd", TIOCM_CD, 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) in mctrl_gpio_set() argument
59 if (gpios == NULL) in mctrl_gpio_set()
63 if (gpios->gpio[i] && mctrl_gpio_flags_is_dir_out(i)) { in mctrl_gpio_set()
64 desc_array[count] = gpios->gpio[i]; in mctrl_gpio_set()
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, in mctrl_gpio_to_gpiod() argument
82 if (gpios == NULL) in mctrl_gpio_to_gpiod()
85 return gpios->gpio[gidx]; in mctrl_gpio_to_gpiod()
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) in mctrl_gpio_get() argument
101 if (gpios == NULL) in mctrl_gpio_get()
105 if (gpios->gpio[i] && !mctrl_gpio_flags_is_dir_out(i)) { in mctrl_gpio_get()
106 if (gpiod_get_value(gpios->gpio[i])) in mctrl_gpio_get()
118 mctrl_gpio_get_outputs(struct mctrl_gpios *gpios, unsigned int *mctrl) in mctrl_gpio_get_outputs() argument
122 if (gpios == NULL) in mctrl_gpio_get_outputs()
126 if (gpios->gpio[i] && mctrl_gpio_flags_is_dir_out(i)) { in mctrl_gpio_get_outputs()
127 if (gpiod_get_value(gpios->gpio[i])) in mctrl_gpio_get_outputs()
140 struct mctrl_gpios *gpios; in mctrl_gpio_init_noauto() local
143 gpios = devm_kzalloc(dev, sizeof(*gpios), GFP_KERNEL); in mctrl_gpio_init_noauto()
144 if (!gpios) in mctrl_gpio_init_noauto()
145 return ERR_PTR(-ENOMEM); in mctrl_gpio_init_noauto()
152 gpio_str = kasprintf(GFP_KERNEL, "%s-gpios", in mctrl_gpio_init_noauto()
162 gpios->gpio[i] = in mctrl_gpio_init_noauto()
168 if (IS_ERR(gpios->gpio[i])) in mctrl_gpio_init_noauto()
169 return ERR_CAST(gpios->gpio[i]); in mctrl_gpio_init_noauto()
172 return gpios; in mctrl_gpio_init_noauto()
179 struct mctrl_gpios *gpios = context; in mctrl_gpio_irq_handle() local
180 struct uart_port *port = gpios->port; in mctrl_gpio_irq_handle()
181 u32 mctrl = gpios->mctrl_prev; in mctrl_gpio_irq_handle()
185 mctrl_gpio_get(gpios, &mctrl); in mctrl_gpio_irq_handle()
189 mctrl_diff = mctrl ^ gpios->mctrl_prev; in mctrl_gpio_irq_handle()
190 gpios->mctrl_prev = mctrl; in mctrl_gpio_irq_handle()
192 if (mctrl_diff & MCTRL_ANY_DELTA && port->state != NULL) { in mctrl_gpio_irq_handle()
194 port->icount.rng++; in mctrl_gpio_irq_handle()
197 port->icount.dsr++; in mctrl_gpio_irq_handle()
205 wake_up_interruptible(&port->state->port.delta_msr_wait); in mctrl_gpio_irq_handle()
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; in mctrl_gpio_init() local
229 gpios = mctrl_gpio_init_noauto(port->dev, idx); in mctrl_gpio_init()
230 if (IS_ERR(gpios)) in mctrl_gpio_init()
231 return gpios; in mctrl_gpio_init()
233 gpios->port = port; in mctrl_gpio_init()
238 if (!gpios->gpio[i] || mctrl_gpio_flags_is_dir_out(i)) in mctrl_gpio_init()
241 ret = gpiod_to_irq(gpios->gpio[i]); in mctrl_gpio_init()
243 dev_err(port->dev, in mctrl_gpio_init()
248 gpios->irq[i] = ret; in mctrl_gpio_init()
251 irq_set_status_flags(gpios->irq[i], IRQ_NOAUTOEN); in mctrl_gpio_init()
253 ret = devm_request_irq(port->dev, gpios->irq[i], in mctrl_gpio_init()
255 IRQ_TYPE_EDGE_BOTH, dev_name(port->dev), in mctrl_gpio_init()
256 gpios); in mctrl_gpio_init()
259 dev_err(port->dev, in mctrl_gpio_init()
266 return gpios; in mctrl_gpio_init()
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) in mctrl_gpio_enable_ms() argument
278 if (gpios == NULL) in mctrl_gpio_enable_ms()
282 if (gpios->mctrl_on) in mctrl_gpio_enable_ms()
285 gpios->mctrl_on = true; in mctrl_gpio_enable_ms()
287 /* get initial status of modem lines GPIOs */ in mctrl_gpio_enable_ms()
288 mctrl_gpio_get(gpios, &gpios->mctrl_prev); in mctrl_gpio_enable_ms()
291 if (!gpios->irq[i]) in mctrl_gpio_enable_ms()
294 enable_irq(gpios->irq[i]); in mctrl_gpio_enable_ms()
299 static void mctrl_gpio_disable_ms(struct mctrl_gpios *gpios, bool sync) in mctrl_gpio_disable_ms() argument
303 if (gpios == NULL) in mctrl_gpio_disable_ms()
306 if (!gpios->mctrl_on) in mctrl_gpio_disable_ms()
309 gpios->mctrl_on = false; in mctrl_gpio_disable_ms()
312 if (!gpios->irq[i]) in mctrl_gpio_disable_ms()
316 disable_irq(gpios->irq[i]); in mctrl_gpio_disable_ms()
318 disable_irq_nosync(gpios->irq[i]); in mctrl_gpio_disable_ms()
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) in mctrl_gpio_disable_ms_sync() argument
329 mctrl_gpio_disable_ms(gpios, true); in mctrl_gpio_disable_ms_sync()
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) in mctrl_gpio_disable_ms_no_sync() argument
340 mctrl_gpio_disable_ms(gpios, false); in mctrl_gpio_disable_ms_no_sync()
344 void mctrl_gpio_enable_irq_wake(struct mctrl_gpios *gpios) in mctrl_gpio_enable_irq_wake() argument
348 if (!gpios) in mctrl_gpio_enable_irq_wake()
351 if (!gpios->mctrl_on) in mctrl_gpio_enable_irq_wake()
355 if (!gpios->irq[i]) in mctrl_gpio_enable_irq_wake()
358 enable_irq_wake(gpios->irq[i]); in mctrl_gpio_enable_irq_wake()
363 void mctrl_gpio_disable_irq_wake(struct mctrl_gpios *gpios) in mctrl_gpio_disable_irq_wake() argument
367 if (!gpios) in mctrl_gpio_disable_irq_wake()
370 if (!gpios->mctrl_on) in mctrl_gpio_disable_irq_wake()
374 if (!gpios->irq[i]) in mctrl_gpio_disable_irq_wake()
377 disable_irq_wake(gpios->irq[i]); in mctrl_gpio_disable_irq_wake()