2 paride.c (c) 1997-8 Grant R. Guenther <grant@torque.net>
3 Under the terms of the GNU General Public License.
5 This is the base module for the family of device drivers
6 that support parallel port IDE devices.
12 1.01 GRG 1998.05.03 Use spinlocks
13 1.02 GRG 1998.05.05 init_proto, release_proto, ktti
14 1.03 GRG 1998.08.15 eliminate compiler warning
15 1.04 GRG 1998.11.28 added support for FRIQ
16 1.05 TMW 2000.06.06 use parport_find_number instead of
18 1.06 TMW 2001.03.26 more sane parport-or-not resource management
21 #define PI_VERSION "1.06"
23 #include <linux/module.h>
24 #include <linux/kmod.h>
25 #include <linux/types.h>
26 #include <linux/kernel.h>
27 #include <linux/ioport.h>
28 #include <linux/string.h>
29 #include <linux/spinlock.h>
30 #include <linux/wait.h>
31 #include <linux/sched.h> /* TASK_* */
32 #include <linux/parport.h>
36 MODULE_LICENSE("GPL");
40 static struct pi_protocol
*protocols
[MAX_PROTOS
];
42 static DEFINE_SPINLOCK(pi_spinlock
);
44 void pi_write_regr(PIA
* pi
, int cont
, int regr
, int val
)
46 pi
->proto
->write_regr(pi
, cont
, regr
, val
);
49 EXPORT_SYMBOL(pi_write_regr
);
51 int pi_read_regr(PIA
* pi
, int cont
, int regr
)
53 return pi
->proto
->read_regr(pi
, cont
, regr
);
56 EXPORT_SYMBOL(pi_read_regr
);
58 void pi_write_block(PIA
* pi
, char *buf
, int count
)
60 pi
->proto
->write_block(pi
, buf
, count
);
63 EXPORT_SYMBOL(pi_write_block
);
65 void pi_read_block(PIA
* pi
, char *buf
, int count
)
67 pi
->proto
->read_block(pi
, buf
, count
);
70 EXPORT_SYMBOL(pi_read_block
);
72 static void pi_wake_up(void *p
)
76 void (*cont
) (void) = NULL
;
78 spin_lock_irqsave(&pi_spinlock
, flags
);
80 if (pi
->claim_cont
&& !parport_claim(pi
->pardev
)) {
81 cont
= pi
->claim_cont
;
82 pi
->claim_cont
= NULL
;
86 spin_unlock_irqrestore(&pi_spinlock
, flags
);
94 int pi_schedule_claimed(PIA
* pi
, void (*cont
) (void))
98 spin_lock_irqsave(&pi_spinlock
, flags
);
99 if (pi
->pardev
&& parport_claim(pi
->pardev
)) {
100 pi
->claim_cont
= cont
;
101 spin_unlock_irqrestore(&pi_spinlock
, flags
);
105 spin_unlock_irqrestore(&pi_spinlock
, flags
);
108 EXPORT_SYMBOL(pi_schedule_claimed
);
110 void pi_do_claimed(PIA
* pi
, void (*cont
) (void))
112 if (pi_schedule_claimed(pi
, cont
))
116 EXPORT_SYMBOL(pi_do_claimed
);
118 static void pi_claim(PIA
* pi
)
125 !parport_claim((struct pardevice
*) pi
->pardev
));
128 static void pi_unclaim(PIA
* pi
)
132 parport_release((struct pardevice
*) (pi
->pardev
));
135 void pi_connect(PIA
* pi
)
138 pi
->proto
->connect(pi
);
141 EXPORT_SYMBOL(pi_connect
);
143 void pi_disconnect(PIA
* pi
)
145 pi
->proto
->disconnect(pi
);
149 EXPORT_SYMBOL(pi_disconnect
);
151 static void pi_unregister_parport(PIA
* pi
)
154 parport_unregister_device((struct pardevice
*) (pi
->pardev
));
159 void pi_release(PIA
* pi
)
161 pi_unregister_parport(pi
);
162 if (pi
->proto
->release_proto
)
163 pi
->proto
->release_proto(pi
);
164 module_put(pi
->proto
->owner
);
167 EXPORT_SYMBOL(pi_release
);
169 static int default_test_proto(PIA
* pi
, char *scratch
, int verbose
)
174 pi
->proto
->connect(pi
);
176 for (j
= 0; j
< 2; j
++) {
177 pi_write_regr(pi
, 0, 6, 0xa0 + j
* 0x10);
178 for (k
= 0; k
< 256; k
++) {
179 pi_write_regr(pi
, 0, 2, k
^ 0xaa);
180 pi_write_regr(pi
, 0, 3, k
^ 0x55);
181 if (pi_read_regr(pi
, 0, 2) != (k
^ 0xaa))
185 pi
->proto
->disconnect(pi
);
188 printk("%s: %s: port 0x%x, mode %d, test=(%d,%d)\n",
189 pi
->device
, pi
->proto
->name
, pi
->port
,
190 pi
->mode
, e
[0], e
[1]);
192 return (e
[0] && e
[1]); /* not here if both > 0 */
195 static int pi_test_proto(PIA
* pi
, char *scratch
, int verbose
)
200 if (pi
->proto
->test_proto
)
201 res
= pi
->proto
->test_proto(pi
, scratch
, verbose
);
203 res
= default_test_proto(pi
, scratch
, verbose
);
209 int paride_register(PIP
* pr
)
213 for (k
= 0; k
< MAX_PROTOS
; k
++)
214 if (protocols
[k
] && !strcmp(pr
->name
, protocols
[k
]->name
)) {
215 printk("paride: %s protocol already registered\n",
220 while ((k
< MAX_PROTOS
) && (protocols
[k
]))
222 if (k
== MAX_PROTOS
) {
223 printk("paride: protocol table full\n");
228 printk("paride: %s registered as protocol %d\n", pr
->name
, k
);
232 EXPORT_SYMBOL(paride_register
);
234 void paride_unregister(PIP
* pr
)
238 if (protocols
[pr
->index
] != pr
) {
239 printk("paride: %s not registered\n", pr
->name
);
242 protocols
[pr
->index
] = NULL
;
245 EXPORT_SYMBOL(paride_unregister
);
247 static int pi_register_parport(PIA
* pi
, int verbose
)
249 struct parport
*port
;
251 port
= parport_find_base(pi
->port
);
255 pi
->pardev
= parport_register_device(port
,
257 pi_wake_up
, NULL
, 0, (void *) pi
);
258 parport_put_port(port
);
262 init_waitqueue_head(&pi
->parq
);
265 printk("%s: 0x%x is %s\n", pi
->device
, pi
->port
, port
->name
);
267 pi
->parname
= (char *) port
->name
;
272 static int pi_probe_mode(PIA
* pi
, int max
, char *scratch
, int verbose
)
276 if (pi
->mode
!= -1) {
280 if (pi
->mode
>= pi
->proto
->epp_first
)
282 if ((range
== 8) && (pi
->port
% 8))
284 pi
->reserved
= range
;
285 return (!pi_test_proto(pi
, scratch
, verbose
));
288 for (pi
->mode
= 0; pi
->mode
< max
; pi
->mode
++) {
290 if (pi
->mode
>= pi
->proto
->epp_first
)
292 if ((range
== 8) && (pi
->port
% 8))
294 pi
->reserved
= range
;
295 if (!pi_test_proto(pi
, scratch
, verbose
))
302 static int pi_probe_unit(PIA
* pi
, int unit
, char *scratch
, int verbose
)
311 e
= pi
->proto
->max_units
;
314 if (!pi_register_parport(pi
, verbose
))
317 if (pi
->proto
->test_port
) {
319 max
= pi
->proto
->test_port(pi
);
322 max
= pi
->proto
->max_mode
;
324 if (pi
->proto
->probe_unit
) {
326 for (pi
->unit
= s
; pi
->unit
< e
; pi
->unit
++)
327 if (pi
->proto
->probe_unit(pi
)) {
329 if (pi_probe_mode(pi
, max
, scratch
, verbose
))
331 pi_unregister_parport(pi
);
335 pi_unregister_parport(pi
);
339 if (!pi_probe_mode(pi
, max
, scratch
, verbose
)) {
340 pi_unregister_parport(pi
);
347 int pi_init(PIA
* pi
, int autoprobe
, int port
, int mode
,
348 int unit
, int protocol
, int delay
, char *scratch
,
349 int devtype
, int verbose
, char *device
)
352 int lpts
[7] = { 0x3bc, 0x378, 0x278, 0x268, 0x27c, 0x26c, 0 };
358 request_module("paride_protocol");
363 } else if ((s
< 0) || (s
>= MAX_PROTOS
) || (port
<= 0) ||
364 (!protocols
[s
]) || (unit
< 0) ||
365 (unit
>= protocols
[s
]->max_units
)) {
366 printk("%s: Invalid parameters\n", device
);
370 for (p
= s
; p
< e
; p
++) {
371 struct pi_protocol
*proto
= protocols
[p
];
375 if (!try_module_get(proto
->owner
))
379 if (proto
->init_proto
&& proto
->init_proto(pi
) < 0) {
381 module_put(proto
->owner
);
385 pi
->delay
= pi
->proto
->default_delay
;
388 pi
->devtype
= devtype
;
393 init_waitqueue_head(&pi
->parq
);
395 pi
->claim_cont
= NULL
;
400 if (pi_probe_unit(pi
, unit
, scratch
, verbose
))
405 while ((pi
->port
= lpts
[k
++]))
407 (pi
, unit
, scratch
, verbose
))
412 if (pi
->proto
->release_proto
)
413 pi
->proto
->release_proto(pi
);
414 module_put(proto
->owner
);
419 printk("%s: Autoprobe failed\n", device
);
421 printk("%s: Adapter not found\n", device
);
426 printk("%s: Sharing %s at 0x%x\n", pi
->device
,
427 pi
->parname
, pi
->port
);
429 pi
->proto
->log_adapter(pi
, scratch
, verbose
);
434 EXPORT_SYMBOL(pi_init
);