PERFORCE change 124161 for review

Christopher Davis loafier at FreeBSD.org
Fri Jul 27 07:56:01 UTC 2007


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

Change 124161 by loafier at chrisdsoc on 2007/07/27 07:55:51

	Use bus_alloc_resources, etc

Affected files ...

.. //depot/projects/soc2007/loafier_busalloc/src/sys/dev/sound/pci/ds1.c#2 edit

Differences ...

==== //depot/projects/soc2007/loafier_busalloc/src/sys/dev/sound/pci/ds1.c#2 (text+ko) ====

@@ -102,19 +102,29 @@
 	struct sc_info *parent;
 };
 
+
+enum {
+	RES_MEM,
+	RES_IRQ,
+	RES_SZ
+};
+
+static struct resource_spec ds_res_spec[] = {
+	{SYS_RES_MEMORY, PCIR_BAR(0), RF_ACTIVE},
+	{SYS_RES_IRQ, 0, RF_ACTIVE | RF_SHAREABLE},
+	{-1, 0, 0}
+};
+
 /* device private data */
 struct sc_info {
 	device_t	dev;
 	u_int32_t 	type, rev;
 	u_int32_t	cd2id, ctrlbase;
 
-	bus_space_tag_t st;
-	bus_space_handle_t sh;
 	bus_dma_tag_t buffer_dmat, control_dmat;
 	bus_dmamap_t map;
 
-	struct resource *reg, *irq;
-	int		regid, irqid;
+	struct resource *res[RES_SZ];
 	void		*ih;
 	struct mtx	*lock;
 
@@ -160,10 +170,6 @@
 static int       ds_init(struct sc_info *);
 static void      ds_intr(void *);
 
-/* talk to the card */
-static u_int32_t ds_rd(struct sc_info *, int, int);
-static void 	 ds_wr(struct sc_info *, int, u_int32_t, int);
-
 /* -------------------------------------------------------------------- */
 
 static u_int32_t ds_recfmt[] = {
@@ -190,42 +196,22 @@
 
 /* -------------------------------------------------------------------- */
 /* Hardware */
-static u_int32_t
-ds_rd(struct sc_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 0xffffffff;
-	}
-}
+#define ds_rd1(_sc, _reg) bus_read_1((_sc)->res[RES_MEM], _reg)
+#define ds_rd2(_sc, _reg) bus_read_2((_sc)->res[RES_MEM], _reg)
+#define ds_rd4(_sc, _reg) bus_read_4((_sc)->res[RES_MEM], _reg)
+#define ds_wr1(_sc, _reg, _val) bus_write_1((_sc)->res[RES_MEM], _reg, _val)
+#define ds_wr2(_sc, _reg, _val) bus_write_2((_sc)->res[RES_MEM], _reg, _val)
+#define ds_wr4(_sc, _reg, _val) bus_write_4((_sc)->res[RES_MEM], _reg, _val)
 
 static void
-ds_wr(struct sc_info *sc, int regno, u_int32_t data, int size)
+wrl(struct sc_info *sc, u_int32_t *ptr, u_int32_t val)
 {
-	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;
-	}
-}
+	struct resource *mem = sc->res[RES_MEM];
 
-static void
-wrl(struct sc_info *sc, u_int32_t *ptr, u_int32_t val)
-{
 	*(volatile u_int32_t *)ptr = val;
-	bus_space_barrier(sc->st, sc->sh, 0, 0, BUS_SPACE_BARRIER_WRITE);
+	bus_space_barrier(rman_get_bustag(mem), 
+			  rman_get_bushandle(mem), 
+			  0, 0, BUS_SPACE_BARRIER_WRITE);
 }
 
 /* -------------------------------------------------------------------- */
@@ -238,7 +224,7 @@
 	reg = sec? YDSXGR_SECSTATUSADR : YDSXGR_PRISTATUSADR;
 	i = YDSXG_AC97TIMEOUT;
 	while (i > 0) {
-		if (!(ds_rd(sc, reg, 2) & 0x8000))
+		if (!(ds_rd2(sc, reg) & 0x8000))
 			return 0;
 		i--;
 	}
@@ -286,16 +272,16 @@
 		return 0xffffffff;
 
 	cmd = YDSXG_AC97READCMD | cid | regno;
-	ds_wr(sc, YDSXGR_AC97CMDADR, cmd, 2);
+	ds_wr2(sc, YDSXGR_AC97CMDADR, cmd);
 
 	if (ds_cdbusy(sc, sec))
 		return 0xffffffff;
 
 	if (sc->type == 11 && sc->rev < 2)
 		for (i = 0; i < 600; i++)
-			ds_rd(sc, reg, 2);
+			ds_rd2(sc, reg);
 
-	return ds_rd(sc, reg, 2);
+	return ds_rd2(sc, reg);
 }
 
 static int
@@ -314,7 +300,7 @@
 	cmd = YDSXG_AC97WRITECMD | cid | regno;
 	cmd <<= 16;
 	cmd |= data;
-	ds_wr(sc, YDSXGR_AC97CMDDATA, cmd, 4);
+	ds_wr4(sc, YDSXGR_AC97CMDDATA, cmd);
 
 	return ds_cdbusy(sc, sec);
 }
@@ -336,13 +322,13 @@
 
 	v = on? 1 : 0;
 	if (on) {
-		ds_wr(sc, YDSXGR_CONFIG, 0x00000001, 4);
+		ds_wr4(sc, YDSXGR_CONFIG, 0x00000001);
 	} else {
-		if (ds_rd(sc, YDSXGR_CONFIG, 4))
-			ds_wr(sc, YDSXGR_CONFIG, 0x00000000, 4);
+		if (ds_rd4(sc, YDSXGR_CONFIG))
+			ds_wr4(sc, YDSXGR_CONFIG, 0x00000000);
 		i = YDSXG_WORKBITTIMEOUT;
 		while (i > 0) {
-			if (!(ds_rd(sc, YDSXGR_CONFIG, 4) & 0x00000002))
+			if (!(ds_rd4(sc, YDSXGR_CONFIG) & 0x00000002))
 				break;
 			i--;
 		}
@@ -468,8 +454,8 @@
 	y = (48000 * 4096) / ch->spd;
 	y--;
 	/* printf("pri = %d, x = %d, y = %d\n", pri, x, y); */
-	ds_wr(sc, pri? YDSXGR_ADCFORMAT : YDSXGR_RECFORMAT, x, 4);
-	ds_wr(sc, pri? YDSXGR_ADCSLOTSR : YDSXGR_RECSLOTSR, y, 4);
+	ds_wr4(sc, pri? YDSXGR_ADCFORMAT : YDSXGR_RECFORMAT, x);
+	ds_wr4(sc, pri? YDSXGR_ADCSLOTSR : YDSXGR_RECSLOTSR, y);
 }
 
 /* -------------------------------------------------------------------- */
@@ -554,7 +540,7 @@
 		ds_enapslot(sc, ch->lsnum, 1);
 		ds_enapslot(sc, ch->rsnum, stereo);
 		snd_mtxlock(sc->lock);
-		ds_wr(sc, YDSXGR_MODE, 0x00000003, 4);
+		ds_wr4(sc, YDSXGR_MODE, 0x00000003);
 		snd_mtxunlock(sc->lock);
 	} else {
 		ch->run = 0;
@@ -679,17 +665,17 @@
 		ch->run = 1;
 		ds_setuprch(ch);
 		snd_mtxlock(sc->lock);
-		x = ds_rd(sc, YDSXGR_MAPOFREC, 4);
+		x = ds_rd4(sc, YDSXGR_MAPOFREC);
 		x |= (ch->num == DS1_RECPRIMARY)? 0x02 : 0x01;
-		ds_wr(sc, YDSXGR_MAPOFREC, x, 4);
-		ds_wr(sc, YDSXGR_MODE, 0x00000003, 4);
+		ds_wr4(sc, YDSXGR_MAPOFREC, x);
+		ds_wr4(sc, YDSXGR_MODE, 0x00000003);
 		snd_mtxunlock(sc->lock);
 	} else {
 		ch->run = 0;
 		snd_mtxlock(sc->lock);
-		x = ds_rd(sc, YDSXGR_MAPOFREC, 4);
+		x = ds_rd4(sc, YDSXGR_MAPOFREC);
 		x &= ~((ch->num == DS1_RECPRIMARY)? 0x02 : 0x01);
-		ds_wr(sc, YDSXGR_MAPOFREC, x, 4);
+		ds_wr4(sc, YDSXGR_MAPOFREC, x);
 		snd_mtxunlock(sc->lock);
 	}
 
@@ -732,12 +718,12 @@
 	u_int32_t i, x;
 
 	snd_mtxlock(sc->lock);
-	i = ds_rd(sc, YDSXGR_STATUS, 4);
+	i = ds_rd4(sc, YDSXGR_STATUS);
 	if (i & 0x00008000)
 		device_printf(sc->dev, "timeout irq\n");
 	if (i & 0x80008000) {
-		ds_wr(sc, YDSXGR_STATUS, i & 0x80008000, 4);
-		sc->currbank = ds_rd(sc, YDSXGR_CTRLSELECT, 4) & 0x00000001;
+		ds_wr4(sc, YDSXGR_STATUS, i & 0x80008000);
+		sc->currbank = ds_rd4(sc, YDSXGR_CTRLSELECT) & 0x00000001;
 
 		x = 0;
 		for (i = 0; i < DS1_CHANS; i++) {
@@ -756,9 +742,9 @@
 				snd_mtxlock(sc->lock);
 			}
 		}
-		i = ds_rd(sc, YDSXGR_MODE, 4);
+		i = ds_rd4(sc, YDSXGR_MODE);
 		if (x)
-			ds_wr(sc, YDSXGR_MODE, i | 0x00000002, 4);
+			ds_wr4(sc, YDSXGR_MODE, i | 0x00000002);
 
 	}
 	snd_mtxunlock(sc->lock);
@@ -794,29 +780,29 @@
 
 	ci = ds_devs[sc->type].mcode;
 
-	ds_wr(sc, YDSXGR_NATIVEDACOUTVOL, 0x00000000, 4);
+	ds_wr4(sc, YDSXGR_NATIVEDACOUTVOL, 0x00000000);
 	ds_enadsp(sc, 0);
-	ds_wr(sc, YDSXGR_MODE, 0x00010000, 4);
-	ds_wr(sc, YDSXGR_MODE, 0x00000000, 4);
-	ds_wr(sc, YDSXGR_MAPOFREC, 0x00000000, 4);
-	ds_wr(sc, YDSXGR_MAPOFEFFECT, 0x00000000, 4);
-	ds_wr(sc, YDSXGR_PLAYCTRLBASE, 0x00000000, 4);
-	ds_wr(sc, YDSXGR_RECCTRLBASE, 0x00000000, 4);
-	ds_wr(sc, YDSXGR_EFFCTRLBASE, 0x00000000, 4);
-	r = ds_rd(sc, YDSXGR_GLOBALCTRL, 2);
-	ds_wr(sc, YDSXGR_GLOBALCTRL, r & ~0x0007, 2);
+	ds_wr4(sc, YDSXGR_MODE, 0x00010000);
+	ds_wr4(sc, YDSXGR_MODE, 0x00000000);
+	ds_wr4(sc, YDSXGR_MAPOFREC, 0x00000000);
+	ds_wr4(sc, YDSXGR_MAPOFEFFECT, 0x00000000);
+	ds_wr4(sc, YDSXGR_PLAYCTRLBASE, 0x00000000);
+	ds_wr4(sc, YDSXGR_RECCTRLBASE, 0x00000000);
+	ds_wr4(sc, YDSXGR_EFFCTRLBASE, 0x00000000);
+	r = ds_rd2(sc, YDSXGR_GLOBALCTRL);
+	ds_wr2(sc, YDSXGR_GLOBALCTRL, r & ~0x0007);
 
 	for (i = 0; i < YDSXG_DSPLENGTH; i += 4)
-		ds_wr(sc, YDSXGR_DSPINSTRAM + i, DspInst[i >> 2], 4);
+		ds_wr4(sc, YDSXGR_DSPINSTRAM + i, DspInst[i >> 2]);
 
 	for (i = 0; i < YDSXG_CTRLLENGTH; i += 4)
-		ds_wr(sc, YDSXGR_CTRLINSTRAM + i, ci[i >> 2], 4);
+		ds_wr4(sc, YDSXGR_CTRLINSTRAM + i, ci[i >> 2]);
 
 	ds_enadsp(sc, 1);
 
 	pcs = 0;
 	for (i = 100; i > 0; i--) {
-		pcs = ds_rd(sc, YDSXGR_PLAYCTRLSIZE, 4) << 2;
+		pcs = ds_rd4(sc, YDSXGR_PLAYCTRLSIZE) << 2;
 		if (pcs == sizeof(struct pbank))
 			break;
 		DELAY(1000);
@@ -825,9 +811,9 @@
 		device_printf(sc->dev, "preposterous playctrlsize (%d)\n", pcs);
 		return -1;
 	}
-	rcs = ds_rd(sc, YDSXGR_RECCTRLSIZE, 4) << 2;
-	ecs = ds_rd(sc, YDSXGR_EFFCTRLSIZE, 4) << 2;
-	ws = ds_rd(sc, YDSXGR_WORKSIZE, 4) << 2;
+	rcs = ds_rd4(sc, YDSXGR_RECCTRLSIZE) << 2;
+	ecs = ds_rd4(sc, YDSXGR_EFFCTRLSIZE) << 2;
+	ws = ds_rd4(sc, YDSXGR_WORKSIZE) << 2;
 
 	memsz = 64 * 2 * pcs + 2 * 2 * rcs + 5 * 2 * ecs + ws;
 	memsz += (64 + 1) * 4;
@@ -852,16 +838,16 @@
 
 	cb = 0;
 	t = buf;
-	ds_wr(sc, YDSXGR_WORKBASE, sc->ctrlbase + cb, 4);
+	ds_wr4(sc, YDSXGR_WORKBASE, sc->ctrlbase + cb);
 	cb += ws;
 	sc->pbase = (u_int32_t *)(t + cb);
 	/* printf("pbase = %p -> 0x%x\n", sc->pbase, sc->ctrlbase + cb); */
-	ds_wr(sc, YDSXGR_PLAYCTRLBASE, sc->ctrlbase + cb, 4);
+	ds_wr4(sc, YDSXGR_PLAYCTRLBASE, sc->ctrlbase + cb);
 	cb += (64 + 1) * 4;
 	sc->rbank = (struct rbank *)(t + cb);
-	ds_wr(sc, YDSXGR_RECCTRLBASE, sc->ctrlbase + cb, 4);
+	ds_wr4(sc, YDSXGR_RECCTRLBASE, sc->ctrlbase + cb);
 	cb += 2 * 2 * rcs;
-	ds_wr(sc, YDSXGR_EFFCTRLBASE, sc->ctrlbase + cb, 4);
+	ds_wr4(sc, YDSXGR_EFFCTRLBASE, sc->ctrlbase + cb);
 	cb += 5 * 2 * ecs;
 
 	sc->pbankbase = sc->ctrlbase + cb;
@@ -878,9 +864,9 @@
 	wrl(sc, &sc->pbase[0], DS1_CHANS * 2);
 
 	sc->pchn = sc->rchn = 0;
-	ds_wr(sc, YDSXGR_NATIVEDACOUTVOL, 0x3fff3fff, 4);
-	ds_wr(sc, YDSXGR_NATIVEADCINVOL, 0x3fff3fff, 4);
-	ds_wr(sc, YDSXGR_NATIVEDACINVOL, 0x3fff3fff, 4);
+	ds_wr4(sc, YDSXGR_NATIVEDACOUTVOL, 0x3fff3fff);
+	ds_wr4(sc, YDSXGR_NATIVEADCINVOL, 0x3fff3fff);
+	ds_wr4(sc, YDSXGR_NATIVEDACINVOL, 0x3fff3fff);
 
 	return 0;
 }
@@ -888,17 +874,17 @@
 static int
 ds_uninit(struct sc_info *sc)
 {
-	ds_wr(sc, YDSXGR_NATIVEDACOUTVOL, 0x00000000, 4);
-	ds_wr(sc, YDSXGR_NATIVEADCINVOL, 0, 4);
-	ds_wr(sc, YDSXGR_NATIVEDACINVOL, 0, 4);
+	ds_wr4(sc, YDSXGR_NATIVEDACOUTVOL, 0x00000000);
+	ds_wr4(sc, YDSXGR_NATIVEADCINVOL, 0);
+	ds_wr4(sc, YDSXGR_NATIVEDACINVOL, 0);
 	ds_enadsp(sc, 0);
-	ds_wr(sc, YDSXGR_MODE, 0x00010000, 4);
-	ds_wr(sc, YDSXGR_MAPOFREC, 0x00000000, 4);
-	ds_wr(sc, YDSXGR_MAPOFEFFECT, 0x00000000, 4);
-	ds_wr(sc, YDSXGR_PLAYCTRLBASE, 0x00000000, 4);
-	ds_wr(sc, YDSXGR_RECCTRLBASE, 0x00000000, 4);
-	ds_wr(sc, YDSXGR_EFFCTRLBASE, 0x00000000, 4);
-	ds_wr(sc, YDSXGR_GLOBALCTRL, 0, 2);
+	ds_wr4(sc, YDSXGR_MODE, 0x00010000);
+	ds_wr4(sc, YDSXGR_MAPOFREC, 0x00000000);
+	ds_wr4(sc, YDSXGR_MAPOFEFFECT, 0x00000000);
+	ds_wr4(sc, YDSXGR_PLAYCTRLBASE, 0x00000000);
+	ds_wr4(sc, YDSXGR_RECCTRLBASE, 0x00000000);
+	ds_wr4(sc, YDSXGR_EFFCTRLBASE, 0x00000000);
+	ds_wr2(sc, YDSXGR_GLOBALCTRL, 0);
 
 	bus_dmamap_unload(sc->control_dmat, sc->map);
 	bus_dmamem_free(sc->control_dmat, sc->regbase, sc->map);
@@ -919,6 +905,24 @@
 	return -1;
 }
 
+static void
+ds_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, ds_res_spec, sc->res);
+	if (sc->buffer_dmat)
+		bus_dma_tag_destroy(sc->buffer_dmat);
+	if (sc->control_dmat)
+		bus_dma_tag_destroy(sc->control_dmat);
+	if (sc->lock)
+		snd_mtxfree(sc->lock);
+	free(sc, M_DEVBUF);
+}
+
 static int
 ds_pci_probe(device_t dev)
 {
@@ -937,7 +941,6 @@
 static int
 ds_pci_attach(device_t dev)
 {
-	u_int32_t	data;
 	u_int32_t subdev, i;
 	struct sc_info *sc;
 	struct ac97_info *codec = NULL;
@@ -950,22 +953,14 @@
 	sc->type = ds_finddev(pci_get_devid(dev), subdev);
 	sc->rev = pci_get_revid(dev);
 
-	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);
-	data = pci_read_config(dev, PCIR_COMMAND, 2);
+	pci_enable_busmaster(dev);
+	pci_enable_io(dev, SYS_RES_MEMORY);
 
-	sc->regid = PCIR_BAR(0);
-	sc->reg = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &sc->regid,
-					 RF_ACTIVE);
-	if (!sc->reg) {
-		device_printf(dev, "unable to map register space\n");
+	if (bus_alloc_resources(dev, ds_res_spec, sc->res) != 0) {
+		device_printf(dev, "unable to allocate resources\n");
 		goto bad;
-	}
+	}	
 
-	sc->st = rman_get_bustag(sc->reg);
-	sc->sh = rman_get_bushandle(sc->reg);
-
 	sc->bufsz = pcm_getbuffersize(dev, 4096, DS1_BUFFSIZE, 65536);
 
 	if (bus_dma_tag_create(/*parent*/bus_get_dma_tag(dev), /*alignment*/2,
@@ -1002,16 +997,16 @@
 	}
 	mixer_init(dev, ac97_getmixerclass(), codec);
 
-	sc->irqid = 0;
-	sc->irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &sc->irqid,
-					 RF_ACTIVE | RF_SHAREABLE);
-	if (!sc->irq || snd_setup_intr(dev, sc->irq, INTR_MPSAFE, ds_intr, sc, &sc->ih)) {
+	if (snd_setup_intr(dev, sc->res[RES_IRQ], INTR_MPSAFE, 
+	    ds_intr, sc, &sc->ih)) {
 		device_printf(dev, "unable to map interrupt\n");
 		goto bad;
 	}
 
 	snprintf(status, SND_STATUSLEN, "at memory 0x%lx irq %ld %s",
-		 rman_get_start(sc->reg), rman_get_start(sc->irq),PCM_KLDSTRING(snd_ds1));
+		 rman_get_start(sc->res[RES_MEM]), 
+		 rman_get_start(sc->res[RES_IRQ]),
+		 PCM_KLDSTRING(snd_ds1));
 
 	if (pcm_register(dev, sc, DS1_CHANS, 2))
 		goto bad;
@@ -1026,19 +1021,8 @@
 bad:
 	if (codec)
 		ac97_destroy(codec);
-	if (sc->reg)
-		bus_release_resource(dev, SYS_RES_MEMORY, sc->regid, sc->reg);
-	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->buffer_dmat)
-		bus_dma_tag_destroy(sc->buffer_dmat);
-	if (sc->control_dmat)
-		bus_dma_tag_destroy(sc->control_dmat);
-	if (sc->lock)
-		snd_mtxfree(sc->lock);
-	free(sc, M_DEVBUF);
+	ds_destroy(dev, sc);
+
 	return ENXIO;
 }
 
@@ -1072,13 +1056,8 @@
 
 	sc = pcm_getdevinfo(dev);
 	ds_uninit(sc);
-	bus_release_resource(dev, SYS_RES_MEMORY, sc->regid, sc->reg);
-	bus_teardown_intr(dev, sc->irq, sc->ih);
-	bus_release_resource(dev, SYS_RES_IRQ, sc->irqid, sc->irq);
-	bus_dma_tag_destroy(sc->buffer_dmat);
-	bus_dma_tag_destroy(sc->control_dmat);
-	snd_mtxfree(sc->lock);
-	free(sc, M_DEVBUF);
+	ds_destroy(dev, sc);
+
        	return 0;
 }
 


More information about the p4-projects mailing list