root/drivers/gpib/include/tnt4882_registers.h
/* SPDX-License-Identifier: GPL-2.0 */

/***************************************************************************
 *    copyright            : (C) 2002, 2004 by Frank Mori Hess
 ***************************************************************************/

#ifndef _TNT4882_REGISTERS_H
#define _TNT4882_REGISTERS_H

// tnt4882 register offsets
enum {
        ACCWR = 0x5,
        // offset of auxiliary command register in 9914 mode
        AUXCR = 0x6,
        INTRT = 0x7,
        // register number for auxiliary command register when swap bit is set (9914 mode)
        SWAPPED_AUXCR = 0xa,
        HSSEL = 0xd,    // handshake select register
        CNT2 = 0x9,
        CNT3 = 0xb,
        CFG = 0x10,
        SASR = 0x1b,
        IMR0 = 0x1d,
        IMR3 = 0x12,
        CNT0 = 0x14,
        CNT1 = 0x16,
        KEYREG = 0x17,  // key control register (7210 mode only)
        CSR = KEYREG,
        FIFOB = 0x18,
        FIFOA = 0x19,
        CCR = 0x1a,     // carry cycle register
        CMDR = 0x1c,    // command register
        TIMER = 0x1e,   // timer register

        STS1 = 0x10,    // T488 Status Register 1
        STS2 = 0x1c,    // T488 Status Register 2
        ISR0 = IMR0,
        ISR3 = 0x1a,    // T488 Interrupt Status Register 3
        BCR = 0x1f,     // bus control/status register
        BSR = BCR,
};

enum {
        tnt_pagein_offset = 0x11,
};

/*============================================================*/

/* TURBO-488 registers bit definitions */

enum bus_control_status_bits {
        BCSR_REN_BIT = 0x1,
        BCSR_IFC_BIT = 0x2,
        BCSR_SRQ_BIT = 0x4,
        BCSR_EOI_BIT = 0x8,
        BCSR_NRFD_BIT = 0x10,
        BCSR_NDAC_BIT = 0x20,
        BCSR_DAV_BIT = 0x40,
        BCSR_ATN_BIT = 0x80,
};

/* CFG -- Configuration Register (write only) */
enum cfg_bits {
        TNT_COMMAND = 0x80,     /* bytes are command bytes instead of data bytes
                                 * (tnt4882 one-chip and newer only?)
                                 */
        TNT_TLCHE = (1 << 6),   /* halt transfer on imr0, imr1, or imr2 interrupt */
        TNT_IN = (1 << 5),      /* transfer is GPIB read                 */
        TNT_A_B = (1 << 4),     /* order to use fifos 1=fifo A first(big endian),
                                 * 0=fifo b first(little endian)
                                 */
        TNT_CCEN = (1 << 3),    /* enable carry cycle                 */
        TNT_TMOE = (1 << 2),    /* enable CPU bus time limit          */
        TNT_TIM_BYTN = (1 << 1),        /* tmot reg is: 1=125ns clocks, 0=num bytes */
        TNT_B_16BIT = (1 << 0), /* 1=FIFO is 16-bit register, 0=8-bit */
};

/* CMDR -- Command Register */
enum cmdr_bits {
        CLRSC = 0x2,    /* clear the system controller bit */
        SETSC = 0x3,    /* set the system controller bit */
        GO = 0x4,       /* start fifos */
        STOP = 0x8,     /* stop fifos */
        RESET_FIFO = 0x10,      /* reset the FIFOs              */
        SOFT_RESET = 0x22,      /* issue a software reset       */
        HARD_RESET = 0x40       /* 500x only? */
};

/* HSSEL -- handshake select register (write only) */
enum hssel_bits {
        TNT_ONE_CHIP_BIT = 0x1,
        NODMA = 0x10,
        TNT_GO2SIDS_BIT = 0x20,
};

/* IMR0 -- Interrupt Mode Register 0 */
enum imr0_bits {
        TNT_SYNCIE_BIT = 0x1, /* handshake sync */
        TNT_TOIE_BIT = 0x2, /* timeout */
        TNT_ATNIE_BIT = 0x4, /* ATN interrupt */
        TNT_IFCIE_BIT = 0x8,    /* interface clear interrupt */
        TNT_BTO_BIT = 0x10, /* byte timeout */
        TNT_NLEN_BIT = 0x20,    /* treat new line as EOS char */
        TNT_STBOIE_BIT = 0x40,  /* status byte out  */
        TNT_IMR0_ALWAYS_BITS = 0x80,    /* always set this bit on write */
};

/* ISR0 -- Interrupt Status Register 0 */
enum isr0_bits {
        TNT_SYNC_BIT = 0x1,     /* handshake sync */
        TNT_TO_BIT = 0x2,       /* timeout */
        TNT_ATNI_BIT = 0x4,     /* ATN interrupt */
        TNT_IFCI_BIT = 0x8,     /* interface clear interrupt */
        TNT_EOS_BIT = 0x10,     /* end of string */
        TNT_NL_BIT = 0x20,      /* new line receive */
        TNT_STBO_BIT = 0x40,    /* status byte out  */
        TNT_NBA_BIT = 0x80,     /* new byte available */
};

/* ISR3 -- Interrupt Status Register 3 (read only) */
enum isr3_bits {
        HR_DONE = (1 << 0),     /* transfer done */
        HR_TLCI = (1 << 1),     /* isr0, isr1, or isr2 interrupt asserted */
        HR_NEF = (1 << 2),      /* NOT empty fifo */
        HR_NFF = (1 << 3),      /* NOT full fifo */
        HR_STOP = (1 << 4),     /* fifo empty or STOP command issued */
        HR_SRQI_CIC = (1 << 5), /* SRQ asserted and we are CIC (500x only?)*/
        HR_INTR = (1 << 7),     /* isr3 interrupt active */
};

enum keyreg_bits {
        MSTD = 0x20,    /* enable 350ns T1 delay */
};

/* STS1 -- Status Register 1 (read only) */
enum sts1_bits {
        S_DONE = 0x80,  /* DMA done                           */
        S_SC = 0x40,    /* is system controller               */
        S_IN = 0x20,    /* DMA in (to memory)                 */
        S_DRQ = 0x10,   /* DRQ line (for diagnostics)         */
        S_STOP = 0x08,  /* DMA stopped                        */
        S_NDAV = 0x04,  /* inverse of DAV                     */
        S_HALT = 0x02,  /* status of transfer machine         */
        S_GSYNC = 0x01, /* indicates if GPIB is in sync w I/O */
};

/* STS2 -- Status Register 2 */
enum sts2_bits {
        AFFN = (1 << 3),        /* "A full FIFO NOT"  (0=FIFO full)  */
        AEFN = (1 << 2),        /* "A empty FIFO NOT" (0=FIFO empty) */
        BFFN = (1 << 1),        /* "B full FIFO NOT"  (0=FIFO full)  */
        BEFN = (1 << 0),        /* "B empty FIFO NOT" (0=FIFO empty) */
};

// Auxiliary commands
enum tnt4882_aux_cmds {
        AUX_9914 = 0x15,        // switch to 9914 mode
        AUX_REQT = 0x18,
        AUX_REQF = 0x19,
        AUX_PAGEIN = 0x50,      // page in alternate registers
        AUX_HLDI = 0x51,        // rfd holdoff immediately
        AUX_CLEAR_END = 0x55,
        AUX_7210 = 0x99,        // switch to 7210 mode
};

enum tnt4882_aux_regs {
        AUXRG = 0x40,
        AUXRI = 0xe0,
};

enum auxg_bits {
 /* no talking when no listeners bit (prevents bus errors when data written at wrong time) */
        NTNL_BIT = 0x8,
        RPP2_BIT = 0x4, /* set/clear local rpp message */
        CHES_BIT = 0x1, /*clear holdoff on end select bit*/
};

enum auxi_bits {
        SISB = 0x1,     // static interrupt bits (don't clear isr1, isr2 on read)
        PP2 = 0x4,      // ignore remote parallel poll configuration
        USTD = 0x8,     // ultra short (1100 nanosec) T1 delay
};

enum sasr_bits {
        ACRDY_BIT = 0x4,        /* acceptor ready state */
        ADHS_BIT = 0x8,         /* acceptor data holdoff state */
        ANHS2_BIT = 0x10,       /* acceptor not ready holdoff immediately state */
        ANHS1_BIT = 0x20,       /* acceptor not ready holdoff state */
        AEHS_BIT = 0x40,        /* acceptor end holdoff state */
};

#endif  // _TNT4882_REGISTERS_H