1 | // SPDX-License-Identifier: GPL-2.0-or-later |
---|---|
2 | /* |
3 | * altera-lpt.c |
4 | * |
5 | * altera FPGA driver |
6 | * |
7 | * Copyright (C) Altera Corporation 1998-2001 |
8 | * Copyright (C) 2010 NetUP Inc. |
9 | * Copyright (C) 2010 Abylay Ospan <aospan@netup.ru> |
10 | */ |
11 | |
12 | #include <linux/io.h> |
13 | #include <linux/kernel.h> |
14 | #include "altera-exprt.h" |
15 | |
16 | static int lpt_hardware_initialized; |
17 | |
18 | static void byteblaster_write(int port, int data) |
19 | { |
20 | outb(value: (u8)data, port: (u16)(port + 0x378)); |
21 | }; |
22 | |
23 | static int byteblaster_read(int port) |
24 | { |
25 | int data = 0; |
26 | data = inb(port: (u16)(port + 0x378)); |
27 | return data & 0xff; |
28 | }; |
29 | |
30 | int netup_jtag_io_lpt(void *device, int tms, int tdi, int read_tdo) |
31 | { |
32 | int data = 0; |
33 | int tdo = 0; |
34 | int initial_lpt_ctrl = 0; |
35 | |
36 | if (!lpt_hardware_initialized) { |
37 | initial_lpt_ctrl = byteblaster_read(port: 2); |
38 | byteblaster_write(port: 2, data: (initial_lpt_ctrl | 0x02) & 0xdf); |
39 | lpt_hardware_initialized = 1; |
40 | } |
41 | |
42 | data = ((tdi ? 0x40 : 0) | (tms ? 0x02 : 0)); |
43 | |
44 | byteblaster_write(port: 0, data); |
45 | |
46 | if (read_tdo) { |
47 | tdo = byteblaster_read(port: 1); |
48 | tdo = ((tdo & 0x80) ? 0 : 1); |
49 | } |
50 | |
51 | byteblaster_write(port: 0, data: data | 0x01); |
52 | |
53 | byteblaster_write(port: 0, data); |
54 | |
55 | return tdo; |
56 | } |
57 |