xref: /openbmc/linux/drivers/macintosh/via-cuda.c (revision 1da177e4)
1 /*
2  * Device driver for the via-cuda on Apple Powermacs.
3  *
4  * The VIA (versatile interface adapter) interfaces to the CUDA,
5  * a 6805 microprocessor core which controls the ADB (Apple Desktop
6  * Bus) which connects to the keyboard and mouse.  The CUDA also
7  * controls system power and the RTC (real time clock) chip.
8  *
9  * Copyright (C) 1996 Paul Mackerras.
10  */
11 #include <stdarg.h>
12 #include <linux/config.h>
13 #include <linux/types.h>
14 #include <linux/errno.h>
15 #include <linux/kernel.h>
16 #include <linux/delay.h>
17 #include <linux/sched.h>
18 #include <linux/adb.h>
19 #include <linux/cuda.h>
20 #include <linux/spinlock.h>
21 #include <linux/interrupt.h>
22 #ifdef CONFIG_PPC
23 #include <asm/prom.h>
24 #include <asm/machdep.h>
25 #else
26 #include <asm/macintosh.h>
27 #include <asm/macints.h>
28 #include <asm/machw.h>
29 #include <asm/mac_via.h>
30 #endif
31 #include <asm/io.h>
32 #include <asm/system.h>
33 #include <linux/init.h>
34 
35 static volatile unsigned char __iomem *via;
36 static DEFINE_SPINLOCK(cuda_lock);
37 
38 #ifdef CONFIG_MAC
39 #define CUDA_IRQ IRQ_MAC_ADB
40 #define __openfirmware
41 #define eieio()
42 #else
43 #define CUDA_IRQ vias->intrs[0].line
44 #endif
45 
46 /* VIA registers - spaced 0x200 bytes apart */
47 #define RS		0x200		/* skip between registers */
48 #define B		0		/* B-side data */
49 #define A		RS		/* A-side data */
50 #define DIRB		(2*RS)		/* B-side direction (1=output) */
51 #define DIRA		(3*RS)		/* A-side direction (1=output) */
52 #define T1CL		(4*RS)		/* Timer 1 ctr/latch (low 8 bits) */
53 #define T1CH		(5*RS)		/* Timer 1 counter (high 8 bits) */
54 #define T1LL		(6*RS)		/* Timer 1 latch (low 8 bits) */
55 #define T1LH		(7*RS)		/* Timer 1 latch (high 8 bits) */
56 #define T2CL		(8*RS)		/* Timer 2 ctr/latch (low 8 bits) */
57 #define T2CH		(9*RS)		/* Timer 2 counter (high 8 bits) */
58 #define SR		(10*RS)		/* Shift register */
59 #define ACR		(11*RS)		/* Auxiliary control register */
60 #define PCR		(12*RS)		/* Peripheral control register */
61 #define IFR		(13*RS)		/* Interrupt flag register */
62 #define IER		(14*RS)		/* Interrupt enable register */
63 #define ANH		(15*RS)		/* A-side data, no handshake */
64 
65 /* Bits in B data register: all active low */
66 #define TREQ		0x08		/* Transfer request (input) */
67 #define TACK		0x10		/* Transfer acknowledge (output) */
68 #define TIP		0x20		/* Transfer in progress (output) */
69 
70 /* Bits in ACR */
71 #define SR_CTRL		0x1c		/* Shift register control bits */
72 #define SR_EXT		0x0c		/* Shift on external clock */
73 #define SR_OUT		0x10		/* Shift out if 1 */
74 
75 /* Bits in IFR and IER */
76 #define IER_SET		0x80		/* set bits in IER */
77 #define IER_CLR		0		/* clear bits in IER */
78 #define SR_INT		0x04		/* Shift register full/empty */
79 
80 static enum cuda_state {
81     idle,
82     sent_first_byte,
83     sending,
84     reading,
85     read_done,
86     awaiting_reply
87 } cuda_state;
88 
89 static struct adb_request *current_req;
90 static struct adb_request *last_req;
91 static unsigned char cuda_rbuf[16];
92 static unsigned char *reply_ptr;
93 static int reading_reply;
94 static int data_index;
95 #ifdef CONFIG_PPC
96 static struct device_node *vias;
97 #endif
98 static int cuda_fully_inited = 0;
99 
100 #ifdef CONFIG_ADB
101 static int cuda_probe(void);
102 static int cuda_init(void);
103 static int cuda_send_request(struct adb_request *req, int sync);
104 static int cuda_adb_autopoll(int devs);
105 static int cuda_reset_adb_bus(void);
106 #endif /* CONFIG_ADB */
107 
108 static int cuda_init_via(void);
109 static void cuda_start(void);
110 static irqreturn_t cuda_interrupt(int irq, void *arg, struct pt_regs *regs);
111 static void cuda_input(unsigned char *buf, int nb, struct pt_regs *regs);
112 void cuda_poll(void);
113 static int cuda_write(struct adb_request *req);
114 
115 int cuda_request(struct adb_request *req,
116 		 void (*done)(struct adb_request *), int nbytes, ...);
117 
118 #ifdef CONFIG_ADB
119 struct adb_driver via_cuda_driver = {
120 	"CUDA",
121 	cuda_probe,
122 	cuda_init,
123 	cuda_send_request,
124 	cuda_adb_autopoll,
125 	cuda_poll,
126 	cuda_reset_adb_bus
127 };
128 #endif /* CONFIG_ADB */
129 
130 #ifdef CONFIG_PPC
131 int __init
132 find_via_cuda(void)
133 {
134     int err;
135     struct adb_request req;
136 
137     if (vias != 0)
138 	return 1;
139     vias = find_devices("via-cuda");
140     if (vias == 0)
141 	return 0;
142     if (vias->next != 0)
143 	printk(KERN_WARNING "Warning: only using 1st via-cuda\n");
144 
145 #if 0
146     { int i;
147 
148     printk("find_via_cuda: node = %p, addrs =", vias->node);
149     for (i = 0; i < vias->n_addrs; ++i)
150 	printk(" %x(%x)", vias->addrs[i].address, vias->addrs[i].size);
151     printk(", intrs =");
152     for (i = 0; i < vias->n_intrs; ++i)
153 	printk(" %x", vias->intrs[i].line);
154     printk("\n"); }
155 #endif
156 
157     if (vias->n_addrs != 1 || vias->n_intrs != 1) {
158 	printk(KERN_ERR "via-cuda: expecting 1 address (%d) and 1 interrupt (%d)\n",
159 	       vias->n_addrs, vias->n_intrs);
160 	if (vias->n_addrs < 1 || vias->n_intrs < 1)
161 	    return 0;
162     }
163     via = ioremap(vias->addrs->address, 0x2000);
164 
165     cuda_state = idle;
166     sys_ctrler = SYS_CTRLER_CUDA;
167 
168     err = cuda_init_via();
169     if (err) {
170 	printk(KERN_ERR "cuda_init_via() failed\n");
171 	via = NULL;
172 	return 0;
173     }
174 
175     /* Clear and enable interrupts, but only on PPC. On 68K it's done  */
176     /* for us by the main VIA driver in arch/m68k/mac/via.c        */
177 
178 #ifndef CONFIG_MAC
179     out_8(&via[IFR], 0x7f);	/* clear interrupts by writing 1s */
180     out_8(&via[IER], IER_SET|SR_INT); /* enable interrupt from SR */
181 #endif
182 
183     /* enable autopoll */
184     cuda_request(&req, NULL, 3, CUDA_PACKET, CUDA_AUTOPOLL, 1);
185     while (!req.complete)
186 	cuda_poll();
187 
188     return 1;
189 }
190 #endif /* CONFIG_PPC */
191 
192 static int __init via_cuda_start(void)
193 {
194     if (via == NULL)
195 	return -ENODEV;
196 
197 #ifdef CONFIG_PPC
198     request_OF_resource(vias, 0, NULL);
199 #endif
200 
201     if (request_irq(CUDA_IRQ, cuda_interrupt, 0, "ADB", cuda_interrupt)) {
202 	printk(KERN_ERR "cuda_init: can't get irq %d\n", CUDA_IRQ);
203 	return -EAGAIN;
204     }
205 
206     printk("Macintosh CUDA driver v0.5 for Unified ADB.\n");
207 
208     cuda_fully_inited = 1;
209     return 0;
210 }
211 
212 device_initcall(via_cuda_start);
213 
214 #ifdef CONFIG_ADB
215 static int
216 cuda_probe(void)
217 {
218 #ifdef CONFIG_PPC
219     if (sys_ctrler != SYS_CTRLER_CUDA)
220 	return -ENODEV;
221 #else
222     if (macintosh_config->adb_type != MAC_ADB_CUDA)
223 	return -ENODEV;
224     via = via1;
225 #endif
226     return 0;
227 }
228 
229 static int __init
230 cuda_init(void)
231 {
232 #ifdef CONFIG_PPC
233     if (via == NULL)
234 	return -ENODEV;
235     return 0;
236 #else
237     int err = cuda_init_via();
238     if (err) {
239 	printk(KERN_ERR "cuda_init_via() failed\n");
240 	return -ENODEV;
241     }
242 
243     return via_cuda_start();
244 #endif
245 }
246 #endif /* CONFIG_ADB */
247 
248 #define WAIT_FOR(cond, what)					\
249     do {                                                        \
250     	int x;							\
251 	for (x = 1000; !(cond); --x) {				\
252 	    if (x == 0) {					\
253 		printk("Timeout waiting for " what "\n");	\
254 		return -ENXIO;					\
255 	    }							\
256 	    udelay(100);					\
257 	}							\
258     } while (0)
259 
260 static int
261 cuda_init_via(void)
262 {
263     out_8(&via[DIRB], (in_8(&via[DIRB]) | TACK | TIP) & ~TREQ);	/* TACK & TIP out */
264     out_8(&via[B], in_8(&via[B]) | TACK | TIP);			/* negate them */
265     out_8(&via[ACR] ,(in_8(&via[ACR]) & ~SR_CTRL) | SR_EXT);	/* SR data in */
266     (void)in_8(&via[SR]);						/* clear any left-over data */
267 #ifndef CONFIG_MAC
268     out_8(&via[IER], 0x7f);					/* disable interrupts from VIA */
269     (void)in_8(&via[IER]);
270 #endif
271 
272     /* delay 4ms and then clear any pending interrupt */
273     mdelay(4);
274     (void)in_8(&via[SR]);
275     out_8(&via[IFR], in_8(&via[IFR]) & 0x7f);
276 
277     /* sync with the CUDA - assert TACK without TIP */
278     out_8(&via[B], in_8(&via[B]) & ~TACK);
279 
280     /* wait for the CUDA to assert TREQ in response */
281     WAIT_FOR((in_8(&via[B]) & TREQ) == 0, "CUDA response to sync");
282 
283     /* wait for the interrupt and then clear it */
284     WAIT_FOR(in_8(&via[IFR]) & SR_INT, "CUDA response to sync (2)");
285     (void)in_8(&via[SR]);
286     out_8(&via[IFR], in_8(&via[IFR]) & 0x7f);
287 
288     /* finish the sync by negating TACK */
289     out_8(&via[B], in_8(&via[B]) | TACK);
290 
291     /* wait for the CUDA to negate TREQ and the corresponding interrupt */
292     WAIT_FOR(in_8(&via[B]) & TREQ, "CUDA response to sync (3)");
293     WAIT_FOR(in_8(&via[IFR]) & SR_INT, "CUDA response to sync (4)");
294     (void)in_8(&via[SR]);
295     out_8(&via[IFR], in_8(&via[IFR]) & 0x7f);
296     out_8(&via[B], in_8(&via[B]) | TIP);	/* should be unnecessary */
297 
298     return 0;
299 }
300 
301 #ifdef CONFIG_ADB
302 /* Send an ADB command */
303 static int
304 cuda_send_request(struct adb_request *req, int sync)
305 {
306     int i;
307 
308     if ((via == NULL) || !cuda_fully_inited) {
309 	req->complete = 1;
310 	return -ENXIO;
311     }
312 
313     req->reply_expected = 1;
314 
315     i = cuda_write(req);
316     if (i)
317 	return i;
318 
319     if (sync) {
320 	while (!req->complete)
321 	    cuda_poll();
322     }
323     return 0;
324 }
325 
326 
327 /* Enable/disable autopolling */
328 static int
329 cuda_adb_autopoll(int devs)
330 {
331     struct adb_request req;
332 
333     if ((via == NULL) || !cuda_fully_inited)
334 	return -ENXIO;
335 
336     cuda_request(&req, NULL, 3, CUDA_PACKET, CUDA_AUTOPOLL, (devs? 1: 0));
337     while (!req.complete)
338 	cuda_poll();
339     return 0;
340 }
341 
342 /* Reset adb bus - how do we do this?? */
343 static int
344 cuda_reset_adb_bus(void)
345 {
346     struct adb_request req;
347 
348     if ((via == NULL) || !cuda_fully_inited)
349 	return -ENXIO;
350 
351     cuda_request(&req, NULL, 2, ADB_PACKET, 0);		/* maybe? */
352     while (!req.complete)
353 	cuda_poll();
354     return 0;
355 }
356 #endif /* CONFIG_ADB */
357 /* Construct and send a cuda request */
358 int
359 cuda_request(struct adb_request *req, void (*done)(struct adb_request *),
360 	     int nbytes, ...)
361 {
362     va_list list;
363     int i;
364 
365     if (via == NULL) {
366 	req->complete = 1;
367 	return -ENXIO;
368     }
369 
370     req->nbytes = nbytes;
371     req->done = done;
372     va_start(list, nbytes);
373     for (i = 0; i < nbytes; ++i)
374 	req->data[i] = va_arg(list, int);
375     va_end(list);
376     req->reply_expected = 1;
377     return cuda_write(req);
378 }
379 
380 static int
381 cuda_write(struct adb_request *req)
382 {
383     unsigned long flags;
384 
385     if (req->nbytes < 2 || req->data[0] > CUDA_PACKET) {
386 	req->complete = 1;
387 	return -EINVAL;
388     }
389     req->next = NULL;
390     req->sent = 0;
391     req->complete = 0;
392     req->reply_len = 0;
393 
394     spin_lock_irqsave(&cuda_lock, flags);
395     if (current_req != 0) {
396 	last_req->next = req;
397 	last_req = req;
398     } else {
399 	current_req = req;
400 	last_req = req;
401 	if (cuda_state == idle)
402 	    cuda_start();
403     }
404     spin_unlock_irqrestore(&cuda_lock, flags);
405 
406     return 0;
407 }
408 
409 static void
410 cuda_start(void)
411 {
412     struct adb_request *req;
413 
414     /* assert cuda_state == idle */
415     /* get the packet to send */
416     req = current_req;
417     if (req == 0)
418 	return;
419     if ((in_8(&via[B]) & TREQ) == 0)
420 	return;			/* a byte is coming in from the CUDA */
421 
422     /* set the shift register to shift out and send a byte */
423     out_8(&via[ACR], in_8(&via[ACR]) | SR_OUT);
424     out_8(&via[SR], req->data[0]);
425     out_8(&via[B], in_8(&via[B]) & ~TIP);
426     cuda_state = sent_first_byte;
427 }
428 
429 void
430 cuda_poll(void)
431 {
432     unsigned long flags;
433 
434     /* cuda_interrupt only takes a normal lock, we disable
435      * interrupts here to avoid re-entering and thus deadlocking.
436      * An option would be to disable only the IRQ source with
437      * disable_irq(), would that work on m68k ? --BenH
438      */
439     local_irq_save(flags);
440     cuda_interrupt(0, NULL, NULL);
441     local_irq_restore(flags);
442 }
443 
444 static irqreturn_t
445 cuda_interrupt(int irq, void *arg, struct pt_regs *regs)
446 {
447     int status;
448     struct adb_request *req = NULL;
449     unsigned char ibuf[16];
450     int ibuf_len = 0;
451     int complete = 0;
452     unsigned char virq;
453 
454     spin_lock(&cuda_lock);
455 
456     virq = in_8(&via[IFR]) & 0x7f;
457     out_8(&via[IFR], virq);
458     if ((virq & SR_INT) == 0) {
459         spin_unlock(&cuda_lock);
460 	return IRQ_NONE;
461     }
462 
463     status = (~in_8(&via[B]) & (TIP|TREQ)) | (in_8(&via[ACR]) & SR_OUT);
464     /* printk("cuda_interrupt: state=%d status=%x\n", cuda_state, status); */
465     switch (cuda_state) {
466     case idle:
467 	/* CUDA has sent us the first byte of data - unsolicited */
468 	if (status != TREQ)
469 	    printk("cuda: state=idle, status=%x\n", status);
470 	(void)in_8(&via[SR]);
471 	out_8(&via[B], in_8(&via[B]) & ~TIP);
472 	cuda_state = reading;
473 	reply_ptr = cuda_rbuf;
474 	reading_reply = 0;
475 	break;
476 
477     case awaiting_reply:
478 	/* CUDA has sent us the first byte of data of a reply */
479 	if (status != TREQ)
480 	    printk("cuda: state=awaiting_reply, status=%x\n", status);
481 	(void)in_8(&via[SR]);
482 	out_8(&via[B], in_8(&via[B]) & ~TIP);
483 	cuda_state = reading;
484 	reply_ptr = current_req->reply;
485 	reading_reply = 1;
486 	break;
487 
488     case sent_first_byte:
489 	if (status == TREQ + TIP + SR_OUT) {
490 	    /* collision */
491 	    out_8(&via[ACR], in_8(&via[ACR]) & ~SR_OUT);
492 	    (void)in_8(&via[SR]);
493 	    out_8(&via[B], in_8(&via[B]) | TIP | TACK);
494 	    cuda_state = idle;
495 	} else {
496 	    /* assert status == TIP + SR_OUT */
497 	    if (status != TIP + SR_OUT)
498 		printk("cuda: state=sent_first_byte status=%x\n", status);
499 	    out_8(&via[SR], current_req->data[1]);
500 	    out_8(&via[B], in_8(&via[B]) ^ TACK);
501 	    data_index = 2;
502 	    cuda_state = sending;
503 	}
504 	break;
505 
506     case sending:
507 	req = current_req;
508 	if (data_index >= req->nbytes) {
509 	    out_8(&via[ACR], in_8(&via[ACR]) & ~SR_OUT);
510 	    (void)in_8(&via[SR]);
511 	    out_8(&via[B], in_8(&via[B]) | TACK | TIP);
512 	    req->sent = 1;
513 	    if (req->reply_expected) {
514 		cuda_state = awaiting_reply;
515 	    } else {
516 		current_req = req->next;
517 		complete = 1;
518 		/* not sure about this */
519 		cuda_state = idle;
520 		cuda_start();
521 	    }
522 	} else {
523 	    out_8(&via[SR], req->data[data_index++]);
524 	    out_8(&via[B], in_8(&via[B]) ^ TACK);
525 	}
526 	break;
527 
528     case reading:
529 	*reply_ptr++ = in_8(&via[SR]);
530 	if (status == TIP) {
531 	    /* that's all folks */
532 	    out_8(&via[B], in_8(&via[B]) | TACK | TIP);
533 	    cuda_state = read_done;
534 	} else {
535 	    /* assert status == TIP | TREQ */
536 	    if (status != TIP + TREQ)
537 		printk("cuda: state=reading status=%x\n", status);
538 	    out_8(&via[B], in_8(&via[B]) ^ TACK);
539 	}
540 	break;
541 
542     case read_done:
543 	(void)in_8(&via[SR]);
544 	if (reading_reply) {
545 	    req = current_req;
546 	    req->reply_len = reply_ptr - req->reply;
547 	    if (req->data[0] == ADB_PACKET) {
548 		/* Have to adjust the reply from ADB commands */
549 		if (req->reply_len <= 2 || (req->reply[1] & 2) != 0) {
550 		    /* the 0x2 bit indicates no response */
551 		    req->reply_len = 0;
552 		} else {
553 		    /* leave just the command and result bytes in the reply */
554 		    req->reply_len -= 2;
555 		    memmove(req->reply, req->reply + 2, req->reply_len);
556 		}
557 	    }
558 	    current_req = req->next;
559 	    complete = 1;
560 	} else {
561 	    /* This is tricky. We must break the spinlock to call
562 	     * cuda_input. However, doing so means we might get
563 	     * re-entered from another CPU getting an interrupt
564 	     * or calling cuda_poll(). I ended up using the stack
565 	     * (it's only for 16 bytes) and moving the actual
566 	     * call to cuda_input to outside of the lock.
567 	     */
568 	    ibuf_len = reply_ptr - cuda_rbuf;
569 	    memcpy(ibuf, cuda_rbuf, ibuf_len);
570 	}
571 	if (status == TREQ) {
572 	    out_8(&via[B], in_8(&via[B]) & ~TIP);
573 	    cuda_state = reading;
574 	    reply_ptr = cuda_rbuf;
575 	    reading_reply = 0;
576 	} else {
577 	    cuda_state = idle;
578 	    cuda_start();
579 	}
580 	break;
581 
582     default:
583 	printk("cuda_interrupt: unknown cuda_state %d?\n", cuda_state);
584     }
585     spin_unlock(&cuda_lock);
586     if (complete && req) {
587     	void (*done)(struct adb_request *) = req->done;
588     	mb();
589     	req->complete = 1;
590     	/* Here, we assume that if the request has a done member, the
591     	 * struct request will survive to setting req->complete to 1
592     	 */
593     	if (done)
594 		(*done)(req);
595     }
596     if (ibuf_len)
597 	cuda_input(ibuf, ibuf_len, regs);
598     return IRQ_HANDLED;
599 }
600 
601 static void
602 cuda_input(unsigned char *buf, int nb, struct pt_regs *regs)
603 {
604     int i;
605 
606     switch (buf[0]) {
607     case ADB_PACKET:
608 #ifdef CONFIG_XMON
609 	if (nb == 5 && buf[2] == 0x2c) {
610 	    extern int xmon_wants_key, xmon_adb_keycode;
611 	    if (xmon_wants_key) {
612 		xmon_adb_keycode = buf[3];
613 		return;
614 	    }
615 	}
616 #endif /* CONFIG_XMON */
617 #ifdef CONFIG_ADB
618 	adb_input(buf+2, nb-2, regs, buf[1] & 0x40);
619 #endif /* CONFIG_ADB */
620 	break;
621 
622     default:
623 	printk("data from cuda (%d bytes):", nb);
624 	for (i = 0; i < nb; ++i)
625 	    printk(" %.2x", buf[i]);
626 	printk("\n");
627     }
628 }
629