Date: Fri, 27 Jul 2007 05:47:10 GMT From: Christopher Davis <loafier@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 124157 for review Message-ID: <200707270547.l6R5lAtJ033557@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=124157 Change 124157 by loafier@chrisdsoc on 2007/07/27 05:47:09 Use bus_alloc_resources, etc in maestro3 driver. Affected files ... .. //depot/projects/soc2007/loafier_busalloc/src/sys/dev/sound/pci/maestro3.c#2 edit Differences ... ==== //depot/projects/soc2007/loafier_busalloc/src/sys/dev/sound/pci/maestro3.c#2 (text+ko) ==== @@ -123,6 +123,24 @@ u_int32_t prevptr; }; +enum { + RES_MEM, + RES_IRQ, + RES_SZ +}; + +static struct resource_spec m3_res_spec_io[] = { + {SYS_RES_IOPORT, PCIR_BAR(0), RF_ACTIVE}, + {SYS_RES_IRQ, 0, RF_ACTIVE | RF_SHAREABLE}, + {-1, 0, 0} +}; + +static struct resource_spec m3_res_spec_mem[] = { + {SYS_RES_MEMORY, PCIR_BAR(0), RF_ACTIVE}, + {SYS_RES_IRQ, 0, RF_ACTIVE | RF_SHAREABLE}, + {-1, 0, 0} +}; + struct sc_info { device_t dev; u_int32_t type; @@ -130,15 +148,10 @@ int delay1; int delay2; - bus_space_tag_t st; - bus_space_handle_t sh; bus_dma_tag_t parent_dmat; - struct resource *reg; - struct resource *irq; - int regtype; - int regid; - int irqid; + struct resource *res[RES_SZ]; + struct resource_spec *spec; void *ih; struct sc_pchinfo pch[M3_PCHANS]; @@ -260,12 +273,12 @@ /* -------------------------------------------------------------------- */ /* some i/o convenience functions */ -#define m3_rd_1(sc, regno) bus_space_read_1(sc->st, sc->sh, regno) -#define m3_rd_2(sc, regno) bus_space_read_2(sc->st, sc->sh, regno) -#define m3_rd_4(sc, regno) bus_space_read_4(sc->st, sc->sh, regno) -#define m3_wr_1(sc, regno, data) bus_space_write_1(sc->st, sc->sh, regno, data) -#define m3_wr_2(sc, regno, data) bus_space_write_2(sc->st, sc->sh, regno, data) -#define m3_wr_4(sc, regno, data) bus_space_write_4(sc->st, sc->sh, regno, data) +#define m3_rd_1(sc, regno) bus_read_1((sc)->res[RES_MEM], regno) +#define m3_rd_2(sc, regno) bus_read_2((sc)->res[RES_MEM], regno) +#define m3_rd_4(sc, regno) bus_read_4((sc)->res[RES_MEM], regno) +#define m3_wr_1(sc, regno, data) bus_write_1((sc)->res[RES_MEM], regno, data) +#define m3_wr_2(sc, regno, data) bus_write_2((sc)->res[RES_MEM], regno, data) +#define m3_wr_4(sc, regno, data) bus_write_4((sc)->res[RES_MEM], regno, data) #define m3_rd_assp_code(sc, index) \ m3_rd_assp(sc, MEMTYPE_INTERNAL_CODE, index) #define m3_wr_assp_code(sc, index, data) \ @@ -1234,6 +1247,22 @@ return 0; } +static void +m3_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, sc->spec, sc->res); + if (sc->parent_dmat) + bus_dma_tag_destroy(sc->parent_dmat); + if (sc->sc_lock) + snd_mtxfree(sc->sc_lock); + free(sc, M_DEVBUF); +} + /* -------------------------------------------------------------------- */ /* Probe and attach the card */ @@ -1258,10 +1287,10 @@ { struct sc_info *sc; struct ac97_info *codec = NULL; - u_int32_t data; char status[SND_STATUSLEN]; struct m3_card_type *card; int i, len, dacn, adcn; + int mapped = 0; M3_DEBUG(CALL, ("m3_pci_attach\n")); @@ -1292,35 +1321,25 @@ adcn = M3_RCHANS; - 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); + pci_enable_busmaster(dev); - sc->regid = PCIR_BAR(0); - sc->regtype = SYS_RES_MEMORY; - sc->reg = bus_alloc_resource_any(dev, sc->regtype, &sc->regid, - RF_ACTIVE); - if (!sc->reg) { - sc->regtype = SYS_RES_IOPORT; - sc->reg = bus_alloc_resource_any(dev, sc->regtype, &sc->regid, - RF_ACTIVE); + if (mapped == 0 && pci_enable_io(dev, SYS_RES_MEMORY) == 0) { + sc->spec = m3_res_spec_mem; + if (bus_alloc_resources(dev, sc->spec, sc->res) == 0) + mapped = 1; } - if (!sc->reg) { - device_printf(dev, "unable to allocate register space\n"); - goto bad; + if (mapped == 0 && pci_enable_io(dev, SYS_RES_IOPORT) == 0) { + sc->spec = m3_res_spec_io; + if (bus_alloc_resources(dev, sc->spec, sc->res) == 0) + mapped = 1; } - sc->st = rman_get_bustag(sc->reg); - sc->sh = rman_get_bushandle(sc->reg); - - sc->irqid = 0; - sc->irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &sc->irqid, - RF_ACTIVE | RF_SHAREABLE); - if (!sc->irq) { - device_printf(dev, "unable to allocate interrupt\n"); + if (mapped == 0) { + device_printf(dev, "unable to allocate resources\n"); goto bad; } - if (snd_setup_intr(dev, sc->irq, INTR_MPSAFE, m3_intr, sc, &sc->ih)) { + if (snd_setup_intr(dev, sc->res[RES_IRQ], INTR_MPSAFE, + m3_intr, sc, &sc->ih)) { device_printf(dev, "unable to setup interrupt\n"); goto bad; } @@ -1385,8 +1404,9 @@ } } snprintf(status, SND_STATUSLEN, "at %s 0x%lx irq %ld %s", - (sc->regtype == SYS_RES_IOPORT)? "io" : "memory", - rman_get_start(sc->reg), rman_get_start(sc->irq), + (sc->spec == m3_res_spec_io)? "io" : "memory", + rman_get_start(sc->res[RES_MEM]), + rman_get_start(sc->res[RES_IRQ]), PCM_KLDSTRING(snd_maestro3)); if (pcm_setstatus(dev, status)) { device_printf(dev, "attach: pcm_setstatus error\n"); @@ -1405,17 +1425,8 @@ bad: if (codec) ac97_destroy(codec); - 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->reg) - bus_release_resource(dev, sc->regtype, sc->regid, sc->reg); - if (sc->parent_dmat) - bus_dma_tag_destroy(sc->parent_dmat); - if (sc->sc_lock) - snd_mtxfree(sc->sc_lock); - free(sc, M_DEVBUF); + m3_destroy(dev, sc); + return ENXIO; } @@ -1436,14 +1447,8 @@ m3_power(sc, 3); /* power off */ M3_UNLOCK(sc); - bus_teardown_intr(dev, sc->irq, sc->ih); - bus_release_resource(dev, SYS_RES_IRQ, sc->irqid, sc->irq); - bus_release_resource(dev, sc->regtype, sc->regid, sc->reg); - bus_dma_tag_destroy(sc->parent_dmat); + m3_destroy(dev, sc); - free(sc->savemem, M_DEVBUF); - snd_mtxfree(sc->sc_lock); - free(sc, M_DEVBUF); return 0; }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200707270547.l6R5lAtJ033557>