diff options
author | marcel <marcel@FreeBSD.org> | 2008-04-26 18:40:59 +0000 |
---|---|---|
committer | marcel <marcel@FreeBSD.org> | 2008-04-26 18:40:59 +0000 |
commit | 883428f9dfde48d3bf455628e1b6624cb0d07b37 (patch) | |
tree | ca20d5371a6bb7561b78df7dfca0226950ae04a0 /sys/dev/scc | |
parent | 300a2381229dad74f8419cf1c6bffa99e4c6e1ad (diff) | |
download | FreeBSD-src-883428f9dfde48d3bf455628e1b6624cb0d07b37.zip FreeBSD-src-883428f9dfde48d3bf455628e1b6624cb0d07b37.tar.gz |
With rev 1.24 of sys/powerpc/powermac/macio.c, we now get a
total of 6 interrupt resources for scc(4) on macio(4). This
is 3 per channel, of which the 1st of each channel is the
interrupt associated with the SCC. The other 2 are for DMA
operation.
Change scc_bfe_attach() to accept an argument that's the
number of interrupts per channel (ipc) and change each bus
front-end (bfe) to pass that argument through a wrapper
for the device_attach method.
For now, we only allocate the 1st interrupt of each channel
to perserve behaviour.
Diffstat (limited to 'sys/dev/scc')
-rw-r--r-- | sys/dev/scc/scc_bfe.h | 2 | ||||
-rw-r--r-- | sys/dev/scc/scc_bfe_ebus.c | 9 | ||||
-rw-r--r-- | sys/dev/scc/scc_bfe_macio.c | 9 | ||||
-rw-r--r-- | sys/dev/scc/scc_bfe_quicc.c | 9 | ||||
-rw-r--r-- | sys/dev/scc/scc_bfe_sbus.c | 9 | ||||
-rw-r--r-- | sys/dev/scc/scc_core.c | 13 |
6 files changed, 44 insertions, 7 deletions
diff --git a/sys/dev/scc/scc_bfe.h b/sys/dev/scc/scc_bfe.h index 56d2bea0..d4f4155 100644 --- a/sys/dev/scc/scc_bfe.h +++ b/sys/dev/scc/scc_bfe.h @@ -138,7 +138,7 @@ struct scc_softc { extern devclass_t scc_devclass; extern char scc_driver_name[]; -int scc_bfe_attach(device_t dev); +int scc_bfe_attach(device_t dev, u_int ipc); int scc_bfe_detach(device_t dev); int scc_bfe_probe(device_t dev, u_int regshft, u_int rclk, u_int rid); diff --git a/sys/dev/scc/scc_bfe_ebus.c b/sys/dev/scc/scc_bfe_ebus.c index 2d4a9d8..17386db 100644 --- a/sys/dev/scc/scc_bfe_ebus.c +++ b/sys/dev/scc/scc_bfe_ebus.c @@ -64,10 +64,17 @@ scc_ebus_probe(device_t dev) return (ENXIO); } +static int +scc_ebus_attach(device_t dev) +{ + + return (scc_bfe_attach(dev, 0)); +} + static device_method_t scc_ebus_methods[] = { /* Device interface */ DEVMETHOD(device_probe, scc_ebus_probe), - DEVMETHOD(device_attach, scc_bfe_attach), + DEVMETHOD(device_attach, scc_ebus_attach), DEVMETHOD(device_detach, scc_bfe_detach), DEVMETHOD(bus_alloc_resource, scc_bus_alloc_resource), diff --git a/sys/dev/scc/scc_bfe_macio.c b/sys/dev/scc/scc_bfe_macio.c index c098595..1d7bf82 100644 --- a/sys/dev/scc/scc_bfe_macio.c +++ b/sys/dev/scc/scc_bfe_macio.c @@ -61,10 +61,17 @@ scc_macio_probe(device_t dev) return (ENXIO); } +static int +scc_macio_attach(device_t dev) +{ + + return (scc_bfe_attach(dev, 3)); +} + static device_method_t scc_macio_methods[] = { /* Device interface */ DEVMETHOD(device_probe, scc_macio_probe), - DEVMETHOD(device_attach, scc_bfe_attach), + DEVMETHOD(device_attach, scc_macio_attach), DEVMETHOD(device_detach, scc_bfe_detach), DEVMETHOD(bus_alloc_resource, scc_bus_alloc_resource), diff --git a/sys/dev/scc/scc_bfe_quicc.c b/sys/dev/scc/scc_bfe_quicc.c index 4dc7024..f92aa52 100644 --- a/sys/dev/scc/scc_bfe_quicc.c +++ b/sys/dev/scc/scc_bfe_quicc.c @@ -69,10 +69,17 @@ scc_quicc_probe(device_t dev) return (scc_bfe_probe(dev, 0, rclk, 0)); } +static int +scc_quicc_attach(device_t dev) +{ + + return (scc_bfe_attach(dev, 0)); +} + static device_method_t scc_quicc_methods[] = { /* Device interface */ DEVMETHOD(device_probe, scc_quicc_probe), - DEVMETHOD(device_attach, scc_bfe_attach), + DEVMETHOD(device_attach, scc_quicc_attach), DEVMETHOD(device_detach, scc_bfe_detach), DEVMETHOD(bus_alloc_resource, scc_bus_alloc_resource), diff --git a/sys/dev/scc/scc_bfe_sbus.c b/sys/dev/scc/scc_bfe_sbus.c index 2ce1e1e..8eb963f 100644 --- a/sys/dev/scc/scc_bfe_sbus.c +++ b/sys/dev/scc/scc_bfe_sbus.c @@ -61,10 +61,17 @@ scc_sbus_probe(device_t dev) return (ENXIO); } +static int +scc_sbus_attach(device_t dev) +{ + + return (scc_bfe_attach(dev, 0)); +} + static device_method_t scc_sbus_methods[] = { /* Device interface */ DEVMETHOD(device_probe, scc_sbus_probe), - DEVMETHOD(device_attach, scc_bfe_attach), + DEVMETHOD(device_attach, scc_sbus_attach), DEVMETHOD(device_detach, scc_bfe_detach), DEVMETHOD(bus_alloc_resource, scc_bus_alloc_resource), diff --git a/sys/dev/scc/scc_core.c b/sys/dev/scc/scc_core.c index 7f8ed91..76388ad 100644 --- a/sys/dev/scc/scc_core.c +++ b/sys/dev/scc/scc_core.c @@ -94,7 +94,7 @@ scc_bfe_intr(void *arg) } int -scc_bfe_attach(device_t dev) +scc_bfe_attach(device_t dev, u_int ipc) { struct resource_list_entry *rle; struct scc_chan *ch; @@ -144,9 +144,18 @@ scc_bfe_attach(device_t dev) M_SCC, M_WAITOK | M_ZERO); for (c = 0; c < cl->cl_channels; c++) { ch = &sc->sc_chan[c]; - ch->ch_irid = c; + /* + * XXX temporary hack. If we have more than 1 interrupt + * per channel, allocate the first for the channel. At + * this time only the macio bus front-end has more than + * 1 interrupt per channel and we don't use the 2nd and + * 3rd, because we don't support DMA yet. + */ + ch->ch_irid = c * ipc; ch->ch_ires = bus_alloc_resource_any(dev, SYS_RES_IRQ, &ch->ch_irid, RF_ACTIVE | RF_SHAREABLE); + if (ipc == 0) + break; } /* |