1*4f4d98d9Shkenken /* $NetBSD: imxuartvar.h,v 1.6 2017/09/08 05:29:12 hkenken Exp $ */ 2825088edSmatt /* 3825088edSmatt * driver include for Freescale i.MX31 and i.MX31L UARTs 4825088edSmatt */ 55a80dc5fSbsh /* 65a80dc5fSbsh * Copyright (c) 2009, 2010 Genetec Corporation. All rights reserved. 75a80dc5fSbsh * Written by Hiroyuki Bessho for Genetec Corporation. 85a80dc5fSbsh * 95a80dc5fSbsh * Redistribution and use in source and binary forms, with or without 105a80dc5fSbsh * modification, are permitted provided that the following conditions 115a80dc5fSbsh * are met: 125a80dc5fSbsh * 1. Redistributions of source code must retain the above copyright 135a80dc5fSbsh * notice, this list of conditions and the following disclaimer. 145a80dc5fSbsh * 2. Redistributions in binary form must reproduce the above copyright 155a80dc5fSbsh * notice, this list of conditions and the following disclaimer in the 165a80dc5fSbsh * documentation and/or other materials provided with the distribution. 175a80dc5fSbsh * 185a80dc5fSbsh * THIS SOFTWARE IS PROVIDED BY GENETEC CORPORATION ``AS IS'' AND 195a80dc5fSbsh * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 205a80dc5fSbsh * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 215a80dc5fSbsh * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GENETEC CORPORATION 225a80dc5fSbsh * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 235a80dc5fSbsh * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 245a80dc5fSbsh * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 255a80dc5fSbsh * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 265a80dc5fSbsh * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 275a80dc5fSbsh * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 285a80dc5fSbsh * POSSIBILITY OF SUCH DAMAGE. 295a80dc5fSbsh * 305a80dc5fSbsh */ 315a80dc5fSbsh #ifndef _IMXUARTVAR_H 325a80dc5fSbsh #define _IMXUARTVAR_H 33825088edSmatt 34825088edSmatt 355a80dc5fSbsh #include <sys/cdefs.h> 365a80dc5fSbsh #include <sys/termios.h> /* for tcflag_t */ 37825088edSmatt 38*4f4d98d9Shkenken struct imxuart_softc { 39*4f4d98d9Shkenken device_t sc_dev; 40*4f4d98d9Shkenken 41*4f4d98d9Shkenken int sc_unit; 42*4f4d98d9Shkenken struct imxuart_regs { 43*4f4d98d9Shkenken bus_space_tag_t ur_iot; 44*4f4d98d9Shkenken bus_space_handle_t ur_ioh; 45*4f4d98d9Shkenken bus_addr_t ur_iobase; 46*4f4d98d9Shkenken #if 0 47*4f4d98d9Shkenken bus_size_t ur_nports; 48*4f4d98d9Shkenken bus_size_t ur_map[16]; 49*4f4d98d9Shkenken #endif 50*4f4d98d9Shkenken } sc_regs; 51*4f4d98d9Shkenken 52*4f4d98d9Shkenken #define sc_bt sc_regs.ur_iot 53*4f4d98d9Shkenken #define sc_bh sc_regs.ur_ioh 54*4f4d98d9Shkenken 55*4f4d98d9Shkenken uint32_t sc_intrspec_enb; 56*4f4d98d9Shkenken uint32_t sc_ucr2_d; /* target value for UCR2 */ 57*4f4d98d9Shkenken uint32_t sc_ucr[4]; /* cached value of UCRn */ 58*4f4d98d9Shkenken #define sc_ucr1 sc_ucr[0] 59*4f4d98d9Shkenken #define sc_ucr2 sc_ucr[1] 60*4f4d98d9Shkenken #define sc_ucr3 sc_ucr[2] 61*4f4d98d9Shkenken #define sc_ucr4 sc_ucr[3] 62*4f4d98d9Shkenken 63*4f4d98d9Shkenken uint sc_init_cnt; 64*4f4d98d9Shkenken 65*4f4d98d9Shkenken bus_addr_t sc_addr; 66*4f4d98d9Shkenken bus_size_t sc_size; 67*4f4d98d9Shkenken int sc_intr; 68*4f4d98d9Shkenken 69*4f4d98d9Shkenken u_char sc_hwflags; 70*4f4d98d9Shkenken /* Hardware flag masks */ 71*4f4d98d9Shkenken #define IMXUART_HW_FLOW __BIT(0) 72*4f4d98d9Shkenken #define IMXUART_HW_DEV_OK __BIT(1) 73*4f4d98d9Shkenken #define IMXUART_HW_CONSOLE __BIT(2) 74*4f4d98d9Shkenken #define IMXUART_HW_KGDB __BIT(3) 75*4f4d98d9Shkenken 76*4f4d98d9Shkenken bool enabled; 77*4f4d98d9Shkenken 78*4f4d98d9Shkenken u_char sc_swflags; 79*4f4d98d9Shkenken 80*4f4d98d9Shkenken u_char sc_rx_flags; 81*4f4d98d9Shkenken #define IMXUART_RX_TTY_BLOCKED __BIT(0) 82*4f4d98d9Shkenken #define IMXUART_RX_TTY_OVERFLOWED __BIT(1) 83*4f4d98d9Shkenken #define IMXUART_RX_IBUF_BLOCKED __BIT(2) 84*4f4d98d9Shkenken #define IMXUART_RX_IBUF_OVERFLOWED __BIT(3) 85*4f4d98d9Shkenken #define IMXUART_RX_ANY_BLOCK \ 86*4f4d98d9Shkenken (IMXUART_RX_TTY_BLOCKED|IMXUART_RX_TTY_OVERFLOWED| \ 87*4f4d98d9Shkenken IMXUART_RX_IBUF_BLOCKED|IMXUART_RX_IBUF_OVERFLOWED) 88*4f4d98d9Shkenken 89*4f4d98d9Shkenken bool sc_tx_busy, sc_tx_done, sc_tx_stopped; 90*4f4d98d9Shkenken bool sc_rx_ready,sc_st_check; 91*4f4d98d9Shkenken u_short sc_txfifo_len, sc_txfifo_thresh; 92*4f4d98d9Shkenken 93*4f4d98d9Shkenken uint16_t *sc_rbuf; 94*4f4d98d9Shkenken u_int sc_rbuf_size; 95*4f4d98d9Shkenken u_int sc_rbuf_in; 96*4f4d98d9Shkenken u_int sc_rbuf_out; 97*4f4d98d9Shkenken #define IMXUART_RBUF_AVAIL(sc) \ 98*4f4d98d9Shkenken ((sc->sc_rbuf_out <= sc->sc_rbuf_in) ? \ 99*4f4d98d9Shkenken (sc->sc_rbuf_in - sc->sc_rbuf_out) : \ 100*4f4d98d9Shkenken (sc->sc_rbuf_size - (sc->sc_rbuf_out - sc->sc_rbuf_in))) 101*4f4d98d9Shkenken 102*4f4d98d9Shkenken #define IMXUART_RBUF_SPACE(sc) \ 103*4f4d98d9Shkenken ((sc->sc_rbuf_in <= sc->sc_rbuf_out ? \ 104*4f4d98d9Shkenken sc->sc_rbuf_size - (sc->sc_rbuf_out - sc->sc_rbuf_in) : \ 105*4f4d98d9Shkenken sc->sc_rbuf_in - sc->sc_rbuf_out) - 1) 106*4f4d98d9Shkenken /* increment ringbuffer pointer */ 107*4f4d98d9Shkenken #define IMXUART_RBUF_INC(sc,v,i) (((v) + (i))&((sc->sc_rbuf_size)-1)) 108*4f4d98d9Shkenken u_int sc_r_lowat; 109*4f4d98d9Shkenken u_int sc_r_hiwat; 110*4f4d98d9Shkenken 111*4f4d98d9Shkenken /* output chunk */ 112*4f4d98d9Shkenken u_char *sc_tba; 113*4f4d98d9Shkenken u_int sc_tbc; 114*4f4d98d9Shkenken u_int sc_heldtbc; 115*4f4d98d9Shkenken /* pending parameter changes */ 116*4f4d98d9Shkenken u_char sc_pending; 117*4f4d98d9Shkenken #define IMXUART_PEND_PARAM __BIT(0) 118*4f4d98d9Shkenken #define IMXUART_PEND_SPEED __BIT(1) 119*4f4d98d9Shkenken 120*4f4d98d9Shkenken 121*4f4d98d9Shkenken struct callout sc_diag_callout; 122*4f4d98d9Shkenken kmutex_t sc_lock; 123*4f4d98d9Shkenken void *sc_ih; /* interrupt handler */ 124*4f4d98d9Shkenken void *sc_si; /* soft interrupt */ 125*4f4d98d9Shkenken struct tty *sc_tty; 126*4f4d98d9Shkenken 127*4f4d98d9Shkenken /* power management hooks */ 128*4f4d98d9Shkenken int (*enable)(struct imxuart_softc *); 129*4f4d98d9Shkenken void (*disable)(struct imxuart_softc *); 130*4f4d98d9Shkenken 131*4f4d98d9Shkenken struct { 132*4f4d98d9Shkenken ulong err; 133*4f4d98d9Shkenken ulong brk; 134*4f4d98d9Shkenken ulong prerr; 135*4f4d98d9Shkenken ulong frmerr; 136*4f4d98d9Shkenken ulong ovrrun; 137*4f4d98d9Shkenken } sc_errors; 138*4f4d98d9Shkenken 139*4f4d98d9Shkenken struct imxuart_baudrate_ratio { 140*4f4d98d9Shkenken uint16_t numerator; /* UBIR */ 141*4f4d98d9Shkenken uint16_t modulator; /* UBMR */ 142*4f4d98d9Shkenken } sc_ratio; 143*4f4d98d9Shkenken 144*4f4d98d9Shkenken }; 145825088edSmatt 1468af7e1f7Sbsh void imxuart_attach_common(device_t parent, device_t self, 1475a80dc5fSbsh bus_space_tag_t, paddr_t, size_t, int, int); 148825088edSmatt 1495a80dc5fSbsh int imxuart_kgdb_attach(bus_space_tag_t, paddr_t, u_int, tcflag_t); 150*4f4d98d9Shkenken int imxuart_cnattach(bus_space_tag_t, paddr_t, u_int, tcflag_t); 151825088edSmatt 1525a80dc5fSbsh int imxuart_is_console(bus_space_tag_t, bus_addr_t, bus_space_handle_t *); 153825088edSmatt 1545a80dc5fSbsh /* 1555a80dc5fSbsh * Set platform dependent values 1565a80dc5fSbsh */ 1575a80dc5fSbsh void imxuart_set_frequency(u_int, u_int); 1585a80dc5fSbsh 1595a80dc5fSbsh /* 1605a80dc5fSbsh * defined in imx51uart.c and imx31uart.c 1615a80dc5fSbsh */ 162cbab9cadSchs int imxuart_match(device_t, cfdata_t, void *); 163cbab9cadSchs void imxuart_attach(device_t, device_t, void *); 1645a80dc5fSbsh 165*4f4d98d9Shkenken void imxuart_attach_subr(struct imxuart_softc *); 166*4f4d98d9Shkenken 167*4f4d98d9Shkenken int imxuintr(void *); 168*4f4d98d9Shkenken 1695a80dc5fSbsh #endif /* _IMXUARTVAR_H */ 170