PERFORCE change 124157 for review
Christopher Davis
loafier at FreeBSD.org
Fri Jul 27 05:47:11 UTC 2007
http://perforce.freebsd.org/chv.cgi?CH=124157
Change 124157 by loafier at chrisdsoc on 2007/07/27 05:47:09
Use bus_alloc_resources, etc in maestro3 driver.
Affected files ...
.. //depot/projects/soc2007/loafier_busalloc/src/sys/dev/sound/pci/maestro3.c#2 edit
Differences ...
==== //depot/projects/soc2007/loafier_busalloc/src/sys/dev/sound/pci/maestro3.c#2 (text+ko) ====
@@ -123,6 +123,24 @@
u_int32_t prevptr;
};
+enum {
+ RES_MEM,
+ RES_IRQ,
+ RES_SZ
+};
+
+static struct resource_spec m3_res_spec_io[] = {
+ {SYS_RES_IOPORT, PCIR_BAR(0), RF_ACTIVE},
+ {SYS_RES_IRQ, 0, RF_ACTIVE | RF_SHAREABLE},
+ {-1, 0, 0}
+};
+
+static struct resource_spec m3_res_spec_mem[] = {
+ {SYS_RES_MEMORY, PCIR_BAR(0), RF_ACTIVE},
+ {SYS_RES_IRQ, 0, RF_ACTIVE | RF_SHAREABLE},
+ {-1, 0, 0}
+};
+
struct sc_info {
device_t dev;
u_int32_t type;
@@ -130,15 +148,10 @@
int delay1;
int delay2;
- bus_space_tag_t st;
- bus_space_handle_t sh;
bus_dma_tag_t parent_dmat;
- struct resource *reg;
- struct resource *irq;
- int regtype;
- int regid;
- int irqid;
+ struct resource *res[RES_SZ];
+ struct resource_spec *spec;
void *ih;
struct sc_pchinfo pch[M3_PCHANS];
@@ -260,12 +273,12 @@
/* -------------------------------------------------------------------- */
/* some i/o convenience functions */
-#define m3_rd_1(sc, regno) bus_space_read_1(sc->st, sc->sh, regno)
-#define m3_rd_2(sc, regno) bus_space_read_2(sc->st, sc->sh, regno)
-#define m3_rd_4(sc, regno) bus_space_read_4(sc->st, sc->sh, regno)
-#define m3_wr_1(sc, regno, data) bus_space_write_1(sc->st, sc->sh, regno, data)
-#define m3_wr_2(sc, regno, data) bus_space_write_2(sc->st, sc->sh, regno, data)
-#define m3_wr_4(sc, regno, data) bus_space_write_4(sc->st, sc->sh, regno, data)
+#define m3_rd_1(sc, regno) bus_read_1((sc)->res[RES_MEM], regno)
+#define m3_rd_2(sc, regno) bus_read_2((sc)->res[RES_MEM], regno)
+#define m3_rd_4(sc, regno) bus_read_4((sc)->res[RES_MEM], regno)
+#define m3_wr_1(sc, regno, data) bus_write_1((sc)->res[RES_MEM], regno, data)
+#define m3_wr_2(sc, regno, data) bus_write_2((sc)->res[RES_MEM], regno, data)
+#define m3_wr_4(sc, regno, data) bus_write_4((sc)->res[RES_MEM], regno, data)
#define m3_rd_assp_code(sc, index) \
m3_rd_assp(sc, MEMTYPE_INTERNAL_CODE, index)
#define m3_wr_assp_code(sc, index, data) \
@@ -1234,6 +1247,22 @@
return 0;
}
+static void
+m3_destroy(device_t dev, struct sc_info *sc)
+{
+ if (!sc)
+ return;
+
+ if (sc->ih)
+ bus_teardown_intr(dev, sc->res[RES_IRQ], sc->ih);
+ bus_release_resources(dev, sc->spec, sc->res);
+ if (sc->parent_dmat)
+ bus_dma_tag_destroy(sc->parent_dmat);
+ if (sc->sc_lock)
+ snd_mtxfree(sc->sc_lock);
+ free(sc, M_DEVBUF);
+}
+
/* -------------------------------------------------------------------- */
/* Probe and attach the card */
@@ -1258,10 +1287,10 @@
{
struct sc_info *sc;
struct ac97_info *codec = NULL;
- u_int32_t data;
char status[SND_STATUSLEN];
struct m3_card_type *card;
int i, len, dacn, adcn;
+ int mapped = 0;
M3_DEBUG(CALL, ("m3_pci_attach\n"));
@@ -1292,35 +1321,25 @@
adcn = M3_RCHANS;
- data = pci_read_config(dev, PCIR_COMMAND, 2);
- data |= (PCIM_CMD_PORTEN | PCIM_CMD_MEMEN | PCIM_CMD_BUSMASTEREN);
- pci_write_config(dev, PCIR_COMMAND, data, 2);
+ pci_enable_busmaster(dev);
- sc->regid = PCIR_BAR(0);
- sc->regtype = SYS_RES_MEMORY;
- sc->reg = bus_alloc_resource_any(dev, sc->regtype, &sc->regid,
- RF_ACTIVE);
- if (!sc->reg) {
- sc->regtype = SYS_RES_IOPORT;
- sc->reg = bus_alloc_resource_any(dev, sc->regtype, &sc->regid,
- RF_ACTIVE);
+ if (mapped == 0 && pci_enable_io(dev, SYS_RES_MEMORY) == 0) {
+ sc->spec = m3_res_spec_mem;
+ if (bus_alloc_resources(dev, sc->spec, sc->res) == 0)
+ mapped = 1;
}
- if (!sc->reg) {
- device_printf(dev, "unable to allocate register space\n");
- goto bad;
+ if (mapped == 0 && pci_enable_io(dev, SYS_RES_IOPORT) == 0) {
+ sc->spec = m3_res_spec_io;
+ if (bus_alloc_resources(dev, sc->spec, sc->res) == 0)
+ mapped = 1;
}
- sc->st = rman_get_bustag(sc->reg);
- sc->sh = rman_get_bushandle(sc->reg);
-
- sc->irqid = 0;
- sc->irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &sc->irqid,
- RF_ACTIVE | RF_SHAREABLE);
- if (!sc->irq) {
- device_printf(dev, "unable to allocate interrupt\n");
+ if (mapped == 0) {
+ device_printf(dev, "unable to allocate resources\n");
goto bad;
}
- if (snd_setup_intr(dev, sc->irq, INTR_MPSAFE, m3_intr, sc, &sc->ih)) {
+ if (snd_setup_intr(dev, sc->res[RES_IRQ], INTR_MPSAFE,
+ m3_intr, sc, &sc->ih)) {
device_printf(dev, "unable to setup interrupt\n");
goto bad;
}
@@ -1385,8 +1404,9 @@
}
}
snprintf(status, SND_STATUSLEN, "at %s 0x%lx irq %ld %s",
- (sc->regtype == SYS_RES_IOPORT)? "io" : "memory",
- rman_get_start(sc->reg), rman_get_start(sc->irq),
+ (sc->spec == m3_res_spec_io)? "io" : "memory",
+ rman_get_start(sc->res[RES_MEM]),
+ rman_get_start(sc->res[RES_IRQ]),
PCM_KLDSTRING(snd_maestro3));
if (pcm_setstatus(dev, status)) {
device_printf(dev, "attach: pcm_setstatus error\n");
@@ -1405,17 +1425,8 @@
bad:
if (codec)
ac97_destroy(codec);
- if (sc->ih)
- bus_teardown_intr(dev, sc->irq, sc->ih);
- if (sc->irq)
- bus_release_resource(dev, SYS_RES_IRQ, sc->irqid, sc->irq);
- if (sc->reg)
- bus_release_resource(dev, sc->regtype, sc->regid, sc->reg);
- if (sc->parent_dmat)
- bus_dma_tag_destroy(sc->parent_dmat);
- if (sc->sc_lock)
- snd_mtxfree(sc->sc_lock);
- free(sc, M_DEVBUF);
+ m3_destroy(dev, sc);
+
return ENXIO;
}
@@ -1436,14 +1447,8 @@
m3_power(sc, 3); /* power off */
M3_UNLOCK(sc);
- bus_teardown_intr(dev, sc->irq, sc->ih);
- bus_release_resource(dev, SYS_RES_IRQ, sc->irqid, sc->irq);
- bus_release_resource(dev, sc->regtype, sc->regid, sc->reg);
- bus_dma_tag_destroy(sc->parent_dmat);
+ m3_destroy(dev, sc);
- free(sc->savemem, M_DEVBUF);
- snd_mtxfree(sc->sc_lock);
- free(sc, M_DEVBUF);
return 0;
}
More information about the p4-projects
mailing list