File Index
Files and directories
Sign in
FILE

tms9914.h

File preview with syntax highlighting.

linux-6.19.14/drivers/gpib/include/tms9914.h C
  1/* SPDX-License-Identifier: GPL-2.0 */
  2
  3/***************************************************************************
  4 *    copyright            : (C) 2002 by Frank Mori Hess
  5 ***************************************************************************/
  6
  7#ifndef _TMS9914_H
  8#define _TMS9914_H
  9
 10#include <linux/types.h>
 11#include <linux/interrupt.h>
 12#include "gpib_state_machines.h"
 13#include "gpib_types.h"
 14
 15enum tms9914_holdoff_mode {
 16	TMS9914_HOLDOFF_NONE,
 17	TMS9914_HOLDOFF_EOI,
 18	TMS9914_HOLDOFF_ALL,
 19};
 20
 21/* struct used to provide variables local to a tms9914 chip */
 22struct tms9914_priv {
 23#ifdef CONFIG_HAS_IOPORT
 24	u32 iobase;
 25#endif
 26	void __iomem *mmiobase;
 27	unsigned int offset;	// offset between successive tms9914 io addresses
 28	unsigned int dma_channel;
 29	// software copy of bits written to interrupt mask registers
 30	u8 imr0_bits, imr1_bits;
 31	// bits written to address mode register
 32	u8 admr_bits;
 33	u8 auxa_bits;		// bits written to auxiliary register A
 34	// used to keep track of board's state, bit definitions given below
 35	unsigned long state;
 36	u8 eos;			// eos character
 37	short eos_flags;
 38	u8 spoll_status;
 39	enum tms9914_holdoff_mode holdoff_mode;
 40	unsigned int ppoll_line;
 41	enum talker_function_state talker_state;
 42	enum listener_function_state listener_state;
 43	unsigned ppoll_sense : 1;
 44	unsigned ppoll_enable : 1;
 45	unsigned ppoll_configure_state : 1;
 46	unsigned primary_listen_addressed : 1;
 47	unsigned primary_talk_addressed : 1;
 48	unsigned holdoff_on_end : 1;
 49	unsigned holdoff_on_all : 1;
 50	unsigned holdoff_active : 1;
 51	// wrappers for outb, inb, readb, or writeb
 52	u8 (*read_byte)(struct tms9914_priv *priv, unsigned int register_number);
 53	void (*write_byte)(struct tms9914_priv *priv, u8 byte, unsigned int
 54			   register_number);
 55};
 56
 57// slightly shorter way to access read_byte and write_byte
 58static inline u8 read_byte(struct tms9914_priv *priv, unsigned int register_number)
 59{
 60	return priv->read_byte(priv, register_number);
 61}
 62
 63static inline void write_byte(struct tms9914_priv *priv, u8 byte, unsigned int register_number)
 64{
 65	priv->write_byte(priv, byte, register_number);
 66}
 67
 68// struct tms9914_priv.state bit numbers
 69enum {
 70	PIO_IN_PROGRESS_BN,		// pio transfer in progress
 71	DMA_READ_IN_PROGRESS_BN,	// dma read transfer in progress
 72	DMA_WRITE_IN_PROGRESS_BN,	// dma write transfer in progress
 73	READ_READY_BN,			// board has data byte available to read
 74	WRITE_READY_BN,			// board is ready to send a data byte
 75	COMMAND_READY_BN,		// board is ready to send a command byte
 76	RECEIVED_END_BN,		// received END
 77	BUS_ERROR_BN,			// bus error
 78	DEV_CLEAR_BN,			// device clear received
 79};
 80
 81// interface functions
 82int tms9914_read(struct gpib_board *board, struct tms9914_priv *priv, u8 *buffer,
 83		 size_t length, int *end, size_t *bytes_read);
 84int tms9914_write(struct gpib_board *board, struct tms9914_priv *priv, u8 *buffer,
 85		  size_t length, int send_eoi, size_t *bytes_written);
 86int tms9914_command(struct gpib_board *board, struct tms9914_priv *priv, u8 *buffer,
 87		    size_t length, size_t *bytes_written);
 88int tms9914_take_control(struct gpib_board *board, struct tms9914_priv *priv, int syncronous);
 89/*
 90 * alternate version of tms9914_take_control which works around buggy tcs
 91 * implementation.
 92 */
 93int tms9914_take_control_workaround(struct gpib_board *board, struct tms9914_priv *priv,
 94				    int syncronous);
 95int tms9914_go_to_standby(struct gpib_board *board, struct tms9914_priv *priv);
 96int tms9914_request_system_control(struct gpib_board *board, struct tms9914_priv *priv,
 97				   int request_control);
 98void tms9914_interface_clear(struct gpib_board *board, struct tms9914_priv *priv, int assert);
 99void tms9914_remote_enable(struct gpib_board *board, struct tms9914_priv *priv, int enable);
100int tms9914_enable_eos(struct gpib_board *board, struct tms9914_priv *priv, u8 eos_bytes,
101		       int compare_8_bits);
102void tms9914_disable_eos(struct gpib_board *board, struct tms9914_priv *priv);
103unsigned int tms9914_update_status(struct gpib_board *board, struct tms9914_priv *priv,
104				   unsigned int clear_mask);
105int tms9914_primary_address(struct gpib_board *board,
106			    struct tms9914_priv *priv, unsigned int address);
107int tms9914_secondary_address(struct gpib_board *board, struct tms9914_priv *priv,
108			      unsigned int address, int enable);
109int tms9914_parallel_poll(struct gpib_board *board, struct tms9914_priv *priv, u8 *result);
110void tms9914_parallel_poll_configure(struct gpib_board *board,
111				     struct tms9914_priv *priv, u8 config);
112void tms9914_parallel_poll_response(struct gpib_board *board,
113				    struct tms9914_priv *priv, int ist);
114void tms9914_serial_poll_response(struct gpib_board *board,
115				  struct tms9914_priv *priv, u8 status);
116u8 tms9914_serial_poll_status(struct gpib_board *board, struct tms9914_priv *priv);
117int tms9914_line_status(const struct gpib_board *board, struct tms9914_priv *priv);
118unsigned int tms9914_t1_delay(struct gpib_board *board, struct tms9914_priv *priv,
119			      unsigned int nano_sec);
120void tms9914_return_to_local(const struct gpib_board *board, struct tms9914_priv *priv);
121
122// utility functions
123void tms9914_board_reset(struct tms9914_priv *priv);
124void tms9914_online(struct gpib_board *board, struct tms9914_priv *priv);
125void tms9914_release_holdoff(struct tms9914_priv *priv);
126void tms9914_set_holdoff_mode(struct tms9914_priv *priv, enum tms9914_holdoff_mode mode);
127
128// wrappers for io functions
129u8 tms9914_ioport_read_byte(struct tms9914_priv *priv, unsigned int register_num);
130void tms9914_ioport_write_byte(struct tms9914_priv *priv, u8 data, unsigned int register_num);
131u8 tms9914_iomem_read_byte(struct tms9914_priv *priv, unsigned int register_num);
132void tms9914_iomem_write_byte(struct tms9914_priv *priv, u8 data, unsigned int register_num);
133
134// interrupt service routine
135irqreturn_t tms9914_interrupt(struct gpib_board *board, struct tms9914_priv *priv);
136irqreturn_t tms9914_interrupt_have_status(struct gpib_board *board, struct tms9914_priv *priv,
137					  int status1,	int status2);
138
139// tms9914 has 8 registers
140enum {
141	ms9914_num_registers = 8,
142};
143
144/*
145 * tms9914 register numbers (might need to be multiplied by
146 * a board-dependent offset to get actually io address offset)
147 */
148// write registers
149enum {
150	IMR0 = 0,	/* interrupt mask 0          */
151	IMR1 = 1,	/* interrupt mask 1          */
152	AUXCR = 3,	/* auxiliary command         */
153	ADR = 4,	/* address register	     */
154	SPMR = 5,	/* serial poll mode register */
155	PPR = 6,	/* parallel poll             */
156	CDOR = 7,	/* data out register         */
157};
158
159// read registers
160enum {
161	ISR0 = 0,	/* interrupt status 0	     */
162	ISR1 = 1,	/* interrupt status 1	     */
163	ADSR = 2,	/* address status	     */
164	BSR = 3,	/* bus status		     */
165	CPTR = 6,	/* command pass thru	     */
166	DIR = 7,	/* data in register          */
167};
168
169// bit definitions common to tms9914 compatible registers
170
171/* ISR0   - Register bits */
172enum isr0_bits {
173	HR_MAC = (1 << 0),   /* My Address Change           */
174	HR_RLC = (1 << 1),   /* Remote/Local change         */
175	HR_SPAS = (1 << 2),   /* Serial Poll active State    */
176	HR_END = (1 << 3),   /* END (EOI or EOS)            */
177	HR_BO = (1 << 4),   /* Byte Out                    */
178	HR_BI = (1 << 5),   /* Byte In                     */
179};
180
181/* IMR0   - Register bits */
182enum imr0_bits {
183	HR_MACIE = (1 << 0),   /*        */
184	HR_RLCIE = (1 << 1),   /*        */
185	HR_SPASIE = (1 << 2),   /*        */
186	HR_ENDIE = (1 << 3),   /*        */
187	HR_BOIE = (1 << 4),   /*        */
188	HR_BIIE = (1 << 5),   /*        */
189};
190
191/* ISR1   - Register bits */
192enum isr1_bits {
193	HR_IFC = (1 << 0),   /* IFC asserted                */
194	HR_SRQ = (1 << 1),   /* SRQ asserted                */
195	HR_MA = (1 << 2),    /* My Address                  */
196	HR_DCAS = (1 << 3),  /* Device Clear active State   */
197	HR_APT = (1 << 4),   /* Address pass Through        */
198	HR_UNC = (1 << 5),   /* Unrecognized Command        */
199	HR_ERR = (1 << 6),   /* Data Transmission Error     */
200	HR_GET = (1 << 7),   /* Group execute Trigger       */
201};
202
203/* IMR1   - Register bits */
204enum imr1_bits {
205	HR_IFCIE = (1 << 0),   /*        */
206	HR_SRQIE = (1 << 1),   /*        */
207	HR_MAIE = (1 << 2),    /*        */
208	HR_DCASIE = (1 << 3),  /*        */
209	HR_APTIE = (1 << 4),   /*        */
210	HR_UNCIE = (1 << 5),   /*        */
211	HR_ERRIE = (1 << 6),   /*        */
212	HR_GETIE = (1 << 7),   /*        */
213};
214
215/* ADSR   - Register bits */
216enum adsr_bits {
217	HR_ULPA = (1 << 0),   /* Store last address LSB       */
218	HR_TA = (1 << 1),     /* Talker Adressed              */
219	HR_LA = (1 << 2),     /* Listener adressed            */
220	HR_TPAS = (1 << 3),   /* talker primary address state */
221	HR_LPAS = (1 << 4),   /* listener    "                */
222	HR_ATN = (1 << 5),    /* ATN active                   */
223	HR_LLO = (1 << 6),    /* LLO active                   */
224	HR_REM = (1 << 7),    /* REM active                   */
225};
226
227/* ADR   - Register bits */
228enum adr_bits {
229	ADDRESS_MASK = 0x1f,	/* mask to specify lower 5 bits for ADR */
230	HR_DAT = (1 << 5),      /* disable talker */
231	HR_DAL = (1 << 6),      /* disable listener */
232	HR_EDPA = (1 << 7),     /* enable dual primary addressing */
233};
234
235enum bus_status_bits {
236	BSR_REN_BIT = 0x1,
237	BSR_IFC_BIT = 0x2,
238	BSR_SRQ_BIT = 0x4,
239	BSR_EOI_BIT = 0x8,
240	BSR_NRFD_BIT = 0x10,
241	BSR_NDAC_BIT = 0x20,
242	BSR_DAV_BIT = 0x40,
243	BSR_ATN_BIT = 0x80,
244};
245
246/*---------------------------------------------------------*/
247/* TMS 9914 Auxiliary Commands                             */
248/*---------------------------------------------------------*/
249
250enum aux_cmd_bits {
251	AUX_CS = 0x80,			/* set bit instead of clearing it, used with commands marked 'd' below */
252	AUX_CHIP_RESET = 0x0,		/* d Chip reset                   */
253	AUX_INVAL = 0x1,		/* release dac holdoff, invalid command byte */
254	AUX_VAL = (AUX_INVAL | AUX_CS),	/* release dac holdoff, valid command byte   */
255	AUX_RHDF = 0x2,			/* X Release RFD holdoff          */
256	AUX_HLDA = 0x3,			/* d holdoff on all data          */
257	AUX_HLDE = 0x4,			/* d holdoff on EOI only          */
258	AUX_NBAF = 0x5,			/* X Set new byte available false */
259	AUX_FGET = 0x6,			/* d force GET                    */
260	AUX_RTL = 0x7,			/* d return to local              */
261	AUX_SEOI = 0x8,			/* X send EOI with next byte      */
262	AUX_LON = 0x9,			/* d Listen only                  */
263	AUX_TON = 0xa,			/* d Talk only                    */
264	AUX_GTS = 0xb,			/* X goto standby                 */
265	AUX_TCA = 0xc,			/* X take control asynchronously  */
266	AUX_TCS = 0xd,			/* X take    "     synchronously  */
267	AUX_RPP = 0xe,			/* d Request parallel poll        */
268	AUX_SIC = 0xf,			/* d send interface clear         */
269	AUX_SRE = 0x10,			/* d send remote enable           */
270	AUX_RQC = 0x11,			/* X request control              */
271	AUX_RLC = 0x12,			/* X release control              */
272	AUX_DAI = 0x13,			/* d disable all interrupts       */
273	AUX_PTS = 0x14,			/* X pass through next secondary  */
274	AUX_STDL = 0x15,		/* d short T1 delay		  */
275	AUX_SHDW = 0x16,		/* d shadow handshake             */
276	AUX_VSTDL = 0x17,		/* d very short T1 delay (smj9914 extension)   */
277	AUX_RSV2 = 0x18,		/* d request service bit 2 (smj9914 extension) */
278};
279
280#endif	//_TMS9914_H
~/ Read-only file preview.