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>
33 #include <linux/slab.h>
37 MODULE_LICENSE("GPL");
41 static struct pi_protocol
*protocols
[MAX_PROTOS
];
43 static DEFINE_SPINLOCK(pi_spinlock
);
45 void pi_write_regr(PIA
* pi
, int cont
, int regr
, int val
)
47 pi
->proto
->write_regr(pi
, cont
, regr
, val
);
50 EXPORT_SYMBOL(pi_write_regr
);
52 int pi_read_regr(PIA
* pi
, int cont
, int regr
)
54 return pi
->proto
->read_regr(pi
, cont
, regr
);
57 EXPORT_SYMBOL(pi_read_regr
);
59 void pi_write_block(PIA
* pi
, char *buf
, int count
)
61 pi
->proto
->write_block(pi
, buf
, count
);
64 EXPORT_SYMBOL(pi_write_block
);
66 void pi_read_block(PIA
* pi
, char *buf
, int count
)
68 pi
->proto
->read_block(pi
, buf
, count
);
71 EXPORT_SYMBOL(pi_read_block
);
73 static void pi_wake_up(void *p
)
77 void (*cont
) (void) = NULL
;
79 spin_lock_irqsave(&pi_spinlock
, flags
);
81 if (pi
->claim_cont
&& !parport_claim(pi
->pardev
)) {
82 cont
= pi
->claim_cont
;
83 pi
->claim_cont
= NULL
;
87 spin_unlock_irqrestore(&pi_spinlock
, flags
);
95 int pi_schedule_claimed(PIA
* pi
, void (*cont
) (void))
99 spin_lock_irqsave(&pi_spinlock
, flags
);
100 if (pi
->pardev
&& parport_claim(pi
->pardev
)) {
101 pi
->claim_cont
= cont
;
102 spin_unlock_irqrestore(&pi_spinlock
, flags
);
106 spin_unlock_irqrestore(&pi_spinlock
, flags
);
109 EXPORT_SYMBOL(pi_schedule_claimed
);
111 void pi_do_claimed(PIA
* pi
, void (*cont
) (void))
113 if (pi_schedule_claimed(pi
, cont
))
117 EXPORT_SYMBOL(pi_do_claimed
);
119 static void pi_claim(PIA
* pi
)
126 !parport_claim((struct pardevice
*) pi
->pardev
));
129 static void pi_unclaim(PIA
* pi
)
133 parport_release((struct pardevice
*) (pi
->pardev
));
136 void pi_connect(PIA
* pi
)
139 pi
->proto
->connect(pi
);
142 EXPORT_SYMBOL(pi_connect
);
144 void pi_disconnect(PIA
* pi
)
146 pi
->proto
->disconnect(pi
);
150 EXPORT_SYMBOL(pi_disconnect
);
152 static void pi_unregister_parport(PIA
* pi
)
155 parport_unregister_device((struct pardevice
*) (pi
->pardev
));
160 void pi_release(PIA
* pi
)
162 pi_unregister_parport(pi
);
163 if (pi
->proto
->release_proto
)
164 pi
->proto
->release_proto(pi
);
165 module_put(pi
->proto
->owner
);
168 EXPORT_SYMBOL(pi_release
);
170 static int default_test_proto(PIA
* pi
, char *scratch
, int verbose
)
175 pi
->proto
->connect(pi
);
177 for (j
= 0; j
< 2; j
++) {
178 pi_write_regr(pi
, 0, 6, 0xa0 + j
* 0x10);
179 for (k
= 0; k
< 256; k
++) {
180 pi_write_regr(pi
, 0, 2, k
^ 0xaa);
181 pi_write_regr(pi
, 0, 3, k
^ 0x55);
182 if (pi_read_regr(pi
, 0, 2) != (k
^ 0xaa))
186 pi
->proto
->disconnect(pi
);
189 printk("%s: %s: port 0x%x, mode %d, test=(%d,%d)\n",
190 pi
->device
, pi
->proto
->name
, pi
->port
,
191 pi
->mode
, e
[0], e
[1]);
193 return (e
[0] && e
[1]); /* not here if both > 0 */
196 static int pi_test_proto(PIA
* pi
, char *scratch
, int verbose
)
201 if (pi
->proto
->test_proto
)
202 res
= pi
->proto
->test_proto(pi
, scratch
, verbose
);
204 res
= default_test_proto(pi
, scratch
, verbose
);
210 int paride_register(PIP
* pr
)
214 for (k
= 0; k
< MAX_PROTOS
; k
++)
215 if (protocols
[k
] && !strcmp(pr
->name
, protocols
[k
]->name
)) {
216 printk("paride: %s protocol already registered\n",
221 while ((k
< MAX_PROTOS
) && (protocols
[k
]))
223 if (k
== MAX_PROTOS
) {
224 printk("paride: protocol table full\n");
229 printk("paride: %s registered as protocol %d\n", pr
->name
, k
);
233 EXPORT_SYMBOL(paride_register
);
235 void paride_unregister(PIP
* pr
)
239 if (protocols
[pr
->index
] != pr
) {
240 printk("paride: %s not registered\n", pr
->name
);
243 protocols
[pr
->index
] = NULL
;
246 EXPORT_SYMBOL(paride_unregister
);
248 static int pi_register_parport(PIA
*pi
, int verbose
, int unit
)
250 struct parport
*port
;
251 struct pardev_cb par_cb
;
253 port
= parport_find_base(pi
->port
);
256 memset(&par_cb
, 0, sizeof(par_cb
));
257 par_cb
.wakeup
= pi_wake_up
;
258 par_cb
.private = (void *)pi
;
259 pi
->pardev
= parport_register_dev_model(port
, pi
->device
, &par_cb
,
261 parport_put_port(port
);
265 init_waitqueue_head(&pi
->parq
);
268 printk("%s: 0x%x is %s\n", pi
->device
, pi
->port
, port
->name
);
270 pi
->parname
= (char *) port
->name
;
275 static int pi_probe_mode(PIA
* pi
, int max
, char *scratch
, int verbose
)
279 if (pi
->mode
!= -1) {
283 if (pi
->mode
>= pi
->proto
->epp_first
)
285 if ((range
== 8) && (pi
->port
% 8))
287 pi
->reserved
= range
;
288 return (!pi_test_proto(pi
, scratch
, verbose
));
291 for (pi
->mode
= 0; pi
->mode
< max
; pi
->mode
++) {
293 if (pi
->mode
>= pi
->proto
->epp_first
)
295 if ((range
== 8) && (pi
->port
% 8))
297 pi
->reserved
= range
;
298 if (!pi_test_proto(pi
, scratch
, verbose
))
305 static int pi_probe_unit(PIA
* pi
, int unit
, char *scratch
, int verbose
)
314 e
= pi
->proto
->max_units
;
317 if (!pi_register_parport(pi
, verbose
, s
))
320 if (pi
->proto
->test_port
) {
322 max
= pi
->proto
->test_port(pi
);
325 max
= pi
->proto
->max_mode
;
327 if (pi
->proto
->probe_unit
) {
329 for (pi
->unit
= s
; pi
->unit
< e
; pi
->unit
++)
330 if (pi
->proto
->probe_unit(pi
)) {
332 if (pi_probe_mode(pi
, max
, scratch
, verbose
))
334 pi_unregister_parport(pi
);
338 pi_unregister_parport(pi
);
342 if (!pi_probe_mode(pi
, max
, scratch
, verbose
)) {
343 pi_unregister_parport(pi
);
350 int pi_init(PIA
* pi
, int autoprobe
, int port
, int mode
,
351 int unit
, int protocol
, int delay
, char *scratch
,
352 int devtype
, int verbose
, char *device
)
355 int lpts
[7] = { 0x3bc, 0x378, 0x278, 0x268, 0x27c, 0x26c, 0 };
361 request_module("paride_protocol");
366 } else if ((s
< 0) || (s
>= MAX_PROTOS
) || (port
<= 0) ||
367 (!protocols
[s
]) || (unit
< 0) ||
368 (unit
>= protocols
[s
]->max_units
)) {
369 printk("%s: Invalid parameters\n", device
);
373 for (p
= s
; p
< e
; p
++) {
374 struct pi_protocol
*proto
= protocols
[p
];
378 if (!try_module_get(proto
->owner
))
382 if (proto
->init_proto
&& proto
->init_proto(pi
) < 0) {
384 module_put(proto
->owner
);
388 pi
->delay
= pi
->proto
->default_delay
;
391 pi
->devtype
= devtype
;
396 init_waitqueue_head(&pi
->parq
);
398 pi
->claim_cont
= NULL
;
403 if (pi_probe_unit(pi
, unit
, scratch
, verbose
))
408 while ((pi
->port
= lpts
[k
++]))
410 (pi
, unit
, scratch
, verbose
))
415 if (pi
->proto
->release_proto
)
416 pi
->proto
->release_proto(pi
);
417 module_put(proto
->owner
);
422 printk("%s: Autoprobe failed\n", device
);
424 printk("%s: Adapter not found\n", device
);
429 printk("%s: Sharing %s at 0x%x\n", pi
->device
,
430 pi
->parname
, pi
->port
);
432 pi
->proto
->log_adapter(pi
, scratch
, verbose
);
437 EXPORT_SYMBOL(pi_init
);
439 static int pi_probe(struct pardevice
*par_dev
)
441 struct device_driver
*drv
= par_dev
->dev
.driver
;
442 int len
= strlen(drv
->name
);
444 if (strncmp(par_dev
->name
, drv
->name
, len
))
450 void *pi_register_driver(char *name
)
452 struct parport_driver
*parp_drv
;
455 parp_drv
= kzalloc(sizeof(*parp_drv
), GFP_KERNEL
);
459 parp_drv
->name
= name
;
460 parp_drv
->probe
= pi_probe
;
461 parp_drv
->devmodel
= true;
463 ret
= parport_register_driver(parp_drv
);
468 return (void *)parp_drv
;
470 EXPORT_SYMBOL(pi_register_driver
);
472 void pi_unregister_driver(void *_drv
)
474 struct parport_driver
*drv
= _drv
;
476 parport_unregister_driver(drv
);
479 EXPORT_SYMBOL(pi_unregister_driver
);