PERFORCE change 124270 for review
Christopher Davis
loafier at FreeBSD.org
Sat Jul 28 16:54:18 UTC 2007
http://perforce.freebsd.org/chv.cgi?CH=124270
Change 124270 by loafier at 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;
}
More information about the p4-projects
mailing list