Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 28 Jul 2007 16:54:17 GMT
From:      Christopher Davis <loafier@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 124270 for review
Message-ID:  <200707281654.l6SGsHQJ063201@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=124270

Change 124270 by loafier@chrisdsoc on 2007/07/28 16:54:06

	Edit for bus_alloc_resources, etc

Affected files ...

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

Differences ...

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

@@ -109,37 +109,38 @@
 	struct codec_entry *codec;
 };
 
+enum {
+	RES_CS,
+	RES_DDMA,
+	RES_DS,
+	RES_MT,
+	RES_IRQ,
+	RES_SZ
+};
+
+static struct resource_spec envy24_res_spec[] = {
+	{SYS_RES_IOPORT, PCIR_CCS, RF_ACTIVE},
+	{SYS_RES_IOPORT, PCIR_DDMA, RF_ACTIVE},
+	{SYS_RES_IOPORT, PCIR_DS, RF_ACTIVE},
+	{SYS_RES_IOPORT, PCIR_MT, RF_ACTIVE},
+	{SYS_RES_IRQ, 0, RF_ACTIVE | RF_SHAREABLE},
+	{-1, 0, 0}
+};
+
 /* device private data */
 struct sc_info {
 	device_t	dev;
 	struct mtx	*lock;
 
 	/* Control/Status registor */
-	struct resource *cs;
-	int		csid;
-	bus_space_tag_t cst;
-	bus_space_handle_t csh;
 	/* DDMA registor */
-	struct resource *ddma;
-	int		ddmaid;
-	bus_space_tag_t ddmat;
-	bus_space_handle_t ddmah;
 	/* Consumer Section DMA Channel Registers */
-	struct resource *ds;
-	int		dsid;
-	bus_space_tag_t dst;
-	bus_space_handle_t dsh;
 	/* MultiTrack registor */
-	struct resource *mt;
-	int		mtid;
-	bus_space_tag_t mtt;
-	bus_space_handle_t mth;
 	/* DMA tag */
-	bus_dma_tag_t dmat;
 	/* IRQ resource */
-	struct resource *irq;
-	int		irqid;
+	struct resource *res[RES_SZ];
 	void		*ih;
+	bus_dma_tag_t dmat;
 
 	/* system configuration data */
 	struct cfg_info *cfg;
@@ -350,80 +351,38 @@
 /* -------------------------------------------------------------------- */
 
 /* common routines */
-static u_int32_t
-envy24_rdcs(struct sc_info *sc, int regno, int size)
-{
-	switch (size) {
-	case 1:
-		return bus_space_read_1(sc->cst, sc->csh, regno);
-	case 2:
-		return bus_space_read_2(sc->cst, sc->csh, regno);
-	case 4:
-		return bus_space_read_4(sc->cst, sc->csh, regno);
-	default:
-		return 0xffffffff;
-	}
-}
+#define envy24_rdcs1(_sc, _reg) bus_read_1((_sc)->res[RES_CS], _reg)
+#define envy24_rdcs2(_sc, _reg) bus_read_2((_sc)->res[RES_CS], _reg)
+#define envy24_rdcs4(_sc, _reg) bus_read_4((_sc)->res[RES_CS], _reg)
+#define envy24_wrcs1(_sc, _reg, _val) \
+	bus_write_1((_sc)->res[RES_CS], _reg, _val)
+#define envy24_wrcs2(_sc, _reg, _val) \
+	bus_write_2((_sc)->res[RES_CS], _reg, _val)
+#define envy24_wrcs4(_sc, _reg, _val) \
+	bus_write_4((_sc)->res[RES_CS], _reg, _val)
 
-static void
-envy24_wrcs(struct sc_info *sc, int regno, u_int32_t data, int size)
-{
-	switch (size) {
-	case 1:
-		bus_space_write_1(sc->cst, sc->csh, regno, data);
-		break;
-	case 2:
-		bus_space_write_2(sc->cst, sc->csh, regno, data);
-		break;
-	case 4:
-		bus_space_write_4(sc->cst, sc->csh, regno, data);
-		break;
-	}
-}
+#define envy24_rdmt1(_sc, _reg) bus_read_1((_sc)->res[RES_MT], _reg)
+#define envy24_rdmt2(_sc, _reg) bus_read_2((_sc)->res[RES_MT], _reg)
+#define envy24_rdmt4(_sc, _reg) bus_read_4((_sc)->res[RES_MT], _reg)
+#define envy24_wrmt1(_sc, _reg, _val) \
+	bus_write_1((_sc)->res[RES_MT], _reg, _val)
+#define envy24_wrmt2(_sc, _reg, _val) \
+	bus_write_2((_sc)->res[RES_MT], _reg, _val)
+#define envy24_wrmt4(_sc, _reg, _val) \
+	bus_write_4((_sc)->res[RES_MT], _reg, _val)
 
 static u_int32_t
-envy24_rdmt(struct sc_info *sc, int regno, int size)
-{
-	switch (size) {
-	case 1:
-		return bus_space_read_1(sc->mtt, sc->mth, regno);
-	case 2:
-		return bus_space_read_2(sc->mtt, sc->mth, regno);
-	case 4:
-		return bus_space_read_4(sc->mtt, sc->mth, regno);
-	default:
-		return 0xffffffff;
-	}
-}
-
-static void
-envy24_wrmt(struct sc_info *sc, int regno, u_int32_t data, int size)
-{
-	switch (size) {
-	case 1:
-		bus_space_write_1(sc->mtt, sc->mth, regno, data);
-		break;
-	case 2:
-		bus_space_write_2(sc->mtt, sc->mth, regno, data);
-		break;
-	case 4:
-		bus_space_write_4(sc->mtt, sc->mth, regno, data);
-		break;
-	}
-}
-
-static u_int32_t
 envy24_rdci(struct sc_info *sc, int regno)
 {
-	envy24_wrcs(sc, ENVY24_CCS_INDEX, regno, 1);
-	return envy24_rdcs(sc, ENVY24_CCS_DATA, 1);
+	envy24_wrcs1(sc, ENVY24_CCS_INDEX, regno);
+	return envy24_rdcs1(sc, ENVY24_CCS_DATA);
 }
 
 static void
 envy24_wrci(struct sc_info *sc, int regno, u_int32_t data)
 {
-	envy24_wrcs(sc, ENVY24_CCS_INDEX, regno, 1);
-	envy24_wrcs(sc, ENVY24_CCS_DATA, data, 1);
+	envy24_wrcs1(sc, ENVY24_CCS_INDEX, regno);
+	envy24_wrcs1(sc, ENVY24_CCS_DATA, data);
 }
 
 /* -------------------------------------------------------------------- */
@@ -440,7 +399,7 @@
 	device_printf(sc->dev, "envy24_rdi2c(sc, 0x%02x, 0x%02x)\n", dev, addr);
 #endif
 	for (i = 0; i < ENVY24_TIMEOUT; i++) {
-		data = envy24_rdcs(sc, ENVY24_CCS_I2CSTAT, 1);
+		data = envy24_rdcs1(sc, ENVY24_CCS_I2CSTAT);
 		if ((data & ENVY24_CCS_I2CSTAT_BSY) == 0)
 			break;
 		DELAY(32); /* 31.25kHz */
@@ -448,11 +407,11 @@
 	if (i == ENVY24_TIMEOUT) {
 		return -1;
 	}
-	envy24_wrcs(sc, ENVY24_CCS_I2CADDR, addr, 1);
-	envy24_wrcs(sc, ENVY24_CCS_I2CDEV,
-	    (dev & ENVY24_CCS_I2CDEV_ADDR) | ENVY24_CCS_I2CDEV_RD, 1);
+	envy24_wrcs1(sc, ENVY24_CCS_I2CADDR, addr);
+	envy24_wrcs1(sc, ENVY24_CCS_I2CDEV,
+	    (dev & ENVY24_CCS_I2CDEV_ADDR) | ENVY24_CCS_I2CDEV_RD);
 	for (i = 0; i < ENVY24_TIMEOUT; i++) {
-		data = envy24_rdcs(sc, ENVY24_CCS_I2CSTAT, 1);
+		data = envy24_rdcs1(sc, ENVY24_CCS_I2CSTAT);
 		if ((data & ENVY24_CCS_I2CSTAT_BSY) == 0)
 			break;
 		DELAY(32); /* 31.25kHz */
@@ -460,7 +419,7 @@
 	if (i == ENVY24_TIMEOUT) {
 		return -1;
 	}
-	data = envy24_rdcs(sc, ENVY24_CCS_I2CDATA, 1);
+	data = envy24_rdcs1(sc, ENVY24_CCS_I2CDATA);
 
 #if(0)
 	device_printf(sc->dev, "envy24_rdi2c(): return 0x%x\n", data);
@@ -479,7 +438,7 @@
 	device_printf(sc->dev, "envy24_rdi2c(sc, 0x%02x, 0x%02x)\n", dev, addr);
 #endif
 	for (i = 0; i < ENVY24_TIMEOUT; i++) {
-		tmp = envy24_rdcs(sc, ENVY24_CCS_I2CSTAT, 1);
+		tmp = envy24_rdcs1(sc, ENVY24_CCS_I2CSTAT);
 		if ((tmp & ENVY24_CCS_I2CSTAT_BSY) == 0)
 			break;
 		DELAY(32); /* 31.25kHz */
@@ -487,12 +446,12 @@
 	if (i == ENVY24_TIMEOUT) {
 		return -1;
 	}
-	envy24_wrcs(sc, ENVY24_CCS_I2CADDR, addr, 1);
-	envy24_wrcs(sc, ENVY24_CCS_I2CDATA, data, 1);
-	envy24_wrcs(sc, ENVY24_CCS_I2CDEV,
-	    (dev & ENVY24_CCS_I2CDEV_ADDR) | ENVY24_CCS_I2CDEV_WR, 1);
+	envy24_wrcs1(sc, ENVY24_CCS_I2CADDR, addr);
+	envy24_wrcs1(sc, ENVY24_CCS_I2CDATA, data);
+	envy24_wrcs1(sc, ENVY24_CCS_I2CDEV,
+	    (dev & ENVY24_CCS_I2CDEV_ADDR) | ENVY24_CCS_I2CDEV_WR);
 	for (i = 0; i < ENVY24_TIMEOUT; i++) {
-		data = envy24_rdcs(sc, ENVY24_CCS_I2CSTAT, 1);
+		data = envy24_rdcs1(sc, ENVY24_CCS_I2CSTAT);
 		if ((data & ENVY24_CCS_I2CSTAT_BSY) == 0)
 			break;
 		DELAY(32); /* 31.25kHz */
@@ -513,7 +472,7 @@
 #if(0)
 	device_printf(sc->dev, "envy24_rdrom(sc, 0x%02x)\n", addr);
 #endif
-	data = envy24_rdcs(sc, ENVY24_CCS_I2CSTAT, 1);
+	data = envy24_rdcs1(sc, ENVY24_CCS_I2CSTAT);
 	if ((data & ENVY24_CCS_I2CSTAT_ROM) == 0) {
 #if(0)
 		device_printf(sc->dev, "envy24_rdrom(): E2PROM not presented\n");
@@ -595,12 +554,12 @@
 #if(0)
 	device_printf(sc->dev, "envy24_coldcd()\n");
 #endif
-	envy24_wrmt(sc, ENVY24_MT_AC97CMD, ENVY24_MT_AC97CMD_CLD, 1);
+	envy24_wrmt1(sc, ENVY24_MT_AC97CMD, ENVY24_MT_AC97CMD_CLD);
 	DELAY(10);
-	envy24_wrmt(sc, ENVY24_MT_AC97CMD, 0, 1);
+	envy24_wrmt1(sc, ENVY24_MT_AC97CMD, 0);
 	DELAY(1000);
 	for (i = 0; i < ENVY24_TIMEOUT; i++) {
-		data = envy24_rdmt(sc, ENVY24_MT_AC97CMD, 1);
+		data = envy24_rdmt1(sc, ENVY24_MT_AC97CMD);
 		if (data & ENVY24_MT_AC97CMD_RDY) {
 			return 0;
 		}
@@ -619,13 +578,13 @@
 #if(0)
 	device_printf(sc->dev, "envy24_slavecd()\n");
 #endif
-	envy24_wrmt(sc, ENVY24_MT_AC97CMD,
-	    ENVY24_MT_AC97CMD_CLD | ENVY24_MT_AC97CMD_WRM, 1);
+	envy24_wrmt1(sc, ENVY24_MT_AC97CMD,
+	    ENVY24_MT_AC97CMD_CLD | ENVY24_MT_AC97CMD_WRM);
 	DELAY(10);
-	envy24_wrmt(sc, ENVY24_MT_AC97CMD, 0, 1);
+	envy24_wrmt1(sc, ENVY24_MT_AC97CMD, 0);
 	DELAY(1000);
 	for (i = 0; i < ENVY24_TIMEOUT; i++) {
-		data = envy24_rdmt(sc, ENVY24_MT_AC97CMD, 1);
+		data = envy24_rdmt1(sc, ENVY24_MT_AC97CMD);
 		if (data & ENVY24_MT_AC97CMD_RDY) {
 			return 0;
 		}
@@ -645,14 +604,14 @@
 #if(0)
 	device_printf(sc->dev, "envy24_rdcd(obj, sc, 0x%02x)\n", regno);
 #endif
-	envy24_wrmt(sc, ENVY24_MT_AC97IDX, (u_int32_t)regno, 1);
-	envy24_wrmt(sc, ENVY24_MT_AC97CMD, ENVY24_MT_AC97CMD_RD, 1);
+	envy24_wrmt1(sc, ENVY24_MT_AC97IDX, (u_int32_t)regno);
+	envy24_wrmt1(sc, ENVY24_MT_AC97CMD, ENVY24_MT_AC97CMD_RD);
 	for (i = 0; i < ENVY24_TIMEOUT; i++) {
-		data = envy24_rdmt(sc, ENVY24_MT_AC97CMD, 1);
+		data = envy24_rdmt1(sc, ENVY24_MT_AC97CMD);
 		if ((data & ENVY24_MT_AC97CMD_RD) == 0)
 			break;
 	}
-	data = envy24_rdmt(sc, ENVY24_MT_AC97DLO, 2);
+	data = envy24_rdmt2(sc, ENVY24_MT_AC97DLO);
 
 #if(0)
 	device_printf(sc->dev, "envy24_rdcd(): return 0x%x\n", data);
@@ -670,11 +629,11 @@
 #if(0)
 	device_printf(sc->dev, "envy24_wrcd(obj, sc, 0x%02x, 0x%04x)\n", regno, data);
 #endif
-	envy24_wrmt(sc, ENVY24_MT_AC97IDX, (u_int32_t)regno, 1);
-	envy24_wrmt(sc, ENVY24_MT_AC97DLO, (u_int32_t)data, 2);
-	envy24_wrmt(sc, ENVY24_MT_AC97CMD, ENVY24_MT_AC97CMD_WR, 1);
+	envy24_wrmt1(sc, ENVY24_MT_AC97IDX, (u_int32_t)regno);
+	envy24_wrmt2(sc, ENVY24_MT_AC97DLO, (u_int32_t)data);
+	envy24_wrmt1(sc, ENVY24_MT_AC97CMD, ENVY24_MT_AC97CMD_WR);
 	for (i = 0; i < ENVY24_TIMEOUT; i++) {
-		cmd = envy24_rdmt(sc, ENVY24_MT_AC97CMD, 1);
+		cmd = envy24_rdmt1(sc, ENVY24_MT_AC97CMD);
 		if ((cmd & ENVY24_MT_AC97CMD_WR) == 0)
 			break;
 	}
@@ -1065,8 +1024,8 @@
 	device_printf(sc->dev, "envy24_setspeed(): speed %d/code 0x%04x\n", envy24_speedtab[i].speed, code);
 #endif
 	if (code < 0x10) {
-		envy24_wrmt(sc, ENVY24_MT_RATE, code, 1);
-		code = envy24_rdmt(sc, ENVY24_MT_RATE, 1);
+		envy24_wrmt1(sc, ENVY24_MT_RATE, code);
+		code = envy24_rdmt1(sc, ENVY24_MT_RATE);
 		code &= ENVY24_MT_RATE_MASK;
 		for (i = 0; envy24_speedtab[i].code < 0x10; i++) {
 			if (envy24_speedtab[i].code == code)
@@ -1090,16 +1049,16 @@
 	device_printf(sc->dev, "envy24_setvolume(sc, %d)\n", ch);
 #endif
 if (sc->cfg->subvendor==0x153b  && sc->cfg->subdevice==0x1138 ) {
-        envy24_wrmt(sc, ENVY24_MT_VOLIDX, 16, 1);
-        envy24_wrmt(sc, ENVY24_MT_VOLUME, 0x7f7f, 2);
-        envy24_wrmt(sc, ENVY24_MT_VOLIDX, 17, 1);
-        envy24_wrmt(sc, ENVY24_MT_VOLUME, 0x7f7f, 2);
+        envy24_wrmt1(sc, ENVY24_MT_VOLIDX, 16);
+        envy24_wrmt2(sc, ENVY24_MT_VOLUME, 0x7f7f);
+        envy24_wrmt1(sc, ENVY24_MT_VOLIDX, 17);
+        envy24_wrmt2(sc, ENVY24_MT_VOLUME, 0x7f7f);
 	}
 
-	envy24_wrmt(sc, ENVY24_MT_VOLIDX, ch * 2, 1);
-	envy24_wrmt(sc, ENVY24_MT_VOLUME, 0x7f00 | sc->left[ch], 2);
-	envy24_wrmt(sc, ENVY24_MT_VOLIDX, ch * 2 + 1, 1);
-	envy24_wrmt(sc, ENVY24_MT_VOLUME, (sc->right[ch] << 8) | 0x7f, 2);
+	envy24_wrmt1(sc, ENVY24_MT_VOLIDX, ch * 2);
+	envy24_wrmt2(sc, ENVY24_MT_VOLUME, 0x7f00 | sc->left[ch]);
+	envy24_wrmt1(sc, ENVY24_MT_VOLIDX, ch * 2 + 1);
+	envy24_wrmt2(sc, ENVY24_MT_VOLUME, (sc->right[ch] << 8) | 0x7f);
 }
 
 static void
@@ -1111,10 +1070,10 @@
 	device_printf(sc->dev, "envy24_mutevolume(sc, %d)\n", ch);
 #endif
 	vol = ENVY24_VOL_MUTE << 8 | ENVY24_VOL_MUTE;
-	envy24_wrmt(sc, ENVY24_MT_VOLIDX, ch * 2, 1);
-	envy24_wrmt(sc, ENVY24_MT_VOLUME, vol, 2);
-	envy24_wrmt(sc, ENVY24_MT_VOLIDX, ch * 2 + 1, 1);
-	envy24_wrmt(sc, ENVY24_MT_VOLUME, vol, 2);
+	envy24_wrmt1(sc, ENVY24_MT_VOLIDX, ch * 2);
+	envy24_wrmt2(sc, ENVY24_MT_VOLUME, vol);
+	envy24_wrmt1(sc, ENVY24_MT_VOLIDX, ch * 2 + 1);
+	envy24_wrmt2(sc, ENVY24_MT_VOLUME, vol);
 }
 
 static u_int32_t
@@ -1137,7 +1096,7 @@
 		regno = ENVY24_MT_RCNT;
 	}
 
-	ptr = envy24_rdmt(sc, regno, 2);
+	ptr = envy24_rdmt2(sc, regno);
 	rtn -= (ptr + 1);
 	rtn /= unit;
 
@@ -1173,7 +1132,7 @@
 		mask = ~ENVY24_MT_INT_RMASK;
 	}
 
-	ptr = size - envy24_rdmt(sc, regptr, 2) - 1;
+	ptr = size - envy24_rdmt2(sc, regptr) - 1;
 	/*
 	cnt = blk - ptr % blk - 1;
 	if (cnt == 0)
@@ -1183,15 +1142,15 @@
 #if(0)
 	device_printf(sc->dev, "envy24_updintr():ptr = %d, blk = %d, cnt = %d\n", ptr, blk, cnt);
 #endif
-	envy24_wrmt(sc, regintr, cnt, 2);
-	intr = envy24_rdmt(sc, ENVY24_MT_INT, 1);
+	envy24_wrmt2(sc, regintr, cnt);
+	intr = envy24_rdmt1(sc, ENVY24_MT_INT);
 #if(0)
 	device_printf(sc->dev, "envy24_updintr():intr = 0x%02x, mask = 0x%02x\n", intr, mask);
 #endif
-	envy24_wrmt(sc, ENVY24_MT_INT, intr & mask, 1);
+	envy24_wrmt1(sc, ENVY24_MT_INT, intr & mask);
 #if(0)
 	device_printf(sc->dev, "envy24_updintr():INT-->0x%02x\n",
-		      envy24_rdmt(sc, ENVY24_MT_INT, 1));
+		      envy24_rdmt1(sc, ENVY24_MT_INT));
 #endif
 
 	return;
@@ -1210,8 +1169,8 @@
 		mask = ENVY24_MT_INT_PMASK;
 	else
 		mask = ENVY24_MT_INT_RMASK;
-	intr = envy24_rdmt(sc, ENVY24_MT_INT, 1);
-	envy24_wrmt(sc, ENVY24_MT_INT, intr | mask, 1);
+	intr = envy24_rdmt1(sc, ENVY24_MT_INT);
+	envy24_wrmt1(sc, ENVY24_MT_INT, intr | mask);
 
 	return;
 }
@@ -1225,19 +1184,19 @@
 #if(0)
 	device_printf(sc->dev, "envy24_checkintr(sc, %d)\n", dir);
 #endif
-	intr = envy24_rdmt(sc, ENVY24_MT_INT, 1);
+	intr = envy24_rdmt1(sc, ENVY24_MT_INT);
 	if (dir == PCMDIR_PLAY) {
 		if ((rtn = intr & ENVY24_MT_INT_PSTAT) != 0) {
 			mask = ~ENVY24_MT_INT_RSTAT;
 			stat = ENVY24_MT_INT_PSTAT | ENVY24_MT_INT_PMASK;
-			envy24_wrmt(sc, ENVY24_MT_INT, (intr & mask) | stat, 1);
+			envy24_wrmt1(sc, ENVY24_MT_INT, (intr & mask) | stat);
 		}
 	}
 	else {
 		if ((rtn = intr & ENVY24_MT_INT_RSTAT) != 0) {
 			mask = ~ENVY24_MT_INT_PSTAT;
 			stat = ENVY24_MT_INT_RSTAT | ENVY24_MT_INT_RMASK;
-			envy24_wrmt(sc, ENVY24_MT_INT, (intr & mask) | stat, 1);
+			envy24_wrmt1(sc, ENVY24_MT_INT, (intr & mask) | stat);
 		}
 	}
 
@@ -1257,12 +1216,12 @@
 	else
 		sw = ENVY24_MT_PCTL_RSTART;
 
-	stat = envy24_rdmt(sc, ENVY24_MT_PCTL, 1);
-	envy24_wrmt(sc, ENVY24_MT_PCTL, stat | sw, 1);
+	stat = envy24_rdmt1(sc, ENVY24_MT_PCTL);
+	envy24_wrmt1(sc, ENVY24_MT_PCTL, stat | sw);
 #if(0)
 	DELAY(100);
-	device_printf(sc->dev, "PADDR:0x%08x\n", envy24_rdmt(sc, ENVY24_MT_PADDR, 4));
-	device_printf(sc->dev, "PCNT:%ld\n", envy24_rdmt(sc, ENVY24_MT_PCNT, 2));
+	device_printf(sc->dev, "PADDR:0x%08x\n", envy24_rdmt4(sc, ENVY24_MT_PADDR));
+	device_printf(sc->dev, "PCNT:%ld\n", envy24_rdmt2(sc, ENVY24_MT_PCNT));
 #endif
 
 	return;
@@ -1281,8 +1240,8 @@
 	else
 		sw = ~ENVY24_MT_PCTL_RSTART;
 
-	stat = envy24_rdmt(sc, ENVY24_MT_PCTL, 1);
-	envy24_wrmt(sc, ENVY24_MT_PCTL, stat & sw, 1);
+	stat = envy24_rdmt1(sc, ENVY24_MT_PCTL);
+	envy24_wrmt1(sc, ENVY24_MT_PCTL, stat & sw);
 
 	return;
 }
@@ -1319,28 +1278,28 @@
 #if(0)
 		device_printf(sc->dev, "envy24_route(): MT_SPDOUT-->0x%04x\n", reg);
 #endif
-		envy24_wrmt(sc, ENVY24_MT_SPDOUT, reg, 2);
+		envy24_wrmt2(sc, ENVY24_MT_SPDOUT, reg);
 	}
 	else {
 		mask = ~(0x0303 << dac * 2);
-		reg = envy24_rdmt(sc, ENVY24_MT_PSDOUT, 2);
+		reg = envy24_rdmt2(sc, ENVY24_MT_PSDOUT);
 		reg = (reg & mask) | ((class | class << 8) << dac * 2);
 #if(0)
 		device_printf(sc->dev, "envy24_route(): MT_PSDOUT-->0x%04x\n", reg);
 #endif
-		envy24_wrmt(sc, ENVY24_MT_PSDOUT, reg, 2);
+		envy24_wrmt2(sc, ENVY24_MT_PSDOUT, reg);
 		mask = ~(0xff << dac * 8);
-		reg = envy24_rdmt(sc, ENVY24_MT_RECORD, 4);
+		reg = envy24_rdmt4(sc, ENVY24_MT_RECORD);
 		reg = (reg & mask) |
 			(((adc << 1 | left) | left << 3) |
 			 ((adc << 1 | right) | right << 3) << 4) << dac * 8;
 #if(0)
 		device_printf(sc->dev, "envy24_route(): MT_RECORD-->0x%08x\n", reg);
 #endif
-		envy24_wrmt(sc, ENVY24_MT_RECORD, reg, 4);
+		envy24_wrmt4(sc, ENVY24_MT_RECORD, reg);
 
 		/* 6fire rear input init test */
-		envy24_wrmt(sc, ENVY24_MT_RECORD, 0x00, 4);
+		envy24_wrmt4(sc, ENVY24_MT_RECORD, 0x00);
 	}
 
 	return 0;
@@ -1900,7 +1859,7 @@
 
 	/* set volume control rate */
 	snd_mtxlock(sc->lock);
-	envy24_wrmt(sc, ENVY24_MT_VOLRATE, 0x30, 1); /* 0x30 is default value */
+	envy24_wrmt1(sc, ENVY24_MT_VOLRATE, 0x30); /* 0x30 is default value */
 
 	mix_setdevs(m, ENVY24_MIX_MASK);
 	mix_setrecdevs(m, ENVY24_MIX_REC_MASK);
@@ -2023,7 +1982,7 @@
 		device_printf(sc->dev, "envy24_intr(): play\n");
 #endif
 		dsize = sc->psize / 4;
-		ptr = dsize - envy24_rdmt(sc, ENVY24_MT_PCNT, 2) - 1;
+		ptr = dsize - envy24_rdmt2(sc, ENVY24_MT_PCNT) - 1;
 #if(0)
 		device_printf(sc->dev, "envy24_intr(): ptr = %d-->", ptr);
 #endif
@@ -2052,7 +2011,7 @@
 		device_printf(sc->dev, "envy24_intr(): rec\n");
 #endif
 		dsize = sc->rsize / 4;
-		ptr = dsize - envy24_rdmt(sc, ENVY24_MT_RCNT, 2) - 1;
+		ptr = dsize - envy24_rdmt2(sc, ENVY24_MT_RCNT) - 1;
 		ptr -= ptr % sc->blk[1];
 		feed = (ptr + dsize - sc->intr[1]) % dsize; 
 		for (i = ENVY24_CHAN_REC_ADC1; i <= ENVY24_CHAN_REC_SPDIF; i++) {
@@ -2222,18 +2181,18 @@
 #if(0)
 	device_printf(sc->dev, "pbuf(0x%08x)\n", addr);
 #endif
-	envy24_wrmt(sc, ENVY24_MT_PADDR, addr, 4);
+	envy24_wrmt4(sc, ENVY24_MT_PADDR, addr);
 #if(0)
-	device_printf(sc->dev, "PADDR-->(0x%08x)\n", envy24_rdmt(sc, ENVY24_MT_PADDR, 4));
+	device_printf(sc->dev, "PADDR-->(0x%08x)\n", envy24_rdmt4(sc, ENVY24_MT_PADDR));
 	device_printf(sc->dev, "psize(%ld)\n", sc->psize / 4 - 1);
 #endif
-	envy24_wrmt(sc, ENVY24_MT_PCNT, sc->psize / 4 - 1, 2);
+	envy24_wrmt2(sc, ENVY24_MT_PCNT, sc->psize / 4 - 1);
 #if(0)
-	device_printf(sc->dev, "PCNT-->(%ld)\n", envy24_rdmt(sc, ENVY24_MT_PCNT, 2));
+	device_printf(sc->dev, "PCNT-->(%ld)\n", envy24_rdmt2(sc, ENVY24_MT_PCNT));
 #endif
 	addr = vtophys(sc->rbuf);
-	envy24_wrmt(sc, ENVY24_MT_RADDR, addr, 4);
-	envy24_wrmt(sc, ENVY24_MT_RCNT, sc->rsize / 4 - 1, 2);
+	envy24_wrmt4(sc, ENVY24_MT_RADDR, addr);
+	envy24_wrmt2(sc, ENVY24_MT_RCNT, sc->rsize / 4 - 1);
 
 	return 0;
  bad:
@@ -2342,9 +2301,9 @@
 #endif
 
 	/* reset chip */
-	envy24_wrcs(sc, ENVY24_CCS_CTL, ENVY24_CCS_CTL_RESET | ENVY24_CCS_CTL_NATIVE, 1);
+	envy24_wrcs1(sc, ENVY24_CCS_CTL, ENVY24_CCS_CTL_RESET | ENVY24_CCS_CTL_NATIVE);
 	DELAY(200);
-	envy24_wrcs(sc, ENVY24_CCS_CTL, ENVY24_CCS_CTL_NATIVE, 1);
+	envy24_wrcs1(sc, ENVY24_CCS_CTL, ENVY24_CCS_CTL_NATIVE);
 	DELAY(200);
 
 	/* legacy hardware disable */
@@ -2414,9 +2373,9 @@
 	/* envy24_route(sc, ENVY24_ROUTE_DAC_SPDIF, ENVY24_ROUTE_CLASS_MIX, 0, 0); */
 
 	/* set macro interrupt mask */
-	data = envy24_rdcs(sc, ENVY24_CCS_IMASK, 1);
-	envy24_wrcs(sc, ENVY24_CCS_IMASK, data & ~ENVY24_CCS_IMASK_PMT, 1);
-	data = envy24_rdcs(sc, ENVY24_CCS_IMASK, 1);
+	data = envy24_rdcs1(sc, ENVY24_CCS_IMASK);
+	envy24_wrcs1(sc, ENVY24_CCS_IMASK, data & ~ENVY24_CCS_IMASK_PMT);
+	data = envy24_rdcs1(sc, ENVY24_CCS_IMASK);
 #if(0)
 	device_printf(sc->dev, "envy24_init(): CCS_IMASK-->0x%02x\n", data);
 #endif
@@ -2428,30 +2387,11 @@
 envy24_alloc_resource(struct sc_info *sc)
 {
 	/* allocate I/O port resource */
-	sc->csid = PCIR_CCS;
-	sc->cs = bus_alloc_resource(sc->dev, SYS_RES_IOPORT,
-	    &sc->csid, 0, ~0, 1, RF_ACTIVE);
-	sc->ddmaid = PCIR_DDMA;
-	sc->ddma = bus_alloc_resource(sc->dev, SYS_RES_IOPORT,
-	    &sc->ddmaid, 0, ~0, 1, RF_ACTIVE);
-	sc->dsid = PCIR_DS;
-	sc->ds = bus_alloc_resource(sc->dev, SYS_RES_IOPORT,
-	    &sc->dsid, 0, ~0, 1, RF_ACTIVE);
-	sc->mtid = PCIR_MT;
-	sc->mt = bus_alloc_resource(sc->dev, SYS_RES_IOPORT,
-	    &sc->mtid, 0, ~0, 1, RF_ACTIVE);
-	if (!sc->cs || !sc->ddma || !sc->ds || !sc->mt) {
-		device_printf(sc->dev, "unable to map IO port space\n");
+	if (bus_alloc_resources(sc->dev, envy24_res_spec, sc->res) != 0) {
+		device_printf(sc->dev, "unable to allocate resources\n");
 		return ENXIO;
 	}
-	sc->cst = rman_get_bustag(sc->cs);
-	sc->csh = rman_get_bushandle(sc->cs);
-	sc->ddmat = rman_get_bustag(sc->ddma);
-	sc->ddmah = rman_get_bushandle(sc->ddma);
-	sc->dst = rman_get_bustag(sc->ds);
-	sc->dsh = rman_get_bushandle(sc->ds);
-	sc->mtt = rman_get_bustag(sc->mt);
-	sc->mth = rman_get_bushandle(sc->mt);
+
 #if(0)
 	device_printf(sc->dev,
 	    "IO port register values\nCCS: 0x%lx\nDDMA: 0x%lx\nDS: 0x%lx\nMT: 0x%lx\n",
@@ -2462,11 +2402,8 @@
 #endif
 
 	/* allocate interupt resource */
-	sc->irqid = 0;
-	sc->irq = bus_alloc_resource(sc->dev, SYS_RES_IRQ, &sc->irqid,
-				 0, ~0, 1, RF_ACTIVE | RF_SHAREABLE);
-	if (!sc->irq ||
-	    snd_setup_intr(sc->dev, sc->irq, INTR_MPSAFE, envy24_intr, sc, &sc->ih)) {
+	if (snd_setup_intr(sc->dev, sc->res[RES_IRQ], INTR_MPSAFE, 
+	    envy24_intr, sc, &sc->ih)) {
 		device_printf(sc->dev, "unable to map interrupt\n");
 		return ENXIO;
 	}
@@ -2489,10 +2426,35 @@
 	return 0;
 }
 
+static void
+envy24_destroy(device_t dev, struct sc_info *sc)
+{
+	int i;
+
+	if (!sc)
+		return;
+
+	if (sc->ih)
+		bus_teardown_intr(dev, sc->res[RES_IRQ], sc->ih);
+	bus_release_resources(dev, envy24_res_spec, sc->res);
+	envy24_dmafree(sc);
+	if (sc->dmat)
+		bus_dma_tag_destroy(sc->dmat);
+	if (sc->cfg->codec->destroy != NULL) {
+                for (i = 0; i < sc->adcn; i++)
+                        sc->cfg->codec->destroy(sc->adc[i]);
+                for (i = 0; i < sc->dacn; i++)
+                        sc->cfg->codec->destroy(sc->dac[i]);
+        }
+	envy24_cfgfree(sc->cfg);
+	if (sc->lock)
+		snd_mtxfree(sc->lock);
+	free(sc, M_ENVY24);
+}
+
 static int
 envy24_pci_attach(device_t dev)
 {
-	u_int32_t		data;
 	struct sc_info 		*sc;
 	char 			status[SND_STATUSLEN];
 	int			err = 0;
@@ -2512,10 +2474,8 @@
 	sc->dev = dev;
 
 	/* initialize PCI interface */
-	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);
+	pci_enable_busmaster(dev);
+	pci_enable_io(dev, SYS_RES_IOPORT);
 
 	/* allocate resources */
 	err = envy24_alloc_resource(sc);
@@ -2551,54 +2511,27 @@
 	/* set status iformation */
 	snprintf(status, SND_STATUSLEN,
 	    "at io 0x%lx:%ld,0x%lx:%ld,0x%lx:%ld,0x%lx:%ld irq %ld",
-	    rman_get_start(sc->cs),
-	    rman_get_end(sc->cs) - rman_get_start(sc->cs) + 1,
-	    rman_get_start(sc->ddma),
-	    rman_get_end(sc->ddma) - rman_get_start(sc->ddma) + 1,
-	    rman_get_start(sc->ds),
-	    rman_get_end(sc->ds) - rman_get_start(sc->ds) + 1,
-	    rman_get_start(sc->mt),
-	    rman_get_end(sc->mt) - rman_get_start(sc->mt) + 1,
-	    rman_get_start(sc->irq));
+	    rman_get_start(sc->res[RES_CS]), rman_get_size(sc->res[RES_CS]),
+	    rman_get_start(sc->res[RES_DDMA]), rman_get_size(sc->res[RES_DDMA]),
+	    rman_get_start(sc->res[RES_DS]), rman_get_size(sc->res[RES_DS]),
+	    rman_get_start(sc->res[RES_MT]), rman_get_size(sc->res[RES_MT]),
+	    rman_get_start(sc->res[RES_IRQ]));
 	pcm_setstatus(dev, status);
 
 	return 0;
 
 bad:
-	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);
-	envy24_dmafree(sc);
-	if (sc->dmat)
-		bus_dma_tag_destroy(sc->dmat);
-	if (sc->cfg->codec->destroy != NULL) {
-                for (i = 0; i < sc->adcn; i++)
-                        sc->cfg->codec->destroy(sc->adc[i]);
-                for (i = 0; i < sc->dacn; i++)
-                        sc->cfg->codec->destroy(sc->dac[i]);
-        }
-	envy24_cfgfree(sc->cfg);
-	if (sc->cs)
-		bus_release_resource(dev, SYS_RES_IOPORT, sc->csid, sc->cs);
-	if (sc->ddma)
-		bus_release_resource(dev, SYS_RES_IOPORT, sc->ddmaid, sc->ddma);
-	if (sc->ds)
-		bus_release_resource(dev, SYS_RES_IOPORT, sc->dsid, sc->ds);
-	if (sc->mt)
-		bus_release_resource(dev, SYS_RES_IOPORT, sc->mtid, sc->mt);
-	if (sc->lock)
-		snd_mtxfree(sc->lock);
-	free(sc, M_ENVY24);
+	envy24_destroy(dev, sc);
+
 	return err;
 }
 
+
 static int
 envy24_pci_detach(device_t dev)
 {
 	struct sc_info *sc;
 	int r;
-	int i;
 
 #if(0)
 	device_printf(dev, "envy24_pci_detach()\n");
@@ -2609,24 +2542,8 @@
 	r = pcm_unregister(dev);
 	if (r)
 		return r;
+	envy24_destroy(dev, sc);
 
-	envy24_dmafree(sc);
-	if (sc->cfg->codec->destroy != NULL) {
-		for (i = 0; i < sc->adcn; i++)
-			sc->cfg->codec->destroy(sc->adc[i]);
-		for (i = 0; i < sc->dacn; i++)
-			sc->cfg->codec->destroy(sc->dac[i]);
-	}
-	envy24_cfgfree(sc->cfg);
-	bus_dma_tag_destroy(sc->dmat);
-	bus_teardown_intr(dev, sc->irq, sc->ih);
-	bus_release_resource(dev, SYS_RES_IRQ, sc->irqid, sc->irq);
-	bus_release_resource(dev, SYS_RES_IOPORT, sc->csid, sc->cs);
-	bus_release_resource(dev, SYS_RES_IOPORT, sc->ddmaid, sc->ddma);
-	bus_release_resource(dev, SYS_RES_IOPORT, sc->dsid, sc->ds);
-	bus_release_resource(dev, SYS_RES_IOPORT, sc->mtid, sc->mt);
-	snd_mtxfree(sc->lock);
-	free(sc, M_ENVY24);
 	return 0;
 }
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200707281654.l6SGsHQJ063201>