PERFORCE change 124265 for review
Christopher Davis
loafier at FreeBSD.org
Sat Jul 28 15:36:39 UTC 2007
http://perforce.freebsd.org/chv.cgi?CH=124265
Change 124265 by loafier at chrisdsoc on 2007/07/28 15:36:24
Edit for bus_alloc_resources(), etc
Affected files ...
.. //depot/projects/soc2007/loafier_busalloc/src/sys/dev/sound/pci/via8233.c#2 edit
Differences ...
==== //depot/projects/soc2007/loafier_busalloc/src/sys/dev/sound/pci/via8233.c#2 (text+ko) ====
@@ -93,18 +93,27 @@
unsigned int ptr, prevptr;
};
+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 {
device_t dev;
- 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;
@@ -271,38 +280,13 @@
#endif
}
-static __inline uint32_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, uint32_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 */
@@ -313,7 +297,7 @@
/* poll until codec not busy */
for (i = 0; i < 1000; i++) {
- if ((via_rd(via, VIA_AC97_CONTROL, 4) & VIA_AC97_BUSY) == 0)
+ if ((via_rd4(via, VIA_AC97_CONTROL) & VIA_AC97_BUSY) == 0)
return (0);
DELAY(1);
}
@@ -328,7 +312,7 @@
/* poll until codec valid */
for (i = 0; i < 1000; i++) {
- if (via_rd(via, VIA_AC97_CONTROL, 4) & VIA_AC97_CODEC00_VALID)
+ if (via_rd4(via, VIA_AC97_CONTROL) & VIA_AC97_CODEC00_VALID)
return (0);
DELAY(1);
}
@@ -344,9 +328,9 @@
if (via_waitready_codec(via))
return (-1);
- via_wr(via, VIA_AC97_CONTROL,
+ via_wr4(via, VIA_AC97_CONTROL,
VIA_AC97_CODEC00_VALID | VIA_AC97_INDEX(reg) |
- VIA_AC97_DATA(val), 4);
+ VIA_AC97_DATA(val));
return (0);
}
@@ -359,8 +343,8 @@
if (via_waitready_codec(via))
return (-1);
- via_wr(via, VIA_AC97_CONTROL, VIA_AC97_CODEC00_VALID |
- VIA_AC97_READ | VIA_AC97_INDEX(reg), 4);
+ via_wr4(via, VIA_AC97_CONTROL, VIA_AC97_CODEC00_VALID |
+ VIA_AC97_READ | VIA_AC97_INDEX(reg));
if (via_waitready_codec(via))
return (-1);
@@ -368,7 +352,7 @@
if (via_waitvalid_codec(via))
return (-1);
- return (via_rd(via, VIA_AC97_CONTROL, 2));
+ return (via_rd2(via, VIA_AC97_CONTROL));
}
static kobj_method_t via_ac97_methods[] = {
@@ -413,7 +397,7 @@
if (format & AFMT_S16_LE)
f |= WR_FORMAT_16BIT;
snd_mtxlock(via->lock);
- via_wr(via, VIA_WR0_FORMAT, f, 4);
+ via_wr4(via, VIA_WR0_FORMAT, f);
snd_mtxunlock(via->lock);
return (0);
@@ -428,14 +412,14 @@
r = ch->rbase + VIA8233_RP_DXS_RATEFMT;
snd_mtxlock(via->lock);
- v = via_rd(via, r, 4);
+ v = via_rd4(via, r);
v &= ~(VIA8233_DXS_RATEFMT_STEREO | VIA8233_DXS_RATEFMT_16BIT);
if (format & AFMT_STEREO)
v |= VIA8233_DXS_RATEFMT_STEREO;
if (format & AFMT_16BIT)
v |= VIA8233_DXS_RATEFMT_16BIT;
- via_wr(via, r, v, 4);
+ via_wr4(via, r, v);
snd_mtxunlock(via->lock);
return (0);
@@ -459,8 +443,8 @@
}
snd_mtxlock(via->lock);
- via_wr(via, VIA_MC_SLOT_SELECT, s, 4);
- via_wr(via, VIA_MC_SGD_FORMAT, v, 1);
+ via_wr4(via, VIA_MC_SLOT_SELECT, s);
+ via_wr1(via, VIA_MC_SGD_FORMAT, v);
snd_mtxunlock(via->lock);
return (0);
@@ -490,12 +474,12 @@
r = ch->rbase + VIA8233_RP_DXS_RATEFMT;
snd_mtxlock(via->lock);
- v = via_rd(via, r, 4) & ~VIA8233_DXS_RATEFMT_48K;
+ v = via_rd4(via, r) & ~VIA8233_DXS_RATEFMT_48K;
/* Careful to avoid overflow (divide by 48 per vt8233c docs) */
v |= VIA8233_DXS_RATEFMT_48K * (speed / 48) / (48000 / 48);
- via_wr(via, r, v, 4);
+ via_wr4(via, r, v);
snd_mtxunlock(via->lock);
return (speed);
@@ -623,7 +607,7 @@
ptr = ch->ptr;
snd_mtxunlock(via->lock);
} else {
- v = via_rd(via, ch->rbase + VIA_RP_CURRENT_COUNT, 4);
+ v = via_rd4(via, ch->rbase + VIA_RP_CURRENT_COUNT);
snd_mtxunlock(via->lock);
index = v >> 24; /* Last completed buffer */
count = v & 0x00ffffff; /* Bytes remaining */
@@ -637,10 +621,10 @@
static void
via8233chan_reset(struct via_info *via, struct via_chinfo *ch)
{
- via_wr(via, ch->rbase + VIA_RP_CONTROL, SGD_CONTROL_STOP, 1);
- via_wr(via, ch->rbase + VIA_RP_CONTROL, 0x00, 1);
- via_wr(via, ch->rbase + VIA_RP_STATUS,
- SGD_STATUS_EOL | SGD_STATUS_FLAG, 1);
+ via_wr1(via, ch->rbase + VIA_RP_CONTROL, SGD_CONTROL_STOP);
+ via_wr1(via, ch->rbase + VIA_RP_CONTROL, 0x00);
+ via_wr1(via, ch->rbase + VIA_RP_STATUS,
+ SGD_STATUS_EOL | SGD_STATUS_FLAG);
}
/* -------------------------------------------------------------------- */
@@ -671,7 +655,7 @@
ch->dir = dir;
ch->blkcnt = via->blkcnt;
ch->rbase = VIA_WR_BASE(num);
- via_wr(via, ch->rbase + VIA_WR_RP_SGD_FORMAT, WR_FIFO_ENABLE, 1);
+ via_wr1(via, ch->rbase + VIA_WR_RP_SGD_FORMAT, WR_FIFO_ENABLE);
snd_mtxunlock(via->lock);
if (sndbuf_alloc(ch->buffer, via->parent_dmat, 0, via->bufsz) != 0)
@@ -758,9 +742,9 @@
if (BASE_IS_VIA_DXS_REG(ch->rbase)) {
int r;
muted = (muted) ? VIA8233_DXS_MUTE : 0;
- via_wr(via, ch->rbase + VIA8233_RP_DXS_LVOL, muted, 1);
- via_wr(via, ch->rbase + VIA8233_RP_DXS_RVOL, muted, 1);
- r = via_rd(via, ch->rbase + VIA8233_RP_DXS_LVOL, 1) &
+ via_wr1(via, ch->rbase + VIA8233_RP_DXS_LVOL, muted);
+ via_wr1(via, ch->rbase + VIA8233_RP_DXS_RVOL, muted);
+ r = via_rd1(via, ch->rbase + VIA8233_RP_DXS_LVOL) &
VIA8233_DXS_MUTE;
if (r != muted)
device_printf(via->dev,
@@ -782,7 +766,7 @@
via = ch->parent;
sz = ch->blksz * ch->blkcnt;
- v = via_rd(via, ch->rbase + VIA_RP_CURRENT_COUNT, 4);
+ v = via_rd4(via, ch->rbase + VIA_RP_CURRENT_COUNT);
index = v >> 24;
count = v & 0x00ffffff;
ptr = ((index + 1) * ch->blksz) - count;
@@ -897,7 +881,7 @@
case PCMTRIG_START:
via_buildsgdt(ch);
via8233chan_mute(via, ch, 0);
- via_wr(via, ch->rbase + VIA_RP_TABLE_PTR, ch->sgd_addr, 4);
+ via_wr4(via, ch->rbase + VIA_RP_TABLE_PTR, ch->sgd_addr);
if (via->polling != 0) {
ch->ptr = 0;
ch->prevptr = 0;
@@ -926,15 +910,15 @@
via_poll_callback, via);
}
}
- via_wr(via, ch->rbase + VIA_RP_CONTROL,
+ via_wr1(via, ch->rbase + VIA_RP_CONTROL,
SGD_CONTROL_START | SGD_CONTROL_AUTOSTART |
((via->polling == 0) ?
- (SGD_CONTROL_I_EOL | SGD_CONTROL_I_FLAG) : 0), 1);
+ (SGD_CONTROL_I_EOL | SGD_CONTROL_I_FLAG) : 0));
ch->active = 1;
break;
case PCMTRIG_STOP:
case PCMTRIG_ABORT:
- via_wr(via, ch->rbase + VIA_RP_CONTROL, SGD_CONTROL_STOP, 1);
+ via_wr1(via, ch->rbase + VIA_RP_CONTROL, SGD_CONTROL_STOP);
via8233chan_mute(via, ch, 1);
via8233chan_reset(via, ch);
ch->active = 0;
@@ -1023,14 +1007,14 @@
if (via->pch[i].channel == NULL || via->pch[i].active == 0)
continue;
reg = via->pch[i].rbase + VIA_RP_STATUS;
- stat = via_rd(via, reg, 1);
+ stat = via_rd1(via, reg);
if (stat & SGD_STATUS_INTR) {
if (via->dma_eol_wake && ((stat & SGD_STATUS_EOL) ||
!(stat & SGD_STATUS_ACTIVE)))
- via_wr(via, via->pch[i].rbase + VIA_RP_CONTROL,
+ via_wr1(via, via->pch[i].rbase + VIA_RP_CONTROL,
SGD_CONTROL_START | SGD_CONTROL_AUTOSTART |
- SGD_CONTROL_I_EOL | SGD_CONTROL_I_FLAG, 1);
- via_wr(via, reg, stat, 1);
+ SGD_CONTROL_I_EOL | SGD_CONTROL_I_FLAG);
+ via_wr1(via, reg, stat);
ptrigger |= 1 << i;
}
}
@@ -1039,14 +1023,14 @@
if (via->rch[i].channel == NULL || via->rch[i].active == 0)
continue;
reg = via->rch[i].rbase + VIA_RP_STATUS;
- stat = via_rd(via, reg, 1);
+ stat = via_rd1(via, reg);
if (stat & SGD_STATUS_INTR) {
if (via->dma_eol_wake && ((stat & SGD_STATUS_EOL) ||
!(stat & SGD_STATUS_ACTIVE)))
- via_wr(via, via->rch[i].rbase + VIA_RP_CONTROL,
+ via_wr1(via, via->rch[i].rbase + VIA_RP_CONTROL,
SGD_CONTROL_START | SGD_CONTROL_AUTOSTART |
- SGD_CONTROL_I_EOL | SGD_CONTROL_I_FLAG, 1);
- via_wr(via, reg, stat, 1);
+ SGD_CONTROL_I_EOL | SGD_CONTROL_I_FLAG);
+ via_wr1(via, reg, stat);
rtrigger |= 1 << i;
}
}
@@ -1162,6 +1146,28 @@
return (ENXIO);
}
+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)
{
@@ -1188,21 +1194,12 @@
pci_set_powerstate(dev, PCI_POWERSTATE_D0);
pci_enable_busmaster(dev);
- 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->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,
+ 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;
@@ -1350,7 +1347,8 @@
}
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_via8233));
/* Register */
@@ -1374,24 +1372,8 @@
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);
}
@@ -1415,15 +1397,8 @@
callout_drain(&via->poll_timer);
}
- 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