xref: /netbsd-src/sys/arch/arm/imx/imxuartvar.h (revision 4f4d98d9641451b54ed55023f2edd9dd3954ca25)
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