PERFORCE change 124151 for review

Christopher Davis loafier at FreeBSD.org
Fri Jul 27 04:39:15 UTC 2007


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

Change 124151 by loafier at 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, &regid,
-		    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;
 }
 


More information about the p4-projects mailing list