PERFORCE change 124161 for review
Christopher Davis
loafier at FreeBSD.org
Fri Jul 27 07:56:01 UTC 2007
http://perforce.freebsd.org/chv.cgi?CH=124161
Change 124161 by loafier at chrisdsoc on 2007/07/27 07:55:51
Use bus_alloc_resources, etc
Affected files ...
.. //depot/projects/soc2007/loafier_busalloc/src/sys/dev/sound/pci/ds1.c#2 edit
Differences ...
==== //depot/projects/soc2007/loafier_busalloc/src/sys/dev/sound/pci/ds1.c#2 (text+ko) ====
@@ -102,19 +102,29 @@
struct sc_info *parent;
};
+
+enum {
+ RES_MEM,
+ RES_IRQ,
+ RES_SZ
+};
+
+static struct resource_spec ds_res_spec[] = {
+ {SYS_RES_MEMORY, PCIR_BAR(0), RF_ACTIVE},
+ {SYS_RES_IRQ, 0, RF_ACTIVE | RF_SHAREABLE},
+ {-1, 0, 0}
+};
+
/* device private data */
struct sc_info {
device_t dev;
u_int32_t type, rev;
u_int32_t cd2id, ctrlbase;
- bus_space_tag_t st;
- bus_space_handle_t sh;
bus_dma_tag_t buffer_dmat, control_dmat;
bus_dmamap_t map;
- struct resource *reg, *irq;
- int regid, irqid;
+ struct resource *res[RES_SZ];
void *ih;
struct mtx *lock;
@@ -160,10 +170,6 @@
static int ds_init(struct sc_info *);
static void ds_intr(void *);
-/* talk to the card */
-static u_int32_t ds_rd(struct sc_info *, int, int);
-static void ds_wr(struct sc_info *, int, u_int32_t, int);
-
/* -------------------------------------------------------------------- */
static u_int32_t ds_recfmt[] = {
@@ -190,42 +196,22 @@
/* -------------------------------------------------------------------- */
/* Hardware */
-static u_int32_t
-ds_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:
- return 0xffffffff;
- }
-}
+#define ds_rd1(_sc, _reg) bus_read_1((_sc)->res[RES_MEM], _reg)
+#define ds_rd2(_sc, _reg) bus_read_2((_sc)->res[RES_MEM], _reg)
+#define ds_rd4(_sc, _reg) bus_read_4((_sc)->res[RES_MEM], _reg)
+#define ds_wr1(_sc, _reg, _val) bus_write_1((_sc)->res[RES_MEM], _reg, _val)
+#define ds_wr2(_sc, _reg, _val) bus_write_2((_sc)->res[RES_MEM], _reg, _val)
+#define ds_wr4(_sc, _reg, _val) bus_write_4((_sc)->res[RES_MEM], _reg, _val)
static void
-ds_wr(struct sc_info *sc, int regno, u_int32_t data, int size)
+wrl(struct sc_info *sc, u_int32_t *ptr, u_int32_t val)
{
- 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;
- }
-}
+ struct resource *mem = sc->res[RES_MEM];
-static void
-wrl(struct sc_info *sc, u_int32_t *ptr, u_int32_t val)
-{
*(volatile u_int32_t *)ptr = val;
- bus_space_barrier(sc->st, sc->sh, 0, 0, BUS_SPACE_BARRIER_WRITE);
+ bus_space_barrier(rman_get_bustag(mem),
+ rman_get_bushandle(mem),
+ 0, 0, BUS_SPACE_BARRIER_WRITE);
}
/* -------------------------------------------------------------------- */
@@ -238,7 +224,7 @@
reg = sec? YDSXGR_SECSTATUSADR : YDSXGR_PRISTATUSADR;
i = YDSXG_AC97TIMEOUT;
while (i > 0) {
- if (!(ds_rd(sc, reg, 2) & 0x8000))
+ if (!(ds_rd2(sc, reg) & 0x8000))
return 0;
i--;
}
@@ -286,16 +272,16 @@
return 0xffffffff;
cmd = YDSXG_AC97READCMD | cid | regno;
- ds_wr(sc, YDSXGR_AC97CMDADR, cmd, 2);
+ ds_wr2(sc, YDSXGR_AC97CMDADR, cmd);
if (ds_cdbusy(sc, sec))
return 0xffffffff;
if (sc->type == 11 && sc->rev < 2)
for (i = 0; i < 600; i++)
- ds_rd(sc, reg, 2);
+ ds_rd2(sc, reg);
- return ds_rd(sc, reg, 2);
+ return ds_rd2(sc, reg);
}
static int
@@ -314,7 +300,7 @@
cmd = YDSXG_AC97WRITECMD | cid | regno;
cmd <<= 16;
cmd |= data;
- ds_wr(sc, YDSXGR_AC97CMDDATA, cmd, 4);
+ ds_wr4(sc, YDSXGR_AC97CMDDATA, cmd);
return ds_cdbusy(sc, sec);
}
@@ -336,13 +322,13 @@
v = on? 1 : 0;
if (on) {
- ds_wr(sc, YDSXGR_CONFIG, 0x00000001, 4);
+ ds_wr4(sc, YDSXGR_CONFIG, 0x00000001);
} else {
- if (ds_rd(sc, YDSXGR_CONFIG, 4))
- ds_wr(sc, YDSXGR_CONFIG, 0x00000000, 4);
+ if (ds_rd4(sc, YDSXGR_CONFIG))
+ ds_wr4(sc, YDSXGR_CONFIG, 0x00000000);
i = YDSXG_WORKBITTIMEOUT;
while (i > 0) {
- if (!(ds_rd(sc, YDSXGR_CONFIG, 4) & 0x00000002))
+ if (!(ds_rd4(sc, YDSXGR_CONFIG) & 0x00000002))
break;
i--;
}
@@ -468,8 +454,8 @@
y = (48000 * 4096) / ch->spd;
y--;
/* printf("pri = %d, x = %d, y = %d\n", pri, x, y); */
- ds_wr(sc, pri? YDSXGR_ADCFORMAT : YDSXGR_RECFORMAT, x, 4);
- ds_wr(sc, pri? YDSXGR_ADCSLOTSR : YDSXGR_RECSLOTSR, y, 4);
+ ds_wr4(sc, pri? YDSXGR_ADCFORMAT : YDSXGR_RECFORMAT, x);
+ ds_wr4(sc, pri? YDSXGR_ADCSLOTSR : YDSXGR_RECSLOTSR, y);
}
/* -------------------------------------------------------------------- */
@@ -554,7 +540,7 @@
ds_enapslot(sc, ch->lsnum, 1);
ds_enapslot(sc, ch->rsnum, stereo);
snd_mtxlock(sc->lock);
- ds_wr(sc, YDSXGR_MODE, 0x00000003, 4);
+ ds_wr4(sc, YDSXGR_MODE, 0x00000003);
snd_mtxunlock(sc->lock);
} else {
ch->run = 0;
@@ -679,17 +665,17 @@
ch->run = 1;
ds_setuprch(ch);
snd_mtxlock(sc->lock);
- x = ds_rd(sc, YDSXGR_MAPOFREC, 4);
+ x = ds_rd4(sc, YDSXGR_MAPOFREC);
x |= (ch->num == DS1_RECPRIMARY)? 0x02 : 0x01;
- ds_wr(sc, YDSXGR_MAPOFREC, x, 4);
- ds_wr(sc, YDSXGR_MODE, 0x00000003, 4);
+ ds_wr4(sc, YDSXGR_MAPOFREC, x);
+ ds_wr4(sc, YDSXGR_MODE, 0x00000003);
snd_mtxunlock(sc->lock);
} else {
ch->run = 0;
snd_mtxlock(sc->lock);
- x = ds_rd(sc, YDSXGR_MAPOFREC, 4);
+ x = ds_rd4(sc, YDSXGR_MAPOFREC);
x &= ~((ch->num == DS1_RECPRIMARY)? 0x02 : 0x01);
- ds_wr(sc, YDSXGR_MAPOFREC, x, 4);
+ ds_wr4(sc, YDSXGR_MAPOFREC, x);
snd_mtxunlock(sc->lock);
}
@@ -732,12 +718,12 @@
u_int32_t i, x;
snd_mtxlock(sc->lock);
- i = ds_rd(sc, YDSXGR_STATUS, 4);
+ i = ds_rd4(sc, YDSXGR_STATUS);
if (i & 0x00008000)
device_printf(sc->dev, "timeout irq\n");
if (i & 0x80008000) {
- ds_wr(sc, YDSXGR_STATUS, i & 0x80008000, 4);
- sc->currbank = ds_rd(sc, YDSXGR_CTRLSELECT, 4) & 0x00000001;
+ ds_wr4(sc, YDSXGR_STATUS, i & 0x80008000);
+ sc->currbank = ds_rd4(sc, YDSXGR_CTRLSELECT) & 0x00000001;
x = 0;
for (i = 0; i < DS1_CHANS; i++) {
@@ -756,9 +742,9 @@
snd_mtxlock(sc->lock);
}
}
- i = ds_rd(sc, YDSXGR_MODE, 4);
+ i = ds_rd4(sc, YDSXGR_MODE);
if (x)
- ds_wr(sc, YDSXGR_MODE, i | 0x00000002, 4);
+ ds_wr4(sc, YDSXGR_MODE, i | 0x00000002);
}
snd_mtxunlock(sc->lock);
@@ -794,29 +780,29 @@
ci = ds_devs[sc->type].mcode;
- ds_wr(sc, YDSXGR_NATIVEDACOUTVOL, 0x00000000, 4);
+ ds_wr4(sc, YDSXGR_NATIVEDACOUTVOL, 0x00000000);
ds_enadsp(sc, 0);
- ds_wr(sc, YDSXGR_MODE, 0x00010000, 4);
- ds_wr(sc, YDSXGR_MODE, 0x00000000, 4);
- ds_wr(sc, YDSXGR_MAPOFREC, 0x00000000, 4);
- ds_wr(sc, YDSXGR_MAPOFEFFECT, 0x00000000, 4);
- ds_wr(sc, YDSXGR_PLAYCTRLBASE, 0x00000000, 4);
- ds_wr(sc, YDSXGR_RECCTRLBASE, 0x00000000, 4);
- ds_wr(sc, YDSXGR_EFFCTRLBASE, 0x00000000, 4);
- r = ds_rd(sc, YDSXGR_GLOBALCTRL, 2);
- ds_wr(sc, YDSXGR_GLOBALCTRL, r & ~0x0007, 2);
+ ds_wr4(sc, YDSXGR_MODE, 0x00010000);
+ ds_wr4(sc, YDSXGR_MODE, 0x00000000);
+ ds_wr4(sc, YDSXGR_MAPOFREC, 0x00000000);
+ ds_wr4(sc, YDSXGR_MAPOFEFFECT, 0x00000000);
+ ds_wr4(sc, YDSXGR_PLAYCTRLBASE, 0x00000000);
+ ds_wr4(sc, YDSXGR_RECCTRLBASE, 0x00000000);
+ ds_wr4(sc, YDSXGR_EFFCTRLBASE, 0x00000000);
+ r = ds_rd2(sc, YDSXGR_GLOBALCTRL);
+ ds_wr2(sc, YDSXGR_GLOBALCTRL, r & ~0x0007);
for (i = 0; i < YDSXG_DSPLENGTH; i += 4)
- ds_wr(sc, YDSXGR_DSPINSTRAM + i, DspInst[i >> 2], 4);
+ ds_wr4(sc, YDSXGR_DSPINSTRAM + i, DspInst[i >> 2]);
for (i = 0; i < YDSXG_CTRLLENGTH; i += 4)
- ds_wr(sc, YDSXGR_CTRLINSTRAM + i, ci[i >> 2], 4);
+ ds_wr4(sc, YDSXGR_CTRLINSTRAM + i, ci[i >> 2]);
ds_enadsp(sc, 1);
pcs = 0;
for (i = 100; i > 0; i--) {
- pcs = ds_rd(sc, YDSXGR_PLAYCTRLSIZE, 4) << 2;
+ pcs = ds_rd4(sc, YDSXGR_PLAYCTRLSIZE) << 2;
if (pcs == sizeof(struct pbank))
break;
DELAY(1000);
@@ -825,9 +811,9 @@
device_printf(sc->dev, "preposterous playctrlsize (%d)\n", pcs);
return -1;
}
- rcs = ds_rd(sc, YDSXGR_RECCTRLSIZE, 4) << 2;
- ecs = ds_rd(sc, YDSXGR_EFFCTRLSIZE, 4) << 2;
- ws = ds_rd(sc, YDSXGR_WORKSIZE, 4) << 2;
+ rcs = ds_rd4(sc, YDSXGR_RECCTRLSIZE) << 2;
+ ecs = ds_rd4(sc, YDSXGR_EFFCTRLSIZE) << 2;
+ ws = ds_rd4(sc, YDSXGR_WORKSIZE) << 2;
memsz = 64 * 2 * pcs + 2 * 2 * rcs + 5 * 2 * ecs + ws;
memsz += (64 + 1) * 4;
@@ -852,16 +838,16 @@
cb = 0;
t = buf;
- ds_wr(sc, YDSXGR_WORKBASE, sc->ctrlbase + cb, 4);
+ ds_wr4(sc, YDSXGR_WORKBASE, sc->ctrlbase + cb);
cb += ws;
sc->pbase = (u_int32_t *)(t + cb);
/* printf("pbase = %p -> 0x%x\n", sc->pbase, sc->ctrlbase + cb); */
- ds_wr(sc, YDSXGR_PLAYCTRLBASE, sc->ctrlbase + cb, 4);
+ ds_wr4(sc, YDSXGR_PLAYCTRLBASE, sc->ctrlbase + cb);
cb += (64 + 1) * 4;
sc->rbank = (struct rbank *)(t + cb);
- ds_wr(sc, YDSXGR_RECCTRLBASE, sc->ctrlbase + cb, 4);
+ ds_wr4(sc, YDSXGR_RECCTRLBASE, sc->ctrlbase + cb);
cb += 2 * 2 * rcs;
- ds_wr(sc, YDSXGR_EFFCTRLBASE, sc->ctrlbase + cb, 4);
+ ds_wr4(sc, YDSXGR_EFFCTRLBASE, sc->ctrlbase + cb);
cb += 5 * 2 * ecs;
sc->pbankbase = sc->ctrlbase + cb;
@@ -878,9 +864,9 @@
wrl(sc, &sc->pbase[0], DS1_CHANS * 2);
sc->pchn = sc->rchn = 0;
- ds_wr(sc, YDSXGR_NATIVEDACOUTVOL, 0x3fff3fff, 4);
- ds_wr(sc, YDSXGR_NATIVEADCINVOL, 0x3fff3fff, 4);
- ds_wr(sc, YDSXGR_NATIVEDACINVOL, 0x3fff3fff, 4);
+ ds_wr4(sc, YDSXGR_NATIVEDACOUTVOL, 0x3fff3fff);
+ ds_wr4(sc, YDSXGR_NATIVEADCINVOL, 0x3fff3fff);
+ ds_wr4(sc, YDSXGR_NATIVEDACINVOL, 0x3fff3fff);
return 0;
}
@@ -888,17 +874,17 @@
static int
ds_uninit(struct sc_info *sc)
{
- ds_wr(sc, YDSXGR_NATIVEDACOUTVOL, 0x00000000, 4);
- ds_wr(sc, YDSXGR_NATIVEADCINVOL, 0, 4);
- ds_wr(sc, YDSXGR_NATIVEDACINVOL, 0, 4);
+ ds_wr4(sc, YDSXGR_NATIVEDACOUTVOL, 0x00000000);
+ ds_wr4(sc, YDSXGR_NATIVEADCINVOL, 0);
+ ds_wr4(sc, YDSXGR_NATIVEDACINVOL, 0);
ds_enadsp(sc, 0);
- ds_wr(sc, YDSXGR_MODE, 0x00010000, 4);
- ds_wr(sc, YDSXGR_MAPOFREC, 0x00000000, 4);
- ds_wr(sc, YDSXGR_MAPOFEFFECT, 0x00000000, 4);
- ds_wr(sc, YDSXGR_PLAYCTRLBASE, 0x00000000, 4);
- ds_wr(sc, YDSXGR_RECCTRLBASE, 0x00000000, 4);
- ds_wr(sc, YDSXGR_EFFCTRLBASE, 0x00000000, 4);
- ds_wr(sc, YDSXGR_GLOBALCTRL, 0, 2);
+ ds_wr4(sc, YDSXGR_MODE, 0x00010000);
+ ds_wr4(sc, YDSXGR_MAPOFREC, 0x00000000);
+ ds_wr4(sc, YDSXGR_MAPOFEFFECT, 0x00000000);
+ ds_wr4(sc, YDSXGR_PLAYCTRLBASE, 0x00000000);
+ ds_wr4(sc, YDSXGR_RECCTRLBASE, 0x00000000);
+ ds_wr4(sc, YDSXGR_EFFCTRLBASE, 0x00000000);
+ ds_wr2(sc, YDSXGR_GLOBALCTRL, 0);
bus_dmamap_unload(sc->control_dmat, sc->map);
bus_dmamem_free(sc->control_dmat, sc->regbase, sc->map);
@@ -919,6 +905,24 @@
return -1;
}
+static void
+ds_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, ds_res_spec, sc->res);
+ if (sc->buffer_dmat)
+ bus_dma_tag_destroy(sc->buffer_dmat);
+ if (sc->control_dmat)
+ bus_dma_tag_destroy(sc->control_dmat);
+ if (sc->lock)
+ snd_mtxfree(sc->lock);
+ free(sc, M_DEVBUF);
+}
+
static int
ds_pci_probe(device_t dev)
{
@@ -937,7 +941,6 @@
static int
ds_pci_attach(device_t dev)
{
- u_int32_t data;
u_int32_t subdev, i;
struct sc_info *sc;
struct ac97_info *codec = NULL;
@@ -950,22 +953,14 @@
sc->type = ds_finddev(pci_get_devid(dev), subdev);
sc->rev = pci_get_revid(dev);
- 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);
- data = pci_read_config(dev, PCIR_COMMAND, 2);
+ pci_enable_busmaster(dev);
+ pci_enable_io(dev, SYS_RES_MEMORY);
- sc->regid = PCIR_BAR(0);
- sc->reg = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &sc->regid,
- RF_ACTIVE);
- if (!sc->reg) {
- device_printf(dev, "unable to map register space\n");
+ if (bus_alloc_resources(dev, ds_res_spec, sc->res) != 0) {
+ device_printf(dev, "unable to allocate resources\n");
goto bad;
- }
+ }
- sc->st = rman_get_bustag(sc->reg);
- sc->sh = rman_get_bushandle(sc->reg);
-
sc->bufsz = pcm_getbuffersize(dev, 4096, DS1_BUFFSIZE, 65536);
if (bus_dma_tag_create(/*parent*/bus_get_dma_tag(dev), /*alignment*/2,
@@ -1002,16 +997,16 @@
}
mixer_init(dev, ac97_getmixerclass(), codec);
- 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, ds_intr, sc, &sc->ih)) {
+ if (snd_setup_intr(dev, sc->res[RES_IRQ], INTR_MPSAFE,
+ ds_intr, sc, &sc->ih)) {
device_printf(dev, "unable to map interrupt\n");
goto bad;
}
snprintf(status, SND_STATUSLEN, "at memory 0x%lx irq %ld %s",
- rman_get_start(sc->reg), rman_get_start(sc->irq),PCM_KLDSTRING(snd_ds1));
+ rman_get_start(sc->res[RES_MEM]),
+ rman_get_start(sc->res[RES_IRQ]),
+ PCM_KLDSTRING(snd_ds1));
if (pcm_register(dev, sc, DS1_CHANS, 2))
goto bad;
@@ -1026,19 +1021,8 @@
bad:
if (codec)
ac97_destroy(codec);
- if (sc->reg)
- bus_release_resource(dev, SYS_RES_MEMORY, sc->regid, sc->reg);
- 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->buffer_dmat)
- bus_dma_tag_destroy(sc->buffer_dmat);
- if (sc->control_dmat)
- bus_dma_tag_destroy(sc->control_dmat);
- if (sc->lock)
- snd_mtxfree(sc->lock);
- free(sc, M_DEVBUF);
+ ds_destroy(dev, sc);
+
return ENXIO;
}
@@ -1072,13 +1056,8 @@
sc = pcm_getdevinfo(dev);
ds_uninit(sc);
- bus_release_resource(dev, SYS_RES_MEMORY, sc->regid, sc->reg);
- bus_teardown_intr(dev, sc->irq, sc->ih);
- bus_release_resource(dev, SYS_RES_IRQ, sc->irqid, sc->irq);
- bus_dma_tag_destroy(sc->buffer_dmat);
- bus_dma_tag_destroy(sc->control_dmat);
- snd_mtxfree(sc->lock);
- free(sc, M_DEVBUF);
+ ds_destroy(dev, sc);
+
return 0;
}
More information about the p4-projects
mailing list