Add power management hooks.

This commit is contained in:
jdc 2000-03-14 21:20:51 +00:00
parent fa4417ef0c
commit 797ac20035
3 changed files with 74 additions and 4 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: zs.c,v 1.74 2000/03/06 21:36:11 thorpej Exp $ */
/* $NetBSD: zs.c,v 1.75 2000/03/14 21:20:51 jdc Exp $ */
/*-
* Copyright (c) 1996 The NetBSD Foundation, Inc.
@ -71,6 +71,7 @@
#include <sparc/sparc/vaddrs.h>
#include <sparc/sparc/auxreg.h>
#include <sparc/sparc/auxiotwo.h>
#include <sparc/dev/cons.h>
#include "kbd.h" /* NKBD */
@ -186,6 +187,10 @@ static struct intrhand levelsoft = { zssoft };
static int zs_get_speed __P((struct zs_chanstate *));
/* Power management hooks */
int zs_enable __P((struct zs_chanstate *));
void zs_disable __P((struct zs_chanstate *));
/*
* Is the zs chip present?
@ -258,6 +263,8 @@ zs_attach_obio(parent, self, aux)
if (uoba->uoba_isobio4 == 0) {
struct sbus_attach_args *sa = &uoba->uoba_sbus;
void *va;
struct zs_chanstate *cs;
int channel;
if (sa->sa_nintr == 0) {
printf(" no interrupt lines\n");
@ -284,6 +291,19 @@ zs_attach_obio(parent, self, aux)
va = (void *)bh;
}
/*
* Check if power state can be set, e.g. Tadpole 3GX
*/
if (getpropint(sa->sa_node, "pwr-on-auxio2", 0))
{
printf (" powered via auxio2");
for (channel = 0; channel < 2; channel++) {
cs = &zsc->zsc_cs_store[channel];
cs->enable = zs_enable;
cs->disable = zs_disable;
}
}
zsc->zsc_bustag = sa->sa_bustag;
zsc->zsc_dmatag = sa->sa_dmatag;
zs_attach(zsc, va, sa->sa_pri);
@ -1074,3 +1094,24 @@ setup_console:
zs_kgdb_init();
#endif
}
/*
* Power management hooks for zsopen() and zsclose().
* We use them to power on/off the ports, if necessary.
*/
int
zs_enable(cs)
struct zs_chanstate *cs;
{
auxiotwoserialendis (ZS_ENABLE);
cs->enabled = 1;
return(0);
}
void
zs_disable(cs)
struct zs_chanstate *cs;
{
auxiotwoserialendis (ZS_DISABLE);
cs->enabled = 0;
}

View File

@ -1,4 +1,4 @@
/* $NetBSD: z8530sc.h,v 1.12 1999/03/27 01:22:36 wrstuden Exp $ */
/* $NetBSD: z8530sc.h,v 1.13 2000/03/14 21:20:52 jdc Exp $ */
/*
* Copyright (c) 1994 Gordon W. Ross
@ -113,6 +113,12 @@ struct zs_chanstate {
char cs_softreq; /* need soft interrupt call */
char cs_spare1; /* (for skippy :) */
/* power management hooks */
int (*enable) __P((struct zs_chanstate *));
void (*disable) __P((struct zs_chanstate *));
int enabled;
/* MD code might define a larger variant of this. */
};

View File

@ -1,4 +1,4 @@
/* $NetBSD: z8530tty.c,v 1.62 1999/11/04 05:33:59 jonathan Exp $ */
/* $NetBSD: z8530tty.c,v 1.63 2000/03/14 21:20:52 jdc Exp $ */
/*-
* Copyright (c) 1993, 1994, 1995, 1996, 1997, 1998, 1999
@ -325,7 +325,10 @@ zstty_attach(parent, self, aux)
zst->zst_rbget = zst->zst_rbput = zst->zst_rbuf;
zst->zst_rbavail = zstty_rbuf_size;
/* XXX - Do we need an MD hook here? */
/* if there are no enable/disable functions, assume the device
is always enabled */
if (!cs->enable)
cs->enabled = 1;
/*
* Hardware init
@ -435,6 +438,15 @@ zs_shutdown(zst)
zs_write_reg(cs, 1, cs->cs_creg[1]);
}
/* Call the power management hook. */
if (cs->disable) {
#ifdef DIAGNOSTIC
if (!cs->enabled)
panic("zs_shutdown: not enabled?");
#endif
(*cs->disable)(zst->zst_cs);
}
splx(s);
}
@ -482,6 +494,17 @@ zsopen(dev, flags, mode, p)
tp->t_dev = dev;
/* Call the power management hook. */
if (cs->enable) {
if ((*cs->enable)(cs)) {
splx(s2);
splx(s);
printf("%s: device enable failed\n",
zst->zst_dev.dv_xname);
return (EIO);
}
}
/*
* Initialize the termios status to the defaults. Add in the
* sticky bits from TIOCSFLAGS.