NetBSD/sys/arch/hpcmips/tx/txioman.c

319 lines
7.0 KiB
C
Raw Normal View History

/* $NetBSD: txioman.c,v 1.1 2000/01/16 21:47:00 uch Exp $ */
/*
* Copyright (c) 2000, by UCHIYAMA Yasushi
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. The name of the developer may NOT be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
*/
#include "opt_tx39_debug.h"
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/device.h>
#include <machine/bus.h>
#include <machine/intr.h>
#include <machine/config_hook.h>
#include <machine/platid.h>
#include <machine/platid_mask.h>
#include <hpcmips/tx/tx39var.h>
#include <hpcmips/tx/tx39iovar.h>
#include <hpcmips/tx/txiomanvar.h>
#include <hpcmips/tx/txsnd.h>
#include "locators.h"
int txioman_match __P((struct device*, struct cfdata*, void*));
void txioman_attach __P((struct device*, struct device*, void*));
struct txioman_softc {
struct device sc_dev;
tx_chipset_tag_t sc_tc;
};
struct cfattach txioman_ca = {
sizeof(struct txioman_softc), txioman_match, txioman_attach
};
void __txioman_led __P((txioman_tag_t, int, int));
void __txioman_backlight __P((txioman_tag_t, int));
void __txioman_uart_init __P((txioman_tag_t));
void __txioman_uarta_init __P((txioman_tag_t, void*));
struct txioman_tag txioman_null_tag = {
NULL,
__txioman_led,
__txioman_backlight,
__txioman_uart_init,
__txioman_uarta_init,
};
void __mobilon_backlight __P((txioman_tag_t, int));
void __mobilon_uart_init __P((txioman_tag_t));
void __mobilon_uarta_init __P((txioman_tag_t, void*));
struct txioman_tag txioman_mobilon_tag = {
NULL,
__txioman_led,
__mobilon_backlight,
__mobilon_uart_init,
__mobilon_uarta_init,
};
void __compaq_led __P((txioman_tag_t, int, int));
void __compaq_uarta_init __P((txioman_tag_t, void*));
struct txioman_tag txioman_compaq_tag = {
NULL,
__compaq_led,
__txioman_backlight,
__txioman_uart_init,
__compaq_uarta_init,
};
const struct txioman_platform_table {
platid_t tp_platform;
char* tp_name;
txioman_tag_t tp_tag;
} txioman_platform_table[] = {
{{{PLATID_WILD, PLATID_MACH_COMPAQ_C}},
"Compaq-C",
&txioman_compaq_tag},
{{{PLATID_WILD, PLATID_MACH_SHARP_MOBILON}},
"Mobilon HC",
&txioman_mobilon_tag},
{{{0, 0}}, "", &txioman_null_tag}
};
txioman_tag_t txioman_tag_lookup __P((void));
int __config_hook_backlight __P((void*, int, long, void*));
int
txioman_match(parent, cf, aux)
struct device *parent;
struct cfdata *cf;
void *aux;
{
platid_mask_t mask;
if (cf->cf_loc[TXIOMANIFCF_PLATFORM] ==
TXIOMANIFCF_PLATFORM_DEFAULT) {
return 1;
}
mask = PLATID_DEREF(cf->cf_loc[TXIOMANIFCF_PLATFORM]);
if (platid_match(&platid, &mask)) {
return 2;
}
return 0;
}
void
txioman_attach(parent, self, aux)
struct device *parent;
struct device *self;
void *aux;
{
struct txioman_attach_args *tia = aux;
struct txioman_softc *sc = (void*)self;
txioman_tag_t tag;
sc->sc_tc = tia->tia_tc;
tag = txioman_tag_lookup();
tag->ti_v = sc;
/*
* register myself to tx_chipset.
*/
tx_conf_register_ioman(sc->sc_tc, tag);
/*
* register backlight config_hook if any.
*/
config_hook(CONFIG_HOOK_BUTTONEVENT,
CONFIG_HOOK_BUTTONEVENT_LIGHT,
CONFIG_HOOK_SHARE, /* btnmgr */
__config_hook_backlight, sc->sc_tc);
}
txioman_tag_t
txioman_tag_lookup()
{
const struct txioman_platform_table *tab;
platid_mask_t mask;
for (tab = txioman_platform_table;
tab->tp_tag != &txioman_null_tag; tab++) {
mask = PLATID_DEREF(&tab->tp_platform);
if (platid_match(&platid, &mask))
goto out;
}
out:
printf(": %s\n", tab->tp_name);
return tab->tp_tag;
}
/*
* default functions.
*/
void
__txioman_led(ti, type, onoff)
txioman_tag_t ti;
int type, onoff;
{
}
void
__txioman_backlight(ti, onoff)
txioman_tag_t ti;
int onoff;
{
}
void
__txioman_uart_init(ti)
txioman_tag_t ti;
{
}
void
__txioman_uarta_init(ti, cookie)
txioman_tag_t ti;
void *cookie;
{
}
/*
* Compaq-C functions.
*/
void
__compaq_led(ti, type, onoff)
txioman_tag_t ti;
int type, onoff;
{
struct txioman_softc *sc = (void*)ti;
/* Green LED */
tx39io_portout(sc->sc_tc, TXPORT(TXMFIO, 3),
onoff ? TXOFF : TXON);
}
extern int __compaq_uart_dcd __P((void*));
extern int __mobilon_uart_dcd __P((void*));
void
__compaq_uarta_init(ti, cookie)
txioman_tag_t ti;
void *cookie;
{
struct txioman_softc *sc = (void*)ti;
tx_chipset_tag_t tc = sc->sc_tc;
tx_intr_establish(tc, MAKEINTR(3, (1<<30)), IST_EDGE, IPL_TTY,
__compaq_uart_dcd, cookie);
tx_intr_establish(tc, MAKEINTR(4, (1<<30)), IST_EDGE, IPL_TTY,
__compaq_uart_dcd, cookie);
tx_intr_establish(tc, MAKEINTR(3, (1<<5)), IST_EDGE, IPL_TTY,
__compaq_uart_dcd, cookie);
tx_intr_establish(tc, MAKEINTR(4, (1<<5)), IST_EDGE, IPL_TTY,
__compaq_uart_dcd, cookie);
}
/*
* Mobilon HC functions
*/
void
__mobilon_backlight(ti, onoff)
txioman_tag_t ti;
int onoff;
{
struct txioman_softc *sc = (void*)ti;
tx39io_portout(sc->sc_tc, TXPORT(TXMFIO, 14),
onoff ? TXON : TXOFF);
}
void
__mobilon_uart_init(ti)
txioman_tag_t ti;
{
struct txioman_softc *sc = (void*)ti;
tx39io_portout(sc->sc_tc, TXPORT(TXIO, 5), TXON);
tx39io_portout(sc->sc_tc, TXPORT(TXMFIO, 15), TXON);
}
void
__mobilon_uarta_init(ti, cookie)
txioman_tag_t ti;
void *cookie;
{
#if not_required /* ??? this is harmful... */
struct txioman_softc *sc = (void*)ti;
tx_chipset_tag_t tc = sc->sc_tc;
tx_intr_establish(tc, MAKEINTR(5, (1<<4)), IST_EDGE, IPL_TTY,
__mobilon_uart_dcd, cookie);
tx_intr_establish(tc, MAKEINTR(5, (1<<11)), IST_EDGE, IPL_TTY,
__mobilon_uart_dcd, cookie);
tx_intr_establish(tc, MAKEINTR(5, (1<<6)), IST_EDGE, IPL_TTY,
__mobilon_uart_dcd, cookie);
tx_intr_establish(tc, MAKEINTR(5, (1<<13)), IST_EDGE, IPL_TTY,
__mobilon_uart_dcd, cookie);
#endif
}
/*
* config_hook.
*/
int
__config_hook_backlight(arg, type, id, msg)
void* arg;
int type;
long id;
void* msg;
{
static int onoff; /* XXX */
tx_chipset_tag_t tc = arg;
onoff ^= 1;
txioman_backlight(tc, onoff);
txioman_led(tc, 0, onoff); /* test */
tx_sound_mute(tc, !onoff); /* test */
return 0;
}