Home | History | Annotate | Line # | Download | only in dev
zs_hb.c revision 1.16
      1  1.16  tsutsui /*	$NetBSD: zs_hb.c,v 1.16 2003/05/25 14:02:48 tsutsui Exp $	*/
      2   1.1   tsubai 
      3   1.1   tsubai /*-
      4   1.1   tsubai  * Copyright (c) 1996 The NetBSD Foundation, Inc.
      5   1.1   tsubai  * All rights reserved.
      6   1.1   tsubai  *
      7   1.1   tsubai  * This code is derived from software contributed to The NetBSD Foundation
      8   1.1   tsubai  * by Gordon W. Ross.
      9   1.1   tsubai  *
     10   1.1   tsubai  * Redistribution and use in source and binary forms, with or without
     11   1.1   tsubai  * modification, are permitted provided that the following conditions
     12   1.1   tsubai  * are met:
     13   1.1   tsubai  * 1. Redistributions of source code must retain the above copyright
     14   1.1   tsubai  *    notice, this list of conditions and the following disclaimer.
     15   1.1   tsubai  * 2. Redistributions in binary form must reproduce the above copyright
     16   1.1   tsubai  *    notice, this list of conditions and the following disclaimer in the
     17   1.1   tsubai  *    documentation and/or other materials provided with the distribution.
     18   1.1   tsubai  * 3. All advertising materials mentioning features or use of this software
     19   1.1   tsubai  *    must display the following acknowledgement:
     20   1.1   tsubai  *        This product includes software developed by the NetBSD
     21   1.1   tsubai  *        Foundation, Inc. and its contributors.
     22   1.1   tsubai  * 4. Neither the name of The NetBSD Foundation nor the names of its
     23   1.1   tsubai  *    contributors may be used to endorse or promote products derived
     24   1.1   tsubai  *    from this software without specific prior written permission.
     25   1.1   tsubai  *
     26   1.1   tsubai  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     27   1.1   tsubai  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     28   1.1   tsubai  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     29   1.1   tsubai  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     30   1.1   tsubai  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     31   1.1   tsubai  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     32   1.1   tsubai  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     33   1.1   tsubai  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     34   1.1   tsubai  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     35   1.1   tsubai  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     36   1.1   tsubai  * POSSIBILITY OF SUCH DAMAGE.
     37   1.1   tsubai  */
     38   1.1   tsubai 
     39   1.1   tsubai /*
     40   1.1   tsubai  * Zilog Z8530 Dual UART driver (machine-dependent part)
     41   1.1   tsubai  *
     42   1.1   tsubai  * Runs two serial lines per chip using slave drivers.
     43   1.1   tsubai  * Plain tty/async lines use the zs_async slave.
     44   1.1   tsubai  * Sun keyboard/mouse uses the zs_kbd/zs_ms slaves.
     45   1.1   tsubai  */
     46   1.1   tsubai 
     47   1.1   tsubai #include <sys/param.h>
     48   1.1   tsubai #include <sys/systm.h>
     49   1.1   tsubai #include <sys/device.h>
     50   1.1   tsubai #include <sys/tty.h>
     51   1.5  gehenna #include <sys/conf.h>
     52   1.1   tsubai 
     53   1.1   tsubai #include <machine/adrsmap.h>
     54   1.1   tsubai #include <machine/cpu.h>
     55   1.1   tsubai #include <machine/z8530var.h>
     56   1.1   tsubai 
     57   1.1   tsubai #include <dev/cons.h>
     58   1.1   tsubai #include <dev/ic/z8530reg.h>
     59   1.1   tsubai 
     60  1.12  tsutsui #include <newsmips/dev/hbvar.h>
     61  1.12  tsutsui 
     62   1.1   tsubai #include "zsc.h"	/* NZSC */
     63   1.1   tsubai #define NZS NZSC
     64   1.1   tsubai 
     65   1.1   tsubai /* Make life easier for the initialized arrays here. */
     66   1.1   tsubai #if NZS < 2
     67   1.1   tsubai #undef  NZS
     68   1.1   tsubai #define NZS 2
     69   1.1   tsubai #endif
     70   1.1   tsubai 
     71   1.3   tsubai #define ZSCFLAG_EX	0x01	/* expansion board */
     72   1.3   tsubai 
     73   1.1   tsubai /*
     74   1.1   tsubai  * The news3400 provides a 4.9152 MHz clock to the ZS chips.
     75   1.1   tsubai  */
     76   1.3   tsubai #define PCLK	(9600 * 512)	/* PCLK pin input clock rate */
     77   1.3   tsubai #define PCLK_EX	(9600 * 384)
     78   1.1   tsubai 
     79   1.1   tsubai /*
     80   1.1   tsubai  * Define interrupt levels.
     81   1.1   tsubai  */
     82   1.1   tsubai #define ZSHARD_PRI 64
     83   1.1   tsubai 
     84   1.1   tsubai #define ZS_DELAY() {(void)*(volatile char *)INTEN1; delay(2);}
     85   1.1   tsubai 
     86   1.1   tsubai /* The layout of this is hardware-dependent (padding, order). */
     87   1.1   tsubai struct zschan {
     88   1.1   tsubai 	volatile u_char	zc_csr;		/* ctrl,status, and indirect access */
     89   1.1   tsubai 	volatile u_char	zc_data;	/* data */
     90   1.1   tsubai };
     91   1.1   tsubai struct zsdevice {
     92   1.1   tsubai 	/* Yes, they are backwards. */
     93   1.1   tsubai 	struct	zschan zs_chan_b;
     94   1.1   tsubai 	struct	zschan zs_chan_a;
     95   1.1   tsubai };
     96   1.1   tsubai 
     97   1.1   tsubai extern int zs_def_cflag;
     98   1.1   tsubai 
     99   1.1   tsubai static struct zsdevice *zsaddr[NZS];
    100   1.1   tsubai 
    101   1.1   tsubai /* Flags from cninit() */
    102   1.1   tsubai static int zs_hwflags[NZS][2];
    103   1.1   tsubai 
    104   1.1   tsubai /* Default speed for all channels */
    105   1.1   tsubai static int zs_defspeed = 9600;
    106   1.1   tsubai 
    107   1.1   tsubai static u_char zs_init_reg[16] = {
    108   1.1   tsubai 	0,	/* 0: CMD (reset, etc.) */
    109   1.1   tsubai 	0,	/* 1: No interrupts yet. */
    110   1.1   tsubai 	ZSHARD_PRI,	/* IVECT */
    111   1.1   tsubai 	ZSWR3_RX_8 | ZSWR3_RX_ENABLE,
    112   1.1   tsubai 	ZSWR4_CLK_X16 | ZSWR4_ONESB | ZSWR4_EVENP,
    113   1.1   tsubai 	ZSWR5_TX_8 | ZSWR5_TX_ENABLE,
    114   1.1   tsubai 	0,	/* 6: TXSYNC/SYNCLO */
    115   1.1   tsubai 	0,	/* 7: RXSYNC/SYNCHI */
    116   1.1   tsubai 	0,	/* 8: alias for data port */
    117   1.1   tsubai 	ZSWR9_MASTER_IE,
    118   1.1   tsubai 	0,	/*10: Misc. TX/RX control bits */
    119   1.1   tsubai 	ZSWR11_TXCLK_BAUD | ZSWR11_RXCLK_BAUD,
    120   1.3   tsubai 	((PCLK/32)/9600)-2,	/*12: BAUDLO (default=9600) */
    121   1.1   tsubai 	0,			/*13: BAUDHI (default=9600) */
    122   1.1   tsubai 	ZSWR14_BAUD_ENA | ZSWR14_BAUD_FROM_PCLK,
    123   1.1   tsubai 	ZSWR15_BREAK_IE,
    124   1.1   tsubai };
    125   1.1   tsubai 
    126   1.1   tsubai static struct zschan * zs_get_chan_addr __P((int, int));
    127   1.1   tsubai static void zs_hb_delay __P((void));
    128   1.2   tsubai static int zshard_hb __P((void *));
    129   1.1   tsubai static int zs_getc __P((void *));
    130   1.1   tsubai static void zs_putc __P((void *, int));
    131   1.1   tsubai 
    132   1.2   tsubai struct zschan *
    133   1.1   tsubai zs_get_chan_addr(zs_unit, channel)
    134   1.1   tsubai 	int zs_unit, channel;
    135   1.1   tsubai {
    136   1.1   tsubai 	struct zsdevice *addr;
    137   1.1   tsubai 	struct zschan *zc;
    138   1.1   tsubai 
    139   1.1   tsubai 	if (zs_unit >= NZS)
    140   1.1   tsubai 		return NULL;
    141   1.1   tsubai 	addr = zsaddr[zs_unit];
    142   1.1   tsubai 	if (addr == NULL)
    143   1.1   tsubai 		return NULL;
    144   1.1   tsubai 	if (channel == 0) {
    145   1.1   tsubai 		zc = &addr->zs_chan_a;
    146   1.1   tsubai 	} else {
    147   1.1   tsubai 		zc = &addr->zs_chan_b;
    148   1.1   tsubai 	}
    149   1.1   tsubai 	return (zc);
    150   1.1   tsubai }
    151   1.1   tsubai 
    152  1.11  tsutsui static void
    153   1.1   tsubai zs_hb_delay()
    154   1.1   tsubai {
    155  1.11  tsutsui 
    156   1.1   tsubai 	ZS_DELAY();
    157   1.1   tsubai }
    158   1.1   tsubai 
    159   1.1   tsubai /****************************************************************
    160   1.1   tsubai  * Autoconfig
    161   1.1   tsubai  ****************************************************************/
    162   1.1   tsubai 
    163   1.1   tsubai /* Definition of the driver for autoconfig. */
    164   1.1   tsubai int zs_hb_match __P((struct device *, struct cfdata *, void *));
    165   1.1   tsubai void zs_hb_attach __P((struct device *, struct device *, void *));
    166   1.1   tsubai 
    167   1.7  thorpej CFATTACH_DECL(zsc_hb, sizeof(struct zsc_softc),
    168   1.7  thorpej     zs_hb_match, zs_hb_attach, NULL, NULL);
    169   1.1   tsubai 
    170   1.1   tsubai /*
    171   1.1   tsubai  * Is the zs chip present?
    172   1.1   tsubai  */
    173   1.1   tsubai int
    174   1.1   tsubai zs_hb_match(parent, cf, aux)
    175   1.1   tsubai 	struct device *parent;
    176   1.1   tsubai 	struct cfdata *cf;
    177   1.1   tsubai 	void *aux;
    178   1.1   tsubai {
    179  1.12  tsutsui 	struct hb_attach_args *ha = aux;
    180   1.1   tsubai 
    181  1.12  tsutsui 	if (strcmp(ha->ha_name, "zsc"))
    182   1.1   tsubai 		return 0;
    183   1.1   tsubai 
    184   1.1   tsubai 	/* This returns -1 on a fault (bus error). */
    185  1.12  tsutsui 	if (hb_badaddr((char *)ha->ha_addr, 1))
    186   1.1   tsubai 		return 0;
    187   1.1   tsubai 
    188   1.1   tsubai 	return 1;
    189   1.1   tsubai }
    190   1.1   tsubai 
    191   1.1   tsubai /*
    192   1.1   tsubai  * Attach a found zs.
    193   1.1   tsubai  *
    194   1.1   tsubai  * Match slave number to zs unit number, so that misconfiguration will
    195   1.1   tsubai  * not set up the keyboard as ttya, etc.
    196   1.1   tsubai  */
    197   1.1   tsubai void
    198   1.1   tsubai zs_hb_attach(parent, self, aux)
    199   1.1   tsubai 	struct device *parent;
    200   1.1   tsubai 	struct device *self;
    201   1.1   tsubai 	void *aux;
    202   1.1   tsubai {
    203   1.1   tsubai 	struct zsc_softc *zsc = (void *)self;
    204  1.12  tsutsui 	struct hb_attach_args *ha = aux;
    205   1.1   tsubai 	struct zsc_attach_args zsc_args;
    206   1.1   tsubai 	volatile struct zschan *zc;
    207   1.1   tsubai 	struct zs_chanstate *cs;
    208   1.1   tsubai 	int s, zs_unit, channel, intlevel;
    209   1.1   tsubai 	static int didintr;
    210   1.1   tsubai 
    211   1.1   tsubai 	zs_unit = zsc->zsc_dev.dv_unit;
    212  1.12  tsutsui 	intlevel = ha->ha_level;
    213  1.12  tsutsui 	zsaddr[zs_unit] = (void *)ha->ha_addr;
    214   1.1   tsubai 
    215   1.1   tsubai 	if (intlevel == -1) {
    216   1.1   tsubai #if 0
    217   1.1   tsubai 		printf(": interrupt level not configured\n");
    218   1.1   tsubai 		return;
    219   1.1   tsubai #else
    220   1.1   tsubai 		printf(": interrupt level not configured; using");
    221   1.1   tsubai 		intlevel = 1;
    222   1.1   tsubai #endif
    223   1.1   tsubai 	}
    224   1.1   tsubai 
    225   1.1   tsubai 	printf(" level %d\n", intlevel);
    226   1.1   tsubai 
    227   1.1   tsubai 	zs_delay = zs_hb_delay;
    228   1.1   tsubai 
    229   1.1   tsubai 	/*
    230   1.1   tsubai 	 * Initialize software state for each channel.
    231   1.1   tsubai 	 */
    232   1.1   tsubai 	for (channel = 0; channel < 2; channel++) {
    233   1.1   tsubai 		zsc_args.channel = channel;
    234   1.1   tsubai 		zsc_args.hwflags = zs_hwflags[zs_unit][channel];
    235   1.1   tsubai 		cs = &zsc->zsc_cs_store[channel];
    236   1.1   tsubai 		zsc->zsc_cs[channel] = cs;
    237   1.1   tsubai 
    238   1.8       pk 		simple_lock_init(&cs->cs_lock);
    239   1.1   tsubai 		cs->cs_channel = channel;
    240   1.1   tsubai 		cs->cs_private = NULL;
    241   1.1   tsubai 		cs->cs_ops = &zsops_null;
    242   1.3   tsubai 		if ((zsc->zsc_dev.dv_cfdata->cf_flags & ZSCFLAG_EX) == 0)
    243   1.3   tsubai 			cs->cs_brg_clk = PCLK / 16;
    244   1.1   tsubai 		else
    245   1.3   tsubai 			cs->cs_brg_clk = PCLK_EX / 16;
    246   1.1   tsubai 
    247   1.1   tsubai 		zc = zs_get_chan_addr(zs_unit, channel);
    248   1.1   tsubai 		cs->cs_reg_csr  = &zc->zc_csr;
    249   1.1   tsubai 		cs->cs_reg_data = &zc->zc_data;
    250   1.1   tsubai 
    251   1.1   tsubai 		bcopy(zs_init_reg, cs->cs_creg, 16);
    252   1.1   tsubai 		bcopy(zs_init_reg, cs->cs_preg, 16);
    253   1.1   tsubai 
    254   1.1   tsubai 		/* XXX: Get these from the EEPROM instead? */
    255   1.1   tsubai 		/* XXX: See the mvme167 code.  Better. */
    256   1.1   tsubai 		if (zsc_args.hwflags & ZS_HWFLAG_CONSOLE)
    257   1.1   tsubai 			cs->cs_defspeed = zs_get_speed(cs);
    258   1.1   tsubai 		else
    259   1.1   tsubai 			cs->cs_defspeed = zs_defspeed;
    260   1.1   tsubai 		cs->cs_defcflag = zs_def_cflag;
    261   1.1   tsubai 
    262   1.1   tsubai 		/* Make these correspond to cs_defcflag (-crtscts) */
    263   1.1   tsubai 		cs->cs_rr0_dcd = ZSRR0_DCD;
    264   1.1   tsubai 		cs->cs_rr0_cts = 0;
    265   1.1   tsubai 		cs->cs_wr5_dtr = ZSWR5_DTR | ZSWR5_RTS;
    266   1.1   tsubai 		cs->cs_wr5_rts = 0;
    267   1.1   tsubai 
    268   1.1   tsubai 		/*
    269   1.1   tsubai 		 * Clear the master interrupt enable.
    270   1.1   tsubai 		 * The INTENA is common to both channels,
    271   1.1   tsubai 		 * so just do it on the A channel.
    272   1.1   tsubai 		 */
    273   1.1   tsubai 		if (channel == 0) {
    274   1.1   tsubai 			zs_write_reg(cs, 9, 0);
    275   1.1   tsubai 		}
    276   1.1   tsubai 
    277   1.1   tsubai 		/*
    278   1.1   tsubai 		 * Look for a child driver for this channel.
    279   1.1   tsubai 		 * The child attach will setup the hardware.
    280   1.1   tsubai 		 */
    281   1.1   tsubai 		if (!config_found(self, (void *)&zsc_args, zs_print)) {
    282   1.1   tsubai 			/* No sub-driver.  Just reset it. */
    283   1.1   tsubai 			u_char reset = (channel == 0) ?
    284   1.1   tsubai 				ZSWR9_A_RESET : ZSWR9_B_RESET;
    285   1.1   tsubai 			s = splhigh();
    286   1.1   tsubai 			zs_write_reg(cs, 9, reset);
    287   1.1   tsubai 			splx(s);
    288   1.1   tsubai 		}
    289   1.1   tsubai 	}
    290   1.1   tsubai 
    291   1.1   tsubai 	/*
    292   1.1   tsubai 	 * Now safe to install interrupt handlers.  Note the arguments
    293   1.1   tsubai 	 * to the interrupt handlers aren't used.  Note, we only do this
    294   1.1   tsubai 	 * once since both SCCs interrupt at the same level and vector.
    295   1.1   tsubai 	 */
    296   1.1   tsubai 	if (!didintr) {
    297   1.1   tsubai 		didintr = 1;
    298   1.1   tsubai 
    299  1.16  tsutsui 		zsc->zsc_si = softintr_establish(IPL_SOFTSERIAL, zssoft, zsc);
    300  1.15  tsutsui 		hb_intr_establish(intlevel, INTST1_SCC, IPL_SERIAL,
    301  1.15  tsutsui 		    zshard_hb, NULL);
    302   1.1   tsubai 	}
    303   1.1   tsubai 	/* XXX; evcnt_attach() ? */
    304   1.1   tsubai 
    305   1.1   tsubai 	/*
    306   1.1   tsubai 	 * Set the master interrupt enable and interrupt vector.
    307   1.1   tsubai 	 * (common to both channels, do it on A)
    308   1.1   tsubai 	 */
    309   1.1   tsubai 	cs = zsc->zsc_cs[0];
    310   1.1   tsubai 	s = splhigh();
    311   1.1   tsubai 	/* interrupt vector */
    312   1.1   tsubai 	zs_write_reg(cs, 2, zs_init_reg[2]);
    313   1.1   tsubai 	/* master interrupt control (enable) */
    314   1.1   tsubai 	zs_write_reg(cs, 9, zs_init_reg[9]);
    315   1.1   tsubai 	splx(s);
    316   1.1   tsubai }
    317   1.1   tsubai 
    318   1.1   tsubai static int
    319   1.2   tsubai zshard_hb(arg)
    320   1.1   tsubai 	void *arg;
    321   1.1   tsubai {
    322  1.14  tsutsui 	int rv;
    323  1.14  tsutsui 
    324   1.1   tsubai 	(void) *(volatile u_char *)SCCVECT;
    325  1.14  tsutsui 	rv = zshard(arg);
    326  1.14  tsutsui 
    327  1.14  tsutsui 	/* XXX news3400 sometimes losts zs interrupt */
    328  1.14  tsutsui 	if (rv)
    329  1.14  tsutsui 		zshard(arg);
    330   1.1   tsubai 
    331  1.14  tsutsui 	return rv;
    332   1.1   tsubai }
    333   1.1   tsubai 
    334   1.1   tsubai /*
    335   1.1   tsubai  * Polled input char.
    336   1.1   tsubai  */
    337   1.1   tsubai int
    338   1.1   tsubai zs_getc(arg)
    339   1.1   tsubai 	void *arg;
    340   1.1   tsubai {
    341  1.11  tsutsui 	volatile struct zschan *zc = arg;
    342  1.11  tsutsui 	int s, c, rr0;
    343   1.1   tsubai 
    344   1.1   tsubai 	s = splhigh();
    345   1.1   tsubai 	/* Wait for a character to arrive. */
    346   1.1   tsubai 	do {
    347   1.1   tsubai 		rr0 = zc->zc_csr;
    348   1.1   tsubai 		ZS_DELAY();
    349   1.1   tsubai 	} while ((rr0 & ZSRR0_RX_READY) == 0);
    350   1.1   tsubai 
    351   1.1   tsubai 	c = zc->zc_data;
    352   1.1   tsubai 	ZS_DELAY();
    353   1.1   tsubai 	splx(s);
    354   1.1   tsubai 
    355   1.1   tsubai 	/*
    356   1.1   tsubai 	 * This is used by the kd driver to read scan codes,
    357   1.1   tsubai 	 * so don't translate '\r' ==> '\n' here...
    358   1.1   tsubai 	 */
    359   1.1   tsubai 	return (c);
    360   1.1   tsubai }
    361   1.1   tsubai 
    362   1.1   tsubai /*
    363   1.1   tsubai  * Polled output char.
    364   1.1   tsubai  */
    365   1.1   tsubai void
    366   1.1   tsubai zs_putc(arg, c)
    367   1.1   tsubai 	void *arg;
    368   1.1   tsubai 	int c;
    369   1.1   tsubai {
    370  1.11  tsutsui 	volatile struct zschan *zc = arg;
    371  1.11  tsutsui 	int s, rr0;
    372   1.1   tsubai 
    373   1.1   tsubai 	s = splhigh();
    374   1.1   tsubai 	/* Wait for transmitter to become ready. */
    375   1.1   tsubai 	do {
    376   1.1   tsubai 		rr0 = zc->zc_csr;
    377   1.1   tsubai 		ZS_DELAY();
    378   1.1   tsubai 	} while ((rr0 & ZSRR0_TX_READY) == 0);
    379   1.1   tsubai 
    380   1.1   tsubai 	zc->zc_data = c;
    381   1.1   tsubai 	ZS_DELAY();
    382   1.1   tsubai 	splx(s);
    383   1.1   tsubai }
    384   1.1   tsubai 
    385   1.1   tsubai /*****************************************************************/
    386   1.1   tsubai 
    387   1.1   tsubai static void zscnprobe __P((struct consdev *));
    388   1.1   tsubai static void zscninit __P((struct consdev *));
    389   1.1   tsubai static int  zscngetc __P((dev_t));
    390   1.1   tsubai static void zscnputc __P((dev_t, int));
    391   1.1   tsubai 
    392   1.1   tsubai struct consdev consdev_zs = {
    393   1.1   tsubai 	zscnprobe,
    394   1.1   tsubai 	zscninit,
    395   1.1   tsubai 	zscngetc,
    396   1.1   tsubai 	zscnputc,
    397  1.11  tsutsui 	nullcnpollc,
    398  1.11  tsutsui 	NULL,
    399  1.11  tsutsui 	NULL,
    400   1.4  thorpej 	NULL,
    401  1.11  tsutsui 	NODEV,
    402  1.11  tsutsui 	CN_DEAD
    403   1.1   tsubai };
    404   1.1   tsubai 
    405  1.11  tsutsui static void
    406   1.1   tsubai zscnprobe(cn)
    407   1.1   tsubai 	struct consdev *cn;
    408   1.1   tsubai {
    409   1.1   tsubai }
    410   1.1   tsubai 
    411  1.11  tsutsui static void
    412   1.1   tsubai zscninit(cn)
    413   1.1   tsubai 	struct consdev *cn;
    414   1.1   tsubai {
    415   1.5  gehenna 	extern const struct cdevsw zstty_cdevsw;
    416   1.5  gehenna 
    417   1.5  gehenna 	cn->cn_dev = makedev(cdevsw_lookup_major(&zstty_cdevsw), 0);
    418   1.1   tsubai 	cn->cn_pri = CN_REMOTE;
    419   1.1   tsubai 	zs_hwflags[0][0] = ZS_HWFLAG_CONSOLE;
    420   1.1   tsubai }
    421   1.1   tsubai 
    422  1.11  tsutsui static int
    423   1.1   tsubai zscngetc(dev)
    424   1.1   tsubai 	dev_t dev;
    425   1.1   tsubai {
    426  1.11  tsutsui 
    427   1.1   tsubai 	return zs_getc((void *)SCCPORT0A);
    428   1.1   tsubai }
    429   1.1   tsubai 
    430  1.11  tsutsui static void
    431   1.1   tsubai zscnputc(dev, c)
    432   1.1   tsubai 	dev_t dev;
    433   1.1   tsubai 	int c;
    434   1.1   tsubai {
    435  1.11  tsutsui 
    436   1.1   tsubai 	zs_putc((void *)SCCPORT0A, c);
    437   1.1   tsubai }
    438