PERFORCE change 121149 for review
Rui Paulo
rpaulo at FreeBSD.org
Thu Jun 7 11:18:05 UTC 2007
http://perforce.freebsd.org/chv.cgi?CH=121149
Change 121149 by rpaulo at rpaulo_epsilon on 2007/06/07 11:17:05
Adapt interrupts to INTR_FILTER compile time variable.
sc_mtx is now a spin lock mutex again.
While there, make asmc_sms_intr() return a proper value.
Discussed with: Attilio Rao
Affected files ...
.. //depot/projects/soc2007/rpaulo-macbook/dev/asmc/asmc.c#12 edit
Differences ...
==== //depot/projects/soc2007/rpaulo-macbook/dev/asmc/asmc.c#12 (text+ko) ====
@@ -23,7 +23,7 @@
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
- * $P4: //depot/projects/soc2007/rpaulo-macbook/dev/asmc/asmc.c#11 $
+ * $P4: //depot/projects/soc2007/rpaulo-macbook/dev/asmc/asmc.c#12 $
*
*/
@@ -77,7 +77,12 @@
static int asmc_temp_getvalue(device_t, const char *);
static int asmc_sms_read(device_t, const char *, int16_t *);
static void asmc_sms_calibrate(device_t);
+#ifdef INTR_FILTER
static int asmc_sms_intr(void *);
+#else
+static void asmc_sms_fastintr(void *);
+#endif
+static void asmc_sms_printintr(device_t, uint8_t);
/*
* Model functions.
@@ -238,7 +243,7 @@
model = asmc_match(dev);
- mtx_init(&sc->sc_mtx, "asmc", NULL, MTX_DEF);
+ mtx_init(&sc->sc_mtx, "asmc", NULL, MTX_SPIN);
asmc_init(dev);
@@ -373,9 +378,15 @@
goto out;
}
+#ifdef INTR_FILTER
error = bus_setup_intr(dev, sc->sc_res,
- INTR_TYPE_MISC|INTR_MPSAFE|INTR_EXCL,
+ INTR_TYPE_MISC|INTR_MPSAFE,
asmc_sms_intr, NULL, dev, &sc->sc_cookie);
+#else
+ error = bus_setup_intr(dev, sc->sc_res,
+ INTR_TYPE_MISC|INTR_MPSAFE|INTR_FAST,
+ NULL, asmc_sms_fastintr, dev, &sc->sc_cookie);
+#endif
if (error) {
device_printf(dev, "unable to setup SMS IRQ\n");
bus_release_resource(dev, SYS_RES_IRQ, sc->sc_rid,
@@ -515,7 +526,7 @@
int i, error = 1;
struct asmc_softc *sc = device_get_softc(dev);
- mtx_lock(&sc->sc_mtx);
+ mtx_lock_spin(&sc->sc_mtx);
outb(ASMC_CMDPORT, ASMC_CMDREAD);
if (asmc_wait(dev, 0x0c))
@@ -537,7 +548,7 @@
error = 0;
out:
- mtx_unlock(&sc->sc_mtx);
+ mtx_unlock_spin(&sc->sc_mtx);
return error;
}
@@ -548,7 +559,7 @@
int i, error = -1;
struct asmc_softc *sc = device_get_softc(dev);
- mtx_lock(&sc->sc_mtx);
+ mtx_lock_spin(&sc->sc_mtx);
outb(ASMC_CMDPORT, ASMC_CMDWRITE);
if (asmc_wait(dev, 0x0c))
@@ -570,7 +581,7 @@
error = 0;
out:
- mtx_unlock(&sc->sc_mtx);
+ mtx_unlock_spin(&sc->sc_mtx);
return error;
@@ -749,6 +760,7 @@
asmc_sms_read(dev, ASMC_KEY_SMS_Z, &sc->sms_rest_z);
}
+#ifdef INTR_FILTER
static int
asmc_sms_intr(void *arg)
{
@@ -756,9 +768,33 @@
device_t dev = (device_t) arg;
struct asmc_softc *sc = device_get_softc(dev);
- mtx_lock(&sc->sc_mtx);
+ mtx_lock_spin(&sc->sc_mtx);
+ type = inb(ASMC_INTPORT);
+ mtx_unlock_spin(&sc->sc_mtx);
+
+ asmc_sms_printintr(dev, type);
+
+ return FILTER_HANDLED;
+}
+#else
+static void
+asmc_sms_fastintr(void *arg)
+{
+ uint8_t type;
+ device_t dev = (device_t) arg;
+ struct asmc_softc *sc = device_get_softc(dev);
+
+ mtx_lock_spin(&sc->sc_mtx);
type = inb(ASMC_INTPORT);
- mtx_unlock(&sc->sc_mtx);
+ mtx_unlock_spin(&sc->sc_mtx);
+
+ asmc_sms_printintr(dev, type);
+}
+#endif /* INTR_FILTER */
+
+static void
+asmc_sms_printintr(device_t dev, uint8_t type)
+{
switch (type) {
case ASMC_SMS_INTFF:
@@ -773,8 +809,6 @@
default:
device_printf(dev, "%s unknown interrupt\n", __func__);
}
-
- return 0;
}
static int
More information about the p4-projects
mailing list