linux/include/linux/serial_core.h
<<
>>
Prefs
   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 * The type definitions.  These are from Ted Ts'o's serial.h
  25 */
  26#define PORT_UNKNOWN    0
  27#define PORT_8250       1
  28#define PORT_16450      2
  29#define PORT_16550      3
  30#define PORT_16550A     4
  31#define PORT_CIRRUS     5
  32#define PORT_16650      6
  33#define PORT_16650V2    7
  34#define PORT_16750      8
  35#define PORT_STARTECH   9
  36#define PORT_16C950     10
  37#define PORT_16654      11
  38#define PORT_16850      12
  39#define PORT_RSA        13
  40#define PORT_NS16550A   14
  41#define PORT_XSCALE     15
  42#define PORT_RM9000     16      /* PMC-Sierra RM9xxx internal UART */
  43#define PORT_MAX_8250   16      /* max port ID */
  44
  45/*
  46 * ARM specific type numbers.  These are not currently guaranteed
  47 * to be implemented, and will change in the future.  These are
  48 * separate so any additions to the old serial.c that occur before
  49 * we are merged can be easily merged here.
  50 */
  51#define PORT_PXA        31
  52#define PORT_AMBA       32
  53#define PORT_CLPS711X   33
  54#define PORT_SA1100     34
  55#define PORT_UART00     35
  56#define PORT_21285      37
  57
  58/* Sparc type numbers.  */
  59#define PORT_SUNZILOG   38
  60#define PORT_SUNSAB     39
  61
  62/* DEC */
  63#define PORT_DZ         46
  64#define PORT_ZS         47
  65
  66/* Parisc type numbers. */
  67#define PORT_MUX        48
  68
  69/* Atmel AT91 / AT32 SoC */
  70#define PORT_ATMEL      49
  71
  72/* Macintosh Zilog type numbers */
  73#define PORT_MAC_ZILOG  50      /* m68k : not yet implemented */
  74#define PORT_PMAC_ZILOG 51
  75
  76/* SH-SCI */
  77#define PORT_SCI        52
  78#define PORT_SCIF       53
  79#define PORT_IRDA       54
  80
  81/* Samsung S3C2410 SoC and derivatives thereof */
  82#define PORT_S3C2410    55
  83
  84/* SGI IP22 aka Indy / Challenge S / Indigo 2 */
  85#define PORT_IP22ZILOG  56
  86
  87/* Sharp LH7a40x -- an ARM9 SoC series */
  88#define PORT_LH7A40X    57
  89
  90/* PPC CPM type number */
  91#define PORT_CPM        58
  92
  93/* MPC52xx type numbers */
  94#define PORT_MPC52xx    59
  95
  96/* IBM icom */
  97#define PORT_ICOM       60
  98
  99/* Samsung S3C2440 SoC */
 100#define PORT_S3C2440    61
 101
 102/* Motorola i.MX SoC */
 103#define PORT_IMX        62
 104
 105/* Marvell MPSC */
 106#define PORT_MPSC       63
 107
 108/* TXX9 type number */
 109#define PORT_TXX9       64
 110
 111/* NEC VR4100 series SIU/DSIU */
 112#define PORT_VR41XX_SIU         65
 113#define PORT_VR41XX_DSIU        66
 114
 115/* Samsung S3C2400 SoC */
 116#define PORT_S3C2400    67
 117
 118/* M32R SIO */
 119#define PORT_M32R_SIO   68
 120
 121/*Digi jsm */
 122#define PORT_JSM        69
 123
 124#define PORT_PNX8XXX    70
 125
 126/* Hilscher netx */
 127#define PORT_NETX       71
 128
 129/* SUN4V Hypervisor Console */
 130#define PORT_SUNHV      72
 131
 132#define PORT_S3C2412    73
 133
 134/* Xilinx uartlite */
 135#define PORT_UARTLITE   74
 136
 137/* Blackfin bf5xx */
 138#define PORT_BFIN       75
 139
 140/* Micrel KS8695 */
 141#define PORT_KS8695     76
 142
 143/* Broadcom SB1250, etc. SOC */
 144#define PORT_SB1250_DUART       77
 145
 146/* Freescale ColdFire */
 147#define PORT_MCF        78
 148
 149/* Blackfin SPORT */
 150#define PORT_BFIN_SPORT         79
 151
 152/* MN10300 on-chip UART numbers */
 153#define PORT_MN10300            80
 154#define PORT_MN10300_CTS        81
 155
 156#define PORT_SC26XX     82
 157
 158#ifdef __KERNEL__
 159
 160#include <linux/compiler.h>
 161#include <linux/interrupt.h>
 162#include <linux/circ_buf.h>
 163#include <linux/spinlock.h>
 164#include <linux/sched.h>
 165#include <linux/tty.h>
 166#include <linux/mutex.h>
 167#include <linux/sysrq.h>
 168
 169struct uart_port;
 170struct uart_info;
 171struct serial_struct;
 172struct device;
 173
 174/*
 175 * This structure describes all the operations that can be
 176 * done on the physical hardware.
 177 */
 178struct uart_ops {
 179        unsigned int    (*tx_empty)(struct uart_port *);
 180        void            (*set_mctrl)(struct uart_port *, unsigned int mctrl);
 181        unsigned int    (*get_mctrl)(struct uart_port *);
 182        void            (*stop_tx)(struct uart_port *);
 183        void            (*start_tx)(struct uart_port *);
 184        void            (*send_xchar)(struct uart_port *, char ch);
 185        void            (*stop_rx)(struct uart_port *);
 186        void            (*enable_ms)(struct uart_port *);
 187        void            (*break_ctl)(struct uart_port *, int ctl);
 188        int             (*startup)(struct uart_port *);
 189        void            (*shutdown)(struct uart_port *);
 190        void            (*flush_buffer)(struct uart_port *);
 191        void            (*set_termios)(struct uart_port *, struct ktermios *new,
 192                                       struct ktermios *old);
 193        void            (*set_ldisc)(struct uart_port *);
 194        void            (*pm)(struct uart_port *, unsigned int state,
 195                              unsigned int oldstate);
 196        int             (*set_wake)(struct uart_port *, unsigned int state);
 197
 198        /*
 199         * Return a string describing the type of the port
 200         */
 201        const char *(*type)(struct uart_port *);
 202
 203        /*
 204         * Release IO and memory resources used by the port.
 205         * This includes iounmap if necessary.
 206         */
 207        void            (*release_port)(struct uart_port *);
 208
 209        /*
 210         * Request IO and memory resources used by the port.
 211         * This includes iomapping the port if necessary.
 212         */
 213        int             (*request_port)(struct uart_port *);
 214        void            (*config_port)(struct uart_port *, int);
 215        int             (*verify_port)(struct uart_port *, struct serial_struct *);
 216        int             (*ioctl)(struct uart_port *, unsigned int, unsigned long);
 217#ifdef CONFIG_CONSOLE_POLL
 218        void    (*poll_put_char)(struct uart_port *, unsigned char);
 219        int             (*poll_get_char)(struct uart_port *);
 220#endif
 221};
 222
 223#define UART_CONFIG_TYPE        (1 << 0)
 224#define UART_CONFIG_IRQ         (1 << 1)
 225
 226struct uart_icount {
 227        __u32   cts;
 228        __u32   dsr;
 229        __u32   rng;
 230        __u32   dcd;
 231        __u32   rx;
 232        __u32   tx;
 233        __u32   frame;
 234        __u32   overrun;
 235        __u32   parity;
 236        __u32   brk;
 237        __u32   buf_overrun;
 238};
 239
 240typedef unsigned int __bitwise__ upf_t;
 241
 242struct uart_port {
 243        spinlock_t              lock;                   /* port lock */
 244        unsigned int            iobase;                 /* in/out[bwl] */
 245        unsigned char __iomem   *membase;               /* read/write[bwl] */
 246        unsigned int            irq;                    /* irq number */
 247        unsigned int            uartclk;                /* base uart clock */
 248        unsigned int            fifosize;               /* tx fifo size */
 249        unsigned char           x_char;                 /* xon/xoff char */
 250        unsigned char           regshift;               /* reg offset shift */
 251        unsigned char           iotype;                 /* io access style */
 252        unsigned char           unused1;
 253
 254#define UPIO_PORT               (0)
 255#define UPIO_HUB6               (1)
 256#define UPIO_MEM                (2)
 257#define UPIO_MEM32              (3)
 258#define UPIO_AU                 (4)                     /* Au1x00 type IO */
 259#define UPIO_TSI                (5)                     /* Tsi108/109 type IO */
 260#define UPIO_DWAPB              (6)                     /* DesignWare APB UART */
 261#define UPIO_RM9000             (7)                     /* RM9000 type IO */
 262
 263        unsigned int            read_status_mask;       /* driver specific */
 264        unsigned int            ignore_status_mask;     /* driver specific */
 265        struct uart_info        *info;                  /* pointer to parent info */
 266        struct uart_icount      icount;                 /* statistics */
 267
 268        struct console          *cons;                  /* struct console, if any */
 269#ifdef CONFIG_SERIAL_CORE_CONSOLE
 270        unsigned long           sysrq;                  /* sysrq timeout */
 271#endif
 272
 273        upf_t                   flags;
 274
 275#define UPF_FOURPORT            ((__force upf_t) (1 << 1))
 276#define UPF_SAK                 ((__force upf_t) (1 << 2))
 277#define UPF_SPD_MASK            ((__force upf_t) (0x1030))
 278#define UPF_SPD_HI              ((__force upf_t) (0x0010))
 279#define UPF_SPD_VHI             ((__force upf_t) (0x0020))
 280#define UPF_SPD_CUST            ((__force upf_t) (0x0030))
 281#define UPF_SPD_SHI             ((__force upf_t) (0x1000))
 282#define UPF_SPD_WARP            ((__force upf_t) (0x1010))
 283#define UPF_SKIP_TEST           ((__force upf_t) (1 << 6))
 284#define UPF_AUTO_IRQ            ((__force upf_t) (1 << 7))
 285#define UPF_HARDPPS_CD          ((__force upf_t) (1 << 11))
 286#define UPF_LOW_LATENCY         ((__force upf_t) (1 << 13))
 287#define UPF_BUGGY_UART          ((__force upf_t) (1 << 14))
 288#define UPF_MAGIC_MULTIPLIER    ((__force upf_t) (1 << 16))
 289#define UPF_CONS_FLOW           ((__force upf_t) (1 << 23))
 290#define UPF_SHARE_IRQ           ((__force upf_t) (1 << 24))
 291#define UPF_BOOT_AUTOCONF       ((__force upf_t) (1 << 28))
 292#define UPF_FIXED_PORT          ((__force upf_t) (1 << 29))
 293#define UPF_DEAD                ((__force upf_t) (1 << 30))
 294#define UPF_IOREMAP             ((__force upf_t) (1 << 31))
 295
 296#define UPF_CHANGE_MASK         ((__force upf_t) (0x17fff))
 297#define UPF_USR_MASK            ((__force upf_t) (UPF_SPD_MASK|UPF_LOW_LATENCY))
 298
 299        unsigned int            mctrl;                  /* current modem ctrl settings */
 300        unsigned int            timeout;                /* character-based timeout */
 301        unsigned int            type;                   /* port type */
 302        const struct uart_ops   *ops;
 303        unsigned int            custom_divisor;
 304        unsigned int            line;                   /* port index */
 305        resource_size_t         mapbase;                /* for ioremap */
 306        struct device           *dev;                   /* parent device */
 307        unsigned char           hub6;                   /* this should be in the 8250 driver */
 308        unsigned char           suspended;
 309        unsigned char           unused[2];
 310        void                    *private_data;          /* generic platform data pointer */
 311};
 312
 313/*
 314 * This is the state information which is persistent across opens.
 315 * The low level driver must not to touch any elements contained
 316 * within.
 317 */
 318struct uart_state {
 319        unsigned int            close_delay;            /* msec */
 320        unsigned int            closing_wait;           /* msec */
 321
 322#define USF_CLOSING_WAIT_INF    (0)
 323#define USF_CLOSING_WAIT_NONE   (~0U)
 324
 325        int                     count;
 326        int                     pm_state;
 327        struct uart_info        *info;
 328        struct uart_port        *port;
 329
 330        struct mutex            mutex;
 331};
 332
 333#define UART_XMIT_SIZE  PAGE_SIZE
 334
 335typedef unsigned int __bitwise__ uif_t;
 336
 337/*
 338 * This is the state information which is only valid when the port
 339 * is open; it may be freed by the core driver once the device has
 340 * been closed.  Either the low level driver or the core can modify
 341 * stuff here.
 342 */
 343struct uart_info {
 344        struct tty_port         port;
 345        struct circ_buf         xmit;
 346        uif_t                   flags;
 347
 348/*
 349 * Definitions for info->flags.  These are _private_ to serial_core, and
 350 * are specific to this structure.  They may be queried by low level drivers.
 351 *
 352 * FIXME: use the ASY_ definitions
 353 */
 354#define UIF_CHECK_CD            ((__force uif_t) (1 << 25))
 355#define UIF_CTS_FLOW            ((__force uif_t) (1 << 26))
 356#define UIF_NORMAL_ACTIVE       ((__force uif_t) (1 << 29))
 357#define UIF_INITIALIZED         ((__force uif_t) (1 << 31))
 358#define UIF_SUSPENDED           ((__force uif_t) (1 << 30))
 359
 360        struct tasklet_struct   tlet;
 361        wait_queue_head_t       delta_msr_wait;
 362};
 363
 364/* number of characters left in xmit buffer before we ask for more */
 365#define WAKEUP_CHARS            256
 366
 367struct module;
 368struct tty_driver;
 369
 370struct uart_driver {
 371        struct module           *owner;
 372        const char              *driver_name;
 373        const char              *dev_name;
 374        int                      major;
 375        int                      minor;
 376        int                      nr;
 377        struct console          *cons;
 378
 379        /*
 380         * these are private; the low level driver should not
 381         * touch these; they should be initialised to NULL
 382         */
 383        struct uart_state       *state;
 384        struct tty_driver       *tty_driver;
 385};
 386
 387void uart_write_wakeup(struct uart_port *port);
 388
 389/*
 390 * Baud rate helpers.
 391 */
 392void uart_update_timeout(struct uart_port *port, unsigned int cflag,
 393                         unsigned int baud);
 394unsigned int uart_get_baud_rate(struct uart_port *port, struct ktermios *termios,
 395                                struct ktermios *old, unsigned int min,
 396                                unsigned int max);
 397unsigned int uart_get_divisor(struct uart_port *port, unsigned int baud);
 398
 399/*
 400 * Console helpers.
 401 */
 402struct uart_port *uart_get_console(struct uart_port *ports, int nr,
 403                                   struct console *c);
 404void uart_parse_options(char *options, int *baud, int *parity, int *bits,
 405                        int *flow);
 406int uart_set_options(struct uart_port *port, struct console *co, int baud,
 407                     int parity, int bits, int flow);
 408struct tty_driver *uart_console_device(struct console *co, int *index);
 409void uart_console_write(struct uart_port *port, const char *s,
 410                        unsigned int count,
 411                        void (*putchar)(struct uart_port *, int));
 412
 413/*
 414 * Port/driver registration/removal
 415 */
 416int uart_register_driver(struct uart_driver *uart);
 417void uart_unregister_driver(struct uart_driver *uart);
 418int uart_add_one_port(struct uart_driver *reg, struct uart_port *port);
 419int uart_remove_one_port(struct uart_driver *reg, struct uart_port *port);
 420int uart_match_port(struct uart_port *port1, struct uart_port *port2);
 421
 422/*
 423 * Power Management
 424 */
 425int uart_suspend_port(struct uart_driver *reg, struct uart_port *port);
 426int uart_resume_port(struct uart_driver *reg, struct uart_port *port);
 427
 428#define uart_circ_empty(circ)           ((circ)->head == (circ)->tail)
 429#define uart_circ_clear(circ)           ((circ)->head = (circ)->tail = 0)
 430
 431#define uart_circ_chars_pending(circ)   \
 432        (CIRC_CNT((circ)->head, (circ)->tail, UART_XMIT_SIZE))
 433
 434#define uart_circ_chars_free(circ)      \
 435        (CIRC_SPACE((circ)->head, (circ)->tail, UART_XMIT_SIZE))
 436
 437#define uart_tx_stopped(portp)          \
 438        ((portp)->info->port.tty->stopped || (portp)->info->port.tty->hw_stopped)
 439
 440/*
 441 * The following are helper functions for the low level drivers.
 442 */
 443static inline int
 444uart_handle_sysrq_char(struct uart_port *port, unsigned int ch)
 445{
 446#ifdef SUPPORT_SYSRQ
 447        if (port->sysrq) {
 448                if (ch && time_before(jiffies, port->sysrq)) {
 449                        handle_sysrq(ch, port->info ? port->info->port.tty : NULL);
 450                        port->sysrq = 0;
 451                        return 1;
 452                }
 453                port->sysrq = 0;
 454        }
 455#endif
 456        return 0;
 457}
 458#ifndef SUPPORT_SYSRQ
 459#define uart_handle_sysrq_char(port,ch) uart_handle_sysrq_char(port, 0)
 460#endif
 461
 462/*
 463 * We do the SysRQ and SAK checking like this...
 464 */
 465static inline int uart_handle_break(struct uart_port *port)
 466{
 467        struct uart_info *info = port->info;
 468#ifdef SUPPORT_SYSRQ
 469        if (port->cons && port->cons->index == port->line) {
 470                if (!port->sysrq) {
 471                        port->sysrq = jiffies + HZ*5;
 472                        return 1;
 473                }
 474                port->sysrq = 0;
 475        }
 476#endif
 477        if (port->flags & UPF_SAK)
 478                do_SAK(info->port.tty);
 479        return 0;
 480}
 481
 482/**
 483 *      uart_handle_dcd_change - handle a change of carrier detect state
 484 *      @port: uart_port structure for the open port
 485 *      @status: new carrier detect status, nonzero if active
 486 */
 487static inline void
 488uart_handle_dcd_change(struct uart_port *port, unsigned int status)
 489{
 490        struct uart_info *info = port->info;
 491
 492        port->icount.dcd++;
 493
 494#ifdef CONFIG_HARD_PPS
 495        if ((port->flags & UPF_HARDPPS_CD) && status)
 496                hardpps();
 497#endif
 498
 499        if (info->flags & UIF_CHECK_CD) {
 500                if (status)
 501                        wake_up_interruptible(&info->port.open_wait);
 502                else if (info->port.tty)
 503                        tty_hangup(info->port.tty);
 504        }
 505}
 506
 507/**
 508 *      uart_handle_cts_change - handle a change of clear-to-send state
 509 *      @port: uart_port structure for the open port
 510 *      @status: new clear to send status, nonzero if active
 511 */
 512static inline void
 513uart_handle_cts_change(struct uart_port *port, unsigned int status)
 514{
 515        struct uart_info *info = port->info;
 516        struct tty_struct *tty = info->port.tty;
 517
 518        port->icount.cts++;
 519
 520        if (info->flags & UIF_CTS_FLOW) {
 521                if (tty->hw_stopped) {
 522                        if (status) {
 523                                tty->hw_stopped = 0;
 524                                port->ops->start_tx(port);
 525                                uart_write_wakeup(port);
 526                        }
 527                } else {
 528                        if (!status) {
 529                                tty->hw_stopped = 1;
 530                                port->ops->stop_tx(port);
 531                        }
 532                }
 533        }
 534}
 535
 536#include <linux/tty_flip.h>
 537
 538static inline void
 539uart_insert_char(struct uart_port *port, unsigned int status,
 540                 unsigned int overrun, unsigned int ch, unsigned int flag)
 541{
 542        struct tty_struct *tty = port->info->port.tty;
 543
 544        if ((status & port->ignore_status_mask & ~overrun) == 0)
 545                tty_insert_flip_char(tty, ch, flag);
 546
 547        /*
 548         * Overrun is special.  Since it's reported immediately,
 549         * it doesn't affect the current character.
 550         */
 551        if (status & ~port->ignore_status_mask & overrun)
 552                tty_insert_flip_char(tty, 0, TTY_OVERRUN);
 553}
 554
 555/*
 556 *      UART_ENABLE_MS - determine if port should enable modem status irqs
 557 */
 558#define UART_ENABLE_MS(port,cflag)      ((port)->flags & UPF_HARDPPS_CD || \
 559                                         (cflag) & CRTSCTS || \
 560                                         !((cflag) & CLOCAL))
 561
 562#endif
 563
 564#endif /* LINUX_SERIAL_CORE_H */
 565
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.