wdc_isapnp.c revision 1.2
1/* $NetBSD: wdc_isapnp.c,v 1.2 1998/01/31 21:31:35 christos Exp $ */ 2 3/* 4 * Copyright (c) 1997 Charles M. Hannum. All rights reserved. 5 * 6 * DMA and multi-sector PIO handling are derived from code contributed by 7 * Onno van der Linden. 8 * 9 * ISA attachment created by Christopher G. Demetriou. 10 * 11 * Redistribution and use in source and binary forms, with or without 12 * modification, are permitted provided that the following conditions 13 * are met: 14 * 1. Redistributions of source code must retain the above copyright 15 * notice, this list of conditions and the following disclaimer. 16 * 2. Redistributions in binary form must reproduce the above copyright 17 * notice, this list of conditions and the following disclaimer in the 18 * documentation and/or other materials provided with the distribution. 19 * 3. All advertising materials mentioning features or use of this software 20 * must display the following acknowledgement: 21 * This product includes software developed by Charles M. Hannum. 22 * 4. The name of the author may not be used to endorse or promote products 23 * derived from this software without specific prior written permission. 24 * 25 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 26 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 27 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 28 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 29 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 30 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 31 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 32 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 33 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 34 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 35 */ 36 37#include <sys/types.h> 38#include <sys/param.h> 39#include <sys/systm.h> 40#include <sys/device.h> 41 42#include <machine/bus.h> 43#include <machine/intr.h> 44 45#include <dev/isa/isavar.h> 46#include <dev/isa/isadmavar.h> 47 48#include <dev/isapnp/isapnpreg.h> 49#include <dev/isapnp/isapnpvar.h> 50 51#include <dev/ic/wdcreg.h> 52#include <dev/ic/wdcvar.h> 53 54struct wdc_isapnp_softc { 55 struct wdc_softc sc_wdcdev; 56 struct wdc_attachment_data sc_ad; 57 void *sc_ih; 58 int sc_drq; 59}; 60 61#ifdef __BROKEN_INDIRECT_CONFIG 62int wdc_isapnp_probe __P((struct device *, void *, void *)); 63#else 64int wdc_isapnp_probe __P((struct device *, struct cfdata *, void *)); 65#endif 66void wdc_isapnp_attach __P((struct device *, struct device *, void *)); 67 68struct cfattach wdc_isapnp_ca = { 69 sizeof(struct wdc_isapnp_softc), wdc_isapnp_probe, wdc_isapnp_attach 70}; 71 72#ifdef notyet 73static void wdc_isapnp_dma_setup __P((void *)); 74static void wdc_isapnp_dma_start __P((void *, void *, size_t, int)); 75static void wdc_isapnp_dma_finish __P((void *)); 76#endif 77 78int 79wdc_isapnp_probe(parent, match, aux) 80 struct device *parent; 81#ifdef __BROKEN_INDIRECT_CONFIG 82 void *match; 83#else 84 struct cfdata *match; 85#endif 86 void *aux; 87{ 88 struct isapnp_attach_args *ipa = aux; 89 90 if (strcmp(ipa->ipa_devcompat, "PNP0600")) 91 return (0); 92 93 return (1); 94} 95 96void 97wdc_isapnp_attach(parent, self, aux) 98 struct device *parent, *self; 99 void *aux; 100{ 101 struct wdc_isapnp_softc *sc = (void *)self; 102 struct isapnp_attach_args *ipa = aux; 103 104 printf("\n"); 105 106 if (ipa->ipa_nio != 2 || 107 ipa->ipa_nmem != 0 || 108 ipa->ipa_nmem32 != 0 || 109 ipa->ipa_nirq != 1 || 110 ipa->ipa_ndrq > 1) { 111 printf("%s: unexpected configuration\n", 112 sc->sc_wdcdev.sc_dev.dv_xname); 113 return; 114 } 115 116 if (isapnp_config(ipa->ipa_iot, ipa->ipa_memt, ipa)) { 117 printf("%s: couldn't map registers\n", 118 sc->sc_wdcdev.sc_dev.dv_xname); 119 return; 120 } 121 122 printf("%s: %s %s\n", sc->sc_wdcdev.sc_dev.dv_xname, ipa->ipa_devident, 123 ipa->ipa_devclass); 124 125 sc->sc_ad.iot = ipa->ipa_iot; 126 sc->sc_ad.ioh = ipa->ipa_io[0].h; 127 sc->sc_ad.auxiot = ipa->ipa_iot; 128 sc->sc_ad.auxioh = ipa->ipa_io[1].h; 129 130 sc->sc_ih = isa_intr_establish(ipa->ipa_ic, ipa->ipa_irq[0].num, 131 ipa->ipa_irq[0].type, IPL_BIO, wdcintr, sc); 132 133#ifdef notyet 134 if (ipa->ipa_ndrq > 0) { 135 sc->sc_drq = ipa->ipa_drq[0].num; 136 137 sc->sc_ad.cap |= WDC_CAPABILITY_DMA; 138 sc->sc_ad.dma_setup = &wdc_isapnp_dma_setup; 139 sc->sc_ad.dma_start = &wdc_isapnp_dma_start; 140 sc->sc_ad.dma_finish = &wdc_isapnp_dma_finish; 141 } 142#endif 143 144 wdcattach(&sc->sc_wdcdev, &sc->sc_ad); 145} 146 147#ifdef notyet 148static void 149wdc_isapnp_dma_setup(scv) 150 void *scv; 151{ 152 struct wdc_isapnp_softc *sc = scv; 153 154 if (isa_dmamap_create(sc->sc_wdcdev.sc_dev.dv_parent, sc->sc_drq, 155 MAXPHYS, BUS_DMA_NOWAIT|BUS_DMA_ALLOCNOW)) { 156 printf("%s: can't create map for drq %d\n", 157 sc->sc_wdcdev.sc_dev.dv_xname, sc->sc_drq); 158 sc->sc_ad.cap &= ~WDC_CAPABILITY_DMA; 159 } 160} 161 162static void 163wdc_isapnp_dma_start(scv, buf, size, read) 164 void *scv, *buf; 165 size_t size; 166 int read; 167{ 168 struct wdc_isapnp_softc *sc = scv; 169 170 isa_dmastart(sc->sc_wdcdev.sc_dev.dv_parent, sc->sc_drq, buf, 171 size, NULL, read ? DMAMODE_READ : DMAMODE_WRITE, 172 BUS_DMA_NOWAIT); 173} 174 175static void 176wdc_isapnp_dma_finish(scv) 177 void *scv; 178{ 179 struct wdc_isapnp_softc *sc = scv; 180 181 isa_dmadone(sc->sc_wdcdev.sc_dev.dv_parent, sc->sc_drq); 182} 183#endif 184