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