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