Date: Sat, 28 Jul 2007 15:36:38 GMT From: Christopher Davis <loafier@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 124265 for review Message-ID: <200707281536.l6SFacuF040037@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=124265 Change 124265 by loafier@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); }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200707281536.l6SFacuF040037>