/* Derived from asm-generic/termbits.h */

#ifndef GENERIC_TERMBITS_H
#define GENERIC_TERMBITS_H

typedef unsigned char   target_cc_t;        /* cc_t */
typedef unsigned int    target_speed_t;     /* speed_t */
typedef unsigned int    target_tcflag_t;    /* tcflag_t */

#define TARGET_NCCS 19

struct target_termios {
    target_tcflag_t c_iflag;         /* input mode flags */
    target_tcflag_t c_oflag;         /* output mode flags */
    target_tcflag_t c_cflag;         /* control mode flags */
    target_tcflag_t c_lflag;         /* local mode flags */
    target_cc_t c_line;              /* line discipline */
    target_cc_t c_cc[TARGET_NCCS];   /* control characters */
};

struct target_termios2 {
    target_tcflag_t c_iflag;       /* input mode flags */
    target_tcflag_t c_oflag;       /* output mode flags */
    target_tcflag_t c_cflag;       /* control mode flags */
    target_tcflag_t c_lflag;       /* local mode flags */
    target_cc_t c_line;            /* line discipline */
    target_cc_t c_cc[TARGET_NCCS]; /* control characters */
    target_speed_t c_ispeed;       /* input speed */
    target_speed_t c_ospeed;       /* output speed */
};

struct target_ktermios {
    target_tcflag_t c_iflag;       /* input mode flags */
    target_tcflag_t c_oflag;       /* output mode flags */
    target_tcflag_t c_cflag;       /* control mode flags */
    target_tcflag_t c_lflag;       /* local mode flags */
    target_cc_t c_line;            /* line discipline */
    target_cc_t c_cc[TARGET_NCCS]; /* control characters */
    target_speed_t c_ispeed;       /* input speed */
    target_speed_t c_ospeed;       /* output speed */
};

/* c_cc character offsets */
#define TARGET_VINTR    0
#define TARGET_VQUIT    1
#define TARGET_VERASE   2
#define TARGET_VKILL    3
#define TARGET_VEOF     4
#define TARGET_VTIME    5
#define TARGET_VMIN     6
#define TARGET_VSWTC    7
#define TARGET_VSTART   8
#define TARGET_VSTOP    9
#define TARGET_VSUSP    10
#define TARGET_VEOL     11
#define TARGET_VREPRINT 12
#define TARGET_VDISCARD 13
#define TARGET_VWERASE  14
#define TARGET_VLNEXT   15
#define TARGET_VEOL2    16

/* c_iflag bits */
#define TARGET_IGNBRK   0000001
#define TARGET_BRKINT   0000002
#define TARGET_IGNPAR   0000004
#define TARGET_PARMRK   0000010
#define TARGET_INPCK    0000020
#define TARGET_ISTRIP   0000040
#define TARGET_INLCR    0000100
#define TARGET_IGNCR    0000200
#define TARGET_ICRNL    0000400
#define TARGET_IUCLC    0001000
#define TARGET_IXON     0002000
#define TARGET_IXANY    0004000
#define TARGET_IXOFF    0010000
#define TARGET_IMAXBEL  0020000
#define TARGET_IUTF8    0040000

/* c_oflag bits */
#define TARGET_OPOST    0000001
#define TARGET_OLCUC    0000002
#define TARGET_ONLCR    0000004
#define TARGET_OCRNL    0000010
#define TARGET_ONOCR    0000020
#define TARGET_ONLRET   0000040
#define TARGET_OFILL    0000100
#define TARGET_OFDEL    0000200
#define TARGET_NLDLY    0000400
#define  TARGET_NL0     0000000
#define  TARGET_NL1     0000400
#define TARGET_CRDLY    0003000
#define  TARGET_CR0     0000000
#define  TARGET_CR1     0001000
#define  TARGET_CR2     0002000
#define  TARGET_CR3     0003000
#define TARGET_TABDLY   0014000
#define  TARGET_TAB0    0000000
#define  TARGET_TAB1    0004000
#define  TARGET_TAB2    0010000
#define  TARGET_TAB3    0014000
#define  TARGET_XTABS   0014000
#define TARGET_BSDLY    0020000
#define  TARGET_BS0     0000000
#define  TARGET_BS1     0020000
#define TARGET_VTDLY    0040000
#define  TARGET_VT0     0000000
#define  TARGET_VT1     0040000
#define TARGET_FFDLY    0100000
#define  TARGET_FF0     0000000
#define  TARGET_FF1     0100000

/* c_cflag bit meaning */
#define TARGET_CBAUD      0010017
#define  TARGET_B0        0000000  /* hang up */
#define  TARGET_B50       0000001
#define  TARGET_B75       0000002
#define  TARGET_B110      0000003
#define  TARGET_B134      0000004
#define  TARGET_B150      0000005
#define  TARGET_B200      0000006
#define  TARGET_B300      0000007
#define  TARGET_B600      0000010
#define  TARGET_B1200     0000011
#define  TARGET_B1800     0000012
#define  TARGET_B2400     0000013
#define  TARGET_B4800     0000014
#define  TARGET_B9600     0000015
#define  TARGET_B19200    0000016
#define  TARGET_B38400    0000017
#define  TARGET_EXTA      TARGET_B19200
#define  TARGET_EXTB      TARGET_B38400
#define TARGET_CSIZE      0000060
#define  TARGET_CS5       0000000
#define  TARGET_CS6       0000020
#define  TARGET_CS7       0000040
#define  TARGET_CS8       0000060
#define TARGET_CSTOPB     0000100
#define TARGET_CREAD      0000200
#define TARGET_PARENB     0000400
#define TARGET_PARODD     0001000
#define TARGET_HUPCL      0002000
#define TARGET_CLOCAL     0004000
#define TARGET_CBAUDEX    0010000
#define  TARGET_BOTHER    0010000
#define  TARGET_B57600    0010001
#define  TARGET_B115200   0010002
#define  TARGET_B230400   0010003
#define  TARGET_B460800   0010004
#define  TARGET_B500000   0010005
#define  TARGET_B576000   0010006
#define  TARGET_B921600   0010007
#define  TARGET_B1000000  0010010
#define  TARGET_B1152000  0010011
#define  TARGET_B1500000  0010012
#define  TARGET_B2000000  0010013
#define  TARGET_B2500000  0010014
#define  TARGET_B3000000  0010015
#define  TARGET_B3500000  0010016
#define  TARGET_B4000000  0010017
#define TARGET_CIBAUD     002003600000  /* input baud rate (not used) */
#define TARGET_CMSPAR     010000000000  /* mark or space (stick) parity */
#define TARGET_CRTSCTS    020000000000  /* flow control */

#define TARGET_IBSHIFT    16            /* Shift from CBAUD to CIBAUD */

/* c_lflag bits */
#define TARGET_ISIG       0000001
#define TARGET_ICANON     0000002
#define TARGET_XCASE      0000004
#define TARGET_ECHO       0000010
#define TARGET_ECHOE      0000020
#define TARGET_ECHOK      0000040
#define TARGET_ECHONL     0000100
#define TARGET_NOFLSH     0000200
#define TARGET_TOSTOP     0000400
#define TARGET_ECHOCTL    0001000
#define TARGET_ECHOPRT    0002000
#define TARGET_ECHOKE     0004000
#define TARGET_FLUSHO     0010000
#define TARGET_PENDIN     0040000
#define TARGET_IEXTEN     0100000
#define TARGET_EXTPROC    0200000

/* tcflow() and TCXONC use these */
#define TARGET_TCOOFF          0
#define TARGET_TCOON           1
#define TARGET_TCIOFF          2
#define TARGET_TCION           3

/* tcflush() and TCFLSH use these */
#define TARGET_TCIFLUSH        0
#define TARGET_TCOFLUSH        1
#define TARGET_TCIOFLUSH       2

/* tcsetattr uses these */
#define TARGET_TCSANOW         0
#define TARGET_TCSADRAIN       1
#define TARGET_TCSAFLUSH       2

/* Derived from include/uapi/asm-generic/ioctls.h */

#define TARGET_TCGETS           0x5401
#define TARGET_TCSETS           0x5402
#define TARGET_TCSETSW          0x5403
#define TARGET_TCSETSF          0x5404
#define TARGET_TCGETA           0x5405
#define TARGET_TCSETA           0x5406
#define TARGET_TCSETAW          0x5407
#define TARGET_TCSETAF          0x5408
#define TARGET_TCSBRK           0x5409
#define TARGET_TCXONC           0x540A
#define TARGET_TCFLSH           0x540B

#define TARGET_TIOCEXCL         0x540C
#define TARGET_TIOCNXCL         0x540D
#define TARGET_TIOCSCTTY        0x540E
#define TARGET_TIOCGPGRP        0x540F
#define TARGET_TIOCSPGRP        0x5410
#define TARGET_TIOCOUTQ         0x5411
#define TARGET_TIOCSTI          0x5412
#define TARGET_TIOCGWINSZ       0x5413
#define TARGET_TIOCSWINSZ       0x5414
#define TARGET_TIOCMGET         0x5415
#define TARGET_TIOCMBIS         0x5416
#define TARGET_TIOCMBIC         0x5417
#define TARGET_TIOCMSET         0x5418
#define TARGET_TIOCGSOFTCAR     0x5419
#define TARGET_TIOCSSOFTCAR     0x541A
#define TARGET_FIONREAD         0x541B
#define TARGET_TIOCINQ          TARGET_FIONREAD
#define TARGET_TIOCLINUX        0x541C
#define TARGET_TIOCCONS         0x541D
#define TARGET_TIOCGSERIAL      0x541E
#define TARGET_TIOCSSERIAL      0x541F
#define TARGET_TIOCPKT          0x5420
#define TARGET_FIONBIO          0x5421
#define TARGET_TIOCNOTTY        0x5422
#define TARGET_TIOCSETD         0x5423
#define TARGET_TIOCGETD         0x5424
#define TARGET_TCSBRKP          0x5425 /* Needed for POSIX tcsendbreak() */
#define TARGET_TIOCTTYGSTRUCT   0x5426 /* For debugging only */
#define TARGET_TIOCSBRK         0x5427 /* BSD compatibility */
#define TARGET_TIOCCBRK         0x5428 /* BSD compatibility */
#define TARGET_TIOCGSID         0x5429 /* Return the session ID of FD */
#define TARGET_TCGETS2          TARGET_IOR('T', 0x2A, struct target_termios2)
#define TARGET_TCSETS2          TARGET_IOW('T', 0x2B, struct target_termios2)
#define TARGET_TCSETSW2         TARGET_IOW('T', 0x2C, struct target_termios2)
#define TARGET_TCSETSF2         TARGET_IOW('T', 0x2D, struct target_termios2)
#define TARGET_TIOCGRS485       0x542E
#ifndef TARGET_TIOCSRS485
#define TARGET_TIOCSRS485       0x542F
#endif
/* Get Pty Number (of pty-mux device) */
#define TARGET_TIOCGPTN         TARGET_IOR('T', 0x30, unsigned int)
/* Lock/unlock Pty */
#define TARGET_TIOCSPTLCK       TARGET_IOW('T', 0x31, int)

/* Get primary device node of /dev/console */
#define TARGET_TIOCGDEV        TARGET_IOR('T', 0x32, unsigned int)
#define TARGET_TCGETX          0x5432 /* SYS5 TCGETX compatibility */
#define TARGET_TCSETX          0x5433
#define TARGET_TCSETXF         0x5434
#define TARGET_TCSETXW         0x5435
/* pty: generate signal */
#define TARGET_TIOCSIG         TARGET_IOW('T', 0x36, int)
#define TARGET_TIOCVHANGUP     0x5437
/* Get packet mode state */
#define TARGET_TIOCGPKT        TARGET_IOR('T', 0x38, int)
/* Get Pty lock state */
#define TARGET_TIOCGPTLCK      TARGET_IOR('T', 0x39, int)
/* Get exclusive mode state */
#define TARGET_TIOCGEXCL       TARGET_IOR('T', 0x40, int)
/* Safely open the slave */
#define TARGET_TIOCGPTPEER     TARGET_IO('T', 0x41)
#define TARGET_TIOCGISO7816    TARGET_IOR('T', 0x42, struct serial_iso7816)
#define TARGET_TIOCSISO7816    TARGET_IOWR('T', 0x43, struct serial_iso7816)

#define TARGET_FIONCLEX         0x5450 /* these numbers need to be adjusted */
#define TARGET_FIOCLEX          0x5451
#define TARGET_FIOASYNC         0x5452
#define TARGET_TIOCSERCONFIG    0x5453
#define TARGET_TIOCSERGWILD     0x5454
#define TARGET_TIOCSERSWILD     0x5455
#define TARGET_TIOCGLCKTRMIOS   0x5456
#define TARGET_TIOCSLCKTRMIOS   0x5457
#define TARGET_TIOCSERGSTRUCT   0x5458 /* For debugging only */
#define TARGET_TIOCSERGETLSR    0x5459 /* Get line status register */
#define TARGET_TIOCSERGETMULTI  0x545A /* Get multiport config  */
#define TARGET_TIOCSERSETMULTI  0x545B /* Set multiport config */

/* wait for a change on serial input line(s) */
#define TARGET_TIOCMIWAIT       0x545C
/* read serial port inline interrupt counts */
#define TARGET_TIOCGICOUNT      0x545D
#define TARGET_TIOCGHAYESESP    0x545E  /* Get Hayes ESP configuration */
#define TARGET_TIOCSHAYESESP    0x545F  /* Set Hayes ESP configuration */

/*
 * Some arches already define TARGET_FIOQSIZE due to a historical
 * conflict with a Hayes modem-specific ioctl value.
 */
#ifndef TARGET_FIOQSIZE
# define TARGET_FIOQSIZE        0x5460
#endif

/* Used for packet mode */
#define TARGET_TIOCPKT_DATA              0
#define TARGET_TIOCPKT_FLUSHREAD         1
#define TARGET_TIOCPKT_FLUSHWRITE        2
#define TARGET_TIOCPKT_STOP              4
#define TARGET_TIOCPKT_START             8
#define TARGET_TIOCPKT_NOSTOP            16
#define TARGET_TIOCPKT_DOSTOP            32
#define TARGET_TIOCPKT_IOCTL             64

#define TARGET_TIOCSER_TEMT     0x01 /* Transmitter physically empty */

#endif
