1 /* ns16550.c - NS16550D serial driver */
2
3 #define DT_DRV_COMPAT ns16550
4
5 /*
6 * Copyright (c) 2010, 2012-2015 Wind River Systems, Inc.
7 * Copyright (c) 2020-2023 Intel Corp.
8 *
9 * SPDX-License-Identifier: Apache-2.0
10 */
11
12 /**
13 * @brief NS16550 Serial Driver
14 *
15 * This is the driver for the Intel NS16550 UART Chip used on the PC 386.
16 * It uses the SCCs in asynchronous mode only.
17 *
18 * Before individual UART port can be used, uart_ns16550_port_init() has to be
19 * called to setup the port.
20 */
21
22 #include <errno.h>
23 #include <zephyr/kernel.h>
24 #include <zephyr/arch/cpu.h>
25 #include <zephyr/types.h>
26
27 #include <zephyr/init.h>
28 #include <zephyr/toolchain.h>
29 #include <zephyr/linker/sections.h>
30 #include <zephyr/drivers/uart.h>
31 #include <zephyr/drivers/clock_control.h>
32 #include <zephyr/pm/policy.h>
33 #include <zephyr/sys/sys_io.h>
34 #include <zephyr/spinlock.h>
35 #include <zephyr/irq.h>
36
37 #if defined(CONFIG_PINCTRL)
38 #include <zephyr/drivers/pinctrl.h>
39 #endif
40
41 #include <zephyr/drivers/serial/uart_ns16550.h>
42 #include <zephyr/logging/log.h>
43
44 LOG_MODULE_REGISTER(uart_ns16550, CONFIG_UART_LOG_LEVEL);
45
46 #define UART_NS16550_PCP_ENABLED DT_ANY_INST_HAS_PROP_STATUS_OKAY(pcp)
47 #define UART_NS16550_DLF_ENABLED DT_ANY_INST_HAS_PROP_STATUS_OKAY(dlf)
48 #define UART_NS16550_DMAS_ENABLED DT_ANY_INST_HAS_PROP_STATUS_OKAY(dmas)
49
50 #if DT_ANY_INST_ON_BUS_STATUS_OKAY(pcie)
51 BUILD_ASSERT(IS_ENABLED(CONFIG_PCIE), "NS16550(s) in DT need CONFIG_PCIE");
52 #include <zephyr/drivers/pcie/pcie.h>
53 #endif
54
55 /* Is UART module 'resets' line property defined */
56 #define UART_NS16550_RESET_ENABLED DT_ANY_INST_HAS_PROP_STATUS_OKAY(resets)
57
58 #if UART_NS16550_RESET_ENABLED
59 #include <zephyr/drivers/reset.h>
60 #endif
61
62 #if defined(CONFIG_UART_ASYNC_API)
63 #include <zephyr/drivers/dma.h>
64 #include <assert.h>
65
66 #if defined(CONFIG_UART_NS16550_INTEL_LPSS_DMA)
67 #include <zephyr/drivers/dma/dma_intel_lpss.h>
68 #endif
69
70 #endif
71
72 /* If any node has property io-mapped set, we need to support IO port
73 * access in the code and device config struct.
74 *
75 * Note that DT_ANY_INST_HAS_PROP_STATUS_OKAY() always returns true
76 * as io-mapped property is considered always exists and present,
77 * even if its value is zero. Therefore we cannot use it, and has to
78 * resort to the follow helper to see if any okay nodes have io-mapped
79 * as 1.
80 */
81 #define UART_NS16550_DT_PROP_IOMAPPED_HELPER(inst, prop, def) \
82 DT_INST_PROP_OR(inst, prop, def) ||
83
84 #define UART_NS16550_IOPORT_ENABLED \
85 (DT_INST_FOREACH_STATUS_OKAY_VARGS(UART_NS16550_DT_PROP_IOMAPPED_HELPER, io_mapped, 0) 0)
86
87 /* register definitions */
88
89 #define REG_THR 0x00 /* Transmitter holding reg. */
90 #define REG_RDR 0x00 /* Receiver data reg. */
91 #define REG_BRDL 0x00 /* Baud rate divisor (LSB) */
92 #define REG_BRDH 0x01 /* Baud rate divisor (MSB) */
93 #define REG_IER 0x01 /* Interrupt enable reg. */
94 #define REG_IIR 0x02 /* Interrupt ID reg. */
95 #define REG_FCR 0x02 /* FIFO control reg. */
96 #define REG_LCR 0x03 /* Line control reg. */
97 #define REG_MDC 0x04 /* Modem control reg. */
98 #define REG_LSR 0x05 /* Line status reg. */
99 #define REG_MSR 0x06 /* Modem status reg. */
100 #define REG_USR 0x7C /* UART status reg. (DW8250) */
101 #define REG_DLF 0xC0 /* Divisor Latch Fraction */
102 #define REG_PCP 0x200 /* PRV_CLOCK_PARAMS (Apollo Lake) */
103 #define REG_MDR1 0x08 /* Mode control reg. (TI_K3) */
104
105 #if defined(CONFIG_UART_NS16550_INTEL_LPSS_DMA)
106 #define REG_LPSS_SRC_TRAN 0xAF8 /* SRC Transfer LPSS DMA */
107 #define REG_LPSS_CLR_SRC_TRAN 0xB48 /* Clear SRC Tran LPSS DMA */
108 #define REG_LPSS_MST 0xB20 /* Mask SRC Transfer LPSS DMA */
109 #endif
110
111 /* equates for interrupt enable register */
112
113 #define IER_RXRDY 0x01 /* receiver data ready */
114 #define IER_TBE 0x02 /* transmit bit enable */
115 #define IER_LSR 0x04 /* line status interrupts */
116 #define IER_MSI 0x08 /* modem status interrupts */
117
118 /* equates for interrupt identification register */
119
120 #define IIR_MSTAT 0x00 /* modem status interrupt */
121 #define IIR_NIP 0x01 /* no interrupt pending */
122 #define IIR_THRE 0x02 /* transmit holding register empty interrupt */
123 #define IIR_RBRF 0x04 /* receiver buffer register full interrupt */
124 #define IIR_LS 0x06 /* receiver line status interrupt */
125 #define IIR_MASK 0x07 /* interrupt id bits mask */
126 #define IIR_ID 0x06 /* interrupt ID mask without NIP */
127 #define IIR_BUSY 0x07 /* DesignWare APB busy detect */
128 #define IIR_FE 0xC0 /* FIFO mode enabled */
129 #define IIR_CH 0x0C /* Character timeout*/
130
131 /* equates for FIFO control register */
132
133 #define FCR_FIFO 0x01 /* enable XMIT and RCVR FIFO */
134 #define FCR_RCVRCLR 0x02 /* clear RCVR FIFO */
135 #define FCR_XMITCLR 0x04 /* clear XMIT FIFO */
136
137 /* equates for Apollo Lake clock control register (PRV_CLOCK_PARAMS) */
138
139 #define PCP_UPDATE 0x80000000 /* update clock */
140 #define PCP_EN 0x00000001 /* enable clock output */
141
142 /* Fields for TI K3 UART module */
143
144 #define MDR1_MODE_SELECT_FIELD_MASK BIT_MASK(3)
145 #define MDR1_MODE_SELECT_FIELD_SHIFT BIT_MASK(0)
146
147 /* Modes available for TI K3 UART module */
148
149 #define MDR1_STD_MODE (0)
150 #define MDR1_SIR_MODE (1)
151 #define MDR1_UART_16X (2)
152 #define MDR1_UART_13X (3)
153 #define MDR1_MIR_MODE (4)
154 #define MDR1_FIR_MODE (5)
155 #define MDR1_CIR_MODE (6)
156 #define MDR1_DISABLE (7)
157
158 /*
159 * Per PC16550D (Literature Number: SNLS378B):
160 *
161 * RXRDY, Mode 0: When in the 16450 Mode (FCR0 = 0) or in
162 * the FIFO Mode (FCR0 = 1, FCR3 = 0) and there is at least 1
163 * character in the RCVR FIFO or RCVR holding register, the
164 * RXRDY pin (29) will be low active. Once it is activated the
165 * RXRDY pin will go inactive when there are no more charac-
166 * ters in the FIFO or holding register.
167 *
168 * RXRDY, Mode 1: In the FIFO Mode (FCR0 = 1) when the
169 * FCR3 = 1 and the trigger level or the timeout has been
170 * reached, the RXRDY pin will go low active. Once it is acti-
171 * vated it will go inactive when there are no more characters
172 * in the FIFO or holding register.
173 *
174 * TXRDY, Mode 0: In the 16450 Mode (FCR0 = 0) or in the
175 * FIFO Mode (FCR0 = 1, FCR3 = 0) and there are no charac-
176 * ters in the XMIT FIFO or XMIT holding register, the TXRDY
177 * pin (24) will be low active. Once it is activated the TXRDY
178 * pin will go inactive after the first character is loaded into the
179 * XMIT FIFO or holding register.
180 *
181 * TXRDY, Mode 1: In the FIFO Mode (FCR0 = 1) when
182 * FCR3 = 1 and there are no characters in the XMIT FIFO, the
183 * TXRDY pin will go low active. This pin will become inactive
184 * when the XMIT FIFO is completely full.
185 */
186 #define FCR_MODE0 0x00 /* set receiver in mode 0 */
187 #define FCR_MODE1 0x08 /* set receiver in mode 1 */
188
189 /* RCVR FIFO interrupt levels: trigger interrupt with this bytes in FIFO */
190 #define FCR_FIFO_1 0x00 /* 1 byte in RCVR FIFO */
191 #define FCR_FIFO_4 0x40 /* 4 bytes in RCVR FIFO */
192 #define FCR_FIFO_8 0x80 /* 8 bytes in RCVR FIFO */
193 #define FCR_FIFO_14 0xC0 /* 14 bytes in RCVR FIFO */
194
195 /*
196 * UART NS16750 supports 64 bytes FIFO, which can be enabled
197 * via the FCR register
198 */
199 #define FCR_FIFO_64 0x20 /* Enable 64 bytes FIFO */
200
201 /* constants for line control register */
202
203 #define LCR_CS5 0x00 /* 5 bits data size */
204 #define LCR_CS6 0x01 /* 6 bits data size */
205 #define LCR_CS7 0x02 /* 7 bits data size */
206 #define LCR_CS8 0x03 /* 8 bits data size */
207 #define LCR_2_STB 0x04 /* 2 stop bits */
208 #define LCR_1_STB 0x00 /* 1 stop bit */
209 #define LCR_PEN 0x08 /* parity enable */
210 #define LCR_PDIS 0x00 /* parity disable */
211 #define LCR_EPS 0x10 /* even parity select */
212 #define LCR_SP 0x20 /* stick parity select */
213 #define LCR_SBRK 0x40 /* break control bit */
214 #define LCR_DLAB 0x80 /* divisor latch access enable */
215
216 /* constants for the modem control register */
217
218 #define MCR_DTR 0x01 /* dtr output */
219 #define MCR_RTS 0x02 /* rts output */
220 #define MCR_OUT1 0x04 /* output #1 */
221 #define MCR_OUT2 0x08 /* output #2 */
222 #define MCR_LOOP 0x10 /* loop back */
223 #define MCR_AFCE 0x20 /* auto flow control enable */
224
225 /* constants for line status register */
226
227 #define LSR_RXRDY 0x01 /* receiver data available */
228 #define LSR_OE 0x02 /* overrun error */
229 #define LSR_PE 0x04 /* parity error */
230 #define LSR_FE 0x08 /* framing error */
231 #define LSR_BI 0x10 /* break interrupt */
232 #define LSR_EOB_MASK 0x1E /* Error or Break mask */
233 #define LSR_THRE 0x20 /* transmit holding register empty */
234 #define LSR_TEMT 0x40 /* transmitter empty */
235
236 /* constants for modem status register */
237
238 #define MSR_DCTS 0x01 /* cts change */
239 #define MSR_DDSR 0x02 /* dsr change */
240 #define MSR_DRI 0x04 /* ring change */
241 #define MSR_DDCD 0x08 /* data carrier change */
242 #define MSR_CTS 0x10 /* complement of cts */
243 #define MSR_DSR 0x20 /* complement of dsr */
244 #define MSR_RI 0x40 /* complement of ring signal */
245 #define MSR_DCD 0x80 /* complement of dcd */
246
247 #define THR(dev) (get_port(dev) + (REG_THR * reg_interval(dev)))
248 #define RDR(dev) (get_port(dev) + (REG_RDR * reg_interval(dev)))
249 #define BRDL(dev) (get_port(dev) + (REG_BRDL * reg_interval(dev)))
250 #define BRDH(dev) (get_port(dev) + (REG_BRDH * reg_interval(dev)))
251 #define IER(dev) (get_port(dev) + (REG_IER * reg_interval(dev)))
252 #define IIR(dev) (get_port(dev) + (REG_IIR * reg_interval(dev)))
253 #define FCR(dev) (get_port(dev) + (REG_FCR * reg_interval(dev)))
254 #define LCR(dev) (get_port(dev) + (REG_LCR * reg_interval(dev)))
255 #define MDC(dev) (get_port(dev) + (REG_MDC * reg_interval(dev)))
256 #define LSR(dev) (get_port(dev) + (REG_LSR * reg_interval(dev)))
257 #define MSR(dev) (get_port(dev) + (REG_MSR * reg_interval(dev)))
258 #define MDR1(dev) (get_port(dev) + (REG_MDR1 * reg_interval(dev)))
259 #define USR(dev) (get_port(dev) + REG_USR)
260 #define DLF(dev) (get_port(dev) + REG_DLF)
261 #define PCP(dev) (get_port(dev) + REG_PCP)
262
263 #if defined(CONFIG_UART_NS16550_INTEL_LPSS_DMA)
264 #define SRC_TRAN(dev) (get_port(dev) + REG_LPSS_SRC_TRAN)
265 #define CLR_SRC_TRAN(dev) (get_port(dev) + REG_LPSS_CLR_SRC_TRAN)
266 #define MST(dev) (get_port(dev) + REG_LPSS_MST)
267
268 #define UNMASK_LPSS_INT(chan) (BIT(chan) | (BIT(8) << chan)) /* unmask LPSS DMA Interrupt */
269 #endif
270
271 #define IIRC(dev) (((struct uart_ns16550_dev_data *)(dev)->data)->iir_cache)
272
273 #ifdef CONFIG_UART_NS16550_ITE_HIGH_SPEED_BAUDRATE
274 /* Register definitions (ITE_IT8XXX2) */
275 #define REG_ECSPMR 0x08 /* EC Serial port mode reg */
276
277 /* Fields for ITE IT8XXX2 UART module */
278 #define ECSPMR_ECHS 0x02 /* EC high speed select */
279
280 /* IT8XXX2 UART high speed baud rate settings */
281 #define UART_BAUDRATE_115200 115200
282 #define UART_BAUDRATE_230400 230400
283 #define UART_BAUDRATE_460800 460800
284 #define IT8XXX2_230400_DIVISOR 32770
285 #define IT8XXX2_460800_DIVISOR 32769
286
287 #define ECSPMR(dev) (get_port(dev) + REG_ECSPMR * reg_interval(dev))
288 #endif
289
290 #if defined(CONFIG_UART_ASYNC_API)
291 struct uart_ns16550_rx_dma_params {
292 const struct device *dma_dev;
293 uint8_t dma_channel;
294 struct dma_config dma_cfg;
295 struct dma_block_config active_dma_block;
296 uint8_t *buf;
297 size_t buf_len;
298 size_t offset;
299 size_t counter;
300 struct k_work_delayable timeout_work;
301 size_t timeout_us;
302 };
303
304 struct uart_ns16550_tx_dma_params {
305 const struct device *dma_dev;
306 uint8_t dma_channel;
307 struct dma_config dma_cfg;
308 struct dma_block_config active_dma_block;
309 const uint8_t *buf;
310 size_t buf_len;
311 struct k_work_delayable timeout_work;
312 size_t timeout_us;
313 };
314
315 struct uart_ns16550_async_data {
316 const struct device *uart_dev;
317 struct uart_ns16550_tx_dma_params tx_dma_params;
318 struct uart_ns16550_rx_dma_params rx_dma_params;
319 uint8_t *next_rx_buffer;
320 size_t next_rx_buffer_len;
321 uart_callback_t user_callback;
322 void *user_data;
323 };
324
325 static void uart_ns16550_async_rx_timeout(struct k_work *work);
326 static void uart_ns16550_async_tx_timeout(struct k_work *work);
327 #endif
328
329 /** Device config structure */
330 struct uart_ns16550_dev_config {
331 union {
332 DEVICE_MMIO_ROM;
333 uint32_t port;
334 };
335 uint32_t sys_clk_freq;
336 const struct device *clock_dev;
337 clock_control_subsys_t clock_subsys;
338 #if defined(CONFIG_UART_INTERRUPT_DRIVEN) || defined(CONFIG_UART_ASYNC_API)
339 uart_irq_config_func_t irq_config_func;
340 #endif
341 #if UART_NS16550_PCP_ENABLED
342 uint32_t pcp;
343 #endif
344 uint8_t reg_interval;
345 #if DT_ANY_INST_ON_BUS_STATUS_OKAY(pcie)
346 struct pcie_dev *pcie;
347 #endif
348 #if defined(CONFIG_PINCTRL)
349 const struct pinctrl_dev_config *pincfg;
350 #endif
351 #if UART_NS16550_IOPORT_ENABLED
352 bool io_map;
353 #endif
354 #if UART_NS16550_RESET_ENABLED
355 struct reset_dt_spec reset_spec;
356 #endif
357 };
358
359 /** Device data structure */
360 struct uart_ns16550_dev_data {
361 DEVICE_MMIO_RAM;
362 struct uart_config uart_config;
363 struct k_spinlock lock;
364 uint8_t fifo_size;
365
366 #ifdef CONFIG_UART_INTERRUPT_DRIVEN
367 uint8_t iir_cache; /**< cache of IIR since it clears when read */
368 uart_irq_callback_user_data_t cb; /**< Callback function pointer */
369 void *cb_data; /**< Callback function arg */
370 #endif
371
372 #if UART_NS16550_DLF_ENABLED
373 uint8_t dlf; /**< DLF value */
374 #endif
375
376 #if defined(CONFIG_UART_INTERRUPT_DRIVEN) && defined(CONFIG_PM)
377 bool tx_stream_on;
378 #endif
379
380 #if defined(CONFIG_UART_ASYNC_API)
381 uint64_t phys_addr;
382 struct uart_ns16550_async_data async;
383 #endif
384 };
385
ns16550_outbyte(const struct uart_ns16550_dev_config * cfg,uintptr_t port,uint8_t val)386 static void ns16550_outbyte(const struct uart_ns16550_dev_config *cfg,
387 uintptr_t port, uint8_t val)
388 {
389 #if UART_NS16550_IOPORT_ENABLED
390 if (cfg->io_map) {
391 if (IS_ENABLED(CONFIG_UART_NS16550_ACCESS_WORD_ONLY)) {
392 sys_out32(val, port);
393 } else {
394 sys_out8(val, port);
395 }
396 } else {
397 #else
398 {
399 #endif
400 /* MMIO mapped */
401 if (IS_ENABLED(CONFIG_UART_NS16550_ACCESS_WORD_ONLY)) {
402 sys_write32(val, port);
403 } else {
404 sys_write8(val, port);
405 }
406 }
407 }
408
409 static uint8_t ns16550_inbyte(const struct uart_ns16550_dev_config *cfg,
410 uintptr_t port)
411 {
412 #if UART_NS16550_IOPORT_ENABLED
413 if (cfg->io_map) {
414 if (IS_ENABLED(CONFIG_UART_NS16550_ACCESS_WORD_ONLY)) {
415 return sys_in32(port);
416 } else {
417 return sys_in8(port);
418 }
419 } else {
420 #else
421 {
422 #endif
423 /* MMIO mapped */
424 if (IS_ENABLED(CONFIG_UART_NS16550_ACCESS_WORD_ONLY)) {
425 return sys_read32(port);
426 } else {
427 return sys_read8(port);
428 }
429 }
430 return 0;
431 }
432
433 __maybe_unused
434 static void ns16550_outword(const struct uart_ns16550_dev_config *cfg,
435 uintptr_t port, uint32_t val)
436 {
437 #if UART_NS16550_IOPORT_ENABLED
438 if (cfg->io_map) {
439 sys_out32(val, port);
440 } else {
441 #else
442 {
443 #endif
444 /* MMIO mapped */
445 sys_write32(val, port);
446 }
447 }
448
449 __maybe_unused
450 static uint32_t ns16550_inword(const struct uart_ns16550_dev_config *cfg,
451 uintptr_t port)
452 {
453 #if UART_NS16550_IOPORT_ENABLED
454 if (cfg->io_map) {
455 return sys_in32(port);
456 }
457 #endif
458 /* MMIO mapped */
459 return sys_read32(port);
460 }
461
462 static inline uint8_t reg_interval(const struct device *dev)
463 {
464 const struct uart_ns16550_dev_config *config = dev->config;
465
466 return config->reg_interval;
467 }
468
469 static inline uintptr_t get_port(const struct device *dev)
470 {
471 uintptr_t port;
472 #if UART_NS16550_IOPORT_ENABLED
473 const struct uart_ns16550_dev_config *config = dev->config;
474
475 if (config->io_map) {
476 port = config->port;
477 } else {
478 #else
479 {
480 #endif
481 port = DEVICE_MMIO_GET(dev);
482 }
483
484 return port;
485 }
486
487 static uint32_t get_uart_baudrate_divisor(const struct device *dev,
488 uint32_t baud_rate,
489 uint32_t pclk)
490 {
491 ARG_UNUSED(dev);
492 /*
493 * calculate baud rate divisor. a variant of
494 * (uint32_t)(pclk / (16.0 * baud_rate) + 0.5)
495 */
496 return ((pclk + (baud_rate << 3)) / baud_rate) >> 4;
497 }
498
499 #ifdef CONFIG_UART_NS16550_ITE_HIGH_SPEED_BAUDRATE
500 static uint32_t get_ite_uart_baudrate_divisor(const struct device *dev,
501 uint32_t baud_rate,
502 uint32_t pclk)
503 {
504 const struct uart_ns16550_dev_config * const dev_cfg = dev->config;
505 uint32_t divisor = 0;
506
507 if (baud_rate > UART_BAUDRATE_115200) {
508 /* Baud rate divisor for high speed */
509 if (baud_rate == UART_BAUDRATE_230400) {
510 divisor = IT8XXX2_230400_DIVISOR;
511 } else if (baud_rate == UART_BAUDRATE_460800) {
512 divisor = IT8XXX2_460800_DIVISOR;
513 }
514 /*
515 * This bit indicates that the supported baud rate of
516 * UART1/UART2 can be up to 230.4k and 460.8k.
517 * Other bits are reserved and have no setting, so we
518 * directly write the ECSPMR register.
519 */
520 ns16550_outbyte(dev_cfg, ECSPMR(dev), ECSPMR_ECHS);
521 } else {
522 divisor = get_uart_baudrate_divisor(dev, baud_rate, pclk);
523 /* Set ECSPMR register as default */
524 ns16550_outbyte(dev_cfg, ECSPMR(dev), 0);
525 }
526
527 return divisor;
528 }
529 #endif
530
531 static inline int ns16550_read_char(const struct device *dev, unsigned char *c)
532 {
533 const struct uart_ns16550_dev_config * const dev_cfg = dev->config;
534
535 if ((ns16550_inbyte(dev_cfg, LSR(dev)) & LSR_RXRDY) != 0) {
536 *c = ns16550_inbyte(dev_cfg, RDR(dev));
537 return 0;
538 }
539
540 return -1;
541 }
542
543 static void set_baud_rate(const struct device *dev, uint32_t baud_rate, uint32_t pclk)
544 {
545 struct uart_ns16550_dev_data * const dev_data = dev->data;
546 const struct uart_ns16550_dev_config * const dev_cfg = dev->config;
547 uint32_t divisor; /* baud rate divisor */
548 uint8_t lcr_cache;
549
550 if ((baud_rate != 0U) && (pclk != 0U)) {
551 #ifdef CONFIG_UART_NS16550_ITE_HIGH_SPEED_BAUDRATE
552 divisor = get_ite_uart_baudrate_divisor(dev, baud_rate, pclk);
553 #else
554 divisor = get_uart_baudrate_divisor(dev, baud_rate, pclk);
555 #endif
556 /* set the DLAB to access the baud rate divisor registers */
557 lcr_cache = ns16550_inbyte(dev_cfg, LCR(dev));
558 ns16550_outbyte(dev_cfg, LCR(dev), LCR_DLAB | lcr_cache);
559 ns16550_outbyte(dev_cfg, BRDL(dev), (unsigned char)(divisor & 0xff));
560 ns16550_outbyte(dev_cfg, BRDH(dev), (unsigned char)((divisor >> 8) & 0xff));
561
562 /* restore the DLAB to access the baud rate divisor registers */
563 ns16550_outbyte(dev_cfg, LCR(dev), lcr_cache);
564
565 dev_data->uart_config.baudrate = baud_rate;
566 }
567 }
568
569 static int uart_ns16550_configure(const struct device *dev,
570 const struct uart_config *cfg)
571 {
572 struct uart_ns16550_dev_data * const dev_data = dev->data;
573 const struct uart_ns16550_dev_config * const dev_cfg = dev->config;
574 uint8_t mdc = 0U, c;
575 uint32_t pclk = 0U;
576 int ret;
577
578 k_spinlock_key_t key = k_spin_lock(&dev_data->lock);
579
580 #if defined(CONFIG_PINCTRL)
581 if (dev_cfg->pincfg != NULL) {
582 pinctrl_apply_state(dev_cfg->pincfg, PINCTRL_STATE_DEFAULT);
583 }
584 #endif
585
586 #ifdef CONFIG_UART_INTERRUPT_DRIVEN
587 dev_data->iir_cache = 0U;
588 #endif
589
590 #if UART_NS16550_DLF_ENABLED
591 ns16550_outbyte(dev_cfg, DLF(dev), dev_data->dlf);
592 #endif
593
594 #if UART_NS16550_PCP_ENABLED
595 uint32_t pcp = dev_cfg->pcp;
596
597 if (pcp) {
598 pcp |= PCP_EN;
599 ns16550_outbyte(dev_cfg, PCP(dev), pcp & ~PCP_UPDATE);
600 ns16550_outbyte(dev_cfg, PCP(dev), pcp | PCP_UPDATE);
601 }
602 #endif
603
604 #ifdef CONFIG_UART_NS16550_TI_K3
605 uint32_t mdr = ns16550_inbyte(dev_cfg, MDR1(dev));
606
607 mdr = ((mdr & ~MDR1_MODE_SELECT_FIELD_MASK) | ((((MDR1_STD_MODE) <<
608 MDR1_MODE_SELECT_FIELD_SHIFT)) & MDR1_MODE_SELECT_FIELD_MASK));
609 ns16550_outbyte(dev_cfg, MDR1(dev), mdr);
610 #endif
611 /*
612 * set clock frequency from clock_frequency property if valid,
613 * otherwise, get clock frequency from clock manager
614 */
615 if (dev_cfg->sys_clk_freq != 0U) {
616 pclk = dev_cfg->sys_clk_freq;
617 } else {
618 if (!device_is_ready(dev_cfg->clock_dev)) {
619 ret = -EINVAL;
620 goto out;
621 }
622
623 ret = clock_control_on(dev_cfg->clock_dev, dev_cfg->clock_subsys);
624 if (ret != 0 && ret != -EALREADY && ret != -ENOSYS) {
625 goto out;
626 }
627
628 if (clock_control_get_rate(dev_cfg->clock_dev,
629 dev_cfg->clock_subsys,
630 &pclk) != 0) {
631 ret = -EINVAL;
632 goto out;
633 }
634 }
635
636 set_baud_rate(dev, cfg->baudrate, pclk);
637
638 /* Local structure to hold temporary values to pass to ns16550_outbyte() */
639 struct uart_config uart_cfg;
640
641 switch (cfg->data_bits) {
642 case UART_CFG_DATA_BITS_5:
643 uart_cfg.data_bits = LCR_CS5;
644 break;
645 case UART_CFG_DATA_BITS_6:
646 uart_cfg.data_bits = LCR_CS6;
647 break;
648 case UART_CFG_DATA_BITS_7:
649 uart_cfg.data_bits = LCR_CS7;
650 break;
651 case UART_CFG_DATA_BITS_8:
652 uart_cfg.data_bits = LCR_CS8;
653 break;
654 default:
655 ret = -ENOTSUP;
656 goto out;
657 }
658
659 switch (cfg->stop_bits) {
660 case UART_CFG_STOP_BITS_1:
661 uart_cfg.stop_bits = LCR_1_STB;
662 break;
663 case UART_CFG_STOP_BITS_2:
664 uart_cfg.stop_bits = LCR_2_STB;
665 break;
666 default:
667 ret = -ENOTSUP;
668 goto out;
669 }
670
671 switch (cfg->parity) {
672 case UART_CFG_PARITY_NONE:
673 uart_cfg.parity = LCR_PDIS;
674 break;
675 case UART_CFG_PARITY_EVEN:
676 uart_cfg.parity = LCR_EPS;
677 break;
678 default:
679 ret = -ENOTSUP;
680 goto out;
681 }
682
683 dev_data->uart_config = *cfg;
684
685 /* data bits, stop bits, parity, clear DLAB */
686 ns16550_outbyte(dev_cfg, LCR(dev),
687 uart_cfg.data_bits | uart_cfg.stop_bits | uart_cfg.parity);
688
689 mdc = MCR_OUT2 | MCR_RTS | MCR_DTR;
690 #if defined(CONFIG_UART_NS16550_VARIANT_NS16750) || \
691 defined(CONFIG_UART_NS16550_VARIANT_NS16950)
692 if (cfg->flow_ctrl == UART_CFG_FLOW_CTRL_RTS_CTS) {
693 mdc |= MCR_AFCE;
694 }
695 #endif
696
697 ns16550_outbyte(dev_cfg, MDC(dev), mdc);
698
699 /*
700 * Program FIFO: enabled, mode 0 (set for compatibility with quark),
701 * generate the interrupt at 8th byte
702 * Clear TX and RX FIFO
703 */
704 ns16550_outbyte(dev_cfg, FCR(dev),
705 FCR_FIFO | FCR_MODE0 | FCR_FIFO_8 | FCR_RCVRCLR | FCR_XMITCLR
706 #ifdef CONFIG_UART_NS16550_VARIANT_NS16750
707 | FCR_FIFO_64
708 #endif
709 );
710
711 if ((ns16550_inbyte(dev_cfg, IIR(dev)) & IIR_FE) == IIR_FE) {
712 #ifdef CONFIG_UART_NS16550_VARIANT_NS16750
713 dev_data->fifo_size = 64;
714 #elif defined(CONFIG_UART_NS16550_VARIANT_NS16950)
715 dev_data->fifo_size = 128;
716 #else
717 dev_data->fifo_size = 16;
718 #endif
719 } else {
720 dev_data->fifo_size = 1;
721 }
722
723 /* clear the port */
724 (void)ns16550_read_char(dev, &c);
725
726 /* disable interrupts */
727 ns16550_outbyte(dev_cfg, IER(dev), 0x00);
728 ret = 0;
729
730 out:
731 k_spin_unlock(&dev_data->lock, key);
732 return ret;
733 };
734
735 #ifdef CONFIG_UART_USE_RUNTIME_CONFIGURE
736 static int uart_ns16550_config_get(const struct device *dev,
737 struct uart_config *cfg)
738 {
739 struct uart_ns16550_dev_data *data = dev->data;
740
741 cfg->baudrate = data->uart_config.baudrate;
742 cfg->parity = data->uart_config.parity;
743 cfg->stop_bits = data->uart_config.stop_bits;
744 cfg->data_bits = data->uart_config.data_bits;
745 cfg->flow_ctrl = data->uart_config.flow_ctrl;
746
747 return 0;
748 }
749 #endif /* CONFIG_UART_USE_RUNTIME_CONFIGURE */
750
751 #if UART_NS16550_RESET_ENABLED
752 /**
753 * @brief Toggle the reset UART line
754 *
755 * This routine is called to bring UART IP out of reset state.
756 *
757 * @param reset_spec Reset controller device configuration struct
758 *
759 * @return 0 if successful, failed otherwise
760 */
761 static int uart_reset_config(const struct reset_dt_spec *reset_spec)
762 {
763 int ret;
764
765 if (!device_is_ready(reset_spec->dev)) {
766 LOG_ERR("Reset controller device is not ready");
767 return -ENODEV;
768 }
769
770 ret = reset_line_toggle(reset_spec->dev, reset_spec->id);
771 if (ret != 0) {
772 LOG_ERR("UART toggle reset line failed");
773 return ret;
774 }
775
776 return 0;
777 }
778 #endif /* UART_NS16550_RESET_ENABLED */
779
780 #if (IS_ENABLED(CONFIG_UART_ASYNC_API))
781 static inline void async_timer_start(struct k_work_delayable *work, size_t timeout_us)
782 {
783 if ((timeout_us != SYS_FOREVER_US) && (timeout_us != 0)) {
784 k_work_reschedule(work, K_USEC(timeout_us));
785 }
786 }
787
788 #endif
789
790 /**
791 * @brief Initialize individual UART port
792 *
793 * This routine is called to reset the chip in a quiescent state.
794 *
795 * @param dev UART device struct
796 *
797 * @return 0 if successful, failed otherwise
798 */
799 static int uart_ns16550_init(const struct device *dev)
800 {
801 struct uart_ns16550_dev_data *data = dev->data;
802 const struct uart_ns16550_dev_config *dev_cfg = dev->config;
803 int ret;
804
805 ARG_UNUSED(dev_cfg);
806
807 #if UART_NS16550_RESET_ENABLED
808 /* Assert the UART reset line if it is defined. */
809 if (dev_cfg->reset_spec.dev != NULL) {
810 ret = uart_reset_config(&(dev_cfg->reset_spec));
811 if (ret != 0) {
812 return ret;
813 }
814 }
815 #endif
816
817 #if DT_ANY_INST_ON_BUS_STATUS_OKAY(pcie)
818 if (dev_cfg->pcie) {
819 struct pcie_bar mbar;
820
821 if (dev_cfg->pcie->bdf == PCIE_BDF_NONE) {
822 return -EINVAL;
823 }
824
825 pcie_probe_mbar(dev_cfg->pcie->bdf, 0, &mbar);
826 pcie_set_cmd(dev_cfg->pcie->bdf, PCIE_CONF_CMDSTAT_MEM, true);
827
828 device_map(DEVICE_MMIO_RAM_PTR(dev), mbar.phys_addr, mbar.size,
829 K_MEM_CACHE_NONE);
830 #if defined(CONFIG_UART_ASYNC_API)
831 if (data->async.tx_dma_params.dma_dev != NULL) {
832 pcie_set_cmd(dev_cfg->pcie->bdf, PCIE_CONF_CMDSTAT_MASTER, true);
833 data->phys_addr = mbar.phys_addr;
834 }
835 #endif
836 } else
837 #endif /* DT_ANY_INST_ON_BUS_STATUS_OKAY(pcie) */
838 {
839 #if UART_NS16550_IOPORT_ENABLED
840 /* Map directly from DTS */
841 if (!dev_cfg->io_map) {
842 #else
843 {
844 #endif
845 DEVICE_MMIO_MAP(dev, K_MEM_CACHE_NONE);
846 }
847 }
848 #if defined(CONFIG_UART_ASYNC_API)
849 if (data->async.tx_dma_params.dma_dev != NULL) {
850 data->async.next_rx_buffer = NULL;
851 data->async.next_rx_buffer_len = 0;
852 data->async.uart_dev = dev;
853 k_work_init_delayable(&data->async.rx_dma_params.timeout_work,
854 uart_ns16550_async_rx_timeout);
855 k_work_init_delayable(&data->async.tx_dma_params.timeout_work,
856 uart_ns16550_async_tx_timeout);
857 data->async.rx_dma_params.dma_cfg.head_block =
858 &data->async.rx_dma_params.active_dma_block;
859 data->async.tx_dma_params.dma_cfg.head_block =
860 &data->async.tx_dma_params.active_dma_block;
861 #if defined(CONFIG_UART_NS16550_INTEL_LPSS_DMA)
862 #if UART_NS16550_IOPORT_ENABLED
863 if (!dev_cfg->io_map)
864 #endif
865 {
866 uintptr_t base;
867
868 base = DEVICE_MMIO_GET(dev) + DMA_INTEL_LPSS_OFFSET;
869 dma_intel_lpss_set_base(data->async.tx_dma_params.dma_dev, base);
870 dma_intel_lpss_setup(data->async.tx_dma_params.dma_dev);
871 sys_write32((uint32_t)data->phys_addr,
872 DEVICE_MMIO_GET(dev) + DMA_INTEL_LPSS_REMAP_LOW);
873 sys_write32((uint32_t)(data->phys_addr >> DMA_INTEL_LPSS_ADDR_RIGHT_SHIFT),
874 DEVICE_MMIO_GET(dev) + DMA_INTEL_LPSS_REMAP_HI);
875 }
876 #endif
877 }
878 #endif
879 ret = uart_ns16550_configure(dev, &data->uart_config);
880 if (ret != 0) {
881 return ret;
882 }
883
884 #ifdef CONFIG_UART_INTERRUPT_DRIVEN
885 dev_cfg->irq_config_func(dev);
886 #endif
887
888 return 0;
889 }
890
891 /**
892 * @brief Poll the device for input.
893 *
894 * @param dev UART device struct
895 * @param c Pointer to character
896 *
897 * @return 0 if a character arrived, -1 if the input buffer if empty.
898 */
899 static int uart_ns16550_poll_in(const struct device *dev, unsigned char *c)
900 {
901 struct uart_ns16550_dev_data *data = dev->data;
902 int ret = -1;
903 k_spinlock_key_t key = k_spin_lock(&data->lock);
904
905 ret = ns16550_read_char(dev, c);
906
907 k_spin_unlock(&data->lock, key);
908
909 return ret;
910 }
911
912 /**
913 * @brief Output a character in polled mode.
914 *
915 * Checks if the transmitter is empty. If empty, a character is written to
916 * the data register.
917 *
918 * If the hardware flow control is enabled then the handshake signal CTS has to
919 * be asserted in order to send a character.
920 *
921 * @param dev UART device struct
922 * @param c Character to send
923 */
924 static void uart_ns16550_poll_out(const struct device *dev,
925 unsigned char c)
926 {
927 struct uart_ns16550_dev_data *data = dev->data;
928 const struct uart_ns16550_dev_config * const dev_cfg = dev->config;
929 k_spinlock_key_t key = k_spin_lock(&data->lock);
930
931 while ((ns16550_inbyte(dev_cfg, LSR(dev)) & LSR_THRE) == 0) {
932 }
933
934 ns16550_outbyte(dev_cfg, THR(dev), c);
935
936 k_spin_unlock(&data->lock, key);
937 }
938
939 /**
940 * @brief Check if an error was received
941 *
942 * @param dev UART device struct
943 *
944 * @return one of UART_ERROR_OVERRUN, UART_ERROR_PARITY, UART_ERROR_FRAMING,
945 * UART_BREAK if an error was detected, 0 otherwise.
946 */
947 static int uart_ns16550_err_check(const struct device *dev)
948 {
949 struct uart_ns16550_dev_data *data = dev->data;
950 const struct uart_ns16550_dev_config * const dev_cfg = dev->config;
951 k_spinlock_key_t key = k_spin_lock(&data->lock);
952 int check = (ns16550_inbyte(dev_cfg, LSR(dev)) & LSR_EOB_MASK);
953
954 k_spin_unlock(&data->lock, key);
955
956 return check >> 1;
957 }
958
959 #if CONFIG_UART_INTERRUPT_DRIVEN
960
961 /**
962 * @brief Fill FIFO with data
963 *
964 * @param dev UART device struct
965 * @param tx_data Data to transmit
966 * @param size Number of bytes to send
967 *
968 * @return Number of bytes sent
969 */
970 static int uart_ns16550_fifo_fill(const struct device *dev,
971 const uint8_t *tx_data,
972 int size)
973 {
974 struct uart_ns16550_dev_data *data = dev->data;
975 const struct uart_ns16550_dev_config * const dev_cfg = dev->config;
976 int i;
977 k_spinlock_key_t key = k_spin_lock(&data->lock);
978
979 for (i = 0; (i < size) && (i < data->fifo_size); i++) {
980 ns16550_outbyte(dev_cfg, THR(dev), tx_data[i]);
981 }
982
983 k_spin_unlock(&data->lock, key);
984
985 return i;
986 }
987
988 /**
989 * @brief Read data from FIFO
990 *
991 * @param dev UART device struct
992 * @param rxData Data container
993 * @param size Container size
994 *
995 * @return Number of bytes read
996 */
997 static int uart_ns16550_fifo_read(const struct device *dev, uint8_t *rx_data,
998 const int size)
999 {
1000 struct uart_ns16550_dev_data *data = dev->data;
1001 int i;
1002 k_spinlock_key_t key = k_spin_lock(&data->lock);
1003
1004 for (i = 0; (i < size) && (ns16550_read_char(dev, &rx_data[i]) != -1); i++) {
1005 }
1006
1007 k_spin_unlock(&data->lock, key);
1008
1009 return i;
1010 }
1011
1012 /**
1013 * @brief Enable TX interrupt in IER
1014 *
1015 * @param dev UART device struct
1016 */
1017 static void uart_ns16550_irq_tx_enable(const struct device *dev)
1018 {
1019 struct uart_ns16550_dev_data *data = dev->data;
1020 const struct uart_ns16550_dev_config * const dev_cfg = dev->config;
1021 k_spinlock_key_t key = k_spin_lock(&data->lock);
1022
1023 #if defined(CONFIG_UART_INTERRUPT_DRIVEN) && defined(CONFIG_PM)
1024 struct uart_ns16550_dev_data *const dev_data = dev->data;
1025
1026 if (!dev_data->tx_stream_on) {
1027 dev_data->tx_stream_on = true;
1028 uint8_t num_cpu_states;
1029 const struct pm_state_info *cpu_states;
1030
1031 num_cpu_states = pm_state_cpu_get_all(0U, &cpu_states);
1032
1033 /*
1034 * Power state to be disabled. Some platforms have multiple
1035 * states and need to be given a constraint set according to
1036 * different states.
1037 */
1038 for (uint8_t i = 0U; i < num_cpu_states; i++) {
1039 pm_policy_state_lock_get(cpu_states[i].state, PM_ALL_SUBSTATES);
1040 }
1041 }
1042 #endif
1043 ns16550_outbyte(dev_cfg, IER(dev), ns16550_inbyte(dev_cfg, IER(dev)) | IER_TBE);
1044
1045 k_spin_unlock(&data->lock, key);
1046 }
1047
1048 /**
1049 * @brief Disable TX interrupt in IER
1050 *
1051 * @param dev UART device struct
1052 */
1053 static void uart_ns16550_irq_tx_disable(const struct device *dev)
1054 {
1055 struct uart_ns16550_dev_data *data = dev->data;
1056 const struct uart_ns16550_dev_config * const dev_cfg = dev->config;
1057 k_spinlock_key_t key = k_spin_lock(&data->lock);
1058
1059 ns16550_outbyte(dev_cfg, IER(dev),
1060 ns16550_inbyte(dev_cfg, IER(dev)) & (~IER_TBE));
1061
1062 #if defined(CONFIG_UART_INTERRUPT_DRIVEN) && defined(CONFIG_PM)
1063 struct uart_ns16550_dev_data *const dev_data = dev->data;
1064
1065 if (dev_data->tx_stream_on) {
1066 dev_data->tx_stream_on = false;
1067 uint8_t num_cpu_states;
1068 const struct pm_state_info *cpu_states;
1069
1070 num_cpu_states = pm_state_cpu_get_all(0U, &cpu_states);
1071
1072 /*
1073 * Power state to be enabled. Some platforms have multiple
1074 * states and need to be given a constraint release according
1075 * to different states.
1076 */
1077 for (uint8_t i = 0U; i < num_cpu_states; i++) {
1078 pm_policy_state_lock_put(cpu_states[i].state, PM_ALL_SUBSTATES);
1079 }
1080 }
1081 #endif
1082 k_spin_unlock(&data->lock, key);
1083 }
1084
1085 /**
1086 * @brief Check if Tx IRQ has been raised
1087 *
1088 * @param dev UART device struct
1089 *
1090 * @return 1 if an IRQ is ready, 0 otherwise
1091 */
1092 static int uart_ns16550_irq_tx_ready(const struct device *dev)
1093 {
1094 struct uart_ns16550_dev_data *data = dev->data;
1095 k_spinlock_key_t key = k_spin_lock(&data->lock);
1096
1097 int ret = ((IIRC(dev) & IIR_ID) == IIR_THRE) ? 1 : 0;
1098
1099 k_spin_unlock(&data->lock, key);
1100
1101 return ret;
1102 }
1103
1104 /**
1105 * @brief Check if nothing remains to be transmitted
1106 *
1107 * @param dev UART device struct
1108 *
1109 * @return 1 if nothing remains to be transmitted, 0 otherwise
1110 */
1111 static int uart_ns16550_irq_tx_complete(const struct device *dev)
1112 {
1113 struct uart_ns16550_dev_data *data = dev->data;
1114 const struct uart_ns16550_dev_config * const dev_cfg = dev->config;
1115 k_spinlock_key_t key = k_spin_lock(&data->lock);
1116
1117 int ret = ((ns16550_inbyte(dev_cfg, LSR(dev)) & (LSR_TEMT | LSR_THRE))
1118 == (LSR_TEMT | LSR_THRE)) ? 1 : 0;
1119
1120 k_spin_unlock(&data->lock, key);
1121
1122 return ret;
1123 }
1124
1125 /**
1126 * @brief Enable RX interrupt in IER
1127 *
1128 * @param dev UART device struct
1129 */
1130 static void uart_ns16550_irq_rx_enable(const struct device *dev)
1131 {
1132 struct uart_ns16550_dev_data *data = dev->data;
1133 const struct uart_ns16550_dev_config * const dev_cfg = dev->config;
1134 k_spinlock_key_t key = k_spin_lock(&data->lock);
1135
1136 ns16550_outbyte(dev_cfg, IER(dev), ns16550_inbyte(dev_cfg, IER(dev)) | IER_RXRDY);
1137
1138 k_spin_unlock(&data->lock, key);
1139 }
1140
1141 /**
1142 * @brief Disable RX interrupt in IER
1143 *
1144 * @param dev UART device struct
1145 */
1146 static void uart_ns16550_irq_rx_disable(const struct device *dev)
1147 {
1148 struct uart_ns16550_dev_data *data = dev->data;
1149 const struct uart_ns16550_dev_config * const dev_cfg = dev->config;
1150 k_spinlock_key_t key = k_spin_lock(&data->lock);
1151
1152 ns16550_outbyte(dev_cfg, IER(dev),
1153 ns16550_inbyte(dev_cfg, IER(dev)) & (~IER_RXRDY));
1154
1155 k_spin_unlock(&data->lock, key);
1156 }
1157
1158 /**
1159 * @brief Check if Rx IRQ has been raised
1160 *
1161 * @param dev UART device struct
1162 *
1163 * @return 1 if an IRQ is ready, 0 otherwise
1164 */
1165 static int uart_ns16550_irq_rx_ready(const struct device *dev)
1166 {
1167 struct uart_ns16550_dev_data *data = dev->data;
1168 k_spinlock_key_t key = k_spin_lock(&data->lock);
1169
1170 int ret = ((IIRC(dev) & IIR_ID) == IIR_RBRF) ? 1 : 0;
1171
1172 k_spin_unlock(&data->lock, key);
1173
1174 return ret;
1175 }
1176
1177 /**
1178 * @brief Enable error interrupt in IER
1179 *
1180 * @param dev UART device struct
1181 */
1182 static void uart_ns16550_irq_err_enable(const struct device *dev)
1183 {
1184 struct uart_ns16550_dev_data *data = dev->data;
1185 const struct uart_ns16550_dev_config * const dev_cfg = dev->config;
1186 k_spinlock_key_t key = k_spin_lock(&data->lock);
1187
1188 ns16550_outbyte(dev_cfg, IER(dev),
1189 ns16550_inbyte(dev_cfg, IER(dev)) | IER_LSR);
1190
1191 k_spin_unlock(&data->lock, key);
1192 }
1193
1194 /**
1195 * @brief Disable error interrupt in IER
1196 *
1197 * @param dev UART device struct
1198 *
1199 * @return 1 if an IRQ is ready, 0 otherwise
1200 */
1201 static void uart_ns16550_irq_err_disable(const struct device *dev)
1202 {
1203 struct uart_ns16550_dev_data *data = dev->data;
1204 const struct uart_ns16550_dev_config * const dev_cfg = dev->config;
1205 k_spinlock_key_t key = k_spin_lock(&data->lock);
1206
1207 ns16550_outbyte(dev_cfg, IER(dev),
1208 ns16550_inbyte(dev_cfg, IER(dev)) & (~IER_LSR));
1209
1210 k_spin_unlock(&data->lock, key);
1211 }
1212
1213 /**
1214 * @brief Check if any IRQ is pending
1215 *
1216 * @param dev UART device struct
1217 *
1218 * @return 1 if an IRQ is pending, 0 otherwise
1219 */
1220 static int uart_ns16550_irq_is_pending(const struct device *dev)
1221 {
1222 struct uart_ns16550_dev_data *data = dev->data;
1223 k_spinlock_key_t key = k_spin_lock(&data->lock);
1224
1225 int ret = (!(IIRC(dev) & IIR_NIP)) ? 1 : 0;
1226
1227 k_spin_unlock(&data->lock, key);
1228
1229 return ret;
1230 }
1231
1232 /**
1233 * @brief Update cached contents of IIR
1234 *
1235 * @param dev UART device struct
1236 *
1237 * @return Always 1
1238 */
1239 static int uart_ns16550_irq_update(const struct device *dev)
1240 {
1241 struct uart_ns16550_dev_data *data = dev->data;
1242 const struct uart_ns16550_dev_config * const dev_cfg = dev->config;
1243 k_spinlock_key_t key = k_spin_lock(&data->lock);
1244
1245 IIRC(dev) = ns16550_inbyte(dev_cfg, IIR(dev));
1246
1247 k_spin_unlock(&data->lock, key);
1248
1249 return 1;
1250 }
1251
1252 /**
1253 * @brief Set the callback function pointer for IRQ.
1254 *
1255 * @param dev UART device struct
1256 * @param cb Callback function pointer.
1257 */
1258 static void uart_ns16550_irq_callback_set(const struct device *dev,
1259 uart_irq_callback_user_data_t cb,
1260 void *cb_data)
1261 {
1262 struct uart_ns16550_dev_data * const dev_data = dev->data;
1263 k_spinlock_key_t key = k_spin_lock(&dev_data->lock);
1264
1265 dev_data->cb = cb;
1266 dev_data->cb_data = cb_data;
1267
1268 k_spin_unlock(&dev_data->lock, key);
1269 }
1270
1271 /**
1272 * @brief Interrupt service routine.
1273 *
1274 * This simply calls the callback function, if one exists.
1275 *
1276 * @param arg Argument to ISR.
1277 */
1278 static void uart_ns16550_isr(const struct device *dev)
1279 {
1280 struct uart_ns16550_dev_data * const dev_data = dev->data;
1281 const struct uart_ns16550_dev_config * const dev_cfg = dev->config;
1282
1283 if (dev_data->cb) {
1284 dev_data->cb(dev, dev_data->cb_data);
1285 } else if ((IS_ENABLED(CONFIG_UART_NS16550_DW8250_DW_APB)) &&
1286 ((ns16550_inbyte(dev_cfg, IIR(dev)) & IIR_MASK) == IIR_BUSY)) {
1287 /*
1288 * The Synopsys DesignWare 8250 has an extra feature whereby
1289 * it detects if the LCR is written whilst busy.
1290 * If it is, then a busy detect interrupt is raised,
1291 * the uart status register need to be read.
1292 */
1293 ns16550_inword(dev_cfg, USR(dev));
1294 }
1295
1296 #if (IS_ENABLED(CONFIG_UART_ASYNC_API))
1297 if (dev_data->async.tx_dma_params.dma_dev != NULL) {
1298 const struct uart_ns16550_dev_config * const config = dev->config;
1299 uint8_t IIR_status = ns16550_inbyte(config, IIR(dev));
1300 #if (IS_ENABLED(CONFIG_UART_NS16550_INTEL_LPSS_DMA))
1301 uint32_t dma_status = ns16550_inword(config, SRC_TRAN(dev));
1302
1303 if (dma_status & BIT(dev_data->async.rx_dma_params.dma_channel)) {
1304 async_timer_start(&dev_data->async.rx_dma_params.timeout_work,
1305 dev_data->async.rx_dma_params.timeout_us);
1306 ns16550_outword(config, CLR_SRC_TRAN(dev),
1307 BIT(dev_data->async.rx_dma_params.dma_channel));
1308 return;
1309 }
1310 dma_intel_lpss_isr(dev_data->async.rx_dma_params.dma_dev);
1311 #endif
1312 if (IIR_status & IIR_RBRF) {
1313 async_timer_start(&dev_data->async.rx_dma_params.timeout_work,
1314 dev_data->async.rx_dma_params.timeout_us);
1315 return;
1316 }
1317 }
1318 #endif
1319
1320 #ifdef CONFIG_UART_NS16550_WA_ISR_REENABLE_INTERRUPT
1321 uint8_t cached_ier = ns16550_inbyte(dev_cfg, IER(dev));
1322
1323 ns16550_outbyte(dev_cfg, IER(dev), 0U);
1324 ns16550_outbyte(dev_cfg, IER(dev), cached_ier);
1325 #endif
1326 }
1327
1328 #endif /* CONFIG_UART_INTERRUPT_DRIVEN */
1329
1330 #ifdef CONFIG_UART_NS16550_LINE_CTRL
1331
1332 /**
1333 * @brief Manipulate line control for UART.
1334 *
1335 * @param dev UART device struct
1336 * @param ctrl The line control to be manipulated
1337 * @param val Value to set the line control
1338 *
1339 * @return 0 if successful, failed otherwise
1340 */
1341 static int uart_ns16550_line_ctrl_set(const struct device *dev,
1342 uint32_t ctrl, uint32_t val)
1343 {
1344 struct uart_ns16550_dev_data *data = dev->data;
1345 const struct uart_ns16550_dev_config *const dev_cfg = dev->config;
1346 uint32_t mdc, chg, pclk = 0U;
1347 k_spinlock_key_t key;
1348
1349 if (dev_cfg->sys_clk_freq != 0U) {
1350 pclk = dev_cfg->sys_clk_freq;
1351 } else {
1352 if (device_is_ready(dev_cfg->clock_dev)) {
1353 clock_control_get_rate(dev_cfg->clock_dev, dev_cfg->clock_subsys, &pclk);
1354 }
1355 }
1356
1357 switch (ctrl) {
1358 case UART_LINE_CTRL_BAUD_RATE:
1359 set_baud_rate(dev, val, pclk);
1360 return 0;
1361
1362 case UART_LINE_CTRL_RTS:
1363 case UART_LINE_CTRL_DTR:
1364 key = k_spin_lock(&data->lock);
1365 mdc = ns16550_inbyte(dev_cfg, MDC(dev));
1366
1367 if (ctrl == UART_LINE_CTRL_RTS) {
1368 chg = MCR_RTS;
1369 } else {
1370 chg = MCR_DTR;
1371 }
1372
1373 if (val) {
1374 mdc |= chg;
1375 } else {
1376 mdc &= ~(chg);
1377 }
1378 ns16550_outbyte(dev_cfg, MDC(dev), mdc);
1379 k_spin_unlock(&data->lock, key);
1380 return 0;
1381 }
1382
1383 return -ENOTSUP;
1384 }
1385
1386 #endif /* CONFIG_UART_NS16550_LINE_CTRL */
1387
1388 #ifdef CONFIG_UART_NS16550_DRV_CMD
1389
1390 /**
1391 * @brief Send extra command to driver
1392 *
1393 * @param dev UART device struct
1394 * @param cmd Command to driver
1395 * @param p Parameter to the command
1396 *
1397 * @return 0 if successful, failed otherwise
1398 */
1399 static int uart_ns16550_drv_cmd(const struct device *dev, uint32_t cmd,
1400 uint32_t p)
1401 {
1402 #if UART_NS16550_DLF_ENABLED
1403 if (cmd == CMD_SET_DLF) {
1404 struct uart_ns16550_dev_data * const dev_data = dev->data;
1405 const struct uart_ns16550_dev_config * const dev_cfg = dev->config;
1406 k_spinlock_key_t key = k_spin_lock(&dev_data->lock);
1407
1408 dev_data->dlf = p;
1409 ns16550_outbyte(dev_cfg, DLF(dev), dev_data->dlf);
1410 k_spin_unlock(&dev_data->lock, key);
1411 return 0;
1412 }
1413 #endif
1414
1415 return -ENOTSUP;
1416 }
1417
1418 #endif /* CONFIG_UART_NS16550_DRV_CMD */
1419
1420 #if (IS_ENABLED(CONFIG_UART_ASYNC_API))
1421 static void async_user_callback(const struct device *dev, struct uart_event *evt)
1422 {
1423 const struct uart_ns16550_dev_data *data = dev->data;
1424
1425 if (data->async.user_callback) {
1426 data->async.user_callback(dev, evt, data->async.user_data);
1427 }
1428 }
1429
1430 #if UART_NS16550_DMAS_ENABLED
1431 static void async_evt_tx_done(struct device *dev)
1432 {
1433 struct uart_ns16550_dev_data *data = dev->data;
1434 struct uart_ns16550_tx_dma_params *tx_params = &data->async.tx_dma_params;
1435
1436 (void)k_work_cancel_delayable(&data->async.tx_dma_params.timeout_work);
1437
1438 struct uart_event event = {
1439 .type = UART_TX_DONE,
1440 .data.tx.buf = tx_params->buf,
1441 .data.tx.len = tx_params->buf_len
1442 };
1443
1444 tx_params->buf = NULL;
1445 tx_params->buf_len = 0U;
1446
1447 async_user_callback(dev, &event);
1448 }
1449 #endif
1450
1451 static void async_evt_rx_rdy(const struct device *dev)
1452 {
1453 struct uart_ns16550_dev_data *data = dev->data;
1454 struct uart_ns16550_rx_dma_params *dma_params = &data->async.rx_dma_params;
1455
1456 struct uart_event event = {
1457 .type = UART_RX_RDY,
1458 .data.rx.buf = dma_params->buf,
1459 .data.rx.len = dma_params->counter - dma_params->offset,
1460 .data.rx.offset = dma_params->offset
1461 };
1462
1463 dma_params->offset = dma_params->counter;
1464
1465 if (event.data.rx.len > 0) {
1466 async_user_callback(dev, &event);
1467 }
1468 }
1469
1470 static void async_evt_rx_buf_release(const struct device *dev)
1471 {
1472 struct uart_ns16550_dev_data *data = (struct uart_ns16550_dev_data *)dev->data;
1473 struct uart_event evt = {
1474 .type = UART_RX_BUF_RELEASED,
1475 .data.rx_buf.buf = data->async.rx_dma_params.buf
1476 };
1477
1478 async_user_callback(dev, &evt);
1479 data->async.rx_dma_params.buf = NULL;
1480 data->async.rx_dma_params.buf_len = 0U;
1481 data->async.rx_dma_params.offset = 0U;
1482 data->async.rx_dma_params.counter = 0U;
1483 }
1484
1485 static void async_evt_rx_buf_request(const struct device *dev)
1486 {
1487 struct uart_event evt = {
1488 .type = UART_RX_BUF_REQUEST
1489 };
1490 async_user_callback(dev, &evt);
1491 }
1492
1493 static void uart_ns16550_async_rx_flush(const struct device *dev)
1494 {
1495 struct uart_ns16550_dev_data *data = dev->data;
1496 struct uart_ns16550_rx_dma_params *dma_params = &data->async.rx_dma_params;
1497 struct dma_status status;
1498
1499 dma_get_status(dma_params->dma_dev,
1500 dma_params->dma_channel,
1501 &status);
1502
1503 const int rx_count = dma_params->buf_len - status.pending_length;
1504
1505 if (rx_count > dma_params->counter) {
1506 dma_params->counter = rx_count;
1507 async_evt_rx_rdy(dev);
1508 }
1509 }
1510
1511 static int uart_ns16550_rx_disable(const struct device *dev)
1512 {
1513 struct uart_ns16550_dev_data *data = (struct uart_ns16550_dev_data *)dev->data;
1514 struct uart_ns16550_rx_dma_params *dma_params = &data->async.rx_dma_params;
1515 k_spinlock_key_t key = k_spin_lock(&data->lock);
1516 int ret = 0;
1517
1518 if (!device_is_ready(dma_params->dma_dev)) {
1519 ret = -ENODEV;
1520 goto out;
1521 }
1522
1523 (void)k_work_cancel_delayable(&data->async.rx_dma_params.timeout_work);
1524
1525 if (dma_params->buf && (dma_params->buf_len > 0)) {
1526 uart_ns16550_async_rx_flush(dev);
1527 async_evt_rx_buf_release(dev);
1528 if (data->async.next_rx_buffer != NULL) {
1529 dma_params->buf = data->async.next_rx_buffer;
1530 dma_params->buf_len = data->async.next_rx_buffer_len;
1531 data->async.next_rx_buffer = NULL;
1532 data->async.next_rx_buffer_len = 0;
1533 async_evt_rx_buf_release(dev);
1534 }
1535 }
1536 ret = dma_stop(dma_params->dma_dev,
1537 dma_params->dma_channel);
1538
1539 struct uart_event event = {
1540 .type = UART_RX_DISABLED
1541 };
1542
1543 async_user_callback(dev, &event);
1544
1545 out:
1546 k_spin_unlock(&data->lock, key);
1547 return ret;
1548 }
1549
1550 static void prepare_rx_dma_block_config(const struct device *dev)
1551 {
1552 struct uart_ns16550_dev_data *data = (struct uart_ns16550_dev_data *)dev->data;
1553 struct uart_ns16550_rx_dma_params *rx_dma_params = &data->async.rx_dma_params;
1554
1555 assert(rx_dma_params->buf != NULL);
1556 assert(rx_dma_params->buf_len > 0);
1557
1558 struct dma_block_config *head_block_config = &rx_dma_params->active_dma_block;
1559
1560 head_block_config->dest_address = (uintptr_t)rx_dma_params->buf;
1561 head_block_config->source_address = data->phys_addr;
1562 head_block_config->block_size = rx_dma_params->buf_len;
1563 }
1564
1565 #if UART_NS16550_DMAS_ENABLED
1566 static void dma_callback(const struct device *dev, void *user_data, uint32_t channel,
1567 int status)
1568 {
1569 struct device *uart_dev = (struct device *)user_data;
1570 struct uart_ns16550_dev_data *data = (struct uart_ns16550_dev_data *)uart_dev->data;
1571 struct uart_ns16550_rx_dma_params *rx_params = &data->async.rx_dma_params;
1572 struct uart_ns16550_tx_dma_params *tx_params = &data->async.tx_dma_params;
1573
1574 if (channel == tx_params->dma_channel) {
1575 async_evt_tx_done(uart_dev);
1576 } else if (channel == rx_params->dma_channel) {
1577
1578 rx_params->counter = rx_params->buf_len;
1579
1580 async_evt_rx_rdy(uart_dev);
1581 async_evt_rx_buf_release(uart_dev);
1582
1583 rx_params->buf = data->async.next_rx_buffer;
1584 rx_params->buf_len = data->async.next_rx_buffer_len;
1585 data->async.next_rx_buffer = NULL;
1586 data->async.next_rx_buffer_len = 0U;
1587
1588 if (rx_params->buf != NULL &&
1589 rx_params->buf_len > 0) {
1590 dma_reload(dev, rx_params->dma_channel, data->phys_addr,
1591 (uintptr_t)rx_params->buf, rx_params->buf_len);
1592 dma_start(dev, rx_params->dma_channel);
1593 async_evt_rx_buf_request(uart_dev);
1594 } else {
1595 uart_ns16550_rx_disable(uart_dev);
1596 }
1597 }
1598 }
1599 #endif
1600
1601 static int uart_ns16550_callback_set(const struct device *dev, uart_callback_t callback,
1602 void *user_data)
1603 {
1604 struct uart_ns16550_dev_data *data = dev->data;
1605
1606 data->async.user_callback = callback;
1607 data->async.user_data = user_data;
1608
1609 return 0;
1610 }
1611
1612 static int uart_ns16550_tx(const struct device *dev, const uint8_t *buf, size_t len,
1613 int32_t timeout_us)
1614 {
1615 struct uart_ns16550_dev_data *data = dev->data;
1616 struct uart_ns16550_tx_dma_params *tx_params = &data->async.tx_dma_params;
1617 k_spinlock_key_t key = k_spin_lock(&data->lock);
1618 int ret = 0;
1619
1620 if (!device_is_ready(tx_params->dma_dev)) {
1621 ret = -ENODEV;
1622 goto out;
1623 }
1624
1625 tx_params->buf = buf;
1626 tx_params->buf_len = len;
1627 tx_params->active_dma_block.source_address = (uintptr_t)buf;
1628 tx_params->active_dma_block.dest_address = data->phys_addr;
1629 tx_params->active_dma_block.block_size = len;
1630 tx_params->active_dma_block.next_block = NULL;
1631
1632 ret = dma_config(tx_params->dma_dev,
1633 tx_params->dma_channel,
1634 (struct dma_config *)&tx_params->dma_cfg);
1635
1636 if (ret == 0) {
1637 ret = dma_start(tx_params->dma_dev,
1638 tx_params->dma_channel);
1639 if (ret) {
1640 ret = -EIO;
1641 goto out;
1642 }
1643 async_timer_start(&data->async.tx_dma_params.timeout_work, timeout_us);
1644 }
1645
1646 out:
1647 k_spin_unlock(&data->lock, key);
1648 return ret;
1649 }
1650
1651 static int uart_ns16550_tx_abort(const struct device *dev)
1652 {
1653 struct uart_ns16550_dev_data *data = dev->data;
1654 struct uart_ns16550_tx_dma_params *tx_params = &data->async.tx_dma_params;
1655 struct dma_status status;
1656 int ret = 0;
1657 size_t bytes_tx;
1658
1659 k_spinlock_key_t key = k_spin_lock(&data->lock);
1660
1661 if (!device_is_ready(tx_params->dma_dev)) {
1662 ret = -ENODEV;
1663 goto out;
1664 }
1665
1666 (void)k_work_cancel_delayable(&data->async.tx_dma_params.timeout_work);
1667
1668 ret = dma_stop(tx_params->dma_dev, tx_params->dma_channel);
1669 dma_get_status(tx_params->dma_dev,
1670 tx_params->dma_channel,
1671 &status);
1672 bytes_tx = tx_params->buf_len - status.pending_length;
1673
1674 if (ret == 0) {
1675 struct uart_event tx_aborted_event = {
1676 .type = UART_TX_ABORTED,
1677 .data.tx.buf = tx_params->buf,
1678 .data.tx.len = bytes_tx
1679 };
1680 async_user_callback(dev, &tx_aborted_event);
1681 }
1682 out:
1683 k_spin_unlock(&data->lock, key);
1684 return ret;
1685 }
1686
1687 static int uart_ns16550_rx_enable(const struct device *dev, uint8_t *buf, const size_t len,
1688 const int32_t timeout_us)
1689 {
1690 struct uart_ns16550_dev_data *data = dev->data;
1691 const struct uart_ns16550_dev_config *config = dev->config;
1692 struct uart_ns16550_rx_dma_params *rx_dma_params = &data->async.rx_dma_params;
1693 int ret = 0;
1694 k_spinlock_key_t key = k_spin_lock(&data->lock);
1695
1696 if (!device_is_ready(rx_dma_params->dma_dev)) {
1697 ret = -ENODEV;
1698 goto out;
1699 }
1700
1701 rx_dma_params->timeout_us = timeout_us;
1702 rx_dma_params->buf = buf;
1703 rx_dma_params->buf_len = len;
1704
1705 #if defined(CONFIG_UART_NS16550_INTEL_LPSS_DMA)
1706 ns16550_outword(config, MST(dev), UNMASK_LPSS_INT(rx_dma_params->dma_channel));
1707 #else
1708 ns16550_outbyte(config, IER(dev),
1709 (ns16550_inbyte(config, IER(dev)) | IER_RXRDY));
1710 ns16550_outbyte(config, FCR(dev), FCR_FIFO);
1711 #endif
1712 prepare_rx_dma_block_config(dev);
1713 dma_config(rx_dma_params->dma_dev,
1714 rx_dma_params->dma_channel,
1715 (struct dma_config *)&rx_dma_params->dma_cfg);
1716 dma_start(rx_dma_params->dma_dev, rx_dma_params->dma_channel);
1717 async_evt_rx_buf_request(dev);
1718 out:
1719 k_spin_unlock(&data->lock, key);
1720 return ret;
1721 }
1722
1723 static int uart_ns16550_rx_buf_rsp(const struct device *dev, uint8_t *buf, size_t len)
1724 {
1725 struct uart_ns16550_dev_data *data = dev->data;
1726
1727 assert(data->async.next_rx_buffer == NULL);
1728 assert(data->async.next_rx_buffer_len == 0);
1729 data->async.next_rx_buffer = buf;
1730 data->async.next_rx_buffer_len = len;
1731
1732 return 0;
1733 }
1734
1735 static void uart_ns16550_async_rx_timeout(struct k_work *work)
1736 {
1737 struct k_work_delayable *work_delay = CONTAINER_OF(work, struct k_work_delayable, work);
1738 struct uart_ns16550_rx_dma_params *rx_params =
1739 CONTAINER_OF(work_delay, struct uart_ns16550_rx_dma_params,
1740 timeout_work);
1741 struct uart_ns16550_async_data *async_data =
1742 CONTAINER_OF(rx_params, struct uart_ns16550_async_data,
1743 rx_dma_params);
1744 const struct device *dev = async_data->uart_dev;
1745
1746 uart_ns16550_async_rx_flush(dev);
1747
1748 }
1749
1750 static void uart_ns16550_async_tx_timeout(struct k_work *work)
1751 {
1752 struct k_work_delayable *work_delay = CONTAINER_OF(work, struct k_work_delayable, work);
1753 struct uart_ns16550_tx_dma_params *tx_params =
1754 CONTAINER_OF(work_delay, struct uart_ns16550_tx_dma_params,
1755 timeout_work);
1756 struct uart_ns16550_async_data *async_data =
1757 CONTAINER_OF(tx_params, struct uart_ns16550_async_data,
1758 tx_dma_params);
1759 const struct device *dev = async_data->uart_dev;
1760
1761 (void)uart_ns16550_tx_abort(dev);
1762 }
1763
1764 #endif /* CONFIG_UART_ASYNC_API */
1765
1766 static DEVICE_API(uart, uart_ns16550_driver_api) = {
1767 .poll_in = uart_ns16550_poll_in,
1768 .poll_out = uart_ns16550_poll_out,
1769 .err_check = uart_ns16550_err_check,
1770 #ifdef CONFIG_UART_USE_RUNTIME_CONFIGURE
1771 .configure = uart_ns16550_configure,
1772 .config_get = uart_ns16550_config_get,
1773 #endif
1774 #ifdef CONFIG_UART_INTERRUPT_DRIVEN
1775
1776 .fifo_fill = uart_ns16550_fifo_fill,
1777 .fifo_read = uart_ns16550_fifo_read,
1778 .irq_tx_enable = uart_ns16550_irq_tx_enable,
1779 .irq_tx_disable = uart_ns16550_irq_tx_disable,
1780 .irq_tx_ready = uart_ns16550_irq_tx_ready,
1781 .irq_tx_complete = uart_ns16550_irq_tx_complete,
1782 .irq_rx_enable = uart_ns16550_irq_rx_enable,
1783 .irq_rx_disable = uart_ns16550_irq_rx_disable,
1784 .irq_rx_ready = uart_ns16550_irq_rx_ready,
1785 .irq_err_enable = uart_ns16550_irq_err_enable,
1786 .irq_err_disable = uart_ns16550_irq_err_disable,
1787 .irq_is_pending = uart_ns16550_irq_is_pending,
1788 .irq_update = uart_ns16550_irq_update,
1789 .irq_callback_set = uart_ns16550_irq_callback_set,
1790
1791 #endif
1792
1793 #ifdef CONFIG_UART_ASYNC_API
1794 .callback_set = uart_ns16550_callback_set,
1795 .tx = uart_ns16550_tx,
1796 .tx_abort = uart_ns16550_tx_abort,
1797 .rx_enable = uart_ns16550_rx_enable,
1798 .rx_disable = uart_ns16550_rx_disable,
1799 .rx_buf_rsp = uart_ns16550_rx_buf_rsp,
1800 #endif
1801
1802 #ifdef CONFIG_UART_NS16550_LINE_CTRL
1803 .line_ctrl_set = uart_ns16550_line_ctrl_set,
1804 #endif
1805
1806 #ifdef CONFIG_UART_NS16550_DRV_CMD
1807 .drv_cmd = uart_ns16550_drv_cmd,
1808 #endif
1809 };
1810
1811 #define UART_NS16550_IRQ_FLAGS(n) \
1812 COND_CODE_1(DT_INST_IRQ_HAS_CELL(n, sense), \
1813 (DT_INST_IRQ(n, sense)), \
1814 (0))
1815
1816 /* IO-port or MMIO based UART */
1817 #define UART_NS16550_IRQ_CONFIG(n) \
1818 static void uart_ns16550_irq_config_func##n(const struct device *dev) \
1819 { \
1820 ARG_UNUSED(dev); \
1821 IRQ_CONNECT(DT_INST_IRQN(n), DT_INST_IRQ(n, priority), \
1822 uart_ns16550_isr, DEVICE_DT_INST_GET(n), \
1823 UART_NS16550_IRQ_FLAGS(n)); \
1824 irq_enable(DT_INST_IRQN(n)); \
1825 }
1826
1827 /* PCI(e) with auto IRQ detection */
1828 #define UART_NS16550_IRQ_CONFIG_PCIE(n) \
1829 static void uart_ns16550_irq_config_func##n(const struct device *dev) \
1830 { \
1831 BUILD_ASSERT(DT_INST_IRQN(n) == PCIE_IRQ_DETECT, \
1832 "Only runtime IRQ configuration is supported"); \
1833 BUILD_ASSERT(IS_ENABLED(CONFIG_DYNAMIC_INTERRUPTS), \
1834 "NS16550 PCIe requires dynamic interrupts"); \
1835 const struct uart_ns16550_dev_config *dev_cfg = dev->config; \
1836 unsigned int irq = pcie_alloc_irq(dev_cfg->pcie->bdf); \
1837 if (irq == PCIE_CONF_INTR_IRQ_NONE) { \
1838 return; \
1839 } \
1840 pcie_connect_dynamic_irq(dev_cfg->pcie->bdf, irq, \
1841 DT_INST_IRQ(n, priority), \
1842 (void (*)(const void *))uart_ns16550_isr, \
1843 DEVICE_DT_INST_GET(n), \
1844 UART_NS16550_IRQ_FLAGS(n)); \
1845 pcie_irq_enable(dev_cfg->pcie->bdf, irq); \
1846 }
1847
1848 #ifdef CONFIG_UART_INTERRUPT_DRIVEN
1849 #define DEV_CONFIG_IRQ_FUNC_INIT(n) \
1850 .irq_config_func = uart_ns16550_irq_config_func##n,
1851 #define UART_NS16550_IRQ_FUNC_DECLARE(n) \
1852 static void uart_ns16550_irq_config_func##n(const struct device *dev);
1853 #define UART_NS16550_IRQ_FUNC_DEFINE(n) \
1854 UART_NS16550_IRQ_CONFIG(n)
1855
1856 #define DEV_CONFIG_PCIE_IRQ_FUNC_INIT(n) \
1857 .irq_config_func = uart_ns16550_irq_config_func##n,
1858 #define UART_NS16550_PCIE_IRQ_FUNC_DECLARE(n) \
1859 static void uart_ns16550_irq_config_func##n(const struct device *dev);
1860 #define UART_NS16550_PCIE_IRQ_FUNC_DEFINE(n) \
1861 UART_NS16550_IRQ_CONFIG_PCIE(n)
1862 #else
1863 /* !CONFIG_UART_INTERRUPT_DRIVEN */
1864 #define DEV_CONFIG_IRQ_FUNC_INIT(n)
1865 #define UART_NS16550_IRQ_FUNC_DECLARE(n)
1866 #define UART_NS16550_IRQ_FUNC_DEFINE(n)
1867
1868 #define DEV_CONFIG_PCIE_IRQ_FUNC_INIT(n)
1869 #define UART_NS16550_PCIE_IRQ_FUNC_DECLARE(n)
1870 #define UART_NS16550_PCIE_IRQ_FUNC_DEFINE(n)
1871 #endif /* CONFIG_UART_INTERRUPT_DRIVEN */
1872
1873 #ifdef CONFIG_UART_ASYNC_API
1874 #define DMA_PARAMS(n) \
1875 .async.tx_dma_params = { \
1876 .dma_dev = \
1877 DEVICE_DT_GET(DT_INST_DMAS_CTLR_BY_NAME(n, tx)), \
1878 .dma_channel = \
1879 DT_INST_DMAS_CELL_BY_NAME(n, tx, channel), \
1880 .dma_cfg = { \
1881 .source_burst_length = 1, \
1882 .dest_burst_length = 1, \
1883 .source_data_size = 1, \
1884 .dest_data_size = 1, \
1885 .complete_callback_en = 0, \
1886 .error_callback_dis = 1, \
1887 .block_count = 1, \
1888 .channel_direction = MEMORY_TO_PERIPHERAL, \
1889 .dma_slot = DT_INST_DMAS_CELL_BY_NAME(n, tx, channel), \
1890 .dma_callback = dma_callback, \
1891 .user_data = (void *)DEVICE_DT_INST_GET(n) \
1892 }, \
1893 }, \
1894 .async.rx_dma_params = { \
1895 .dma_dev = \
1896 DEVICE_DT_GET(DT_INST_DMAS_CTLR_BY_NAME(n, rx)), \
1897 .dma_channel = \
1898 DT_INST_DMAS_CELL_BY_NAME(n, rx, channel), \
1899 .dma_cfg = { \
1900 .source_burst_length = 1, \
1901 .dest_burst_length = 1, \
1902 .source_data_size = 1, \
1903 .dest_data_size = 1, \
1904 .complete_callback_en = 0, \
1905 .error_callback_dis = 1, \
1906 .block_count = 1, \
1907 .channel_direction = PERIPHERAL_TO_MEMORY, \
1908 .dma_slot = DT_INST_DMAS_CELL_BY_NAME(n, rx, channel), \
1909 .dma_callback = dma_callback, \
1910 .user_data = (void *)DEVICE_DT_INST_GET(n) \
1911 }, \
1912 }, \
1913 COND_CODE_0(DT_INST_ON_BUS(n, pcie), \
1914 (.phys_addr = DT_INST_REG_ADDR(n),), ())
1915
1916 #define DMA_PARAMS_NULL(n) \
1917 .async.tx_dma_params = { \
1918 .dma_dev = NULL \
1919 }, \
1920 .async.rx_dma_params = { \
1921 .dma_dev = NULL \
1922 }, \
1923
1924 #define DEV_DATA_ASYNC(n) \
1925 COND_CODE_0(DT_INST_PROP(n, io_mapped), \
1926 (COND_CODE_1(DT_INST_NODE_HAS_PROP(n, dmas), \
1927 (DMA_PARAMS(n)), (DMA_PARAMS_NULL(n)))), \
1928 (DMA_PARAMS_NULL(n)))
1929 #else
1930 #define DEV_DATA_ASYNC(n)
1931 #endif /* CONFIG_UART_ASYNC_API */
1932
1933
1934 #define UART_NS16550_COMMON_DEV_CFG_INITIALIZER(n) \
1935 COND_CODE_1(DT_INST_NODE_HAS_PROP(n, clock_frequency), ( \
1936 .sys_clk_freq = DT_INST_PROP(n, clock_frequency), \
1937 .clock_dev = NULL, \
1938 .clock_subsys = NULL, \
1939 ), ( \
1940 .sys_clk_freq = 0, \
1941 .clock_dev = DEVICE_DT_GET(DT_INST_CLOCKS_CTLR(n)), \
1942 .clock_subsys = (clock_control_subsys_t) DT_INST_PHA(\
1943 0, clocks, clkid), \
1944 ) \
1945 ) \
1946 IF_ENABLED(DT_INST_NODE_HAS_PROP(n, pcp), \
1947 (.pcp = DT_INST_PROP_OR(n, pcp, 0),)) \
1948 .reg_interval = (1 << DT_INST_PROP(n, reg_shift)), \
1949 IF_ENABLED(CONFIG_PINCTRL, \
1950 (.pincfg = PINCTRL_DT_INST_DEV_CONFIG_GET(n),)) \
1951 IF_ENABLED(DT_INST_NODE_HAS_PROP(n, resets), \
1952 (.reset_spec = RESET_DT_SPEC_INST_GET(n),))
1953
1954 #define UART_NS16550_COMMON_DEV_DATA_INITIALIZER(n) \
1955 .uart_config.baudrate = DT_INST_PROP_OR(n, current_speed, 0), \
1956 .uart_config.parity = UART_CFG_PARITY_NONE, \
1957 .uart_config.stop_bits = UART_CFG_STOP_BITS_1, \
1958 .uart_config.data_bits = UART_CFG_DATA_BITS_8, \
1959 .uart_config.flow_ctrl = \
1960 COND_CODE_1(DT_INST_PROP_OR(n, hw_flow_control, 0), \
1961 (UART_CFG_FLOW_CTRL_RTS_CTS), \
1962 (UART_CFG_FLOW_CTRL_NONE)), \
1963 IF_ENABLED(DT_INST_NODE_HAS_PROP(n, dlf), \
1964 (.dlf = DT_INST_PROP_OR(n, dlf, 0),)) \
1965 DEV_DATA_ASYNC(n) \
1966
1967 #define UART_NS16550_DEVICE_IO_MMIO_INIT(n) \
1968 UART_NS16550_IRQ_FUNC_DECLARE(n); \
1969 IF_ENABLED(CONFIG_PINCTRL, (PINCTRL_DT_INST_DEFINE(n))); \
1970 static const struct uart_ns16550_dev_config uart_ns16550_dev_cfg_##n = { \
1971 COND_CODE_1(DT_INST_PROP_OR(n, io_mapped, 0), \
1972 (.port = DT_INST_REG_ADDR(n),), \
1973 (DEVICE_MMIO_ROM_INIT(DT_DRV_INST(n)),)) \
1974 IF_ENABLED(DT_INST_PROP_OR(n, io_mapped, 0), \
1975 (.io_map = true,)) \
1976 UART_NS16550_COMMON_DEV_CFG_INITIALIZER(n) \
1977 DEV_CONFIG_IRQ_FUNC_INIT(n) \
1978 }; \
1979 static struct uart_ns16550_dev_data uart_ns16550_dev_data_##n = { \
1980 UART_NS16550_COMMON_DEV_DATA_INITIALIZER(n) \
1981 }; \
1982 DEVICE_DT_INST_DEFINE(n, uart_ns16550_init, NULL, \
1983 &uart_ns16550_dev_data_##n, &uart_ns16550_dev_cfg_##n, \
1984 PRE_KERNEL_1, CONFIG_SERIAL_INIT_PRIORITY, \
1985 &uart_ns16550_driver_api); \
1986 UART_NS16550_IRQ_FUNC_DEFINE(n)
1987
1988 #define UART_NS16550_DEVICE_PCIE_INIT(n) \
1989 UART_NS16550_PCIE_IRQ_FUNC_DECLARE(n); \
1990 DEVICE_PCIE_INST_DECLARE(n); \
1991 IF_ENABLED(CONFIG_PINCTRL, (PINCTRL_DT_INST_DEFINE(n))); \
1992 static const struct uart_ns16550_dev_config uart_ns16550_dev_cfg_##n = { \
1993 UART_NS16550_COMMON_DEV_CFG_INITIALIZER(n) \
1994 DEV_CONFIG_PCIE_IRQ_FUNC_INIT(n) \
1995 DEVICE_PCIE_INST_INIT(n, pcie) \
1996 }; \
1997 static struct uart_ns16550_dev_data uart_ns16550_dev_data_##n = { \
1998 UART_NS16550_COMMON_DEV_DATA_INITIALIZER(n) \
1999 }; \
2000 DEVICE_DT_INST_DEFINE(n, uart_ns16550_init, NULL, \
2001 &uart_ns16550_dev_data_##n, &uart_ns16550_dev_cfg_##n, \
2002 PRE_KERNEL_1, \
2003 CONFIG_SERIAL_INIT_PRIORITY, \
2004 &uart_ns16550_driver_api); \
2005 UART_NS16550_PCIE_IRQ_FUNC_DEFINE(n)
2006
2007 #define UART_NS16550_DEVICE_INIT(n) \
2008 COND_CODE_1(DT_INST_ON_BUS(n, pcie), \
2009 (UART_NS16550_DEVICE_PCIE_INIT(n)), \
2010 (UART_NS16550_DEVICE_IO_MMIO_INIT(n)))
2011
2012 DT_INST_FOREACH_STATUS_OKAY(UART_NS16550_DEVICE_INIT)
2013