143105Sdfr/*-
243105Sdfr * Copyright (c) 1999 Kazutaka YOKOTA <yokota@zodiac.mech.utsunomiya-u.ac.jp>
343105Sdfr * All rights reserved.
443105Sdfr *
543105Sdfr * Redistribution and use in source and binary forms, with or without
643105Sdfr * modification, are permitted provided that the following conditions
743105Sdfr * are met:
843105Sdfr * 1. Redistributions of source code must retain the above copyright
943105Sdfr *    notice, this list of conditions and the following disclaimer as
1043105Sdfr *    the first lines of this file unmodified.
1143105Sdfr * 2. Redistributions in binary form must reproduce the above copyright
1243105Sdfr *    notice, this list of conditions and the following disclaimer in the
1343105Sdfr *    documentation and/or other materials provided with the distribution.
1443105Sdfr *
1543105Sdfr * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
1643105Sdfr * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
1743105Sdfr * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
1843105Sdfr * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT,
1943105Sdfr * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
2043105Sdfr * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2143105Sdfr * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2243105Sdfr * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2343105Sdfr * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
2443105Sdfr * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25147271Smarius *
26147271Smarius *	from: FreeBSD: src/sys/isa/atkbdc_isa.c,v 1.31 2005/05/29 04:42:28 nyan Exp
2743105Sdfr */
2843105Sdfr
29116181Sobrien#include <sys/cdefs.h>
30116181Sobrien__FBSDID("$FreeBSD$");
31116181Sobrien
3243105Sdfr#include "opt_kbd.h"
3343105Sdfr
3443105Sdfr#include <sys/param.h>
3543105Sdfr#include <sys/systm.h>
3643105Sdfr#include <sys/kernel.h>
37129880Sphk#include <sys/module.h>
3843105Sdfr#include <sys/bus.h>
3943105Sdfr#include <sys/malloc.h>
4047400Sdfr#include <machine/resource.h>
4147400Sdfr#include <sys/rman.h>
4243105Sdfr
43147271Smarius#include <dev/atkbdc/atkbdc_subr.h>
44147271Smarius#include <dev/atkbdc/atkbdcreg.h>
4543105Sdfr
46147271SmariusMALLOC_DEFINE(M_ATKBDDEV, "atkbddev", "AT Keyboard device");
4743105Sdfr
48147271Smariusdevclass_t atkbdc_devclass;
4943105Sdfr
50147271Smariusint
5143105Sdfratkbdc_print_child(device_t bus, device_t dev)
5243105Sdfr{
5343105Sdfr	atkbdc_device_t *kbdcdev;
54294883Sjhibbits	rman_res_t irq;
5583147Syokota	int flags;
5649195Smdodd	int retval = 0;
5743105Sdfr
5843105Sdfr	kbdcdev = (atkbdc_device_t *)device_get_ivars(dev);
5943105Sdfr
6049195Smdodd	retval += bus_print_child_header(bus, dev);
6183147Syokota	flags = device_get_flags(dev);
6283147Syokota	if (flags != 0)
6383147Syokota		retval += printf(" flags 0x%x", flags);
6483147Syokota	irq = bus_get_resource_start(dev, SYS_RES_IRQ, kbdcdev->rid);
6583147Syokota	if (irq != 0)
66297000Sjhibbits		retval += printf(" irq %jd", irq);
6749195Smdodd	retval += bus_print_child_footer(bus, dev);
6843105Sdfr
6949195Smdodd	return (retval);
7043105Sdfr}
7143105Sdfr
72147271Smariusint
7359783Sbdeatkbdc_read_ivar(device_t bus, device_t dev, int index, uintptr_t *val)
7443105Sdfr{
7543105Sdfr	atkbdc_device_t *ivar;
7643105Sdfr
7743105Sdfr	ivar = (atkbdc_device_t *)device_get_ivars(dev);
7843105Sdfr	switch (index) {
7958272Syokota	case KBDC_IVAR_VENDORID:
8058272Syokota		*val = (u_long)ivar->vendorid;
8158272Syokota		break;
8258272Syokota	case KBDC_IVAR_SERIAL:
8358272Syokota		*val = (u_long)ivar->serial;
8458272Syokota		break;
8558272Syokota	case KBDC_IVAR_LOGICALID:
8658272Syokota		*val = (u_long)ivar->logicalid;
8758272Syokota		break;
8858272Syokota	case KBDC_IVAR_COMPATID:
8958272Syokota		*val = (u_long)ivar->compatid;
9058272Syokota		break;
9143105Sdfr	default:
9243105Sdfr		return ENOENT;
9343105Sdfr	}
9443105Sdfr	return 0;
9543105Sdfr}
9643105Sdfr
97147271Smariusint
9859783Sbdeatkbdc_write_ivar(device_t bus, device_t dev, int index, uintptr_t val)
9943105Sdfr{
10043105Sdfr	atkbdc_device_t *ivar;
10143105Sdfr
10243105Sdfr	ivar = (atkbdc_device_t *)device_get_ivars(dev);
10343105Sdfr	switch (index) {
10458272Syokota	case KBDC_IVAR_VENDORID:
10558272Syokota		ivar->vendorid = (u_int32_t)val;
10658272Syokota		break;
10758272Syokota	case KBDC_IVAR_SERIAL:
10858272Syokota		ivar->serial = (u_int32_t)val;
10958272Syokota		break;
11058272Syokota	case KBDC_IVAR_LOGICALID:
11158272Syokota		ivar->logicalid = (u_int32_t)val;
11258272Syokota		break;
11358272Syokota	case KBDC_IVAR_COMPATID:
11458272Syokota		ivar->compatid = (u_int32_t)val;
11558272Syokota		break;
11643105Sdfr	default:
11743105Sdfr		return ENOENT;
11843105Sdfr	}
11943105Sdfr	return 0;
12043105Sdfr}
12143105Sdfr
122147271Smariusstruct resource_list
123147271Smarius*atkbdc_get_resource_list(device_t bus, device_t dev)
12483147Syokota{
12583147Syokota	atkbdc_device_t *ivar;
12683147Syokota
12783147Syokota	ivar = (atkbdc_device_t *)device_get_ivars(dev);
12883147Syokota	return &ivar->resources;
12983147Syokota}
130