/* $NetBSD: imxuartvar.h,v 1.6 2017/09/08 05:29:12 hkenken Exp $ */ /* * driver include for Freescale i.MX31 and i.MX31L UARTs */ /* * Copyright (c) 2009, 2010 Genetec Corporation. All rights reserved. * Written by Hiroyuki Bessho for Genetec Corporation. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY GENETEC CORPORATION ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GENETEC CORPORATION * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * */ #ifndef _IMXUARTVAR_H #define _IMXUARTVAR_H #include #include /* for tcflag_t */ 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; /* target value for UCR2 */ uint32_t sc_ucr[4]; /* cached value of UCRn */ #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; /* Hardware flag masks */ #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) /* increment ringbuffer pointer */ #define IMXUART_RBUF_INC(sc,v,i) (((v) + (i))&((sc->sc_rbuf_size)-1)) u_int sc_r_lowat; u_int sc_r_hiwat; /* output chunk */ u_char *sc_tba; u_int sc_tbc; u_int sc_heldtbc; /* pending parameter changes */ 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; /* interrupt handler */ void *sc_si; /* soft interrupt */ struct tty *sc_tty; /* power management hooks */ 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; /* UBIR */ uint16_t modulator; /* UBMR */ } 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 *); /* * Set platform dependent values */ void imxuart_set_frequency(u_int, u_int); /* * defined in imx51uart.c and imx31uart.c */ 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 /* _IMXUARTVAR_H */