root/sys/arch/hp300/stand/common/dcareg.h
/*      $NetBSD: dcareg.h,v 1.2 2005/12/11 12:17:19 christos Exp $      */

/*
 * Copyright (c) 1982, 1986, 1990, 1993
 *      The Regents of the University of California.  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. Neither the name of the University nor the names of its contributors
 *    may be used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``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 REGENTS OR CONTRIBUTORS 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.
 *
 *      @(#)dcareg.h    8.1 (Berkeley) 6/10/93
 */

#include <hp300/dev/iotypes.h>                  /* XXX */

#ifdef hp700
struct dcadevice {
        vu_char dca_reset;
        vu_char dca_pad[0x800-1];
        vu_char dca_data;                       /* receive buf or xmit hold */
        vu_char dca_ier;                        /* interrupt enable */
        vu_char dca_iir;                        /* (RO) interrupt identify */
#define         dca_fifo        dca_iir         /* (WO) FIFO control */
        vu_char dca_cfcr;                       /* line control */
        vu_char dca_mcr;                        /* modem control */
        vu_char dca_lsr;                        /* line status */
        vu_char dca_msr;                        /* modem status */
        vu_char dca_scr;                        /* scratch pad */
};
#else
struct dcadevice {
        /* card registers */
        u_char  dca_pad0;
        vu_char dca_id;                         /* 0x01 (read) */
#define         dca_reset       dca_id          /* 0x01 (write) */
        u_char  dca_pad1;
        vu_char dca_ic;                         /* 0x03 */
        u_char  dca_pad2;
        vu_char dca_ocbrc;                      /* 0x05 */
        u_char  dca_pad3;
        vu_char dca_lcsm;                       /* 0x07 */
        u_char  dca_pad4[8];
        /* chip registers */
        u_char  dca_pad5;
        vu_char dca_data;                       /* 0x11 */
        u_char  dca_pad6;
        vu_char dca_ier;                        /* 0x13 */
        u_char  dca_pad7;
        vu_char dca_iir;                        /* 0x15 (read) */
#define         dca_fifo        dca_iir         /* 0x15 (write) */
        u_char  dca_pad8;
        vu_char dca_cfcr;                       /* 0x17 */
        u_char  dca_pad9;
        vu_char dca_mcr;                        /* 0x19 */
        u_char  dca_padA;
        vu_char dca_lsr;                        /* 0x1B */
        u_char  dca_padB;
        vu_char dca_msr;                        /* 0x1D */
};
#endif

/* interface reset/id (300 only) */
#define DCAID0          0x02
#define DCAREMID0       0x82
#define DCAID1          0x42
#define DCAREMID1       0xC2

/* interrupt control (300 only) */
#define DCAIPL(x)       ((((x) >> 4) & 3) + 3)
#define IC_IR           0x40
#define IC_IE           0x80

/*
 * 16 bit baud rate divisor (lower byte in dca_data, upper in dca_ier)
 * NB: This constant is for a 7.3728 clock frequency. The 300 clock
 *     frequency is 2.4576, giving a constant of 153600.
 */
#ifdef hp300
#define DCABRD(x)       (153600 / (x))
#endif
#ifdef hp700
#define DCABRD(x)       (460800 / (x))
#endif

/* interrupt enable register */
#define IER_ERXRDY      0x1
#define IER_ETXRDY      0x2
#define IER_ERLS        0x4
#define IER_EMSC        0x8

/* interrupt identification register */
#define IIR_IMASK       0xf
#define IIR_RXTOUT      0xc
#define IIR_RLS         0x6
#define IIR_RXRDY       0x4
#define IIR_TXRDY       0x2
#define IIR_NOPEND      0x1
#define IIR_MLSC        0x0
#define IIR_FIFO_MASK   0xc0    /* set if FIFOs are enabled */

/* fifo control register */
#define FIFO_ENABLE     0x01
#define FIFO_RCV_RST    0x02
#define FIFO_XMT_RST    0x04
#define FIFO_DMA_MODE   0x08
#define FIFO_TRIGGER_1  0x00
#define FIFO_TRIGGER_4  0x40
#define FIFO_TRIGGER_8  0x80
#define FIFO_TRIGGER_14 0xc0

/* character format control register */
#define CFCR_DLAB       0x80
#define CFCR_SBREAK     0x40
#define CFCR_PZERO      0x30
#define CFCR_PONE       0x20
#define CFCR_PEVEN      0x10
#define CFCR_PODD       0x00
#define CFCR_PENAB      0x08
#define CFCR_STOPB      0x04
#define CFCR_8BITS      0x03
#define CFCR_7BITS      0x02
#define CFCR_6BITS      0x01
#define CFCR_5BITS      0x00

/* modem control register */
#define MCR_LOOPBACK    0x10
#define MCR_IEN         0x08
#define MCR_DRS         0x04
#define MCR_RTS         0x02
#define MCR_DTR         0x01

/* line status register */
#define LSR_RCV_FIFO    0x80
#define LSR_TSRE        0x40
#define LSR_TXRDY       0x20
#define LSR_BI          0x10
#define LSR_FE          0x08
#define LSR_PE          0x04
#define LSR_OE          0x02
#define LSR_RXRDY       0x01
#define LSR_RCV_MASK    0x1f

/* modem status register */
#define MSR_DCD         0x80
#define MSR_RI          0x40
#define MSR_DSR         0x20
#define MSR_CTS         0x10
#define MSR_DDCD        0x08
#define MSR_TERI        0x04
#define MSR_DDSR        0x02
#define MSR_DCTS        0x01