2 * Copyright (c) 1991 The Regents of the University of California.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * 3. All advertising materials mentioning features or use of this software
14 * must display the following acknowledgement:
15 * This product includes software developed by the University of
16 * California, Berkeley and its contributors.
17 * 4. Neither the name of the University nor the names of its contributors
18 * may be used to endorse or promote products derived from this software
19 * without specific prior written permission.
21 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33 * $DragonFly: src/sys/dev/serial/sio/sio_pccard.c,v 1.8 2007/08/07 11:30:03 hasso Exp $
35 #include <sys/param.h>
36 #include <sys/systm.h>
39 #include <sys/module.h>
40 #include <sys/kernel.h>
43 #include <sys/timepps.h>
46 #include "sio_private.h"
48 #include <bus/pccard/pccard_cis.h>
49 #include <bus/pccard/pccarddevs.h>
50 #include <bus/pccard/pccardreg.h>
51 #include <bus/pccard/pccardvar.h>
53 static int sio_pccard_attach(device_t dev
);
54 static int sio_pccard_match(device_t self
);
55 static int sio_pccard_detach(device_t dev
);
56 static int sio_pccard_probe(device_t dev
);
58 static device_method_t sio_pccard_methods
[] = {
59 /* Device interface */
60 DEVMETHOD(device_probe
, pccard_compat_probe
),
61 DEVMETHOD(device_attach
, pccard_compat_attach
),
62 DEVMETHOD(device_detach
, sio_pccard_detach
),
65 DEVMETHOD(card_compat_match
, sio_pccard_match
),
66 DEVMETHOD(card_compat_probe
, sio_pccard_probe
),
67 DEVMETHOD(card_compat_attach
, sio_pccard_attach
),
72 static driver_t sio_pccard_driver
= {
79 sio_pccard_match(device_t dev
)
81 u_int32_t fcn
= PCCARD_FUNCTION_UNSPEC
;
83 fcn
= pccard_get_function(dev
);
85 * If a serial card, we are likely the right driver. However,
86 * some serial cards are better servered by other drivers, so
87 * allow other drivers to claim it, if they want.
89 if (fcn
== PCCARD_FUNCTION_SERIAL
)
96 sio_pccard_probe(device_t dev
)
98 /* Do not probe IRQ - pccard doesn't turn on the interrupt line */
99 /* until bus_setup_intr */
100 SET_FLAG(dev
, COM_C_NOPROBE
);
102 return (sioprobe(dev
, 0, 0UL));
106 sio_pccard_attach(device_t dev
)
108 return (sioattach(dev
, 0, 0UL));
112 * sio_detach - unload the driver and clear the table.
114 * This is usually called when the card is ejected, but
115 * can be caused by a modunload of a controller driver.
116 * The idea is to reset the driver's view of the device
117 * and ensure that any driver entry points such as
118 * read and write do not hang.
121 sio_pccard_detach(device_t dev
)
125 com
= (struct com_s
*) device_get_softc(dev
);
127 device_printf(dev
, "NULL com in siounload\n");
132 bus_teardown_intr(dev
, com
->irqres
, com
->cookie
);
133 bus_release_resource(dev
, SYS_RES_IRQ
, 0, com
->irqres
);
136 bus_release_resource(dev
, SYS_RES_IOPORT
, 0, com
->ioportres
);
137 if (com
->tp
&& (com
->tp
->t_state
& TS_ISOPEN
)) {
138 device_printf(dev
, "still open, forcing close\n");
143 if (com
->ibuf
!= NULL
)
144 kfree(com
->ibuf
, M_DEVBUF
);
146 device_printf(dev
, "unloaded\n");
150 DRIVER_MODULE(sio
, pccard
, sio_pccard_driver
, sio_devclass
, 0, 0);