1b40d3421SJoel Dahl /*- 212ab72d3SAlexander Leidinger * Copyright (c) 2001 Katsurajima Naoto <raven@katsurajima.seya.yokohama.jp> 312ab72d3SAlexander Leidinger * All rights reserved. 412ab72d3SAlexander Leidinger * 512ab72d3SAlexander Leidinger * Redistribution and use in source and binary forms, with or without 612ab72d3SAlexander Leidinger * modification, are permitted provided that the following conditions 712ab72d3SAlexander Leidinger * are met: 812ab72d3SAlexander Leidinger * 1. Redistributions of source code must retain the above copyright 912ab72d3SAlexander Leidinger * notice, this list of conditions and the following disclaimer. 1012ab72d3SAlexander Leidinger * 2. Redistributions in binary form must reproduce the above copyright 1112ab72d3SAlexander Leidinger * notice, this list of conditions and the following disclaimer in the 1212ab72d3SAlexander Leidinger * documentation and/or other materials provided with the distribution. 1312ab72d3SAlexander Leidinger * 1412ab72d3SAlexander Leidinger * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 1512ab72d3SAlexander Leidinger * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1612ab72d3SAlexander Leidinger * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 1712ab72d3SAlexander Leidinger * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 1812ab72d3SAlexander Leidinger * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 1912ab72d3SAlexander Leidinger * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2012ab72d3SAlexander Leidinger * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2112ab72d3SAlexander Leidinger * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHERIN CONTRACT, STRICT 2212ab72d3SAlexander Leidinger * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2312ab72d3SAlexander Leidinger * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THEPOSSIBILITY OF 2412ab72d3SAlexander Leidinger * SUCH DAMAGE. 2512ab72d3SAlexander Leidinger * 2612ab72d3SAlexander Leidinger * $FreeBSD$ 2712ab72d3SAlexander Leidinger */ 2812ab72d3SAlexander Leidinger 2912ab72d3SAlexander Leidinger 3012ab72d3SAlexander Leidinger /* -------------------------------------------------------------------- */ 3112ab72d3SAlexander Leidinger 3212ab72d3SAlexander Leidinger /* PCI device ID */ 3312ab72d3SAlexander Leidinger #define PCIV_ENVY24 0x1412 3412ab72d3SAlexander Leidinger #define PCID_ENVY24 0x1712 3512ab72d3SAlexander Leidinger 3612ab72d3SAlexander Leidinger /* PCI Registers */ 3712ab72d3SAlexander Leidinger 3812ab72d3SAlexander Leidinger #define PCIR_CCS 0x10 /* Controller I/O Base Address */ 3912ab72d3SAlexander Leidinger #define PCIR_DDMA 0x14 /* DDMA I/O Base Address */ 4012ab72d3SAlexander Leidinger #define PCIR_DS 0x18 /* DMA Path Registers I/O Base Address */ 4112ab72d3SAlexander Leidinger #define PCIR_MT 0x1c /* Professional Multi-Track I/O Base Address */ 4212ab72d3SAlexander Leidinger 4312ab72d3SAlexander Leidinger #define PCIR_LAC 0x40 /* Legacy Audio Control */ 4412ab72d3SAlexander Leidinger #define PCIM_LAC_DISABLE 0x8000 /* Legacy Audio Hardware disabled */ 4512ab72d3SAlexander Leidinger #define PCIM_LAC_SBDMA0 0x0000 /* SB DMA Channel Select: 0 */ 4612ab72d3SAlexander Leidinger #define PCIM_LAC_SBDMA1 0x0040 /* SB DMA Channel Select: 1 */ 4712ab72d3SAlexander Leidinger #define PCIM_LAC_SBDMA3 0x00c0 /* SB DMA Channel Select: 3 */ 4812ab72d3SAlexander Leidinger #define PCIM_LAC_IOADDR10 0x0020 /* I/O Address Alias Control */ 4912ab72d3SAlexander Leidinger #define PCIM_LAC_MPU401 0x0008 /* MPU-401 I/O enable */ 5012ab72d3SAlexander Leidinger #define PCIM_LAC_GAME 0x0004 /* Game Port enable (200h) */ 5112ab72d3SAlexander Leidinger #define PCIM_LAC_FM 0x0002 /* FM I/O enable (AdLib 388h base) */ 5212ab72d3SAlexander Leidinger #define PCIM_LAC_SB 0x0001 /* SB I/O enable */ 5312ab72d3SAlexander Leidinger 5412ab72d3SAlexander Leidinger #define PCIR_LCC 0x42 /* Legacy Configuration Control */ 5512ab72d3SAlexander Leidinger #define PCIM_LCC_VINT 0xff00 /* Interrupt vector to be snooped */ 5612ab72d3SAlexander Leidinger #define PCIM_LCC_SVIDRW 0x0080 /* SVID read/write enable */ 5712ab72d3SAlexander Leidinger #define PCIM_LCC_SNPSB 0x0040 /* snoop SB 22C/24Ch I/O write cycle */ 5812ab72d3SAlexander Leidinger #define PCIM_LCC_SNPPIC 0x0020 /* snoop PIC I/O R/W cycle */ 5912ab72d3SAlexander Leidinger #define PCIM_LCC_SNPPCI 0x0010 /* snoop PCI bus interrupt acknowledge cycle */ 6012ab72d3SAlexander Leidinger #define PCIM_LCC_SBBASE 0x0008 /* SB base 240h(1)/220h(0) */ 6112ab72d3SAlexander Leidinger #define PCIM_LCC_MPUBASE 0x0006 /* MPU-401 base 300h-330h */ 6212ab72d3SAlexander Leidinger #define PCIM_LCC_LDMA 0x0001 /* Legacy DMA enable */ 6312ab72d3SAlexander Leidinger 6412ab72d3SAlexander Leidinger #define PCIR_SCFG 0x60 /* System Configuration Register */ 6512ab72d3SAlexander Leidinger #define PCIM_SCFG_XIN2 0xc0 /* XIN2 Clock Source Configuration */ 6612ab72d3SAlexander Leidinger /* 00: 22.5792MHz(44.1kHz*512) */ 6712ab72d3SAlexander Leidinger /* 01: 16.9344MHz(44.1kHz*384) */ 6812ab72d3SAlexander Leidinger /* 10: from external clock synthesizer chip */ 6912ab72d3SAlexander Leidinger #define PCIM_SCFG_MPU 0x20 /* 1(0)/2(1) MPU-401 UART(s) */ 7012ab72d3SAlexander Leidinger #define PCIM_SCFG_AC97 0x10 /* 0: AC'97 codec exist */ 7112ab72d3SAlexander Leidinger /* 1: AC'97 codec not exist */ 7212ab72d3SAlexander Leidinger #define PCIM_SCFG_ADC 0x0c /* 1-4 stereo ADC connected */ 7312ab72d3SAlexander Leidinger #define PCIM_SCFG_DAC 0x03 /* 1-4 stereo DAC connected */ 7412ab72d3SAlexander Leidinger 7512ab72d3SAlexander Leidinger #define PCIR_ACL 0x61 /* AC-Link Configuration Register */ 7612ab72d3SAlexander Leidinger #define PCIM_ACL_MTC 0x80 /* Multi-track converter type: 0:AC'97 1:I2S */ 7712ab72d3SAlexander Leidinger #define PCIM_ACL_OMODE 0x02 /* AC 97 codec SDATA_OUT 0:split 1:packed */ 7812ab72d3SAlexander Leidinger #define PCIM_ACL_IMODE 0x01 /* AC 97 codec SDATA_IN 0:split 1:packed */ 7912ab72d3SAlexander Leidinger 8012ab72d3SAlexander Leidinger #define PCIR_I2S 0x62 /* I2S Converters Features Register */ 8112ab72d3SAlexander Leidinger #define PCIM_I2S_VOL 0x80 /* I2S codec Volume and mute */ 8212ab72d3SAlexander Leidinger #define PCIM_I2S_96KHZ 0x40 /* I2S converter 96kHz sampling rate support */ 8312ab72d3SAlexander Leidinger #define PCIM_I2S_RES 0x30 /* Converter resolution */ 8412ab72d3SAlexander Leidinger #define PCIM_I2S_16BIT 0x00 /* 16bit */ 8512ab72d3SAlexander Leidinger #define PCIM_I2S_18BIT 0x10 /* 18bit */ 8612ab72d3SAlexander Leidinger #define PCIM_I2S_20BIT 0x20 /* 20bit */ 8712ab72d3SAlexander Leidinger #define PCIM_I2S_24BIT 0x30 /* 24bit */ 8812ab72d3SAlexander Leidinger #define PCIM_I2S_ID 0x0f /* Other I2S IDs */ 8912ab72d3SAlexander Leidinger 9012ab72d3SAlexander Leidinger #define PCIR_SPDIF 0x63 /* S/PDIF Configuration Register */ 9112ab72d3SAlexander Leidinger #define PCIM_SPDIF_ID 0xfc /* S/PDIF chip ID */ 9212ab72d3SAlexander Leidinger #define PCIM_SPDIF_IN 0x02 /* S/PDIF Stereo In is present */ 9312ab72d3SAlexander Leidinger #define PCIM_SPDIF_OUT 0x01 /* S/PDIF Stereo Out is present */ 9412ab72d3SAlexander Leidinger 9512ab72d3SAlexander Leidinger #define PCIR_POWER_STAT 0x84 /* Power Management Control and Status */ 9612ab72d3SAlexander Leidinger 9712ab72d3SAlexander Leidinger /* Controller Registers */ 9812ab72d3SAlexander Leidinger 9912ab72d3SAlexander Leidinger #define ENVY24_CCS_CTL 0x00 /* Control/Status Register */ 10012ab72d3SAlexander Leidinger #define ENVY24_CCS_CTL_RESET 0x80 /* Entire Chip soft reset */ 10112ab72d3SAlexander Leidinger #define ENVY24_CCS_CTL_DMAINT 0x40 /* DS DMA Channel-C interrupt */ 10212ab72d3SAlexander Leidinger #define ENVY24_CCS_CTL_DOSVOL 0x10 /* set the DOS WT volume control */ 10312ab72d3SAlexander Leidinger #define ENVY24_CCS_CTL_EDGE 0x08 /* SERR# edge (only one PCI clock width) */ 10412ab72d3SAlexander Leidinger #define ENVY24_CCS_CTL_SBINT 0x02 /* SERR# assertion for SB interrupt */ 10512ab72d3SAlexander Leidinger #define ENVY24_CCS_CTL_NATIVE 0x01 /* Mode select: 0:SB mode 1:native mode */ 10612ab72d3SAlexander Leidinger 10712ab72d3SAlexander Leidinger #define ENVY24_CCS_IMASK 0x01 /* Interrupt Mask Register */ 10812ab72d3SAlexander Leidinger #define ENVY24_CCS_IMASK_PMIDI 0x80 /* Primary MIDI */ 10912ab72d3SAlexander Leidinger #define ENVY24_CCS_IMASK_TIMER 0x40 /* Timer */ 11012ab72d3SAlexander Leidinger #define ENVY24_CCS_IMASK_SMIDI 0x20 /* Secondary MIDI */ 11112ab72d3SAlexander Leidinger #define ENVY24_CCS_IMASK_PMT 0x10 /* Professional Multi-track */ 11212ab72d3SAlexander Leidinger #define ENVY24_CCS_IMASK_FM 0x08 /* FM/MIDI trapping */ 11312ab72d3SAlexander Leidinger #define ENVY24_CCS_IMASK_PDMA 0x04 /* Playback DS DMA */ 11412ab72d3SAlexander Leidinger #define ENVY24_CCS_IMASK_RDMA 0x02 /* Consumer record DMA */ 11512ab72d3SAlexander Leidinger #define ENVY24_CCS_IMASK_SB 0x01 /* Consumer/SB mode playback */ 11612ab72d3SAlexander Leidinger 11712ab72d3SAlexander Leidinger #define ENVY24_CCS_ISTAT 0x02 /* Interrupt Status Register */ 11812ab72d3SAlexander Leidinger #define ENVY24_CCS_ISTAT_PMIDI 0x80 /* Primary MIDI */ 11912ab72d3SAlexander Leidinger #define ENVY24_CCS_ISTAT_TIMER 0x40 /* Timer */ 12012ab72d3SAlexander Leidinger #define ENVY24_CCS_ISTAT_SMIDI 0x20 /* Secondary MIDI */ 12112ab72d3SAlexander Leidinger #define ENVY24_CCS_ISTAT_PMT 0x10 /* Professional Multi-track */ 12212ab72d3SAlexander Leidinger #define ENVY24_CCS_ISTAT_FM 0x08 /* FM/MIDI trapping */ 12312ab72d3SAlexander Leidinger #define ENVY24_CCS_ISTAT_PDMA 0x04 /* Playback DS DMA */ 12412ab72d3SAlexander Leidinger #define ENVY24_CCS_ISTAT_RDMA 0x02 /* Consumer record DMA */ 12512ab72d3SAlexander Leidinger #define ENVY24_CCS_ISTAT_SB 0x01 /* Consumer/SB mode playback */ 12612ab72d3SAlexander Leidinger 12712ab72d3SAlexander Leidinger #define ENVY24_CCS_INDEX 0x03 /* Envy24 Index Register */ 12812ab72d3SAlexander Leidinger #define ENVY24_CCS_DATA 0x04 /* Envy24 Data Register */ 12912ab72d3SAlexander Leidinger 13012ab72d3SAlexander Leidinger #define ENVY24_CCS_NMI1 0x05 /* NMI Status Register 1 */ 13112ab72d3SAlexander Leidinger #define ENVY24_CCS_NMI1_PCI 0x80 /* PCI I/O read/write cycle */ 13212ab72d3SAlexander Leidinger #define ENVY24_CCS_NMI1_SB 0x40 /* SB 22C/24C write */ 13312ab72d3SAlexander Leidinger #define ENVY24_CCS_NMI1_SBDMA 0x10 /* SB interrupt (SB DMA/SB F2 command) */ 13412ab72d3SAlexander Leidinger #define ENVY24_CCS_NMI1_DSDMA 0x08 /* DS channel C DMA interrupt */ 13512ab72d3SAlexander Leidinger #define ENVY24_CCS_NMI1_MIDI 0x04 /* MIDI 330h or [PCI_10]h+Ch write */ 13612ab72d3SAlexander Leidinger #define ENVY24_CCS_NMI1_FM 0x01 /* FM data register write */ 13712ab72d3SAlexander Leidinger 13812ab72d3SAlexander Leidinger #define ENVY24_CCS_NMIDAT 0x06 /* NMI Data Register */ 13912ab72d3SAlexander Leidinger #define ENVY24_CCS_NMIIDX 0x07 /* NMI Index Register */ 14012ab72d3SAlexander Leidinger #define ENVY24_CCS_AC97IDX 0x08 /* Consumer AC'97 Index Register */ 14112ab72d3SAlexander Leidinger 14212ab72d3SAlexander Leidinger #define ENVY24_CCS_AC97CMD 0x09 /* Consumer AC'97 Command/Status Register */ 14312ab72d3SAlexander Leidinger #define ENVY24_CCS_AC97CMD_COLD 0x80 /* Cold reset */ 14412ab72d3SAlexander Leidinger #define ENVY24_CCS_AC97CMD_WARM 0x40 /* Warm reset */ 14512ab72d3SAlexander Leidinger #define ENVY24_CCS_AC97CMD_WRCODEC 0x20 /* Write to AC'97 codec registers */ 14612ab72d3SAlexander Leidinger #define ENVY24_CCS_AC97CMD_RDCODEC 0x10 /* Read from AC'97 codec registers */ 14712ab72d3SAlexander Leidinger #define ENVY24_CCS_AC97CMD_READY 0x08 /* AC'97 codec ready status bit */ 14812ab72d3SAlexander Leidinger #define ENVY24_CCS_AC97CMD_PVSR 0x02 /* VSR for Playback */ 14912ab72d3SAlexander Leidinger #define ENVY24_CCS_AC97CMD_RVSR 0x01 /* VSR for Record */ 15012ab72d3SAlexander Leidinger 15112ab72d3SAlexander Leidinger #define ENVY24_CCS_AC97DAT 0x0a /* Consumer AC'97 Data Port Register */ 15212ab72d3SAlexander Leidinger #define ENVY24_CCS_PMIDIDAT 0x0c /* Primary MIDI UART Data Register */ 15312ab72d3SAlexander Leidinger #define ENVY24_CCS_PMIDICMD 0x0d /* Primary MIDI UART Command/Status Register */ 15412ab72d3SAlexander Leidinger 15512ab72d3SAlexander Leidinger #define ENVY24_CCS_NMI2 0x0e /* NMI Status Register 2 */ 15612ab72d3SAlexander Leidinger #define ENVY24_CCS_NMI2_FMBANK 0x30 /* FM bank indicator */ 15712ab72d3SAlexander Leidinger #define ENVY24_CCS_NMI2_FM0 0x10 /* FM bank 0 (388h/220h/228h) */ 15812ab72d3SAlexander Leidinger #define ENVY24_CCS_NMI2_FM1 0x20 /* FM bank 1 (38ah/222h) */ 15912ab72d3SAlexander Leidinger #define ENVY24_CCS_NMI2_PICIO 0x0f /* PIC I/O cycle */ 16012ab72d3SAlexander Leidinger #define ENVY24_CCS_NMI2_PIC20W 0x01 /* 20h write */ 16112ab72d3SAlexander Leidinger #define ENVY24_CCS_NMI2_PICA0W 0x02 /* a0h write */ 16212ab72d3SAlexander Leidinger #define ENVY24_CCS_NMI2_PIC21W 0x05 /* 21h write */ 16312ab72d3SAlexander Leidinger #define ENVY24_CCS_NMI2_PICA1W 0x06 /* a1h write */ 16412ab72d3SAlexander Leidinger #define ENVY24_CCS_NMI2_PIC20R 0x09 /* 20h read */ 16512ab72d3SAlexander Leidinger #define ENVY24_CCS_NMI2_PICA0R 0x0a /* a0h read */ 16612ab72d3SAlexander Leidinger #define ENVY24_CCS_NMI2_PIC21R 0x0d /* 21h read */ 16712ab72d3SAlexander Leidinger #define ENVY24_CCS_NMI2_PICA1R 0x0e /* a1h read */ 16812ab72d3SAlexander Leidinger 16912ab72d3SAlexander Leidinger #define ENVY24_CCS_JOY 0x0f /* Game port register */ 17012ab72d3SAlexander Leidinger 17112ab72d3SAlexander Leidinger #define ENVY24_CCS_I2CDEV 0x10 /* I2C Port Device Address Register */ 17212ab72d3SAlexander Leidinger #define ENVY24_CCS_I2CDEV_ADDR 0xfe /* I2C device address */ 17312ab72d3SAlexander Leidinger #define ENVY24_CCS_I2CDEV_ROM 0xa0 /* reserved for the external I2C E2PROM */ 17412ab72d3SAlexander Leidinger #define ENVY24_CCS_I2CDEV_WR 0x01 /* write */ 17512ab72d3SAlexander Leidinger #define ENVY24_CCS_I2CDEV_RD 0x00 /* read */ 17612ab72d3SAlexander Leidinger 17712ab72d3SAlexander Leidinger #define ENVY24_CCS_I2CADDR 0x11 /* I2C Port Byte Address Register */ 17812ab72d3SAlexander Leidinger #define ENVY24_CCS_I2CDATA 0x12 /* I2C Port Read/Write Data Register */ 17912ab72d3SAlexander Leidinger 18012ab72d3SAlexander Leidinger #define ENVY24_CCS_I2CSTAT 0x13 /* I2C Port Control and Status Register */ 18112ab72d3SAlexander Leidinger #define ENVY24_CCS_I2CSTAT_ROM 0x80 /* external E2PROM exists */ 18212ab72d3SAlexander Leidinger #define ENVY24_CCS_I2CSTAT_BSY 0x01 /* I2C port read/write status busy */ 18312ab72d3SAlexander Leidinger 18412ab72d3SAlexander Leidinger #define ENVY24_CCS_CDMABASE 0x14 /* Consumer Record DMA Current/Base Address Register */ 18512ab72d3SAlexander Leidinger #define ENVY24_CCS_CDMACNT 0x18 /* Consumer Record DMA Current/Base Count Register */ 18612ab72d3SAlexander Leidinger #define ENVY24_CCS_SERR 0x1b /* PCI Configuration SERR# Shadow Register */ 18712ab72d3SAlexander Leidinger #define ENVY24_CCS_SMIDIDAT 0x1c /* Secondary MIDI UART Data Register */ 18812ab72d3SAlexander Leidinger #define ENVY24_CCS_SMIDICMD 0x1d /* Secondary MIDI UART Command/Status Register */ 18912ab72d3SAlexander Leidinger 19012ab72d3SAlexander Leidinger #define ENVY24_CCS_TIMER 0x1e /* Timer Register */ 19112ab72d3SAlexander Leidinger #define ENVY24_CCS_TIMER_EN 0x8000 /* Timer count enable */ 19212ab72d3SAlexander Leidinger #define ENVY24_CCS_TIMER_MASK 0x7fff /* Timer counter mask */ 19312ab72d3SAlexander Leidinger 19412ab72d3SAlexander Leidinger /* Controller Indexed Registers */ 19512ab72d3SAlexander Leidinger 19612ab72d3SAlexander Leidinger #define ENVY24_CCI_PTCHIGH 0x00 /* Playback Terminal Count Register (High Byte) */ 19712ab72d3SAlexander Leidinger #define ENVY24_CCI_PTCLOW 0x01 /* Playback Terminal Count Register (Low Byte) */ 19812ab72d3SAlexander Leidinger 19912ab72d3SAlexander Leidinger #define ENVY24_CCI_PCTL 0x02 /* Playback Control Register */ 20012ab72d3SAlexander Leidinger #define ENVY24_CCI_PCTL_TURBO 0x80 /* 4x up sampling in the host by software */ 20112ab72d3SAlexander Leidinger #define ENVY24_CCI_PCTL_U8 0x10 /* 8 bits unsigned */ 20212ab72d3SAlexander Leidinger #define ENVY24_CCI_PCTL_S16 0x00 /* 16 bits signed */ 20312ab72d3SAlexander Leidinger #define ENVY24_CCI_PCTL_STEREO 0x08 /* stereo */ 20412ab72d3SAlexander Leidinger #define ENVY24_CCI_PCTL_MONO 0x00 /* mono */ 20512ab72d3SAlexander Leidinger #define ENVY24_CCI_PCTL_FLUSH 0x04 /* FIFO flush (sticky bit. Requires toggling) */ 20612ab72d3SAlexander Leidinger #define ENVY24_CCI_PCTL_PAUSE 0x02 /* Pause */ 20712ab72d3SAlexander Leidinger #define ENVY24_CCI_PCTL_ENABLE 0x01 /* Playback enable */ 20812ab72d3SAlexander Leidinger 20912ab72d3SAlexander Leidinger #define ENVY24_CCI_PLVOL 0x03 /* Playback Left Volume/Pan Register */ 21012ab72d3SAlexander Leidinger #define ENVY24_CCI_PRVOL 0x04 /* Playback Right Volume/Pan Register */ 21112ab72d3SAlexander Leidinger #define ENVY24_CCI_VOL_MASK 0x3f /* Volume value mask */ 21212ab72d3SAlexander Leidinger 21312ab72d3SAlexander Leidinger #define ENVY24_CCI_SOFTVOL 0x05 /* Soft Volume/Mute Control Register */ 21412ab72d3SAlexander Leidinger #define ENVY24_CCI_PSRLOW 0x06 /* Playback Sampling Rate Register (Low Byte) */ 21512ab72d3SAlexander Leidinger #define ENVY24_CCI_PSRMID 0x07 /* Playback Sampling Rate Register (Middle Byte) */ 21612ab72d3SAlexander Leidinger #define ENVY24_CCI_PSRHIGH 0x08 /* Playback Sampling Rate Register (High Byte) */ 21712ab72d3SAlexander Leidinger #define ENVY24_CCI_RTCHIGH 0x10 /* Record Terminal Count Register (High Byte) */ 21812ab72d3SAlexander Leidinger #define ENVY24_CCI_RTCLOW 0x11 /* Record Terminal Count Register (Low Byte) */ 21912ab72d3SAlexander Leidinger 22012ab72d3SAlexander Leidinger #define ENVY24_CCI_RCTL 0x12 /* Record Control Register */ 22112ab72d3SAlexander Leidinger #define ENVY24_CCI_RCTL_DRTN 0x80 /* Digital return enable */ 22212ab72d3SAlexander Leidinger #define ENVY24_CCI_RCTL_U8 0x04 /* 8 bits unsigned */ 22312ab72d3SAlexander Leidinger #define ENVY24_CCI_RCTL_S16 0x00 /* 16 bits signed */ 22412ab72d3SAlexander Leidinger #define ENVY24_CCI_RCTL_STEREO 0x00 /* stereo */ 22512ab72d3SAlexander Leidinger #define ENVY24_CCI_RCTL_MONO 0x02 /* mono */ 22612ab72d3SAlexander Leidinger #define ENVY24_CCI_RCTL_ENABLE 0x01 /* Record enable */ 22712ab72d3SAlexander Leidinger 22812ab72d3SAlexander Leidinger #define ENVY24_CCI_GPIODAT 0x20 /* GPIO Data Register */ 22912ab72d3SAlexander Leidinger #define ENVY24_CCI_GPIOMASK 0x21 /* GPIO Write Mask Register */ 23012ab72d3SAlexander Leidinger 23112ab72d3SAlexander Leidinger #define ENVY24_CCI_GPIOCTL 0x22 /* GPIO Direction Control Register */ 23212ab72d3SAlexander Leidinger #define ENVY24_CCI_GPIO_OUT 1 /* output */ 23312ab72d3SAlexander Leidinger #define ENVY24_CCI_GPIO_IN 0 /* input */ 23412ab72d3SAlexander Leidinger 23512ab72d3SAlexander Leidinger #define ENVY24_CCI_CPDWN 0x30 /* Consumer Section Power Down Register */ 23612ab72d3SAlexander Leidinger #define ENVY24_CCI_CPDWN_XTAL 0x80 /* Crystal clock generation power down for XTAL_1 */ 23712ab72d3SAlexander Leidinger #define ENVY24_CCI_CPDWN_GAME 0x40 /* Game port analog power down */ 23812ab72d3SAlexander Leidinger #define ENVY24_CCI_CPDWN_I2C 0x10 /* I2C port clock */ 23912ab72d3SAlexander Leidinger #define ENVY24_CCI_CPDWN_MIDI 0x08 /* MIDI clock */ 24012ab72d3SAlexander Leidinger #define ENVY24_CCI_CPDWN_AC97 0x04 /* AC'97 clock */ 24112ab72d3SAlexander Leidinger #define ENVY24_CCI_CPDWN_DS 0x02 /* DS Block clock */ 24212ab72d3SAlexander Leidinger #define ENVY24_CCI_CPDWN_PCI 0x01 /* PCI clock for SB, DMA controller */ 24312ab72d3SAlexander Leidinger 24412ab72d3SAlexander Leidinger #define ENVY24_CCI_MTPDWN 0x31 /* Multi-Track Section Power Down Register */ 24512ab72d3SAlexander Leidinger #define ENVY24_CCI_MTPDWN_XTAL 0x80 /* Crystal clock generation power down for XTAL_2 */ 24612ab72d3SAlexander Leidinger #define ENVY24_CCI_MTPDWN_SPDIF 0x04 /* S/PDIF clock */ 24712ab72d3SAlexander Leidinger #define ENVY24_CCI_MTPDWN_MIX 0x02 /* Professional digital mixer clock */ 24812ab72d3SAlexander Leidinger #define ENVY24_CCI_MTPDWN_I2S 0x01 /* Multi-track I2S serial interface clock */ 24912ab72d3SAlexander Leidinger 25012ab72d3SAlexander Leidinger /* DDMA Registers */ 25112ab72d3SAlexander Leidinger 25212ab72d3SAlexander Leidinger #define ENVY24_DDMA_ADDR0 0x00 /* DMA Base and Current Address bit 0-7 */ 25312ab72d3SAlexander Leidinger #define ENVY24_DDMA_ADDR8 0x01 /* DMA Base and Current Address bit 8-15 */ 25412ab72d3SAlexander Leidinger #define ENVY24_DDMA_ADDR16 0x02 /* DMA Base and Current Address bit 16-23 */ 25512ab72d3SAlexander Leidinger #define ENVY24_DDMA_ADDR24 0x03 /* DMA Base and Current Address bit 24-31 */ 25612ab72d3SAlexander Leidinger #define ENVY24_DDMA_CNT0 0x04 /* DMA Base and Current Count 0-7 */ 25712ab72d3SAlexander Leidinger #define ENVY24_DDMA_CNT8 0x05 /* DMA Base and Current Count 8-15 */ 25812ab72d3SAlexander Leidinger #define ENVY24_DDMA_CNT16 0x06 /* (not supported) */ 25912ab72d3SAlexander Leidinger #define ENVY24_DDMA_CMD 0x08 /* Status and Command */ 26012ab72d3SAlexander Leidinger #define ENVY24_DDMA_MODE 0x0b /* Mode */ 26112ab72d3SAlexander Leidinger #define ENVY24_DDMA_RESET 0x0c /* Master reset */ 26212ab72d3SAlexander Leidinger #define ENVY24_DDMA_CHAN 0x0f /* Channel Mask */ 26312ab72d3SAlexander Leidinger 26412ab72d3SAlexander Leidinger /* Consumer Section DMA Channel Registers */ 26512ab72d3SAlexander Leidinger 26612ab72d3SAlexander Leidinger #define ENVY24_CS_INTMASK 0x00 /* DirectSound DMA Interrupt Mask Register */ 26712ab72d3SAlexander Leidinger #define ENVY24_CS_INTSTAT 0x02 /* DirectSound DMA Interrupt Status Register */ 26812ab72d3SAlexander Leidinger #define ENVY24_CS_CHDAT 0x04 /* Channel Data register */ 26912ab72d3SAlexander Leidinger 27012ab72d3SAlexander Leidinger #define ENVY24_CS_CHIDX 0x08 /* Channel Index Register */ 27112ab72d3SAlexander Leidinger #define ENVY24_CS_CHIDX_NUM 0xf0 /* Channel number */ 27212ab72d3SAlexander Leidinger #define ENVY24_CS_CHIDX_ADDR0 0x00 /* Buffer_0 DMA base address */ 27312ab72d3SAlexander Leidinger #define ENVY24_CS_CHIDX_CNT0 0x01 /* Buffer_0 DMA base count */ 27412ab72d3SAlexander Leidinger #define ENVY24_CS_CHIDX_ADDR1 0x02 /* Buffer_1 DMA base address */ 27512ab72d3SAlexander Leidinger #define ENVY24_CS_CHIDX_CNT1 0x03 /* Buffer_1 DMA base count */ 27612ab72d3SAlexander Leidinger #define ENVY24_CS_CHIDX_CTL 0x04 /* Channel Control and Status register */ 27712ab72d3SAlexander Leidinger #define ENVY24_CS_CHIDX_RATE 0x05 /* Channel Sampling Rate */ 27812ab72d3SAlexander Leidinger #define ENVY24_CS_CHIDX_VOL 0x06 /* Channel left and right volume/pan control */ 27912ab72d3SAlexander Leidinger /* Channel Control and Status Register at Index 4h */ 28012ab72d3SAlexander Leidinger #define ENVY24_CS_CTL_BUF 0x80 /* indicating that the current active buffer */ 28112ab72d3SAlexander Leidinger #define ENVY24_CS_CTL_AUTO1 0x40 /* Buffer_1 auto init. enable */ 28212ab72d3SAlexander Leidinger #define ENVY24_CS_CTL_AUTO0 0x20 /* Buffer_0 auto init. enable */ 28312ab72d3SAlexander Leidinger #define ENVY24_CS_CTL_FLUSH 0x10 /* Flush FIFO */ 28412ab72d3SAlexander Leidinger #define ENVY24_CS_CTL_STEREO 0x08 /* stereo(or mono) */ 28512ab72d3SAlexander Leidinger #define ENVY24_CS_CTL_U8 0x04 /* 8-bit unsigned(or 16-bit signed) */ 28612ab72d3SAlexander Leidinger #define ENVY24_CS_CTL_PAUSE 0x02 /* DMA request 1:pause */ 28712ab72d3SAlexander Leidinger #define ENVY24_CS_CTL_START 0x01 /* DMA request 1: start, 0:stop */ 28812ab72d3SAlexander Leidinger /* Consumer mode Left/Right Volume Register at Index 06h */ 28912ab72d3SAlexander Leidinger #define ENVY24_CS_VOL_RIGHT 0x3f00 29012ab72d3SAlexander Leidinger #define ENVY24_CS_VOL_LEFT 0x003f 29112ab72d3SAlexander Leidinger 29212ab72d3SAlexander Leidinger /* Professional Multi-Track Control Registers */ 29312ab72d3SAlexander Leidinger 29412ab72d3SAlexander Leidinger #define ENVY24_MT_INT 0x00 /* DMA Interrupt Mask and Status Register */ 29512ab72d3SAlexander Leidinger #define ENVY24_MT_INT_RMASK 0x80 /* Multi-track record interrupt mask */ 29612ab72d3SAlexander Leidinger #define ENVY24_MT_INT_PMASK 0x40 /* Multi-track playback interrupt mask */ 29712ab72d3SAlexander Leidinger #define ENVY24_MT_INT_RSTAT 0x02 /* Multi-track record interrupt status */ 29812ab72d3SAlexander Leidinger #define ENVY24_MT_INT_PSTAT 0x01 /* Multi-track playback interrupt status */ 29912ab72d3SAlexander Leidinger 30012ab72d3SAlexander Leidinger #define ENVY24_MT_RATE 0x01 /* Sampling Rate Select Register */ 30112ab72d3SAlexander Leidinger #define ENVY24_MT_RATE_SPDIF 0x10 /* S/PDIF input clock as the master */ 30212ab72d3SAlexander Leidinger #define ENVY24_MT_RATE_48000 0x00 30312ab72d3SAlexander Leidinger #define ENVY24_MT_RATE_24000 0x01 30412ab72d3SAlexander Leidinger #define ENVY24_MT_RATE_12000 0x02 30512ab72d3SAlexander Leidinger #define ENVY24_MT_RATE_9600 0x03 30612ab72d3SAlexander Leidinger #define ENVY24_MT_RATE_32000 0x04 30712ab72d3SAlexander Leidinger #define ENVY24_MT_RATE_16000 0x05 30812ab72d3SAlexander Leidinger #define ENVY24_MT_RATE_8000 0x06 30912ab72d3SAlexander Leidinger #define ENVY24_MT_RATE_96000 0x07 31012ab72d3SAlexander Leidinger #define ENVY24_MT_RATE_64000 0x0f 31112ab72d3SAlexander Leidinger #define ENVY24_MT_RATE_44100 0x08 31212ab72d3SAlexander Leidinger #define ENVY24_MT_RATE_22050 0x09 31312ab72d3SAlexander Leidinger #define ENVY24_MT_RATE_11025 0x0a 31412ab72d3SAlexander Leidinger #define ENVY24_MT_RATE_88200 0x0b 31512ab72d3SAlexander Leidinger #define ENVY24_MT_RATE_MASK 0x0f 31612ab72d3SAlexander Leidinger 31712ab72d3SAlexander Leidinger #define ENVY24_MT_I2S 0x02 /* I2S Data Format Register */ 31812ab72d3SAlexander Leidinger #define ENVY24_MT_I2S_MLR128 0x08 /* MCLK/LRCLK ratio 128x(or 256x) */ 31912ab72d3SAlexander Leidinger #define ENVY24_MT_I2S_SLR48 0x04 /* SCLK/LRCLK ratio 48bpf(or 64bpf) */ 32012ab72d3SAlexander Leidinger #define ENVY24_MT_I2S_FORM 0x00 /* I2S data format */ 32112ab72d3SAlexander Leidinger 32212ab72d3SAlexander Leidinger #define ENVY24_MT_AC97IDX 0x04 /* Index Register for AC'97 Codecs */ 32312ab72d3SAlexander Leidinger 32412ab72d3SAlexander Leidinger #define ENVY24_MT_AC97CMD 0x05 /* Command and Status Register for AC'97 Codecs */ 32512ab72d3SAlexander Leidinger #define ENVY24_MT_AC97CMD_CLD 0x80 /* Cold reset */ 32612ab72d3SAlexander Leidinger #define ENVY24_MT_AC97CMD_WRM 0x40 /* Warm reset */ 32712ab72d3SAlexander Leidinger #define ENVY24_MT_AC97CMD_WR 0x20 /* write to AC'97 codec register */ 32812ab72d3SAlexander Leidinger #define ENVY24_MT_AC97CMD_RD 0x10 /* read AC'97 CODEC register */ 32912ab72d3SAlexander Leidinger #define ENVY24_MT_AC97CMD_RDY 0x08 /* AC'97 codec ready status bit */ 33012ab72d3SAlexander Leidinger #define ENVY24_MT_AC97CMD_ID 0x03 /* ID(0-3) for external AC 97 registers */ 33112ab72d3SAlexander Leidinger 33212ab72d3SAlexander Leidinger #define ENVY24_MT_AC97DLO 0x06 /* AC'97 codec register data low byte */ 33312ab72d3SAlexander Leidinger #define ENVY24_MT_AC97DHI 0x07 /* AC'97 codec register data high byte */ 33412ab72d3SAlexander Leidinger #define ENVY24_MT_PADDR 0x10 /* Playback DMA Current/Base Address Register */ 33512ab72d3SAlexander Leidinger #define ENVY24_MT_PCNT 0x14 /* Playback DMA Current/Base Count Register */ 33612ab72d3SAlexander Leidinger #define ENVY24_MT_PTERM 0x16 /* Playback Current/Base Terminal Count Register */ 33712ab72d3SAlexander Leidinger #define ENVY24_MT_PCTL 0x18 /* Playback and Record Control Register */ 33812ab72d3SAlexander Leidinger #define ENVY24_MT_PCTL_RSTART 0x04 /* 1: Record start; 0: Record stop */ 33912ab72d3SAlexander Leidinger #define ENVY24_MT_PCTL_PAUSE 0x02 /* 1: Pause; 0: Resume */ 34012ab72d3SAlexander Leidinger #define ENVY24_MT_PCTL_PSTART 0x01 /* 1: Playback start; 0: Playback stop */ 34112ab72d3SAlexander Leidinger 34212ab72d3SAlexander Leidinger #define ENVY24_MT_RADDR 0x20 /* Record DMA Current/Base Address Register */ 34312ab72d3SAlexander Leidinger #define ENVY24_MT_RCNT 0x24 /* Record DMA Current/Base Count Register */ 34412ab72d3SAlexander Leidinger #define ENVY24_MT_RTERM 0x26 /* Record Current/Base Terminal Count Register */ 34512ab72d3SAlexander Leidinger #define ENVY24_MT_RCTL 0x28 /* Record Control Register */ 34612ab72d3SAlexander Leidinger #define ENVY24_MT_RCTL_RSTART 0x01 /* 1: Record start; 0: Record stop */ 34712ab72d3SAlexander Leidinger 34812ab72d3SAlexander Leidinger #define ENVY24_MT_PSDOUT 0x30 /* Routing Control Register for Data to PSDOUT[0:3] */ 34912ab72d3SAlexander Leidinger #define ENVY24_MT_SPDOUT 0x32 /* Routing Control Register for SPDOUT */ 35012ab72d3SAlexander Leidinger #define ENVY24_MT_RECORD 0x34 /* Captured (Recorded) data Routing Selection Register */ 35112ab72d3SAlexander Leidinger 35212ab72d3SAlexander Leidinger #define BUS_SPACE_MAXADDR_ENVY24 0x0fffffff /* Address space beyond 256MB is not supported */ 35312ab72d3SAlexander Leidinger #define BUS_SPACE_MAXSIZE_ENVY24 0x3fffc /* 64k x 4byte(1dword) */ 35412ab72d3SAlexander Leidinger 35512ab72d3SAlexander Leidinger #define ENVY24_MT_VOLUME 0x38 /* Left/Right Volume Control Data Register */ 35612ab72d3SAlexander Leidinger #define ENVY24_MT_VOLUME_L 0x007f /* Left Volume Mask */ 35712ab72d3SAlexander Leidinger #define ENVY24_MT_VOLUME_R 0x7f00 /* Right Volume Mask */ 35812ab72d3SAlexander Leidinger 35912ab72d3SAlexander Leidinger #define ENVY24_MT_VOLIDX 0x3a /* Volume Control Stream Index Register */ 36012ab72d3SAlexander Leidinger #define ENVY24_MT_VOLRATE 0x3b /* Volume Control Rate Register */ 36112ab72d3SAlexander Leidinger #define ENVY24_MT_MONAC97 0x3c /* Digital Mixer Monitor Routing Control Register */ 36212ab72d3SAlexander Leidinger #define ENVY24_MT_PEAKIDX 0x3e /* Peak Meter Index Register */ 36312ab72d3SAlexander Leidinger #define ENVY24_MT_PEAKDAT 0x3f /* Peak Meter Data Register */ 36412ab72d3SAlexander Leidinger 36512ab72d3SAlexander Leidinger /* -------------------------------------------------------------------- */ 36612ab72d3SAlexander Leidinger 36712ab72d3SAlexander Leidinger /* ENVY24 mixer channel defines */ 36812ab72d3SAlexander Leidinger /* 36912ab72d3SAlexander Leidinger ENVY24 mixer has original line matrix. So, general mixer command is not 37012ab72d3SAlexander Leidinger able to use for this. If system has consumer AC'97 output, AC'97 line is 37112ab72d3SAlexander Leidinger used as master mixer, and it is able to control. 37212ab72d3SAlexander Leidinger */ 37312ab72d3SAlexander Leidinger #define ENVY24_CHAN_NUM 11 /* Play * 5 + Record * 5 + Mix * 1 */ 37412ab72d3SAlexander Leidinger 37512ab72d3SAlexander Leidinger #define ENVY24_CHAN_PLAY_DAC1 0 37612ab72d3SAlexander Leidinger #define ENVY24_CHAN_PLAY_DAC2 1 37712ab72d3SAlexander Leidinger #define ENVY24_CHAN_PLAY_DAC3 2 37812ab72d3SAlexander Leidinger #define ENVY24_CHAN_PLAY_DAC4 3 37912ab72d3SAlexander Leidinger #define ENVY24_CHAN_PLAY_SPDIF 4 38012ab72d3SAlexander Leidinger #define ENVY24_CHAN_REC_ADC1 5 38112ab72d3SAlexander Leidinger #define ENVY24_CHAN_REC_ADC2 6 38212ab72d3SAlexander Leidinger #define ENVY24_CHAN_REC_ADC3 7 38312ab72d3SAlexander Leidinger #define ENVY24_CHAN_REC_ADC4 8 38412ab72d3SAlexander Leidinger #define ENVY24_CHAN_REC_SPDIF 9 38512ab72d3SAlexander Leidinger #define ENVY24_CHAN_REC_MIX 10 38612ab72d3SAlexander Leidinger 38712ab72d3SAlexander Leidinger #define ENVY24_MIX_MASK 0x3ff 38812ab72d3SAlexander Leidinger #define ENVY24_MIX_REC_MASK 0x3e0 38912ab72d3SAlexander Leidinger 39012ab72d3SAlexander Leidinger /* volume value constants */ 39112ab72d3SAlexander Leidinger #define ENVY24_VOL_MAX 0 /* 0db(negate) */ 39212ab72d3SAlexander Leidinger #define ENVY24_VOL_MIN 96 /* -144db(negate) */ 39312ab72d3SAlexander Leidinger #define ENVY24_VOL_MUTE 127 /* mute */ 39412ab72d3SAlexander Leidinger 39512ab72d3SAlexander Leidinger /* -------------------------------------------------------------------- */ 39612ab72d3SAlexander Leidinger 39712ab72d3SAlexander Leidinger /* ENVY24 routing control defines */ 39812ab72d3SAlexander Leidinger /* 39912ab72d3SAlexander Leidinger ENVY24 has input->output data routing matrix switch. But original ENVY24 40012ab72d3SAlexander Leidinger matrix control is so complex. So, in this driver, matrix control is 40112ab72d3SAlexander Leidinger defined 4 parameters. 40212ab72d3SAlexander Leidinger 40312ab72d3SAlexander Leidinger 1: output DAC channels (include S/PDIF output) 40412ab72d3SAlexander Leidinger 2: output data classes 40512ab72d3SAlexander Leidinger a. direct output from DMA 40612ab72d3SAlexander Leidinger b. MIXER output which mixed the DMA outputs and input channels 40712ab72d3SAlexander Leidinger (NOTICE: this class is able to set only DAC-1 and S/PDIF output) 40812ab72d3SAlexander Leidinger c. direct input from ADC 40912ab72d3SAlexander Leidinger d. direct input from S/PDIF 41012ab72d3SAlexander Leidinger 3: input ADC channel selection(when 2:c. is selected) 41112ab72d3SAlexander Leidinger 4: left/right reverse 41212ab72d3SAlexander Leidinger 41312ab72d3SAlexander Leidinger These parameters matrix is bit reduced from original ENVY24 matrix 41412ab72d3SAlexander Leidinger pattern(ex. route different ADC input to one DAC). But almost case 41512ab72d3SAlexander Leidinger this is enough to use. 41612ab72d3SAlexander Leidinger */ 41712ab72d3SAlexander Leidinger #define ENVY24_ROUTE_DAC_1 0 41812ab72d3SAlexander Leidinger #define ENVY24_ROUTE_DAC_2 1 41912ab72d3SAlexander Leidinger #define ENVY24_ROUTE_DAC_3 2 42012ab72d3SAlexander Leidinger #define ENVY24_ROUTE_DAC_4 3 42112ab72d3SAlexander Leidinger #define ENVY24_ROUTE_DAC_SPDIF 4 42212ab72d3SAlexander Leidinger 42312ab72d3SAlexander Leidinger #define ENVY24_ROUTE_CLASS_DMA 0 42412ab72d3SAlexander Leidinger #define ENVY24_ROUTE_CLASS_MIX 1 42512ab72d3SAlexander Leidinger #define ENVY24_ROUTE_CLASS_ADC 2 42612ab72d3SAlexander Leidinger #define ENVY24_ROUTE_CLASS_SPDIF 3 42712ab72d3SAlexander Leidinger 42812ab72d3SAlexander Leidinger #define ENVY24_ROUTE_ADC_1 0 42912ab72d3SAlexander Leidinger #define ENVY24_ROUTE_ADC_2 1 43012ab72d3SAlexander Leidinger #define ENVY24_ROUTE_ADC_3 2 43112ab72d3SAlexander Leidinger #define ENVY24_ROUTE_ADC_4 3 43212ab72d3SAlexander Leidinger 43312ab72d3SAlexander Leidinger #define ENVY24_ROUTE_NORMAL 0 43412ab72d3SAlexander Leidinger #define ENVY24_ROUTE_REVERSE 1 43512ab72d3SAlexander Leidinger #define ENVY24_ROUTE_LEFT 0 43612ab72d3SAlexander Leidinger #define ENVY24_ROUTE_RIGHT 1 43712ab72d3SAlexander Leidinger 43812ab72d3SAlexander Leidinger /* -------------------------------------------------------------------- */ 43912ab72d3SAlexander Leidinger 44012ab72d3SAlexander Leidinger /* 44112ab72d3SAlexander Leidinger These map values are refferd from ALSA sound driver. 44212ab72d3SAlexander Leidinger */ 44312ab72d3SAlexander Leidinger /* ENVY24 configuration E2PROM map */ 44412ab72d3SAlexander Leidinger #define ENVY24_E2PROM_SUBVENDOR 0x00 44512ab72d3SAlexander Leidinger #define ENVY24_E2PROM_SUBDEVICE 0x02 44612ab72d3SAlexander Leidinger #define ENVY24_E2PROM_SIZE 0x04 44712ab72d3SAlexander Leidinger #define ENVY24_E2PROM_VERSION 0x05 44812ab72d3SAlexander Leidinger #define ENVY24_E2PROM_SCFG 0x06 44912ab72d3SAlexander Leidinger #define ENVY24_E2PROM_ACL 0x07 45012ab72d3SAlexander Leidinger #define ENVY24_E2PROM_I2S 0x08 45112ab72d3SAlexander Leidinger #define ENVY24_E2PROM_SPDIF 0x09 45212ab72d3SAlexander Leidinger #define ENVY24_E2PROM_GPIOMASK 0x0a 45312ab72d3SAlexander Leidinger #define ENVY24_E2PROM_GPIOSTATE 0x0b 45412ab72d3SAlexander Leidinger #define ENVY24_E2PROM_GPIODIR 0x0c 45512ab72d3SAlexander Leidinger #define ENVY24_E2PROM_AC97MAIN 0x0d 45612ab72d3SAlexander Leidinger #define ENVY24_E2PROM_AC97PCM 0x0f 45712ab72d3SAlexander Leidinger #define ENVY24_E2PROM_AC97REC 0x11 45812ab72d3SAlexander Leidinger #define ENVY24_E2PROM_AC97RECSRC 0x13 45912ab72d3SAlexander Leidinger #define ENVY24_E2PROM_DACID 0x14 46012ab72d3SAlexander Leidinger #define ENVY24_E2PROM_ADCID 0x18 46112ab72d3SAlexander Leidinger #define ENVY24_E2PROM_EXTRA 0x1c 46212ab72d3SAlexander Leidinger 46312ab72d3SAlexander Leidinger /* GPIO connect map of M-Audio Delta series */ 46412ab72d3SAlexander Leidinger #define ENVY24_GPIO_CS84X4_PRO 0x01 46512ab72d3SAlexander Leidinger #define ENVY24_GPIO_CS8414_STATUS 0x02 46612ab72d3SAlexander Leidinger #define ENVY24_GPIO_CS84X4_CLK 0x04 46712ab72d3SAlexander Leidinger #define ENVY24_GPIO_CS84X4_DATA 0x08 46812ab72d3SAlexander Leidinger #define ENVY24_GPIO_AK4524_CDTI 0x10 /* this value is duplicated to input select */ 46912ab72d3SAlexander Leidinger #define ENVY24_GPIO_AK4524_CCLK 0x20 47012ab72d3SAlexander Leidinger #define ENVY24_GPIO_AK4524_CS0 0x40 47112ab72d3SAlexander Leidinger #define ENVY24_GPIO_AK4524_CS1 0x80 47212ab72d3SAlexander Leidinger 47312ab72d3SAlexander Leidinger /* M-Audio Delta series S/PDIF(CS84[01]4) control pin values */ 47412ab72d3SAlexander Leidinger #define ENVY24_CS8404_PRO_RATE 0x18 47512ab72d3SAlexander Leidinger #define ENVY24_CS8404_PRO_RATE32 0x00 47612ab72d3SAlexander Leidinger #define ENVY24_CS8404_PRO_RATE441 0x10 47712ab72d3SAlexander Leidinger #define ENVY24_CS8404_PRO_RATE48 0x08 47812ab72d3SAlexander Leidinger 47912ab72d3SAlexander Leidinger /* M-Audio Delta series parameter */ 48012ab72d3SAlexander Leidinger #define ENVY24_DELTA_AK4524_CIF 0 48112ab72d3SAlexander Leidinger 482ccb43d8dSJoel Dahl #define I2C_DELAY 1000 483ccb43d8dSJoel Dahl 484ccb43d8dSJoel Dahl /* PCA9554 registers */ 485ccb43d8dSJoel Dahl #define PCA9554_I2CDEV 0x40 /* I2C device address */ 486ccb43d8dSJoel Dahl #define PCA9554_IN 0x00 /* input port */ 487ccb43d8dSJoel Dahl #define PCA9554_OUT 0x01 /* output port */ 488ccb43d8dSJoel Dahl #define PCA9554_INVERT 0x02 /* polarity invert */ 489ccb43d8dSJoel Dahl #define PCA9554_DIR 0x03 /* port directions */ 490ccb43d8dSJoel Dahl 491ccb43d8dSJoel Dahl /* PCF8574 registers */ 492ccb43d8dSJoel Dahl #define PCF8574_I2CDEV_DAC 0x48 493ccb43d8dSJoel Dahl #define PCF8574_SENSE_MASK 0x40 494ccb43d8dSJoel Dahl 49512ab72d3SAlexander Leidinger /* end of file */ 496