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/config.h>
25 #include <linux/kmod.h>
26 #include <linux/types.h>
27 #include <linux/kernel.h>
28 #include <linux/ioport.h>
29 #include <linux/string.h>
30 #include <linux/spinlock.h>
31 #include <linux/wait.h>
33 #ifdef CONFIG_PARPORT_MODULE
34 #define CONFIG_PARPORT
38 #include <linux/parport.h>
43 MODULE_LICENSE("GPL");
47 static struct pi_protocol
*protocols
[MAX_PROTOS
];
49 static spinlock_t pi_spinlock
= SPIN_LOCK_UNLOCKED
;
51 void pi_write_regr(PIA
* pi
, int cont
, int regr
, int val
)
53 pi
->proto
->write_regr(pi
, cont
, regr
, val
);
56 EXPORT_SYMBOL(pi_write_regr
);
58 int pi_read_regr(PIA
* pi
, int cont
, int regr
)
60 return pi
->proto
->read_regr(pi
, cont
, regr
);
63 EXPORT_SYMBOL(pi_read_regr
);
65 void pi_write_block(PIA
* pi
, char *buf
, int count
)
67 pi
->proto
->write_block(pi
, buf
, count
);
70 EXPORT_SYMBOL(pi_write_block
);
72 void pi_read_block(PIA
* pi
, char *buf
, int count
)
74 pi
->proto
->read_block(pi
, buf
, count
);
77 EXPORT_SYMBOL(pi_read_block
);
81 static void pi_wake_up(void *p
)
85 void (*cont
) (void) = NULL
;
87 spin_lock_irqsave(&pi_spinlock
, flags
);
89 if (pi
->claim_cont
&& !parport_claim(pi
->pardev
)) {
90 cont
= pi
->claim_cont
;
91 pi
->claim_cont
= NULL
;
95 spin_unlock_irqrestore(&pi_spinlock
, flags
);
105 int pi_schedule_claimed(PIA
* pi
, void (*cont
) (void))
107 #ifdef CONFIG_PARPORT
110 spin_lock_irqsave(&pi_spinlock
, flags
);
111 if (pi
->pardev
&& parport_claim(pi
->pardev
)) {
112 pi
->claim_cont
= cont
;
113 spin_unlock_irqrestore(&pi_spinlock
, flags
);
117 spin_unlock_irqrestore(&pi_spinlock
, flags
);
121 EXPORT_SYMBOL(pi_schedule_claimed
);
123 void pi_do_claimed(PIA
* pi
, void (*cont
) (void))
125 if (pi_schedule_claimed(pi
, cont
))
129 EXPORT_SYMBOL(pi_do_claimed
);
131 static void pi_claim(PIA
* pi
)
136 #ifdef CONFIG_PARPORT
139 !parport_claim((struct pardevice
*) pi
->pardev
));
143 void pi_unclaim(PIA
* pi
)
146 #ifdef CONFIG_PARPORT
148 parport_release((struct pardevice
*) (pi
->pardev
));
152 EXPORT_SYMBOL(pi_unclaim
);
154 void pi_connect(PIA
* pi
)
157 pi
->proto
->connect(pi
);
160 EXPORT_SYMBOL(pi_connect
);
162 void pi_disconnect(PIA
* pi
)
164 pi
->proto
->disconnect(pi
);
168 EXPORT_SYMBOL(pi_disconnect
);
170 static void pi_unregister_parport(PIA
* pi
)
172 #ifdef CONFIG_PARPORT
174 parport_unregister_device((struct pardevice
*) (pi
->pardev
));
180 void pi_release(PIA
* pi
)
182 pi_unregister_parport(pi
);
183 #ifndef CONFIG_PARPORT
185 release_region(pi
->port
, pi
->reserved
);
186 #endif /* !CONFIG_PARPORT */
187 if (pi
->proto
->release_proto
)
188 pi
->proto
->release_proto(pi
);
189 module_put(pi
->proto
->owner
);
192 EXPORT_SYMBOL(pi_release
);
194 static int default_test_proto(PIA
* pi
, char *scratch
, int verbose
)
199 pi
->proto
->connect(pi
);
201 for (j
= 0; j
< 2; j
++) {
202 pi_write_regr(pi
, 0, 6, 0xa0 + j
* 0x10);
203 for (k
= 0; k
< 256; k
++) {
204 pi_write_regr(pi
, 0, 2, k
^ 0xaa);
205 pi_write_regr(pi
, 0, 3, k
^ 0x55);
206 if (pi_read_regr(pi
, 0, 2) != (k
^ 0xaa))
210 pi
->proto
->disconnect(pi
);
213 printk("%s: %s: port 0x%x, mode %d, test=(%d,%d)\n",
214 pi
->device
, pi
->proto
->name
, pi
->port
,
215 pi
->mode
, e
[0], e
[1]);
217 return (e
[0] && e
[1]); /* not here if both > 0 */
220 static int pi_test_proto(PIA
* pi
, char *scratch
, int verbose
)
225 if (pi
->proto
->test_proto
)
226 res
= pi
->proto
->test_proto(pi
, scratch
, verbose
);
228 res
= default_test_proto(pi
, scratch
, verbose
);
234 int pi_register(PIP
* pr
)
238 for (k
= 0; k
< MAX_PROTOS
; k
++)
239 if (protocols
[k
] && !strcmp(pr
->name
, protocols
[k
]->name
)) {
240 printk("paride: %s protocol already registered\n",
245 while ((k
< MAX_PROTOS
) && (protocols
[k
]))
247 if (k
== MAX_PROTOS
) {
248 printk("paride: protocol table full\n");
253 printk("paride: %s registered as protocol %d\n", pr
->name
, k
);
257 EXPORT_SYMBOL(pi_register
);
259 void pi_unregister(PIP
* pr
)
263 if (protocols
[pr
->index
] != pr
) {
264 printk("paride: %s not registered\n", pr
->name
);
267 protocols
[pr
->index
] = NULL
;
270 EXPORT_SYMBOL(pi_unregister
);
272 static int pi_register_parport(PIA
* pi
, int verbose
)
274 #ifdef CONFIG_PARPORT
276 struct parport
*port
;
278 port
= parport_find_base(pi
->port
);
282 pi
->pardev
= parport_register_device(port
,
284 pi_wake_up
, NULL
, 0, (void *) pi
);
285 parport_put_port(port
);
289 init_waitqueue_head(&pi
->parq
);
292 printk("%s: 0x%x is %s\n", pi
->device
, pi
->port
, port
->name
);
294 pi
->parname
= (char *) port
->name
;
300 static int pi_probe_mode(PIA
* pi
, int max
, char *scratch
, int verbose
)
304 if (pi
->mode
!= -1) {
308 if (pi
->mode
>= pi
->proto
->epp_first
)
310 if ((range
== 8) && (pi
->port
% 8))
312 pi
->reserved
= range
;
313 return (!pi_test_proto(pi
, scratch
, verbose
));
316 for (pi
->mode
= 0; pi
->mode
< max
; pi
->mode
++) {
318 if (pi
->mode
>= pi
->proto
->epp_first
)
320 if ((range
== 8) && (pi
->port
% 8))
322 pi
->reserved
= range
;
323 if (!pi_test_proto(pi
, scratch
, verbose
))
330 static int pi_probe_unit(PIA
* pi
, int unit
, char *scratch
, int verbose
)
339 e
= pi
->proto
->max_units
;
342 if (!pi_register_parport(pi
, verbose
))
345 if (pi
->proto
->test_port
) {
347 max
= pi
->proto
->test_port(pi
);
350 max
= pi
->proto
->max_mode
;
352 if (pi
->proto
->probe_unit
) {
354 for (pi
->unit
= s
; pi
->unit
< e
; pi
->unit
++)
355 if (pi
->proto
->probe_unit(pi
)) {
357 if (pi_probe_mode(pi
, max
, scratch
, verbose
))
359 pi_unregister_parport(pi
);
363 pi_unregister_parport(pi
);
367 if (!pi_probe_mode(pi
, max
, scratch
, verbose
)) {
368 pi_unregister_parport(pi
);
375 int pi_init(PIA
* pi
, int autoprobe
, int port
, int mode
,
376 int unit
, int protocol
, int delay
, char *scratch
,
377 int devtype
, int verbose
, char *device
)
380 int lpts
[7] = { 0x3bc, 0x378, 0x278, 0x268, 0x27c, 0x26c, 0 };
386 request_module("paride_protocol");
391 } else if ((s
< 0) || (s
>= MAX_PROTOS
) || (port
<= 0) ||
392 (!protocols
[s
]) || (unit
< 0) ||
393 (unit
>= protocols
[s
]->max_units
)) {
394 printk("%s: Invalid parameters\n", device
);
398 for (p
= s
; p
< e
; p
++) {
399 struct pi_protocol
*proto
= protocols
[p
];
403 if (!try_module_get(proto
->owner
))
407 if (proto
->init_proto
&& proto
->init_proto(pi
) < 0) {
409 module_put(proto
->owner
);
413 pi
->delay
= pi
->proto
->default_delay
;
416 pi
->devtype
= devtype
;
421 init_waitqueue_head(&pi
->parq
);
423 pi
->claim_cont
= NULL
;
428 if (pi_probe_unit(pi
, unit
, scratch
, verbose
))
433 while ((pi
->port
= lpts
[k
++]))
435 (pi
, unit
, scratch
, verbose
))
440 if (pi
->proto
->release_proto
)
441 pi
->proto
->release_proto(pi
);
442 module_put(proto
->owner
);
447 printk("%s: Autoprobe failed\n", device
);
449 printk("%s: Adapter not found\n", device
);
452 #ifndef CONFIG_PARPORT
453 if (!request_region(pi
->port
, pi
->reserved
, pi
->device
)) {
454 printk(KERN_WARNING
"paride: Unable to request region 0x%x\n",
458 #endif /* !CONFIG_PARPORT */
461 printk("%s: Sharing %s at 0x%x\n", pi
->device
,
462 pi
->parname
, pi
->port
);
464 pi
->proto
->log_adapter(pi
, scratch
, verbose
);
469 EXPORT_SYMBOL(pi_init
);