PERFORCE change 124267 for review
Christopher Davis
loafier at FreeBSD.org
Sat Jul 28 15:47:54 UTC 2007
http://perforce.freebsd.org/chv.cgi?CH=124267
Change 124267 by loafier at chrisdsoc on 2007/07/28 15:47:18
Edit for bus_alloc_resources(), etc
Affected files ...
.. //depot/projects/soc2007/loafier_busalloc/src/sys/dev/sound/pci/via82c686.c#2 edit
Differences ...
==== //depot/projects/soc2007/loafier_busalloc/src/sys/dev/sound/pci/via82c686.c#2 (text+ko) ====
@@ -68,16 +68,25 @@
int base, count, mode, ctrl;
};
+enum {
+ RES_MEM,
+ RES_IRQ,
+ RES_SZ
+};
+
+static struct resource_spec via_res_spec[] = {
+ {SYS_RES_IOPORT, PCIR_BAR(0), RF_ACTIVE},
+ {SYS_RES_IRQ, 0, RF_ACTIVE | RF_SHAREABLE},
+ {-1, 0, 0}
+};
+
struct via_info {
- bus_space_tag_t st;
- bus_space_handle_t sh;
bus_dma_tag_t parent_dmat;
bus_dma_tag_t sgd_dmat;
bus_dmamap_t sgd_dmamap;
bus_addr_t sgd_addr;
- struct resource *reg, *irq;
- int regid, irqid;
+ struct resource *res[RES_SZ];
void *ih;
struct ac97_info *codec;
@@ -99,40 +108,13 @@
static struct pcmchan_caps via_vracaps = {4000, 48000, via_fmt, 0};
static struct pcmchan_caps via_caps = {48000, 48000, via_fmt, 0};
-static __inline u_int32_t
-via_rd(struct via_info *via, int regno, int size)
-{
-
- switch (size) {
- case 1:
- return bus_space_read_1(via->st, via->sh, regno);
- case 2:
- return bus_space_read_2(via->st, via->sh, regno);
- case 4:
- return bus_space_read_4(via->st, via->sh, regno);
- default:
- return 0xFFFFFFFF;
- }
-}
+#define via_rd1(_sc, _reg) bus_read_1((_sc)->res[RES_MEM], _reg)
+#define via_rd2(_sc, _reg) bus_read_2((_sc)->res[RES_MEM], _reg)
+#define via_rd4(_sc, _reg) bus_read_4((_sc)->res[RES_MEM], _reg)
+#define via_wr1(_sc, _reg, _val) bus_write_1((_sc)->res[RES_MEM], _reg, _val)
+#define via_wr2(_sc, _reg, _val) bus_write_2((_sc)->res[RES_MEM], _reg, _val)
+#define via_wr4(_sc, _reg, _val) bus_write_4((_sc)->res[RES_MEM], _reg, _val)
-
-static __inline void
-via_wr(struct via_info *via, int regno, u_int32_t data, int size)
-{
-
- switch (size) {
- case 1:
- bus_space_write_1(via->st, via->sh, regno, data);
- break;
- case 2:
- bus_space_write_2(via->st, via->sh, regno, data);
- break;
- case 4:
- bus_space_write_4(via->st, via->sh, regno, data);
- break;
- }
-}
-
/* -------------------------------------------------------------------- */
/* Codec interface */
@@ -143,7 +125,7 @@
/* poll until codec not busy */
for (i = 0; (i < TIMEOUT) &&
- (via_rd(via, VIA_CODEC_CTL, 4) & VIA_CODEC_BUSY); i++)
+ (via_rd4(via, VIA_CODEC_CTL) & VIA_CODEC_BUSY); i++)
DELAY(1);
if (i >= TIMEOUT) {
printf("via: codec busy\n");
@@ -161,7 +143,7 @@
/* poll until codec valid */
for (i = 0; (i < TIMEOUT) &&
- !(via_rd(via, VIA_CODEC_CTL, 4) & VIA_CODEC_PRIVALID); i++)
+ !(via_rd4(via, VIA_CODEC_CTL) & VIA_CODEC_PRIVALID); i++)
DELAY(1);
if (i >= TIMEOUT) {
printf("via: codec invalid\n");
@@ -179,7 +161,7 @@
if (via_waitready_codec(via)) return -1;
- via_wr(via, VIA_CODEC_CTL, VIA_CODEC_PRIVALID | VIA_CODEC_INDEX(reg) | val, 4);
+ via_wr4(via, VIA_CODEC_CTL, VIA_CODEC_PRIVALID | VIA_CODEC_INDEX(reg) | val);
return 0;
}
@@ -193,7 +175,8 @@
if (via_waitready_codec(via))
return -1;
- via_wr(via, VIA_CODEC_CTL, VIA_CODEC_PRIVALID | VIA_CODEC_READ | VIA_CODEC_INDEX(reg),4);
+ via_wr4(via, VIA_CODEC_CTL,
+ VIA_CODEC_PRIVALID | VIA_CODEC_READ | VIA_CODEC_INDEX(reg));
if (via_waitready_codec(via))
return -1;
@@ -201,7 +184,7 @@
if (via_waitvalid_codec(via))
return -1;
- return via_rd(via, VIA_CODEC_CTL, 2);
+ return via_rd2(via, VIA_CODEC_CTL);
}
static kobj_method_t via_ac97_methods[] = {
@@ -291,10 +274,10 @@
DEB(printf("set format: dir = %d, format=%x\n", ch->dir, format));
snd_mtxlock(via->lock);
- mode = via_rd(via, ch->mode, 1);
+ mode = via_rd1(via, ch->mode);
mode &= ~(VIA_RPMODE_16BIT | VIA_RPMODE_STEREO);
mode |= mode_set;
- via_wr(via, ch->mode, mode, 1);
+ via_wr1(via, ch->mode, mode);
snd_mtxunlock(via->lock);
return 0;
@@ -351,10 +334,10 @@
snd_mtxlock(via->lock);
if (go == PCMTRIG_START) {
via_buildsgdt(ch);
- via_wr(via, ch->base, sgd_addr, 4);
- via_wr(via, ch->ctrl, VIA_RPCTRL_START, 1);
+ via_wr4(via, ch->base, sgd_addr);
+ via_wr1(via, ch->ctrl, VIA_RPCTRL_START);
} else
- via_wr(via, ch->ctrl, VIA_RPCTRL_TERMINATE, 1);
+ via_wr1(via, ch->ctrl, VIA_RPCTRL_TERMINATE);
snd_mtxunlock(via->lock);
DEB(printf("viachan_trigger: go=%d\n", go));
@@ -372,11 +355,11 @@
ado = ch->sgd_table;
snd_mtxlock(via->lock);
- base1 = via_rd(via, ch->base, 4);
- len = via_rd(via, ch->count, 4);
- base = via_rd(via, ch->base, 4);
+ base1 = via_rd4(via, ch->base);
+ len = via_rd4(via, ch->count);
+ base = via_rd4(via, ch->base);
if (base != base1) /* Avoid race hazard */
- len = via_rd(via, ch->count, 4);
+ len = via_rd4(via, ch->count);
snd_mtxunlock(via->lock);
DEB(printf("viachan_getptr: len / base = %x / %x\n", len, base));
@@ -431,16 +414,16 @@
/* DEB(printf("viachan_intr\n")); */
/* Read channel */
snd_mtxlock(via->lock);
- if (via_rd(via, VIA_PLAY_STAT, 1) & VIA_RPSTAT_INTR) {
- via_wr(via, VIA_PLAY_STAT, VIA_RPSTAT_INTR, 1);
+ if (via_rd1(via, VIA_PLAY_STAT) & VIA_RPSTAT_INTR) {
+ via_wr1(via, VIA_PLAY_STAT, VIA_RPSTAT_INTR);
snd_mtxunlock(via->lock);
chn_intr(via->pch.channel);
snd_mtxlock(via->lock);
}
/* Write channel */
- if (via_rd(via, VIA_RECORD_STAT, 1) & VIA_RPSTAT_INTR) {
- via_wr(via, VIA_RECORD_STAT, VIA_RPSTAT_INTR, 1);
+ if (via_rd1(via, VIA_RECORD_STAT) & VIA_RPSTAT_INTR) {
+ via_wr1(via, VIA_RECORD_STAT, VIA_RPSTAT_INTR);
snd_mtxunlock(via->lock);
chn_intr(via->rch.channel);
return;
@@ -469,6 +452,27 @@
via->sgd_addr = bds->ds_addr;
}
+static void
+via_destroy(device_t dev, struct via_info *via)
+{
+ if (!via)
+ return;
+
+ if (via->ih)
+ bus_teardown_intr(dev, via->res[RES_IRQ], via->ih);
+ bus_release_resources(dev, via_res_spec, via->res);
+ if (via->parent_dmat)
+ bus_dma_tag_destroy(via->parent_dmat);
+ if (via->sgd_dmamap)
+ bus_dmamap_unload(via->sgd_dmat, via->sgd_dmamap);
+ if (via->sgd_table)
+ bus_dmamem_free(via->sgd_dmat, via->sgd_table, via->sgd_dmamap);
+ if (via->sgd_dmat)
+ bus_dma_tag_destroy(via->sgd_dmat);
+ if (via->lock)
+ snd_mtxfree(via->lock);
+ free(via, M_DEVBUF);
+}
static int
via_attach(device_t dev)
@@ -518,28 +522,21 @@
DELAY(5000);
}
- via->regid = PCIR_BAR(0);
- via->reg = bus_alloc_resource_any(dev, SYS_RES_IOPORT,
- &via->regid, RF_ACTIVE);
- if (!via->reg) {
- device_printf(dev, "cannot allocate bus resource.");
+ if (bus_alloc_resources(dev, via_res_spec, via->res) != 0) {
+ device_printf(dev, "unable to allocate resources\n");
goto bad;
}
- via->st = rman_get_bustag(via->reg);
- via->sh = rman_get_bushandle(via->reg);
via->bufsz = pcm_getbuffersize(dev, 4096, VIA_DEFAULT_BUFSZ, 65536);
- via->irqid = 0;
- via->irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &via->irqid,
- RF_ACTIVE | RF_SHAREABLE);
- if (!via->irq || snd_setup_intr(dev, via->irq, INTR_MPSAFE, via_intr, via, &via->ih)) {
+ if (snd_setup_intr(dev, via->res[RES_IRQ], INTR_MPSAFE,
+ via_intr, via, &via->ih)) {
device_printf(dev, "unable to map interrupt\n");
goto bad;
}
- via_wr(via, VIA_PLAY_MODE, VIA_RPMODE_AUTOSTART | VIA_RPMODE_INTR_FLAG | VIA_RPMODE_INTR_EOL, 1);
- via_wr(via, VIA_RECORD_MODE, VIA_RPMODE_AUTOSTART | VIA_RPMODE_INTR_FLAG | VIA_RPMODE_INTR_EOL, 1);
+ via_wr1(via, VIA_PLAY_MODE, VIA_RPMODE_AUTOSTART | VIA_RPMODE_INTR_FLAG | VIA_RPMODE_INTR_EOL);
+ via_wr1(via, VIA_RECORD_MODE, VIA_RPMODE_AUTOSTART | VIA_RPMODE_INTR_FLAG | VIA_RPMODE_INTR_EOL);
via->codec = AC97_CREATE(dev, via, via_ac97);
if (!via->codec)
@@ -591,7 +588,8 @@
goto bad;
snprintf(status, SND_STATUSLEN, "at io 0x%lx irq %ld %s",
- rman_get_start(via->reg), rman_get_start(via->irq),
+ rman_get_start(via->res[RES_MEM]),
+ rman_get_start(via->res[RES_IRQ]),
PCM_KLDSTRING(snd_via82c686));
/* Register */
@@ -602,15 +600,8 @@
return 0;
bad:
if (via->codec) ac97_destroy(via->codec);
- if (via->reg) bus_release_resource(dev, SYS_RES_IOPORT, via->regid, via->reg);
- if (via->ih) bus_teardown_intr(dev, via->irq, via->ih);
- if (via->irq) bus_release_resource(dev, SYS_RES_IRQ, via->irqid, via->irq);
- if (via->parent_dmat) bus_dma_tag_destroy(via->parent_dmat);
- if (via->sgd_dmamap) bus_dmamap_unload(via->sgd_dmat, via->sgd_dmamap);
- if (via->sgd_table) bus_dmamem_free(via->sgd_dmat, via->sgd_table, via->sgd_dmamap);
- if (via->sgd_dmat) bus_dma_tag_destroy(via->sgd_dmat);
- if (via->lock) snd_mtxfree(via->lock);
- if (via) free(via, M_DEVBUF);
+ via_destroy(dev, via);
+
return ENXIO;
}
@@ -625,15 +616,8 @@
return r;
via = pcm_getdevinfo(dev);
- bus_release_resource(dev, SYS_RES_IOPORT, via->regid, via->reg);
- bus_teardown_intr(dev, via->irq, via->ih);
- bus_release_resource(dev, SYS_RES_IRQ, via->irqid, via->irq);
- bus_dma_tag_destroy(via->parent_dmat);
- bus_dmamap_unload(via->sgd_dmat, via->sgd_dmamap);
- bus_dmamem_free(via->sgd_dmat, via->sgd_table, via->sgd_dmamap);
- bus_dma_tag_destroy(via->sgd_dmat);
- snd_mtxfree(via->lock);
- free(via, M_DEVBUF);
+ via_destroy(dev, via);
+
return 0;
}
More information about the p4-projects
mailing list