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>