1 /* $NetBSD: sscom_var.h,v 1.6 2005/12/11 12:16:51 christos Exp $ */
4 * Copyright (c) 2002, 2003 Fujitsu Component Limited
5 * Copyright (c) 2002, 2003 Genetec Corporation
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
16 * 3. Neither the name of The Fujitsu Component Limited nor the name of
17 * Genetec corporation may not be used to endorse or promote products
18 * derived from this software without specific prior written permission.
20 * THIS SOFTWARE IS PROVIDED BY FUJITSU COMPONENT LIMITED AND GENETEC
21 * CORPORATION ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
22 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
23 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
24 * DISCLAIMED. IN NO EVENT SHALL FUJITSU COMPONENT LIMITED OR GENETEC
25 * CORPORATION BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
28 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
29 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
30 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
31 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34 /* derived from sys/dev/ic/comvar.h */
37 * Copyright (c) 1996 Christopher G. Demetriou. All rights reserved.
39 * Redistribution and use in source and binary forms, with or without
40 * modification, are permitted provided that the following conditions
42 * 1. Redistributions of source code must retain the above copyright
43 * notice, this list of conditions and the following disclaimer.
44 * 2. Redistributions in binary form must reproduce the above copyright
45 * notice, this list of conditions and the following disclaimer in the
46 * documentation and/or other materials provided with the distribution.
47 * 3. All advertising materials mentioning features or use of this software
48 * must display the following acknowledgement:
49 * This product includes software developed by Christopher G. Demetriou
50 * for the NetBSD Project.
51 * 4. The name of the author may not be used to endorse or promote products
52 * derived from this software without specific prior written permission
54 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
55 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
56 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
57 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
58 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
59 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
60 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
61 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
62 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
63 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
66 #ifndef _ARM_S3C2XX0_SSCOM_VAR_H
67 #define _ARM_S3C2XX0_SSCOM_VAR_H
69 #include "opt_multiprocessor.h"
70 #include "opt_lockdebug.h"
71 #include "opt_sscom.h"
73 #include <sys/param.h>
74 #include <sys/systm.h>
75 #include <sys/device.h>
76 #include <sys/termios.h>
77 #include <sys/callout.h>
78 #include <machine/bus.h>
81 #include <arm/s3c2xx0/s3c2410reg.h>
82 #include <arm/s3c2xx0/s3c2410var.h>
85 /* Hardware flag masks */
86 #define SSCOM_HW_FLOW 0x02
87 #define SSCOM_HW_DEV_OK 0x04
88 #define SSCOM_HW_CONSOLE 0x08
89 #define SSCOM_HW_KGDB 0x10
90 #define SSCOM_HW_TXINT 0x20
91 #define SSCOM_HW_RXINT 0x40
93 /* Buffer size for character buffer */
94 #define SSCOM_RING_SIZE 2048
101 struct callout sc_diag_callout
;
103 int sc_unit
; /* UART0/UART1 */
106 bus_space_tag_t sc_iot
;
107 bus_space_handle_t sc_ioh
;
118 u_char
*volatile sc_rbget
,
120 volatile u_int sc_rbavail
;
128 volatile u_char sc_rx_flags
,
129 #define RX_TTY_BLOCKED 0x01
130 #define RX_TTY_OVERFLOWED 0x02
131 #define RX_IBUF_BLOCKED 0x04
132 #define RX_IBUF_OVERFLOWED 0x08
133 #define RX_ANY_BLOCK 0x0f
140 /* data to stored in UART registers.
141 actual write to UART register is pended while sc_tx_busy */
142 uint16_t sc_ucon
; /* control register */
143 uint16_t sc_ubrdiv
; /* baudrate register */
144 uint8_t sc_heldchange
; /* register changes are pended */
145 uint8_t sc_ulcon
; /* line control */
146 uint8_t sc_umcon
; /* modem control */
147 #define UMCON_HW_MASK (UMCON_RTS)
148 #define UMCON_DTR (1<<4) /* provided by other means such as GPIO */
149 uint8_t sc_msts
; /* modem status */
150 #define MSTS_CTS UMSTAT_CTS /* bit0 */
151 #define MSTS_DCD (1<<1)
152 #define MSTS_DSR (1<<2)
154 uint8_t sc_msr_dcd
; /* DCD or 0 */
155 uint8_t sc_mcr_dtr
; /* DTR or 0 or DTR|RTS*/
156 uint8_t sc_mcr_rts
; /* RTS or DTR in sc_umcon */
157 uint8_t sc_msr_cts
; /* CTS or DCD in sc_msts */
159 uint8_t sc_msr_mask
; /* sc_msr_cts|sc_msr_dcd */
160 uint8_t sc_mcr_active
;
161 uint8_t sc_msr_delta
;
163 uint8_t sc_rx_irqno
, sc_tx_irqno
;
166 /* PPS signal on DCD, with or without inkernel clock disciplining */
167 u_char sc_ppsmask
; /* pps signal mask */
168 u_char sc_ppsassert
; /* pps leading edge */
169 u_char sc_ppsclear
; /* pps trailing edge */
171 pps_params_t ppsparam
;
174 #if NRND > 0 && defined(RND_COM)
175 rndsource_element_t rnd_source
;
177 #if (defined(MULTIPROCESSOR) || defined(LOCKDEBUG)) && defined(SSCOM_MPLOCK)
178 struct simplelock sc_lock
;
182 * S3C2XX0's UART doesn't have modem control/status pins.
183 * On platforms with S3C2XX0, those pins are simply unavailable
184 * or provided by other means such as GPIO. Platform specific attach routine
185 * have to provide functions to read/write modem control/status pins.
187 int (* read_modem_status
)( struct sscom_softc
* );
188 void (* set_modem_control
)( struct sscom_softc
* );
191 /* UART register address, etc. */
192 struct sscom_uart_info
{
194 char tx_int
, rx_int
, err_int
;
198 #define sscom_rxrdy(iot,ioh) \
199 (bus_space_read_1((iot), (ioh), SSCOM_UTRSTAT) & UTRSTAT_RXREADY)
200 #define sscom_getc(iot,ioh) bus_space_read_1((iot), (ioh), SSCOM_URXH)
201 #define sscom_geterr(iot,ioh) bus_space_read_1((iot), (ioh), SSCOM_UERSTAT)
204 * we need to tweak interrupt controller to mask/unmask rxint and/or txint.
207 /* RXINTn, TXINTn and ERRn interrupts are cascaded to UARTn irq. */
209 #define _sscom_intbit(irqno) (1<<((irqno)-S3C2410_SUBIRQ_MIN))
211 #define sscom_unmask_rxint(sc) \
212 s3c2410_unmask_subinterrupts(_sscom_intbit((sc)->sc_rx_irqno))
213 #define sscom_mask_rxint(sc) \
214 s3c2410_mask_subinterrupts(_sscom_intbit((sc)->sc_rx_irqno))
215 #define sscom_unmask_txint(sc) \
216 s3c2410_unmask_subinterrupts(_sscom_intbit((sc)->sc_tx_irqno))
217 #define sscom_mask_txint(sc) \
218 s3c2410_mask_subinterrupts(_sscom_intbit((sc)->sc_tx_irqno))
219 #define sscom_unmask_txrxint(sc) \
220 s3c2410_unmask_subinterrupts(_sscom_intbit((sc)->sc_tx_irqno) | \
221 _sscom_intbit((sc)->sc_rx_irqno))
222 #define sscom_mask_txrxint(sc) \
223 s3c2410_mask_subinterrupts(_sscom_intbit((sc)->sc_tx_irqno) | \
224 _sscom_intbit((sc)->sc_rx_irqno))
228 /* for S3C2800 and S3C2400 */
229 #define sscom_unmask_rxint(sc) s3c2xx0_unmask_interrupts(1<<(sc)->sc_rx_irqno)
230 #define sscom_mask_rxint(sc) s3c2xx0_mask_interrupts(1<<(sc)->sc_rx_irqno)
231 #define sscom_unmask_txint(sc) s3c2xx0_unmask_interrupts(1<<(sc)->sc_tx_irqno)
232 #define sscom_mask_txint(sc) s3c2xx0_mask_interrupts(1<<(sc)->sc_tx_irqno)
233 #define sscom_unmask_txrxint(sc) \
234 s3c2xx0_unmask_interrupts((1<<(sc)->sc_tx_irqno)|(1<<(sc)->sc_rx_irqno))
235 #define sscom_mask_txrxint(sc) \
236 s3c2xx0_mask_interrupts((1<<(sc)->sc_tx_irqno)|(1<<(sc)->sc_rx_irqno))
238 #endif /* SSCOM_S3C2410 */
240 #define sscom_enable_rxint(sc) \
241 (sscom_unmask_rxint(sc), ((sc)->sc_hwflags |= SSCOM_HW_RXINT))
242 #define sscom_disable_rxint(sc) \
243 (sscom_mask_rxint(sc), ((sc)->sc_hwflags &= ~SSCOM_HW_RXINT))
244 #define sscom_enable_txint(sc) \
245 (sscom_unmask_txint(sc), ((sc)->sc_hwflags |= SSCOM_HW_TXINT))
246 #define sscom_disable_txint(sc) \
247 (sscom_mask_txint(sc),((sc)->sc_hwflags &= ~SSCOM_HW_TXINT))
248 #define sscom_enable_txrxint(sc) \
249 (sscom_unmask_txrxint(sc),((sc)->sc_hwflags |= (SSCOM_HW_TXINT|SSCOM_HW_RXINT)))
250 #define sscom_disable_txrxint(sc) \
251 (sscom_mask_txrxint(sc),((sc)->sc_hwflags &= ~(SSCOM_HW_TXINT|SSCOM_HW_RXINT)))
254 int sscomspeed(long, long);
255 void sscom_attach_subr(struct sscom_softc
*);
257 int sscom_detach(struct device
*, int);
258 int sscom_activate(struct device
*, enum devact
);
259 void sscom_shutdown(struct sscom_softc
*);
260 void sscomdiag (void *);
261 void sscomstart(struct tty
*);
262 int sscomparam(struct tty
*, struct termios
*);
263 int sscomread(dev_t
, struct uio
*, int);
264 void sscom_config(struct sscom_softc
*);
266 int sscomtxintr(void *);
267 int sscomrxintr(void *);
269 int sscom_cnattach(bus_space_tag_t
, const struct sscom_uart_info
*,
271 void sscom_cndetach(void);
272 int sscom_is_console(bus_space_tag_t
, int, bus_space_handle_t
*);
275 int sscom_kgdb_attach(bus_space_tag_t
, const struct sscom_uart_info
*,
279 #endif /* _ARM_S3C2XX0_SSCOM_VAR_H */