LCOV - code coverage report
Current view: top level - include/linux - serial_core.h (source / functions) Hit Total Coverage
Test: coverage.info Lines: 5 16 31.2 %
Date: 2014-02-18 Functions: 0 0 -
Branches: 4 18 22.2 %

           Branch data     Line data    Source code
       1                 :            : /*
       2                 :            :  *  linux/drivers/char/serial_core.h
       3                 :            :  *
       4                 :            :  *  Copyright (C) 2000 Deep Blue Solutions Ltd.
       5                 :            :  *
       6                 :            :  * This program is free software; you can redistribute it and/or modify
       7                 :            :  * it under the terms of the GNU General Public License as published by
       8                 :            :  * the Free Software Foundation; either version 2 of the License, or
       9                 :            :  * (at your option) any later version.
      10                 :            :  *
      11                 :            :  * This program is distributed in the hope that it will be useful,
      12                 :            :  * but WITHOUT ANY WARRANTY; without even the implied warranty of
      13                 :            :  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      14                 :            :  * GNU General Public License for more details.
      15                 :            :  *
      16                 :            :  * You should have received a copy of the GNU General Public License
      17                 :            :  * along with this program; if not, write to the Free Software
      18                 :            :  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
      19                 :            :  */
      20                 :            : #ifndef LINUX_SERIAL_CORE_H
      21                 :            : #define LINUX_SERIAL_CORE_H
      22                 :            : 
      23                 :            : 
      24                 :            : #include <linux/compiler.h>
      25                 :            : #include <linux/interrupt.h>
      26                 :            : #include <linux/circ_buf.h>
      27                 :            : #include <linux/spinlock.h>
      28                 :            : #include <linux/sched.h>
      29                 :            : #include <linux/tty.h>
      30                 :            : #include <linux/mutex.h>
      31                 :            : #include <linux/sysrq.h>
      32                 :            : #include <uapi/linux/serial_core.h>
      33                 :            : 
      34                 :            : #ifdef CONFIG_SERIAL_CORE_CONSOLE
      35                 :            : #define uart_console(port) \
      36                 :            :         ((port)->cons && (port)->cons->index == (port)->line)
      37                 :            : #else
      38                 :            : #define uart_console(port)      (0)
      39                 :            : #endif
      40                 :            : 
      41                 :            : struct uart_port;
      42                 :            : struct serial_struct;
      43                 :            : struct device;
      44                 :            : 
      45                 :            : /*
      46                 :            :  * This structure describes all the operations that can be done on the
      47                 :            :  * physical hardware.  See Documentation/serial/driver for details.
      48                 :            :  */
      49                 :            : struct uart_ops {
      50                 :            :         unsigned int    (*tx_empty)(struct uart_port *);
      51                 :            :         void            (*set_mctrl)(struct uart_port *, unsigned int mctrl);
      52                 :            :         unsigned int    (*get_mctrl)(struct uart_port *);
      53                 :            :         void            (*stop_tx)(struct uart_port *);
      54                 :            :         void            (*start_tx)(struct uart_port *);
      55                 :            :         void            (*throttle)(struct uart_port *);
      56                 :            :         void            (*unthrottle)(struct uart_port *);
      57                 :            :         void            (*send_xchar)(struct uart_port *, char ch);
      58                 :            :         void            (*stop_rx)(struct uart_port *);
      59                 :            :         void            (*enable_ms)(struct uart_port *);
      60                 :            :         void            (*break_ctl)(struct uart_port *, int ctl);
      61                 :            :         int             (*startup)(struct uart_port *);
      62                 :            :         void            (*shutdown)(struct uart_port *);
      63                 :            :         void            (*flush_buffer)(struct uart_port *);
      64                 :            :         void            (*set_termios)(struct uart_port *, struct ktermios *new,
      65                 :            :                                        struct ktermios *old);
      66                 :            :         void            (*set_ldisc)(struct uart_port *, int new);
      67                 :            :         void            (*pm)(struct uart_port *, unsigned int state,
      68                 :            :                               unsigned int oldstate);
      69                 :            :         void            (*wake_peer)(struct uart_port *);
      70                 :            : 
      71                 :            :         /*
      72                 :            :          * Return a string describing the type of the port
      73                 :            :          */
      74                 :            :         const char      *(*type)(struct uart_port *);
      75                 :            : 
      76                 :            :         /*
      77                 :            :          * Release IO and memory resources used by the port.
      78                 :            :          * This includes iounmap if necessary.
      79                 :            :          */
      80                 :            :         void            (*release_port)(struct uart_port *);
      81                 :            : 
      82                 :            :         /*
      83                 :            :          * Request IO and memory resources used by the port.
      84                 :            :          * This includes iomapping the port if necessary.
      85                 :            :          */
      86                 :            :         int             (*request_port)(struct uart_port *);
      87                 :            :         void            (*config_port)(struct uart_port *, int);
      88                 :            :         int             (*verify_port)(struct uart_port *, struct serial_struct *);
      89                 :            :         int             (*ioctl)(struct uart_port *, unsigned int, unsigned long);
      90                 :            : #ifdef CONFIG_CONSOLE_POLL
      91                 :            :         int             (*poll_init)(struct uart_port *);
      92                 :            :         void            (*poll_put_char)(struct uart_port *, unsigned char);
      93                 :            :         int             (*poll_get_char)(struct uart_port *);
      94                 :            : #endif
      95                 :            : };
      96                 :            : 
      97                 :            : #define NO_POLL_CHAR            0x00ff0000
      98                 :            : #define UART_CONFIG_TYPE        (1 << 0)
      99                 :            : #define UART_CONFIG_IRQ         (1 << 1)
     100                 :            : 
     101                 :            : struct uart_icount {
     102                 :            :         __u32   cts;
     103                 :            :         __u32   dsr;
     104                 :            :         __u32   rng;
     105                 :            :         __u32   dcd;
     106                 :            :         __u32   rx;
     107                 :            :         __u32   tx;
     108                 :            :         __u32   frame;
     109                 :            :         __u32   overrun;
     110                 :            :         __u32   parity;
     111                 :            :         __u32   brk;
     112                 :            :         __u32   buf_overrun;
     113                 :            : };
     114                 :            : 
     115                 :            : typedef unsigned int __bitwise__ upf_t;
     116                 :            : 
     117                 :            : struct uart_port {
     118                 :            :         spinlock_t              lock;                   /* port lock */
     119                 :            :         unsigned long           iobase;                 /* in/out[bwl] */
     120                 :            :         unsigned char __iomem   *membase;               /* read/write[bwl] */
     121                 :            :         unsigned int            (*serial_in)(struct uart_port *, int);
     122                 :            :         void                    (*serial_out)(struct uart_port *, int, int);
     123                 :            :         void                    (*set_termios)(struct uart_port *,
     124                 :            :                                                struct ktermios *new,
     125                 :            :                                                struct ktermios *old);
     126                 :            :         int                     (*handle_irq)(struct uart_port *);
     127                 :            :         void                    (*pm)(struct uart_port *, unsigned int state,
     128                 :            :                                       unsigned int old);
     129                 :            :         void                    (*handle_break)(struct uart_port *);
     130                 :            :         unsigned int            irq;                    /* irq number */
     131                 :            :         unsigned long           irqflags;               /* irq flags  */
     132                 :            :         unsigned int            uartclk;                /* base uart clock */
     133                 :            :         unsigned int            fifosize;               /* tx fifo size */
     134                 :            :         unsigned char           x_char;                 /* xon/xoff char */
     135                 :            :         unsigned char           regshift;               /* reg offset shift */
     136                 :            :         unsigned char           iotype;                 /* io access style */
     137                 :            :         unsigned char           unused1;
     138                 :            : 
     139                 :            : #define UPIO_PORT               (0)
     140                 :            : #define UPIO_HUB6               (1)
     141                 :            : #define UPIO_MEM                (2)
     142                 :            : #define UPIO_MEM32              (3)
     143                 :            : #define UPIO_AU                 (4)                     /* Au1x00 and RT288x type IO */
     144                 :            : #define UPIO_TSI                (5)                     /* Tsi108/109 type IO */
     145                 :            : 
     146                 :            :         unsigned int            read_status_mask;       /* driver specific */
     147                 :            :         unsigned int            ignore_status_mask;     /* driver specific */
     148                 :            :         struct uart_state       *state;                 /* pointer to parent state */
     149                 :            :         struct uart_icount      icount;                 /* statistics */
     150                 :            : 
     151                 :            :         struct console          *cons;                  /* struct console, if any */
     152                 :            : #if defined(CONFIG_SERIAL_CORE_CONSOLE) || defined(SUPPORT_SYSRQ)
     153                 :            :         unsigned long           sysrq;                  /* sysrq timeout */
     154                 :            : #endif
     155                 :            : 
     156                 :            :         upf_t                   flags;
     157                 :            : 
     158                 :            : #define UPF_FOURPORT            ((__force upf_t) (1 << 1))
     159                 :            : #define UPF_SAK                 ((__force upf_t) (1 << 2))
     160                 :            : #define UPF_SPD_MASK            ((__force upf_t) (0x1030))
     161                 :            : #define UPF_SPD_HI              ((__force upf_t) (0x0010))
     162                 :            : #define UPF_SPD_VHI             ((__force upf_t) (0x0020))
     163                 :            : #define UPF_SPD_CUST            ((__force upf_t) (0x0030))
     164                 :            : #define UPF_SPD_SHI             ((__force upf_t) (0x1000))
     165                 :            : #define UPF_SPD_WARP            ((__force upf_t) (0x1010))
     166                 :            : #define UPF_SKIP_TEST           ((__force upf_t) (1 << 6))
     167                 :            : #define UPF_AUTO_IRQ            ((__force upf_t) (1 << 7))
     168                 :            : #define UPF_HARDPPS_CD          ((__force upf_t) (1 << 11))
     169                 :            : #define UPF_LOW_LATENCY         ((__force upf_t) (1 << 13))
     170                 :            : #define UPF_BUGGY_UART          ((__force upf_t) (1 << 14))
     171                 :            : #define UPF_NO_TXEN_TEST        ((__force upf_t) (1 << 15))
     172                 :            : #define UPF_MAGIC_MULTIPLIER    ((__force upf_t) (1 << 16))
     173                 :            : /* Port has hardware-assisted h/w flow control (iow, auto-RTS *not* auto-CTS) */
     174                 :            : #define UPF_HARD_FLOW           ((__force upf_t) (1 << 21))
     175                 :            : /* Port has hardware-assisted s/w flow control */
     176                 :            : #define UPF_SOFT_FLOW           ((__force upf_t) (1 << 22))
     177                 :            : #define UPF_CONS_FLOW           ((__force upf_t) (1 << 23))
     178                 :            : #define UPF_SHARE_IRQ           ((__force upf_t) (1 << 24))
     179                 :            : #define UPF_EXAR_EFR            ((__force upf_t) (1 << 25))
     180                 :            : #define UPF_BUG_THRE            ((__force upf_t) (1 << 26))
     181                 :            : /* The exact UART type is known and should not be probed.  */
     182                 :            : #define UPF_FIXED_TYPE          ((__force upf_t) (1 << 27))
     183                 :            : #define UPF_BOOT_AUTOCONF       ((__force upf_t) (1 << 28))
     184                 :            : #define UPF_FIXED_PORT          ((__force upf_t) (1 << 29))
     185                 :            : #define UPF_DEAD                ((__force upf_t) (1 << 30))
     186                 :            : #define UPF_IOREMAP             ((__force upf_t) (1 << 31))
     187                 :            : 
     188                 :            : #define UPF_CHANGE_MASK         ((__force upf_t) (0x17fff))
     189                 :            : #define UPF_USR_MASK            ((__force upf_t) (UPF_SPD_MASK|UPF_LOW_LATENCY))
     190                 :            : 
     191                 :            :         unsigned int            mctrl;                  /* current modem ctrl settings */
     192                 :            :         unsigned int            timeout;                /* character-based timeout */
     193                 :            :         unsigned int            type;                   /* port type */
     194                 :            :         const struct uart_ops   *ops;
     195                 :            :         unsigned int            custom_divisor;
     196                 :            :         unsigned int            line;                   /* port index */
     197                 :            :         resource_size_t         mapbase;                /* for ioremap */
     198                 :            :         struct device           *dev;                   /* parent device */
     199                 :            :         unsigned char           hub6;                   /* this should be in the 8250 driver */
     200                 :            :         unsigned char           suspended;
     201                 :            :         unsigned char           irq_wake;
     202                 :            :         unsigned char           unused[2];
     203                 :            :         void                    *private_data;          /* generic platform data pointer */
     204                 :            : };
     205                 :            : 
     206                 :            : static inline int serial_port_in(struct uart_port *up, int offset)
     207                 :            : {
     208                 :            :         return up->serial_in(up, offset);
     209                 :            : }
     210                 :            : 
     211                 :            : static inline void serial_port_out(struct uart_port *up, int offset, int value)
     212                 :            : {
     213                 :            :         up->serial_out(up, offset, value);
     214                 :            : }
     215                 :            : 
     216                 :            : /**
     217                 :            :  * enum uart_pm_state - power states for UARTs
     218                 :            :  * @UART_PM_STATE_ON: UART is powered, up and operational
     219                 :            :  * @UART_PM_STATE_OFF: UART is powered off
     220                 :            :  * @UART_PM_STATE_UNDEFINED: sentinel
     221                 :            :  */
     222                 :            : enum uart_pm_state {
     223                 :            :         UART_PM_STATE_ON = 0,
     224                 :            :         UART_PM_STATE_OFF = 3, /* number taken from ACPI */
     225                 :            :         UART_PM_STATE_UNDEFINED,
     226                 :            : };
     227                 :            : 
     228                 :            : /*
     229                 :            :  * This is the state information which is persistent across opens.
     230                 :            :  */
     231                 :            : struct uart_state {
     232                 :            :         struct tty_port         port;
     233                 :            : 
     234                 :            :         enum uart_pm_state      pm_state;
     235                 :            :         struct circ_buf         xmit;
     236                 :            : 
     237                 :            :         struct uart_port        *uart_port;
     238                 :            : };
     239                 :            : 
     240                 :            : #define UART_XMIT_SIZE  PAGE_SIZE
     241                 :            : 
     242                 :            : 
     243                 :            : /* number of characters left in xmit buffer before we ask for more */
     244                 :            : #define WAKEUP_CHARS            256
     245                 :            : 
     246                 :            : struct module;
     247                 :            : struct tty_driver;
     248                 :            : 
     249                 :            : struct uart_driver {
     250                 :            :         struct module           *owner;
     251                 :            :         const char              *driver_name;
     252                 :            :         const char              *dev_name;
     253                 :            :         int                      major;
     254                 :            :         int                      minor;
     255                 :            :         int                      nr;
     256                 :            :         struct console          *cons;
     257                 :            : 
     258                 :            :         /*
     259                 :            :          * these are private; the low level driver should not
     260                 :            :          * touch these; they should be initialised to NULL
     261                 :            :          */
     262                 :            :         struct uart_state       *state;
     263                 :            :         struct tty_driver       *tty_driver;
     264                 :            : };
     265                 :            : 
     266                 :            : void uart_write_wakeup(struct uart_port *port);
     267                 :            : 
     268                 :            : /*
     269                 :            :  * Baud rate helpers.
     270                 :            :  */
     271                 :            : void uart_update_timeout(struct uart_port *port, unsigned int cflag,
     272                 :            :                          unsigned int baud);
     273                 :            : unsigned int uart_get_baud_rate(struct uart_port *port, struct ktermios *termios,
     274                 :            :                                 struct ktermios *old, unsigned int min,
     275                 :            :                                 unsigned int max);
     276                 :            : unsigned int uart_get_divisor(struct uart_port *port, unsigned int baud);
     277                 :            : 
     278                 :            : /* Base timer interval for polling */
     279                 :            : static inline int uart_poll_timeout(struct uart_port *port)
     280                 :            : {
     281                 :            :         int timeout = port->timeout;
     282                 :            : 
     283                 :            :         return timeout > 6 ? (timeout / 2 - 2) : 1;
     284                 :            : }
     285                 :            : 
     286                 :            : /*
     287                 :            :  * Console helpers.
     288                 :            :  */
     289                 :            : struct uart_port *uart_get_console(struct uart_port *ports, int nr,
     290                 :            :                                    struct console *c);
     291                 :            : void uart_parse_options(char *options, int *baud, int *parity, int *bits,
     292                 :            :                         int *flow);
     293                 :            : int uart_set_options(struct uart_port *port, struct console *co, int baud,
     294                 :            :                      int parity, int bits, int flow);
     295                 :            : struct tty_driver *uart_console_device(struct console *co, int *index);
     296                 :            : void uart_console_write(struct uart_port *port, const char *s,
     297                 :            :                         unsigned int count,
     298                 :            :                         void (*putchar)(struct uart_port *, int));
     299                 :            : 
     300                 :            : /*
     301                 :            :  * Port/driver registration/removal
     302                 :            :  */
     303                 :            : int uart_register_driver(struct uart_driver *uart);
     304                 :            : void uart_unregister_driver(struct uart_driver *uart);
     305                 :            : int uart_add_one_port(struct uart_driver *reg, struct uart_port *port);
     306                 :            : int uart_remove_one_port(struct uart_driver *reg, struct uart_port *port);
     307                 :            : int uart_match_port(struct uart_port *port1, struct uart_port *port2);
     308                 :            : 
     309                 :            : /*
     310                 :            :  * Power Management
     311                 :            :  */
     312                 :            : int uart_suspend_port(struct uart_driver *reg, struct uart_port *port);
     313                 :            : int uart_resume_port(struct uart_driver *reg, struct uart_port *port);
     314                 :            : 
     315                 :            : #define uart_circ_empty(circ)           ((circ)->head == (circ)->tail)
     316                 :            : #define uart_circ_clear(circ)           ((circ)->head = (circ)->tail = 0)
     317                 :            : 
     318                 :            : #define uart_circ_chars_pending(circ)   \
     319                 :            :         (CIRC_CNT((circ)->head, (circ)->tail, UART_XMIT_SIZE))
     320                 :            : 
     321                 :            : #define uart_circ_chars_free(circ)      \
     322                 :            :         (CIRC_SPACE((circ)->head, (circ)->tail, UART_XMIT_SIZE))
     323                 :            : 
     324                 :            : static inline int uart_tx_stopped(struct uart_port *port)
     325                 :            : {
     326                 :       5837 :         struct tty_struct *tty = port->state->port.tty;
     327         [ +  - ]:       5837 :         if(tty->stopped || tty->hw_stopped)
     328                 :            :                 return 1;
     329                 :            :         return 0;
     330                 :            : }
     331                 :            : 
     332                 :            : /*
     333                 :            :  * The following are helper functions for the low level drivers.
     334                 :            :  */
     335                 :            : 
     336                 :            : extern void uart_handle_dcd_change(struct uart_port *uport,
     337                 :            :                 unsigned int status);
     338                 :            : extern void uart_handle_cts_change(struct uart_port *uport,
     339                 :            :                 unsigned int status);
     340                 :            : 
     341                 :            : extern void uart_insert_char(struct uart_port *port, unsigned int status,
     342                 :            :                  unsigned int overrun, unsigned int ch, unsigned int flag);
     343                 :            : 
     344                 :            : #ifdef SUPPORT_SYSRQ
     345                 :            : static inline int
     346                 :            : uart_handle_sysrq_char(struct uart_port *port, unsigned int ch)
     347                 :            : {
     348         [ -  + ]:       1024 :         if (port->sysrq) {
     349 [ #  # ][ #  # ]:          0 :                 if (ch && time_before(jiffies, port->sysrq)) {
     350                 :          0 :                         handle_sysrq(ch);
     351                 :          0 :                         port->sysrq = 0;
     352                 :            :                         return 1;
     353                 :            :                 }
     354                 :          0 :                 port->sysrq = 0;
     355                 :            :         }
     356                 :            :         return 0;
     357                 :            : }
     358                 :            : #else
     359                 :            : #define uart_handle_sysrq_char(port,ch) ({ (void)port; 0; })
     360                 :            : #endif
     361                 :            : 
     362                 :            : /*
     363                 :            :  * We do the SysRQ and SAK checking like this...
     364                 :            :  */
     365                 :            : static inline int uart_handle_break(struct uart_port *port)
     366                 :            : {
     367                 :          0 :         struct uart_state *state = port->state;
     368                 :            : 
     369         [ #  # ]:          0 :         if (port->handle_break)
     370                 :          0 :                 port->handle_break(port);
     371                 :            : 
     372                 :            : #ifdef SUPPORT_SYSRQ
     373 [ -  + ][ #  # ]:        526 :         if (port->cons && port->cons->index == port->line) {
     374         [ #  # ]:          0 :                 if (!port->sysrq) {
     375                 :          0 :                         port->sysrq = jiffies + HZ*5;
     376                 :            :                         return 1;
     377                 :            :                 }
     378                 :          0 :                 port->sysrq = 0;
     379                 :            :         }
     380                 :            : #endif
     381         [ -  + ]:        526 :         if (port->flags & UPF_SAK)
     382                 :          0 :                 do_SAK(state->port.tty);
     383                 :            :         return 0;
     384                 :            : }
     385                 :            : 
     386                 :            : /*
     387                 :            :  *      UART_ENABLE_MS - determine if port should enable modem status irqs
     388                 :            :  */
     389                 :            : #define UART_ENABLE_MS(port,cflag)      ((port)->flags & UPF_HARDPPS_CD || \
     390                 :            :                                          (cflag) & CRTSCTS || \
     391                 :            :                                          !((cflag) & CLOCAL))
     392                 :            : 
     393                 :            : #endif /* LINUX_SERIAL_CORE_H */

Generated by: LCOV version 1.9