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