18 #include <linux/types.h>
19 #include <linux/errno.h>
20 #include <linux/kernel.h>
21 #include <linux/adb.h>
22 #include <linux/cuda.h>
29 static volatile unsigned char *via;
62 #undef DEBUG_MACIISI_ADB
66 static unsigned char maciisi_rbuf[16];
67 static unsigned char *reply_ptr;
68 static int data_index;
69 static int reading_reply;
80 static int maciisi_probe(
void);
81 static int maciisi_init(
void);
86 static void maciisi_input(
unsigned char *
buf,
int nb);
87 static int maciisi_init_via(
void);
88 static void maciisi_poll(
void);
89 static int maciisi_start(
void);
119 if ((err = maciisi_init_via())) {
120 printk(
KERN_ERR "maciisi_init: maciisi_init_via() failed, code %d\n", err);
126 maciisi_interrupt)) {
131 printk(
"adb: Mac IIsi driver v0.2 for Unified ADB.\n");
142 #ifdef DEBUG_MACIISI_ADB
156 if (!(status & TREQ))
164 while (!(via[
IFR] &
SR_INT) && poll_timeout-- > 0)
165 status = via[
B] & (
TIP|TREQ);
168 #ifdef DEBUG_MACIISI_ADB
170 status, poll_timeout,
tmp);
191 maciisi_init_via(
void)
199 #ifdef DEBUG_MACIISI_ADB
211 for(i = 0; i < 60; i++) {
233 #ifdef DEBUG_MACIISI_ADB
234 static int dump_packet = 0;
242 #ifdef DEBUG_MACIISI_ADB
245 for (i = 0; i < req->
nbytes; i++) {
248 printk(
" sync %d\n", sync);
254 i = maciisi_write(req);
264 if(i == -
EBUSY && sync)
281 #ifdef DEBUG_MACIISI_ADB
286 while (!req->
complete && count++ < 50) {
306 for (i = 0; i <
nbytes; i++)
310 return maciisi_send_request(req, 1);
323 printk(
KERN_ERR "maciisi_write: packet too small or not an ADB or CUDA packet\n");
352 #ifdef DEBUG_MACIISI_ADB
370 #ifdef DEBUG_MACIISI_ADB
378 printk(
KERN_ERR "maciisi_start: maciisi_start called when driver busy!\n");
387 if (!(status & TREQ)) {
388 #ifdef DEBUG_MACIISI_ADB
395 #ifdef DEBUG_MACIISI_ADB
422 maciisi_interrupt(0,
NULL);
434 maciisi_interrupt(
int irq,
void*
arg)
438 #ifdef DEBUG_MACIISI_ADB
439 static int dump_reply = 0;
447 #ifdef DEBUG_MACIISI_ADB
453 printk(
KERN_ERR "maciisi_interrupt: called without interrupt flag set\n");
465 printk(
KERN_ERR "maciisi_interrupt: state is idle but TIP asserted!\n");
482 reply_ptr = current_req->
reply;
484 reply_ptr = maciisi_rbuf;
494 if (!(status & TREQ)) {
512 if (data_index >= req->
nbytes) {
526 current_req = req->
next;
531 if(i == 0 && need_sync) {
533 maciisi_sync(current_req);
543 via[
SR] = req->
data[data_index++];
553 printk(
KERN_ERR "maciisi_interrupt: reply too long, aborting read\n");
559 if(i == 0 && need_sync) {
561 maciisi_sync(current_req);
568 *reply_ptr++ = via[
SR];
569 status = via[
B] & (TIP|
TREQ);
574 if (!(status & TREQ))
597 #ifdef DEBUG_MACIISI_ADB
607 current_req = req->
next;
613 maciisi_input(maciisi_rbuf, reply_ptr - maciisi_rbuf);
616 status = via[
B] & (TIP|
TREQ);
617 if (!(status & TREQ)) {
619 #ifdef DEBUG_MACIISI_ADB
629 reply_ptr = maciisi_rbuf;
641 if(i == 0 && need_sync) {
643 maciisi_sync(current_req);
658 maciisi_input(
unsigned char *
buf,
int nb)
660 #ifdef DEBUG_MACIISI_ADB
669 #ifdef DEBUG_MACIISI_ADB
671 for (i = 0; i < nb; ++
i)