PERFORCE change 124157 for review

Christopher Davis loafier at FreeBSD.org
Fri Jul 27 05:47:11 UTC 2007


http://perforce.freebsd.org/chv.cgi?CH=124157

Change 124157 by loafier at 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;
 }
 


More information about the p4-projects mailing list