/* SPDX-License-Identifier: GPL-2.0+ */ /* Synopsys DesignWare 8250 library header file. */ #ifndef _SERIAL_8250_DWLIB_H_ #define _SERIAL_8250_DWLIB_H_ #include #include #include #include #include #include "8250.h" /* Offsets for the DesignWare specific registers */ #define DW_UART_USR 0x1f /* UART Status Register */ #define DW_UART_DMASA 0xa8 /* DMA Software Ack */ #define DW_UART_TCR 0xac /* Transceiver Control Register (RS485) */ #define DW_UART_DE_EN 0xb0 /* Driver Output Enable Register */ #define DW_UART_RE_EN 0xb4 /* Receiver Output Enable Register */ #define DW_UART_DLF 0xc0 /* Divisor Latch Fraction Register */ #define DW_UART_RAR 0xc4 /* Receive Address Register */ #define DW_UART_TAR 0xc8 /* Transmit Address Register */ #define DW_UART_LCR_EXT 0xcc /* Line Extended Control Register */ #define DW_UART_CPR 0xf4 /* Component Parameter Register */ #define DW_UART_UCV 0xf8 /* UART Component Version */ /* Interrupt ID Register bits */ #define DW_UART_IIR_IID GENMASK(3, 0) /* Modem Control Register bits */ #define DW_UART_MCR_SIRE BIT(6) /* Line Status Register bits */ #define DW_UART_LSR_ADDR_RCVD BIT(8) /* UART Status Register bits */ #define DW_UART_USR_BUSY BIT(0) /* Transceiver Control Register bits */ #define DW_UART_TCR_RS485_EN BIT(0) #define DW_UART_TCR_RE_POL BIT(1) #define DW_UART_TCR_DE_POL BIT(2) #define DW_UART_TCR_XFER_MODE GENMASK(4, 3) #define DW_UART_TCR_XFER_MODE_DE_DURING_RE FIELD_PREP(DW_UART_TCR_XFER_MODE, 0) #define DW_UART_TCR_XFER_MODE_SW_DE_OR_RE FIELD_PREP(DW_UART_TCR_XFER_MODE, 1) #define DW_UART_TCR_XFER_MODE_DE_OR_RE FIELD_PREP(DW_UART_TCR_XFER_MODE, 2) /* Receive / Transmit Address Register bits */ #define DW_UART_ADDR_MASK GENMASK(7, 0) /* Line Extended Control Register bits */ #define DW_UART_LCR_EXT_DLS_E BIT(0) #define DW_UART_LCR_EXT_ADDR_MATCH BIT(1) #define DW_UART_LCR_EXT_SEND_ADDR BIT(2) #define DW_UART_LCR_EXT_TRANSMIT_MODE BIT(3) /* Component Parameter Register bits */ #define DW_UART_CPR_ABP_DATA_WIDTH GENMASK(1, 0) #define DW_UART_CPR_AFCE_MODE BIT(4) #define DW_UART_CPR_THRE_MODE BIT(5) #define DW_UART_CPR_SIR_MODE BIT(6) #define DW_UART_CPR_SIR_LP_MODE BIT(7) #define DW_UART_CPR_ADDITIONAL_FEATURES BIT(8) #define DW_UART_CPR_FIFO_ACCESS BIT(9) #define DW_UART_CPR_FIFO_STAT BIT(10) #define DW_UART_CPR_SHADOW BIT(11) #define DW_UART_CPR_ENCODED_PARMS BIT(12) #define DW_UART_CPR_DMA_EXTRA BIT(13) #define DW_UART_CPR_FIFO_MODE GENMASK(23, 16) /* Helpers for FIFO size calculation */ #define DW_UART_CPR_FIFO_SIZE(a) (FIELD_GET(DW_UART_CPR_FIFO_MODE, (a)) * 16) #define DW_UART_CPR_FIFO_MODE_FROM_SIZE(size) \ (FIELD_PREP_CONST(DW_UART_CPR_FIFO_MODE, \ BUILD_BUG_ON_ZERO((size) > 2048) + \ BUILD_BUG_ON_ZERO((size) % 16) + \ ((size) / 16))) struct dw8250_port_data { /* Port properties */ int line; /* DMA operations */ struct uart_8250_dma dma; /* Hardware configuration */ u32 cpr_value; u8 dlf_size; /* RS485 variables */ bool hw_rs485_support; }; void dw8250_do_set_termios(struct uart_port *p, struct ktermios *termios, const struct ktermios *old); void dw8250_setup_port(struct uart_port *p); static inline u32 dw8250_readl_ext(struct uart_port *p, int offset) { if (p->iotype == UPIO_MEM32BE) return ioread32be(p->membase + offset); return readl(p->membase + offset); } static inline void dw8250_writel_ext(struct uart_port *p, int offset, u32 reg) { if (p->iotype == UPIO_MEM32BE) iowrite32be(reg, p->membase + offset); else writel(reg, p->membase + offset); } #endif /* _SERIAL_8250_DWLIB_H_ */