File Index
Files and directories
Sign in
FILE

fmh_gpib.h

File preview with syntax highlighting.

linux-6.19.14/drivers/gpib/fmh_gpib/fmh_gpib.h C
  1/* SPDX-License-Identifier: GPL-2.0 */
  2
  3/***************************************************************************
  4 *    Author: Frank Mori Hess <fmh6jj@gmail.com>
  5 *   Copyright: (C) 2006, 2010, 2015 Fluke Corporation
  6 *	(C) 2017 Frank Mori Hess
  7 ***************************************************************************/
  8
  9#include <linux/dmaengine.h>
 10#include <linux/ioport.h>
 11#include <linux/pci.h>
 12#include <linux/io.h>
 13#include "nec7210.h"
 14
 15static const int fifo_reg_offset = 2;
 16
 17static const int gpib_control_status_pci_resource_index;
 18static const int gpib_fifo_pci_resource_index = 1;
 19
 20/* We don't have a real pci vendor/device id, the following will need to be
 21 * patched to match prototype hardware.
 22 */
 23#define BOGUS_PCI_VENDOR_ID_FLUKE 0xffff
 24#define BOGUS_PCI_DEVICE_ID_FLUKE_BLADERUNNER 0x0
 25
 26struct fmh_priv {
 27	struct nec7210_priv nec7210_priv;
 28	struct resource *gpib_iomem_res;
 29	struct resource *write_transfer_counter_res;
 30	struct resource *dma_port_res;
 31	int irq;
 32	struct dma_chan *dma_channel;
 33	u8 *dma_buffer;
 34	int dma_buffer_size;
 35	int dma_burst_length;
 36	void __iomem *fifo_base;
 37	unsigned supports_fifo_interrupts : 1;
 38};
 39
 40static inline int fmh_gpib_half_fifo_size(struct fmh_priv *priv)
 41{
 42	return priv->dma_burst_length;
 43}
 44
 45// registers beyond the nec7210 register set
 46enum fmh_gpib_regs {
 47	EXT_STATUS_1_REG = 0x9,
 48	STATE1_REG = 0xc,
 49	ISR0_IMR0_REG = 0xe,
 50	BUS_STATUS_REG = 0xf
 51};
 52
 53/* IMR0 -- Interrupt Mode Register 0 */
 54enum imr0_bits {
 55	ATN_INTERRUPT_ENABLE_BIT = 0x4,
 56	IFC_INTERRUPT_ENABLE_BIT = 0x8
 57};
 58
 59/* ISR0 -- Interrupt Status Register 0 */
 60enum isr0_bits {
 61	ATN_INTERRUPT_BIT = 0x4,
 62	IFC_INTERRUPT_BIT = 0x8
 63};
 64
 65enum state1_bits {
 66	SOURCE_HANDSHAKE_SIDS_BITS = 0x0, /* source idle state */
 67	SOURCE_HANDSHAKE_SGNS_BITS = 0x1, /* source generate state */
 68	SOURCE_HANDSHAKE_SDYS_BITS = 0x2, /* source delay state */
 69	SOURCE_HANDSHAKE_STRS_BITS = 0x5, /* source transfer state */
 70	SOURCE_HANDSHAKE_MASK = 0x7
 71};
 72
 73enum fmh_gpib_auxmr_bits {
 74	AUX_I_REG = 0xe0,
 75};
 76
 77enum aux_reg_i_bits {
 78	LOCAL_PPOLL_MODE_BIT = 0x4
 79};
 80
 81enum ext_status_1_bits {
 82	DATA_IN_STATUS_BIT = 0x01,
 83	DATA_OUT_STATUS_BIT = 0x02,
 84	COMMAND_OUT_STATUS_BIT = 0x04,
 85	RFD_HOLDOFF_STATUS_BIT = 0x08,
 86	END_STATUS_BIT = 0x10
 87};
 88
 89/* dma fifo reg and bits */
 90enum dma_fifo_regs {
 91	FIFO_DATA_REG = 0x0,
 92	FIFO_CONTROL_STATUS_REG = 0x1,
 93	FIFO_XFER_COUNTER_REG = 0x2,
 94	FIFO_MAX_BURST_LENGTH_REG = 0x3
 95};
 96
 97enum fifo_data_bits {
 98	FIFO_DATA_EOI_FLAG = 0x100
 99};
100
101enum fifo_control_bits {
102	TX_FIFO_DMA_REQUEST_ENABLE = 0x0001,
103	TX_FIFO_CLEAR = 0x0002,
104	TX_FIFO_HALF_EMPTY_INTERRUPT_ENABLE = 0x0008,
105	RX_FIFO_DMA_REQUEST_ENABLE = 0x0100,
106	RX_FIFO_CLEAR = 0x0200,
107	RX_FIFO_HALF_FULL_INTERRUPT_ENABLE = 0x0800
108};
109
110enum fifo_status_bits {
111	TX_FIFO_EMPTY = 0x0001,
112	TX_FIFO_FULL = 0x0002,
113	TX_FIFO_HALF_EMPTY = 0x0004,
114	TX_FIFO_HALF_EMPTY_INTERRUPT_IS_ENABLED = 0x0008,
115	TX_FIFO_DMA_REQUEST_IS_ENABLED = 0x0010,
116	RX_FIFO_EMPTY = 0x0100,
117	RX_FIFO_FULL = 0x0200,
118	RX_FIFO_HALF_FULL = 0x0400,
119	RX_FIFO_HALF_FULL_INTERRUPT_IS_ENABLED = 0x0800,
120	RX_FIFO_DMA_REQUEST_IS_ENABLED = 0x1000
121};
122
123static const unsigned int fifo_data_mask = 0x00ff;
124static const unsigned int fifo_xfer_counter_mask = 0x0fff;
125static const unsigned int fifo_max_burst_length_mask = 0x00ff;
126
127static inline u8 gpib_cs_read_byte(struct nec7210_priv *nec_priv,
128				   unsigned int register_num)
129{
130	return readb(nec_priv->mmiobase + register_num * nec_priv->offset);
131}
132
133static inline void gpib_cs_write_byte(struct nec7210_priv *nec_priv, u8 data,
134				      unsigned int register_num)
135{
136	writeb(data, nec_priv->mmiobase + register_num * nec_priv->offset);
137}
138
139static inline uint16_t fifos_read(struct fmh_priv *fmh_priv, int register_num)
140{
141	if (!fmh_priv->fifo_base)
142		return 0;
143	return readw(fmh_priv->fifo_base + register_num * fifo_reg_offset);
144}
145
146static inline void fifos_write(struct fmh_priv *fmh_priv, uint16_t data, int register_num)
147{
148	if (!fmh_priv->fifo_base)
149		return;
150	writew(data, fmh_priv->fifo_base + register_num * fifo_reg_offset);
151}
152
153enum bus_status_bits {
154	BSR_ATN_BIT = 0x01,
155	BSR_EOI_BIT = 0x02,
156	BSR_SRQ_BIT = 0x04,
157	BSR_IFC_BIT = 0x08,
158	BSR_REN_BIT = 0x10,
159	BSR_DAV_BIT = 0x20,
160	BSR_NRFD_BIT = 0x40,
161	BSR_NDAC_BIT = 0x80,
162};
163
164enum fmh_gpib_aux_cmds {
165	/* AUX_RTL2 is an auxiliary command which causes the cb7210 to assert
166	 * (and keep asserted) the local rtl message.  This is used in conjunction
167	 * with the normal nec7210 AUX_RTL command, which
168	 * pulses the rtl message, having the effect of clearing rtl if it was left
169	 * asserted by AUX_RTL2.
170	 */
171	AUX_RTL2 = 0x0d,
172	AUX_RFD_HOLDOFF_ASAP = 0x15,
173	AUX_REQT = 0x18,
174	AUX_REQF = 0x19,
175	AUX_LO_SPEED = 0x40,
176	AUX_HI_SPEED = 0x41
177};
~/ Read-only file preview.