1 /*
2  * Copyright (c) 2018-2019 Nordic Semiconductor ASA
3  * Copyright (c) 2015 Wind River Systems, Inc.
4  *
5  * SPDX-License-Identifier: Apache-2.0
6  */
7 
8 /**
9  * @file
10  * @brief Internal APIs for UART drivers
11  */
12 
13 #ifndef ZEPHYR_INCLUDE_DRIVERS_UART_UART_INTERNAL_H_
14 #define ZEPHYR_INCLUDE_DRIVERS_UART_UART_INTERNAL_H_
15 
16 #include <errno.h>
17 #include <stddef.h>
18 
19 #include <zephyr/device.h>
20 
21 /**
22  * @cond INTERNAL_HIDDEN
23  *
24  * For internal driver use only, skip these in public documentation.
25  */
26 
27 #ifdef __cplusplus
28 extern "C" {
29 #endif
30 
31 /**
32  * @brief For configuring IRQ on each individual UART device.
33  *
34  * @param dev UART device instance.
35  */
36 typedef void (*uart_irq_config_func_t)(const struct device *dev);
37 
38 /** @brief Driver API structure. */
39 __subsystem struct uart_driver_api {
40 
41 #ifdef CONFIG_UART_ASYNC_API
42 
43 	int (*callback_set)(const struct device *dev, uart_callback_t callback, void *user_data);
44 
45 	int (*tx)(const struct device *dev, const uint8_t *buf, size_t len, int32_t timeout);
46 	int (*tx_abort)(const struct device *dev);
47 
48 	int (*rx_enable)(const struct device *dev, uint8_t *buf, size_t len, int32_t timeout);
49 	int (*rx_buf_rsp)(const struct device *dev, uint8_t *buf, size_t len);
50 	int (*rx_disable)(const struct device *dev);
51 
52 #ifdef CONFIG_UART_WIDE_DATA
53 	int (*tx_u16)(const struct device *dev, const uint16_t *buf, size_t len, int32_t timeout);
54 	int (*rx_enable_u16)(const struct device *dev, uint16_t *buf, size_t len, int32_t timeout);
55 	int (*rx_buf_rsp_u16)(const struct device *dev, uint16_t *buf, size_t len);
56 #endif
57 
58 #endif
59 
60 	/** Console I/O function */
61 	int (*poll_in)(const struct device *dev, unsigned char *p_char);
62 	void (*poll_out)(const struct device *dev, unsigned char out_char);
63 
64 #ifdef CONFIG_UART_WIDE_DATA
65 	int (*poll_in_u16)(const struct device *dev, uint16_t *p_u16);
66 	void (*poll_out_u16)(const struct device *dev, uint16_t out_u16);
67 #endif
68 
69 	/** Console I/O function */
70 	int (*err_check)(const struct device *dev);
71 
72 #ifdef CONFIG_UART_USE_RUNTIME_CONFIGURE
73 	/** UART configuration functions */
74 	int (*configure)(const struct device *dev, const struct uart_config *cfg);
75 	int (*config_get)(const struct device *dev, struct uart_config *cfg);
76 #endif
77 
78 #ifdef CONFIG_UART_INTERRUPT_DRIVEN
79 
80 	/** Interrupt driven FIFO fill function */
81 	int (*fifo_fill)(const struct device *dev, const uint8_t *tx_data, int len);
82 
83 #ifdef CONFIG_UART_WIDE_DATA
84 	int (*fifo_fill_u16)(const struct device *dev, const uint16_t *tx_data, int len);
85 #endif
86 
87 	/** Interrupt driven FIFO read function */
88 	int (*fifo_read)(const struct device *dev, uint8_t *rx_data, const int size);
89 
90 #ifdef CONFIG_UART_WIDE_DATA
91 	int (*fifo_read_u16)(const struct device *dev, uint16_t *rx_data, const int size);
92 #endif
93 
94 	/** Interrupt driven transfer enabling function */
95 	void (*irq_tx_enable)(const struct device *dev);
96 
97 	/** Interrupt driven transfer disabling function */
98 	void (*irq_tx_disable)(const struct device *dev);
99 
100 	/** Interrupt driven transfer ready function */
101 	int (*irq_tx_ready)(const struct device *dev);
102 
103 	/** Interrupt driven receiver enabling function */
104 	void (*irq_rx_enable)(const struct device *dev);
105 
106 	/** Interrupt driven receiver disabling function */
107 	void (*irq_rx_disable)(const struct device *dev);
108 
109 	/** Interrupt driven transfer complete function */
110 	int (*irq_tx_complete)(const struct device *dev);
111 
112 	/** Interrupt driven receiver ready function */
113 	int (*irq_rx_ready)(const struct device *dev);
114 
115 	/** Interrupt driven error enabling function */
116 	void (*irq_err_enable)(const struct device *dev);
117 
118 	/** Interrupt driven error disabling function */
119 	void (*irq_err_disable)(const struct device *dev);
120 
121 	/** Interrupt driven pending status function */
122 	int (*irq_is_pending)(const struct device *dev);
123 
124 	/** Interrupt driven interrupt update function */
125 	int (*irq_update)(const struct device *dev);
126 
127 	/** Set the irq callback function */
128 	void (*irq_callback_set)(const struct device *dev, uart_irq_callback_user_data_t cb,
129 				 void *user_data);
130 
131 #endif
132 
133 #ifdef CONFIG_UART_LINE_CTRL
134 	int (*line_ctrl_set)(const struct device *dev, uint32_t ctrl, uint32_t val);
135 	int (*line_ctrl_get)(const struct device *dev, uint32_t ctrl, uint32_t *val);
136 #endif
137 
138 #ifdef CONFIG_UART_DRV_CMD
139 	int (*drv_cmd)(const struct device *dev, uint32_t cmd, uint32_t p);
140 #endif
141 };
142 
z_impl_uart_err_check(const struct device * dev)143 static inline int z_impl_uart_err_check(const struct device *dev)
144 {
145 	const struct uart_driver_api *api = (const struct uart_driver_api *)dev->api;
146 
147 	if (api->err_check == NULL) {
148 		return -ENOSYS;
149 	}
150 
151 	return api->err_check(dev);
152 }
153 
z_impl_uart_poll_in(const struct device * dev,unsigned char * p_char)154 static inline int z_impl_uart_poll_in(const struct device *dev, unsigned char *p_char)
155 {
156 	const struct uart_driver_api *api = (const struct uart_driver_api *)dev->api;
157 
158 	if (api->poll_in == NULL) {
159 		return -ENOSYS;
160 	}
161 
162 	return api->poll_in(dev, p_char);
163 }
164 
z_impl_uart_poll_in_u16(const struct device * dev,uint16_t * p_u16)165 static inline int z_impl_uart_poll_in_u16(const struct device *dev, uint16_t *p_u16)
166 {
167 #ifdef CONFIG_UART_WIDE_DATA
168 	const struct uart_driver_api *api = (const struct uart_driver_api *)dev->api;
169 
170 	if (api->poll_in_u16 == NULL) {
171 		return -ENOSYS;
172 	}
173 
174 	return api->poll_in_u16(dev, p_u16);
175 #else
176 	ARG_UNUSED(dev);
177 	ARG_UNUSED(p_u16);
178 	return -ENOTSUP;
179 #endif
180 }
181 
z_impl_uart_poll_out(const struct device * dev,unsigned char out_char)182 static inline void z_impl_uart_poll_out(const struct device *dev, unsigned char out_char)
183 {
184 	const struct uart_driver_api *api = (const struct uart_driver_api *)dev->api;
185 
186 	api->poll_out(dev, out_char);
187 }
188 
z_impl_uart_poll_out_u16(const struct device * dev,uint16_t out_u16)189 static inline void z_impl_uart_poll_out_u16(const struct device *dev, uint16_t out_u16)
190 {
191 #ifdef CONFIG_UART_WIDE_DATA
192 	const struct uart_driver_api *api = (const struct uart_driver_api *)dev->api;
193 
194 	api->poll_out_u16(dev, out_u16);
195 #else
196 	ARG_UNUSED(dev);
197 	ARG_UNUSED(out_u16);
198 #endif
199 }
200 
z_impl_uart_configure(const struct device * dev,const struct uart_config * cfg)201 static inline int z_impl_uart_configure(const struct device *dev, const struct uart_config *cfg)
202 {
203 #ifdef CONFIG_UART_USE_RUNTIME_CONFIGURE
204 	const struct uart_driver_api *api = (const struct uart_driver_api *)dev->api;
205 
206 	if (api->configure == NULL) {
207 		return -ENOSYS;
208 	}
209 	return api->configure(dev, cfg);
210 #else
211 	ARG_UNUSED(dev);
212 	ARG_UNUSED(cfg);
213 	return -ENOTSUP;
214 #endif
215 }
216 
z_impl_uart_config_get(const struct device * dev,struct uart_config * cfg)217 static inline int z_impl_uart_config_get(const struct device *dev, struct uart_config *cfg)
218 {
219 #ifdef CONFIG_UART_USE_RUNTIME_CONFIGURE
220 	const struct uart_driver_api *api = (const struct uart_driver_api *)dev->api;
221 
222 	if (api->config_get == NULL) {
223 		return -ENOSYS;
224 	}
225 
226 	return api->config_get(dev, cfg);
227 #else
228 	ARG_UNUSED(dev);
229 	ARG_UNUSED(cfg);
230 	return -ENOTSUP;
231 #endif
232 }
233 
uart_fifo_fill(const struct device * dev,const uint8_t * tx_data,int size)234 static inline int uart_fifo_fill(const struct device *dev, const uint8_t *tx_data, int size)
235 {
236 #ifdef CONFIG_UART_INTERRUPT_DRIVEN
237 	const struct uart_driver_api *api = (const struct uart_driver_api *)dev->api;
238 
239 	if (api->fifo_fill == NULL) {
240 		return -ENOSYS;
241 	}
242 
243 	return api->fifo_fill(dev, tx_data, size);
244 #else
245 	ARG_UNUSED(dev);
246 	ARG_UNUSED(tx_data);
247 	ARG_UNUSED(size);
248 	return -ENOTSUP;
249 #endif
250 }
251 
uart_fifo_fill_u16(const struct device * dev,const uint16_t * tx_data,int size)252 static inline int uart_fifo_fill_u16(const struct device *dev, const uint16_t *tx_data, int size)
253 {
254 #if defined(CONFIG_UART_INTERRUPT_DRIVEN) && defined(CONFIG_UART_WIDE_DATA)
255 	const struct uart_driver_api *api = (const struct uart_driver_api *)dev->api;
256 
257 	if (api->fifo_fill_u16 == NULL) {
258 		return -ENOSYS;
259 	}
260 
261 	return api->fifo_fill_u16(dev, tx_data, size);
262 #else
263 	ARG_UNUSED(dev);
264 	ARG_UNUSED(tx_data);
265 	ARG_UNUSED(size);
266 	return -ENOTSUP;
267 #endif
268 }
269 
uart_fifo_read(const struct device * dev,uint8_t * rx_data,const int size)270 static inline int uart_fifo_read(const struct device *dev, uint8_t *rx_data, const int size)
271 {
272 #ifdef CONFIG_UART_INTERRUPT_DRIVEN
273 	const struct uart_driver_api *api = (const struct uart_driver_api *)dev->api;
274 
275 	if (api->fifo_read == NULL) {
276 		return -ENOSYS;
277 	}
278 
279 	return api->fifo_read(dev, rx_data, size);
280 #else
281 	ARG_UNUSED(dev);
282 	ARG_UNUSED(rx_data);
283 	ARG_UNUSED(size);
284 	return -ENOTSUP;
285 #endif
286 }
287 
uart_fifo_read_u16(const struct device * dev,uint16_t * rx_data,const int size)288 static inline int uart_fifo_read_u16(const struct device *dev, uint16_t *rx_data, const int size)
289 {
290 #if defined(CONFIG_UART_INTERRUPT_DRIVEN) && defined(CONFIG_UART_WIDE_DATA)
291 	const struct uart_driver_api *api = (const struct uart_driver_api *)dev->api;
292 
293 	if (api->fifo_read_u16 == NULL) {
294 		return -ENOSYS;
295 	}
296 
297 	return api->fifo_read_u16(dev, rx_data, size);
298 #else
299 	ARG_UNUSED(dev);
300 	ARG_UNUSED(rx_data);
301 	ARG_UNUSED(size);
302 	return -ENOTSUP;
303 #endif
304 }
305 
z_impl_uart_irq_tx_enable(const struct device * dev)306 static inline void z_impl_uart_irq_tx_enable(const struct device *dev)
307 {
308 #ifdef CONFIG_UART_INTERRUPT_DRIVEN
309 	const struct uart_driver_api *api = (const struct uart_driver_api *)dev->api;
310 
311 	if (api->irq_tx_enable != NULL) {
312 		api->irq_tx_enable(dev);
313 	}
314 #else
315 	ARG_UNUSED(dev);
316 #endif
317 }
318 
z_impl_uart_irq_tx_disable(const struct device * dev)319 static inline void z_impl_uart_irq_tx_disable(const struct device *dev)
320 {
321 #ifdef CONFIG_UART_INTERRUPT_DRIVEN
322 	const struct uart_driver_api *api = (const struct uart_driver_api *)dev->api;
323 
324 	if (api->irq_tx_disable != NULL) {
325 		api->irq_tx_disable(dev);
326 	}
327 #else
328 	ARG_UNUSED(dev);
329 #endif
330 }
331 
uart_irq_tx_ready(const struct device * dev)332 static inline int uart_irq_tx_ready(const struct device *dev)
333 {
334 #ifdef CONFIG_UART_INTERRUPT_DRIVEN
335 	const struct uart_driver_api *api = (const struct uart_driver_api *)dev->api;
336 
337 	if (api->irq_tx_ready == NULL) {
338 		return -ENOSYS;
339 	}
340 
341 	return api->irq_tx_ready(dev);
342 #else
343 	ARG_UNUSED(dev);
344 	return -ENOTSUP;
345 #endif
346 }
347 
z_impl_uart_irq_rx_enable(const struct device * dev)348 static inline void z_impl_uart_irq_rx_enable(const struct device *dev)
349 {
350 #ifdef CONFIG_UART_INTERRUPT_DRIVEN
351 	const struct uart_driver_api *api = (const struct uart_driver_api *)dev->api;
352 
353 	if (api->irq_rx_enable != NULL) {
354 		api->irq_rx_enable(dev);
355 	}
356 #else
357 	ARG_UNUSED(dev);
358 #endif
359 }
360 
z_impl_uart_irq_rx_disable(const struct device * dev)361 static inline void z_impl_uart_irq_rx_disable(const struct device *dev)
362 {
363 #ifdef CONFIG_UART_INTERRUPT_DRIVEN
364 	const struct uart_driver_api *api = (const struct uart_driver_api *)dev->api;
365 
366 	if (api->irq_rx_disable != NULL) {
367 		api->irq_rx_disable(dev);
368 	}
369 #else
370 	ARG_UNUSED(dev);
371 #endif
372 }
373 
uart_irq_tx_complete(const struct device * dev)374 static inline int uart_irq_tx_complete(const struct device *dev)
375 {
376 #ifdef CONFIG_UART_INTERRUPT_DRIVEN
377 	const struct uart_driver_api *api = (const struct uart_driver_api *)dev->api;
378 
379 	if (api->irq_tx_complete == NULL) {
380 		return -ENOSYS;
381 	}
382 	return api->irq_tx_complete(dev);
383 #else
384 	ARG_UNUSED(dev);
385 	return -ENOTSUP;
386 #endif
387 }
388 
uart_irq_rx_ready(const struct device * dev)389 static inline int uart_irq_rx_ready(const struct device *dev)
390 {
391 #ifdef CONFIG_UART_INTERRUPT_DRIVEN
392 	const struct uart_driver_api *api = (const struct uart_driver_api *)dev->api;
393 
394 	if (api->irq_rx_ready == NULL) {
395 		return -ENOSYS;
396 	}
397 	return api->irq_rx_ready(dev);
398 #else
399 	ARG_UNUSED(dev);
400 	return -ENOTSUP;
401 #endif
402 }
403 
z_impl_uart_irq_err_enable(const struct device * dev)404 static inline void z_impl_uart_irq_err_enable(const struct device *dev)
405 {
406 #ifdef CONFIG_UART_INTERRUPT_DRIVEN
407 	const struct uart_driver_api *api = (const struct uart_driver_api *)dev->api;
408 
409 	if (api->irq_err_enable) {
410 		api->irq_err_enable(dev);
411 	}
412 #else
413 	ARG_UNUSED(dev);
414 #endif
415 }
416 
z_impl_uart_irq_err_disable(const struct device * dev)417 static inline void z_impl_uart_irq_err_disable(const struct device *dev)
418 {
419 #ifdef CONFIG_UART_INTERRUPT_DRIVEN
420 	const struct uart_driver_api *api = (const struct uart_driver_api *)dev->api;
421 
422 	if (api->irq_err_disable) {
423 		api->irq_err_disable(dev);
424 	}
425 #else
426 	ARG_UNUSED(dev);
427 #endif
428 }
429 
z_impl_uart_irq_is_pending(const struct device * dev)430 static inline int z_impl_uart_irq_is_pending(const struct device *dev)
431 {
432 #ifdef CONFIG_UART_INTERRUPT_DRIVEN
433 	const struct uart_driver_api *api = (const struct uart_driver_api *)dev->api;
434 
435 	if (api->irq_is_pending == NULL) {
436 		return -ENOSYS;
437 	}
438 	return api->irq_is_pending(dev);
439 #else
440 	ARG_UNUSED(dev);
441 	return -ENOTSUP;
442 #endif
443 }
444 
z_impl_uart_irq_update(const struct device * dev)445 static inline int z_impl_uart_irq_update(const struct device *dev)
446 {
447 #ifdef CONFIG_UART_INTERRUPT_DRIVEN
448 	const struct uart_driver_api *api = (const struct uart_driver_api *)dev->api;
449 
450 	if (api->irq_update == NULL) {
451 		return -ENOSYS;
452 	}
453 	return api->irq_update(dev);
454 #else
455 	ARG_UNUSED(dev);
456 	return -ENOTSUP;
457 #endif
458 }
459 
uart_irq_callback_user_data_set(const struct device * dev,uart_irq_callback_user_data_t cb,void * user_data)460 static inline int uart_irq_callback_user_data_set(const struct device *dev,
461 						  uart_irq_callback_user_data_t cb, void *user_data)
462 {
463 #ifdef CONFIG_UART_INTERRUPT_DRIVEN
464 	const struct uart_driver_api *api = (const struct uart_driver_api *)dev->api;
465 
466 	if ((api != NULL) && (api->irq_callback_set != NULL)) {
467 		api->irq_callback_set(dev, cb, user_data);
468 		return 0;
469 	} else {
470 		return -ENOSYS;
471 	}
472 #else
473 	ARG_UNUSED(dev);
474 	ARG_UNUSED(cb);
475 	ARG_UNUSED(user_data);
476 	return -ENOTSUP;
477 #endif
478 }
479 
uart_irq_callback_set(const struct device * dev,uart_irq_callback_user_data_t cb)480 static inline int uart_irq_callback_set(const struct device *dev, uart_irq_callback_user_data_t cb)
481 {
482 	return uart_irq_callback_user_data_set(dev, cb, NULL);
483 }
484 
uart_callback_set(const struct device * dev,uart_callback_t callback,void * user_data)485 static inline int uart_callback_set(const struct device *dev, uart_callback_t callback,
486 				    void *user_data)
487 {
488 #ifdef CONFIG_UART_ASYNC_API
489 	const struct uart_driver_api *api = (const struct uart_driver_api *)dev->api;
490 
491 	if (api->callback_set == NULL) {
492 		return -ENOSYS;
493 	}
494 
495 	return api->callback_set(dev, callback, user_data);
496 #else
497 	ARG_UNUSED(dev);
498 	ARG_UNUSED(callback);
499 	ARG_UNUSED(user_data);
500 	return -ENOTSUP;
501 #endif
502 }
503 
z_impl_uart_tx(const struct device * dev,const uint8_t * buf,size_t len,int32_t timeout)504 static inline int z_impl_uart_tx(const struct device *dev, const uint8_t *buf, size_t len,
505 				 int32_t timeout)
506 
507 {
508 #ifdef CONFIG_UART_ASYNC_API
509 	const struct uart_driver_api *api = (const struct uart_driver_api *)dev->api;
510 
511 	return api->tx(dev, buf, len, timeout);
512 #else
513 	ARG_UNUSED(dev);
514 	ARG_UNUSED(buf);
515 	ARG_UNUSED(len);
516 	ARG_UNUSED(timeout);
517 	return -ENOTSUP;
518 #endif
519 }
520 
z_impl_uart_tx_u16(const struct device * dev,const uint16_t * buf,size_t len,int32_t timeout)521 static inline int z_impl_uart_tx_u16(const struct device *dev, const uint16_t *buf, size_t len,
522 				     int32_t timeout)
523 
524 {
525 #if defined(CONFIG_UART_ASYNC_API) && defined(CONFIG_UART_WIDE_DATA)
526 	const struct uart_driver_api *api = (const struct uart_driver_api *)dev->api;
527 
528 	return api->tx_u16(dev, buf, len, timeout);
529 #else
530 	ARG_UNUSED(dev);
531 	ARG_UNUSED(buf);
532 	ARG_UNUSED(len);
533 	ARG_UNUSED(timeout);
534 	return -ENOTSUP;
535 #endif
536 }
537 
z_impl_uart_tx_abort(const struct device * dev)538 static inline int z_impl_uart_tx_abort(const struct device *dev)
539 {
540 #ifdef CONFIG_UART_ASYNC_API
541 	const struct uart_driver_api *api = (const struct uart_driver_api *)dev->api;
542 
543 	return api->tx_abort(dev);
544 #else
545 	ARG_UNUSED(dev);
546 	return -ENOTSUP;
547 #endif
548 }
549 
z_impl_uart_rx_enable(const struct device * dev,uint8_t * buf,size_t len,int32_t timeout)550 static inline int z_impl_uart_rx_enable(const struct device *dev, uint8_t *buf, size_t len,
551 					int32_t timeout)
552 {
553 #ifdef CONFIG_UART_ASYNC_API
554 	const struct uart_driver_api *api = (const struct uart_driver_api *)dev->api;
555 
556 	return api->rx_enable(dev, buf, len, timeout);
557 #else
558 	ARG_UNUSED(dev);
559 	ARG_UNUSED(buf);
560 	ARG_UNUSED(len);
561 	ARG_UNUSED(timeout);
562 	return -ENOTSUP;
563 #endif
564 }
565 
z_impl_uart_rx_enable_u16(const struct device * dev,uint16_t * buf,size_t len,int32_t timeout)566 static inline int z_impl_uart_rx_enable_u16(const struct device *dev, uint16_t *buf, size_t len,
567 					    int32_t timeout)
568 {
569 #if defined(CONFIG_UART_ASYNC_API) && defined(CONFIG_UART_WIDE_DATA)
570 	const struct uart_driver_api *api = (const struct uart_driver_api *)dev->api;
571 
572 	return api->rx_enable_u16(dev, buf, len, timeout);
573 #else
574 	ARG_UNUSED(dev);
575 	ARG_UNUSED(buf);
576 	ARG_UNUSED(len);
577 	ARG_UNUSED(timeout);
578 	return -ENOTSUP;
579 #endif
580 }
581 
uart_rx_buf_rsp(const struct device * dev,uint8_t * buf,size_t len)582 static inline int uart_rx_buf_rsp(const struct device *dev, uint8_t *buf, size_t len)
583 {
584 #ifdef CONFIG_UART_ASYNC_API
585 	const struct uart_driver_api *api = (const struct uart_driver_api *)dev->api;
586 
587 	return api->rx_buf_rsp(dev, buf, len);
588 #else
589 	ARG_UNUSED(dev);
590 	ARG_UNUSED(buf);
591 	ARG_UNUSED(len);
592 	return -ENOTSUP;
593 #endif
594 }
595 
uart_rx_buf_rsp_u16(const struct device * dev,uint16_t * buf,size_t len)596 static inline int uart_rx_buf_rsp_u16(const struct device *dev, uint16_t *buf, size_t len)
597 {
598 #if defined(CONFIG_UART_ASYNC_API) && defined(CONFIG_UART_WIDE_DATA)
599 	const struct uart_driver_api *api = (const struct uart_driver_api *)dev->api;
600 
601 	return api->rx_buf_rsp_u16(dev, buf, len);
602 #else
603 	ARG_UNUSED(dev);
604 	ARG_UNUSED(buf);
605 	ARG_UNUSED(len);
606 	return -ENOTSUP;
607 #endif
608 }
609 
z_impl_uart_rx_disable(const struct device * dev)610 static inline int z_impl_uart_rx_disable(const struct device *dev)
611 {
612 #ifdef CONFIG_UART_ASYNC_API
613 	const struct uart_driver_api *api = (const struct uart_driver_api *)dev->api;
614 
615 	return api->rx_disable(dev);
616 #else
617 	ARG_UNUSED(dev);
618 	return -ENOTSUP;
619 #endif
620 }
621 
z_impl_uart_line_ctrl_set(const struct device * dev,uint32_t ctrl,uint32_t val)622 static inline int z_impl_uart_line_ctrl_set(const struct device *dev, uint32_t ctrl, uint32_t val)
623 {
624 #ifdef CONFIG_UART_LINE_CTRL
625 	const struct uart_driver_api *api = (const struct uart_driver_api *)dev->api;
626 
627 	if (api->line_ctrl_set == NULL) {
628 		return -ENOSYS;
629 	}
630 	return api->line_ctrl_set(dev, ctrl, val);
631 #else
632 	ARG_UNUSED(dev);
633 	ARG_UNUSED(ctrl);
634 	ARG_UNUSED(val);
635 	return -ENOTSUP;
636 #endif
637 }
638 
z_impl_uart_line_ctrl_get(const struct device * dev,uint32_t ctrl,uint32_t * val)639 static inline int z_impl_uart_line_ctrl_get(const struct device *dev, uint32_t ctrl, uint32_t *val)
640 {
641 #ifdef CONFIG_UART_LINE_CTRL
642 	const struct uart_driver_api *api = (const struct uart_driver_api *)dev->api;
643 
644 	if (api->line_ctrl_get == NULL) {
645 		return -ENOSYS;
646 	}
647 	return api->line_ctrl_get(dev, ctrl, val);
648 #else
649 	ARG_UNUSED(dev);
650 	ARG_UNUSED(ctrl);
651 	ARG_UNUSED(val);
652 	return -ENOTSUP;
653 #endif
654 }
655 
z_impl_uart_drv_cmd(const struct device * dev,uint32_t cmd,uint32_t p)656 static inline int z_impl_uart_drv_cmd(const struct device *dev, uint32_t cmd, uint32_t p)
657 {
658 #ifdef CONFIG_UART_DRV_CMD
659 	const struct uart_driver_api *api = (const struct uart_driver_api *)dev->api;
660 
661 	if (api->drv_cmd == NULL) {
662 		return -ENOSYS;
663 	}
664 	return api->drv_cmd(dev, cmd, p);
665 #else
666 	ARG_UNUSED(dev);
667 	ARG_UNUSED(cmd);
668 	ARG_UNUSED(p);
669 	return -ENOTSUP;
670 #endif
671 }
672 
673 #ifdef __cplusplus
674 }
675 #endif
676 
677 /** @endcond */
678 
679 #endif /* ZEPHYR_INCLUDE_DRIVERS_UART_UART_INTERNAL_H_ */
680