Exemple #1
0
static int
gusc_setup_intr(device_t dev, device_t child, struct resource *irq, int flags,
#if __FreeBSD_version >= 700031
		driver_filter_t *filter,
#endif
		driver_intr_t *intr, void *arg, void **cookiep)
{
	sc_p scp = (sc_p)device_get_softc(dev);
	devclass_t devclass;

#if __FreeBSD_version >= 700031
	if (filter != NULL) {
		printf("gusc.c: we cannot use a filter here\n");
		return (EINVAL);
	}
#endif
	devclass = device_get_devclass(child);
	if (strcmp(devclass_get_name(devclass), "midi") == 0) {
		scp->midi_intr.intr = intr;
		scp->midi_intr.arg = arg;
		return 0;
	} else if (strcmp(devclass_get_name(devclass), "pcm") == 0) {
		scp->pcm_intr.intr = intr;
		scp->pcm_intr.arg = arg;
		return 0;
	}
	return bus_generic_setup_intr(dev, child, irq, flags,
#if __FreeBSD_version >= 700031
				filter,
#endif
				intr, arg, cookiep);
}
Exemple #2
0
static int
simplebus_setup_intr(device_t bus, device_t child, struct resource *res,
                     int flags, driver_filter_t *filter, driver_intr_t *ihand, void *arg,
                     void **cookiep)
{
    struct simplebus_devinfo *di;
    enum intr_trigger trig;
    enum intr_polarity pol;
    int error, rid;

    di = device_get_ivars(child);
    if (di == NULL)
        return (ENXIO);

    if (res == NULL)
        return (EINVAL);

    rid = rman_get_rid(res);
    if (rid >= DI_MAX_INTR_NUM)
        return (ENOENT);

    trig = di->di_intr_sl[rid].trig;
    pol = di->di_intr_sl[rid].pol;
    if (trig != INTR_TRIGGER_CONFORM || pol != INTR_POLARITY_CONFORM) {
        error = bus_generic_config_intr(bus, rman_get_start(res),
                                        trig, pol);
        if (error)
            return (error);
    }

    error = bus_generic_setup_intr(bus, child, res, flags, filter, ihand,
                                   arg, cookiep);
    return (error);
}
Exemple #3
0
int
alpha_platform_pci_setup_intr(device_t dev, device_t child,
			      struct resource *irq,  int flags,
			      driver_intr_t *intr, void *arg,
			      void **cookiep)
{
#ifdef DEV_ISA
	/*
	 * XXX - If we aren't the resource manager for this IRQ, assume that
	 * it is actually handled by the ISA PIC.
	 */
	if(irq->r_rm != &irq_rman)
		return isa_setup_intr(dev, child, irq, flags, intr, arg,
				      cookiep);
	else
#endif
		return bus_generic_setup_intr(dev, child, irq, flags, intr,
					      arg, cookiep);
}
Exemple #4
0
static int
gusc_setup_intr(device_t dev, device_t child, struct resource *irq,
		int flags, driver_intr_t *intr, void *arg, void **cookiep)
{
	sc_p scp = (sc_p)device_get_softc(dev);
	devclass_t devclass;

	devclass = device_get_devclass(child);
	if (strcmp(devclass_get_name(devclass), "midi") == 0) {
		scp->midi_intr.intr = intr;
		scp->midi_intr.arg = arg;
		return 0;
	} else if (strcmp(devclass_get_name(devclass), "pcm") == 0) {
		scp->pcm_intr.intr = intr;
		scp->pcm_intr.arg = arg;
		return 0;
	}
	return bus_generic_setup_intr(dev, child, irq, flags, intr,
				      arg, cookiep, NULL, NULL);
}
Exemple #5
0
static int
sbus_setup_intr(device_t dev, device_t child, struct resource *ires, int flags,
                driver_filter_t *filt, driver_intr_t *intr, void *arg, void **cookiep)
{
    struct sbus_softc *sc;
    u_long vec;

    sc = device_get_softc(dev);
    /*
     * Make sure the vector is fully specified and we registered
     * our interrupt controller for it.
     */
    vec = rman_get_start(ires);
    if (INTIGN(vec) != sc->sc_ign || intr_vectors[vec].iv_ic != &sbus_ic) {
        device_printf(dev, "invalid interrupt vector 0x%lx\n", vec);
        return (EINVAL);
    }
    return (bus_generic_setup_intr(dev, child, ires, flags, filt, intr,
                                   arg, cookiep));
}
Exemple #6
0
int
fhc_setup_intr(device_t bus, device_t child, struct resource *r, int flags,
    driver_intr_t *func, void *arg, void **cookiep)
{
	struct fhc_softc *sc;
	struct fhc_clr *fc;
	int error;
	int rid;

	sc = device_get_softc(bus);
	rid = rman_get_rid(r);

	fc = malloc(sizeof(*fc), M_DEVBUF, M_WAITOK | M_ZERO);
	fc->fc_func = func;
	fc->fc_arg = arg;
	fc->fc_bt = sc->sc_bt[rid];
	fc->fc_bh = sc->sc_bh[rid];

	bus_space_write_4(sc->sc_bt[rid], sc->sc_bh[rid], FHC_IMAP,
	    r->r_start);
	bus_space_read_4(sc->sc_bt[rid], sc->sc_bh[rid], FHC_IMAP);

	error = bus_generic_setup_intr(bus, child, r, flags, fhc_intr_stub,
	    fc, cookiep);
	if (error != 0) {
		free(fc, M_DEVBUF);
		return (error);
	}
	fc->fc_cookie = *cookiep;
	*cookiep = fc;

	bus_space_write_4(sc->sc_bt[rid], sc->sc_bh[rid], FHC_ICLR, 0x0);
	bus_space_write_4(sc->sc_bt[rid], sc->sc_bh[rid], FHC_IMAP,
	    INTMAP_ENABLE(r->r_start, PCPU_GET(mid)));
	bus_space_read_4(sc->sc_bt[rid], sc->sc_bh[rid], FHC_IMAP);

	return (error);
}