From owner-p4-projects@FreeBSD.ORG Fri Jul 27 05:47:11 2007 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 51D0416A421; Fri, 27 Jul 2007 05:47:11 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id CC02316A418 for ; Fri, 27 Jul 2007 05:47:10 +0000 (UTC) (envelope-from loafier@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id BE79113C46C for ; Fri, 27 Jul 2007 05:47:10 +0000 (UTC) (envelope-from loafier@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.1/8.14.1) with ESMTP id l6R5lAU2033565 for ; Fri, 27 Jul 2007 05:47:10 GMT (envelope-from loafier@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.1/8.14.1/Submit) id l6R5lAtJ033557 for perforce@freebsd.org; Fri, 27 Jul 2007 05:47:10 GMT (envelope-from loafier@FreeBSD.org) Date: Fri, 27 Jul 2007 05:47:10 GMT Message-Id: <200707270547.l6R5lAtJ033557@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to loafier@FreeBSD.org using -f From: Christopher Davis To: Perforce Change Reviews Cc: Subject: PERFORCE change 124157 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 27 Jul 2007 05:47:11 -0000 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; }