diff options
author | Jason Wright <jason@cvs.openbsd.org> | 2002-01-12 20:19:41 +0000 |
---|---|---|
committer | Jason Wright <jason@cvs.openbsd.org> | 2002-01-12 20:19:41 +0000 |
commit | 43f0012410fc640505993d4ab1f1106e5549be58 (patch) | |
tree | 576881edebcf82719c30a8f3b2dfc9fb753d51a7 /sys/dev/sbus/magmareg.h | |
parent | 94cdeb85bc020ba91349f66da51fe312faa10dd1 (diff) |
Port of Iain Hibbert's magma driver to sparc64
Diffstat (limited to 'sys/dev/sbus/magmareg.h')
-rw-r--r-- | sys/dev/sbus/magmareg.h | 236 |
1 files changed, 236 insertions, 0 deletions
diff --git a/sys/dev/sbus/magmareg.h b/sys/dev/sbus/magmareg.h new file mode 100644 index 00000000000..e4228dd930a --- /dev/null +++ b/sys/dev/sbus/magmareg.h @@ -0,0 +1,236 @@ +/* $OpenBSD: magmareg.h,v 1.1 2002/01/12 20:19:40 jason Exp $ */ + +/* magmareg.h + * + * Copyright (c) 1998 Iain Hibbert + * All rights reserved. + * + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Iain Hibbert + * 4. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 THE AUTHOR 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. + * + */ + +#ifdef MAGMA_DEBUG +#define dprintf(x) printf x +#else +#define dprintf(x) +#endif + +/* The mapping of minor device number -> card and port is done as + * follows by default: + * + * +---+---+---+---+---+---+---+---+ + * | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | + * +---+---+---+---+---+---+---+---+ + * | | | | | | | | + * | | | | +---+---+---+---> port number + * | | | | + * | | | +-------------------> dialout (on tty ports) + * | | | + * | | +-----------------------> unused + * | | + * +---+---------------------------> card number + * + */ + +#define MAGMA_MAX_CARDS 4 +#define MAGMA_MAX_TTY 16 +#define MAGMA_MAX_BPP 2 +#define MAGMA_MAX_CD1400 4 +#define MAGMA_MAX_CD1190 2 + +#define MAGMA_CARD(x) ((minor(x) >> 6) & 0x03) +#define MAGMA_PORT(x) (minor(x) & 0x0f) + +#define MTTY_DIALOUT(x) (minor(x) & 0x10) + +/* + * Supported Card Types + */ +struct magma_board_info { + char *mb_name; /* cardname to match against */ + char *mb_realname; /* english card name */ + int mb_nser; /* number of serial ports */ + int mb_npar; /* number of parallel ports */ + int mb_ncd1400; /* number of CD1400 chips */ + int mb_svcackr; /* svcackr offset */ + int mb_svcackt; /* svcackt offset */ + int mb_svcackm; /* svcackm offset */ + int mb_cd1400[MAGMA_MAX_CD1400];/* cd1400 chip register offsets */ + int mb_ncd1190; /* number of CD1190 chips */ + int mb_cd1190[MAGMA_MAX_CD1190];/* cd1190 chip register offsets */ +}; + +/* + * cd1400 chip data + */ +struct cd1400 { + bus_space_handle_t cd_regh; /* chip register handle */ + bus_space_tag_t cd_regt; /* chip register tag */ + int cd_chiprev; /* chip revision */ + int cd_clock; /* clock speed in Mhz */ + int cd_parmode; /* parallel mode operation */ +}; + +/* + * cd1190 chip data + */ +struct cd1190 { + __volatile u_char *cd_reg; /* chip registers */ + int cd_chiprev; /* chip revision */ +}; + +/* software state for each card */ +struct magma_softc { + struct device ms_dev; /* required. must be first in softc */ + + /* cd1400 chip info */ + int ms_ncd1400; + struct cd1400 ms_cd1400[MAGMA_MAX_CD1400]; + void *sc_ih; /* interrupt vector */ + void *sc_sih; /* softintr vector */ + bus_space_tag_t sc_bustag; + bus_space_handle_t sc_iohandle; /* whole card registers */ + bus_space_handle_t sc_svcackrh; /* CD1400 service acknowledge receive */ + bus_space_handle_t sc_svcackth; /* CD1400 service acknowledge transmit */ + bus_space_handle_t sc_svcackmh; /* CD1400 service acknowledge modem */ + + /* cd1190 chip info */ + int ms_ncd1190; + struct cd1190 ms_cd1190[MAGMA_MAX_CD1190]; + + struct magma_board_info *ms_board; /* what am I? */ + + struct mtty_softc *ms_mtty; + struct mbpp_softc *ms_mbpp; + + struct intrhand ms_hardint; /* hard interrupt handler */ + struct intrhand ms_softint; /* soft interrupt handler */ +}; + +#define MTTY_RBUF_SIZE (2 * 512) +#define MTTY_RX_FIFO_THRESHOLD 6 +#define MTTY_RX_DTR_THRESHOLD 9 + +struct mtty_port { + struct cd1400 *mp_cd1400; /* ptr to chip */ + int mp_channel; /* and channel */ + struct tty *mp_tty; + + int mp_openflags; /* default tty flags */ + int mp_flags; /* port flags */ + int mp_carrier; /* state of carrier */ + + u_char *mp_rbuf; /* ring buffer start */ + u_char *mp_rend; /* ring buffer end */ + u_char *mp_rget; /* ring buffer read pointer */ + u_char *mp_rput; /* ring buffer write pointer */ + + u_char *mp_txp; /* transmit character pointer */ + int mp_txc; /* transmit character counter */ +}; + +#define MTTYF_CARRIER_CHANGED (1<<0) +#define MTTYF_SET_BREAK (1<<1) +#define MTTYF_CLR_BREAK (1<<2) +#define MTTYF_DONE (1<<3) +#define MTTYF_STOP (1<<4) +#define MTTYF_RING_OVERFLOW (1<<5) + +struct mtty_softc { + struct device ms_dev; /* device info */ + int ms_nports; /* tty ports */ + struct mtty_port ms_port[MAGMA_MAX_TTY]; +}; + +#define MBPP_RX_FIFO_THRESHOLD 25 + +struct mbpp_port { + struct cd1400 *mp_cd1400; /* for LC2+1Sp card */ + struct cd1190 *mp_cd1190; /* all the others */ + + int mp_flags; + + struct bpp_param mp_param; +#define mp_burst mp_param.bp_burst +#define mp_timeout mp_param.bp_timeout +#define mp_delay mp_param.bp_delay + + u_char *mp_ptr; /* pointer to io data */ + int mp_cnt; /* count of io chars */ + + struct timeout mp_timeout_tmo; /* for mbpp_timeout() */ + struct timeout mp_start_tmo; /* for mbpp_start() */ +}; + +#define MBPPF_OPEN (1<<0) +#define MBPPF_TIMEOUT (1<<1) +#define MBPPF_UIO (1<<2) +#define MBPPF_DELAY (1<<3) +#define MBPPF_WAKEUP (1<<4) + +struct mbpp_softc { + struct device ms_dev; /* device info */ + int ms_nports; /* parallel ports */ + struct mbpp_port ms_port[MAGMA_MAX_BPP]; +}; + +/* + * useful macros + */ +#define SET(t, f) ((t) |= (f)) +#define CLR(t, f) ((t) &= ~(f)) +#define ISSET(t, f) ((t) & (f)) + +/* internal function prototypes */ + +int cd1400_compute_baud __P((speed_t, int, int *, int *)); +__inline void cd1400_write_ccr __P((struct cd1400 *, u_char)); +__inline u_char cd1400_read_reg __P((struct cd1400 *, int)); +__inline void cd1400_write_reg __P((struct cd1400 *, int, u_char)); +void cd1400_enable_transmitter __P((struct cd1400 *, int)); + +int magma_match __P((struct device *, void *, void *)); +void magma_attach __P((struct device *, struct device *, void *)); +int magma_hard __P((void *)); +void magma_soft __P((void *)); + +int mtty_match __P((struct device *, void *, void *)); +void mtty_attach __P((struct device *, struct device *, void *)); +int mtty_modem_control __P((struct mtty_port *, int, int)); +int mtty_param __P((struct tty *, struct termios *)); +void mtty_start __P((struct tty *)); + +int mbpp_match __P((struct device *, void *, void *)); +void mbpp_attach __P((struct device *, struct device *, void *)); +int mbpp_rw __P((dev_t, struct uio *)); +void mbpp_timeout __P((void *)); +void mbpp_start __P((void *)); +int mbpp_send __P((struct mbpp_port *, caddr_t, int)); +int mbpp_recv __P((struct mbpp_port *, caddr_t, int)); +int mbpp_hztoms __P((int)); +int mbpp_mstohz __P((int)); + +#define CD1400_REGMAPSIZE 0x80 |