2 fit2.c (c) 1998 Grant R. Guenther <grant@torque.net>
3 Under the terms of the GNU General Public License.
5 fit2.c is a low-level protocol driver for the older version
6 of the Fidelity International Technology parallel port adapter.
7 This adapter is used in their TransDisk 2000 and older TransDisk
8 3000 portable hard-drives. As far as I can tell, this device
9 supports 4-bit mode _only_.
11 Newer models of the FIT products use an enhanced protocol.
12 The "fit3" protocol module should support current drives.
16 #define FIT2_VERSION "1.0"
18 #include <linux/module.h>
19 #include <linux/init.h>
20 #include <linux/delay.h>
21 #include <linux/kernel.h>
22 #include <linux/types.h>
23 #include <linux/wait.h>
28 #define j44(a,b) (((a>>4)&0x0f)|(b&0xf0))
30 /* cont = 0 - access the IDE register file
31 cont = 1 - access the IDE command set
33 NB: The FIT adapter does not appear to use the control registers.
34 So, we map ALT_STATUS to STATUS and NO-OP writes to the device
35 control register - this means that IDE reset will not work on these
40 static void fit2_write_regr( PIA
*pi
, int cont
, int regr
, int val
)
42 { if (cont
== 1) return;
43 w2(0xc); w0(regr
); w2(4); w0(val
); w2(5); w0(0); w2(4);
46 static int fit2_read_regr( PIA
*pi
, int cont
, int regr
)
51 if (regr
!= 6) return 0xff;
53 } else r
= regr
+ 0x10;
55 w2(0xc); w0(r
); w2(4); w2(5);
64 static void fit2_read_block( PIA
*pi
, char * buf
, int count
)
70 for (k
=0;k
<count
/4;k
++) {
73 w0(0); a
= r1(); w0(1); b
= r1();
74 w0(3); c
= r1(); w0(2); d
= r1();
75 buf
[4*k
+0] = j44(a
,b
);
76 buf
[4*k
+1] = j44(d
,c
);
79 a
= r1(); w0(3); b
= r1();
80 w0(1); c
= r1(); w0(0); d
= r1();
81 buf
[4*k
+2] = j44(d
,c
);
82 buf
[4*k
+3] = j44(a
,b
);
90 static void fit2_write_block( PIA
*pi
, char * buf
, int count
)
96 for (k
=0;k
<count
/2;k
++) {
98 w2(5); w0(buf
[2*k
+1]);
103 static void fit2_connect ( PIA
*pi
)
105 { pi
->saved_r0
= r0();
110 static void fit2_disconnect ( PIA
*pi
)
116 static void fit2_log_adapter( PIA
*pi
, char * scratch
, int verbose
)
118 { printk("%s: fit2 %s, FIT 2000 adapter at 0x%x, delay %d\n",
119 pi
->device
,FIT2_VERSION
,pi
->port
,pi
->delay
);
123 static struct pi_protocol fit2
= {
124 .owner
= THIS_MODULE
,
130 .write_regr
= fit2_write_regr
,
131 .read_regr
= fit2_read_regr
,
132 .write_block
= fit2_write_block
,
133 .read_block
= fit2_read_block
,
134 .connect
= fit2_connect
,
135 .disconnect
= fit2_disconnect
,
136 .log_adapter
= fit2_log_adapter
,
139 static int __init
fit2_init(void)
141 return pi_register(&fit2
)-1;
144 static void __exit
fit2_exit(void)
146 pi_unregister(&fit2
);
149 MODULE_LICENSE("GPL");
150 module_init(fit2_init
)
151 module_exit(fit2_exit
)