PERFORCE change 123987 for review
Christopher Davis
loafier at FreeBSD.org
Tue Jul 24 00:35:16 UTC 2007
http://perforce.freebsd.org/chv.cgi?CH=123987
Change 123987 by loafier at chrisdsoc on 2007/07/24 00:34:33
Added sentinal to resource_spec arrays in aureal.c.
Used bus_alloc_resources, etc in cmi.c.
Haven't tried compiling either of these yet.
Affected files ...
.. //depot/projects/soc2007/loafier_busalloc/src/sys/dev/sound/pci/aureal.c#4 edit
.. //depot/projects/soc2007/loafier_busalloc/src/sys/dev/sound/pci/cmi.c#2 edit
Differences ...
==== //depot/projects/soc2007/loafier_busalloc/src/sys/dev/sound/pci/aureal.c#4 (text+ko) ====
@@ -76,12 +76,14 @@
static struct resource_spec au_res_spec_mem[] = {
{SYS_RES_MEMORY, PCIR_BAR(0), RF_ACTIVE},
- {SYS_RES_IRQ, 0, RF_ACTIVE | RF_SHARABLE}
+ {SYS_RES_IRQ, 0, RF_ACTIVE | RF_SHARABLE},
+ {-1, 0, 0}
};
static struct resource_spec au_res_spec_io[] = {
{SYS_RES_IOPORT, PCIR_BAR(0), RF_ACTIVE},
- {SYS_RES_IRQ, 0, RF_ACTIVE | RF_SHARABLE}
+ {SYS_RES_IRQ, 0, RF_ACTIVE | RF_SHARABLE},
+ {-1, 0, 0}
};
struct au_info {
==== //depot/projects/soc2007/loafier_busalloc/src/sys/dev/sound/pci/cmi.c#2 (text+ko) ====
@@ -100,14 +100,23 @@
int dir;
};
+enum {
+ RES_MEM,
+ RES_IRQ,
+ RES_SZ
+};
+
+static struct resource_spec cmi_res_spec[] = {
+ {SYS_RES_IOPORT, PCIR_BAR(0), RF_ACTIVE},
+ {SYS_RES_IRQ, 0, RF_ACTIVE | RF_SHARABLE},
+ {-1, 0, 0}
+};
+
struct sc_info {
device_t dev;
- bus_space_tag_t st;
- bus_space_handle_t sh;
bus_dma_tag_t parent_dmat;
- struct resource *reg, *irq;
- int regid, irqid;
+ struct resource *res[RES_SZ];
void *ih;
struct mtx *lock;
@@ -138,37 +147,13 @@
/* ------------------------------------------------------------------------- */
/* Register Utilities */
-static u_int32_t
-cmi_rd(struct sc_info *sc, int regno, int size)
-{
- switch (size) {
- case 1:
- return bus_space_read_1(sc->st, sc->sh, regno);
- case 2:
- return bus_space_read_2(sc->st, sc->sh, regno);
- case 4:
- return bus_space_read_4(sc->st, sc->sh, regno);
- default:
- DEB(printf("cmi_rd: failed 0x%04x %d\n", regno, size));
- return 0xFFFFFFFF;
- }
-}
+#define cmi_rd1(_sc, _reg) bus_read_1((_sc)->res[RES_MEM], _reg)
+#define cmi_rd2(_sc, _reg) bus_read_2((_sc)->res[RES_MEM], _reg)
+#define cmi_rd4(_sc, _reg) bus_read_4((_sc)->res[RES_MEM], _reg)
-static void
-cmi_wr(struct sc_info *sc, int regno, u_int32_t data, int size)
-{
- switch (size) {
- case 1:
- bus_space_write_1(sc->st, sc->sh, regno, data);
- break;
- case 2:
- bus_space_write_2(sc->st, sc->sh, regno, data);
- break;
- case 4:
- bus_space_write_4(sc->st, sc->sh, regno, data);
- break;
- }
-}
+#define cmi_wr1(_sc, _reg, _val) bus_write_1((_sc)->res[RES_MEM], _reg, _val)
+#define cmi_wr2(_sc, _reg, _val) bus_write_2((_sc)->res[RES_MEM], _reg, _val)
+#define cmi_wr4(_sc, _reg, _val) bus_write_4((_sc)->res[RES_MEM], _reg, _val)
static void
cmi_partial_wr4(struct sc_info *sc,
@@ -176,10 +161,10 @@
{
u_int32_t r;
- r = cmi_rd(sc, reg, 4);
+ r = cmi_rd4(sc, reg);
r &= ~(mask << shift);
r |= val << shift;
- cmi_wr(sc, reg, r, 4);
+ cmi_wr4(sc, reg, r);
}
static void
@@ -187,9 +172,9 @@
{
u_int32_t r;
- r = cmi_rd(sc, reg, 4);
+ r = cmi_rd4(sc, reg);
r &= ~mask;
- cmi_wr(sc, reg, r, 4);
+ cmi_wr4(sc, reg, r);
}
static void
@@ -197,9 +182,9 @@
{
u_int32_t r;
- r = cmi_rd(sc, reg, 4);
+ r = cmi_rd4(sc, reg);
r |= mask;
- cmi_wr(sc, reg, r, 4);
+ cmi_wr4(sc, reg, r);
}
/* ------------------------------------------------------------------------- */
@@ -250,14 +235,14 @@
ch->phys_buf = sndbuf_getbufaddr(ch->buffer);
- cmi_wr(sc, base, ch->phys_buf, 4);
+ cmi_wr4(sc, base, ch->phys_buf);
sz = (u_int32_t)sndbuf_getsize(ch->buffer);
s = sz / ch->bps - 1;
- cmi_wr(sc, base + 4, s, 2);
+ cmi_wr2(sc, base + 4, s);
i = sz / (ch->bps * CMI_INTR_PER_BUFFER) - 1;
- cmi_wr(sc, base + 6, i, 2);
+ cmi_wr2(sc, base + 6, i);
}
@@ -431,7 +416,7 @@
/* enable if req after rate change */
cmi_spdif_speed(ch->parent, speed);
}
- rsp = cmi_rd(ch->parent, CMPCI_REG_FUNC_1, 4);
+ rsp = cmi_rd4(ch->parent, CMPCI_REG_FUNC_1);
rsp >>= CMPCI_REG_DAC_FS_SHIFT;
rsp &= CMPCI_REG_DAC_FS_MASK;
} else {
@@ -440,7 +425,7 @@
CMPCI_REG_ADC_FS_SHIFT,
CMPCI_REG_ADC_FS_MASK,
r);
- rsp = cmi_rd(ch->parent, CMPCI_REG_FUNC_1, 4);
+ rsp = cmi_rd4(ch->parent, CMPCI_REG_FUNC_1);
rsp >>= CMPCI_REG_ADC_FS_SHIFT;
rsp &= CMPCI_REG_ADC_FS_MASK;
}
@@ -513,9 +498,9 @@
snd_mtxlock(sc->lock);
if (ch->dir == PCMDIR_PLAY) {
- physptr = cmi_rd(sc, CMPCI_REG_DMA0_BASE, 4);
+ physptr = cmi_rd4(sc, CMPCI_REG_DMA0_BASE);
} else {
- physptr = cmi_rd(sc, CMPCI_REG_DMA1_BASE, 4);
+ physptr = cmi_rd4(sc, CMPCI_REG_DMA1_BASE);
}
snd_mtxunlock(sc->lock);
@@ -533,7 +518,7 @@
u_int32_t toclear;
snd_mtxlock(sc->lock);
- intrstat = cmi_rd(sc, CMPCI_REG_INTR_STATUS, 4);
+ intrstat = cmi_rd4(sc, CMPCI_REG_INTR_STATUS);
if ((intrstat & CMPCI_REG_ANY_INTR) != 0) {
toclear = 0;
@@ -596,15 +581,15 @@
static void
cmimix_wr(struct sc_info *sc, u_int8_t port, u_int8_t val)
{
- cmi_wr(sc, CMPCI_REG_SBADDR, port, 1);
- cmi_wr(sc, CMPCI_REG_SBDATA, val, 1);
+ cmi_wr1(sc, CMPCI_REG_SBADDR, port);
+ cmi_wr1(sc, CMPCI_REG_SBDATA, val);
}
static u_int8_t
cmimix_rd(struct sc_info *sc, u_int8_t port)
{
- cmi_wr(sc, CMPCI_REG_SBADDR, port, 1);
- return (u_int8_t)cmi_rd(sc, CMPCI_REG_SBDATA, 1);
+ cmi_wr1(sc, CMPCI_REG_SBADDR, port);
+ return (u_int8_t)cmi_rd1(sc, CMPCI_REG_SBDATA);
}
struct sb16props {
@@ -677,11 +662,11 @@
if (cmt[dev].rreg == CMPCI_NON_SB16_CONTROL) {
/* For time being this can only be one thing (mic in
* mic/aux reg) */
- v = cmi_rd(sc, CMPCI_REG_AUX_MIC, 1) & 0xf0;
+ v = cmi_rd1(sc, CMPCI_REG_AUX_MIC) & 0xf0;
l = left * max / 100;
/* 3 bit gain with LSB MICGAIN off(1),on(1) -> 4 bit value */
v |= ((l << 1) | (~l >> 3)) & 0x0f;
- cmi_wr(sc, CMPCI_REG_AUX_MIC, v, 1);
+ cmi_wr1(sc, CMPCI_REG_AUX_MIC, v);
return 0;
}
@@ -898,6 +883,24 @@
sc->mpu_intr = 0;
}
+static void
+cmi_destroy(device_t dev, sc_info *sc)
+{
+ if (!sc)
+ return;
+
+ if (sc->parent_dmat)
+ bus_dma_tag_destroy(sc->parent_dmat);
+ if (sc->ih)
+ bus_teardown_intr(dev, sc->res[RES_IRQ], sc->ih);
+ bus_release_resources(dev, sc->res, cmi_res_spec);
+ if (sc->lock)
+ snd_mtxfree(sc->lock);
+
+ free(sc, M_DEVBUF);
+}
+
+
/* ------------------------------------------------------------------------- */
/* Bus and device registration */
static int
@@ -925,35 +928,28 @@
cmi_attach(device_t dev)
{
struct sc_info *sc;
- u_int32_t data;
char status[SND_STATUSLEN];
sc = malloc(sizeof(*sc), M_DEVBUF, M_WAITOK | M_ZERO);
+ if (!sc) {
+ device_printf(dev, "cannot allocate softc\n");
+ return ENXIO;
+ }
+
sc->lock = snd_mtxcreate(device_get_nameunit(dev), "snd_cmi softc");
- data = pci_read_config(dev, PCIR_COMMAND, 2);
- data |= (PCIM_CMD_PORTEN|PCIM_CMD_BUSMASTEREN);
- pci_write_config(dev, PCIR_COMMAND, data, 2);
- data = pci_read_config(dev, PCIR_COMMAND, 2);
+ pci_enable_busmaster(dev);
+ pci_enable_io(dev, SYS_RES_IOPORT);
sc->dev = dev;
- sc->regid = PCIR_BAR(0);
- sc->reg = bus_alloc_resource_any(dev, SYS_RES_IOPORT, &sc->regid,
- RF_ACTIVE);
- if (!sc->reg) {
- device_printf(dev, "cmi_attach: Cannot allocate bus resource\n");
+
+ if (bus_alloc_resources(dev, sc->res, cmi_res_spec) != 0)
goto bad;
- }
- sc->st = rman_get_bustag(sc->reg);
- sc->sh = rman_get_bushandle(sc->reg);
if (0)
cmi_midiattach(sc);
- sc->irqid = 0;
- sc->irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &sc->irqid,
- RF_ACTIVE | RF_SHAREABLE);
- if (!sc->irq ||
- snd_setup_intr(dev, sc->irq, INTR_MPSAFE, cmi_intr, sc, &sc->ih)) {
+ if (snd_setup_intr(dev, sc->res[RES_IRQ],
+ INTR_MPSAFE, cmi_intr, sc, &sc->ih)) {
device_printf(dev, "cmi_attach: Unable to map interrupt\n");
goto bad;
}
@@ -990,25 +986,16 @@
pcm_addchan(dev, PCMDIR_REC, &cmichan_class, sc);
snprintf(status, SND_STATUSLEN, "at io 0x%lx irq %ld %s",
- rman_get_start(sc->reg), rman_get_start(sc->irq),PCM_KLDSTRING(snd_cmi));
+ rman_get_start(sc->res[RES_MEM]),
+ rman_get_start(sc->res[RES_IRQ]),
+ PCM_KLDSTRING(snd_cmi));
pcm_setstatus(dev, status);
DEB(printf("cmi_attach: succeeded\n"));
return 0;
bad:
- if (sc->parent_dmat)
- bus_dma_tag_destroy(sc->parent_dmat);
- 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, SYS_RES_IOPORT, sc->regid, sc->reg);
- if (sc->lock)
- snd_mtxfree(sc->lock);
- if (sc)
- free(sc, M_DEVBUF);
+ cmi_destroy(dev, sc);
return ENXIO;
}
@@ -1026,17 +1013,12 @@
cmi_uninit(sc);
cmi_power(sc, 3);
- bus_dma_tag_destroy(sc->parent_dmat);
- bus_teardown_intr(dev, sc->irq, sc->ih);
- bus_release_resource(dev, SYS_RES_IRQ, sc->irqid, sc->irq);
if(sc->mpu)
mpu401_uninit(sc->mpu);
- bus_release_resource(dev, SYS_RES_IOPORT, sc->regid, sc->reg);
if (sc->mpu_reg)
bus_release_resource(dev, SYS_RES_IOPORT, sc->mpu_regid, sc->mpu_reg);
- snd_mtxfree(sc->lock);
- free(sc, M_DEVBUF);
+ cmi_destroy(dev, sc);
return 0;
}
More information about the p4-projects
mailing list