i82072.c revision 1.6
1/*	$NetBSD: i82072.c,v 1.6 2002/10/02 05:38:10 thorpej Exp $	*/
2/*-
3 * Copyright (c) 2000 The NetBSD Foundation, Inc.
4 * All rights reserved.
5 *
6 * This code is derived from software contributed to The NetBSD Foundation
7 * by Wayne Knowles
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
11 * are met:
12 * 1. Redistributions of source code must retain the above copyright
13 *    notice, this list of conditions and the following disclaimer.
14 * 2. Redistributions in binary form must reproduce the above copyright
15 *    notice, this list of conditions and the following disclaimer in the
16 *    documentation and/or other materials provided with the distribution.
17 * 3. All advertising materials mentioning features or use of this software
18 *    must display the following acknowledgement:
19 *        This product includes software developed by the NetBSD
20 *        Foundation, Inc. and its contributors.
21 * 4. Neither the name of The NetBSD Foundation nor the names of its
22 *    contributors may be used to endorse or promote products derived
23 *    from this software without specific prior written permission.
24 *
25 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
26 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
27 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
29 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
30 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
31 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
32 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
33 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
34 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
35 * POSSIBILITY OF SUCH DAMAGE.
36 */
37
38#include <sys/param.h>
39#include <sys/systm.h>
40#include <sys/mbuf.h>
41#include <sys/syslog.h>
42#include <sys/socket.h>
43#include <sys/device.h>
44#include <sys/conf.h>
45
46#include <machine/cpu.h>
47#include <machine/autoconf.h>
48#include <machine/mainboard.h>
49#include <machine/bus.h>
50
51dev_type_open(fdopen);
52dev_type_strategy(fdstrategy);
53
54const struct bdevsw fd_bdevsw = {
55	fdopen, nullclose, fdstrategy, noioctl, nodump, nosize, D_DISK
56};
57
58const struct cdevsw fd_cdevsw = {
59	fdopen, nullclose, noread, nowrite, noioctl,
60	nostop, notty, nopoll, nommap, D_DISK
61};
62
63#define	I82072_STATUS	0x000003
64#define	I82072_DATA	0x000007
65#define	I82072_TC	0x800003
66
67struct	fd_softc {
68        struct  device dev;
69        struct  evcnt  fd_intrcnt;
70	bus_space_tag_t	fd_bst;
71	bus_space_handle_t fd_bsh;
72        int     unit;
73};
74
75static int	fd_match (struct device *, struct cfdata *, void *);
76static void	fd_attach (struct device *, struct device *, void *);
77static void     fd_reset (struct fd_softc *);
78
79CFATTACH_DECL(fd, sizeof(struct fd_softc),
80    fd_match, fd_attach, NULL, NULL);
81
82static int	fd_intr (void *);
83
84int
85fd_match(struct device *parent, struct cfdata *cf, void *aux)
86{
87	return 1;
88}
89
90void
91fd_attach(struct device *parent, struct device *self, void *aux)
92{
93        struct fd_softc *sc = (void *)self;
94	struct confargs *ca = aux;
95
96	sc->fd_bst = ca->ca_bustag;
97	if (bus_space_map(ca->ca_bustag, ca->ca_addr,
98			  0x1000000,
99			  BUS_SPACE_MAP_LINEAR,
100			  &sc->fd_bsh) != 0) {
101		printf("%s: cannot map registers\n", self->dv_xname);
102		return;
103	}
104	evcnt_attach_dynamic(&sc->fd_intrcnt, EVCNT_TYPE_INTR, NULL,
105			     self->dv_xname, "intr");
106
107	bus_intr_establish(sc->fd_bst, SYS_INTR_FDC, 0, 0, fd_intr, sc);
108
109	fd_reset(sc);
110	printf(": not fully implemented\n");
111}
112
113void
114fd_reset(struct fd_softc *sc)
115{
116	/* This clears any pending interrupts from the i82072 FDC */
117	bus_space_write_1(sc->fd_bst, sc->fd_bsh, I82072_STATUS, 0x80);
118	DELAY(1000);
119	bus_space_write_1(sc->fd_bst, sc->fd_bsh, I82072_TC, 0x01);
120	DELAY(1000);
121}
122
123int
124fdopen(dev_t dev, int flags, int mode, struct proc *p)
125{
126	return (EBADF);
127}
128
129void
130fdstrategy(struct buf *bp)
131{
132	panic("fdstrategy");
133}
134
135static int
136fd_intr(arg)
137	void *arg;
138{
139	struct fd_softc *sc = arg;
140
141	sc->fd_intrcnt.ev_count++;
142	fd_reset(sc);
143	return 0;
144}
145