Lines Matching +full:8 +full:- +full:port
1 // SPDX-License-Identifier: GPL-2.0-or-later
5 * backpack.c is a low-level protocol driver for the Micro Solutions
6 * "BACKPACK" parallel port IDE adapter (works on Series 6 drives).
8 * Written by: Ken Hahn (linux-dev@micro-solutions.com)
9 * Clive Turvey (linux-dev@micro-solutions.com)
29 #define PREFIX_IO16 0x01 // perform 16-bit wide I/O
30 #define PREFIX_FASTWR 0x04 // enable PPC mode fast-write
51 /* DONT CHANGE THESE LEST YOU BREAK EVERYTHING - BIT FIELD DEPENDENCIES */
65 switch (mode_map[pi->mode]) { in bpck6_send_cmd()
70 parport_write_data(pi->pardev->port, cmd); in bpck6_send_cmd()
71 parport_frob_control(pi->pardev->port, 0, PARPORT_CONTROL_AUTOFD); in bpck6_send_cmd()
76 pi->pardev->port->ops->epp_write_addr(pi->pardev->port, &cmd, 1, 0); in bpck6_send_cmd()
85 switch (mode_map[pi->mode]) { in bpck6_rd_data_byte()
88 parport_frob_control(pi->pardev->port, PARPORT_CONTROL_STROBE, in bpck6_rd_data_byte()
90 data = parport_read_status(pi->pardev->port); in bpck6_rd_data_byte()
92 parport_frob_control(pi->pardev->port, PARPORT_CONTROL_STROBE, in bpck6_rd_data_byte()
94 data |= parport_read_status(pi->pardev->port) & 0xB8; in bpck6_rd_data_byte()
98 parport_data_reverse(pi->pardev->port); in bpck6_rd_data_byte()
99 parport_frob_control(pi->pardev->port, PARPORT_CONTROL_STROBE, in bpck6_rd_data_byte()
101 data = parport_read_data(pi->pardev->port); in bpck6_rd_data_byte()
102 parport_frob_control(pi->pardev->port, PARPORT_CONTROL_STROBE, 0); in bpck6_rd_data_byte()
103 parport_data_forward(pi->pardev->port); in bpck6_rd_data_byte()
108 pi->pardev->port->ops->epp_read_data(pi->pardev->port, &data, 1, 0); in bpck6_rd_data_byte()
117 switch (mode_map[pi->mode]) { in bpck6_wr_data_byte()
122 parport_write_data(pi->pardev->port, data); in bpck6_wr_data_byte()
123 parport_frob_control(pi->pardev->port, 0, PARPORT_CONTROL_INIT); in bpck6_wr_data_byte()
128 pi->pardev->port->ops->epp_write_data(pi->pardev->port, &data, 1, 0); in bpck6_wr_data_byte()
135 u8 port = cont ? reg | 8 : reg; in bpck6_read_regr() local
137 bpck6_send_cmd(pi, port | ACCESS_PORT | ACCESS_READ); in bpck6_read_regr()
143 u8 port = cont ? reg | 8 : reg; in bpck6_write_regr() local
145 bpck6_send_cmd(pi, port | ACCESS_PORT | ACCESS_WRITE); in bpck6_write_regr()
153 if (pi->private & fifo_wait) { in bpck6_wait_for_fifo()
155 parport_read_status(pi->pardev->port); in bpck6_wait_for_fifo()
165 bpck6_wr_data_byte(pi, (u8)(len >> 8)); in bpck6_write_block()
171 switch (mode_map[pi->mode]) { in bpck6_write_block()
174 while (len--) { in bpck6_write_block()
175 parport_write_data(pi->pardev->port, *buf++); in bpck6_write_block()
176 parport_frob_control(pi->pardev->port, 0, in bpck6_write_block()
184 parport_frob_control(pi->pardev->port, PARPORT_CONTROL_STROBE, in bpck6_write_block()
189 parport_write_data(pi->pardev->port, last); in bpck6_write_block()
193 len--; in bpck6_write_block()
196 parport_frob_control(pi->pardev->port, 0, in bpck6_write_block()
199 parport_write_data(pi->pardev->port, this); in bpck6_write_block()
204 parport_frob_control(pi->pardev->port, PARPORT_CONTROL_STROBE, in bpck6_write_block()
209 pi->pardev->port->ops->epp_write_data(pi->pardev->port, buf, in bpck6_write_block()
214 pi->pardev->port->ops->epp_write_data(pi->pardev->port, buf, in bpck6_write_block()
219 pi->pardev->port->ops->epp_write_data(pi->pardev->port, buf, in bpck6_write_block()
232 bpck6_wr_data_byte(pi, (u8)(len >> 8)); in bpck6_read_block()
238 switch (mode_map[pi->mode]) { in bpck6_read_block()
244 parport_frob_control(pi->pardev->port, in bpck6_read_block()
247 d = parport_read_status(pi->pardev->port); in bpck6_read_block()
249 parport_frob_control(pi->pardev->port, in bpck6_read_block()
252 d |= parport_read_status(pi->pardev->port) & 0xB8; in bpck6_read_block()
254 len--; in bpck6_read_block()
259 parport_data_reverse(pi->pardev->port); in bpck6_read_block()
261 parport_frob_control(pi->pardev->port, in bpck6_read_block()
264 *buf++ = parport_read_data(pi->pardev->port); in bpck6_read_block()
265 len--; in bpck6_read_block()
267 parport_frob_control(pi->pardev->port, PARPORT_CONTROL_STROBE, in bpck6_read_block()
269 parport_data_forward(pi->pardev->port); in bpck6_read_block()
272 pi->pardev->port->ops->epp_read_data(pi->pardev->port, buf, len, in bpck6_read_block()
276 pi->pardev->port->ops->epp_read_data(pi->pardev->port, buf, len, in bpck6_read_block()
280 pi->pardev->port->ops->epp_read_data(pi->pardev->port, buf, len, in bpck6_read_block()
292 pi->saved_r0 = parport_read_data(pi->pardev->port); in bpck6_open()
293 pi->saved_r2 = parport_read_control(pi->pardev->port) & 0x5F; in bpck6_open()
295 parport_frob_control(pi->pardev->port, PARPORT_CONTROL_SELECT, in bpck6_open()
297 if (pi->saved_r0 == 'b') in bpck6_open()
298 parport_write_data(pi->pardev->port, 'x'); in bpck6_open()
299 parport_write_data(pi->pardev->port, 'b'); in bpck6_open()
300 parport_write_data(pi->pardev->port, 'p'); in bpck6_open()
301 parport_write_data(pi->pardev->port, pi->unit); in bpck6_open()
302 parport_write_data(pi->pardev->port, ~pi->unit); in bpck6_open()
304 parport_frob_control(pi->pardev->port, PARPORT_CONTROL_SELECT, 0); in bpck6_open()
305 parport_write_control(pi->pardev->port, PARPORT_CONTROL_INIT); in bpck6_open()
307 i = mode_map[pi->mode] & 0x0C; in bpck6_open()
309 i = (mode_map[pi->mode] & 2) | 1; in bpck6_open()
310 parport_write_data(pi->pardev->port, i); in bpck6_open()
312 parport_frob_control(pi->pardev->port, PARPORT_CONTROL_SELECT, in bpck6_open()
314 parport_frob_control(pi->pardev->port, PARPORT_CONTROL_AUTOFD, in bpck6_open()
318 k = parport_read_status(pi->pardev->port) & 0xB8; in bpck6_open()
322 parport_frob_control(pi->pardev->port, PARPORT_CONTROL_AUTOFD, 0); in bpck6_open()
323 k = (parport_read_status(pi->pardev->port) & 0xB8) ^ 0xB8; in bpck6_open()
329 parport_frob_control(pi->pardev->port, in bpck6_open()
333 parport_frob_control(pi->pardev->port, PARPORT_CONTROL_SELECT, 0); in bpck6_open()
336 pi->private = 0; in bpck6_open()
343 pi->private |= fifo_wait; in bpck6_open()
348 parport_write_control(pi->pardev->port, pi->saved_r2); in bpck6_open()
349 parport_write_data(pi->pardev->port, pi->saved_r0); in bpck6_open()
356 if (mode_map[pi->mode] & 4) { in bpck6_deselect()
358 parport_frob_control(pi->pardev->port, PARPORT_CONTROL_INIT, in bpck6_deselect()
362 parport_frob_control(pi->pardev->port, PARPORT_CONTROL_SELECT, in bpck6_deselect()
366 parport_write_data(pi->pardev->port, pi->saved_r0); in bpck6_deselect()
367 parport_write_control(pi->pardev->port, in bpck6_deselect()
368 pi->saved_r2 | PARPORT_CONTROL_SELECT); in bpck6_deselect()
369 parport_write_control(pi->pardev->port, pi->saved_r2); in bpck6_deselect()
380 dev_dbg(&pi->dev, "connect\n"); in bpck6_connect()
388 dev_dbg(&pi->dev, "disconnect\n"); in bpck6_disconnect()
393 /* check for 8-bit port */
396 dev_dbg(&pi->dev, "PARPORT indicates modes=%x for lp=0x%lx\n", in bpck6_test_port()
397 pi->pardev->port->modes, pi->pardev->port->base); in bpck6_test_port()
400 if (pi->pardev->port->modes & PARPORT_MODE_EPP) in bpck6_test_port()
402 if (pi->pardev->port->modes & PARPORT_MODE_TRISTATE) in bpck6_test_port()
411 dev_dbg(&pi->dev, "PROBE UNIT %x on port:%x\n", pi->unit, pi->port); in bpck6_probe_unit()
413 saved_mode = pi->mode; in bpck6_probe_unit()
415 pi->mode = 0; in bpck6_probe_unit()
419 dev_dbg(&pi->dev, "ppc_open returned %2x\n", out); in bpck6_probe_unit()
423 dev_dbg(&pi->dev, "leaving probe\n"); in bpck6_probe_unit()
424 pi->mode = saved_mode; in bpck6_probe_unit()
428 dev_dbg(&pi->dev, "Failed open\n"); in bpck6_probe_unit()
429 pi->mode = saved_mode; in bpck6_probe_unit()
436 char *mode_string[5] = { "4-bit", "8-bit", "EPP-8", "EPP-16", "EPP-32" }; in bpck6_log_adapter()
438 dev_info(&pi->dev, in bpck6_log_adapter()
440 pi->unit, pi->port, pi->mode, mode_string[pi->mode], pi->delay); in bpck6_log_adapter()
447 .epp_first = 2, /* 2-5 use epp (need 8 ports) */
462 MODULE_DESCRIPTION("Micro Solutions BACKPACK parallel port IDE adapter "