#ifndef _IMXUARTVAR_H
#define _IMXUARTVAR_H
#include <sys/cdefs.h>
#include <sys/termios.h>
struct imxuart_softc {
device_t sc_dev;
int sc_unit;
struct imxuart_regs {
bus_space_tag_t ur_iot;
bus_space_handle_t ur_ioh;
bus_addr_t ur_iobase;
#if 0
bus_size_t ur_nports;
bus_size_t ur_map[16];
#endif
} sc_regs;
#define sc_bt sc_regs.ur_iot
#define sc_bh sc_regs.ur_ioh
uint32_t sc_intrspec_enb;
uint32_t sc_ucr2_d;
uint32_t sc_ucr[4];
#define sc_ucr1 sc_ucr[0]
#define sc_ucr2 sc_ucr[1]
#define sc_ucr3 sc_ucr[2]
#define sc_ucr4 sc_ucr[3]
uint sc_init_cnt;
bus_addr_t sc_addr;
bus_size_t sc_size;
int sc_intr;
u_char sc_hwflags;
#define IMXUART_HW_FLOW __BIT(0)
#define IMXUART_HW_DEV_OK __BIT(1)
#define IMXUART_HW_CONSOLE __BIT(2)
#define IMXUART_HW_KGDB __BIT(3)
bool enabled;
u_char sc_swflags;
u_char sc_rx_flags;
#define IMXUART_RX_TTY_BLOCKED __BIT(0)
#define IMXUART_RX_TTY_OVERFLOWED __BIT(1)
#define IMXUART_RX_IBUF_BLOCKED __BIT(2)
#define IMXUART_RX_IBUF_OVERFLOWED __BIT(3)
#define IMXUART_RX_ANY_BLOCK \
(IMXUART_RX_TTY_BLOCKED|IMXUART_RX_TTY_OVERFLOWED| \
IMXUART_RX_IBUF_BLOCKED|IMXUART_RX_IBUF_OVERFLOWED)
bool sc_tx_busy, sc_tx_done, sc_tx_stopped;
bool sc_rx_ready,sc_st_check;
u_short sc_txfifo_len, sc_txfifo_thresh;
uint16_t *sc_rbuf;
u_int sc_rbuf_size;
u_int sc_rbuf_in;
u_int sc_rbuf_out;
#define IMXUART_RBUF_AVAIL(sc) \
((sc->sc_rbuf_out <= sc->sc_rbuf_in) ? \
(sc->sc_rbuf_in - sc->sc_rbuf_out) : \
(sc->sc_rbuf_size - (sc->sc_rbuf_out - sc->sc_rbuf_in)))
#define IMXUART_RBUF_SPACE(sc) \
((sc->sc_rbuf_in <= sc->sc_rbuf_out ? \
sc->sc_rbuf_size - (sc->sc_rbuf_out - sc->sc_rbuf_in) : \
sc->sc_rbuf_in - sc->sc_rbuf_out) - 1)
#define IMXUART_RBUF_INC(sc,v,i) (((v) + (i))&((sc->sc_rbuf_size)-1))
u_int sc_r_lowat;
u_int sc_r_hiwat;
u_char *sc_tba;
u_int sc_tbc;
u_int sc_heldtbc;
u_char sc_pending;
#define IMXUART_PEND_PARAM __BIT(0)
#define IMXUART_PEND_SPEED __BIT(1)
struct callout sc_diag_callout;
kmutex_t sc_lock;
void *sc_ih;
void *sc_si;
struct tty *sc_tty;
int (*enable)(struct imxuart_softc *);
void (*disable)(struct imxuart_softc *);
struct {
ulong err;
ulong brk;
ulong prerr;
ulong frmerr;
ulong ovrrun;
} sc_errors;
struct imxuart_baudrate_ratio {
uint16_t numerator;
uint16_t modulator;
} sc_ratio;
};
void imxuart_attach_common(device_t parent, device_t self,
bus_space_tag_t, paddr_t, size_t, int, int);
int imxuart_kgdb_attach(bus_space_tag_t, paddr_t, u_int, tcflag_t);
int imxuart_cnattach(bus_space_tag_t, paddr_t, u_int, tcflag_t);
int imxuart_is_console(bus_space_tag_t, bus_addr_t, bus_space_handle_t *);
void imxuart_set_frequency(u_int, u_int);
int imxuart_match(device_t, cfdata_t, void *);
void imxuart_attach(device_t, device_t, void *);
void imxuart_attach_subr(struct imxuart_softc *);
int imxuintr(void *);
#endif