atkbd_atkbdc.c revision 58271
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.
2543105Sdfr *
2650477Speter * $FreeBSD: head/sys/dev/atkbdc/atkbd_atkbdc.c 58271 2000-03-19 03:25:13Z yokota $
2743105Sdfr */
2843105Sdfr
2943105Sdfr#include "opt_kbd.h"
3043105Sdfr
3143105Sdfr#include <sys/param.h>
3243105Sdfr#include <sys/systm.h>
3343105Sdfr#include <sys/kernel.h>
3443105Sdfr#include <sys/bus.h>
3558271Syokota
3645720Speter#include <machine/bus.h>
3758271Syokota#include <machine/resource.h>
3843105Sdfr#include <sys/rman.h>
3943105Sdfr
4043105Sdfr#include <dev/kbd/kbdreg.h>
4143105Sdfr#include <dev/kbd/atkbdreg.h>
4243105Sdfr#include <dev/kbd/atkbdcreg.h>
4343105Sdfr
4443105Sdfr#include <isa/isareg.h>
4543105Sdfr#include <isa/isavar.h>
4643105Sdfr
4758271Syokotatypedef struct {
4858271Syokota	struct resource	*intr;
4958271Syokota	void		*ih;
5058271Syokota} atkbd_softc_t;
5158271Syokota
5243105Sdfrdevclass_t	atkbd_devclass;
5343105Sdfr
5443105Sdfrstatic int	atkbdprobe(device_t dev);
5543105Sdfrstatic int	atkbdattach(device_t dev);
5644628Syokotastatic void	atkbd_isa_intr(void *arg);
5743105Sdfr
5843105Sdfrstatic device_method_t atkbd_methods[] = {
5943105Sdfr	DEVMETHOD(device_probe,		atkbdprobe),
6043105Sdfr	DEVMETHOD(device_attach,	atkbdattach),
6143105Sdfr	{ 0, 0 }
6243105Sdfr};
6343105Sdfr
6443105Sdfrstatic driver_t atkbd_driver = {
6543105Sdfr	ATKBD_DRIVER_NAME,
6643105Sdfr	atkbd_methods,
6758271Syokota	sizeof(atkbd_softc_t),
6843105Sdfr};
6943105Sdfr
7043105Sdfrstatic int
7143105Sdfratkbdprobe(device_t dev)
7243105Sdfr{
7345720Speter	uintptr_t irq;
7445720Speter	uintptr_t flags;
7543105Sdfr
7643105Sdfr	device_set_desc(dev, "AT Keyboard");
7743105Sdfr
7843105Sdfr	/* obtain parameters */
7943105Sdfr	BUS_READ_IVAR(device_get_parent(dev), dev, KBDC_IVAR_IRQ, &irq);
8043105Sdfr	BUS_READ_IVAR(device_get_parent(dev), dev, KBDC_IVAR_FLAGS, &flags);
8143105Sdfr
8243105Sdfr	/* probe the device */
8358271Syokota	return atkbd_probe_unit(device_get_unit(dev),
8458271Syokota				device_get_unit(device_get_parent(dev)),
8558271Syokota				irq, flags);
8643105Sdfr}
8743105Sdfr
8843105Sdfrstatic int
8943105Sdfratkbdattach(device_t dev)
9043105Sdfr{
9158271Syokota	atkbd_softc_t *sc;
9250154Syokota	keyboard_t *kbd;
9345720Speter	uintptr_t irq;
9445720Speter	uintptr_t flags;
9558271Syokota	int rid;
9643105Sdfr	int error;
9743105Sdfr
9858271Syokota	sc = device_get_softc(dev);
9958271Syokota
10044628Syokota	BUS_READ_IVAR(device_get_parent(dev), dev, KBDC_IVAR_IRQ, &irq);
10144628Syokota	BUS_READ_IVAR(device_get_parent(dev), dev, KBDC_IVAR_FLAGS, &flags);
10244628Syokota
10358271Syokota	error = atkbd_attach_unit(device_get_unit(dev), &kbd,
10458271Syokota				  device_get_unit(device_get_parent(dev)),
10558271Syokota				  irq, flags);
10643105Sdfr	if (error)
10743105Sdfr		return error;
10843105Sdfr
10943105Sdfr	/* declare our interrupt handler */
11058271Syokota	rid = 0;
11158271Syokota	sc->intr = bus_alloc_resource(dev, SYS_RES_IRQ, &rid, irq, irq, 1,
11258271Syokota				      RF_SHAREABLE | RF_ACTIVE);
11358271Syokota	BUS_SETUP_INTR(device_get_parent(dev), dev, sc->intr, INTR_TYPE_TTY,
11458271Syokota		       atkbd_isa_intr, kbd, &sc->ih);
11543105Sdfr
11643105Sdfr	return 0;
11743105Sdfr}
11843105Sdfr
11944628Syokotastatic void
12044628Syokotaatkbd_isa_intr(void *arg)
12144628Syokota{
12250154Syokota	keyboard_t *kbd;
12344628Syokota
12450154Syokota	kbd = (keyboard_t *)arg;
12550154Syokota	(*kbdsw[kbd->kb_index]->intr)(kbd, NULL);
12644628Syokota}
12744628Syokota
12843105SdfrDRIVER_MODULE(atkbd, atkbdc, atkbd_driver, atkbd_devclass, 0, 0);
129