1 /* $NetBSD: i82072.c,v 1.7 2002/10/23 09:11:39 jdolecek 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 #include <sys/event.h> 46 47 #include <machine/cpu.h> 48 #include <machine/autoconf.h> 49 #include <machine/mainboard.h> 50 #include <machine/bus.h> 51 52 dev_type_open(fdopen); 53 dev_type_strategy(fdstrategy); 54 55 const struct bdevsw fd_bdevsw = { 56 fdopen, nullclose, fdstrategy, noioctl, nodump, nosize, D_DISK 57 }; 58 59 const struct cdevsw fd_cdevsw = { 60 fdopen, nullclose, noread, nowrite, noioctl, 61 nostop, notty, nopoll, nommap, nokqfilter, D_DISK 62 }; 63 64 #define I82072_STATUS 0x000003 65 #define I82072_DATA 0x000007 66 #define I82072_TC 0x800003 67 68 struct fd_softc { 69 struct device dev; 70 struct evcnt fd_intrcnt; 71 bus_space_tag_t fd_bst; 72 bus_space_handle_t fd_bsh; 73 int unit; 74 }; 75 76 static int fd_match (struct device *, struct cfdata *, void *); 77 static void fd_attach (struct device *, struct device *, void *); 78 static void fd_reset (struct fd_softc *); 79 80 CFATTACH_DECL(fd, sizeof(struct fd_softc), 81 fd_match, fd_attach, NULL, NULL); 82 83 static int fd_intr (void *); 84 85 int 86 fd_match(struct device *parent, struct cfdata *cf, void *aux) 87 { 88 return 1; 89 } 90 91 void 92 fd_attach(struct device *parent, struct device *self, void *aux) 93 { 94 struct fd_softc *sc = (void *)self; 95 struct confargs *ca = aux; 96 97 sc->fd_bst = ca->ca_bustag; 98 if (bus_space_map(ca->ca_bustag, ca->ca_addr, 99 0x1000000, 100 BUS_SPACE_MAP_LINEAR, 101 &sc->fd_bsh) != 0) { 102 printf("%s: cannot map registers\n", self->dv_xname); 103 return; 104 } 105 evcnt_attach_dynamic(&sc->fd_intrcnt, EVCNT_TYPE_INTR, NULL, 106 self->dv_xname, "intr"); 107 108 bus_intr_establish(sc->fd_bst, SYS_INTR_FDC, 0, 0, fd_intr, sc); 109 110 fd_reset(sc); 111 printf(": not fully implemented\n"); 112 } 113 114 void 115 fd_reset(struct fd_softc *sc) 116 { 117 /* This clears any pending interrupts from the i82072 FDC */ 118 bus_space_write_1(sc->fd_bst, sc->fd_bsh, I82072_STATUS, 0x80); 119 DELAY(1000); 120 bus_space_write_1(sc->fd_bst, sc->fd_bsh, I82072_TC, 0x01); 121 DELAY(1000); 122 } 123 124 int 125 fdopen(dev_t dev, int flags, int mode, struct proc *p) 126 { 127 return (EBADF); 128 } 129 130 void 131 fdstrategy(struct buf *bp) 132 { 133 panic("fdstrategy"); 134 } 135 136 static int 137 fd_intr(arg) 138 void *arg; 139 { 140 struct fd_softc *sc = arg; 141 142 sc->fd_intrcnt.ev_count++; 143 fd_reset(sc); 144 return 0; 145 } 146