linux-old/drivers/sbus/char/zs.c
<<
>>
Prefs
   1/* $Id: zs.c,v 1.68.2.2 2002/01/12 07:04:33 davem Exp $
   2 * zs.c: Zilog serial port driver for the Sparc.
   3 *
   4 * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
   5 * Copyright (C) 1996 Eddie C. Dost   (ecd@skynet.be)
   6 * Fixes by Pete A. Zaitcev <zaitcev@yahoo.com>.
   7 *
   8 * Fixed to use tty_get_baud_rate().
   9 *   Theodore Ts'o <tytso@mit.edu>, 2001-Oct-12
  10 *
  11 * /proc/tty/driver/serial now exists and is readable.
  12 *   Alex Buell <alex.buell@tahallah.demon.co.uk>, 2001-12-23
  13 *
  14 */
  15
  16#include <linux/errno.h>
  17#include <linux/signal.h>
  18#include <linux/sched.h>
  19#include <linux/timer.h>
  20#include <linux/interrupt.h>
  21#include <linux/tty.h>
  22#include <linux/tty_flip.h>
  23#include <linux/config.h>
  24#include <linux/major.h>
  25#include <linux/string.h>
  26#include <linux/fcntl.h>
  27#include <linux/mm.h>
  28#include <linux/kernel.h>
  29#include <linux/keyboard.h>
  30#include <linux/console.h>
  31#include <linux/delay.h>
  32#include <linux/init.h>
  33#include <linux/bootmem.h>
  34#include <linux/sysrq.h>
  35
  36#include <asm/io.h>
  37#include <asm/irq.h>
  38#include <asm/oplib.h>
  39#include <asm/system.h>
  40#include <asm/uaccess.h>
  41#include <asm/bitops.h>
  42#include <asm/kdebug.h>
  43#include <asm/page.h>
  44#include <asm/pgtable.h>
  45
  46#include <asm/sbus.h>
  47#ifdef __sparc_v9__
  48#include <asm/fhc.h>
  49#endif
  50#ifdef CONFIG_PCI
  51#include <linux/pci.h>
  52#endif
  53
  54#include "sunserial.h"
  55#include "zs.h"
  56#include "sunkbd.h"
  57#include "sunmouse.h"
  58
  59static int num_serial = 2; /* sun4/sun4c/sun4m - Two chips on board. */
  60#define NUM_SERIAL num_serial
  61#define NUM_CHANNELS (NUM_SERIAL * 2)
  62
  63#define KEYBOARD_LINE 0x2
  64#define MOUSE_LINE    0x3
  65
  66/* On 32-bit sparcs we need to delay after register accesses
  67 * to accomodate sun4 systems, but we do not need to flush writes.
  68 * On 64-bit and sun4d we need to flush single writes to ensure
  69 * completion.
  70 */
  71#ifndef __sparc_v9__
  72#define ZSDELAY()               udelay(5)
  73#define ZSDELAY_LONG()          udelay(20)
  74#else
  75#define ZSDELAY()
  76#define ZSDELAY_LONG()
  77#endif
  78
  79#define ZS_WSYNC(__channel) \
  80        sbus_readb(&((__channel)->control))
  81
  82struct sun_zslayout **zs_chips;
  83struct sun_zschannel **zs_channels;
  84struct sun_zschannel *zs_mousechan;
  85struct sun_zschannel *zs_kbdchan;
  86struct sun_zschannel *zs_kgdbchan;
  87int *zs_nodes;
  88
  89struct sun_serial *zs_soft;
  90struct sun_serial *zs_chain;  /* IRQ servicing chain */
  91int zilog_irq;
  92
  93struct tty_struct *zs_ttys;
  94
  95/* Console hooks... */
  96#ifdef CONFIG_SERIAL_CONSOLE
  97static struct console zs_console;
  98static int zs_console_init(void);
  99
 100/*
 101 * Define this to get the zs_fair_output() functionality.
 102 */
 103#undef SERIAL_CONSOLE_FAIR_OUTPUT
 104#endif /* CONFIG_SERIAL_CONSOLE */
 105
 106static unsigned char kgdb_regs[16] = {
 107        0, 0, 0,                     /* write 0, 1, 2 */
 108        (Rx8 | RxENAB),              /* write 3 */
 109        (X16CLK | SB1 | PAR_EVEN),   /* write 4 */
 110        (DTR | Tx8 | TxENAB),        /* write 5 */
 111        0, 0, 0,                     /* write 6, 7, 8 */
 112        (NV),                        /* write 9 */
 113        (NRZ),                       /* write 10 */
 114        (TCBR | RCBR),               /* write 11 */
 115        0, 0,                        /* BRG time constant, write 12 + 13 */
 116        (BRSRC | BRENAB),            /* write 14 */
 117        (DCDIE)                      /* write 15 */
 118};
 119
 120static unsigned char zscons_regs[16] = {
 121        0,                           /* write 0 */
 122        (EXT_INT_ENAB | INT_ALL_Rx), /* write 1 */
 123        0,                           /* write 2 */
 124        (Rx8 | RxENAB),              /* write 3 */
 125        (X16CLK),                    /* write 4 */
 126        (DTR | Tx8 | TxENAB),        /* write 5 */
 127        0, 0, 0,                     /* write 6, 7, 8 */
 128        (NV | MIE),                  /* write 9 */
 129        (NRZ),                       /* write 10 */
 130        (TCBR | RCBR),               /* write 11 */
 131        0, 0,                        /* BRG time constant, write 12 + 13 */
 132        (BRSRC | BRENAB),            /* write 14 */
 133        (DCDIE | CTSIE | TxUIE | BRKIE) /* write 15 */
 134};
 135
 136#define ZS_CLOCK         4915200   /* Zilog input clock rate */
 137
 138DECLARE_TASK_QUEUE(tq_serial);
 139
 140static struct tty_driver serial_driver, callout_driver;
 141static int serial_refcount;
 142
 143/* serial subtype definitions */
 144#define SERIAL_TYPE_NORMAL      1
 145#define SERIAL_TYPE_CALLOUT     2
 146  
 147/* number of characters left in xmit buffer before we ask for more */
 148#define WAKEUP_CHARS 256
 149
 150#define SERIAL_DO_RESTART
 151
 152/* Debugging... DEBUG_INTR is bad to use when one of the zs
 153 * lines is your console ;(
 154 */
 155#undef SERIAL_DEBUG_INTR
 156#undef SERIAL_DEBUG_OPEN
 157#undef SERIAL_DEBUG_FLOW
 158
 159#define RS_STROBE_TIME 10
 160#define RS_ISR_PASS_LIMIT 256
 161
 162#define _INLINE_ inline
 163
 164int zs_init(void);
 165static void zs_kgdb_hook(int);
 166
 167static void change_speed(struct sun_serial *info);
 168
 169static struct tty_struct **serial_table;
 170static struct termios **serial_termios;
 171static struct termios **serial_termios_locked;
 172
 173#ifndef MIN
 174#define MIN(a,b)        ((a) < (b) ? (a) : (b))
 175#endif
 176
 177#undef ZS_LOG
 178#ifdef ZS_LOG
 179struct zs_logent {
 180        u8 reg, val;
 181        u8 write, __pad;
 182#define REGIRQ  0xff
 183#define REGDATA 0xfe
 184#define REGCTRL 0xfd
 185};
 186struct zs_logent zslog[32];
 187int zs_curlog;
 188#define ZSLOG(__reg, __val, __write) \
 189do{     int index = zs_curlog; \
 190        zslog[index].reg = (__reg); \
 191        zslog[index].val = (__val); \
 192        zslog[index].write = (__write); \
 193        zs_curlog = (index + 1) & (32 - 1); \
 194}while(0)
 195int zs_dumplog(char *buffer)
 196{
 197        int len = 0;
 198        int i;
 199
 200        for (i = 0; i < 32; i++) {
 201                u8 reg, val, write;
 202
 203                reg = zslog[i].reg;
 204                val = zslog[i].val;
 205                write = zslog[i].write;
 206                len += sprintf(buffer + len,
 207                               "ZSLOG[%2d]: reg %2x val %2x %s\n",
 208                               i, reg, val, write ? "write" : "read");
 209        }
 210        len += sprintf(buffer + len, "ZS current log index %d\n",
 211                       zs_curlog);
 212        return len;
 213}
 214#else
 215#define ZSLOG(x,y,z)    do { } while (0)
 216#endif
 217
 218/*
 219 * tmp_buf is used as a temporary buffer by serial_write.  We need to
 220 * lock it in case the memcpy_fromfs blocks while swapping in a page,
 221 * and some other program tries to do a serial write at the same time.
 222 * Since the lock will only come under contention when the system is
 223 * swapping and available memory is low, it makes sense to share one
 224 * buffer across all the serial ports, since it significantly saves
 225 * memory if large numbers of serial ports are open.
 226 */
 227static unsigned char *tmp_buf = 0;
 228static DECLARE_MUTEX(tmp_buf_sem);
 229
 230static inline int serial_paranoia_check(struct sun_serial *info,
 231                                        dev_t device, const char *routine)
 232{
 233#ifdef SERIAL_PARANOIA_CHECK
 234        static const char *badmagic =
 235                "Warning: bad magic number for serial struct (%d, %d) in %s\n";
 236        static const char *badinfo =
 237                "Warning: null sun_serial for (%d, %d) in %s\n";
 238
 239        if (!info) {
 240                printk(badinfo, MAJOR(device), MINOR(device), routine);
 241                return 1;
 242        }
 243        if (info->magic != SERIAL_MAGIC) {
 244                printk(badmagic, MAJOR(device), MINOR(device), routine);
 245                return 1;
 246        }
 247#endif
 248        return 0;
 249}
 250
 251/* Reading and writing Zilog8530 registers.  The delays are to make this
 252 * driver work on the Sun4 which needs a settling delay after each chip
 253 * register access, other machines handle this in hardware via auxiliary
 254 * flip-flops which implement the settle time we do in software.
 255 */
 256static unsigned char read_zsreg(struct sun_zschannel *channel,
 257                                unsigned char reg)
 258{
 259        unsigned char retval;
 260
 261        sbus_writeb(reg, &channel->control);
 262        ZSDELAY();
 263        retval = sbus_readb(&channel->control);
 264        ZSDELAY();
 265        ZSLOG(reg, retval, 0);
 266        return retval;
 267}
 268
 269static void write_zsreg(struct sun_zschannel *channel,
 270                        unsigned char reg, unsigned char value)
 271{
 272        ZSLOG(reg, value, 1);
 273        sbus_writeb(reg, &channel->control);
 274        ZSDELAY();
 275        sbus_writeb(value, &channel->control);
 276        ZSDELAY();
 277}
 278
 279static void load_zsregs(struct sun_serial *info, unsigned char *regs)
 280{
 281        struct sun_zschannel *channel = info->zs_channel;
 282        unsigned long flags;
 283        unsigned char stat;
 284        int i;
 285
 286        for (i = 0; i < 1000; i++) {
 287                stat = read_zsreg(channel, R1);
 288                if (stat & ALL_SNT)
 289                        break;
 290                udelay(100);
 291        }
 292        write_zsreg(channel, R3, 0);
 293        ZS_CLEARSTAT(channel);
 294        ZS_CLEARERR(channel);
 295        ZS_CLEARFIFO(channel);
 296
 297        /* Load 'em up */
 298        save_flags(flags); cli();
 299        if (info->channelA)
 300                write_zsreg(channel, R9, CHRA);
 301        else
 302                write_zsreg(channel, R9, CHRB);
 303        ZSDELAY_LONG();
 304        write_zsreg(channel, R4, regs[R4]);
 305        write_zsreg(channel, R3, regs[R3] & ~RxENAB);
 306        write_zsreg(channel, R5, regs[R5] & ~TxENAB);
 307        write_zsreg(channel, R9, regs[R9] & ~MIE);
 308        write_zsreg(channel, R10, regs[R10]);
 309        write_zsreg(channel, R11, regs[R11]);
 310        write_zsreg(channel, R12, regs[R12]);
 311        write_zsreg(channel, R13, regs[R13]);
 312        write_zsreg(channel, R14, regs[R14] & ~BRENAB);
 313        write_zsreg(channel, R14, regs[R14]);
 314        write_zsreg(channel, R14, (regs[R14] & ~SNRZI) | BRENAB);
 315        write_zsreg(channel, R3, regs[R3]);
 316        write_zsreg(channel, R5, regs[R5]);
 317        write_zsreg(channel, R15, regs[R15]);
 318        write_zsreg(channel, R0, RES_EXT_INT);
 319        write_zsreg(channel, R0, ERR_RES);
 320        write_zsreg(channel, R1, regs[R1]);
 321        write_zsreg(channel, R9, regs[R9]);
 322        restore_flags(flags);
 323}
 324
 325#define ZS_PUT_CHAR_MAX_DELAY   2000    /* 10 ms */
 326
 327static void zs_put_char(struct sun_zschannel *channel, char ch)
 328{
 329        int loops = ZS_PUT_CHAR_MAX_DELAY;
 330
 331        /* Do not change this to use ZSDELAY as this is
 332         * a timed polling loop and on sparc64 ZSDELAY
 333         * is a nop.  -DaveM
 334         */
 335        do {
 336                u8 val = sbus_readb(&channel->control);
 337                ZSLOG(REGCTRL, val, 0);
 338                if (val & Tx_BUF_EMP)
 339                        break;
 340                udelay(5);
 341        } while (--loops);
 342
 343        sbus_writeb(ch, &channel->data);
 344        ZSDELAY();
 345        ZS_WSYNC(channel);
 346        ZSLOG(REGDATA, ch, 1);
 347}
 348
 349/* Sets or clears DTR/RTS on the requested line */
 350static void zs_rtsdtr(struct sun_serial *ss, int set)
 351{
 352        unsigned long flags;
 353
 354        save_flags(flags); cli();
 355        if(set) {
 356                ss->curregs[5] |= (RTS | DTR);
 357                write_zsreg(ss->zs_channel, 5, ss->curregs[5]);
 358        } else {
 359                ss->curregs[5] &= ~(RTS | DTR);
 360                write_zsreg(ss->zs_channel, 5, ss->curregs[5]);
 361        }
 362        restore_flags(flags);
 363        return;
 364}
 365
 366static void kgdb_chaninit(struct sun_serial *ss, int intson, int bps)
 367{
 368        int brg;
 369
 370        if(intson) {
 371                kgdb_regs[R1] = INT_ALL_Rx;
 372                kgdb_regs[R9] |= MIE;
 373        } else {
 374                kgdb_regs[R1] = 0;
 375                kgdb_regs[R9] &= ~MIE;
 376        }
 377        brg = BPS_TO_BRG(bps, ZS_CLOCK/16);
 378        kgdb_regs[R12] = (brg & 255);
 379        kgdb_regs[R13] = ((brg >> 8) & 255);
 380        load_zsregs(ss, kgdb_regs);
 381}
 382
 383/*
 384 * ------------------------------------------------------------
 385 * zs_stop() and zs_start()
 386 *
 387 * This routines are called before setting or resetting tty->stopped.
 388 * They enable or disable transmitter interrupts, as necessary.
 389 * ------------------------------------------------------------
 390 */
 391static void zs_stop(struct tty_struct *tty)
 392{
 393        struct sun_serial *info = (struct sun_serial *) tty->driver_data;
 394        unsigned long flags;
 395
 396        if (serial_paranoia_check(info, tty->device, "zs_stop"))
 397                return;
 398        
 399        save_flags(flags); cli();
 400        if (info->curregs[5] & TxENAB) {
 401                info->curregs[5] &= ~TxENAB;
 402                write_zsreg(info->zs_channel, 5, info->curregs[5]);
 403        }
 404        restore_flags(flags);
 405}
 406
 407static void zs_start(struct tty_struct *tty)
 408{
 409        struct sun_serial *info = (struct sun_serial *) tty->driver_data;
 410        unsigned long flags;
 411        
 412        if (serial_paranoia_check(info, tty->device, "zs_start"))
 413                return;
 414        
 415        save_flags(flags); cli();
 416        if (info->xmit_cnt && info->xmit_buf && !(info->curregs[5] & TxENAB)) {
 417                info->curregs[5] |= TxENAB;
 418                write_zsreg(info->zs_channel, 5, info->curregs[5]);
 419        }
 420        restore_flags(flags);
 421}
 422
 423/* Drop into either the boot monitor or kadb upon receiving a break
 424 * from keyboard/console input.
 425 */
 426void batten_down_hatches(void)
 427{
 428        if (!stop_a_enabled)
 429                return;
 430        /* If we are doing kadb, we call the debugger
 431         * else we just drop into the boot monitor.
 432         * Note that we must flush the user windows
 433         * first before giving up control.
 434         */
 435        printk("\n");
 436        flush_user_windows();
 437#ifndef __sparc_v9__
 438        if((((unsigned long)linux_dbvec)>=DEBUG_FIRSTVADDR) &&
 439           (((unsigned long)linux_dbvec)<=DEBUG_LASTVADDR))
 440                sp_enter_debugger();
 441        else
 442#endif
 443                prom_cmdline();
 444
 445        /* XXX We want to notify the keyboard driver that all
 446         * XXX keys are in the up state or else weird things
 447         * XXX happen...
 448         */
 449
 450        return;
 451}
 452
 453
 454/*
 455 * ----------------------------------------------------------------------
 456 *
 457 * Here starts the interrupt handling routines.  All of the following
 458 * subroutines are declared as inline and are folded into
 459 * zs_interrupt().  They were separated out for readability's sake.
 460 *
 461 * Note: zs_interrupt() is a "fast" interrupt, which means that it
 462 * runs with interrupts turned off.  People who may want to modify
 463 * zs_interrupt() should try to keep the interrupt handler as fast as
 464 * possible.  After you are done making modifications, it is not a bad
 465 * idea to do:
 466 * 
 467 * gcc -S -DKERNEL -Wall -Wstrict-prototypes -O6 -fomit-frame-pointer serial.c
 468 *
 469 * and look at the resulting assemble code in serial.s.
 470 *
 471 *                              - Ted Ts'o (tytso@mit.edu), 7-Mar-93
 472 * -----------------------------------------------------------------------
 473 */
 474
 475/*
 476 * This routine is used by the interrupt handler to schedule
 477 * processing in the software interrupt portion of the driver.
 478 */
 479static void zs_sched_event(struct sun_serial *info, int event)
 480{
 481        info->event |= 1 << event;
 482        queue_task(&info->tqueue, &tq_serial);
 483        mark_bh(SERIAL_BH);
 484}
 485
 486#ifndef __sparc_v9__
 487extern void breakpoint(void);  /* For the KGDB frame character */
 488#endif
 489
 490static void receive_chars(struct sun_serial *info, struct pt_regs *regs)
 491{
 492        struct tty_struct *tty = info->tty;
 493        int do_queue_task = 0;
 494
 495        while (1) {
 496                unsigned char ch, r1;
 497
 498                r1 = read_zsreg(info->zs_channel, R1);
 499                if (r1 & (PAR_ERR | Rx_OVR | CRC_ERR)) {
 500                        sbus_writeb(ERR_RES, &info->zs_channel->control);
 501                        ZSDELAY();
 502                        ZS_WSYNC(info->zs_channel);
 503                        ZSLOG(REGCTRL, ERR_RES, 1);
 504                }
 505
 506                ch = sbus_readb(&info->zs_channel->data);
 507                ZSLOG(REGDATA, ch, 0);
 508                ch &= info->parity_mask;
 509                ZSDELAY();
 510
 511                /* If this is the console keyboard, we need to handle
 512                 * L1-A's here.
 513                 */
 514                if (info->cons_keyb) {
 515                        if (ch == SUNKBD_RESET) {
 516                                l1a_state.kbd_id = 1;
 517                                l1a_state.l1_down = 0;
 518                        } else if (l1a_state.kbd_id) {
 519                                l1a_state.kbd_id = 0;
 520                        } else if (ch == SUNKBD_L1) {
 521                                l1a_state.l1_down = 1;
 522                        } else if (ch == (SUNKBD_L1|SUNKBD_UP)) {
 523                                l1a_state.l1_down = 0;
 524                        } else if (ch == SUNKBD_A && l1a_state.l1_down) {
 525                                /* whee... */
 526                                batten_down_hatches();
 527                                /* Continue execution... */
 528                                l1a_state.l1_down = 0;
 529                                l1a_state.kbd_id = 0;
 530                                return;
 531                        }
 532                        sunkbd_inchar(ch, regs);
 533                        goto next_char;
 534                }
 535                if (info->cons_mouse) {
 536                        sun_mouse_inbyte(ch, 0);
 537                        goto next_char;
 538                }
 539                if (info->is_cons) {
 540                        if (ch == 0) {
 541                                /* whee, break received */
 542                                batten_down_hatches();
 543                                /* Continue execution... */
 544                                return;
 545                        }
 546                }
 547#ifndef __sparc_v9__
 548                /* Look for kgdb 'stop' character, consult the gdb
 549                 * documentation for remote target debugging and
 550                 * arch/sparc/kernel/sparc-stub.c to see how all this works.
 551                 */
 552                if (info->kgdb_channel && (ch =='\003')) {
 553                        breakpoint();
 554                        return;
 555                }
 556#endif
 557                if (!tty)
 558                        return;
 559
 560                do_queue_task++;
 561
 562                if (tty->flip.count >= TTY_FLIPBUF_SIZE)
 563                        break;
 564
 565                tty->flip.count++;
 566                if (r1 & PAR_ERR)
 567                        *tty->flip.flag_buf_ptr++ = TTY_PARITY;
 568                else if (r1 & Rx_OVR)
 569                        *tty->flip.flag_buf_ptr++ = TTY_OVERRUN;
 570                else if (r1 & CRC_ERR)
 571                        *tty->flip.flag_buf_ptr++ = TTY_FRAME;
 572                else
 573                        *tty->flip.flag_buf_ptr++ = 0;
 574                *tty->flip.char_buf_ptr++ = ch;
 575
 576        next_char:
 577                {
 578                        unsigned char stat;
 579
 580                        /* Check if we have another character... */
 581                        stat = sbus_readb(&info->zs_channel->control);
 582                        ZSDELAY();
 583                        ZSLOG(REGCTRL, stat, 0);
 584                        if (!(stat & Rx_CH_AV))
 585                                break;
 586                }
 587        }
 588
 589        if (do_queue_task != 0)
 590                queue_task(&tty->flip.tqueue, &tq_timer);
 591}
 592
 593static void transmit_chars(struct sun_serial *info)
 594{
 595        struct tty_struct *tty = info->tty;
 596
 597        if (info->x_char) {
 598                /* Send next char */
 599                zs_put_char(info->zs_channel, info->x_char);
 600                info->x_char = 0;
 601                return;
 602        }
 603
 604        if ((info->xmit_cnt <= 0) || (tty != 0 && tty->stopped)) {
 605                /* That's peculiar... */
 606                sbus_writeb(RES_Tx_P, &info->zs_channel->control);
 607                ZSDELAY();
 608                ZS_WSYNC(info->zs_channel);
 609                ZSLOG(REGCTRL, RES_Tx_P, 1);
 610                return;
 611        }
 612
 613        /* Send char */
 614        zs_put_char(info->zs_channel, info->xmit_buf[info->xmit_tail++]);
 615        info->xmit_tail = info->xmit_tail & (SERIAL_XMIT_SIZE-1);
 616        info->xmit_cnt--;
 617
 618        if (info->xmit_cnt < WAKEUP_CHARS)
 619                zs_sched_event(info, RS_EVENT_WRITE_WAKEUP);
 620
 621        if (info->xmit_cnt <= 0) {
 622                sbus_writeb(RES_Tx_P, &info->zs_channel->control);
 623                ZSDELAY();
 624                ZS_WSYNC(info->zs_channel);
 625                ZSLOG(REGCTRL, RES_Tx_P, 1);
 626        }
 627}
 628
 629static void status_handle(struct sun_serial *info)
 630{
 631        unsigned char status;
 632
 633        /* Get status from Read Register 0 */
 634        status = sbus_readb(&info->zs_channel->control);
 635        ZSDELAY();
 636        ZSLOG(REGCTRL, status, 0);
 637        /* Clear status condition... */
 638        sbus_writeb(RES_EXT_INT, &info->zs_channel->control);
 639        ZSDELAY();
 640        ZS_WSYNC(info->zs_channel);
 641        ZSLOG(REGCTRL, RES_EXT_INT, 1);
 642#if 0
 643        if (status & DCD) {
 644                if ((info->tty->termios->c_cflag & CRTSCTS) &&
 645                    ((info->curregs[3] & AUTO_ENAB)==0)) {
 646                        info->curregs[3] |= AUTO_ENAB;
 647                        write_zsreg(info->zs_channel, 3, info->curregs[3]);
 648                }
 649        } else {
 650                if ((info->curregs[3] & AUTO_ENAB)) {
 651                        info->curregs[3] &= ~AUTO_ENAB;
 652                        write_zsreg(info->zs_channel, 3, info->curregs[3]);
 653                }
 654        }
 655#endif
 656        /* Whee, if this is console input and this is a
 657         * 'break asserted' status change interrupt, call
 658         * the boot prom.
 659         */
 660        if (status & BRK_ABRT) {
 661                if (info->break_abort)
 662                        batten_down_hatches();
 663                if (info->cons_mouse)
 664                        sun_mouse_inbyte(0, 1);
 665        }
 666
 667        /* XXX Whee, put in a buffer somewhere, the status information
 668         * XXX whee whee whee... Where does the information go...
 669         */
 670        return;
 671}
 672
 673/*
 674 * This is the serial driver's generic interrupt routine
 675 */
 676void zs_interrupt(int irq, void *dev_id, struct pt_regs * regs)
 677{
 678        struct sun_serial *info;
 679        int i;
 680
 681        info = (struct sun_serial *)dev_id;
 682        ZSLOG(REGIRQ, 0, 0);
 683        for (i = 0; i < NUM_SERIAL; i++) {
 684                unsigned char r3 = read_zsreg(info->zs_channel, 3);
 685
 686                /* Channel A -- /dev/ttya or /dev/kbd, could be the console */
 687                if (r3 & (CHAEXT | CHATxIP | CHARxIP)) {
 688                        sbus_writeb(RES_H_IUS, &info->zs_channel->control);
 689                        ZSDELAY();
 690                        ZS_WSYNC(info->zs_channel);
 691                        ZSLOG(REGCTRL, RES_H_IUS, 1);
 692                        if (r3 & CHARxIP)
 693                                receive_chars(info, regs);
 694                        if (r3 & CHAEXT)
 695                                status_handle(info);
 696                        if (r3 & CHATxIP)
 697                                transmit_chars(info);
 698                }
 699
 700                /* Channel B -- /dev/ttyb or /dev/mouse, could be the console */
 701                info = info->zs_next;
 702                if (r3 & (CHBEXT | CHBTxIP | CHBRxIP)) {
 703                        sbus_writeb(RES_H_IUS, &info->zs_channel->control);
 704                        ZSDELAY();
 705                        ZS_WSYNC(info->zs_channel);
 706                        ZSLOG(REGCTRL, RES_H_IUS, 1);
 707                        if (r3 & CHBRxIP)
 708                                receive_chars(info, regs);
 709                        if (r3 & CHBEXT)
 710                                status_handle(info);
 711                        if (r3 & CHBTxIP)
 712                                transmit_chars(info);
 713                }
 714
 715                info = info->zs_next;
 716        }
 717}
 718
 719/*
 720 * -------------------------------------------------------------------
 721 * Here ends the serial interrupt routines.
 722 * -------------------------------------------------------------------
 723 */
 724
 725/*
 726 * This routine is used to handle the "bottom half" processing for the
 727 * serial driver, known also the "software interrupt" processing.
 728 * This processing is done at the kernel interrupt level, after the
 729 * zs_interrupt() has returned, BUT WITH INTERRUPTS TURNED ON.  This
 730 * is where time-consuming activities which can not be done in the
 731 * interrupt driver proper are done; the interrupt driver schedules
 732 * them using zs_sched_event(), and they get done here.
 733 */
 734static void do_serial_bh(void)
 735{
 736        run_task_queue(&tq_serial);
 737}
 738
 739static void do_softint(void *private_)
 740{
 741        struct sun_serial       *info = (struct sun_serial *) private_;
 742        struct tty_struct       *tty;
 743        
 744        tty = info->tty;
 745        if (!tty)
 746                return;
 747
 748        if (test_and_clear_bit(RS_EVENT_WRITE_WAKEUP, &info->event)) {
 749                tty_wakeup(tty);
 750        }
 751}
 752
 753/*
 754 * This routine is called from the scheduler tqueue when the interrupt
 755 * routine has signalled that a hangup has occurred.  The path of
 756 * hangup processing is:
 757 *
 758 *      serial interrupt routine -> (scheduler tqueue) ->
 759 *      do_serial_hangup() -> tty->hangup() -> zs_hangup()
 760 * 
 761 */
 762static void do_serial_hangup(void *private_)
 763{
 764        struct sun_serial       *info = (struct sun_serial *) private_;
 765        struct tty_struct       *tty;
 766        
 767        tty = info->tty;
 768        if (!tty)
 769                return;
 770#ifdef SERIAL_DEBUG_OPEN
 771        printk("do_serial_hangup<%p: tty-%d\n",
 772                __builtin_return_address(0), info->line);
 773#endif
 774
 775        tty_hangup(tty);
 776}
 777
 778static int startup(struct sun_serial * info)
 779{
 780        unsigned long flags;
 781
 782        if (info->flags & ZILOG_INITIALIZED)
 783                return 0;
 784
 785        if (!info->xmit_buf) {
 786                info->xmit_buf = (unsigned char *) get_free_page(GFP_KERNEL);
 787                if (!info->xmit_buf)
 788                        return -ENOMEM;
 789        }
 790
 791        save_flags(flags); cli();
 792
 793#ifdef SERIAL_DEBUG_OPEN
 794        printk("Starting up tty-%d (irq %d)...\n", info->line, info->irq);
 795#endif
 796
 797        /*
 798         * Clear the FIFO buffers and disable them
 799         * (they will be reenabled in change_speed())
 800         */
 801        ZS_CLEARFIFO(info->zs_channel);
 802        info->xmit_fifo_size = 1;
 803
 804        /*
 805         * Clear the interrupt registers.
 806         */
 807        sbus_writeb(ERR_RES, &info->zs_channel->control);
 808        ZSDELAY();
 809        ZS_WSYNC(info->zs_channel);
 810        ZSLOG(REGCTRL, ERR_RES, 1);
 811
 812        sbus_writeb(RES_H_IUS, &info->zs_channel->control);
 813        ZSDELAY();
 814        ZS_WSYNC(info->zs_channel);
 815        ZSLOG(REGCTRL, RES_H_IUS, 1);
 816
 817        /*
 818         * Now, initialize the Zilog
 819         */
 820        zs_rtsdtr(info, 1);
 821
 822        /*
 823         * Finally, enable sequencing and interrupts
 824         */
 825        info->curregs[1] |= (info->curregs[1] & ~(RxINT_MASK)) |
 826                                (EXT_INT_ENAB | INT_ALL_Rx);
 827        info->curregs[3] |= (RxENAB | Rx8);
 828        /* We enable Tx interrupts as needed. */
 829        info->curregs[5] |= (TxENAB | Tx8);
 830        info->curregs[9] |= (NV | MIE);
 831        write_zsreg(info->zs_channel, 3, info->curregs[3]);
 832        write_zsreg(info->zs_channel, 5, info->curregs[5]);
 833        write_zsreg(info->zs_channel, 9, info->curregs[9]);
 834        
 835        /*
 836         * And clear the interrupt registers again for luck.
 837         */
 838        sbus_writeb(ERR_RES, &info->zs_channel->control);
 839        ZSDELAY();
 840        ZS_WSYNC(info->zs_channel);
 841        ZSLOG(REGCTRL, ERR_RES, 1);
 842
 843        sbus_writeb(RES_H_IUS, &info->zs_channel->control);
 844        ZSDELAY();
 845        ZS_WSYNC(info->zs_channel);
 846        ZSLOG(REGCTRL, RES_H_IUS, 1);
 847
 848        if (info->tty)
 849                clear_bit(TTY_IO_ERROR, &info->tty->flags);
 850        info->xmit_cnt = info->xmit_head = info->xmit_tail = 0;
 851
 852        /*
 853         * and set the speed of the serial port
 854         */
 855        change_speed(info);
 856
 857        info->flags |= ZILOG_INITIALIZED;
 858        restore_flags(flags);
 859        return 0;
 860}
 861
 862/*
 863 * This routine will shutdown a serial port; interrupts are disabled, and
 864 * DTR is dropped if the hangup on close termio flag is on.
 865 */
 866static void shutdown(struct sun_serial * info)
 867{
 868        unsigned long   flags;
 869
 870        if (!(info->flags & ZILOG_INITIALIZED))
 871                return;
 872
 873#ifdef SERIAL_DEBUG_OPEN
 874        printk("Shutting down serial port %d (irq %d)....", info->line,
 875               info->irq);
 876#endif
 877        
 878        save_flags(flags); cli(); /* Disable interrupts */
 879        
 880        if (info->xmit_buf) {
 881                free_page((unsigned long) info->xmit_buf);
 882                info->xmit_buf = 0;
 883        }
 884
 885        if (info->tty)
 886                set_bit(TTY_IO_ERROR, &info->tty->flags);
 887        
 888        info->flags &= ~ZILOG_INITIALIZED;
 889        restore_flags(flags);
 890}
 891
 892/*
 893 * This routine is called to set the UART divisor registers to match
 894 * the specified baud rate for a serial port.
 895 */
 896static void change_speed(struct sun_serial *info)
 897{
 898        unsigned cflag;
 899        int     baud, quot = 0;
 900        int     brg;
 901
 902        if (!info->tty || !info->tty->termios)
 903                return;
 904        cflag = info->tty->termios->c_cflag;
 905        if (!info->port)
 906                return;
 907        baud = tty_get_baud_rate(info->tty);
 908        
 909        if ((baud == 38400) && 
 910            ((info->flags & ZILOG_SPD_MASK) == ZILOG_SPD_CUST))
 911                quot = info->custom_divisor;
 912
 913        if (quot) {
 914                info->zs_baud = info->baud_base / quot;
 915                info->clk_divisor = 16;
 916
 917                info->curregs[4] = X16CLK;
 918                info->curregs[11] = TCBR | RCBR;
 919                brg = BPS_TO_BRG(info->zs_baud, ZS_CLOCK/info->clk_divisor);
 920                info->curregs[12] = (brg & 255);
 921                info->curregs[13] = ((brg >> 8) & 255);
 922                info->curregs[14] = BRSRC | BRENAB;
 923                zs_rtsdtr(info, 1);
 924        } else if (baud) {
 925                info->zs_baud = baud;
 926                info->clk_divisor = 16;
 927
 928                info->curregs[4] = X16CLK;
 929                info->curregs[11] = TCBR | RCBR;
 930                brg = BPS_TO_BRG(info->zs_baud, ZS_CLOCK/info->clk_divisor);
 931                info->curregs[12] = (brg & 255);
 932                info->curregs[13] = ((brg >> 8) & 255);
 933                info->curregs[14] = BRSRC | BRENAB;
 934                zs_rtsdtr(info, 1);
 935        } else {
 936                zs_rtsdtr(info, 0);
 937                return;
 938        }
 939
 940        /* byte size and parity */
 941        switch (cflag & CSIZE) {
 942        case CS5:
 943                info->curregs[3] &= ~(RxN_MASK);
 944                info->curregs[3] |= Rx5;
 945                info->curregs[5] &= ~(TxN_MASK);
 946                info->curregs[5] |= Tx5;
 947                info->parity_mask = 0x1f;
 948                break;
 949        case CS6:
 950                info->curregs[3] &= ~(RxN_MASK);
 951                info->curregs[3] |= Rx6;
 952                info->curregs[5] &= ~(TxN_MASK);
 953                info->curregs[5] |= Tx6;
 954                info->parity_mask = 0x3f;
 955                break;
 956        case CS7:
 957                info->curregs[3] &= ~(RxN_MASK);
 958                info->curregs[3] |= Rx7;
 959                info->curregs[5] &= ~(TxN_MASK);
 960                info->curregs[5] |= Tx7;
 961                info->parity_mask = 0x7f;
 962                break;
 963        case CS8:
 964        default: /* defaults to 8 bits */
 965                info->curregs[3] &= ~(RxN_MASK);
 966                info->curregs[3] |= Rx8;
 967                info->curregs[5] &= ~(TxN_MASK);
 968                info->curregs[5] |= Tx8;
 969                info->parity_mask = 0xff;
 970                break;
 971        }
 972        info->curregs[4] &= ~(0x0c);
 973        if (cflag & CSTOPB) {
 974                info->curregs[4] |= SB2;
 975        } else {
 976                info->curregs[4] |= SB1;
 977        }
 978        if (cflag & PARENB) {
 979                info->curregs[4] |= PAR_ENAB;
 980        } else {
 981                info->curregs[4] &= ~PAR_ENAB;
 982        }
 983        if (!(cflag & PARODD)) {
 984                info->curregs[4] |= PAR_EVEN;
 985        } else {
 986                info->curregs[4] &= ~PAR_EVEN;
 987        }
 988
 989        /* Load up the new values */
 990        load_zsregs(info, info->curregs);
 991
 992        return;
 993}
 994
 995/* This is for mouse/keyboard output.
 996 * XXX mouse output??? can we send it commands??? XXX
 997 */
 998static void kbd_put_char(unsigned char ch)
 999{
1000        struct sun_zschannel *chan = zs_kbdchan;
1001        unsigned long flags;
1002
1003        if(!chan)
1004                return;
1005
1006        save_flags(flags); cli();
1007        zs_put_char(chan, ch);
1008        restore_flags(flags);
1009}
1010
1011void mouse_put_char(char ch)
1012{
1013        struct sun_zschannel *chan = zs_mousechan;
1014        unsigned long flags;
1015
1016        if(!chan)
1017                return;
1018
1019        save_flags(flags); cli();
1020        zs_put_char(chan, ch);
1021        restore_flags(flags);
1022}
1023
1024/* These are for receiving and sending characters under the kgdb
1025 * source level kernel debugger.
1026 */
1027void putDebugChar(char kgdb_char)
1028{
1029        struct sun_zschannel *chan = zs_kgdbchan;
1030
1031        while((sbus_readb(&chan->control) & Tx_BUF_EMP)==0)
1032                udelay(5);
1033        sbus_writeb(kgdb_char, &chan->data);
1034        ZS_WSYNC(chan);
1035        ZSLOG(REGDATA, kgdb_char, 1);
1036}
1037
1038char getDebugChar(void)
1039{
1040        struct sun_zschannel *chan = zs_kgdbchan;
1041        u8 val;
1042
1043        do {
1044                val = sbus_readb(&chan->control);
1045                ZSLOG(REGCTRL, val, 0);
1046                udelay(5);
1047        } while ((val & Rx_CH_AV) == 0);
1048
1049        val = sbus_readb(&chan->data);
1050        ZSLOG(REGDATA, val, 0);
1051        return val;
1052}
1053
1054static void zs_flush_chars(struct tty_struct *tty)
1055{
1056        struct sun_serial *info = (struct sun_serial *) tty->driver_data;
1057        unsigned long flags;
1058
1059        if (serial_paranoia_check(info, tty->device, "zs_flush_chars"))
1060                return;
1061
1062        save_flags(flags); cli();
1063        if (info->xmit_cnt <= 0 || tty->stopped || tty->hw_stopped ||
1064            !info->xmit_buf)
1065                goto out;
1066
1067        /* Enable transmitter */
1068        info->curregs[1] |= TxINT_ENAB|EXT_INT_ENAB;
1069        write_zsreg(info->zs_channel, 1, info->curregs[1]);
1070        info->curregs[5] |= TxENAB;
1071        write_zsreg(info->zs_channel, 5, info->curregs[5]);
1072
1073        /*
1074         * Send a first (bootstrapping) character. A best solution is
1075         * to call transmit_chars() here which handles output in a
1076         * generic way. Current transmit_chars() not only transmits,
1077         * but resets interrupts also what we do not desire here.
1078         * XXX Discuss with David.
1079         */
1080        zs_put_char(info->zs_channel, info->xmit_buf[info->xmit_tail++]);
1081        info->xmit_tail = info->xmit_tail & (SERIAL_XMIT_SIZE-1);
1082        info->xmit_cnt--;
1083
1084out:
1085        restore_flags(flags);
1086}
1087
1088static int zs_write(struct tty_struct * tty, int from_user,
1089                    const unsigned char *buf, int count)
1090{
1091        struct sun_serial *info = (struct sun_serial *) tty->driver_data;
1092        unsigned long flags;
1093        int c, total = 0;
1094
1095        if (serial_paranoia_check(info, tty->device, "zs_write"))
1096                return 0;
1097
1098        if (!info || !info->xmit_buf || !tmp_buf)
1099                return 0;
1100
1101        save_flags(flags);
1102        if (from_user) {
1103                down(&tmp_buf_sem);
1104                while (1) {
1105                        c = MIN(count, MIN(SERIAL_XMIT_SIZE - info->xmit_cnt - 1,
1106                                           SERIAL_XMIT_SIZE - info->xmit_head));
1107                        if (c <= 0)
1108                                break;
1109                        c -= copy_from_user(tmp_buf, buf, c);
1110                        if (!c) {
1111                                if (!total)
1112                                        total = -EFAULT;
1113                                break;
1114                        }
1115                        cli();
1116                        c = MIN(c, MIN(SERIAL_XMIT_SIZE - info->xmit_cnt - 1,
1117                                       SERIAL_XMIT_SIZE - info->xmit_head));
1118                        memcpy(info->xmit_buf + info->xmit_head, tmp_buf, c);
1119                        info->xmit_head = ((info->xmit_head + c) &
1120                                           (SERIAL_XMIT_SIZE - 1));
1121                        info->xmit_cnt += c;
1122                        restore_flags(flags);
1123
1124                        buf += c;
1125                        count -= c;
1126                        total += c;
1127                }
1128                up(&tmp_buf_sem);
1129        } else {
1130                while (1) {
1131                        cli();          
1132                        c = MIN(count, MIN(SERIAL_XMIT_SIZE - info->xmit_cnt - 1,
1133                                           SERIAL_XMIT_SIZE - info->xmit_head));
1134                        if (c <= 0) {
1135                                restore_flags(flags);
1136                                break;
1137                        }
1138                        memcpy(info->xmit_buf + info->xmit_head, buf, c);
1139                        info->xmit_head = ((info->xmit_head + c) &
1140                                           (SERIAL_XMIT_SIZE - 1));
1141                        info->xmit_cnt += c;
1142                        restore_flags(flags);
1143                        buf += c;
1144                        count -= c;
1145                        total += c;
1146                }
1147        }
1148
1149        cli();          
1150        if (info->xmit_cnt && !tty->stopped && !tty->hw_stopped) {
1151                /* Enable transmitter */
1152                info->curregs[1] |= TxINT_ENAB|EXT_INT_ENAB;
1153                write_zsreg(info->zs_channel, 1, info->curregs[1]);
1154                info->curregs[5] |= TxENAB;
1155                write_zsreg(info->zs_channel, 5, info->curregs[5]);
1156#if 1
1157                zs_put_char(info->zs_channel,
1158                            info->xmit_buf[info->xmit_tail++]);
1159                info->xmit_tail = info->xmit_tail & (SERIAL_XMIT_SIZE-1);
1160                info->xmit_cnt--;
1161#endif
1162        }
1163
1164        restore_flags(flags);
1165        return total;
1166}
1167
1168static int zs_write_room(struct tty_struct *tty)
1169{
1170        struct sun_serial *info = (struct sun_serial *) tty->driver_data;
1171        int ret;
1172
1173        if (serial_paranoia_check(info, tty->device, "zs_write_room"))
1174                return 0;
1175        ret = SERIAL_XMIT_SIZE - info->xmit_cnt - 1;
1176        if (ret < 0)
1177                ret = 0;
1178        return ret;
1179}
1180
1181static int zs_chars_in_buffer(struct tty_struct *tty)
1182{
1183        struct sun_serial *info = (struct sun_serial *) tty->driver_data;
1184
1185        if (serial_paranoia_check(info, tty->device, "zs_chars_in_buffer"))
1186                return 0;
1187        return info->xmit_cnt;
1188}
1189
1190static void zs_flush_buffer(struct tty_struct *tty)
1191{
1192        struct sun_serial *info = (struct sun_serial *) tty->driver_data;
1193
1194        if (serial_paranoia_check(info, tty->device, "zs_flush_buffer"))
1195                return;
1196        cli();
1197        info->xmit_cnt = info->xmit_head = info->xmit_tail = 0;
1198        sti();
1199        tty_wakeup(tty);
1200}
1201
1202/*
1203 * ------------------------------------------------------------
1204 * zs_throttle()
1205 * 
1206 * This routine is called by the upper-layer tty layer to signal that
1207 * incoming characters should be throttled.
1208 * ------------------------------------------------------------
1209 */
1210static void zs_throttle(struct tty_struct * tty)
1211{
1212        struct sun_serial *info = (struct sun_serial *) tty->driver_data;
1213#ifdef SERIAL_DEBUG_THROTTLE
1214        char    buf[64];
1215        
1216        printk("throttle %s: %d....\n", _tty_name(tty, buf),
1217               tty->ldisc.chars_in_buffer(tty));
1218#endif
1219
1220        if (serial_paranoia_check(info, tty->device, "zs_throttle"))
1221                return;
1222        
1223        if (I_IXOFF(tty))
1224                info->x_char = STOP_CHAR(tty);
1225
1226        /* Turn off RTS line */
1227        cli();
1228        info->curregs[5] &= ~RTS;
1229        write_zsreg(info->zs_channel, 5, info->curregs[5]);
1230        sti();
1231}
1232
1233static void zs_unthrottle(struct tty_struct * tty)
1234{
1235        struct sun_serial *info = (struct sun_serial *) tty->driver_data;
1236#ifdef SERIAL_DEBUG_THROTTLE
1237        char    buf[64];
1238        
1239        printk("unthrottle %s: %d....\n", _tty_name(tty, buf),
1240               tty->ldisc.chars_in_buffer(tty));
1241#endif
1242
1243        if (serial_paranoia_check(info, tty->device, "zs_unthrottle"))
1244                return;
1245        
1246        if (I_IXOFF(tty)) {
1247                if (info->x_char)
1248                        info->x_char = 0;
1249                else
1250                        info->x_char = START_CHAR(tty);
1251        }
1252
1253        /* Assert RTS line */
1254        cli();
1255        info->curregs[5] |= RTS;
1256        write_zsreg(info->zs_channel, 5, info->curregs[5]);
1257        sti();
1258}
1259
1260/*
1261 * ------------------------------------------------------------
1262 * zs_ioctl() and friends
1263 * ------------------------------------------------------------
1264 */
1265
1266static int get_serial_info(struct sun_serial * info,
1267                           struct serial_struct * retinfo)
1268{
1269        struct serial_struct tmp;
1270  
1271        if (!retinfo)
1272                return -EFAULT;
1273        memset(&tmp, 0, sizeof(tmp));
1274        tmp.type = info->type;
1275        tmp.line = info->line;
1276        tmp.port = info->port;
1277        tmp.irq = info->irq;
1278        tmp.flags = info->flags;
1279        tmp.baud_base = info->baud_base;
1280        tmp.close_delay = info->close_delay;
1281        tmp.closing_wait = info->closing_wait;
1282        tmp.custom_divisor = info->custom_divisor;
1283        if (copy_to_user(retinfo,&tmp,sizeof(*retinfo)))
1284                return -EFAULT;
1285        return 0;
1286}
1287
1288static int set_serial_info(struct sun_serial * info,
1289                           struct serial_struct * new_info)
1290{
1291        struct serial_struct new_serial;
1292        struct sun_serial old_info;
1293        int retval = 0;
1294
1295        if (!new_info || copy_from_user(&new_serial,new_info,sizeof(new_serial)))
1296                return -EFAULT;
1297        old_info = *info;
1298
1299        if (!capable(CAP_SYS_ADMIN)) {
1300                if ((new_serial.baud_base != info->baud_base) ||
1301                    (new_serial.type != info->type) ||
1302                    (new_serial.close_delay != info->close_delay) ||
1303                    ((new_serial.flags & ~ZILOG_USR_MASK) !=
1304                     (info->flags & ~ZILOG_USR_MASK)))
1305                        return -EPERM;
1306                info->flags = ((info->flags & ~ZILOG_USR_MASK) |
1307                               (new_serial.flags & ZILOG_USR_MASK));
1308                info->custom_divisor = new_serial.custom_divisor;
1309                goto check_and_exit;
1310        }
1311
1312        if(new_serial.baud_base < 9600)
1313                return -EINVAL;
1314
1315        if (info->count > 1)
1316                return -EBUSY;
1317
1318        /*
1319         * OK, past this point, all the error checking has been done.
1320         * At this point, we start making changes.....
1321         */
1322
1323        info->baud_base = new_serial.baud_base;
1324        info->flags = ((info->flags & ~ZILOG_FLAGS) |
1325                        (new_serial.flags & ZILOG_FLAGS));
1326        info->custom_divisor = new_serial.custom_divisor;
1327        info->type = new_serial.type;
1328        info->close_delay = new_serial.close_delay;
1329        info->closing_wait = new_serial.closing_wait;
1330
1331check_and_exit:
1332        retval = startup(info);
1333        return retval;
1334}
1335
1336/*
1337 * get_lsr_info - get line status register info
1338 *
1339 * Purpose: Let user call ioctl() to get info when the UART physically
1340 *          is emptied.  On bus types like RS485, the transmitter must
1341 *          release the bus after transmitting. This must be done when
1342 *          the transmit shift register is empty, not be done when the
1343 *          transmit holding register is empty.  This functionality
1344 *          allows an RS485 driver to be written in user space. 
1345 */
1346static int get_lsr_info(struct sun_serial * info, unsigned int *value)
1347{
1348        unsigned char status;
1349
1350        cli();
1351        status = sbus_readb(&info->zs_channel->control);
1352        ZSDELAY();
1353        ZSLOG(REGCTRL, status, 0);
1354        sti();
1355        if (put_user(status, value))
1356                return -EFAULT;
1357        return 0;
1358}
1359
1360static int get_modem_info(struct sun_serial * info, unsigned int *value)
1361{
1362        unsigned char status;
1363        unsigned int result;
1364
1365        cli();
1366        status = sbus_readb(&info->zs_channel->control);
1367        ZSDELAY();
1368        ZSLOG(REGCTRL, status, 0);
1369        sti();
1370        result =  ((info->curregs[5] & RTS) ? TIOCM_RTS : 0)
1371                | ((info->curregs[5] & DTR) ? TIOCM_DTR : 0)
1372                | ((status  & DCD) ? TIOCM_CAR : 0)
1373                | ((status  & SYNC) ? TIOCM_DSR : 0)
1374                | ((status  & CTS) ? TIOCM_CTS : 0);
1375        if (put_user(result, value))
1376                return -EFAULT;
1377        return 0;
1378}
1379
1380static int set_modem_info(struct sun_serial * info, unsigned int cmd,
1381                          unsigned int *value)
1382{
1383        unsigned int arg;
1384
1385        if (get_user(arg, value))
1386                return -EFAULT;
1387        switch (cmd) {
1388        case TIOCMBIS: 
1389                if (arg & TIOCM_RTS)
1390                        info->curregs[5] |= RTS;
1391                if (arg & TIOCM_DTR)
1392                        info->curregs[5] |= DTR;
1393                break;
1394        case TIOCMBIC:
1395                if (arg & TIOCM_RTS)
1396                        info->curregs[5] &= ~RTS;
1397                if (arg & TIOCM_DTR)
1398                        info->curregs[5] &= ~DTR;
1399                break;
1400        case TIOCMSET:
1401                info->curregs[5] = ((info->curregs[5] & ~(RTS | DTR))
1402                             | ((arg & TIOCM_RTS) ? RTS : 0)
1403                             | ((arg & TIOCM_DTR) ? DTR : 0));
1404                break;
1405        default:
1406                return -EINVAL;
1407        }
1408        cli();
1409        write_zsreg(info->zs_channel, 5, info->curregs[5]);
1410        sti();
1411        return 0;
1412}
1413
1414/*
1415 * This routine sends a break character out the serial port.
1416 */
1417static void send_break( struct sun_serial * info, int duration)
1418{
1419        if (!info->port)
1420                return;
1421        current->state = TASK_INTERRUPTIBLE;
1422        cli();
1423        write_zsreg(info->zs_channel, 5, (info->curregs[5] | SND_BRK));
1424        schedule_timeout(duration);
1425        write_zsreg(info->zs_channel, 5, info->curregs[5]);
1426        sti();
1427}
1428
1429static int zs_ioctl(struct tty_struct *tty, struct file * file,
1430                    unsigned int cmd, unsigned long arg)
1431{
1432        struct sun_serial * info = (struct sun_serial *) tty->driver_data;
1433        int retval;
1434
1435        if (serial_paranoia_check(info, tty->device, "zs_ioctl"))
1436                return -ENODEV;
1437
1438        if ((cmd != TIOCGSERIAL) && (cmd != TIOCSSERIAL) &&
1439            (cmd != TIOCSERCONFIG) && (cmd != TIOCSERGWILD)  &&
1440            (cmd != TIOCSERSWILD) && (cmd != TIOCSERGSTRUCT)) {
1441                if (tty->flags & (1 << TTY_IO_ERROR))
1442                    return -EIO;
1443        }
1444        
1445        switch (cmd) {
1446                case TCSBRK:    /* SVID version: non-zero arg --> no break */
1447                        retval = tty_check_change(tty);
1448                        if (retval)
1449                                return retval;
1450                        tty_wait_until_sent(tty, 0);
1451                        if (!arg)
1452                                send_break(info, HZ/4); /* 1/4 second */
1453                        return 0;
1454                case TCSBRKP:   /* support for POSIX tcsendbreak() */
1455                        retval = tty_check_change(tty);
1456                        if (retval)
1457                                return retval;
1458                        tty_wait_until_sent(tty, 0);
1459                        send_break(info, arg ? arg*(HZ/10) : HZ/4);
1460                        return 0;
1461                case TIOCGSOFTCAR:
1462                        if (put_user(C_CLOCAL(tty) ? 1 : 0,
1463                                     (unsigned long *) arg))
1464                                return -EFAULT;
1465                        return 0;
1466                case TIOCSSOFTCAR:
1467                        if (get_user(arg, (unsigned long *) arg))
1468                                return -EFAULT;
1469                        tty->termios->c_cflag =
1470                                ((tty->termios->c_cflag & ~CLOCAL) |
1471                                 (arg ? CLOCAL : 0));
1472                        return 0;
1473                case TIOCMGET:
1474                        return get_modem_info(info, (unsigned int *) arg);
1475                case TIOCMBIS:
1476                case TIOCMBIC:
1477                case TIOCMSET:
1478                        return set_modem_info(info, cmd, (unsigned int *) arg);
1479                case TIOCGSERIAL:
1480                        return get_serial_info(info,
1481                                               (struct serial_struct *) arg);
1482                case TIOCSSERIAL:
1483                        return set_serial_info(info,
1484                                               (struct serial_struct *) arg);
1485                case TIOCSERGETLSR: /* Get line status register */
1486                        return get_lsr_info(info, (unsigned int *) arg);
1487
1488                case TIOCSERGSTRUCT:
1489                        if (copy_to_user((struct sun_serial *) arg,
1490                                    info, sizeof(struct sun_serial)))
1491                                return -EFAULT;
1492                        return 0;
1493                        
1494                default:
1495                        return -ENOIOCTLCMD;
1496                }
1497        return 0;
1498}
1499
1500static void zs_set_termios(struct tty_struct *tty, struct termios *old_termios)
1501{
1502        struct sun_serial *info = (struct sun_serial *) tty->driver_data;
1503
1504        if (tty->termios->c_cflag == old_termios->c_cflag)
1505                return;
1506
1507        change_speed(info);
1508
1509        if ((old_termios->c_cflag & CRTSCTS) &&
1510            !(tty->termios->c_cflag & CRTSCTS)) {
1511                tty->hw_stopped = 0;
1512                zs_start(tty);
1513        }
1514}
1515
1516/*
1517 * ------------------------------------------------------------
1518 * zs_close()
1519 * 
1520 * This routine is called when the serial port gets closed.  First, we
1521 * wait for the last remaining data to be sent.  Then, we unlink its
1522 * ZILOG structure from the interrupt chain if necessary, and we free
1523 * that IRQ if nothing is left in the chain.
1524 * ------------------------------------------------------------
1525 */
1526static void zs_close(struct tty_struct *tty, struct file * filp)
1527{
1528        struct sun_serial * info = (struct sun_serial *) tty->driver_data;
1529        unsigned long flags;
1530
1531        if (!info || serial_paranoia_check(info, tty->device, "zs_close"))
1532                return;
1533        
1534        save_flags(flags); cli();
1535        
1536        if (tty_hung_up_p(filp)) {
1537                restore_flags(flags);
1538                return;
1539        }
1540        
1541#ifdef SERIAL_DEBUG_OPEN
1542        printk("zs_close tty-%d, count = %d\n", info->line, info->count);
1543#endif
1544        if ((tty->count == 1) && (info->count != 1)) {
1545                /*
1546                 * Uh, oh.  tty->count is 1, which means that the tty
1547                 * structure will be freed.  Info->count should always
1548                 * be one in these conditions.  If it's greater than
1549                 * one, we've got real problems, since it means the
1550                 * serial port won't be shutdown.
1551                 */
1552                printk("zs_close: bad serial port count; tty->count is 1, "
1553                       "info->count is %d\n", info->count);
1554                info->count = 1;
1555        }
1556        if (--info->count < 0) {
1557                printk("zs_close: bad serial port count for ttys%d: %d\n",
1558                       info->line, info->count);
1559                info->count = 0;
1560        }
1561        if (info->count) {
1562                restore_flags(flags);
1563                return;
1564        }
1565        info->flags |= ZILOG_CLOSING;
1566        /*
1567         * Save the termios structure, since this port may have
1568         * separate termios for callout and dialin.
1569         */
1570        if (info->flags & ZILOG_NORMAL_ACTIVE)
1571                info->normal_termios = *tty->termios;
1572        if (info->flags & ZILOG_CALLOUT_ACTIVE)
1573                info->callout_termios = *tty->termios;
1574        /*
1575         * Now we wait for the transmit buffer to clear; and we notify 
1576         * the line discipline to only process XON/XOFF characters.
1577         */
1578        tty->closing = 1;
1579        if (info->closing_wait != ZILOG_CLOSING_WAIT_NONE)
1580                tty_wait_until_sent(tty, info->closing_wait);
1581        /*
1582         * At this point we stop accepting input.  To do this, we
1583         * disable the receive line status interrupts, and tell the
1584         * interrupt driver to stop checking the data ready bit in the
1585         * line status register.
1586         */
1587        /** if (!info->iscons) ... **/
1588        info->curregs[3] &= ~RxENAB;
1589        write_zsreg(info->zs_channel, 3, info->curregs[3]);
1590        info->curregs[1] &= ~(RxINT_MASK);
1591        write_zsreg(info->zs_channel, 1, info->curregs[1]);
1592        ZS_CLEARFIFO(info->zs_channel);
1593
1594        shutdown(info);
1595        if (tty->driver.flush_buffer)
1596                tty->driver.flush_buffer(tty);
1597        tty_ldisc_flush(tty);
1598        tty->closing = 0;
1599        info->event = 0;
1600        info->tty = 0;
1601        if (tty->ldisc.num != N_TTY) {
1602                if (tty->ldisc.close)
1603                        (tty->ldisc.close)(tty);
1604                tty->ldisc = *(tty_ldisc_get(N_TTY));
1605                tty->termios->c_line = N_TTY;
1606                if (tty->ldisc.open)
1607                        (tty->ldisc.open)(tty);
1608        }
1609        if (info->blocked_open) {
1610                if (info->close_delay) {
1611                        current->state = TASK_INTERRUPTIBLE;
1612                        schedule_timeout(info->close_delay);
1613                }
1614                wake_up_interruptible(&info->open_wait);
1615        }
1616        info->flags &= ~(ZILOG_NORMAL_ACTIVE|ZILOG_CALLOUT_ACTIVE|
1617                         ZILOG_CLOSING);
1618        wake_up_interruptible(&info->close_wait);
1619#ifdef SERIAL_DEBUG_OPEN
1620        printk("zs_close tty-%d exiting, count = %d\n", info->line, info->count);
1621#endif
1622        restore_flags(flags);
1623}
1624
1625/*
1626 * zs_hangup() --- called by tty_hangup() when a hangup is signaled.
1627 */
1628void zs_hangup(struct tty_struct *tty)
1629{
1630        struct sun_serial * info = (struct sun_serial *) tty->driver_data;
1631
1632        if (serial_paranoia_check(info, tty->device, "zs_hangup"))
1633                return;
1634
1635        if (info->is_cons)
1636                return;
1637
1638#ifdef SERIAL_DEBUG_OPEN
1639        printk("zs_hangup<%p: tty-%d, count = %d bye\n",
1640                __builtin_return_address(0), info->line, info->count);
1641#endif
1642
1643        zs_flush_buffer(tty);
1644        shutdown(info);
1645        info->event = 0;
1646        info->count = 0;
1647        info->flags &= ~(ZILOG_NORMAL_ACTIVE|ZILOG_CALLOUT_ACTIVE);
1648        info->tty = 0;
1649        wake_up_interruptible(&info->open_wait);
1650}
1651
1652/*
1653 *
1654 * line_info - returns information about each channel
1655 *
1656 */
1657static inline int line_info(char *buf, struct sun_serial *info)
1658{
1659        unsigned char status;
1660        char stat_buf[30];
1661        int ret;
1662
1663        ret = sprintf(buf, "%d: uart:Zilog8530 port:%x irq:%d",
1664                info->line, info->port, info->irq);
1665
1666        cli();
1667        status = sbus_readb(&info->zs_channel->control);
1668        ZSDELAY();
1669        ZSLOG(REGCTRL, status, 0);
1670        sti();
1671
1672        stat_buf[0] = 0;
1673        stat_buf[1] = 0;
1674        if (info->curregs[5] & RTS)
1675                strcat(stat_buf, "|RTS");
1676        if (status & CTS)
1677                strcat(stat_buf, "|CTS");
1678        if (info->curregs[5] & DTR)
1679                strcat(stat_buf, "|DTR");
1680        if (status & SYNC)
1681                strcat(stat_buf, "|DSR");
1682        if (status & DCD)
1683                strcat(stat_buf, "|CD");
1684
1685        ret += sprintf(buf + ret, " baud:%d %s\n", info->zs_baud, stat_buf + 1);
1686        return ret;
1687}
1688
1689/*
1690 *
1691 * zs_read_proc() - called when /proc/tty/driver/serial is read.
1692 *
1693 */
1694int zs_read_proc(char *page, char **start, off_t off, int count,
1695                 int *eof, void *data)
1696{
1697        char *revision = "$Revision: 1.68.2.2 $";
1698        char *version, *p;
1699        int i, len = 0, l;
1700        off_t begin = 0;
1701
1702        version = strchr(revision, ' ');
1703        p = strchr(++version, ' ');
1704        *p = '\0';
1705        len += sprintf(page, "serinfo:1.0 driver:%s\n", version);
1706        *p = ' ';
1707
1708        for (i = 0; i < NUM_CHANNELS && len < 4000; i++) {
1709                l = line_info(page + len, &zs_soft[i]);
1710                len += l;
1711                if (len+begin > off+count)
1712                        goto done;
1713                if (len+begin < off) {
1714                        begin += len;
1715                        len = 0;
1716                }
1717        }
1718
1719        *eof = 1;
1720done:
1721        if (off >= len+begin)
1722                return 0;
1723        *start = page + (off-begin);
1724        return ((count < begin+len-off) ? count : begin+len-off);
1725}
1726
1727/*
1728 * ------------------------------------------------------------
1729 * zs_open() and friends
1730 * ------------------------------------------------------------
1731 */
1732static int block_til_ready(struct tty_struct *tty, struct file * filp,
1733                           struct sun_serial *info)
1734{
1735        DECLARE_WAITQUEUE(wait, current);
1736        int retval, do_clocal = 0;
1737        unsigned char r0;
1738
1739        /*
1740         * If the device is in the middle of being closed, then block
1741         * until it's done, and then try again.
1742         */
1743        if (info->flags & ZILOG_CLOSING) {
1744                interruptible_sleep_on(&info->close_wait);
1745#ifdef SERIAL_DO_RESTART
1746                if (info->flags & ZILOG_HUP_NOTIFY)
1747                        return -EAGAIN;
1748                else
1749                        return -ERESTARTSYS;
1750#else
1751                return -EAGAIN;
1752#endif
1753        }
1754
1755        /*
1756         * If this is a callout device, then just make sure the normal
1757         * device isn't being used.
1758         */
1759        if (tty->driver.subtype == SERIAL_TYPE_CALLOUT) {
1760                if (info->flags & ZILOG_NORMAL_ACTIVE)
1761                        return -EBUSY;
1762                if ((info->flags & ZILOG_CALLOUT_ACTIVE) &&
1763                    (info->flags & ZILOG_SESSION_LOCKOUT) &&
1764                    (info->session != current->session))
1765                    return -EBUSY;
1766                if ((info->flags & ZILOG_CALLOUT_ACTIVE) &&
1767                    (info->flags & ZILOG_PGRP_LOCKOUT) &&
1768                    (info->pgrp != current->pgrp))
1769                    return -EBUSY;
1770                info->flags |= ZILOG_CALLOUT_ACTIVE;
1771                return 0;
1772        }
1773        
1774        /*
1775         * If non-blocking mode is set, or the port is not enabled,
1776         * then make the check up front and then exit.
1777         */
1778        if ((filp->f_flags & O_NONBLOCK) ||
1779            (tty->flags & (1 << TTY_IO_ERROR))) {
1780                if (info->flags & ZILOG_CALLOUT_ACTIVE)
1781                        return -EBUSY;
1782                info->flags |= ZILOG_NORMAL_ACTIVE;
1783                return 0;
1784        }
1785
1786        if (info->flags & ZILOG_CALLOUT_ACTIVE) {
1787                if (info->normal_termios.c_cflag & CLOCAL)
1788                        do_clocal = 1;
1789        } else {
1790                if (tty->termios->c_cflag & CLOCAL)
1791                        do_clocal = 1;
1792        }
1793        
1794        /*
1795         * Block waiting for the carrier detect and the line to become
1796         * free (i.e., not in use by the callout).  While we are in
1797         * this loop, info->count is dropped by one, so that
1798         * zs_close() knows when to free things.  We restore it upon
1799         * exit, either normal or abnormal.
1800         */
1801        retval = 0;
1802        add_wait_queue(&info->open_wait, &wait);
1803#ifdef SERIAL_DEBUG_OPEN
1804        printk("block_til_ready before block: ttys%d, count = %d\n",
1805               info->line, info->count);
1806#endif
1807        cli();
1808        if(!tty_hung_up_p(filp))
1809                info->count--;
1810        sti();
1811        info->blocked_open++;
1812        while (1) {
1813                cli();
1814                if (!(info->flags & ZILOG_CALLOUT_ACTIVE))
1815                        zs_rtsdtr(info, 1);
1816                sti();
1817                set_current_state(TASK_INTERRUPTIBLE);
1818                if (tty_hung_up_p(filp) ||
1819                    !(info->flags & ZILOG_INITIALIZED)) {
1820#ifdef SERIAL_DEBUG_OPEN
1821                        printk("block_til_ready hup-ed: ttys%d, count = %d\n",
1822                                info->line, info->count);
1823#endif
1824#ifdef SERIAL_DO_RESTART
1825                        if (info->flags & ZILOG_HUP_NOTIFY)
1826                                retval = -EAGAIN;
1827                        else
1828                                retval = -ERESTARTSYS;  
1829#else
1830                        retval = -EAGAIN;
1831#endif
1832                        break;
1833                }
1834
1835                cli();
1836                r0 = read_zsreg(info->zs_channel, R0);
1837                sti();
1838                if (!(info->flags & ZILOG_CALLOUT_ACTIVE) &&
1839                    !(info->flags & ZILOG_CLOSING) &&
1840                    (do_clocal || (DCD & r0)))
1841                        break;
1842                if (signal_pending(current)) {
1843                        retval = -ERESTARTSYS;
1844                        break;
1845                }
1846#ifdef SERIAL_DEBUG_OPEN
1847                printk("block_til_ready blocking: ttys%d, count = %d\n",
1848                       info->line, info->count);
1849#endif
1850                schedule();
1851        }
1852        current->state = TASK_RUNNING;
1853        remove_wait_queue(&info->open_wait, &wait);
1854        if (!tty_hung_up_p(filp))
1855                info->count++;
1856        info->blocked_open--;
1857#ifdef SERIAL_DEBUG_OPEN
1858        printk("block_til_ready after blocking: ttys%d, count = %d\n",
1859               info->line, info->count);
1860#endif
1861        if (retval)
1862                return retval;
1863        info->flags |= ZILOG_NORMAL_ACTIVE;
1864        return 0;
1865}       
1866
1867/*
1868 * This routine is called whenever a serial port is opened.  It
1869 * enables interrupts for a serial port, linking in its ZILOG structure into
1870 * the IRQ chain.   It also performs the serial-specific
1871 * initialization for the tty structure.
1872 */
1873int zs_open(struct tty_struct *tty, struct file * filp)
1874{
1875        struct sun_serial *info;
1876        int retval, line;
1877
1878        line = MINOR(tty->device) - tty->driver.minor_start;
1879
1880        /* The zilog lines for the mouse/keyboard must be
1881         * opened using their respective drivers.
1882         */
1883        if ((line < 0) || (line >= NUM_CHANNELS))
1884                return -ENODEV;
1885        if((line == KEYBOARD_LINE) || (line == MOUSE_LINE))
1886                return -ENODEV;
1887        info = zs_soft + line;
1888        /* Is the kgdb running over this line? */
1889        if (info->kgdb_channel)
1890                return -ENODEV;
1891        if (serial_paranoia_check(info, tty->device, "zs_open"))
1892                return -ENODEV;
1893#ifdef SERIAL_DEBUG_OPEN
1894        printk("zs_open %s%d, count = %d\n", tty->driver.name, info->line,
1895               info->count);
1896#endif
1897        if (info->tty != 0 && info->tty != tty) {
1898                /* Never happen? */
1899                printk("zs_open %s%d, tty overwrite.\n", tty->driver.name, info->line);
1900                return -EBUSY;
1901        }
1902
1903        if (!tmp_buf) {
1904                unsigned long page = get_free_page(GFP_KERNEL);
1905                if (!page)
1906                        return -ENOMEM;
1907                if (tmp_buf)
1908                        free_page(page);
1909                else
1910                        tmp_buf = (unsigned char *) page;
1911        }
1912
1913        info->count++;
1914        tty->driver_data = info;
1915        info->tty = tty;
1916
1917        /*
1918         * Start up serial port
1919         */
1920        retval = startup(info);
1921        if (retval)
1922                return retval;
1923
1924        retval = block_til_ready(tty, filp, info);
1925        if (retval) {
1926#ifdef SERIAL_DEBUG_OPEN
1927                printk("zs_open returning after block_til_ready with %d\n",
1928                       retval);
1929#endif
1930                return retval;
1931        }
1932
1933        if ((info->count == 1) && (info->flags & ZILOG_SPLIT_TERMIOS)) {
1934                if (tty->driver.subtype == SERIAL_TYPE_NORMAL)
1935                        *tty->termios = info->normal_termios;
1936                else 
1937                        *tty->termios = info->callout_termios;
1938                change_speed(info);
1939        }
1940
1941#ifdef CONFIG_SERIAL_CONSOLE
1942        if (zs_console.cflag && zs_console.index == line) {
1943                tty->termios->c_cflag = zs_console.cflag;
1944                zs_console.cflag = 0;
1945                change_speed(info);
1946        }
1947#endif
1948
1949        info->session = current->session;
1950        info->pgrp = current->pgrp;
1951
1952#ifdef SERIAL_DEBUG_OPEN
1953        printk("zs_open ttys%d successful...", info->line);
1954#endif
1955        return 0;
1956}
1957
1958/* Finally, routines used to initialize the serial driver. */
1959
1960static void show_serial_version(void)
1961{
1962        char *revision = "$Revision: 1.68.2.2 $";
1963        char *version, *p;
1964
1965        version = strchr(revision, ' ');
1966        p = strchr(++version, ' ');
1967        *p = '\0';
1968        printk("Sparc Zilog8530 serial driver version %s\n", version);
1969        *p = ' ';
1970}
1971
1972/* Probe the PROM for the request zs chip number.
1973 *
1974 * Note: The Sun Voyager shows two addresses and two intr for it's
1975 *       Zilogs, what the second does, I don't know. It does work
1976 *       with using only the first number of each property.  Also
1977 *       we have a special version for sun4u.
1978 */
1979#ifdef __sparc_v9__
1980static struct sun_zslayout * __init get_zs(int chip)
1981{
1982        unsigned int vaddr[2] = { 0, 0 };
1983        unsigned long mapped_addr = 0;
1984        int busnode, seen, zsnode, sun4u_ino;
1985        static int irq = 0;
1986
1987        if(chip < 0 || chip >= NUM_SERIAL) {
1988                prom_printf("get_zs bogon zs chip number");
1989                prom_halt();
1990        }
1991
1992        if(central_bus)
1993                busnode = central_bus->child->prom_node;
1994        else
1995                busnode = prom_searchsiblings(prom_getchild(prom_root_node), "sbus");
1996        if(busnode == 0 || busnode == -1) {
1997                prom_printf("get_zs: no zs bus to search");
1998                prom_halt();
1999        }
2000        zsnode = prom_getchild(busnode);
2001        seen = 0;
2002        while(zsnode) {
2003                int slave;
2004
2005                zsnode = prom_searchsiblings(zsnode, "zs");
2006                slave = prom_getintdefault(zsnode, "slave", -1);
2007                if((slave == chip) || (seen == chip)) {
2008                        int len = prom_getproperty(zsnode, "address",
2009                                                   (void *) vaddr, sizeof(vaddr));
2010
2011                        if(len == -1 || central_bus != NULL) {
2012                                struct sbus_bus *sbus = NULL;
2013                                struct sbus_dev *sdev = NULL;
2014
2015                                /* "address" property is not guarenteed,
2016                                 * everything in I/O is implicitly mapped
2017                                 * anyways by our clever TLB miss handling
2018                                 * scheme, so don't fail here.  -DaveM
2019                                 */
2020                                if (central_bus == NULL) {
2021                                        for_each_sbus(sbus) {
2022                                                for_each_sbusdev(sdev, sbus) {
2023                                                        if (sdev->prom_node == zsnode)
2024                                                                goto found;
2025                                                }
2026                                        }
2027                                }
2028                        found:
2029                                if (sdev == NULL && central_bus == NULL)
2030                                        prom_halt();
2031                                if (central_bus == NULL) {
2032                                        mapped_addr =
2033                                            sbus_ioremap(&sdev->resource[0], 0,
2034                                                         PAGE_SIZE, "Zilog Registers");
2035                                } else {
2036                                        struct linux_prom_registers zsregs[1];
2037                                        int err;
2038
2039                                        err = prom_getproperty(zsnode, "reg",
2040                                                               (char *)&zsregs[0],
2041                                                               sizeof(zsregs));
2042                                        if (err == -1) {
2043                                                prom_printf("ZS: Cannot map Zilog regs.\n");
2044                                                prom_halt();
2045                                        }
2046                                        apply_fhc_ranges(central_bus->child, &zsregs[0], 1);
2047                                        apply_central_ranges(central_bus, &zsregs[0], 1);
2048                                        mapped_addr =
2049                                                ((((u64)zsregs[0].which_io)<<32UL)|
2050                                                 ((u64)zsregs[0].phys_addr));
2051                                }
2052                        } else if(len % sizeof(unsigned int)) {
2053                                prom_printf("WHOOPS:  proplen for %s "
2054                                            "was %d, need multiple of "
2055                                            "%d\n", "address", len,
2056                                            sizeof(unsigned int));
2057                                panic("zilog: address property");
2058                        }
2059                        zs_nodes[chip] = zsnode;
2060                        len = prom_getproperty(zsnode, "interrupts",
2061                                               (char *) &sun4u_ino,
2062                                               (sizeof(sun4u_ino)));
2063                        if(!irq) {
2064                                if (central_bus) {
2065                                        unsigned long iclr, imap;
2066
2067                                        iclr = central_bus->child->fhc_regs.uregs + FHC_UREGS_ICLR;
2068                                        imap = central_bus->child->fhc_regs.uregs + FHC_UREGS_IMAP;
2069                                        irq = zilog_irq = build_irq(12, 0, iclr, imap);
2070                                } else {
2071                                        irq = zilog_irq = 
2072                                                sbus_build_irq(sbus_root, sun4u_ino);
2073                                }
2074                        }
2075                        break;
2076                }
2077                zsnode = prom_getsibling(zsnode);
2078                seen++;
2079        }
2080        if(!zsnode)
2081                panic("get_zs: whee chip not found");
2082        if(!vaddr[0] && !mapped_addr)
2083                panic("get_zs: whee no serial chip mappable");
2084        if (mapped_addr != 0) {
2085                return (struct sun_zslayout *) mapped_addr;
2086        } else {
2087                return (struct sun_zslayout *) prom_virt_to_phys((unsigned long)vaddr[0], 0);
2088        }
2089}
2090#else /* !(__sparc_v9__) */
2091static struct sun_zslayout * __init get_zs(int chip)
2092{
2093        struct linux_prom_irqs tmp_irq[2];
2094        unsigned int paddr = 0;
2095        unsigned int vaddr[2] = { 0, 0 };
2096        int zsnode, tmpnode, iospace, slave, len;
2097        int cpunode = 0, bbnode = 0;
2098        static int irq = 0;
2099        int chipid = chip;
2100
2101        iospace = 0;
2102        if(chip < 0 || chip >= NUM_SERIAL)
2103                panic("get_zs bogon zs chip number");
2104
2105        if(sparc_cpu_model == sun4) {
2106                struct resource dummy_resource;
2107
2108                /* Grrr, these have to be hardcoded aieee */
2109                switch(chip) {
2110                case 0:
2111                        paddr = 0xf1000000;
2112                        break;
2113                case 1:
2114                        paddr = 0xf0000000;
2115                        break;
2116                };
2117                iospace = 0;
2118                zs_nodes[chip] = 0;
2119                if(!irq)
2120                        zilog_irq = irq = 12;
2121                dummy_resource.start = paddr;
2122                dummy_resource.end = paddr + 8 - 1;
2123                dummy_resource.flags = IORESOURCE_IO;
2124                vaddr[0] = sbus_ioremap(&dummy_resource, 0,
2125                                        8, "Zilog Serial");
2126        } else {
2127                /* Can use the prom for other machine types */
2128                zsnode = prom_getchild(prom_root_node);
2129                if (sparc_cpu_model == sun4d) {
2130                        int no = 0;
2131
2132                        tmpnode = zsnode;
2133                        zsnode = 0;
2134                        bbnode = 0;
2135                        while (tmpnode && (tmpnode = prom_searchsiblings(tmpnode, "cpu-unit"))) {
2136                                bbnode = prom_getchild(tmpnode);
2137                                if (bbnode && (bbnode = prom_searchsiblings(bbnode, "bootbus"))) {
2138                                        if (no == (chip >> 1)) {
2139                                                cpunode = tmpnode;
2140                                                zsnode = prom_getchild(bbnode);
2141                                                chipid = (chip & 1);
2142                                                break;
2143                                        }
2144                                        no++;
2145                                }
2146                                tmpnode = prom_getsibling(tmpnode);
2147                        }
2148                        if (!tmpnode)
2149                                panic ("get_zs: couldn't find %dth bootbus\n", chip >> 1);
2150                } else {
2151                        tmpnode = prom_searchsiblings(zsnode, "obio");
2152                        if(tmpnode)
2153                                zsnode = prom_getchild(tmpnode);
2154                }
2155                if(!zsnode)
2156                        panic("get_zs no zs serial prom node");
2157                while(zsnode) {
2158                        zsnode = prom_searchsiblings(zsnode, "zs");
2159                        slave = prom_getintdefault(zsnode, "slave", -1);
2160                        if(slave == chipid) {
2161                                /* The one we want */
2162                                if (sparc_cpu_model != sun4d) {
2163                                        len = prom_getproperty(zsnode, "address",
2164                                                               (void *) vaddr,
2165                                                               sizeof(vaddr));
2166                                        if (len % sizeof(unsigned int)) {
2167                                                prom_printf("WHOOPS:  proplen for %s "
2168                                                        "was %d, need multiple of "
2169                                                        "%d\n", "address", len,
2170                                                        sizeof(unsigned int));
2171                                                panic("zilog: address property");
2172                                        }
2173                                } else {
2174                                        /* On sun4d don't have address property :( */
2175                                        struct linux_prom_registers zsreg[4];
2176                                        struct resource res;
2177                                        
2178                                        if (prom_getproperty(zsnode, "reg", (char *)zsreg, sizeof(zsreg)) == -1) {
2179                                                prom_printf ("Cannot map zs regs\n");
2180                                                prom_halt();
2181                                        }
2182                                        prom_apply_generic_ranges(bbnode, cpunode, zsreg, 1);
2183                                        res.start = zsreg[0].phys_addr;
2184                                        res.end = res.start + 8 - 1;
2185                                        res.flags = zsreg[0].which_io | IORESOURCE_IO;
2186                                        vaddr[0] = sbus_ioremap(&res, 0,
2187                                                                8, "Zilog Serial");
2188                                }
2189                                zs_nodes[chip] = zsnode;
2190                                len = prom_getproperty(zsnode, "intr",
2191                                                       (char *) tmp_irq,
2192                                                       sizeof(tmp_irq));
2193                                if (len % sizeof(struct linux_prom_irqs)) {
2194                                        prom_printf(
2195                                              "WHOOPS:  proplen for %s "
2196                                              "was %d, need multiple of "
2197                                              "%d\n", "intr", len,
2198                                              sizeof(struct linux_prom_irqs));
2199                                        panic("zilog: intr property");
2200                                }
2201                                if(!irq) {
2202                                        irq = zilog_irq = tmp_irq[0].pri;
2203                                } else {
2204                                        if(tmp_irq[0].pri != irq)
2205                                                panic("zilog: bogon irqs");
2206                                }
2207                                break;
2208                        }
2209                        zsnode = prom_getsibling(zsnode);
2210                }
2211                if(!zsnode)
2212                        panic("get_zs whee chip not found");
2213        }
2214        if(!vaddr[0])
2215                panic("get_zs whee no serial chip mappable");
2216
2217        return (struct sun_zslayout *)(unsigned long) vaddr[0];
2218}
2219#endif
2220/* This is for the auto baud rate detection in the mouse driver. */
2221void zs_change_mouse_baud(int newbaud)
2222{
2223        int channel = MOUSE_LINE;
2224        int brg;
2225
2226        zs_soft[channel].zs_baud = newbaud;
2227        brg = BPS_TO_BRG(zs_soft[channel].zs_baud,
2228                         (ZS_CLOCK / zs_soft[channel].clk_divisor));
2229        write_zsreg(zs_soft[channel].zs_channel, R12, (brg & 0xff));
2230        write_zsreg(zs_soft[channel].zs_channel, R13, ((brg >> 8) & 0xff));
2231}
2232
2233void __init zs_init_alloc_failure(const char *table_name)
2234{
2235        prom_printf("zs_probe: Cannot alloc %s.\n", table_name);
2236        prom_halt();
2237}
2238
2239void * __init zs_alloc_bootmem(unsigned long size)
2240{
2241        void *ret;
2242
2243        ret = __alloc_bootmem(size, SMP_CACHE_BYTES, 0UL);
2244        if (ret != NULL)
2245                memset(ret, 0, size);
2246
2247        return ret;
2248}
2249
2250void __init zs_alloc_tables(void)
2251{
2252        zs_chips = (struct sun_zslayout **)
2253                zs_alloc_bootmem(NUM_SERIAL * sizeof(struct sun_zslayout *));
2254        if (zs_chips == NULL)
2255                zs_init_alloc_failure("zs_chips");
2256        zs_channels = (struct sun_zschannel **)
2257                zs_alloc_bootmem(NUM_CHANNELS * sizeof(struct sun_zschannel *));
2258        if (zs_channels == NULL)
2259                zs_init_alloc_failure("zs_channels");
2260        zs_nodes = (int *)
2261                zs_alloc_bootmem(NUM_SERIAL * sizeof(int));
2262        if (zs_nodes == NULL)
2263                zs_init_alloc_failure("zs_nodes");
2264        zs_soft = (struct sun_serial *)
2265                zs_alloc_bootmem(NUM_CHANNELS * sizeof(struct sun_serial));
2266        if (zs_soft == NULL)
2267                zs_init_alloc_failure("zs_soft");
2268        zs_ttys = (struct tty_struct *)
2269                zs_alloc_bootmem(NUM_CHANNELS * sizeof(struct tty_struct));
2270        if (zs_ttys == NULL)
2271                zs_init_alloc_failure("zs_ttys");
2272        serial_table = (struct tty_struct **)
2273                zs_alloc_bootmem(NUM_CHANNELS * sizeof(struct tty_struct *));
2274        if (serial_table == NULL)
2275                zs_init_alloc_failure("serial_table");
2276        serial_termios = (struct termios **)
2277                zs_alloc_bootmem(NUM_CHANNELS * sizeof(struct termios *));
2278        if (serial_termios == NULL)
2279                zs_init_alloc_failure("serial_termios");
2280        serial_termios_locked = (struct termios **)
2281                zs_alloc_bootmem(NUM_CHANNELS * sizeof(struct termios *));
2282        if (serial_termios_locked == NULL)
2283                zs_init_alloc_failure("serial_termios_locked");
2284}
2285
2286int __init zs_probe(void)
2287{
2288        int node;
2289
2290        if(sparc_cpu_model == sun4)
2291                goto no_probe;
2292
2293        NUM_SERIAL = 0;
2294        
2295        node = prom_getchild(prom_root_node);
2296        if (sparc_cpu_model == sun4d) {
2297                int bbnode;
2298                
2299                while (node && (node = prom_searchsiblings(node, "cpu-unit"))) {
2300                        bbnode = prom_getchild(node);
2301                        if (bbnode && prom_searchsiblings(bbnode, "bootbus"))
2302                                NUM_SERIAL += 2;
2303                        node = prom_getsibling(node);
2304                }
2305                goto no_probe;
2306        }
2307#ifdef __sparc_v9__
2308        else if (sparc_cpu_model == sun4u) {
2309                int central_node;
2310
2311                /* Central bus zilogs must be checked for first,
2312                 * since Enterprise boxes might have SBUSes as well.
2313                 */
2314                central_node = prom_finddevice("/central");
2315                if(central_node != 0 && central_node != -1)
2316                        node = prom_searchsiblings(prom_getchild(central_node), "fhc");
2317                else
2318                        node = prom_searchsiblings(node, "sbus");
2319                if(node != 0 && node != -1)
2320                        node = prom_getchild(node);
2321                if(node == 0 || node == -1)
2322                        return -ENODEV;
2323        }
2324#endif /* __sparc_v9__ */
2325        else {
2326                node = prom_searchsiblings(node, "obio");
2327                if(node)
2328                        node = prom_getchild(node);
2329                NUM_SERIAL = 2;
2330                goto no_probe;
2331        }
2332
2333        node = prom_searchsiblings(node, "zs");
2334        if (!node)
2335                return -ENODEV;
2336                
2337        NUM_SERIAL = 2;
2338
2339no_probe:
2340        zs_alloc_tables();
2341
2342        /* Fill in rs_ops struct... */
2343#ifdef CONFIG_SERIAL_CONSOLE
2344        sunserial_setinitfunc(zs_console_init);
2345#endif
2346        sunserial_setinitfunc(zs_init);
2347        rs_ops.rs_kgdb_hook = zs_kgdb_hook;
2348        rs_ops.rs_change_mouse_baud = zs_change_mouse_baud;
2349
2350        sunkbd_setinitfunc(sun_kbd_init);
2351        kbd_ops.compute_shiftstate = sun_compute_shiftstate;
2352        kbd_ops.setledstate = sun_setledstate;
2353        kbd_ops.getledstate = sun_getledstate;
2354        kbd_ops.setkeycode = sun_setkeycode;
2355        kbd_ops.getkeycode = sun_getkeycode;
2356#if defined(__sparc_v9__) && defined(CONFIG_PCI)
2357        sunkbd_install_keymaps(sun_key_maps, sun_keymap_count,
2358                               sun_func_buf, sun_func_table,
2359                               sun_funcbufsize, sun_funcbufleft,
2360                               sun_accent_table, sun_accent_table_size);
2361#endif
2362        return 0;
2363}
2364
2365static inline void zs_prepare(void)
2366{
2367        int channel, chip;
2368        unsigned long flags;
2369
2370        if (!NUM_SERIAL)
2371                return;
2372        
2373        save_and_cli(flags);
2374        
2375        /* Set up our interrupt linked list */
2376        zs_chain = &zs_soft[0];
2377        for(channel = 0; channel < NUM_CHANNELS - 1; channel++) {
2378                zs_soft[channel].zs_next = &zs_soft[channel + 1];
2379                zs_soft[channel].line = channel;
2380        }
2381        zs_soft[channel].zs_next = 0;
2382
2383        /* Initialize Softinfo */
2384        for(chip = 0; chip < NUM_SERIAL; chip++) {
2385                /* If we are doing kgdb over one of the channels on
2386                 * chip zero, kgdb_channel will be set to 1 by the
2387                 * zs_kgdb_hook() routine below.
2388                 */
2389                if(!zs_chips[chip]) {
2390                        zs_chips[chip] = get_zs(chip);
2391                        /* Two channels per chip */
2392                        zs_channels[(chip*2)] = &zs_chips[chip]->channelA;
2393                        zs_channels[(chip*2)+1] = &zs_chips[chip]->channelB;
2394                        zs_soft[(chip*2)].kgdb_channel = 0;
2395                        zs_soft[(chip*2)+1].kgdb_channel = 0;
2396                }
2397
2398                /* First, set up channel A on this chip. */
2399                channel = chip * 2;
2400                zs_soft[channel].zs_channel = zs_channels[channel];
2401                zs_soft[channel].change_needed = 0;
2402                zs_soft[channel].clk_divisor = 16;
2403                zs_soft[channel].cons_keyb = 0;
2404                zs_soft[channel].cons_mouse = 0;
2405                zs_soft[channel].channelA = 1;
2406
2407                /* Now, channel B */
2408                channel++;
2409                zs_soft[channel].zs_channel = zs_channels[channel];
2410                zs_soft[channel].change_needed = 0;
2411                zs_soft[channel].clk_divisor = 16;
2412                zs_soft[channel].cons_keyb = 0;
2413                zs_soft[channel].cons_mouse = 0;
2414                zs_soft[channel].channelA = 0;
2415        }
2416        
2417        restore_flags(flags);
2418}
2419
2420int __init zs_init(void)
2421{
2422        int channel, brg, i;
2423        unsigned long flags;
2424        struct sun_serial *info;
2425        char dummy;
2426
2427        /* Setup base handler, and timer table. */
2428        init_bh(SERIAL_BH, do_serial_bh);
2429
2430        show_serial_version();
2431
2432        /* Initialize the tty_driver structure */
2433        /* SPARC: Not all of this is exactly right for us. */
2434        
2435        memset(&serial_driver, 0, sizeof(struct tty_driver));
2436        serial_driver.magic = TTY_DRIVER_MAGIC;
2437        serial_driver.driver_name = "serial";
2438#ifdef CONFIG_DEVFS_FS
2439        serial_driver.name = "tts/%d";
2440#else
2441        serial_driver.name = "ttyS";
2442#endif
2443        serial_driver.major = TTY_MAJOR;
2444        serial_driver.minor_start = 64;
2445        serial_driver.num = NUM_CHANNELS;
2446        serial_driver.type = TTY_DRIVER_TYPE_SERIAL;
2447        serial_driver.subtype = SERIAL_TYPE_NORMAL;
2448        serial_driver.init_termios = tty_std_termios;
2449        serial_driver.init_termios.c_cflag =
2450                B9600 | CS8 | CREAD | HUPCL | CLOCAL;
2451        serial_driver.flags = TTY_DRIVER_REAL_RAW;
2452        serial_driver.refcount = &serial_refcount;
2453        serial_driver.table = serial_table;
2454        serial_driver.termios = serial_termios;
2455        serial_driver.termios_locked = serial_termios_locked;
2456
2457        serial_driver.open = zs_open;
2458        serial_driver.close = zs_close;
2459        serial_driver.write = zs_write;
2460        serial_driver.flush_chars = zs_flush_chars;
2461        serial_driver.write_room = zs_write_room;
2462        serial_driver.chars_in_buffer = zs_chars_in_buffer;
2463        serial_driver.flush_buffer = zs_flush_buffer;
2464        serial_driver.ioctl = zs_ioctl;
2465        serial_driver.throttle = zs_throttle;
2466        serial_driver.unthrottle = zs_unthrottle;
2467        serial_driver.set_termios = zs_set_termios;
2468        serial_driver.stop = zs_stop;
2469        serial_driver.start = zs_start;
2470        serial_driver.hangup = zs_hangup;
2471
2472        /* I'm too lazy, someone write versions of this for us. -DaveM */
2473        /* I just did. :-) -AIB 2001-12-23 */
2474        serial_driver.read_proc = zs_read_proc;
2475
2476        /*
2477         * The callout device is just like normal device except for
2478         * major number and the subtype code.
2479         */
2480        callout_driver = serial_driver;
2481        callout_driver.name = "cua/%d";
2482        callout_driver.major = TTYAUX_MAJOR;
2483        callout_driver.subtype = SERIAL_TYPE_CALLOUT;
2484        callout_driver.read_proc = 0;
2485        callout_driver.proc_entry = 0;
2486
2487        if (tty_register_driver(&serial_driver))
2488                panic("Couldn't register serial driver\n");
2489        if (tty_register_driver(&callout_driver))
2490                panic("Couldn't register callout driver\n");
2491
2492        save_flags(flags); cli();
2493
2494        /* Initialize Softinfo */
2495        zs_prepare();
2496
2497        /* Grab IRQ line before poking the chips so we do
2498         * not lose any interrupts.
2499         */
2500        if (request_irq(zilog_irq, zs_interrupt, SA_SHIRQ,
2501                        "Zilog8530", zs_chain)) {
2502                prom_printf("Unable to attach zs intr\n");
2503                prom_halt();
2504        }
2505
2506        /* Initialize Hardware */
2507        for(channel = 0; channel < NUM_CHANNELS; channel++) {
2508                /* Hardware reset each chip */
2509                if (!(channel & 1)) {
2510                        write_zsreg(zs_soft[channel].zs_channel, R9, FHWRES);
2511                        ZSDELAY_LONG();
2512                        dummy = read_zsreg(zs_soft[channel].zs_channel, R0);
2513                }
2514
2515                if(channel == KEYBOARD_LINE) {
2516                        zs_soft[channel].cons_keyb = 1;
2517                        zs_soft[channel].parity_mask = 0xff;
2518                        zs_kbdchan = zs_soft[channel].zs_channel;
2519
2520                        write_zsreg(zs_soft[channel].zs_channel, R4,
2521                                    (PAR_EVEN | X16CLK | SB1));
2522                        write_zsreg(zs_soft[channel].zs_channel, R3, Rx8);
2523                        write_zsreg(zs_soft[channel].zs_channel, R5, Tx8);
2524                        write_zsreg(zs_soft[channel].zs_channel, R9, NV);
2525                        write_zsreg(zs_soft[channel].zs_channel, R10, NRZ);
2526                        write_zsreg(zs_soft[channel].zs_channel, R11,
2527                                    (TCBR | RCBR));
2528                        zs_soft[channel].zs_baud = 1200;
2529                        brg = BPS_TO_BRG(zs_soft[channel].zs_baud,
2530                                         ZS_CLOCK/zs_soft[channel].clk_divisor);
2531                        write_zsreg(zs_soft[channel].zs_channel, R12,
2532                                    (brg & 0xff));
2533                        write_zsreg(zs_soft[channel].zs_channel, R13,
2534                                    ((brg >> 8) & 0xff));
2535                        write_zsreg(zs_soft[channel].zs_channel, R14, BRSRC);
2536
2537                        /* Enable Rx/Tx, IRQs, and inform kbd driver */
2538                        write_zsreg(zs_soft[channel].zs_channel, R14,
2539                                    (BRSRC | BRENAB));
2540                        write_zsreg(zs_soft[channel].zs_channel, R3,
2541                                    (Rx8 | RxENAB));
2542                        write_zsreg(zs_soft[channel].zs_channel, R5,
2543                                    (Tx8 | TxENAB | DTR | RTS));
2544
2545                        write_zsreg(zs_soft[channel].zs_channel, R15,
2546                                    (DCDIE | CTSIE | TxUIE | BRKIE));
2547                        write_zsreg(zs_soft[channel].zs_channel, R0,
2548                                    RES_EXT_INT);
2549                        write_zsreg(zs_soft[channel].zs_channel, R0,
2550                                    RES_EXT_INT);
2551
2552                        write_zsreg(zs_soft[channel].zs_channel, R1,
2553                                    (EXT_INT_ENAB | INT_ALL_Rx));
2554                        write_zsreg(zs_soft[channel].zs_channel, R9,
2555                                    (NV | MIE));
2556                        ZS_CLEARERR(zs_soft[channel].zs_channel);
2557                        ZS_CLEARFIFO(zs_soft[channel].zs_channel);
2558                } else if(channel == MOUSE_LINE) {
2559                        zs_soft[channel].cons_mouse = 1;
2560                        zs_soft[channel].parity_mask = 0xff;
2561                        zs_mousechan = zs_soft[channel].zs_channel;
2562
2563                        write_zsreg(zs_soft[channel].zs_channel, R4,
2564                                    (PAR_EVEN | X16CLK | SB1));
2565                        write_zsreg(zs_soft[channel].zs_channel, R3, Rx8);
2566                        write_zsreg(zs_soft[channel].zs_channel, R5, Tx8);
2567                        write_zsreg(zs_soft[channel].zs_channel, R9, NV);
2568                        write_zsreg(zs_soft[channel].zs_channel, R10, NRZ);
2569                        write_zsreg(zs_soft[channel].zs_channel, R11,
2570                                    (TCBR | RCBR));
2571
2572                        zs_soft[channel].zs_baud = 4800;
2573                        brg = BPS_TO_BRG(zs_soft[channel].zs_baud,
2574                                         ZS_CLOCK/zs_soft[channel].clk_divisor);
2575                        write_zsreg(zs_soft[channel].zs_channel, R12,
2576                                    (brg & 0xff));
2577                        write_zsreg(zs_soft[channel].zs_channel, R13,
2578                                    ((brg >> 8) & 0xff));
2579                        write_zsreg(zs_soft[channel].zs_channel, R14, BRSRC);
2580
2581                        /* Enable Rx, IRQs, and inform mouse driver */
2582                        write_zsreg(zs_soft[channel].zs_channel, R14,
2583                                    (BRSRC | BRENAB));
2584                        write_zsreg(zs_soft[channel].zs_channel, R3,
2585                                    (Rx8 | RxENAB));
2586                        write_zsreg(zs_soft[channel].zs_channel, R5, Tx8);
2587
2588                        write_zsreg(zs_soft[channel].zs_channel, R15,
2589                                    (DCDIE | CTSIE | TxUIE | BRKIE));
2590                        write_zsreg(zs_soft[channel].zs_channel, R0,
2591                                    RES_EXT_INT);
2592                        write_zsreg(zs_soft[channel].zs_channel, R0,
2593                                    RES_EXT_INT);
2594
2595                        write_zsreg(zs_soft[channel].zs_channel, R1,
2596                                    (EXT_INT_ENAB | INT_ALL_Rx));
2597                        write_zsreg(zs_soft[channel].zs_channel, R9,
2598                                    (NV | MIE));
2599
2600                        sun_mouse_zsinit();
2601                } else if (zs_soft[channel].is_cons) {
2602                        brg = BPS_TO_BRG(zs_soft[channel].zs_baud,
2603                                         ZS_CLOCK/zs_soft[channel].clk_divisor);
2604                        zscons_regs[12] = brg & 0xff;
2605                        zscons_regs[13] = (brg >> 8) & 0xff;
2606
2607                        memcpy(zs_soft[channel].curregs, zscons_regs, sizeof(zscons_regs));
2608                        load_zsregs(&zs_soft[channel], zscons_regs);
2609
2610                        ZS_CLEARERR(zs_soft[channel].zs_channel);
2611                        ZS_CLEARFIFO(zs_soft[channel].zs_channel);
2612                } else if (zs_soft[channel].kgdb_channel) {
2613                        /* If this is the kgdb line, enable interrupts because
2614                         * we now want to receive the 'control-c' character
2615                         * from the client attached to us asynchronously.
2616                         */
2617                        zs_soft[channel].parity_mask = 0xff;
2618                        kgdb_chaninit(&zs_soft[channel], 1,
2619                                      zs_soft[channel].zs_baud);
2620                } else {
2621                        zs_soft[channel].parity_mask = 0xff;
2622                        write_zsreg(zs_soft[channel].zs_channel, R4,
2623                                    (PAR_EVEN | X16CLK | SB1));
2624                        write_zsreg(zs_soft[channel].zs_channel, R3, Rx8);
2625                        write_zsreg(zs_soft[channel].zs_channel, R5, Tx8);
2626                        write_zsreg(zs_soft[channel].zs_channel, R9, NV);
2627                        write_zsreg(zs_soft[channel].zs_channel, R10, NRZ);
2628                        write_zsreg(zs_soft[channel].zs_channel, R11,
2629                                    (RCBR | TCBR));
2630                        zs_soft[channel].zs_baud = 9600;
2631                        brg = BPS_TO_BRG(zs_soft[channel].zs_baud,
2632                                         ZS_CLOCK/zs_soft[channel].clk_divisor);
2633                        write_zsreg(zs_soft[channel].zs_channel, R12,
2634                                    (brg & 0xff));
2635                        write_zsreg(zs_soft[channel].zs_channel, R13,
2636                                    ((brg >> 8) & 0xff));
2637                        write_zsreg(zs_soft[channel].zs_channel, R14, BRSRC);
2638                        write_zsreg(zs_soft[channel].zs_channel, R14,
2639                                    (BRSRC | BRENAB));
2640                        write_zsreg(zs_soft[channel].zs_channel, R3, Rx8);
2641                        write_zsreg(zs_soft[channel].zs_channel, R5, Tx8);
2642                        write_zsreg(zs_soft[channel].zs_channel, R15, DCDIE);
2643                        write_zsreg(zs_soft[channel].zs_channel, R9, NV | MIE);
2644                        write_zsreg(zs_soft[channel].zs_channel, R0,
2645                                    RES_EXT_INT);
2646                        write_zsreg(zs_soft[channel].zs_channel, R0,
2647                                    RES_EXT_INT);
2648                }
2649        }
2650
2651        for (info = zs_chain, i=0; info; info = info->zs_next, i++) {
2652                info->magic = SERIAL_MAGIC;
2653                info->port = (long) info->zs_channel;
2654                info->line = i;
2655                info->tty = 0;
2656                info->irq = zilog_irq;
2657                info->custom_divisor = 16;
2658                info->close_delay = 50;
2659                info->closing_wait = 3000;
2660                info->x_char = 0;
2661                info->event = 0;
2662                info->count = 0;
2663                info->blocked_open = 0;
2664                info->tqueue.routine = do_softint;
2665                info->tqueue.data = info;
2666                info->tqueue_hangup.routine = do_serial_hangup;
2667                info->tqueue_hangup.data = info;
2668                info->callout_termios = callout_driver.init_termios;
2669                info->normal_termios = serial_driver.init_termios;
2670                init_waitqueue_head(&info->open_wait);
2671                init_waitqueue_head(&info->close_wait);
2672                printk("tty%02d at 0x%04x (irq = %s)", info->line, 
2673                       info->port, __irq_itoa(info->irq));
2674                printk(" is a Zilog8530\n");
2675        }
2676
2677        restore_flags(flags);
2678
2679        keyboard_zsinit(kbd_put_char);
2680        return 0;
2681}
2682
2683/* This is called at boot time to prime the kgdb serial debugging
2684 * serial line.  The 'tty_num' argument is 0 for /dev/ttya and 1
2685 * for /dev/ttyb which is determined in setup_arch() from the
2686 * boot command line flags.
2687 */
2688static void __init zs_kgdb_hook(int tty_num)
2689{
2690        int chip = 0;
2691
2692        if(!zs_chips[chip]) {
2693                zs_chips[chip] = get_zs(chip);
2694                /* Two channels per chip */
2695                zs_channels[(chip*2)] = &zs_chips[chip]->channelA;
2696                zs_channels[(chip*2)+1] = &zs_chips[chip]->channelB;
2697        }
2698        zs_soft[tty_num].zs_channel = zs_channels[tty_num];
2699        zs_kgdbchan = zs_soft[tty_num].zs_channel;
2700        zs_soft[tty_num].change_needed = 0;
2701        zs_soft[tty_num].clk_divisor = 16;
2702        zs_soft[tty_num].zs_baud = 9600;
2703        zs_soft[tty_num].kgdb_channel = 1;     /* This runs kgdb */
2704        zs_soft[tty_num ^ 1].kgdb_channel = 0; /* This does not */
2705        /* Turn on transmitter/receiver at 8-bits/char */
2706        kgdb_chaninit(&zs_soft[tty_num], 0, 9600);
2707        ZS_CLEARERR(zs_kgdbchan);
2708        ZS_CLEARFIFO(zs_kgdbchan);
2709}
2710
2711#ifdef CONFIG_SERIAL_CONSOLE
2712
2713/* This is for console output over ttya/ttyb */
2714static void
2715zs_console_putchar(struct sun_serial *info, char ch)
2716{
2717        int loops = ZS_PUT_CHAR_MAX_DELAY;
2718        unsigned long flags;
2719
2720        if(!info->zs_channel)
2721                return;
2722
2723        save_flags(flags); cli();
2724        zs_put_char(info->zs_channel, ch);
2725        while (!(read_zsreg(info->zs_channel, R1) & ALL_SNT) && --loops)
2726                udelay(5);
2727        restore_flags(flags);
2728}
2729
2730#ifdef SERIAL_CONSOLE_FAIR_OUTPUT
2731/*
2732 * Fair output driver allows a process to speak.
2733 */
2734static void zs_fair_output(struct sun_serial *info)
2735{
2736        unsigned long flags;
2737        int left;               /* Output no more than that */
2738        char c;
2739
2740        if (info == NULL)
2741                return;
2742        if (info->xmit_buf == NULL)
2743                return;
2744
2745        save_flags(flags);  cli();
2746        left = info->xmit_cnt;
2747        while (left != 0) {
2748                c = info->xmit_buf[info->xmit_tail];
2749                info->xmit_tail = (info->xmit_tail+1) & (SERIAL_XMIT_SIZE-1);
2750                info->xmit_cnt--;
2751                restore_flags(flags);
2752
2753                zs_console_putchar(info, c);
2754
2755                cli();
2756                left = MIN(info->xmit_cnt, left-1);
2757        }
2758
2759        /* Last character is being transmitted now (hopefully). */
2760        sbus_writeb(RES_Tx_P, &info->zs_channel->control);
2761        ZSDELAY();
2762        ZSLOG(REGCTRL, RES_Tx_P, 1);
2763
2764        restore_flags(flags);
2765        return;
2766}
2767#endif
2768
2769/*
2770 * zs_console_write is registered for printk.
2771 */
2772static void
2773zs_console_write(struct console *con, const char *s, unsigned count)
2774{
2775        struct sun_serial *info;
2776        int i;
2777
2778        info = zs_soft + con->index;
2779
2780        for (i = 0; i < count; i++, s++) {
2781                if(*s == '\n')
2782                        zs_console_putchar(info, '\r');
2783                zs_console_putchar(info, *s);
2784        }
2785#ifdef SERIAL_CONSOLE_FAIR_OUTPUT
2786        /* Comment this if you want to have a strict interrupt-driven output */
2787        zs_fair_output(info);
2788#endif
2789}
2790
2791static kdev_t zs_console_device(struct console *con)
2792{
2793        return MKDEV(TTY_MAJOR, 64 + con->index);
2794}
2795
2796static int __init zs_console_setup(struct console *con, char *options)
2797{
2798        static struct tty_struct c_tty;
2799        static struct termios c_termios;
2800        struct sun_serial *info;
2801        int brg, baud;
2802
2803        info = zs_soft + con->index;
2804        info->is_cons = 1;
2805
2806        printk("Console: ttyS%d (Zilog8530)\n", info->line);
2807        
2808        sunserial_console_termios(con);
2809        memset(&c_tty, 0, sizeof(c_tty));
2810        memset(&c_termios, 0, sizeof(c_termios));
2811        c_tty.termios = &c_termios;
2812        c_termios.c_cflag = con->cflag;
2813        baud = tty_get_baud_rate(&c_tty);
2814
2815        info->zs_baud = baud;
2816
2817        switch (con->cflag & CSIZE) {
2818                case CS5:
2819                        zscons_regs[3] = Rx5 | RxENAB;
2820                        zscons_regs[5] = Tx5 | TxENAB;
2821                        info->parity_mask = 0x1f;
2822                        break;
2823                case CS6:
2824                        zscons_regs[3] = Rx6 | RxENAB;
2825                        zscons_regs[5] = Tx6 | TxENAB;
2826                        info->parity_mask = 0x3f;
2827                        break;
2828                case CS7:
2829                        zscons_regs[3] = Rx7 | RxENAB;
2830                        zscons_regs[5] = Tx7 | TxENAB;
2831                        info->parity_mask = 0x7f;
2832                        break;
2833                default:
2834                case CS8:
2835                        zscons_regs[3] = Rx8 | RxENAB;
2836                        zscons_regs[5] = Tx8 | TxENAB;
2837                        info->parity_mask = 0xff;
2838                        break;
2839        }
2840        zscons_regs[5] |= DTR;
2841
2842        if (con->cflag & PARENB)
2843                zscons_regs[4] |= PAR_ENAB;
2844        if (!(con->cflag & PARODD))
2845                zscons_regs[4] |= PAR_EVEN;
2846
2847        if (con->cflag & CSTOPB)
2848                zscons_regs[4] |= SB2;
2849        else
2850                zscons_regs[4] |= SB1;
2851
2852        brg = BPS_TO_BRG(baud, ZS_CLOCK / info->clk_divisor);
2853        zscons_regs[12] = brg & 0xff;
2854        zscons_regs[13] = (brg >> 8) & 0xff;
2855
2856        memcpy(info->curregs, zscons_regs, sizeof(zscons_regs));
2857        load_zsregs(info, zscons_regs);
2858
2859        ZS_CLEARERR(info->zs_channel);
2860        ZS_CLEARFIFO(info->zs_channel);
2861        return 0;
2862}
2863
2864static struct console zs_console = {
2865        name:           "ttyS",
2866        write:          zs_console_write,
2867        device:         zs_console_device,
2868        setup:          zs_console_setup,
2869        flags:          CON_PRINTBUFFER,
2870        index:          -1,
2871};
2872
2873static int __init zs_console_init(void)
2874{
2875        extern int con_is_present(void);
2876
2877        if (con_is_present())
2878                return 0;
2879
2880        zs_console.index = serial_console - 1;
2881        register_console(&zs_console);
2882        return 0;
2883}
2884
2885#endif /* CONFIG_SERIAL_CONSOLE */
2886
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.