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

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

#ifndef _NEC7210_REGISTERS_H
#define _NEC7210_REGISTERS_H

enum nec7210_chipset {
        NEC7210,        // The original
        TNT4882,        // NI
        NAT4882,        // NI
        CB7210,         // measurement computing
        IOT7210,        // iotech
        IGPIB7210,      // Ines
        TNT5004,        // NI (minor differences to TNT4882)
};

/*
 * nec7210 register numbers (might need to be multiplied by
 * a board-dependent offset to get actually io address offset)
 */
// write registers
enum nec7210_write_regs {
        CDOR,   // command/data out
        IMR1,   // interrupt mask 1
        IMR2,   // interrupt mask 2
        SPMR,   // serial poll mode
        ADMR,   // address mode
        AUXMR,  // auxiliary mode
        ADR,    // address
        EOSR,   // end-of-string

        // nec7210 has 8 registers
        nec7210_num_registers = 8,
};

// read registers
enum nec7210_read_regs {
        DIR,    // data in
        ISR1,   // interrupt status 1
        ISR2,   // interrupt status 2
        SPSR,   // serial poll status
        ADSR,   // address status
        CPTR,   // command pass though
        ADR0,   // address 1
        ADR1,   // address 2
};

// bit definitions common to nec-7210 compatible registers

// ISR1: interrupt status register 1
enum isr1_bits {
        HR_DI = (1 << 0),
        HR_DO = (1 << 1),
        HR_ERR = (1 << 2),
        HR_DEC = (1 << 3),
        HR_END = (1 << 4),
        HR_DET = (1 << 5),
        HR_APT = (1 << 6),
        HR_CPT = (1 << 7),
};

// IMR1: interrupt mask register 1
enum imr1_bits {
        HR_DIIE = (1 << 0),
        HR_DOIE = (1 << 1),
        HR_ERRIE = (1 << 2),
        HR_DECIE = (1 << 3),
        HR_ENDIE = (1 << 4),
        HR_DETIE = (1 << 5),
        HR_APTIE = (1 << 6),
        HR_CPTIE = (1 << 7),
};

// ISR2, interrupt status register 2
enum isr2_bits {
        HR_ADSC = (1 << 0),
        HR_REMC = (1 << 1),
        HR_LOKC = (1 << 2),
        HR_CO = (1 << 3),
        HR_REM = (1 << 4),
        HR_LOK = (1 << 5),
        HR_SRQI = (1 << 6),
        HR_INT = (1 << 7),
};

// IMR2, interrupt mask register 2
enum imr2_bits {
        // all the bits in this register that enable interrupts
        IMR2_ENABLE_INTR_MASK = 0x4f,
        HR_ACIE = (1 << 0),
        HR_REMIE = (1 << 1),
        HR_LOKIE = (1 << 2),
        HR_COIE = (1 << 3),
        HR_DMAI = (1 << 4),
        HR_DMAO = (1 << 5),
        HR_SRQIE = (1 << 6),
};

// SPSR, serial poll status register
enum spsr_bits {
        HR_PEND = (1 << 6),
};

// SPMR, serial poll mode register
enum spmr_bits {
        HR_RSV = (1 << 6),
};

// ADSR, address status register
enum adsr_bits {
        HR_MJMN = (1 << 0),
        HR_TA = (1 << 1),
        HR_LA = (1 << 2),
        HR_TPAS = (1 << 3),
        HR_LPAS = (1 << 4),
        HR_SPMS = (1 << 5),
        HR_NATN = (1 << 6),
        HR_CIC = (1 << 7),
};

// ADMR, address mode register
enum admr_bits {
        HR_ADM0 = (1 << 0),
        HR_ADM1 = (1 << 1),
        HR_TRM0 = (1 << 4),
        HR_TRM1 = (1 << 5),
        HR_TRM_EOIOE_TRIG = 0,
        HR_TRM_CIC_TRIG = HR_TRM0,
        HR_TRM_CIC_EOIOE = HR_TRM1,
        HR_TRM_CIC_PE = HR_TRM0 | HR_TRM1,
        HR_LON = (1 << 6),
        HR_TON = (1 << 7),
};

// ADR, bits used in address0, address1 and address0/1 registers
enum adr_bits {
        ADDRESS_MASK = 0x1f,    /* mask to specify lower 5 bits */
        HR_DL = (1 << 5),
        HR_DT = (1 << 6),
        HR_ARS = (1 << 7),
};

// ADR1, address1 register
enum adr1_bits {
        HR_EOI = (1 << 7),
};

// AUXMR, auxiliary mode register
enum auxmr_bits {
        ICR = 0x20,
        PPR = 0x60,
        AUXRA = 0x80,
        AUXRB = 0xa0,
        AUXRE = 0xc0,
};

// auxra, auxiliary register A
enum auxra_bits {
        HR_HANDSHAKE_MASK = 0x3,
        HR_HLDA = 0x1,
        HR_HLDE = 0x2,
        HR_LCM = 0x3,   /* auxra listen continuous */
        HR_REOS = 0x4,
        HR_XEOS = 0x8,
        HR_BIN = 0x10,
};

// auxrb, auxiliary register B
enum auxrb_bits {
        HR_CPTE = (1 << 0),
        HR_SPEOI = (1 << 1),
        HR_TRI = (1 << 2),
        HR_INV = (1 << 3),
        HR_ISS = (1 << 4),
};

enum auxre_bits {
        HR_DAC_HLD_DCAS = 0x1,  /* perform DAC holdoff on receiving clear */
        HR_DAC_HLD_DTAS = 0x2,  /* perform DAC holdoff on receiving trigger */
};

// parallel poll register
enum ppr_bits {
        HR_PPS = (1 << 3),
        HR_PPU = (1 << 4),
};

/* 7210 Auxiliary Commands */
enum aux_cmds {
        AUX_PON = 0x0,  /* Immediate Execute pon                  */
        AUX_CPPF = 0x1, /* Clear Parallel Poll Flag               */
        AUX_CR = 0x2,   /* Chip Reset                             */
        AUX_FH = 0x3,   /* Finish Handshake                       */
        AUX_TRIG = 0x4, /* Trigger                                */
        AUX_RTL = 0x5,  /* Return to local                        */
        AUX_SEOI = 0x6, /* Send EOI                               */
        AUX_NVAL = 0x7, /* Non-Valid Secondary Command or Address */
        AUX_SPPF = 0x9, /* Set Parallel Poll Flag                 */
        AUX_VAL = 0xf,  /* Valid Secondary Command or Address     */
        AUX_GTS = 0x10, /* Go To Standby                          */
        AUX_TCA = 0x11, /* Take Control Asynchronously            */
        AUX_TCS = 0x12, /* Take Control Synchronously             */
        AUX_LTN = 0x13, /* Listen                                 */
        AUX_DSC = 0x14, /* Disable System Control                 */
        AUX_CIFC = 0x16,        /* Clear IFC                              */
        AUX_CREN = 0x17,        /* Clear REN                              */
        AUX_TCSE = 0x1a,        /* Take Control Synchronously on End      */
        AUX_LTNC = 0x1b,        /* Listen in Continuous Mode              */
        AUX_LUN = 0x1c, /* Local Unlisten                         */
        AUX_EPP = 0x1d, /* Execute Parallel Poll                  */
        AUX_SIFC = 0x1e,        /* Set IFC                                */
        AUX_SREN = 0x1f,        /* Set REN                                */
};

#endif  //_NEC7210_REGISTERS_H