1 /* 2 * Copyright (c) 1990 The Regents of the University of California. 3 * All rights reserved. 4 * 5 * This code is derived from software contributed to Berkeley by 6 * Don Ahn. 7 * 8 * Libretto PCMCIA floppy support by David Horwitt (dhorwitt@ucsd.edu) 9 * aided by the Linux floppy driver modifications from David Bateman 10 * (dbateman@eng.uts.edu.au). 11 * 12 * Copyright (c) 1993, 1994 by 13 * jc@irbs.UUCP (John Capo) 14 * vak@zebub.msk.su (Serge Vakulenko) 15 * ache@astral.msk.su (Andrew A. Chernov) 16 * 17 * Copyright (c) 1993, 1994, 1995 by 18 * joerg_wunsch@uriah.sax.de (Joerg Wunsch) 19 * dufault@hda.com (Peter Dufault) 20 * 21 * Copyright (c) 2001 Joerg Wunsch, 22 * joerg_wunsch@uriah.sax.de (Joerg Wunsch) 23 * 24 * Redistribution and use in source and binary forms, with or without 25 * modification, are permitted provided that the following conditions 26 * are met: 27 * 1. Redistributions of source code must retain the above copyright 28 * notice, this list of conditions and the following disclaimer. 29 * 2. Redistributions in binary form must reproduce the above copyright 30 * notice, this list of conditions and the following disclaimer in the 31 * documentation and/or other materials provided with the distribution. 32 * 3. All advertising materials mentioning features or use of this software 33 * must display the following acknowledgement: 34 * This product includes software developed by the University of 35 * California, Berkeley and its contributors. 36 * 4. Neither the name of the University nor the names of its contributors 37 * may be used to endorse or promote products derived from this software 38 * without specific prior written permission. 39 * 40 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 41 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 42 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 43 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 44 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 45 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 46 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 47 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 48 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 49 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 50 * SUCH DAMAGE. 51 * 52 * $DragonFly: src/sys/dev/disk/fd/fd_pccard.c,v 1.1 2004/01/11 16:45:16 joerg Exp $ 53 */ 54 55 #include <sys/param.h> 56 #include <sys/systm.h> 57 #include <sys/buf.h> 58 #include <sys/bus.h> 59 #include <sys/kernel.h> 60 #include <sys/module.h> 61 #include <machine/bus.h> 62 63 #include "fdc.h" 64 #include "fdreg.h" 65 66 static void 67 fdctl_wr_pcmcia(fdc_p fdc, u_int8_t v) 68 { 69 bus_space_write_1(fdc->portt, fdc->porth, FDCTL+fdc->port_off, v); 70 } 71 72 static int 73 fdc_pccard_probe(device_t dev) 74 { 75 int error; 76 struct fdc_data *fdc; 77 78 fdc = device_get_softc(dev); 79 bzero(fdc, sizeof *fdc); 80 fdc->fdc_dev = dev; 81 fdc->fdctl_wr = fdctl_wr_pcmcia; 82 83 fdc->flags |= FDC_ISPCMCIA | FDC_NODMA; 84 85 /* Attempt to allocate our resources for the duration of the probe */ 86 error = fdc_alloc_resources(fdc); 87 if (error) 88 goto out; 89 90 /* First - lets reset the floppy controller */ 91 fdout_wr(fdc, 0); 92 DELAY(100); 93 fdout_wr(fdc, FDO_FRST); 94 95 /* see if it can handle a command */ 96 if (fd_cmd(fdc, 3, NE7CMD_SPECIFY, NE7_SPEC_1(3, 240), 97 NE7_SPEC_2(2, 0), 0)) { 98 error = ENXIO; 99 goto out; 100 } 101 102 device_set_desc(dev, "Y-E Data PCMCIA floppy"); 103 fdc->fdct = FDC_NE765; 104 105 out: 106 fdc_release_resources(fdc); 107 return (error); 108 } 109 110 static int 111 fdc_pccard_detach(device_t dev) 112 { 113 struct fdc_data *fdc; 114 int error; 115 116 fdc = device_get_softc(dev); 117 118 /* have our children detached first */ 119 if ((error = bus_generic_detach(dev))) 120 return (error); 121 122 if ((fdc->flags & FDC_ATTACHED) == 0) { 123 device_printf(dev, "already unloaded\n"); 124 return (0); 125 } 126 fdc->flags &= ~FDC_ATTACHED; 127 128 BUS_TEARDOWN_INTR(device_get_parent(dev), dev, fdc->res_irq, 129 fdc->fdc_intr); 130 fdc_release_resources(fdc); 131 device_printf(dev, "unload\n"); 132 return (0); 133 } 134 135 static device_method_t fdc_pccard_methods[] = { 136 /* Device interface */ 137 DEVMETHOD(device_probe, fdc_pccard_probe), 138 DEVMETHOD(device_attach, fdc_attach), 139 DEVMETHOD(device_detach, fdc_pccard_detach), 140 DEVMETHOD(device_shutdown, bus_generic_shutdown), 141 DEVMETHOD(device_suspend, bus_generic_suspend), 142 DEVMETHOD(device_resume, bus_generic_resume), 143 144 /* Bus interface */ 145 DEVMETHOD(bus_print_child, fdc_print_child), 146 DEVMETHOD(bus_read_ivar, fdc_read_ivar), 147 /* Our children never use any other bus interface methods. */ 148 149 { 0, 0 } 150 }; 151 152 static driver_t fdc_pccard_driver = { 153 "fdc", 154 fdc_pccard_methods, 155 sizeof(struct fdc_data) 156 }; 157 158 DRIVER_MODULE(fdc, pccard, fdc_pccard_driver, fdc_devclass, 0, 0); 159