PERFORCE change 124151 for review
Christopher Davis
loafier at FreeBSD.org
Fri Jul 27 04:39:15 UTC 2007
http://perforce.freebsd.org/chv.cgi?CH=124151
Change 124151 by loafier at chrisdsoc on 2007/07/27 04:38:18
Edit maestro for bus_alloc_resources, etc
Affected files ...
.. //depot/projects/soc2007/loafier_busalloc/src/sys/dev/sound/pci/maestro.c#2 edit
Differences ...
==== //depot/projects/soc2007/loafier_busalloc/src/sys/dev/sound/pci/maestro.c#2 (text+ko) ====
@@ -139,18 +139,24 @@
volatile u_int32_t hwptr; /* ready point in 16bit sample */
};
+enum {
+ RES_MEM,
+ RES_IRQ,
+ RES_SZ
+};
+
+static struct resource_spec agg_res_spec[] = {
+ {SYS_RES_IOPORT, PCIR_BAR(0), RF_ACTIVE},
+ {SYS_RES_IRQ, 0, RF_ACTIVE | RF_SHAREABLE},
+ {-1, 0, 0}
+};
+
struct agg_info {
/* FreeBSD newbus related */
device_t dev;
/* I wonder whether bus_space_* are in common in *BSD... */
- struct resource *reg;
- int regid;
- bus_space_tag_t st;
- bus_space_handle_t sh;
-
- struct resource *irq;
- int irqid;
+ struct resource *res[RES_SZ];
void *ih;
bus_dma_tag_t buf_dmat;
@@ -205,9 +211,6 @@
static void agg_sleep(struct agg_info*, const char *wmesg, int msec);
-static __inline u_int32_t agg_rd(struct agg_info*, int, int size);
-static __inline void agg_wr(struct agg_info*, int, u_int32_t data,
- int size);
static int agg_rdcodec(struct agg_info*, int);
static int agg_wrcodec(struct agg_info*, int, u_int32_t);
@@ -247,6 +250,7 @@
static void suppress_jitter(struct agg_chinfo*);
static void suppress_rec_jitter(struct agg_rchinfo*);
#endif
+static void agg_destroy(device_t, struct agg_info*);
static void set_timer(struct agg_info*);
@@ -288,46 +292,11 @@
/* I/O port */
-static __inline u_int32_t
-agg_rd(struct agg_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 ~(u_int32_t)0;
- }
-}
-
#define AGG_RD(sc, regno, size) \
- bus_space_read_##size( \
- ((struct agg_info*)(sc))->st, \
- ((struct agg_info*)(sc))->sh, (regno))
+ bus_read_##size((sc)->res[RES_MEM], (regno))
-static __inline void
-agg_wr(struct agg_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 AGG_WR(sc, regno, data, size) \
- bus_space_write_##size( \
- ((struct agg_info*)(sc))->st, \
- ((struct agg_info*)(sc))->sh, (regno), (data))
+ bus_write_##size((sc)->res[RES_MEM], (regno), (data))
/* -------------------------------------------------------------------- */
@@ -1733,6 +1702,28 @@
bus_dmamem_free(dmat, buf, NULL);
}
+static void
+agg_destroy(device_t dev, struct agg_info *sc)
+{
+ if (!sc)
+ return;
+
+ if (sc->ih != NULL)
+ bus_teardown_intr(dev, sc->res[RES_IRQ], sc->ih);
+ bus_release_resources(dev, agg_res_spec, sc->res);
+ if (sc->stat != NULL)
+ dma_free(sc->stat_dmat, sc->stat);
+ if (sc->stat_dmat != NULL)
+ bus_dma_tag_destroy(sc->stat_dmat);
+ if (sc->buf_dmat != NULL)
+ bus_dma_tag_destroy(sc->buf_dmat);
+#ifdef USING_MUTEX
+ if (mtx_initialized(&sc->lock))
+ mtx_destroy(&sc->lock);
+#endif
+ free(sc, M_DEVBUF);
+}
+
static int
agg_probe(device_t dev)
{
@@ -1763,15 +1754,11 @@
agg_attach(device_t dev)
{
struct agg_info *ess = NULL;
- u_int32_t data;
- int regid = PCIR_BAR(0);
- struct resource *reg = NULL;
struct ac97_info *codec = NULL;
- int irqid = 0;
- struct resource *irq = NULL;
void *ih = NULL;
char status[SND_STATUSLEN];
int ret = 0;
+ uint32_t data;
ess = malloc(sizeof(*ess), M_DEVBUF, M_WAITOK | M_ZERO);
ess->dev = dev;
@@ -1832,39 +1819,19 @@
/* State D0-uninitialized. */
ess->curpwr = PCI_POWERSTATE_D3;
pci_set_powerstate(dev, PCI_POWERSTATE_D0);
+ pci_enable_busmaster(dev);
+ pci_enable_io(dev, SYS_RES_IOPORT);
- 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);
-
/* Allocate resources. */
- if (data & PCIM_CMD_PORTEN)
- reg = bus_alloc_resource_any(dev, SYS_RES_IOPORT, ®id,
- RF_ACTIVE);
- if (reg != NULL) {
- ess->reg = reg;
- ess->regid = regid;
- ess->st = rman_get_bustag(reg);
- ess->sh = rman_get_bushandle(reg);
- } else {
- device_printf(dev, "unable to map register space\n");
- ret = ENXIO;
- goto bad;
- }
- irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &irqid,
- RF_ACTIVE | RF_SHAREABLE);
- if (irq != NULL) {
- ess->irq = irq;
- ess->irqid = irqid;
- } else {
- device_printf(dev, "unable to map interrupt\n");
+ if (bus_alloc_resources(dev, agg_res_spec, ess->res) != 0) {
+ device_printf(dev, "unable to allocate resources\n");
ret = ENXIO;
goto bad;
}
/* Setup resources. */
- if (snd_setup_intr(dev, irq, INTR_MPSAFE, agg_intr, ess, &ih)) {
+ if (snd_setup_intr(dev, ess->res[RES_IRQ],
+ INTR_MPSAFE, agg_intr, ess, &ih)) {
device_printf(dev, "unable to setup interrupt\n");
ret = ENXIO;
goto bad;
@@ -1910,8 +1877,11 @@
snprintf(status, SND_STATUSLEN,
"port 0x%lx-0x%lx irq %ld at device %d.%d on pci%d",
- rman_get_start(reg), rman_get_end(reg), rman_get_start(irq),
- pci_get_slot(dev), pci_get_function(dev), pci_get_bus(dev));
+ rman_get_start(ess->res[RES_MEM]),
+ rman_get_end(ess->res[RES_MEM]),
+ rman_get_start(ess->res[RES_IRQ]),
+ pci_get_slot(dev), pci_get_function(dev),
+ pci_get_bus(dev));
pcm_setstatus(dev, status);
return 0;
@@ -1919,29 +1889,12 @@
bad:
if (codec != NULL)
ac97_destroy(codec);
- if (ih != NULL)
- bus_teardown_intr(dev, irq, ih);
- if (irq != NULL)
- bus_release_resource(dev, SYS_RES_IRQ, irqid, irq);
- if (reg != NULL)
- bus_release_resource(dev, SYS_RES_IOPORT, regid, reg);
- if (ess != NULL) {
- if (ess->stat != NULL)
- dma_free(ess->stat_dmat, ess->stat);
- if (ess->stat_dmat != NULL)
- bus_dma_tag_destroy(ess->stat_dmat);
- if (ess->buf_dmat != NULL)
- bus_dma_tag_destroy(ess->buf_dmat);
-#ifdef USING_MUTEX
- if (mtx_initialized(&ess->lock))
- mtx_destroy(&ess->lock);
-#endif
- free(ess, M_DEVBUF);
- }
+ agg_destroy(dev, ess);
return ret;
}
+
static int
agg_detach(device_t dev)
{
@@ -1970,16 +1923,8 @@
agg_power(ess, PCI_POWERSTATE_D3);
agg_unlock(ess);
- bus_teardown_intr(dev, ess->irq, ess->ih);
- bus_release_resource(dev, SYS_RES_IRQ, ess->irqid, ess->irq);
- bus_release_resource(dev, SYS_RES_IOPORT, ess->regid, ess->reg);
- dma_free(ess->stat_dmat, ess->stat);
- bus_dma_tag_destroy(ess->stat_dmat);
- bus_dma_tag_destroy(ess->buf_dmat);
-#ifdef USING_MUTEX
- mtx_destroy(&ess->lock);
-#endif
- free(ess, M_DEVBUF);
+ agg_destroy(dev, ess);
+
return 0;
}
More information about the p4-projects
mailing list