LCOV - code coverage report
Current view: top level - tty/serial/8250 - 8250.h (source / functions) Coverage Total Hit
Test: TTY Combined Coverage Lines: 0.0 % 128 0
Test Date: 2025-08-26 15:45:50 Functions: 0.0 % 21 0

            Line data    Source code
       1              : /* SPDX-License-Identifier: GPL-2.0+ */
       2              : /*
       3              :  *  Driver for 8250/16550-type serial ports
       4              :  *
       5              :  *  Based on drivers/char/serial.c, by Linus Torvalds, Theodore Ts'o.
       6              :  *
       7              :  *  Copyright (C) 2001 Russell King.
       8              :  */
       9              : 
      10              : #include <linux/bits.h>
      11              : #include <linux/serial_8250.h>
      12              : #include <linux/serial_core.h>
      13              : #include <linux/dmaengine.h>
      14              : 
      15              : #include "../serial_mctrl_gpio.h"
      16              : 
      17              : struct uart_8250_dma {
      18              :         int (*tx_dma)(struct uart_8250_port *p);
      19              :         int (*rx_dma)(struct uart_8250_port *p);
      20              :         void (*prepare_tx_dma)(struct uart_8250_port *p);
      21              :         void (*prepare_rx_dma)(struct uart_8250_port *p);
      22              : 
      23              :         /* Filter function */
      24              :         dma_filter_fn           fn;
      25              :         /* Parameter to the filter function */
      26              :         void                    *rx_param;
      27              :         void                    *tx_param;
      28              : 
      29              :         struct dma_slave_config rxconf;
      30              :         struct dma_slave_config txconf;
      31              : 
      32              :         struct dma_chan         *rxchan;
      33              :         struct dma_chan         *txchan;
      34              : 
      35              :         /* Device address base for DMA operations */
      36              :         phys_addr_t             rx_dma_addr;
      37              :         phys_addr_t             tx_dma_addr;
      38              : 
      39              :         /* DMA address of the buffer in memory */
      40              :         dma_addr_t              rx_addr;
      41              :         dma_addr_t              tx_addr;
      42              : 
      43              :         dma_cookie_t            rx_cookie;
      44              :         dma_cookie_t            tx_cookie;
      45              : 
      46              :         void                    *rx_buf;
      47              : 
      48              :         size_t                  rx_size;
      49              :         size_t                  tx_size;
      50              : 
      51              :         unsigned char           tx_running;
      52              :         unsigned char           tx_err;
      53              :         unsigned char           rx_running;
      54              : };
      55              : 
      56              : struct old_serial_port {
      57              :         unsigned int uart;
      58              :         unsigned int baud_base;
      59              :         unsigned int port;
      60              :         unsigned int irq;
      61              :         upf_t        flags;
      62              :         unsigned char io_type;
      63              :         unsigned char __iomem *iomem_base;
      64              :         unsigned short iomem_reg_shift;
      65              : };
      66              : 
      67              : struct serial8250_config {
      68              :         const char      *name;
      69              :         unsigned short  fifo_size;
      70              :         unsigned short  tx_loadsz;
      71              :         unsigned char   fcr;
      72              :         unsigned char   rxtrig_bytes[UART_FCR_R_TRIG_MAX_STATE];
      73              :         unsigned int    flags;
      74              : };
      75              : 
      76              : #define UART_CAP_FIFO   BIT(8)  /* UART has FIFO */
      77              : #define UART_CAP_EFR    BIT(9)  /* UART has EFR */
      78              : #define UART_CAP_SLEEP  BIT(10) /* UART has IER sleep */
      79              : #define UART_CAP_AFE    BIT(11) /* MCR-based hw flow control */
      80              : #define UART_CAP_UUE    BIT(12) /* UART needs IER bit 6 set (Xscale) */
      81              : #define UART_CAP_RTOIE  BIT(13) /* UART needs IER bit 4 set (Xscale, Tegra) */
      82              : #define UART_CAP_HFIFO  BIT(14) /* UART has a "hidden" FIFO */
      83              : #define UART_CAP_RPM    BIT(15) /* Runtime PM is active while idle */
      84              : #define UART_CAP_IRDA   BIT(16) /* UART supports IrDA line discipline */
      85              : #define UART_CAP_MINI   BIT(17) /* Mini UART on BCM283X family lacks:
      86              :                                          * STOP PARITY EPAR SPAR WLEN5 WLEN6
      87              :                                          */
      88              : #define UART_CAP_NOTEMT BIT(18) /* UART without interrupt on TEMT available */
      89              : 
      90              : #define UART_BUG_QUOT   BIT(0)  /* UART has buggy quot LSB */
      91              : #define UART_BUG_TXEN   BIT(1)  /* UART has buggy TX IIR status */
      92              : #define UART_BUG_NOMSR  BIT(2)  /* UART has buggy MSR status bits (Au1x00) */
      93              : #define UART_BUG_THRE   BIT(3)  /* UART has buggy THRE reassertion */
      94              : #define UART_BUG_TXRACE BIT(5)  /* UART Tx fails to set remote DR */
      95              : 
      96              : /* Module parameters */
      97              : #define UART_NR CONFIG_SERIAL_8250_NR_UARTS
      98              : 
      99              : extern unsigned int nr_uarts;
     100              : 
     101              : #ifdef CONFIG_SERIAL_8250_SHARE_IRQ
     102              : #define SERIAL8250_SHARE_IRQS 1
     103              : #else
     104              : #define SERIAL8250_SHARE_IRQS 0
     105              : #endif
     106              : 
     107              : extern unsigned int share_irqs;
     108              : extern unsigned int skip_txen_test;
     109              : 
     110              : #define SERIAL8250_PORT_FLAGS(_base, _irq, _flags)              \
     111              :         {                                                       \
     112              :                 .iobase         = _base,                        \
     113              :                 .irq            = _irq,                         \
     114              :                 .uartclk        = 1843200,                      \
     115              :                 .iotype         = UPIO_PORT,                    \
     116              :                 .flags          = UPF_BOOT_AUTOCONF | (_flags), \
     117              :         }
     118              : 
     119              : #define SERIAL8250_PORT(_base, _irq) SERIAL8250_PORT_FLAGS(_base, _irq, 0)
     120              : 
     121              : extern struct uart_driver serial8250_reg;
     122              : void serial8250_register_ports(struct uart_driver *drv, struct device *dev);
     123              : 
     124              : /* Legacy ISA bus related APIs */
     125              : typedef void (*serial8250_isa_config_fn)(int, struct uart_port *, u32 *);
     126              : extern serial8250_isa_config_fn serial8250_isa_config;
     127              : 
     128              : void serial8250_isa_init_ports(void);
     129              : 
     130              : extern struct platform_device *serial8250_isa_devs;
     131              : 
     132              : extern const struct uart_ops *univ8250_port_base_ops;
     133              : extern struct uart_ops univ8250_port_ops;
     134              : 
     135            0 : static inline int serial_in(struct uart_8250_port *up, int offset)
     136              : {
     137            0 :         return up->port.serial_in(&up->port, offset);
     138              : }
     139              : 
     140            0 : static inline void serial_out(struct uart_8250_port *up, int offset, int value)
     141              : {
     142            0 :         up->port.serial_out(&up->port, offset, value);
     143            0 : }
     144              : 
     145              : /**
     146              :  *      serial_lsr_in - Read LSR register and preserve flags across reads
     147              :  *      @up:    uart 8250 port
     148              :  *
     149              :  *      Read LSR register and handle saving non-preserved flags across reads.
     150              :  *      The flags that are not preserved across reads are stored into
     151              :  *      up->lsr_saved_flags.
     152              :  *
     153              :  *      Returns LSR value or'ed with the preserved flags (if any).
     154              :  */
     155            0 : static inline u16 serial_lsr_in(struct uart_8250_port *up)
     156              : {
     157            0 :         u16 lsr = up->lsr_saved_flags;
     158              : 
     159            0 :         lsr |= serial_in(up, UART_LSR);
     160            0 :         up->lsr_saved_flags = lsr & up->lsr_save_mask;
     161              : 
     162            0 :         return lsr;
     163            0 : }
     164              : 
     165              : /*
     166              :  * For the 16C950
     167              :  */
     168            0 : static void serial_icr_write(struct uart_8250_port *up, int offset, int value)
     169              : {
     170            0 :         serial_out(up, UART_SCR, offset);
     171            0 :         serial_out(up, UART_ICR, value);
     172            0 : }
     173              : 
     174            0 : static unsigned int __maybe_unused serial_icr_read(struct uart_8250_port *up,
     175              :                                                    int offset)
     176              : {
     177            0 :         unsigned int value;
     178              : 
     179            0 :         serial_icr_write(up, UART_ACR, up->acr | UART_ACR_ICRRD);
     180            0 :         serial_out(up, UART_SCR, offset);
     181            0 :         value = serial_in(up, UART_ICR);
     182            0 :         serial_icr_write(up, UART_ACR, up->acr);
     183              : 
     184            0 :         return value;
     185            0 : }
     186              : 
     187              : void serial8250_clear_and_reinit_fifos(struct uart_8250_port *p);
     188              : 
     189            0 : static inline u32 serial_dl_read(struct uart_8250_port *up)
     190              : {
     191            0 :         return up->dl_read(up);
     192              : }
     193              : 
     194            0 : static inline void serial_dl_write(struct uart_8250_port *up, u32 value)
     195              : {
     196            0 :         up->dl_write(up, value);
     197            0 : }
     198              : 
     199            0 : static inline bool serial8250_set_THRI(struct uart_8250_port *up)
     200              : {
     201              :         /* Port locked to synchronize UART_IER access against the console. */
     202            0 :         lockdep_assert_held_once(&up->port.lock);
     203              : 
     204            0 :         if (up->ier & UART_IER_THRI)
     205            0 :                 return false;
     206            0 :         up->ier |= UART_IER_THRI;
     207            0 :         serial_out(up, UART_IER, up->ier);
     208            0 :         return true;
     209            0 : }
     210              : 
     211            0 : static inline bool serial8250_clear_THRI(struct uart_8250_port *up)
     212              : {
     213              :         /* Port locked to synchronize UART_IER access against the console. */
     214            0 :         lockdep_assert_held_once(&up->port.lock);
     215              : 
     216            0 :         if (!(up->ier & UART_IER_THRI))
     217            0 :                 return false;
     218            0 :         up->ier &= ~UART_IER_THRI;
     219            0 :         serial_out(up, UART_IER, up->ier);
     220            0 :         return true;
     221            0 : }
     222              : 
     223              : struct uart_8250_port *serial8250_setup_port(int index);
     224              : struct uart_8250_port *serial8250_get_port(int line);
     225              : 
     226              : int serial8250_em485_config(struct uart_port *port, struct ktermios *termios,
     227              :                             struct serial_rs485 *rs485);
     228              : void serial8250_em485_start_tx(struct uart_8250_port *p, bool toggle_ier);
     229              : void serial8250_em485_stop_tx(struct uart_8250_port *p, bool toggle_ier);
     230              : void serial8250_em485_destroy(struct uart_8250_port *p);
     231              : extern struct serial_rs485 serial8250_em485_supported;
     232              : 
     233              : /* MCR <-> TIOCM conversion */
     234            0 : static inline int serial8250_TIOCM_to_MCR(int tiocm)
     235              : {
     236            0 :         int mcr = 0;
     237              : 
     238            0 :         if (tiocm & TIOCM_RTS)
     239            0 :                 mcr |= UART_MCR_RTS;
     240            0 :         if (tiocm & TIOCM_DTR)
     241            0 :                 mcr |= UART_MCR_DTR;
     242            0 :         if (tiocm & TIOCM_OUT1)
     243            0 :                 mcr |= UART_MCR_OUT1;
     244            0 :         if (tiocm & TIOCM_OUT2)
     245            0 :                 mcr |= UART_MCR_OUT2;
     246            0 :         if (tiocm & TIOCM_LOOP)
     247            0 :                 mcr |= UART_MCR_LOOP;
     248              : 
     249            0 :         return mcr;
     250            0 : }
     251              : 
     252            0 : static inline int serial8250_MCR_to_TIOCM(int mcr)
     253              : {
     254            0 :         int tiocm = 0;
     255              : 
     256            0 :         if (mcr & UART_MCR_RTS)
     257            0 :                 tiocm |= TIOCM_RTS;
     258            0 :         if (mcr & UART_MCR_DTR)
     259            0 :                 tiocm |= TIOCM_DTR;
     260            0 :         if (mcr & UART_MCR_OUT1)
     261            0 :                 tiocm |= TIOCM_OUT1;
     262            0 :         if (mcr & UART_MCR_OUT2)
     263            0 :                 tiocm |= TIOCM_OUT2;
     264            0 :         if (mcr & UART_MCR_LOOP)
     265            0 :                 tiocm |= TIOCM_LOOP;
     266              : 
     267            0 :         return tiocm;
     268            0 : }
     269              : 
     270              : /* MSR <-> TIOCM conversion */
     271            0 : static inline int serial8250_MSR_to_TIOCM(int msr)
     272              : {
     273            0 :         int tiocm = 0;
     274              : 
     275            0 :         if (msr & UART_MSR_DCD)
     276            0 :                 tiocm |= TIOCM_CAR;
     277            0 :         if (msr & UART_MSR_RI)
     278            0 :                 tiocm |= TIOCM_RNG;
     279            0 :         if (msr & UART_MSR_DSR)
     280            0 :                 tiocm |= TIOCM_DSR;
     281            0 :         if (msr & UART_MSR_CTS)
     282            0 :                 tiocm |= TIOCM_CTS;
     283              : 
     284            0 :         return tiocm;
     285            0 : }
     286              : 
     287            0 : static inline void serial8250_out_MCR(struct uart_8250_port *up, int value)
     288              : {
     289            0 :         serial_out(up, UART_MCR, value);
     290              : 
     291            0 :         if (up->gpios)
     292            0 :                 mctrl_gpio_set(up->gpios, serial8250_MCR_to_TIOCM(value));
     293            0 : }
     294              : 
     295            0 : static inline int serial8250_in_MCR(struct uart_8250_port *up)
     296              : {
     297            0 :         int mctrl;
     298              : 
     299            0 :         mctrl = serial_in(up, UART_MCR);
     300              : 
     301            0 :         if (up->gpios) {
     302            0 :                 unsigned int mctrl_gpio = 0;
     303              : 
     304            0 :                 mctrl_gpio = mctrl_gpio_get_outputs(up->gpios, &mctrl_gpio);
     305            0 :                 mctrl |= serial8250_TIOCM_to_MCR(mctrl_gpio);
     306            0 :         }
     307              : 
     308            0 :         return mctrl;
     309            0 : }
     310              : 
     311              : #ifdef CONFIG_SERIAL_8250_PNP
     312              : int serial8250_pnp_init(void);
     313              : void serial8250_pnp_exit(void);
     314              : #else
     315              : static inline int serial8250_pnp_init(void) { return 0; }
     316              : static inline void serial8250_pnp_exit(void) { }
     317              : #endif
     318              : 
     319              : #ifdef CONFIG_SERIAL_8250_RSA
     320              : void univ8250_rsa_support(struct uart_ops *ops);
     321              : void rsa_enable(struct uart_8250_port *up);
     322              : void rsa_disable(struct uart_8250_port *up);
     323              : void rsa_autoconfig(struct uart_8250_port *up);
     324              : void rsa_reset(struct uart_8250_port *up);
     325              : #else
     326              : static inline void univ8250_rsa_support(struct uart_ops *ops) { }
     327              : static inline void rsa_enable(struct uart_8250_port *up) {}
     328              : static inline void rsa_disable(struct uart_8250_port *up) {}
     329              : static inline void rsa_autoconfig(struct uart_8250_port *up) {}
     330              : static inline void rsa_reset(struct uart_8250_port *up) {}
     331              : #endif
     332              : 
     333              : #ifdef CONFIG_SERIAL_8250_FINTEK
     334              : int fintek_8250_probe(struct uart_8250_port *uart);
     335              : #else
     336            0 : static inline int fintek_8250_probe(struct uart_8250_port *uart) { return 0; }
     337              : #endif
     338              : 
     339              : #ifdef CONFIG_ARCH_OMAP1
     340              : #include <linux/soc/ti/omap1-soc.h>
     341              : static inline int is_omap1_8250(struct uart_8250_port *pt)
     342              : {
     343              :         int res;
     344              : 
     345              :         switch (pt->port.mapbase) {
     346              :         case OMAP1_UART1_BASE:
     347              :         case OMAP1_UART2_BASE:
     348              :         case OMAP1_UART3_BASE:
     349              :                 res = 1;
     350              :                 break;
     351              :         default:
     352              :                 res = 0;
     353              :                 break;
     354              :         }
     355              : 
     356              :         return res;
     357              : }
     358              : 
     359              : static inline int is_omap1510_8250(struct uart_8250_port *pt)
     360              : {
     361              :         if (!cpu_is_omap1510())
     362              :                 return 0;
     363              : 
     364              :         return is_omap1_8250(pt);
     365              : }
     366              : #else
     367            0 : static inline int is_omap1_8250(struct uart_8250_port *pt)
     368              : {
     369            0 :         return 0;
     370              : }
     371            0 : static inline int is_omap1510_8250(struct uart_8250_port *pt)
     372              : {
     373            0 :         return 0;
     374              : }
     375              : #endif
     376              : 
     377              : #ifdef CONFIG_SERIAL_8250_DMA
     378              : extern int serial8250_tx_dma(struct uart_8250_port *);
     379              : extern void serial8250_tx_dma_flush(struct uart_8250_port *);
     380              : extern int serial8250_rx_dma(struct uart_8250_port *);
     381              : extern void serial8250_rx_dma_flush(struct uart_8250_port *);
     382              : extern int serial8250_request_dma(struct uart_8250_port *);
     383              : extern void serial8250_release_dma(struct uart_8250_port *);
     384              : 
     385            0 : static inline void serial8250_do_prepare_tx_dma(struct uart_8250_port *p)
     386              : {
     387            0 :         struct uart_8250_dma *dma = p->dma;
     388              : 
     389            0 :         if (dma->prepare_tx_dma)
     390            0 :                 dma->prepare_tx_dma(p);
     391            0 : }
     392              : 
     393            0 : static inline void serial8250_do_prepare_rx_dma(struct uart_8250_port *p)
     394              : {
     395            0 :         struct uart_8250_dma *dma = p->dma;
     396              : 
     397            0 :         if (dma->prepare_rx_dma)
     398            0 :                 dma->prepare_rx_dma(p);
     399            0 : }
     400              : 
     401            0 : static inline bool serial8250_tx_dma_running(struct uart_8250_port *p)
     402              : {
     403            0 :         struct uart_8250_dma *dma = p->dma;
     404              : 
     405            0 :         return dma && dma->tx_running;
     406            0 : }
     407              : #else
     408              : static inline int serial8250_tx_dma(struct uart_8250_port *p)
     409              : {
     410              :         return -1;
     411              : }
     412              : static inline void serial8250_tx_dma_flush(struct uart_8250_port *p) { }
     413              : static inline int serial8250_rx_dma(struct uart_8250_port *p)
     414              : {
     415              :         return -1;
     416              : }
     417              : static inline void serial8250_rx_dma_flush(struct uart_8250_port *p) { }
     418              : static inline int serial8250_request_dma(struct uart_8250_port *p)
     419              : {
     420              :         return -1;
     421              : }
     422              : static inline void serial8250_release_dma(struct uart_8250_port *p) { }
     423              : 
     424              : static inline bool serial8250_tx_dma_running(struct uart_8250_port *p)
     425              : {
     426              :         return false;
     427              : }
     428              : #endif
     429              : 
     430            0 : static inline int ns16550a_goto_highspeed(struct uart_8250_port *up)
     431              : {
     432            0 :         unsigned char status;
     433              : 
     434            0 :         status = serial_in(up, 0x04); /* EXCR2 */
     435              : #define PRESL(x) ((x) & 0x30)
     436            0 :         if (PRESL(status) == 0x10) {
     437              :                 /* already in high speed mode */
     438            0 :                 return 0;
     439              :         } else {
     440            0 :                 status &= ~0xB0; /* Disable LOCK, mask out PRESL[01] */
     441            0 :                 status |= 0x10;  /* 1.625 divisor for baud_base --> 921600 */
     442            0 :                 serial_out(up, 0x04, status);
     443              :         }
     444            0 :         return 1;
     445            0 : }
     446              : 
     447              : static inline int serial_index(struct uart_port *port)
     448              : {
     449              :         return port->minor - 64;
     450              : }
        

Generated by: LCOV version 2.0-1