Date: Fri, 27 Jul 2007 04:39:14 GMT From: Christopher Davis <loafier@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 124151 for review Message-ID: <200707270439.l6R4dEHR019232@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=124151 Change 124151 by loafier@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; }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200707270439.l6R4dEHR019232>