1 /* SPDX-License-Identifier: GPL-2.0 */
2 
3 /***************************************************************************
4  *    copyright            : (C) 2002, 2005 by Frank Mori Hess             *
5  ***************************************************************************/
6 
7 #include "tms9914.h"
8 #include "gpibP.h"
9 
10 enum hp_82341_hardware_version {
11 	HW_VERSION_UNKNOWN,
12 	HW_VERSION_82341C,
13 	HW_VERSION_82341D,
14 };
15 
16 // struct which defines private_data for board
17 struct hp_82341_priv {
18 	struct tms9914_priv tms9914_priv;
19 	unsigned int irq;
20 	unsigned short config_control_bits;
21 	unsigned short mode_control_bits;
22 	unsigned short event_status_bits;
23 	struct pnp_dev *pnp_dev;
24 	unsigned long iobase[4];
25 	unsigned long io_region_offset;
26 	enum hp_82341_hardware_version hw_version;
27 };
28 
29 static const int hp_82341_region_iosize = 0x8;
30 static const int hp_82341_num_io_regions = 4;
31 static const int hp_82341_fifo_size = 0xffe;
32 static const int hp_82341c_firmware_length = 5764;
33 static const int hp_82341d_firmware_length = 5302;
34 
35 // hp 82341 register offsets
36 enum hp_82341_region_0_registers {
37 	CONFIG_CONTROL_STATUS_REG = 0x0,
38 	MODE_CONTROL_STATUS_REG = 0x1,
39 	MONITOR_REG = 0x2,	// after initialization
40 	XILINX_DATA_REG = 0x2,	// before initialization, write only
41 	INTERRUPT_ENABLE_REG = 0x3,
42 	EVENT_STATUS_REG = 0x4,
43 	EVENT_ENABLE_REG = 0x5,
44 	STREAM_STATUS_REG = 0x7,
45 };
46 
47 enum hp_82341_region_1_registers {
48 	ID0_REG = 0x2,
49 	ID1_REG = 0x3,
50 	TRANSFER_COUNT_LOW_REG = 0x4,
51 	TRANSFER_COUNT_MID_REG = 0x5,
52 	TRANSFER_COUNT_HIGH_REG = 0x6,
53 };
54 
55 enum hp_82341_region_3_registers {
56 	BUFFER_PORT_LOW_REG = 0x0,
57 	BUFFER_PORT_HIGH_REG = 0x1,
58 	ID2_REG = 0x2,
59 	ID3_REG = 0x3,
60 	BUFFER_FLUSH_REG = 0x4,
61 	BUFFER_CONTROL_REG = 0x7
62 };
63 
64 enum config_control_status_bits {
65 	IRQ_SELECT_MASK = 0x7,
66 	DMA_CONFIG_MASK = 0x18,
67 	ENABLE_DMA_CONFIG_BIT = 0x20,
68 	XILINX_READY_BIT = 0x40,	//read only
69 	DONE_PGL_BIT = 0x80
70 };
71 
IRQ_SELECT_BITS(int irq)72 static inline unsigned int IRQ_SELECT_BITS(int irq)
73 {
74 	switch (irq) {
75 	case 3:
76 		return 0x3;
77 	case 5:
78 		return 0x2;
79 	case 7:
80 		return 0x1;
81 	case 9:
82 		return 0x0;
83 	case 10:
84 		return 0x7;
85 	case 11:
86 		return 0x6;
87 	case 12:
88 		return 0x5;
89 	case 15:
90 		return 0x4;
91 	default:
92 		return 0x0;
93 	}
94 };
95 
96 enum mode_control_status_bits {
97 	SLOT8_BIT = 0x1,	// read only
98 	ACTIVE_CONTROLLER_BIT = 0x2,	// read only
99 	ENABLE_DMA_BIT = 0x4,
100 	SYSTEM_CONTROLLER_BIT = 0x8,
101 	MONITOR_BIT = 0x10,
102 	ENABLE_IRQ_CONFIG_BIT = 0x20,
103 	ENABLE_TI_STREAM_BIT = 0x40
104 };
105 
106 enum monitor_bits {
107 	MONITOR_INTERRUPT_PENDING_BIT = 0x1,	// read only
108 	MONITOR_CLEAR_HOLDOFF_BIT = 0x2,	// write only
109 	MONITOR_PPOLL_BIT = 0x4,	// write clear
110 	MONITOR_SRQ_BIT = 0x8,	// write clear
111 	MONITOR_IFC_BIT = 0x10,	// write clear
112 	MONITOR_REN_BIT = 0x20,	// write clear
113 	MONITOR_END_BIT = 0x40,	// write clear
114 	MONITOR_DAV_BIT = 0x80	// write clear
115 };
116 
117 enum interrupt_enable_bits {
118 	ENABLE_TI_INTERRUPT_BIT = 0x1,
119 	ENABLE_POINTERS_EQUAL_INTERRUPT_BIT = 0x4,
120 	ENABLE_BUFFER_END_INTERRUPT_BIT = 0x10,
121 	ENABLE_TERMINAL_COUNT_INTERRUPT_BIT = 0x20,
122 	ENABLE_DMA_TERMINAL_COUNT_INTERRUPT_BIT = 0x80,
123 };
124 
125 enum event_status_bits {
126 	TI_INTERRUPT_EVENT_BIT = 0x1,	//write clear
127 	INTERRUPT_PENDING_EVENT_BIT = 0x2,	// read only
128 	POINTERS_EQUAL_EVENT_BIT = 0x4,	//write clear
129 	BUFFER_END_EVENT_BIT = 0x10,	//write clear
130 	TERMINAL_COUNT_EVENT_BIT = 0x20,	// write clear
131 	DMA_TERMINAL_COUNT_EVENT_BIT = 0x80,	// write clear
132 };
133 
134 enum event_enable_bits {
135 	ENABLE_TI_INTERRUPT_EVENT_BIT = 0x1,	//write clear
136 	ENABLE_POINTERS_EQUAL_EVENT_BIT = 0x4,	//write clear
137 	ENABLE_BUFFER_END_EVENT_BIT = 0x10,	//write clear
138 	ENABLE_TERMINAL_COUNT_EVENT_BIT = 0x20,	// write clear
139 	ENABLE_DMA_TERMINAL_COUNT_EVENT_BIT = 0x80,	// write clear
140 };
141 
142 enum stream_status_bits {
143 	HALTED_STATUS_BIT = 0x1,	//read
144 	RESTART_STREAM_BIT = 0x1	//write
145 };
146 
147 enum buffer_control_bits {
148 	DIRECTION_GPIB_TO_HOST_BIT = 0x20,	// transfer direction (set for gpib to host)
149 	ENABLE_TI_BUFFER_BIT = 0x40,	//enable fifo
150 	FAST_WR_EN_BIT = 0x80,	// 350 ns t1 delay?
151 };
152 
153 // registers accessible through isapnp chip on 82341d
154 enum hp_82341d_pnp_registers {
155 	PIO_DATA_REG = 0x20,	//read/write pio data lines
156 	PIO_DIRECTION_REG = 0x21,	// set pio data line directions (set for input)
157 };
158 
159 enum hp_82341d_pnp_pio_bits {
160 	HP_82341D_XILINX_READY_BIT = 0x1,
161 	HP_82341D_XILINX_DONE_BIT = 0x2,
162 	// use register layout compatible with C and older versions instead of 32 contiguous ioports
163 	HP_82341D_LEGACY_MODE_BIT = 0x4,
164 	HP_82341D_NOT_PROG_BIT = 0x8,	// clear to reinitialize xilinx
165 };
166