Merge tag 'trace-v6.9-2' of git://git.kernel.org/pub/scm/linux/kernel/git/trace/linux...
[sfrench/cifs-2.6.git] / drivers / tty / serial / pmac_zilog.c
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * Driver for PowerMac Z85c30 based ESCC cell found in the
4  * "macio" ASICs of various PowerMac models
5  * 
6  * Copyright (C) 2003 Ben. Herrenschmidt (benh@kernel.crashing.org)
7  *
8  * Derived from drivers/macintosh/macserial.c by Paul Mackerras
9  * and drivers/serial/sunzilog.c by David S. Miller
10  *
11  * Hrm... actually, I ripped most of sunzilog (Thanks David !) and
12  * adapted special tweaks needed for us. I don't think it's worth
13  * merging back those though. The DMA code still has to get in
14  * and once done, I expect that driver to remain fairly stable in
15  * the long term, unless we change the driver model again...
16  *
17  * 2004-08-06 Harald Welte <laforge@gnumonks.org>
18  *      - Enable BREAK interrupt
19  *      - Add support for sysreq
20  *
21  * TODO:   - Add DMA support
22  *         - Defer port shutdown to a few seconds after close
23  *         - maybe put something right into uap->clk_divisor
24  */
25
26 #undef DEBUG
27 #undef USE_CTRL_O_SYSRQ
28
29 #include <linux/module.h>
30 #include <linux/tty.h>
31
32 #include <linux/tty_flip.h>
33 #include <linux/major.h>
34 #include <linux/string.h>
35 #include <linux/fcntl.h>
36 #include <linux/mm.h>
37 #include <linux/kernel.h>
38 #include <linux/delay.h>
39 #include <linux/init.h>
40 #include <linux/console.h>
41 #include <linux/adb.h>
42 #include <linux/pmu.h>
43 #include <linux/bitops.h>
44 #include <linux/sysrq.h>
45 #include <linux/mutex.h>
46 #include <linux/of_address.h>
47 #include <linux/of_irq.h>
48 #include <asm/sections.h>
49 #include <linux/io.h>
50 #include <asm/irq.h>
51
52 #ifdef CONFIG_PPC_PMAC
53 #include <asm/machdep.h>
54 #include <asm/pmac_feature.h>
55 #include <asm/macio.h>
56 #else
57 #include <linux/platform_device.h>
58 #define of_machine_is_compatible(x) (0)
59 #endif
60
61 #include <linux/serial.h>
62 #include <linux/serial_core.h>
63
64 #include "pmac_zilog.h"
65
66 MODULE_AUTHOR("Benjamin Herrenschmidt <benh@kernel.crashing.org>");
67 MODULE_DESCRIPTION("Driver for the Mac and PowerMac serial ports.");
68 MODULE_LICENSE("GPL");
69
70 #ifdef CONFIG_SERIAL_PMACZILOG_TTYS
71 #define PMACZILOG_MAJOR         TTY_MAJOR
72 #define PMACZILOG_MINOR         64
73 #define PMACZILOG_NAME          "ttyS"
74 #else
75 #define PMACZILOG_MAJOR         204
76 #define PMACZILOG_MINOR         192
77 #define PMACZILOG_NAME          "ttyPZ"
78 #endif
79
80 #define pmz_debug(fmt, arg...)  pr_debug("ttyPZ%d: " fmt, uap->port.line, ## arg)
81 #define pmz_error(fmt, arg...)  pr_err("ttyPZ%d: " fmt, uap->port.line, ## arg)
82 #define pmz_info(fmt, arg...)   pr_info("ttyPZ%d: " fmt, uap->port.line, ## arg)
83
84 /*
85  * For the sake of early serial console, we can do a pre-probe
86  * (optional) of the ports at rather early boot time.
87  */
88 static struct uart_pmac_port    pmz_ports[MAX_ZS_PORTS];
89 static int                      pmz_ports_count;
90
91 static struct uart_driver pmz_uart_reg = {
92         .owner          =       THIS_MODULE,
93         .driver_name    =       PMACZILOG_NAME,
94         .dev_name       =       PMACZILOG_NAME,
95         .major          =       PMACZILOG_MAJOR,
96         .minor          =       PMACZILOG_MINOR,
97 };
98
99
100 /* 
101  * Load all registers to reprogram the port
102  * This function must only be called when the TX is not busy.  The UART
103  * port lock must be held and local interrupts disabled.
104  */
105 static void pmz_load_zsregs(struct uart_pmac_port *uap, u8 *regs)
106 {
107         int i;
108
109         /* Let pending transmits finish.  */
110         for (i = 0; i < 1000; i++) {
111                 unsigned char stat = read_zsreg(uap, R1);
112                 if (stat & ALL_SNT)
113                         break;
114                 udelay(100);
115         }
116
117         ZS_CLEARERR(uap);
118         zssync(uap);
119         ZS_CLEARFIFO(uap);
120         zssync(uap);
121         ZS_CLEARERR(uap);
122
123         /* Disable all interrupts.  */
124         write_zsreg(uap, R1,
125                     regs[R1] & ~(RxINT_MASK | TxINT_ENAB | EXT_INT_ENAB));
126
127         /* Set parity, sync config, stop bits, and clock divisor.  */
128         write_zsreg(uap, R4, regs[R4]);
129
130         /* Set misc. TX/RX control bits.  */
131         write_zsreg(uap, R10, regs[R10]);
132
133         /* Set TX/RX controls sans the enable bits.  */
134         write_zsreg(uap, R3, regs[R3] & ~RxENABLE);
135         write_zsreg(uap, R5, regs[R5] & ~TxENABLE);
136
137         /* now set R7 "prime" on ESCC */
138         write_zsreg(uap, R15, regs[R15] | EN85C30);
139         write_zsreg(uap, R7, regs[R7P]);
140
141         /* make sure we use R7 "non-prime" on ESCC */
142         write_zsreg(uap, R15, regs[R15] & ~EN85C30);
143
144         /* Synchronous mode config.  */
145         write_zsreg(uap, R6, regs[R6]);
146         write_zsreg(uap, R7, regs[R7]);
147
148         /* Disable baud generator.  */
149         write_zsreg(uap, R14, regs[R14] & ~BRENAB);
150
151         /* Clock mode control.  */
152         write_zsreg(uap, R11, regs[R11]);
153
154         /* Lower and upper byte of baud rate generator divisor.  */
155         write_zsreg(uap, R12, regs[R12]);
156         write_zsreg(uap, R13, regs[R13]);
157         
158         /* Now rewrite R14, with BRENAB (if set).  */
159         write_zsreg(uap, R14, regs[R14]);
160
161         /* Reset external status interrupts.  */
162         write_zsreg(uap, R0, RES_EXT_INT);
163         write_zsreg(uap, R0, RES_EXT_INT);
164
165         /* Rewrite R3/R5, this time without enables masked.  */
166         write_zsreg(uap, R3, regs[R3]);
167         write_zsreg(uap, R5, regs[R5]);
168
169         /* Rewrite R1, this time without IRQ enabled masked.  */
170         write_zsreg(uap, R1, regs[R1]);
171
172         /* Enable interrupts */
173         write_zsreg(uap, R9, regs[R9]);
174 }
175
176 /* 
177  * We do like sunzilog to avoid disrupting pending Tx
178  * Reprogram the Zilog channel HW registers with the copies found in the
179  * software state struct.  If the transmitter is busy, we defer this update
180  * until the next TX complete interrupt.  Else, we do it right now.
181  *
182  * The UART port lock must be held and local interrupts disabled.
183  */
184 static void pmz_maybe_update_regs(struct uart_pmac_port *uap)
185 {
186         if (!ZS_REGS_HELD(uap)) {
187                 if (ZS_TX_ACTIVE(uap)) {
188                         uap->flags |= PMACZILOG_FLAG_REGS_HELD;
189                 } else {
190                         pmz_debug("pmz: maybe_update_regs: updating\n");
191                         pmz_load_zsregs(uap, uap->curregs);
192                 }
193         }
194 }
195
196 static void pmz_interrupt_control(struct uart_pmac_port *uap, int enable)
197 {
198         if (enable) {
199                 uap->curregs[1] |= INT_ALL_Rx | TxINT_ENAB;
200                 if (!ZS_IS_EXTCLK(uap))
201                         uap->curregs[1] |= EXT_INT_ENAB;
202         } else {
203                 uap->curregs[1] &= ~(EXT_INT_ENAB | TxINT_ENAB | RxINT_MASK);
204         }
205         write_zsreg(uap, R1, uap->curregs[1]);
206 }
207
208 static bool pmz_receive_chars(struct uart_pmac_port *uap)
209         __must_hold(&uap->port.lock)
210 {
211         struct tty_port *port;
212         unsigned char ch, r1, drop, flag;
213         int loops = 0;
214
215         /* Sanity check, make sure the old bug is no longer happening */
216         if (uap->port.state == NULL) {
217                 WARN_ON(1);
218                 (void)read_zsdata(uap);
219                 return false;
220         }
221         port = &uap->port.state->port;
222
223         while (1) {
224                 drop = 0;
225
226                 r1 = read_zsreg(uap, R1);
227                 ch = read_zsdata(uap);
228
229                 if (r1 & (PAR_ERR | Rx_OVR | CRC_ERR)) {
230                         write_zsreg(uap, R0, ERR_RES);
231                         zssync(uap);
232                 }
233
234                 ch &= uap->parity_mask;
235                 if (ch == 0 && uap->flags & PMACZILOG_FLAG_BREAK) {
236                         uap->flags &= ~PMACZILOG_FLAG_BREAK;
237                 }
238
239 #if defined(CONFIG_MAGIC_SYSRQ) && defined(CONFIG_SERIAL_CORE_CONSOLE)
240 #ifdef USE_CTRL_O_SYSRQ
241                 /* Handle the SysRq ^O Hack */
242                 if (ch == '\x0f') {
243                         uap->port.sysrq = jiffies + HZ*5;
244                         goto next_char;
245                 }
246 #endif /* USE_CTRL_O_SYSRQ */
247                 if (uap->port.sysrq) {
248                         int swallow;
249                         uart_port_unlock(&uap->port);
250                         swallow = uart_handle_sysrq_char(&uap->port, ch);
251                         uart_port_lock(&uap->port);
252                         if (swallow)
253                                 goto next_char;
254                 }
255 #endif /* CONFIG_MAGIC_SYSRQ && CONFIG_SERIAL_CORE_CONSOLE */
256
257                 /* A real serial line, record the character and status.  */
258                 if (drop)
259                         goto next_char;
260
261                 flag = TTY_NORMAL;
262                 uap->port.icount.rx++;
263
264                 if (r1 & (PAR_ERR | Rx_OVR | CRC_ERR | BRK_ABRT)) {
265                         if (r1 & BRK_ABRT) {
266                                 pmz_debug("pmz: got break !\n");
267                                 r1 &= ~(PAR_ERR | CRC_ERR);
268                                 uap->port.icount.brk++;
269                                 if (uart_handle_break(&uap->port))
270                                         goto next_char;
271                         }
272                         else if (r1 & PAR_ERR)
273                                 uap->port.icount.parity++;
274                         else if (r1 & CRC_ERR)
275                                 uap->port.icount.frame++;
276                         if (r1 & Rx_OVR)
277                                 uap->port.icount.overrun++;
278                         r1 &= uap->port.read_status_mask;
279                         if (r1 & BRK_ABRT)
280                                 flag = TTY_BREAK;
281                         else if (r1 & PAR_ERR)
282                                 flag = TTY_PARITY;
283                         else if (r1 & CRC_ERR)
284                                 flag = TTY_FRAME;
285                 }
286
287                 if (uap->port.ignore_status_mask == 0xff ||
288                     (r1 & uap->port.ignore_status_mask) == 0) {
289                         tty_insert_flip_char(port, ch, flag);
290                 }
291                 if (r1 & Rx_OVR)
292                         tty_insert_flip_char(port, 0, TTY_OVERRUN);
293         next_char:
294                 /* We can get stuck in an infinite loop getting char 0 when the
295                  * line is in a wrong HW state, we break that here.
296                  * When that happens, I disable the receive side of the driver.
297                  * Note that what I've been experiencing is a real irq loop where
298                  * I'm getting flooded regardless of the actual port speed.
299                  * Something strange is going on with the HW
300                  */
301                 if ((++loops) > 1000)
302                         goto flood;
303                 ch = read_zsreg(uap, R0);
304                 if (!(ch & Rx_CH_AV))
305                         break;
306         }
307
308         return true;
309  flood:
310         pmz_interrupt_control(uap, 0);
311         pmz_error("pmz: rx irq flood !\n");
312         return true;
313 }
314
315 static void pmz_status_handle(struct uart_pmac_port *uap)
316 {
317         unsigned char status;
318
319         status = read_zsreg(uap, R0);
320         write_zsreg(uap, R0, RES_EXT_INT);
321         zssync(uap);
322
323         if (ZS_IS_OPEN(uap) && ZS_WANTS_MODEM_STATUS(uap)) {
324                 if (status & SYNC_HUNT)
325                         uap->port.icount.dsr++;
326
327                 /* The Zilog just gives us an interrupt when DCD/CTS/etc. change.
328                  * But it does not tell us which bit has changed, we have to keep
329                  * track of this ourselves.
330                  * The CTS input is inverted for some reason.  -- paulus
331                  */
332                 if ((status ^ uap->prev_status) & DCD)
333                         uart_handle_dcd_change(&uap->port,
334                                                (status & DCD));
335                 if ((status ^ uap->prev_status) & CTS)
336                         uart_handle_cts_change(&uap->port,
337                                                !(status & CTS));
338
339                 wake_up_interruptible(&uap->port.state->port.delta_msr_wait);
340         }
341
342         if (status & BRK_ABRT)
343                 uap->flags |= PMACZILOG_FLAG_BREAK;
344
345         uap->prev_status = status;
346 }
347
348 static void pmz_transmit_chars(struct uart_pmac_port *uap)
349 {
350         struct circ_buf *xmit;
351
352         if (ZS_IS_CONS(uap)) {
353                 unsigned char status = read_zsreg(uap, R0);
354
355                 /* TX still busy?  Just wait for the next TX done interrupt.
356                  *
357                  * It can occur because of how we do serial console writes.  It would
358                  * be nice to transmit console writes just like we normally would for
359                  * a TTY line. (ie. buffered and TX interrupt driven).  That is not
360                  * easy because console writes cannot sleep.  One solution might be
361                  * to poll on enough port->xmit space becoming free.  -DaveM
362                  */
363                 if (!(status & Tx_BUF_EMP))
364                         return;
365         }
366
367         uap->flags &= ~PMACZILOG_FLAG_TX_ACTIVE;
368
369         if (ZS_REGS_HELD(uap)) {
370                 pmz_load_zsregs(uap, uap->curregs);
371                 uap->flags &= ~PMACZILOG_FLAG_REGS_HELD;
372         }
373
374         if (ZS_TX_STOPPED(uap)) {
375                 uap->flags &= ~PMACZILOG_FLAG_TX_STOPPED;
376                 goto ack_tx_int;
377         }
378
379         /* Under some circumstances, we see interrupts reported for
380          * a closed channel. The interrupt mask in R1 is clear, but
381          * R3 still signals the interrupts and we see them when taking
382          * an interrupt for the other channel (this could be a qemu
383          * bug but since the ESCC doc doesn't specify precsiely whether
384          * R3 interrup status bits are masked by R1 interrupt enable
385          * bits, better safe than sorry). --BenH.
386          */
387         if (!ZS_IS_OPEN(uap))
388                 goto ack_tx_int;
389
390         if (uap->port.x_char) {
391                 uap->flags |= PMACZILOG_FLAG_TX_ACTIVE;
392                 write_zsdata(uap, uap->port.x_char);
393                 zssync(uap);
394                 uap->port.icount.tx++;
395                 uap->port.x_char = 0;
396                 return;
397         }
398
399         if (uap->port.state == NULL)
400                 goto ack_tx_int;
401         xmit = &uap->port.state->xmit;
402         if (uart_circ_empty(xmit)) {
403                 uart_write_wakeup(&uap->port);
404                 goto ack_tx_int;
405         }
406         if (uart_tx_stopped(&uap->port))
407                 goto ack_tx_int;
408
409         uap->flags |= PMACZILOG_FLAG_TX_ACTIVE;
410         write_zsdata(uap, xmit->buf[xmit->tail]);
411         zssync(uap);
412
413         uart_xmit_advance(&uap->port, 1);
414
415         if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
416                 uart_write_wakeup(&uap->port);
417
418         return;
419
420 ack_tx_int:
421         write_zsreg(uap, R0, RES_Tx_P);
422         zssync(uap);
423 }
424
425 /* Hrm... we register that twice, fixme later.... */
426 static irqreturn_t pmz_interrupt(int irq, void *dev_id)
427 {
428         struct uart_pmac_port *uap = dev_id;
429         struct uart_pmac_port *uap_a;
430         struct uart_pmac_port *uap_b;
431         int rc = IRQ_NONE;
432         bool push;
433         u8 r3;
434
435         uap_a = pmz_get_port_A(uap);
436         uap_b = uap_a->mate;
437
438         uart_port_lock(&uap_a->port);
439         r3 = read_zsreg(uap_a, R3);
440
441         /* Channel A */
442         push = false;
443         if (r3 & (CHAEXT | CHATxIP | CHARxIP)) {
444                 if (!ZS_IS_OPEN(uap_a)) {
445                         pmz_debug("ChanA interrupt while not open !\n");
446                         goto skip_a;
447                 }
448                 write_zsreg(uap_a, R0, RES_H_IUS);
449                 zssync(uap_a);          
450                 if (r3 & CHAEXT)
451                         pmz_status_handle(uap_a);
452                 if (r3 & CHARxIP)
453                         push = pmz_receive_chars(uap_a);
454                 if (r3 & CHATxIP)
455                         pmz_transmit_chars(uap_a);
456                 rc = IRQ_HANDLED;
457         }
458  skip_a:
459         uart_port_unlock(&uap_a->port);
460         if (push)
461                 tty_flip_buffer_push(&uap->port.state->port);
462
463         if (!uap_b)
464                 goto out;
465
466         uart_port_lock(&uap_b->port);
467         push = false;
468         if (r3 & (CHBEXT | CHBTxIP | CHBRxIP)) {
469                 if (!ZS_IS_OPEN(uap_b)) {
470                         pmz_debug("ChanB interrupt while not open !\n");
471                         goto skip_b;
472                 }
473                 write_zsreg(uap_b, R0, RES_H_IUS);
474                 zssync(uap_b);
475                 if (r3 & CHBEXT)
476                         pmz_status_handle(uap_b);
477                 if (r3 & CHBRxIP)
478                         push = pmz_receive_chars(uap_b);
479                 if (r3 & CHBTxIP)
480                         pmz_transmit_chars(uap_b);
481                 rc = IRQ_HANDLED;
482         }
483  skip_b:
484         uart_port_unlock(&uap_b->port);
485         if (push)
486                 tty_flip_buffer_push(&uap->port.state->port);
487
488  out:
489         return rc;
490 }
491
492 /*
493  * Peek the status register, lock not held by caller
494  */
495 static inline u8 pmz_peek_status(struct uart_pmac_port *uap)
496 {
497         unsigned long flags;
498         u8 status;
499         
500         uart_port_lock_irqsave(&uap->port, &flags);
501         status = read_zsreg(uap, R0);
502         uart_port_unlock_irqrestore(&uap->port, flags);
503
504         return status;
505 }
506
507 /* 
508  * Check if transmitter is empty
509  * The port lock is not held.
510  */
511 static unsigned int pmz_tx_empty(struct uart_port *port)
512 {
513         unsigned char status;
514
515         status = pmz_peek_status(to_pmz(port));
516         if (status & Tx_BUF_EMP)
517                 return TIOCSER_TEMT;
518         return 0;
519 }
520
521 /* 
522  * Set Modem Control (RTS & DTR) bits
523  * The port lock is held and interrupts are disabled.
524  * Note: Shall we really filter out RTS on external ports or
525  * should that be dealt at higher level only ?
526  */
527 static void pmz_set_mctrl(struct uart_port *port, unsigned int mctrl)
528 {
529         struct uart_pmac_port *uap = to_pmz(port);
530         unsigned char set_bits, clear_bits;
531
532         /* Do nothing for irda for now... */
533         if (ZS_IS_IRDA(uap))
534                 return;
535         /* We get called during boot with a port not up yet */
536         if (!(ZS_IS_OPEN(uap) || ZS_IS_CONS(uap)))
537                 return;
538
539         set_bits = clear_bits = 0;
540
541         if (ZS_IS_INTMODEM(uap)) {
542                 if (mctrl & TIOCM_RTS)
543                         set_bits |= RTS;
544                 else
545                         clear_bits |= RTS;
546         }
547         if (mctrl & TIOCM_DTR)
548                 set_bits |= DTR;
549         else
550                 clear_bits |= DTR;
551
552         /* NOTE: Not subject to 'transmitter active' rule.  */ 
553         uap->curregs[R5] |= set_bits;
554         uap->curregs[R5] &= ~clear_bits;
555
556         write_zsreg(uap, R5, uap->curregs[R5]);
557         pmz_debug("pmz_set_mctrl: set bits: %x, clear bits: %x -> %x\n",
558                   set_bits, clear_bits, uap->curregs[R5]);
559         zssync(uap);
560 }
561
562 /* 
563  * Get Modem Control bits (only the input ones, the core will
564  * or that with a cached value of the control ones)
565  * The port lock is held and interrupts are disabled.
566  */
567 static unsigned int pmz_get_mctrl(struct uart_port *port)
568 {
569         struct uart_pmac_port *uap = to_pmz(port);
570         unsigned char status;
571         unsigned int ret;
572
573         status = read_zsreg(uap, R0);
574
575         ret = 0;
576         if (status & DCD)
577                 ret |= TIOCM_CAR;
578         if (status & SYNC_HUNT)
579                 ret |= TIOCM_DSR;
580         if (!(status & CTS))
581                 ret |= TIOCM_CTS;
582
583         return ret;
584 }
585
586 /* 
587  * Stop TX side. Dealt like sunzilog at next Tx interrupt,
588  * though for DMA, we will have to do a bit more.
589  * The port lock is held and interrupts are disabled.
590  */
591 static void pmz_stop_tx(struct uart_port *port)
592 {
593         to_pmz(port)->flags |= PMACZILOG_FLAG_TX_STOPPED;
594 }
595
596 /* 
597  * Kick the Tx side.
598  * The port lock is held and interrupts are disabled.
599  */
600 static void pmz_start_tx(struct uart_port *port)
601 {
602         struct uart_pmac_port *uap = to_pmz(port);
603         unsigned char status;
604
605         uap->flags |= PMACZILOG_FLAG_TX_ACTIVE;
606         uap->flags &= ~PMACZILOG_FLAG_TX_STOPPED;
607
608         status = read_zsreg(uap, R0);
609
610         /* TX busy?  Just wait for the TX done interrupt.  */
611         if (!(status & Tx_BUF_EMP))
612                 return;
613
614         /* Send the first character to jump-start the TX done
615          * IRQ sending engine.
616          */
617         if (port->x_char) {
618                 write_zsdata(uap, port->x_char);
619                 zssync(uap);
620                 port->icount.tx++;
621                 port->x_char = 0;
622         } else {
623                 struct circ_buf *xmit = &port->state->xmit;
624
625                 if (uart_circ_empty(xmit))
626                         return;
627                 write_zsdata(uap, xmit->buf[xmit->tail]);
628                 zssync(uap);
629                 uart_xmit_advance(port, 1);
630
631                 if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
632                         uart_write_wakeup(&uap->port);
633         }
634 }
635
636 /* 
637  * Stop Rx side, basically disable emitting of
638  * Rx interrupts on the port. We don't disable the rx
639  * side of the chip proper though
640  * The port lock is held.
641  */
642 static void pmz_stop_rx(struct uart_port *port)
643 {
644         struct uart_pmac_port *uap = to_pmz(port);
645
646         /* Disable all RX interrupts.  */
647         uap->curregs[R1] &= ~RxINT_MASK;
648         pmz_maybe_update_regs(uap);
649 }
650
651 /* 
652  * Enable modem status change interrupts
653  * The port lock is held.
654  */
655 static void pmz_enable_ms(struct uart_port *port)
656 {
657         struct uart_pmac_port *uap = to_pmz(port);
658         unsigned char new_reg;
659
660         if (ZS_IS_IRDA(uap))
661                 return;
662         new_reg = uap->curregs[R15] | (DCDIE | SYNCIE | CTSIE);
663         if (new_reg != uap->curregs[R15]) {
664                 uap->curregs[R15] = new_reg;
665
666                 /* NOTE: Not subject to 'transmitter active' rule. */
667                 write_zsreg(uap, R15, uap->curregs[R15]);
668         }
669 }
670
671 /* 
672  * Control break state emission
673  * The port lock is not held.
674  */
675 static void pmz_break_ctl(struct uart_port *port, int break_state)
676 {
677         struct uart_pmac_port *uap = to_pmz(port);
678         unsigned char set_bits, clear_bits, new_reg;
679         unsigned long flags;
680
681         set_bits = clear_bits = 0;
682
683         if (break_state)
684                 set_bits |= SND_BRK;
685         else
686                 clear_bits |= SND_BRK;
687
688         uart_port_lock_irqsave(port, &flags);
689
690         new_reg = (uap->curregs[R5] | set_bits) & ~clear_bits;
691         if (new_reg != uap->curregs[R5]) {
692                 uap->curregs[R5] = new_reg;
693                 write_zsreg(uap, R5, uap->curregs[R5]);
694         }
695
696         uart_port_unlock_irqrestore(port, flags);
697 }
698
699 #ifdef CONFIG_PPC_PMAC
700
701 /*
702  * Turn power on or off to the SCC and associated stuff
703  * (port drivers, modem, IR port, etc.)
704  * Returns the number of milliseconds we should wait before
705  * trying to use the port.
706  */
707 static int pmz_set_scc_power(struct uart_pmac_port *uap, int state)
708 {
709         int delay = 0;
710         int rc;
711
712         if (state) {
713                 rc = pmac_call_feature(
714                         PMAC_FTR_SCC_ENABLE, uap->node, uap->port_type, 1);
715                 pmz_debug("port power on result: %d\n", rc);
716                 if (ZS_IS_INTMODEM(uap)) {
717                         rc = pmac_call_feature(
718                                 PMAC_FTR_MODEM_ENABLE, uap->node, 0, 1);
719                         delay = 2500;   /* wait for 2.5s before using */
720                         pmz_debug("modem power result: %d\n", rc);
721                 }
722         } else {
723                 /* TODO: Make that depend on a timer, don't power down
724                  * immediately
725                  */
726                 if (ZS_IS_INTMODEM(uap)) {
727                         rc = pmac_call_feature(
728                                 PMAC_FTR_MODEM_ENABLE, uap->node, 0, 0);
729                         pmz_debug("port power off result: %d\n", rc);
730                 }
731                 pmac_call_feature(PMAC_FTR_SCC_ENABLE, uap->node, uap->port_type, 0);
732         }
733         return delay;
734 }
735
736 #else
737
738 static int pmz_set_scc_power(struct uart_pmac_port *uap, int state)
739 {
740         return 0;
741 }
742
743 #endif /* !CONFIG_PPC_PMAC */
744
745 /*
746  * FixZeroBug....Works around a bug in the SCC receiving channel.
747  * Inspired from Darwin code, 15 Sept. 2000  -DanM
748  *
749  * The following sequence prevents a problem that is seen with O'Hare ASICs
750  * (most versions -- also with some Heathrow and Hydra ASICs) where a zero
751  * at the input to the receiver becomes 'stuck' and locks up the receiver.
752  * This problem can occur as a result of a zero bit at the receiver input
753  * coincident with any of the following events:
754  *
755  *      The SCC is initialized (hardware or software).
756  *      A framing error is detected.
757  *      The clocking option changes from synchronous or X1 asynchronous
758  *              clocking to X16, X32, or X64 asynchronous clocking.
759  *      The decoding mode is changed among NRZ, NRZI, FM0, or FM1.
760  *
761  * This workaround attempts to recover from the lockup condition by placing
762  * the SCC in synchronous loopback mode with a fast clock before programming
763  * any of the asynchronous modes.
764  */
765 static void pmz_fix_zero_bug_scc(struct uart_pmac_port *uap)
766 {
767         write_zsreg(uap, 9, ZS_IS_CHANNEL_A(uap) ? CHRA : CHRB);
768         zssync(uap);
769         udelay(10);
770         write_zsreg(uap, 9, (ZS_IS_CHANNEL_A(uap) ? CHRA : CHRB) | NV);
771         zssync(uap);
772
773         write_zsreg(uap, 4, X1CLK | MONSYNC);
774         write_zsreg(uap, 3, Rx8);
775         write_zsreg(uap, 5, Tx8 | RTS);
776         write_zsreg(uap, 9, NV);        /* Didn't we already do this? */
777         write_zsreg(uap, 11, RCBR | TCBR);
778         write_zsreg(uap, 12, 0);
779         write_zsreg(uap, 13, 0);
780         write_zsreg(uap, 14, (LOOPBAK | BRSRC));
781         write_zsreg(uap, 14, (LOOPBAK | BRSRC | BRENAB));
782         write_zsreg(uap, 3, Rx8 | RxENABLE);
783         write_zsreg(uap, 0, RES_EXT_INT);
784         write_zsreg(uap, 0, RES_EXT_INT);
785         write_zsreg(uap, 0, RES_EXT_INT);       /* to kill some time */
786
787         /* The channel should be OK now, but it is probably receiving
788          * loopback garbage.
789          * Switch to asynchronous mode, disable the receiver,
790          * and discard everything in the receive buffer.
791          */
792         write_zsreg(uap, 9, NV);
793         write_zsreg(uap, 4, X16CLK | SB_MASK);
794         write_zsreg(uap, 3, Rx8);
795
796         while (read_zsreg(uap, 0) & Rx_CH_AV) {
797                 (void)read_zsreg(uap, 8);
798                 write_zsreg(uap, 0, RES_EXT_INT);
799                 write_zsreg(uap, 0, ERR_RES);
800         }
801 }
802
803 /*
804  * Real startup routine, powers up the hardware and sets up
805  * the SCC. Returns a delay in ms where you need to wait before
806  * actually using the port, this is typically the internal modem
807  * powerup delay. This routine expect the lock to be taken.
808  */
809 static int __pmz_startup(struct uart_pmac_port *uap)
810 {
811         int pwr_delay = 0;
812
813         memset(&uap->curregs, 0, sizeof(uap->curregs));
814
815         /* Power up the SCC & underlying hardware (modem/irda) */
816         pwr_delay = pmz_set_scc_power(uap, 1);
817
818         /* Nice buggy HW ... */
819         pmz_fix_zero_bug_scc(uap);
820
821         /* Reset the channel */
822         uap->curregs[R9] = 0;
823         write_zsreg(uap, 9, ZS_IS_CHANNEL_A(uap) ? CHRA : CHRB);
824         zssync(uap);
825         udelay(10);
826         write_zsreg(uap, 9, 0);
827         zssync(uap);
828
829         /* Clear the interrupt registers */
830         write_zsreg(uap, R1, 0);
831         write_zsreg(uap, R0, ERR_RES);
832         write_zsreg(uap, R0, ERR_RES);
833         write_zsreg(uap, R0, RES_H_IUS);
834         write_zsreg(uap, R0, RES_H_IUS);
835
836         /* Setup some valid baud rate */
837         uap->curregs[R4] = X16CLK | SB1;
838         uap->curregs[R3] = Rx8;
839         uap->curregs[R5] = Tx8 | RTS;
840         if (!ZS_IS_IRDA(uap))
841                 uap->curregs[R5] |= DTR;
842         uap->curregs[R12] = 0;
843         uap->curregs[R13] = 0;
844         uap->curregs[R14] = BRENAB;
845
846         /* Clear handshaking, enable BREAK interrupts */
847         uap->curregs[R15] = BRKIE;
848
849         /* Master interrupt enable */
850         uap->curregs[R9] |= NV | MIE;
851
852         pmz_load_zsregs(uap, uap->curregs);
853
854         /* Enable receiver and transmitter.  */
855         write_zsreg(uap, R3, uap->curregs[R3] |= RxENABLE);
856         write_zsreg(uap, R5, uap->curregs[R5] |= TxENABLE);
857
858         /* Remember status for DCD/CTS changes */
859         uap->prev_status = read_zsreg(uap, R0);
860
861         return pwr_delay;
862 }
863
864 static void pmz_irda_reset(struct uart_pmac_port *uap)
865 {
866         unsigned long flags;
867
868         uart_port_lock_irqsave(&uap->port, &flags);
869         uap->curregs[R5] |= DTR;
870         write_zsreg(uap, R5, uap->curregs[R5]);
871         zssync(uap);
872         uart_port_unlock_irqrestore(&uap->port, flags);
873         msleep(110);
874
875         uart_port_lock_irqsave(&uap->port, &flags);
876         uap->curregs[R5] &= ~DTR;
877         write_zsreg(uap, R5, uap->curregs[R5]);
878         zssync(uap);
879         uart_port_unlock_irqrestore(&uap->port, flags);
880         msleep(10);
881 }
882
883 /*
884  * This is the "normal" startup routine, using the above one
885  * wrapped with the lock and doing a schedule delay
886  */
887 static int pmz_startup(struct uart_port *port)
888 {
889         struct uart_pmac_port *uap = to_pmz(port);
890         unsigned long flags;
891         int pwr_delay = 0;
892
893         uap->flags |= PMACZILOG_FLAG_IS_OPEN;
894
895         /* A console is never powered down. Else, power up and
896          * initialize the chip
897          */
898         if (!ZS_IS_CONS(uap)) {
899                 uart_port_lock_irqsave(port, &flags);
900                 pwr_delay = __pmz_startup(uap);
901                 uart_port_unlock_irqrestore(port, flags);
902         }       
903         sprintf(uap->irq_name, PMACZILOG_NAME"%d", uap->port.line);
904         if (request_irq(uap->port.irq, pmz_interrupt, IRQF_SHARED,
905                         uap->irq_name, uap)) {
906                 pmz_error("Unable to register zs interrupt handler.\n");
907                 pmz_set_scc_power(uap, 0);
908                 return -ENXIO;
909         }
910
911         /* Right now, we deal with delay by blocking here, I'll be
912          * smarter later on
913          */
914         if (pwr_delay != 0) {
915                 pmz_debug("pmz: delaying %d ms\n", pwr_delay);
916                 msleep(pwr_delay);
917         }
918
919         /* IrDA reset is done now */
920         if (ZS_IS_IRDA(uap))
921                 pmz_irda_reset(uap);
922
923         /* Enable interrupt requests for the channel */
924         uart_port_lock_irqsave(port, &flags);
925         pmz_interrupt_control(uap, 1);
926         uart_port_unlock_irqrestore(port, flags);
927
928         return 0;
929 }
930
931 static void pmz_shutdown(struct uart_port *port)
932 {
933         struct uart_pmac_port *uap = to_pmz(port);
934         unsigned long flags;
935
936         uart_port_lock_irqsave(port, &flags);
937
938         /* Disable interrupt requests for the channel */
939         pmz_interrupt_control(uap, 0);
940
941         if (!ZS_IS_CONS(uap)) {
942                 /* Disable receiver and transmitter */
943                 uap->curregs[R3] &= ~RxENABLE;
944                 uap->curregs[R5] &= ~TxENABLE;
945
946                 /* Disable break assertion */
947                 uap->curregs[R5] &= ~SND_BRK;
948                 pmz_maybe_update_regs(uap);
949         }
950
951         uart_port_unlock_irqrestore(port, flags);
952
953         /* Release interrupt handler */
954         free_irq(uap->port.irq, uap);
955
956         uart_port_lock_irqsave(port, &flags);
957
958         uap->flags &= ~PMACZILOG_FLAG_IS_OPEN;
959
960         if (!ZS_IS_CONS(uap))
961                 pmz_set_scc_power(uap, 0);      /* Shut the chip down */
962
963         uart_port_unlock_irqrestore(port, flags);
964 }
965
966 /* Shared by TTY driver and serial console setup.  The port lock is held
967  * and local interrupts are disabled.
968  */
969 static void pmz_convert_to_zs(struct uart_pmac_port *uap, unsigned int cflag,
970                               unsigned int iflag, unsigned long baud)
971 {
972         int brg;
973
974         /* Switch to external clocking for IrDA high clock rates. That
975          * code could be re-used for Midi interfaces with different
976          * multipliers
977          */
978         if (baud >= 115200 && ZS_IS_IRDA(uap)) {
979                 uap->curregs[R4] = X1CLK;
980                 uap->curregs[R11] = RCTRxCP | TCTRxCP;
981                 uap->curregs[R14] = 0; /* BRG off */
982                 uap->curregs[R12] = 0;
983                 uap->curregs[R13] = 0;
984                 uap->flags |= PMACZILOG_FLAG_IS_EXTCLK;
985         } else {
986                 switch (baud) {
987                 case ZS_CLOCK/16:       /* 230400 */
988                         uap->curregs[R4] = X16CLK;
989                         uap->curregs[R11] = 0;
990                         uap->curregs[R14] = 0;
991                         break;
992                 case ZS_CLOCK/32:       /* 115200 */
993                         uap->curregs[R4] = X32CLK;
994                         uap->curregs[R11] = 0;
995                         uap->curregs[R14] = 0;
996                         break;
997                 default:
998                         uap->curregs[R4] = X16CLK;
999                         uap->curregs[R11] = TCBR | RCBR;
1000                         brg = BPS_TO_BRG(baud, ZS_CLOCK / 16);
1001                         uap->curregs[R12] = (brg & 255);
1002                         uap->curregs[R13] = ((brg >> 8) & 255);
1003                         uap->curregs[R14] = BRENAB;
1004                 }
1005                 uap->flags &= ~PMACZILOG_FLAG_IS_EXTCLK;
1006         }
1007
1008         /* Character size, stop bits, and parity. */
1009         uap->curregs[3] &= ~RxN_MASK;
1010         uap->curregs[5] &= ~TxN_MASK;
1011
1012         switch (cflag & CSIZE) {
1013         case CS5:
1014                 uap->curregs[3] |= Rx5;
1015                 uap->curregs[5] |= Tx5;
1016                 uap->parity_mask = 0x1f;
1017                 break;
1018         case CS6:
1019                 uap->curregs[3] |= Rx6;
1020                 uap->curregs[5] |= Tx6;
1021                 uap->parity_mask = 0x3f;
1022                 break;
1023         case CS7:
1024                 uap->curregs[3] |= Rx7;
1025                 uap->curregs[5] |= Tx7;
1026                 uap->parity_mask = 0x7f;
1027                 break;
1028         case CS8:
1029         default:
1030                 uap->curregs[3] |= Rx8;
1031                 uap->curregs[5] |= Tx8;
1032                 uap->parity_mask = 0xff;
1033                 break;
1034         }
1035         uap->curregs[4] &= ~(SB_MASK);
1036         if (cflag & CSTOPB)
1037                 uap->curregs[4] |= SB2;
1038         else
1039                 uap->curregs[4] |= SB1;
1040         if (cflag & PARENB)
1041                 uap->curregs[4] |= PAR_ENAB;
1042         else
1043                 uap->curregs[4] &= ~PAR_ENAB;
1044         if (!(cflag & PARODD))
1045                 uap->curregs[4] |= PAR_EVEN;
1046         else
1047                 uap->curregs[4] &= ~PAR_EVEN;
1048
1049         uap->port.read_status_mask = Rx_OVR;
1050         if (iflag & INPCK)
1051                 uap->port.read_status_mask |= CRC_ERR | PAR_ERR;
1052         if (iflag & (IGNBRK | BRKINT | PARMRK))
1053                 uap->port.read_status_mask |= BRK_ABRT;
1054
1055         uap->port.ignore_status_mask = 0;
1056         if (iflag & IGNPAR)
1057                 uap->port.ignore_status_mask |= CRC_ERR | PAR_ERR;
1058         if (iflag & IGNBRK) {
1059                 uap->port.ignore_status_mask |= BRK_ABRT;
1060                 if (iflag & IGNPAR)
1061                         uap->port.ignore_status_mask |= Rx_OVR;
1062         }
1063
1064         if ((cflag & CREAD) == 0)
1065                 uap->port.ignore_status_mask = 0xff;
1066 }
1067
1068
1069 /*
1070  * Set the irda codec on the imac to the specified baud rate.
1071  */
1072 static void pmz_irda_setup(struct uart_pmac_port *uap, unsigned long *baud)
1073 {
1074         u8 cmdbyte;
1075         int t, version;
1076
1077         switch (*baud) {
1078         /* SIR modes */
1079         case 2400:
1080                 cmdbyte = 0x53;
1081                 break;
1082         case 4800:
1083                 cmdbyte = 0x52;
1084                 break;
1085         case 9600:
1086                 cmdbyte = 0x51;
1087                 break;
1088         case 19200:
1089                 cmdbyte = 0x50;
1090                 break;
1091         case 38400:
1092                 cmdbyte = 0x4f;
1093                 break;
1094         case 57600:
1095                 cmdbyte = 0x4e;
1096                 break;
1097         case 115200:
1098                 cmdbyte = 0x4d;
1099                 break;
1100         /* The FIR modes aren't really supported at this point, how
1101          * do we select the speed ? via the FCR on KeyLargo ?
1102          */
1103         case 1152000:
1104                 cmdbyte = 0;
1105                 break;
1106         case 4000000:
1107                 cmdbyte = 0;
1108                 break;
1109         default: /* 9600 */
1110                 cmdbyte = 0x51;
1111                 *baud = 9600;
1112                 break;
1113         }
1114
1115         /* Wait for transmitter to drain */
1116         t = 10000;
1117         while ((read_zsreg(uap, R0) & Tx_BUF_EMP) == 0
1118                || (read_zsreg(uap, R1) & ALL_SNT) == 0) {
1119                 if (--t <= 0) {
1120                         pmz_error("transmitter didn't drain\n");
1121                         return;
1122                 }
1123                 udelay(10);
1124         }
1125
1126         /* Drain the receiver too */
1127         t = 100;
1128         (void)read_zsdata(uap);
1129         (void)read_zsdata(uap);
1130         (void)read_zsdata(uap);
1131         mdelay(10);
1132         while (read_zsreg(uap, R0) & Rx_CH_AV) {
1133                 read_zsdata(uap);
1134                 mdelay(10);
1135                 if (--t <= 0) {
1136                         pmz_error("receiver didn't drain\n");
1137                         return;
1138                 }
1139         }
1140
1141         /* Switch to command mode */
1142         uap->curregs[R5] |= DTR;
1143         write_zsreg(uap, R5, uap->curregs[R5]);
1144         zssync(uap);
1145         mdelay(1);
1146
1147         /* Switch SCC to 19200 */
1148         pmz_convert_to_zs(uap, CS8, 0, 19200);          
1149         pmz_load_zsregs(uap, uap->curregs);
1150         mdelay(1);
1151
1152         /* Write get_version command byte */
1153         write_zsdata(uap, 1);
1154         t = 5000;
1155         while ((read_zsreg(uap, R0) & Rx_CH_AV) == 0) {
1156                 if (--t <= 0) {
1157                         pmz_error("irda_setup timed out on get_version byte\n");
1158                         goto out;
1159                 }
1160                 udelay(10);
1161         }
1162         version = read_zsdata(uap);
1163
1164         if (version < 4) {
1165                 pmz_info("IrDA: dongle version %d not supported\n", version);
1166                 goto out;
1167         }
1168
1169         /* Send speed mode */
1170         write_zsdata(uap, cmdbyte);
1171         t = 5000;
1172         while ((read_zsreg(uap, R0) & Rx_CH_AV) == 0) {
1173                 if (--t <= 0) {
1174                         pmz_error("irda_setup timed out on speed mode byte\n");
1175                         goto out;
1176                 }
1177                 udelay(10);
1178         }
1179         t = read_zsdata(uap);
1180         if (t != cmdbyte)
1181                 pmz_error("irda_setup speed mode byte = %x (%x)\n", t, cmdbyte);
1182
1183         pmz_info("IrDA setup for %ld bps, dongle version: %d\n",
1184                  *baud, version);
1185
1186         (void)read_zsdata(uap);
1187         (void)read_zsdata(uap);
1188         (void)read_zsdata(uap);
1189
1190  out:
1191         /* Switch back to data mode */
1192         uap->curregs[R5] &= ~DTR;
1193         write_zsreg(uap, R5, uap->curregs[R5]);
1194         zssync(uap);
1195
1196         (void)read_zsdata(uap);
1197         (void)read_zsdata(uap);
1198         (void)read_zsdata(uap);
1199 }
1200
1201
1202 static void __pmz_set_termios(struct uart_port *port, struct ktermios *termios,
1203                               const struct ktermios *old)
1204 {
1205         struct uart_pmac_port *uap = to_pmz(port);
1206         unsigned long baud;
1207
1208         /* XXX Check which revs of machines actually allow 1 and 4Mb speeds
1209          * on the IR dongle. Note that the IRTTY driver currently doesn't know
1210          * about the FIR mode and high speed modes. So these are unused. For
1211          * implementing proper support for these, we should probably add some
1212          * DMA as well, at least on the Rx side, which isn't a simple thing
1213          * at this point.
1214          */
1215         if (ZS_IS_IRDA(uap)) {
1216                 /* Calc baud rate */
1217                 baud = uart_get_baud_rate(port, termios, old, 1200, 4000000);
1218                 pmz_debug("pmz: switch IRDA to %ld bauds\n", baud);
1219                 /* Cet the irda codec to the right rate */
1220                 pmz_irda_setup(uap, &baud);
1221                 /* Set final baud rate */
1222                 pmz_convert_to_zs(uap, termios->c_cflag, termios->c_iflag, baud);
1223                 pmz_load_zsregs(uap, uap->curregs);
1224                 zssync(uap);
1225         } else {
1226                 baud = uart_get_baud_rate(port, termios, old, 1200, 230400);
1227                 pmz_convert_to_zs(uap, termios->c_cflag, termios->c_iflag, baud);
1228                 /* Make sure modem status interrupts are correctly configured */
1229                 if (UART_ENABLE_MS(&uap->port, termios->c_cflag)) {
1230                         uap->curregs[R15] |= DCDIE | SYNCIE | CTSIE;
1231                         uap->flags |= PMACZILOG_FLAG_MODEM_STATUS;
1232                 } else {
1233                         uap->curregs[R15] &= ~(DCDIE | SYNCIE | CTSIE);
1234                         uap->flags &= ~PMACZILOG_FLAG_MODEM_STATUS;
1235                 }
1236
1237                 /* Load registers to the chip */
1238                 pmz_maybe_update_regs(uap);
1239         }
1240         uart_update_timeout(port, termios->c_cflag, baud);
1241 }
1242
1243 /* The port lock is not held.  */
1244 static void pmz_set_termios(struct uart_port *port, struct ktermios *termios,
1245                             const struct ktermios *old)
1246 {
1247         struct uart_pmac_port *uap = to_pmz(port);
1248         unsigned long flags;
1249
1250         uart_port_lock_irqsave(port, &flags);   
1251
1252         /* Disable IRQs on the port */
1253         pmz_interrupt_control(uap, 0);
1254
1255         /* Setup new port configuration */
1256         __pmz_set_termios(port, termios, old);
1257
1258         /* Re-enable IRQs on the port */
1259         if (ZS_IS_OPEN(uap))
1260                 pmz_interrupt_control(uap, 1);
1261
1262         uart_port_unlock_irqrestore(port, flags);
1263 }
1264
1265 static const char *pmz_type(struct uart_port *port)
1266 {
1267         struct uart_pmac_port *uap = to_pmz(port);
1268
1269         if (ZS_IS_IRDA(uap))
1270                 return "Z85c30 ESCC - Infrared port";
1271         else if (ZS_IS_INTMODEM(uap))
1272                 return "Z85c30 ESCC - Internal modem";
1273         return "Z85c30 ESCC - Serial port";
1274 }
1275
1276 /* We do not request/release mappings of the registers here, this
1277  * happens at early serial probe time.
1278  */
1279 static void pmz_release_port(struct uart_port *port)
1280 {
1281 }
1282
1283 static int pmz_request_port(struct uart_port *port)
1284 {
1285         return 0;
1286 }
1287
1288 /* These do not need to do anything interesting either.  */
1289 static void pmz_config_port(struct uart_port *port, int flags)
1290 {
1291 }
1292
1293 /* We do not support letting the user mess with the divisor, IRQ, etc. */
1294 static int pmz_verify_port(struct uart_port *port, struct serial_struct *ser)
1295 {
1296         return -EINVAL;
1297 }
1298
1299 #ifdef CONFIG_CONSOLE_POLL
1300
1301 static int pmz_poll_get_char(struct uart_port *port)
1302 {
1303         struct uart_pmac_port *uap =
1304                 container_of(port, struct uart_pmac_port, port);
1305         int tries = 2;
1306
1307         while (tries) {
1308                 if ((read_zsreg(uap, R0) & Rx_CH_AV) != 0)
1309                         return read_zsdata(uap);
1310                 if (tries--)
1311                         udelay(5);
1312         }
1313
1314         return NO_POLL_CHAR;
1315 }
1316
1317 static void pmz_poll_put_char(struct uart_port *port, unsigned char c)
1318 {
1319         struct uart_pmac_port *uap =
1320                 container_of(port, struct uart_pmac_port, port);
1321
1322         /* Wait for the transmit buffer to empty. */
1323         while ((read_zsreg(uap, R0) & Tx_BUF_EMP) == 0)
1324                 udelay(5);
1325         write_zsdata(uap, c);
1326 }
1327
1328 #endif /* CONFIG_CONSOLE_POLL */
1329
1330 static const struct uart_ops pmz_pops = {
1331         .tx_empty       =       pmz_tx_empty,
1332         .set_mctrl      =       pmz_set_mctrl,
1333         .get_mctrl      =       pmz_get_mctrl,
1334         .stop_tx        =       pmz_stop_tx,
1335         .start_tx       =       pmz_start_tx,
1336         .stop_rx        =       pmz_stop_rx,
1337         .enable_ms      =       pmz_enable_ms,
1338         .break_ctl      =       pmz_break_ctl,
1339         .startup        =       pmz_startup,
1340         .shutdown       =       pmz_shutdown,
1341         .set_termios    =       pmz_set_termios,
1342         .type           =       pmz_type,
1343         .release_port   =       pmz_release_port,
1344         .request_port   =       pmz_request_port,
1345         .config_port    =       pmz_config_port,
1346         .verify_port    =       pmz_verify_port,
1347 #ifdef CONFIG_CONSOLE_POLL
1348         .poll_get_char  =       pmz_poll_get_char,
1349         .poll_put_char  =       pmz_poll_put_char,
1350 #endif
1351 };
1352
1353 #ifdef CONFIG_PPC_PMAC
1354
1355 /*
1356  * Setup one port structure after probing, HW is down at this point,
1357  * Unlike sunzilog, we don't need to pre-init the spinlock as we don't
1358  * register our console before uart_add_one_port() is called
1359  */
1360 static int __init pmz_init_port(struct uart_pmac_port *uap)
1361 {
1362         struct device_node *np = uap->node;
1363         const char *conn;
1364         const struct slot_names_prop {
1365                 int     count;
1366                 char    name[1];
1367         } *slots;
1368         int len;
1369         struct resource r_ports;
1370
1371         /*
1372          * Request & map chip registers
1373          */
1374         if (of_address_to_resource(np, 0, &r_ports))
1375                 return -ENODEV;
1376         uap->port.mapbase = r_ports.start;
1377         uap->port.membase = ioremap(uap->port.mapbase, 0x1000);
1378
1379         uap->control_reg = uap->port.membase;
1380         uap->data_reg = uap->control_reg + 0x10;
1381
1382         /*
1383          * Detect port type
1384          */
1385         if (of_device_is_compatible(np, "cobalt"))
1386                 uap->flags |= PMACZILOG_FLAG_IS_INTMODEM;
1387         conn = of_get_property(np, "AAPL,connector", &len);
1388         if (conn && (strcmp(conn, "infrared") == 0))
1389                 uap->flags |= PMACZILOG_FLAG_IS_IRDA;
1390         uap->port_type = PMAC_SCC_ASYNC;
1391         /* 1999 Powerbook G3 has slot-names property instead */
1392         slots = of_get_property(np, "slot-names", &len);
1393         if (slots && slots->count > 0) {
1394                 if (strcmp(slots->name, "IrDA") == 0)
1395                         uap->flags |= PMACZILOG_FLAG_IS_IRDA;
1396                 else if (strcmp(slots->name, "Modem") == 0)
1397                         uap->flags |= PMACZILOG_FLAG_IS_INTMODEM;
1398         }
1399         if (ZS_IS_IRDA(uap))
1400                 uap->port_type = PMAC_SCC_IRDA;
1401         if (ZS_IS_INTMODEM(uap)) {
1402                 struct device_node* i2c_modem =
1403                         of_find_node_by_name(NULL, "i2c-modem");
1404                 if (i2c_modem) {
1405                         const char* mid =
1406                                 of_get_property(i2c_modem, "modem-id", NULL);
1407                         if (mid) switch(*mid) {
1408                         case 0x04 :
1409                         case 0x05 :
1410                         case 0x07 :
1411                         case 0x08 :
1412                         case 0x0b :
1413                         case 0x0c :
1414                                 uap->port_type = PMAC_SCC_I2S1;
1415                         }
1416                         printk(KERN_INFO "pmac_zilog: i2c-modem detected, id: %d\n",
1417                                 mid ? (*mid) : 0);
1418                         of_node_put(i2c_modem);
1419                 } else {
1420                         printk(KERN_INFO "pmac_zilog: serial modem detected\n");
1421                 }
1422         }
1423
1424         /*
1425          * Init remaining bits of "port" structure
1426          */
1427         uap->port.iotype = UPIO_MEM;
1428         uap->port.irq = irq_of_parse_and_map(np, 0);
1429         uap->port.uartclk = ZS_CLOCK;
1430         uap->port.fifosize = 1;
1431         uap->port.ops = &pmz_pops;
1432         uap->port.type = PORT_PMAC_ZILOG;
1433         uap->port.flags = 0;
1434
1435         /*
1436          * Fixup for the port on Gatwick for which the device-tree has
1437          * missing interrupts. Normally, the macio_dev would contain
1438          * fixed up interrupt info, but we use the device-tree directly
1439          * here due to early probing so we need the fixup too.
1440          */
1441         if (uap->port.irq == 0 &&
1442             np->parent && np->parent->parent &&
1443             of_device_is_compatible(np->parent->parent, "gatwick")) {
1444                 /* IRQs on gatwick are offset by 64 */
1445                 uap->port.irq = irq_create_mapping(NULL, 64 + 15);
1446         }
1447
1448         /* Setup some valid baud rate information in the register
1449          * shadows so we don't write crap there before baud rate is
1450          * first initialized.
1451          */
1452         pmz_convert_to_zs(uap, CS8, 0, 9600);
1453
1454         return 0;
1455 }
1456
1457 /*
1458  * Get rid of a port on module removal
1459  */
1460 static void pmz_dispose_port(struct uart_pmac_port *uap)
1461 {
1462         struct device_node *np;
1463
1464         np = uap->node;
1465         iounmap(uap->control_reg);
1466         uap->node = NULL;
1467         of_node_put(np);
1468         memset(uap, 0, sizeof(struct uart_pmac_port));
1469 }
1470
1471 /*
1472  * Called upon match with an escc node in the device-tree.
1473  */
1474 static int pmz_attach(struct macio_dev *mdev, const struct of_device_id *match)
1475 {
1476         struct uart_pmac_port *uap;
1477         int i;
1478         
1479         /* Iterate the pmz_ports array to find a matching entry
1480          */
1481         for (i = 0; i < MAX_ZS_PORTS; i++)
1482                 if (pmz_ports[i].node == mdev->ofdev.dev.of_node)
1483                         break;
1484         if (i >= MAX_ZS_PORTS)
1485                 return -ENODEV;
1486
1487
1488         uap = &pmz_ports[i];
1489         uap->dev = mdev;
1490         uap->port.dev = &mdev->ofdev.dev;
1491         dev_set_drvdata(&mdev->ofdev.dev, uap);
1492
1493         /* We still activate the port even when failing to request resources
1494          * to work around bugs in ancient Apple device-trees
1495          */
1496         if (macio_request_resources(uap->dev, "pmac_zilog"))
1497                 printk(KERN_WARNING "%pOFn: Failed to request resource"
1498                        ", port still active\n",
1499                        uap->node);
1500         else
1501                 uap->flags |= PMACZILOG_FLAG_RSRC_REQUESTED;
1502
1503         return uart_add_one_port(&pmz_uart_reg, &uap->port);
1504 }
1505
1506 /*
1507  * That one should not be called, macio isn't really a hotswap device,
1508  * we don't expect one of those serial ports to go away...
1509  */
1510 static void pmz_detach(struct macio_dev *mdev)
1511 {
1512         struct uart_pmac_port   *uap = dev_get_drvdata(&mdev->ofdev.dev);
1513         
1514         if (!uap)
1515                 return;
1516
1517         uart_remove_one_port(&pmz_uart_reg, &uap->port);
1518
1519         if (uap->flags & PMACZILOG_FLAG_RSRC_REQUESTED) {
1520                 macio_release_resources(uap->dev);
1521                 uap->flags &= ~PMACZILOG_FLAG_RSRC_REQUESTED;
1522         }
1523         dev_set_drvdata(&mdev->ofdev.dev, NULL);
1524         uap->dev = NULL;
1525         uap->port.dev = NULL;
1526 }
1527
1528 static int pmz_suspend(struct macio_dev *mdev, pm_message_t pm_state)
1529 {
1530         struct uart_pmac_port *uap = dev_get_drvdata(&mdev->ofdev.dev);
1531
1532         if (uap == NULL) {
1533                 printk("HRM... pmz_suspend with NULL uap\n");
1534                 return 0;
1535         }
1536
1537         uart_suspend_port(&pmz_uart_reg, &uap->port);
1538
1539         return 0;
1540 }
1541
1542
1543 static int pmz_resume(struct macio_dev *mdev)
1544 {
1545         struct uart_pmac_port *uap = dev_get_drvdata(&mdev->ofdev.dev);
1546
1547         if (uap == NULL)
1548                 return 0;
1549
1550         uart_resume_port(&pmz_uart_reg, &uap->port);
1551
1552         return 0;
1553 }
1554
1555 /*
1556  * Probe all ports in the system and build the ports array, we register
1557  * with the serial layer later, so we get a proper struct device which
1558  * allows the tty to attach properly. This is later than it used to be
1559  * but the tty layer really wants it that way.
1560  */
1561 static int __init pmz_probe(void)
1562 {
1563         struct device_node      *node_p, *node_a, *node_b, *np;
1564         int                     count = 0;
1565         int                     rc;
1566
1567         /*
1568          * Find all escc chips in the system
1569          */
1570         for_each_node_by_name(node_p, "escc") {
1571                 /*
1572                  * First get channel A/B node pointers
1573                  * 
1574                  * TODO: Add routines with proper locking to do that...
1575                  */
1576                 node_a = node_b = NULL;
1577                 for_each_child_of_node(node_p, np) {
1578                         if (of_node_name_prefix(np, "ch-a"))
1579                                 node_a = of_node_get(np);
1580                         else if (of_node_name_prefix(np, "ch-b"))
1581                                 node_b = of_node_get(np);
1582                 }
1583                 if (!node_a && !node_b) {
1584                         of_node_put(node_a);
1585                         of_node_put(node_b);
1586                         printk(KERN_ERR "pmac_zilog: missing node %c for escc %pOF\n",
1587                                 (!node_a) ? 'a' : 'b', node_p);
1588                         continue;
1589                 }
1590
1591                 /*
1592                  * Fill basic fields in the port structures
1593                  */
1594                 if (node_b != NULL) {
1595                         pmz_ports[count].mate           = &pmz_ports[count+1];
1596                         pmz_ports[count+1].mate         = &pmz_ports[count];
1597                 }
1598                 pmz_ports[count].flags          = PMACZILOG_FLAG_IS_CHANNEL_A;
1599                 pmz_ports[count].node           = node_a;
1600                 pmz_ports[count+1].node         = node_b;
1601                 pmz_ports[count].port.line      = count;
1602                 pmz_ports[count+1].port.line    = count+1;
1603
1604                 /*
1605                  * Setup the ports for real
1606                  */
1607                 rc = pmz_init_port(&pmz_ports[count]);
1608                 if (rc == 0 && node_b != NULL)
1609                         rc = pmz_init_port(&pmz_ports[count+1]);
1610                 if (rc != 0) {
1611                         of_node_put(node_a);
1612                         of_node_put(node_b);
1613                         memset(&pmz_ports[count], 0, sizeof(struct uart_pmac_port));
1614                         memset(&pmz_ports[count+1], 0, sizeof(struct uart_pmac_port));
1615                         continue;
1616                 }
1617                 count += 2;
1618         }
1619         pmz_ports_count = count;
1620
1621         return 0;
1622 }
1623
1624 #else
1625
1626 /* On PCI PowerMacs, pmz_probe() does an explicit search of the OpenFirmware
1627  * tree to obtain the device_nodes needed to start the console before the
1628  * macio driver. On Macs without OpenFirmware, global platform_devices take
1629  * the place of those device_nodes.
1630  */
1631 extern struct platform_device scc_a_pdev, scc_b_pdev;
1632
1633 static int __init pmz_init_port(struct uart_pmac_port *uap)
1634 {
1635         struct resource *r_ports;
1636         int irq;
1637
1638         r_ports = platform_get_resource(uap->pdev, IORESOURCE_MEM, 0);
1639         if (!r_ports)
1640                 return -ENODEV;
1641
1642         irq = platform_get_irq(uap->pdev, 0);
1643         if (irq < 0)
1644                 return irq;
1645
1646         uap->port.mapbase  = r_ports->start;
1647         uap->port.membase  = (unsigned char __iomem *) r_ports->start;
1648         uap->port.iotype   = UPIO_MEM;
1649         uap->port.irq      = irq;
1650         uap->port.uartclk  = ZS_CLOCK;
1651         uap->port.fifosize = 1;
1652         uap->port.ops      = &pmz_pops;
1653         uap->port.type     = PORT_PMAC_ZILOG;
1654         uap->port.flags    = 0;
1655
1656         uap->control_reg   = uap->port.membase;
1657         uap->data_reg      = uap->control_reg + 4;
1658         uap->port_type     = 0;
1659         uap->port.has_sysrq = IS_ENABLED(CONFIG_SERIAL_PMACZILOG_CONSOLE);
1660
1661         pmz_convert_to_zs(uap, CS8, 0, 9600);
1662
1663         return 0;
1664 }
1665
1666 static int __init pmz_probe(void)
1667 {
1668         int err;
1669
1670         pmz_ports_count = 0;
1671
1672         pmz_ports[0].port.line = 0;
1673         pmz_ports[0].flags     = PMACZILOG_FLAG_IS_CHANNEL_A;
1674         pmz_ports[0].pdev      = &scc_a_pdev;
1675         err = pmz_init_port(&pmz_ports[0]);
1676         if (err)
1677                 return err;
1678         pmz_ports_count++;
1679
1680         pmz_ports[0].mate      = &pmz_ports[1];
1681         pmz_ports[1].mate      = &pmz_ports[0];
1682         pmz_ports[1].port.line = 1;
1683         pmz_ports[1].flags     = 0;
1684         pmz_ports[1].pdev      = &scc_b_pdev;
1685         err = pmz_init_port(&pmz_ports[1]);
1686         if (err)
1687                 return err;
1688         pmz_ports_count++;
1689
1690         return 0;
1691 }
1692
1693 static void pmz_dispose_port(struct uart_pmac_port *uap)
1694 {
1695         memset(uap, 0, sizeof(struct uart_pmac_port));
1696 }
1697
1698 static int __init pmz_attach(struct platform_device *pdev)
1699 {
1700         struct uart_pmac_port *uap;
1701         int i;
1702
1703         /* Iterate the pmz_ports array to find a matching entry */
1704         for (i = 0; i < pmz_ports_count; i++)
1705                 if (pmz_ports[i].pdev == pdev)
1706                         break;
1707         if (i >= pmz_ports_count)
1708                 return -ENODEV;
1709
1710         uap = &pmz_ports[i];
1711         uap->port.dev = &pdev->dev;
1712         platform_set_drvdata(pdev, uap);
1713
1714         return uart_add_one_port(&pmz_uart_reg, &uap->port);
1715 }
1716
1717 static int __exit pmz_detach(struct platform_device *pdev)
1718 {
1719         struct uart_pmac_port *uap = platform_get_drvdata(pdev);
1720
1721         if (!uap)
1722                 return -ENODEV;
1723
1724         uart_remove_one_port(&pmz_uart_reg, &uap->port);
1725
1726         uap->port.dev = NULL;
1727
1728         return 0;
1729 }
1730
1731 #endif /* !CONFIG_PPC_PMAC */
1732
1733 #ifdef CONFIG_SERIAL_PMACZILOG_CONSOLE
1734
1735 static void pmz_console_write(struct console *con, const char *s, unsigned int count);
1736 static int __init pmz_console_setup(struct console *co, char *options);
1737
1738 static struct console pmz_console = {
1739         .name   =       PMACZILOG_NAME,
1740         .write  =       pmz_console_write,
1741         .device =       uart_console_device,
1742         .setup  =       pmz_console_setup,
1743         .flags  =       CON_PRINTBUFFER,
1744         .index  =       -1,
1745         .data   =       &pmz_uart_reg,
1746 };
1747
1748 #define PMACZILOG_CONSOLE       &pmz_console
1749 #else /* CONFIG_SERIAL_PMACZILOG_CONSOLE */
1750 #define PMACZILOG_CONSOLE       (NULL)
1751 #endif /* CONFIG_SERIAL_PMACZILOG_CONSOLE */
1752
1753 /*
1754  * Register the driver, console driver and ports with the serial
1755  * core
1756  */
1757 static int __init pmz_register(void)
1758 {
1759         pmz_uart_reg.nr = pmz_ports_count;
1760         pmz_uart_reg.cons = PMACZILOG_CONSOLE;
1761
1762         /*
1763          * Register this driver with the serial core
1764          */
1765         return uart_register_driver(&pmz_uart_reg);
1766 }
1767
1768 #ifdef CONFIG_PPC_PMAC
1769
1770 static const struct of_device_id pmz_match[] =
1771 {
1772         {
1773         .name           = "ch-a",
1774         },
1775         {
1776         .name           = "ch-b",
1777         },
1778         {},
1779 };
1780 MODULE_DEVICE_TABLE (of, pmz_match);
1781
1782 static struct macio_driver pmz_driver = {
1783         .driver = {
1784                 .name           = "pmac_zilog",
1785                 .owner          = THIS_MODULE,
1786                 .of_match_table = pmz_match,
1787         },
1788         .probe          = pmz_attach,
1789         .remove         = pmz_detach,
1790         .suspend        = pmz_suspend,
1791         .resume         = pmz_resume,
1792 };
1793
1794 #else
1795
1796 static struct platform_driver pmz_driver = {
1797         .remove         = __exit_p(pmz_detach),
1798         .driver         = {
1799                 .name           = "scc",
1800         },
1801 };
1802
1803 #endif /* !CONFIG_PPC_PMAC */
1804
1805 static int __init init_pmz(void)
1806 {
1807         int rc, i;
1808
1809         /* 
1810          * First, we need to do a direct OF-based probe pass. We
1811          * do that because we want serial console up before the
1812          * macio stuffs calls us back, and since that makes it
1813          * easier to pass the proper number of channels to
1814          * uart_register_driver()
1815          */
1816         if (pmz_ports_count == 0)
1817                 pmz_probe();
1818
1819         /*
1820          * Bail early if no port found
1821          */
1822         if (pmz_ports_count == 0)
1823                 return -ENODEV;
1824
1825         /*
1826          * Now we register with the serial layer
1827          */
1828         rc = pmz_register();
1829         if (rc) {
1830                 printk(KERN_ERR 
1831                         "pmac_zilog: Error registering serial device, disabling pmac_zilog.\n"
1832                         "pmac_zilog: Did another serial driver already claim the minors?\n"); 
1833                 /* effectively "pmz_unprobe()" */
1834                 for (i=0; i < pmz_ports_count; i++)
1835                         pmz_dispose_port(&pmz_ports[i]);
1836                 return rc;
1837         }
1838
1839         /*
1840          * Then we register the macio driver itself
1841          */
1842 #ifdef CONFIG_PPC_PMAC
1843         return macio_register_driver(&pmz_driver);
1844 #else
1845         return platform_driver_probe(&pmz_driver, pmz_attach);
1846 #endif
1847 }
1848
1849 static void __exit exit_pmz(void)
1850 {
1851         int i;
1852
1853 #ifdef CONFIG_PPC_PMAC
1854         /* Get rid of macio-driver (detach from macio) */
1855         macio_unregister_driver(&pmz_driver);
1856 #else
1857         platform_driver_unregister(&pmz_driver);
1858 #endif
1859
1860         for (i = 0; i < pmz_ports_count; i++) {
1861                 struct uart_pmac_port *uport = &pmz_ports[i];
1862 #ifdef CONFIG_PPC_PMAC
1863                 if (uport->node != NULL)
1864                         pmz_dispose_port(uport);
1865 #else
1866                 if (uport->pdev != NULL)
1867                         pmz_dispose_port(uport);
1868 #endif
1869         }
1870         /* Unregister UART driver */
1871         uart_unregister_driver(&pmz_uart_reg);
1872 }
1873
1874 #ifdef CONFIG_SERIAL_PMACZILOG_CONSOLE
1875
1876 static void pmz_console_putchar(struct uart_port *port, unsigned char ch)
1877 {
1878         struct uart_pmac_port *uap =
1879                 container_of(port, struct uart_pmac_port, port);
1880
1881         /* Wait for the transmit buffer to empty. */
1882         while ((read_zsreg(uap, R0) & Tx_BUF_EMP) == 0)
1883                 udelay(5);
1884         write_zsdata(uap, ch);
1885 }
1886
1887 /*
1888  * Print a string to the serial port trying not to disturb
1889  * any possible real use of the port...
1890  */
1891 static void pmz_console_write(struct console *con, const char *s, unsigned int count)
1892 {
1893         struct uart_pmac_port *uap = &pmz_ports[con->index];
1894         unsigned long flags;
1895
1896         uart_port_lock_irqsave(&uap->port, &flags);
1897
1898         /* Turn of interrupts and enable the transmitter. */
1899         write_zsreg(uap, R1, uap->curregs[1] & ~TxINT_ENAB);
1900         write_zsreg(uap, R5, uap->curregs[5] | TxENABLE | RTS | DTR);
1901
1902         uart_console_write(&uap->port, s, count, pmz_console_putchar);
1903
1904         /* Restore the values in the registers. */
1905         write_zsreg(uap, R1, uap->curregs[1]);
1906         /* Don't disable the transmitter. */
1907
1908         uart_port_unlock_irqrestore(&uap->port, flags);
1909 }
1910
1911 /*
1912  * Setup the serial console
1913  */
1914 static int __init pmz_console_setup(struct console *co, char *options)
1915 {
1916         struct uart_pmac_port *uap;
1917         struct uart_port *port;
1918         int baud = 38400;
1919         int bits = 8;
1920         int parity = 'n';
1921         int flow = 'n';
1922         unsigned long pwr_delay;
1923
1924         /*
1925          * XServe's default to 57600 bps
1926          */
1927         if (of_machine_is_compatible("RackMac1,1")
1928             || of_machine_is_compatible("RackMac1,2")
1929             || of_machine_is_compatible("MacRISC4"))
1930                 baud = 57600;
1931
1932         /*
1933          * Check whether an invalid uart number has been specified, and
1934          * if so, search for the first available port that does have
1935          * console support.
1936          */
1937         if (co->index >= pmz_ports_count)
1938                 co->index = 0;
1939         uap = &pmz_ports[co->index];
1940 #ifdef CONFIG_PPC_PMAC
1941         if (uap->node == NULL)
1942                 return -ENODEV;
1943 #else
1944         if (uap->pdev == NULL)
1945                 return -ENODEV;
1946 #endif
1947         port = &uap->port;
1948
1949         /*
1950          * Mark port as beeing a console
1951          */
1952         uap->flags |= PMACZILOG_FLAG_IS_CONS;
1953
1954         /*
1955          * Temporary fix for uart layer who didn't setup the spinlock yet
1956          */
1957         spin_lock_init(&port->lock);
1958
1959         /*
1960          * Enable the hardware
1961          */
1962         pwr_delay = __pmz_startup(uap);
1963         if (pwr_delay)
1964                 mdelay(pwr_delay);
1965         
1966         if (options)
1967                 uart_parse_options(options, &baud, &parity, &bits, &flow);
1968
1969         return uart_set_options(port, co, baud, parity, bits, flow);
1970 }
1971
1972 static int __init pmz_console_init(void)
1973 {
1974         /* Probe ports */
1975         pmz_probe();
1976
1977         if (pmz_ports_count == 0)
1978                 return -ENODEV;
1979
1980         /* TODO: Autoprobe console based on OF */
1981         /* pmz_console.index = i; */
1982         register_console(&pmz_console);
1983
1984         return 0;
1985
1986 }
1987 console_initcall(pmz_console_init);
1988 #endif /* CONFIG_SERIAL_PMACZILOG_CONSOLE */
1989
1990 module_init(init_pmz);
1991 module_exit(exit_pmz);