PERFORCE change 124400 for review
Christopher Davis
loafier at FreeBSD.org
Tue Jul 31 04:38:23 UTC 2007
http://perforce.freebsd.org/chv.cgi?CH=124400
Change 124400 by loafier at chrisdsoc on 2007/07/31 04:38:19
Edit for bus_alloc_resources(), etc.
Affected files ...
.. //depot/projects/soc2007/loafier_busalloc/src/sys/dev/sound/pci/envy24ht.c#2 edit
Differences ...
==== //depot/projects/soc2007/loafier_busalloc/src/sys/dev/sound/pci/envy24ht.c#2 (text+ko) ====
@@ -118,27 +118,34 @@
struct codec_entry *codec;
};
+enum {
+ RES_CS,
+ RES_MT,
+ RES_IRQ,
+ RES_SZ
+};
+
+static struct resource_spec envy24ht_res_spec[] = {
+ {SYS_RES_IOPORT, PCIR_CCS, RF_ACTIVE},
+ {SYS_RES_IOPORT, ENVY24HT_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;
/* MultiTrack registor */
- struct resource *mt;
- int mtid;
- bus_space_tag_t mtt;
- bus_space_handle_t mth;
+ /* IRQ resource */
+ struct resource *res[RES_SZ];
+ void *ih;
+
/* DMA tag */
bus_dma_tag_t dmat;
- /* IRQ resource */
- struct resource *irq;
- int irqid;
- void *ih;
/* system configuration data */
struct cfg_info *cfg;
@@ -439,68 +446,27 @@
/* -------------------------------------------------------------------- */
/* common routines */
-static u_int32_t
-envy24ht_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 envy24ht_rdcs1(_sc, _reg) bus_read_1((_sc)->res[RES_CS], _reg)
+#define envy24ht_rdcs2(_sc, _reg) bus_read_2((_sc)->res[RES_CS], _reg)
+#define envy24ht_rdcs4(_sc, _reg) bus_read_4((_sc)->res[RES_CS], _reg)
+#define envy24ht_wrcs1(_sc, _reg, _val) \
+ bus_write_1((_sc)->res[RES_CS], _reg, _val)
+#define envy24ht_wrcs2(_sc, _reg, _val) \
+ bus_write_2((_sc)->res[RES_CS], _reg, _val)
+#define envy24ht_wrcs4(_sc, _reg, _val) \
+ bus_write_4((_sc)->res[RES_CS], _reg, _val)
-static void
-envy24ht_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 envy24ht_rdmt1(_sc, _reg) bus_read_1((_sc)->res[RES_MT], _reg)
+#define envy24ht_rdmt2(_sc, _reg) bus_read_2((_sc)->res[RES_MT], _reg)
+#define envy24ht_rdmt4(_sc, _reg) bus_read_4((_sc)->res[RES_MT], _reg)
+#define envy24ht_wrmt1(_sc, _reg, _val) \
+ bus_write_1((_sc)->res[RES_MT], _reg, _val)
+#define envy24ht_wrmt2(_sc, _reg, _val) \
+ bus_write_2((_sc)->res[RES_MT], _reg, _val)
+#define envy24ht_wrmt4(_sc, _reg, _val) \
+ bus_write_4((_sc)->res[RES_MT], _reg, _val)
-static u_int32_t
-envy24ht_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
-envy24ht_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;
- }
-}
-
/* -------------------------------------------------------------------- */
/* I2C port/E2PROM access routines */
@@ -515,7 +481,7 @@
device_printf(sc->dev, "envy24ht_rdi2c(sc, 0x%02x, 0x%02x)\n", dev, addr);
#endif
for (i = 0; i < ENVY24HT_TIMEOUT; i++) {
- data = envy24ht_rdcs(sc, ENVY24HT_CCS_I2CSTAT, 1);
+ data = envy24ht_rdcs1(sc, ENVY24HT_CCS_I2CSTAT);
if ((data & ENVY24HT_CCS_I2CSTAT_BSY) == 0)
break;
DELAY(32); /* 31.25kHz */
@@ -523,11 +489,11 @@
if (i == ENVY24HT_TIMEOUT) {
return -1;
}
- envy24ht_wrcs(sc, ENVY24HT_CCS_I2CADDR, addr, 1);
- envy24ht_wrcs(sc, ENVY24HT_CCS_I2CDEV,
- (dev & ENVY24HT_CCS_I2CDEV_ADDR) | ENVY24HT_CCS_I2CDEV_RD, 1);
+ envy24ht_wrcs1(sc, ENVY24HT_CCS_I2CADDR, addr);
+ envy24ht_wrcs1(sc, ENVY24HT_CCS_I2CDEV,
+ (dev & ENVY24HT_CCS_I2CDEV_ADDR) | ENVY24HT_CCS_I2CDEV_RD);
for (i = 0; i < ENVY24HT_TIMEOUT; i++) {
- data = envy24ht_rdcs(sc, ENVY24HT_CCS_I2CSTAT, 1);
+ data = envy24ht_rdcs1(sc, ENVY24HT_CCS_I2CSTAT);
if ((data & ENVY24HT_CCS_I2CSTAT_BSY) == 0)
break;
DELAY(32); /* 31.25kHz */
@@ -535,7 +501,7 @@
if (i == ENVY24HT_TIMEOUT) {
return -1;
}
- data = envy24ht_rdcs(sc, ENVY24HT_CCS_I2CDATA, 1);
+ data = envy24ht_rdcs1(sc, ENVY24HT_CCS_I2CDATA);
#if(0)
device_printf(sc->dev, "envy24ht_rdi2c(): return 0x%x\n", data);
@@ -553,7 +519,7 @@
device_printf(sc->dev, "envy24ht_rdi2c(sc, 0x%02x, 0x%02x)\n", dev, addr);
#endif
for (i = 0; i < ENVY24HT_TIMEOUT; i++) {
- tmp = envy24ht_rdcs(sc, ENVY24HT_CCS_I2CSTAT, 1);
+ tmp = envy24ht_rdcs1(sc, ENVY24HT_CCS_I2CSTAT);
if ((tmp & ENVY24HT_CCS_I2CSTAT_BSY) == 0)
break;
DELAY(32); /* 31.25kHz */
@@ -561,12 +527,12 @@
if (i == ENVY24HT_TIMEOUT) {
return -1;
}
- envy24ht_wrcs(sc, ENVY24HT_CCS_I2CADDR, addr, 1);
- envy24ht_wrcs(sc, ENVY24HT_CCS_I2CDATA, data, 1);
- envy24ht_wrcs(sc, ENVY24HT_CCS_I2CDEV,
- (dev & ENVY24HT_CCS_I2CDEV_ADDR) | ENVY24HT_CCS_I2CDEV_WR, 1);
+ envy24ht_wrcs1(sc, ENVY24HT_CCS_I2CADDR, addr);
+ envy24ht_wrcs1(sc, ENVY24HT_CCS_I2CDATA, data);
+ envy24ht_wrcs1(sc, ENVY24HT_CCS_I2CDEV,
+ (dev & ENVY24HT_CCS_I2CDEV_ADDR) | ENVY24HT_CCS_I2CDEV_WR);
for (i = 0; i < ENVY24HT_TIMEOUT; i++) {
- data = envy24ht_rdcs(sc, ENVY24HT_CCS_I2CSTAT, 1);
+ data = envy24ht_rdcs1(sc, ENVY24HT_CCS_I2CSTAT);
if ((data & ENVY24HT_CCS_I2CSTAT_BSY) == 0)
break;
DELAY(32); /* 31.25kHz */
@@ -586,7 +552,7 @@
#if(0)
device_printf(sc->dev, "envy24ht_rdrom(sc, 0x%02x)\n", addr);
#endif
- data = envy24ht_rdcs(sc, ENVY24HT_CCS_I2CSTAT, 1);
+ data = envy24ht_rdcs1(sc, ENVY24HT_CCS_I2CSTAT);
if ((data & ENVY24HT_CCS_I2CSTAT_ROM) == 0) {
#if(0)
device_printf(sc->dev, "envy24ht_rdrom(): E2PROM not presented\n");
@@ -712,12 +678,12 @@
#if(0)
device_printf(sc->dev, "envy24ht_coldcd()\n");
#endif
- envy24ht_wrmt(sc, ENVY24HT_MT_AC97CMD, ENVY24HT_MT_AC97CMD_CLD, 1);
+ envy24ht_wrmt1(sc, ENVY24HT_MT_AC97CMD, ENVY24HT_MT_AC97CMD_CLD);
DELAY(10);
- envy24ht_wrmt(sc, ENVY24HT_MT_AC97CMD, 0, 1);
+ envy24ht_wrmt1(sc, ENVY24HT_MT_AC97CMD, 0);
DELAY(1000);
for (i = 0; i < ENVY24HT_TIMEOUT; i++) {
- data = envy24ht_rdmt(sc, ENVY24HT_MT_AC97CMD, 1);
+ data = envy24ht_rdmt1(sc, ENVY24HT_MT_AC97CMD);
if (data & ENVY24HT_MT_AC97CMD_RDY) {
return 0;
}
@@ -738,10 +704,10 @@
envy24ht_wrmt(sc, ENVY24HT_MT_AC97CMD,
ENVY24HT_MT_AC97CMD_CLD | ENVY24HT_MT_AC97CMD_WRM, 1);
DELAY(10);
- envy24ht_wrmt(sc, ENVY24HT_MT_AC97CMD, 0, 1);
+ envy24ht_wrmt1(sc, ENVY24HT_MT_AC97CMD, 0);
DELAY(1000);
for (i = 0; i < ENVY24HT_TIMEOUT; i++) {
- data = envy24ht_rdmt(sc, ENVY24HT_MT_AC97CMD, 1);
+ data = envy24ht_rdmt1(sc, ENVY24HT_MT_AC97CMD);
if (data & ENVY24HT_MT_AC97CMD_RDY) {
return 0;
}
@@ -760,14 +726,14 @@
#if(0)
device_printf(sc->dev, "envy24ht_rdcd(obj, sc, 0x%02x)\n", regno);
#endif
- envy24ht_wrmt(sc, ENVY24HT_MT_AC97IDX, (u_int32_t)regno, 1);
- envy24ht_wrmt(sc, ENVY24HT_MT_AC97CMD, ENVY24HT_MT_AC97CMD_RD, 1);
+ envy24ht_wrmt1(sc, ENVY24HT_MT_AC97IDX, (u_int32_t)regno);
+ envy24ht_wrmt1(sc, ENVY24HT_MT_AC97CMD, ENVY24HT_MT_AC97CMD_RD);
for (i = 0; i < ENVY24HT_TIMEOUT; i++) {
- data = envy24ht_rdmt(sc, ENVY24HT_MT_AC97CMD, 1);
+ data = envy24ht_rdmt1(sc, ENVY24HT_MT_AC97CMD);
if ((data & ENVY24HT_MT_AC97CMD_RD) == 0)
break;
}
- data = envy24ht_rdmt(sc, ENVY24HT_MT_AC97DLO, 2);
+ data = envy24ht_rdmt2(sc, ENVY24HT_MT_AC97DLO);
#if(0)
device_printf(sc->dev, "envy24ht_rdcd(): return 0x%x\n", data);
@@ -785,11 +751,11 @@
#if(0)
device_printf(sc->dev, "envy24ht_wrcd(obj, sc, 0x%02x, 0x%04x)\n", regno, data);
#endif
- envy24ht_wrmt(sc, ENVY24HT_MT_AC97IDX, (u_int32_t)regno, 1);
- envy24ht_wrmt(sc, ENVY24HT_MT_AC97DLO, (u_int32_t)data, 2);
- envy24ht_wrmt(sc, ENVY24HT_MT_AC97CMD, ENVY24HT_MT_AC97CMD_WR, 1);
+ envy24ht_wrmt1(sc, ENVY24HT_MT_AC97IDX, (u_int32_t)regno);
+ envy24ht_wrmt2(sc, ENVY24HT_MT_AC97DLO, (u_int32_t)data);
+ envy24ht_wrmt1(sc, ENVY24HT_MT_AC97CMD, ENVY24HT_MT_AC97CMD_WR);
for (i = 0; i < ENVY24HT_TIMEOUT; i++) {
- cmd = envy24ht_rdmt(sc, ENVY24HT_MT_AC97CMD, 1);
+ cmd = envy24ht_rdmt1(sc, ENVY24HT_MT_AC97CMD);
if ((cmd & ENVY24HT_MT_AC97CMD_WR) == 0)
break;
}
@@ -813,9 +779,9 @@
envy24ht_gpiord(struct sc_info *sc)
{
if (sc->cfg->subvendor == 0x153b && sc->cfg->subdevice == 0x1150)
- return envy24ht_rdcs(sc, ENVY24HT_CCS_GPIO_LDATA, 2);
+ return envy24ht_rdcs2(sc, ENVY24HT_CCS_GPIO_LDATA);
else
- return (envy24ht_rdcs(sc, ENVY24HT_CCS_GPIO_HDATA, 1) << 16 | envy24ht_rdcs(sc, ENVY24HT_CCS_GPIO_LDATA, 2));
+ return (envy24ht_rdcs1(sc, ENVY24HT_CCS_GPIO_HDATA) << 16 | envy24ht_rdcs2(sc, ENVY24HT_CCS_GPIO_LDATA));
}
static void
@@ -825,9 +791,9 @@
device_printf(sc->dev, "envy24ht_gpiowr(sc, 0x%02x)\n", data & 0x7FFFFF);
return;
#endif
- envy24ht_wrcs(sc, ENVY24HT_CCS_GPIO_LDATA, data, 2);
+ envy24ht_wrcs2(sc, ENVY24HT_CCS_GPIO_LDATA, data);
if (sc->cfg->subdevice != 0x1150)
- envy24ht_wrcs(sc, ENVY24HT_CCS_GPIO_HDATA, data >> 16, 1);
+ envy24ht_wrcs1(sc, ENVY24HT_CCS_GPIO_HDATA, data >> 16);
return;
}
@@ -835,16 +801,16 @@
static u_int32_t
envy24ht_gpiogetmask(struct sc_info *sc)
{
- return (envy24ht_rdcs(sc, ENVY24HT_CCS_GPIO_HMASK, 1) << 16 | envy24ht_rdcs(sc, ENVY24HT_CCS_GPIO_LMASK, 2));
+ return (envy24ht_rdcs1(sc, ENVY24HT_CCS_GPIO_HMASK) << 16 | envy24ht_rdcs2(sc, ENVY24HT_CCS_GPIO_LMASK));
}
#endif
static void
envy24ht_gpiosetmask(struct sc_info *sc, u_int32_t mask)
{
- envy24ht_wrcs(sc, ENVY24HT_CCS_GPIO_LMASK, mask, 2);
+ envy24ht_wrcs2(sc, ENVY24HT_CCS_GPIO_LMASK, mask);
if (sc->cfg->subdevice != 0x1150)
- envy24ht_wrcs(sc, ENVY24HT_CCS_GPIO_HMASK, mask >> 16, 1);
+ envy24ht_wrcs1(sc, ENVY24HT_CCS_GPIO_HMASK, mask >> 16);
return;
}
@@ -852,7 +818,7 @@
static u_int32_t
envy24ht_gpiogetdir(struct sc_info *sc)
{
- return envy24ht_rdcs(sc, ENVY24HT_CCS_GPIO_CTLDIR, 4);
+ return envy24ht_rdcs4(sc, ENVY24HT_CCS_GPIO_CTLDIR);
}
#endif
@@ -860,9 +826,9 @@
envy24ht_gpiosetdir(struct sc_info *sc, u_int32_t dir)
{
if (sc->cfg->subvendor == 0x153b && sc->cfg->subdevice == 0x1150)
- envy24ht_wrcs(sc, ENVY24HT_CCS_GPIO_CTLDIR, dir, 2);
+ envy24ht_wrcs2(sc, ENVY24HT_CCS_GPIO_CTLDIR, dir);
else
- envy24ht_wrcs(sc, ENVY24HT_CCS_GPIO_CTLDIR, dir, 4);
+ envy24ht_wrcs4(sc, ENVY24HT_CCS_GPIO_CTLDIR, dir);
return;
}
@@ -1051,19 +1017,19 @@
device_printf(sc->dev, "envy24ht_setspeed(): speed %d/code 0x%04x\n", envy24ht_speedtab[i].speed, code);
#endif
if (code < 0x10) {
- envy24ht_wrmt(sc, ENVY24HT_MT_RATE, code, 1);
+ envy24ht_wrmt1(sc, ENVY24HT_MT_RATE, code);
if ((((sc->cfg->scfg & ENVY24HT_CCSM_SCFG_XIN2) == 0x00) && (code == ENVY24HT_MT_RATE_192000)) || \
(code == ENVY24HT_MT_RATE_176400)) {
- i2sfmt = envy24ht_rdmt(sc, ENVY24HT_MT_I2S, 1);
+ i2sfmt = envy24ht_rdmt1(sc, ENVY24HT_MT_I2S);
i2sfmt |= ENVY24HT_MT_I2S_MLR128;
- envy24ht_wrmt(sc, ENVY24HT_MT_I2S, i2sfmt, 1);
+ envy24ht_wrmt1(sc, ENVY24HT_MT_I2S, i2sfmt);
}
else {
- i2sfmt = envy24ht_rdmt(sc, ENVY24HT_MT_I2S, 1);
+ i2sfmt = envy24ht_rdmt1(sc, ENVY24HT_MT_I2S);
i2sfmt &= ~ENVY24HT_MT_I2S_MLR128;
- envy24ht_wrmt(sc, ENVY24HT_MT_I2S, i2sfmt, 1);
+ envy24ht_wrmt1(sc, ENVY24HT_MT_I2S, i2sfmt);
}
- code = envy24ht_rdmt(sc, ENVY24HT_MT_RATE, 1);
+ code = envy24ht_rdmt1(sc, ENVY24HT_MT_RATE);
code &= ENVY24HT_MT_RATE_MASK;
for (i = 0; envy24ht_speedtab[i].code < 0x10; i++) {
if (envy24ht_speedtab[i].code == code)
@@ -1085,10 +1051,10 @@
{
#if(0)
device_printf(sc->dev, "envy24ht_setvolume(sc, %d)\n", ch);
- envy24ht_wrmt(sc, ENVY24HT_MT_VOLIDX, ch * 2, 1);
- envy24ht_wrmt(sc, ENVY24HT_MT_VOLUME, 0x7f00 | sc->left[ch], 2);
- envy24ht_wrmt(sc, ENVY24HT_MT_VOLIDX, ch * 2 + 1, 1);
- envy24ht_wrmt(sc, ENVY24HT_MT_VOLUME, (sc->right[ch] << 8) | 0x7f, 2);
+ envy24ht_wrmt1(sc, ENVY24HT_MT_VOLIDX, ch * 2);
+ envy24ht_wrmt2(sc, ENVY24HT_MT_VOLUME, 0x7f00 | sc->left[ch]);
+ envy24ht_wrmt1(sc, ENVY24HT_MT_VOLIDX, ch * 2 + 1);
+ envy24ht_wrmt2(sc, ENVY24HT_MT_VOLUME, (sc->right[ch] << 8) | 0x7f);
#endif
}
@@ -1100,10 +1066,10 @@
device_printf(sc->dev, "envy24ht_mutevolume(sc, %d)\n", ch);
vol = ENVY24HT_VOL_MUTE << 8 | ENVY24HT_VOL_MUTE;
- envy24ht_wrmt(sc, ENVY24HT_MT_VOLIDX, ch * 2, 1);
- envy24ht_wrmt(sc, ENVY24HT_MT_VOLUME, vol, 2);
- envy24ht_wrmt(sc, ENVY24HT_MT_VOLIDX, ch * 2 + 1, 1);
- envy24ht_wrmt(sc, ENVY24HT_MT_VOLUME, vol, 2);
+ envy24ht_wrmt1(sc, ENVY24HT_MT_VOLIDX, ch * 2);
+ envy24ht_wrmt2(sc, ENVY24HT_MT_VOLUME, vol);
+ envy24ht_wrmt1(sc, ENVY24HT_MT_VOLIDX, ch * 2 + 1);
+ envy24ht_wrmt2(sc, ENVY24HT_MT_VOLUME, vol);
#endif
}
@@ -1127,7 +1093,7 @@
regno = ENVY24HT_MT_RCNT;
}
- ptr = envy24ht_rdmt(sc, regno, 2);
+ ptr = envy24ht_rdmt2(sc, regno);
rtn -= (ptr + 1);
rtn /= unit;
@@ -1163,7 +1129,7 @@
mask = ~ENVY24HT_MT_INT_RMASK;
}
- ptr = size - envy24ht_rdmt(sc, regptr, 2) - 1;
+ ptr = size - envy24ht_rdmt2(sc, regptr) - 1;
/*
cnt = blk - ptr % blk - 1;
if (cnt == 0)
@@ -1173,15 +1139,15 @@
#if(0)
device_printf(sc->dev, "envy24ht_updintr():ptr = %d, blk = %d, cnt = %d\n", ptr, blk, cnt);
#endif
- envy24ht_wrmt(sc, regintr, cnt, 2);
- intr = envy24ht_rdmt(sc, ENVY24HT_MT_INT_MASK, 1);
+ envy24ht_wrmt2(sc, regintr, cnt);
+ intr = envy24ht_rdmt1(sc, ENVY24HT_MT_INT_MASK);
#if(0)
device_printf(sc->dev, "envy24ht_updintr():intr = 0x%02x, mask = 0x%02x\n", intr, mask);
#endif
- envy24ht_wrmt(sc, ENVY24HT_MT_INT_MASK, intr & mask, 1);
+ envy24ht_wrmt1(sc, ENVY24HT_MT_INT_MASK, intr & mask);
#if(0)
device_printf(sc->dev, "envy24ht_updintr():INT-->0x%02x\n",
- envy24ht_rdmt(sc, ENVY24HT_MT_INT_MASK, 1));
+ envy24ht_rdmt1(sc, ENVY24HT_MT_INT_MASK));
#endif
return;
@@ -1200,8 +1166,8 @@
mask = ENVY24HT_MT_INT_PMASK;
else
mask = ENVY24HT_MT_INT_RMASK;
- intr = envy24ht_rdmt(sc, ENVY24HT_MT_INT, 1);
- envy24ht_wrmt(sc, ENVY24HT_MT_INT, intr | mask, 1);
+ intr = envy24ht_rdmt1(sc, ENVY24HT_MT_INT);
+ envy24ht_wrmt1(sc, ENVY24HT_MT_INT, intr | mask);
return;
}
@@ -1215,14 +1181,14 @@
#if(0)
device_printf(sc->dev, "envy24ht_checkintr(sc, %d)\n", dir);
#endif
- intr = envy24ht_rdmt(sc, ENVY24HT_MT_INT_STAT, 1);
+ intr = envy24ht_rdmt1(sc, ENVY24HT_MT_INT_STAT);
if (dir == PCMDIR_PLAY) {
if ((rtn = intr & ENVY24HT_MT_INT_PSTAT) != 0) {
mask = ~ENVY24HT_MT_INT_RSTAT;
- envy24ht_wrmt(sc, 0x1a, 0x01, 1);
- envy24ht_wrmt(sc, ENVY24HT_MT_INT_STAT, (intr & mask) | ENVY24HT_MT_INT_PSTAT | 0x08, 1);
- stat = envy24ht_rdmt(sc, ENVY24HT_MT_INT_MASK, 1);
- envy24ht_wrmt(sc, ENVY24HT_MT_INT_MASK, stat | ENVY24HT_MT_INT_PMASK, 1);
+ envy24ht_wrmt1(sc, 0x1a, 0x01);
+ envy24ht_wrmt1(sc, ENVY24HT_MT_INT_STAT, (intr & mask) | ENVY24HT_MT_INT_PSTAT | 0x08);
+ stat = envy24ht_rdmt1(sc, ENVY24HT_MT_INT_MASK);
+ envy24ht_wrmt1(sc, ENVY24HT_MT_INT_MASK, stat | ENVY24HT_MT_INT_PMASK);
}
}
else {
@@ -1231,9 +1197,9 @@
#if 0
stat = ENVY24HT_MT_INT_RSTAT | ENVY24HT_MT_INT_RMASK;
#endif
- envy24ht_wrmt(sc, ENVY24HT_MT_INT_STAT, (intr & mask) | ENVY24HT_MT_INT_RSTAT, 1);
- stat = envy24ht_rdmt(sc, ENVY24HT_MT_INT_MASK, 1);
- envy24ht_wrmt(sc, ENVY24HT_MT_INT_MASK, stat | ENVY24HT_MT_INT_RMASK, 1);
+ envy24ht_wrmt1(sc, ENVY24HT_MT_INT_STAT, (intr & mask) | ENVY24HT_MT_INT_RSTAT);
+ stat = envy24ht_rdmt1(sc, ENVY24HT_MT_INT_MASK);
+ envy24ht_wrmt1(sc, ENVY24HT_MT_INT_MASK, stat | ENVY24HT_MT_INT_RMASK);
}
}
@@ -1253,12 +1219,12 @@
else
sw = ENVY24HT_MT_PCTL_RSTART;
- stat = envy24ht_rdmt(sc, ENVY24HT_MT_PCTL, 1);
- envy24ht_wrmt(sc, ENVY24HT_MT_PCTL, stat | sw, 1);
+ stat = envy24ht_rdmt1(sc, ENVY24HT_MT_PCTL);
+ envy24ht_wrmt1(sc, ENVY24HT_MT_PCTL, stat | sw);
#if(0)
DELAY(100);
- device_printf(sc->dev, "PADDR:0x%08x\n", envy24ht_rdmt(sc, ENVY24HT_MT_PADDR, 4));
- device_printf(sc->dev, "PCNT:%ld\n", envy24ht_rdmt(sc, ENVY24HT_MT_PCNT, 2));
+ device_printf(sc->dev, "PADDR:0x%08x\n", envy24ht_rdmt4(sc, ENVY24HT_MT_PADDR));
+ device_printf(sc->dev, "PCNT:%ld\n", envy24ht_rdmt2(sc, ENVY24HT_MT_PCNT));
#endif
return;
@@ -1277,8 +1243,8 @@
else
sw = ~ENVY24HT_MT_PCTL_RSTART;
- stat = envy24ht_rdmt(sc, ENVY24HT_MT_PCTL, 1);
- envy24ht_wrmt(sc, ENVY24HT_MT_PCTL, stat & sw, 1);
+ stat = envy24ht_rdmt1(sc, ENVY24HT_MT_PCTL);
+ envy24ht_wrmt1(sc, ENVY24HT_MT_PCTL, stat & sw);
return;
}
@@ -1846,7 +1812,7 @@
/* set volume control rate */
snd_mtxlock(sc->lock);
#if 0
- envy24ht_wrmt(sc, ENVY24HT_MT_VOLRATE, 0x30, 1); /* 0x30 is default value */
+ envy24ht_wrmt1(sc, ENVY24HT_MT_VOLRATE, 0x30); /* 0x30 is default value */
#endif
pcm_setflags(sc->dev, pcm_getflags(sc->dev) | SD_F_SOFTPCMVOL);
@@ -1973,7 +1939,7 @@
device_printf(sc->dev, "envy24ht_intr(): play\n");
#endif
dsize = sc->psize / 4;
- ptr = dsize - envy24ht_rdmt(sc, ENVY24HT_MT_PCNT, 2) - 1;
+ ptr = dsize - envy24ht_rdmt2(sc, ENVY24HT_MT_PCNT) - 1;
#if(0)
device_printf(sc->dev, "envy24ht_intr(): ptr = %d-->", ptr);
#endif
@@ -2002,7 +1968,7 @@
device_printf(sc->dev, "envy24ht_intr(): rec\n");
#endif
dsize = sc->rsize / 4;
- ptr = dsize - envy24ht_rdmt(sc, ENVY24HT_MT_RCNT, 2) - 1;
+ ptr = dsize - envy24ht_rdmt2(sc, ENVY24HT_MT_RCNT) - 1;
ptr -= ptr % sc->blk[1];
feed = (ptr + dsize - sc->intr[1]) % dsize;
for (i = ENVY24HT_CHAN_REC_ADC1; i <= ENVY24HT_CHAN_REC_SPDIF; i++) {
@@ -2172,18 +2138,18 @@
#if(0)
device_printf(sc->dev, "pbuf(0x%08x)\n", addr);
#endif
- envy24ht_wrmt(sc, ENVY24HT_MT_PADDR, addr, 4);
+ envy24ht_wrmt4(sc, ENVY24HT_MT_PADDR, addr);
#if(0)
- device_printf(sc->dev, "PADDR-->(0x%08x)\n", envy24ht_rdmt(sc, ENVY24HT_MT_PADDR, 4));
+ device_printf(sc->dev, "PADDR-->(0x%08x)\n", envy24ht_rdmt4(sc, ENVY24HT_MT_PADDR));
device_printf(sc->dev, "psize(%ld)\n", sc->psize / 4 - 1);
#endif
- envy24ht_wrmt(sc, ENVY24HT_MT_PCNT, sc->psize / 4 - 1, 2);
+ envy24ht_wrmt2(sc, ENVY24HT_MT_PCNT, sc->psize / 4 - 1);
#if(0)
- device_printf(sc->dev, "PCNT-->(%ld)\n", envy24ht_rdmt(sc, ENVY24HT_MT_PCNT, 2));
+ device_printf(sc->dev, "PCNT-->(%ld)\n", envy24ht_rdmt2(sc, ENVY24HT_MT_PCNT));
#endif
addr = vtophys(sc->rbuf);
- envy24ht_wrmt(sc, ENVY24HT_MT_RADDR, addr, 4);
- envy24ht_wrmt(sc, ENVY24HT_MT_RCNT, sc->rsize / 4 - 1, 2);
+ envy24ht_wrmt4(sc, ENVY24HT_MT_RADDR, addr);
+ envy24ht_wrmt2(sc, ENVY24HT_MT_RCNT, sc->rsize / 4 - 1);
return 0;
bad:
@@ -2299,9 +2265,9 @@
/* reset chip */
#if 0
- envy24ht_wrcs(sc, ENVY24HT_CCS_CTL, ENVY24HT_CCS_CTL_RESET, 1);
+ envy24ht_wrcs1(sc, ENVY24HT_CCS_CTL, ENVY24HT_CCS_CTL_RESET);
DELAY(200);
- envy24ht_wrcs(sc, ENVY24HT_CCS_CTL, ENVY24HT_CCS_CTL_NATIVE, 1);
+ envy24ht_wrcs1(sc, ENVY24HT_CCS_CTL, ENVY24HT_CCS_CTL_NATIVE);
DELAY(200);
/* legacy hardware disable */
@@ -2336,10 +2302,10 @@
}
/* set system configuration */
- envy24ht_wrcs(sc, ENVY24HT_CCS_SCFG, sc->cfg->scfg, 1);
- envy24ht_wrcs(sc, ENVY24HT_CCS_ACL, sc->cfg->acl, 1);
- envy24ht_wrcs(sc, ENVY24HT_CCS_I2S, sc->cfg->i2s, 1);
- envy24ht_wrcs(sc, ENVY24HT_CCS_SPDIF, sc->cfg->spdif, 1);
+ envy24ht_wrcs1(sc, ENVY24HT_CCS_SCFG, sc->cfg->scfg);
+ envy24ht_wrcs1(sc, ENVY24HT_CCS_ACL, sc->cfg->acl);
+ envy24ht_wrcs1(sc, ENVY24HT_CCS_I2S, sc->cfg->i2s);
+ envy24ht_wrcs1(sc, ENVY24HT_CCS_SPDIF, sc->cfg->spdif);
envy24ht_gpiosetmask(sc, sc->cfg->gpiomask);
envy24ht_gpiosetdir(sc, sc->cfg->gpiodir);
envy24ht_gpiowr(sc, sc->cfg->gpiostate);
@@ -2381,9 +2347,9 @@
#endif
/* set macro interrupt mask */
- data = envy24ht_rdcs(sc, ENVY24HT_CCS_IMASK, 1);
- envy24ht_wrcs(sc, ENVY24HT_CCS_IMASK, data & ~ENVY24HT_CCS_IMASK_PMT, 1);
- data = envy24ht_rdcs(sc, ENVY24HT_CCS_IMASK, 1);
+ data = envy24ht_rdcs1(sc, ENVY24HT_CCS_IMASK);
+ envy24ht_wrcs1(sc, ENVY24HT_CCS_IMASK, data & ~ENVY24HT_CCS_IMASK_PMT);
+ data = envy24ht_rdcs1(sc, ENVY24HT_CCS_IMASK);
#if(0)
device_printf(sc->dev, "envy24ht_init(): CCS_IMASK-->0x%02x\n", data);
#endif
@@ -2395,20 +2361,11 @@
envy24ht_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->mtid = ENVY24HT_PCIR_MT;
- sc->mt = bus_alloc_resource(sc->dev, SYS_RES_IOPORT,
- &sc->mtid, 0, ~0, 1, RF_ACTIVE);
- if (!sc->cs || !sc->mt) {
- device_printf(sc->dev, "unable to map IO port space\n");
+ if (bus_alloc_resources(sc->dev, envy24ht_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->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\nMT: 0x%lx\n",
@@ -2417,11 +2374,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, 0, envy24ht_intr, sc, &sc->ih)) {
+ if (snd_setup_intr(sc->dev, sc->res[RES_IRQ],
+ 0, envy24ht_intr, sc, &sc->ih)) {
device_printf(sc->dev, "unable to map interrupt\n");
return ENXIO;
}
@@ -2444,10 +2398,32 @@
return 0;
}
+static void
+envy24ht_destroy(device_t dev, struct sc_info *sc)
+{
+ int i;
+
+ if (sc->ih)
+ bus_teardown_intr(dev, sc->res[RES_IRQ], sc->ih);
+ bus_release_resources(dev, envy24ht_res_spec, sc->res);
+ envy24ht_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]);
+ }
+ envy24ht_cfgfree(sc->cfg);
+ if (sc->lock)
+ snd_mtxfree(sc->lock);
+ free(sc, M_ENVY24HT);
+}
+
static int
envy24ht_pci_attach(device_t dev)
{
- u_int32_t data;
struct sc_info *sc;
char status[SND_STATUSLEN];
int err = 0;
@@ -2468,10 +2444,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 = envy24ht_alloc_resource(sc);
@@ -2508,37 +2482,16 @@
/* set status iformation */
snprintf(status, SND_STATUSLEN,
"at io 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->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_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);
- envy24ht_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]);
- }
- envy24ht_cfgfree(sc->cfg);
- if (sc->cs)
- bus_release_resource(dev, SYS_RES_IOPORT, sc->csid, sc->cs);
- if (sc->mt)
- bus_release_resource(dev, SYS_RES_IOPORT, sc->mtid, sc->mt);
- if (sc->lock)
- snd_mtxfree(sc->lock);
- free(sc, M_ENVY24HT);
+ envy24ht_destroy(dev, sc);
+
return err;
}
@@ -2547,7 +2500,6 @@
{
struct sc_info *sc;
int r;
- int i;
#if(0)
device_printf(dev, "envy24ht_pci_detach()\n");
@@ -2559,21 +2511,8 @@
if (r)
return r;
- envy24ht_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]);
- }
- envy24ht_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->mtid, sc->mt);
- snd_mtxfree(sc->lock);
- free(sc, M_ENVY24HT);
+ envy24ht_destroy(dev, sc);
+
return 0;
}
More information about the p4-projects
mailing list