From owner-p4-projects@FreeBSD.ORG Tue Jul 31 04:38:22 2007 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 9A9D616A41A; Tue, 31 Jul 2007 04:38:22 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 6F97316A419 for ; Tue, 31 Jul 2007 04:38:22 +0000 (UTC) (envelope-from loafier@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 61C8D13C428 for ; Tue, 31 Jul 2007 04:38:22 +0000 (UTC) (envelope-from loafier@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.1/8.14.1) with ESMTP id l6V4cMjt044840 for ; Tue, 31 Jul 2007 04:38:22 GMT (envelope-from loafier@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.1/8.14.1/Submit) id l6V4cMFe044822 for perforce@freebsd.org; Tue, 31 Jul 2007 04:38:22 GMT (envelope-from loafier@FreeBSD.org) Date: Tue, 31 Jul 2007 04:38:22 GMT Message-Id: <200707310438.l6V4cMFe044822@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to loafier@FreeBSD.org using -f From: Christopher Davis To: Perforce Change Reviews Cc: Subject: PERFORCE change 124400 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 31 Jul 2007 04:38:23 -0000 http://perforce.freebsd.org/chv.cgi?CH=124400 Change 124400 by loafier@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; }