hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
/* SPDX-License-Identifier: GPL-2.0-or-later */
#ifndef __SOUND_VT1724_H
#define __SOUND_VT1724_H
 
/*
 *   ALSA driver for ICEnsemble VT1724 (Envy24)
 *
 *    Copyright (c) 2000 Jaroslav Kysela <perex@perex.cz>
 */      
 
#include <sound/control.h>
#include <sound/ac97_codec.h>
#include <sound/rawmidi.h>
#include <sound/i2c.h>
#include <sound/pcm.h>
 
#include "ice1712.h"
 
enum {
   ICE_EEP2_SYSCONF = 0,    /* 06 */
   ICE_EEP2_ACLINK,    /* 07 */
   ICE_EEP2_I2S,        /* 08 */
   ICE_EEP2_SPDIF,        /* 09 */
   ICE_EEP2_GPIO_DIR,    /* 0a */
   ICE_EEP2_GPIO_DIR1,    /* 0b */
   ICE_EEP2_GPIO_DIR2,    /* 0c */
   ICE_EEP2_GPIO_MASK,    /* 0d */
   ICE_EEP2_GPIO_MASK1,    /* 0e */
   ICE_EEP2_GPIO_MASK2,    /* 0f */
   ICE_EEP2_GPIO_STATE,    /* 10 */
   ICE_EEP2_GPIO_STATE1,    /* 11 */
   ICE_EEP2_GPIO_STATE2    /* 12 */
};
   
/*
 *  Direct registers
 */
 
#define ICEREG1724(ice, x) ((ice)->port + VT1724_REG_##x)
 
#define VT1724_REG_CONTROL        0x00    /* byte */
#define   VT1724_RESET            0x80    /* reset whole chip */
#define VT1724_REG_IRQMASK        0x01    /* byte */
#define   VT1724_IRQ_MPU_RX        0x80
#define   VT1724_IRQ_MPU_TX        0x20
#define   VT1724_IRQ_MTPCM        0x10
#define VT1724_REG_IRQSTAT        0x02    /* byte */
/* look to VT1724_IRQ_* */
#define VT1724_REG_SYS_CFG        0x04    /* byte - system configuration PCI60 on Envy24*/
#define   VT1724_CFG_CLOCK    0xc0
#define     VT1724_CFG_CLOCK512    0x00    /* 22.5692Mhz, 44.1kHz*512 */
#define     VT1724_CFG_CLOCK384  0x40    /* 16.9344Mhz, 44.1kHz*384 */
#define   VT1724_CFG_MPU401    0x20        /* MPU401 UARTs */
#define   VT1724_CFG_ADC_MASK    0x0c    /* one, two or one and S/PDIF, stereo ADCs */
#define   VT1724_CFG_ADC_NONE    0x0c    /* no ADCs */
#define   VT1724_CFG_DAC_MASK    0x03    /* one, two, three, four stereo DACs */
 
#define VT1724_REG_AC97_CFG        0x05    /* byte */
#define   VT1724_CFG_PRO_I2S    0x80    /* multitrack converter: I2S or AC'97 */
#define   VT1724_CFG_AC97_PACKED    0x01    /* split or packed mode - AC'97 */
 
#define VT1724_REG_I2S_FEATURES        0x06    /* byte */
#define   VT1724_CFG_I2S_VOLUME    0x80    /* volume/mute capability */
#define   VT1724_CFG_I2S_96KHZ    0x40    /* supports 96kHz sampling */
#define   VT1724_CFG_I2S_RESMASK    0x30    /* resolution mask, 16,18,20,24-bit */
#define   VT1724_CFG_I2S_192KHZ    0x08    /* supports 192kHz sampling */
#define   VT1724_CFG_I2S_OTHER    0x07    /* other I2S IDs */
 
#define VT1724_REG_SPDIF_CFG        0x07    /* byte */
#define   VT1724_CFG_SPDIF_OUT_EN    0x80    /*Internal S/PDIF output is enabled*/
#define   VT1724_CFG_SPDIF_OUT_INT    0x40    /*Internal S/PDIF output is implemented*/
#define   VT1724_CFG_I2S_CHIPID    0x3c    /* I2S chip ID */
#define   VT1724_CFG_SPDIF_IN    0x02    /* S/PDIF input is present */
#define   VT1724_CFG_SPDIF_OUT    0x01    /* External S/PDIF output is present */
 
/*there is no consumer AC97 codec with the VT1724*/
//#define VT1724_REG_AC97_INDEX        0x08    /* byte */
//#define VT1724_REG_AC97_CMD        0x09    /* byte */
 
#define VT1724_REG_MPU_TXFIFO        0x0a    /*byte ro. number of bytes in TX fifo*/
#define VT1724_REG_MPU_RXFIFO        0x0b    /*byte ro. number of bytes in RX fifo*/
 
#define VT1724_REG_MPU_DATA        0x0c    /* byte */
#define VT1724_REG_MPU_CTRL        0x0d    /* byte */
#define   VT1724_MPU_UART    0x01
#define   VT1724_MPU_TX_EMPTY    0x02
#define   VT1724_MPU_TX_FULL    0x04
#define   VT1724_MPU_RX_EMPTY    0x08
#define   VT1724_MPU_RX_FULL    0x10
 
#define VT1724_REG_MPU_FIFO_WM    0x0e    /*byte set the high/low watermarks for RX/TX fifos*/
#define   VT1724_MPU_RX_FIFO    0x20    //1=rx fifo watermark 0=tx fifo watermark
#define   VT1724_MPU_FIFO_MASK    0x1f    
 
#define VT1724_REG_I2C_DEV_ADDR    0x10    /* byte */
#define   VT1724_I2C_WRITE        0x01    /* write direction */
#define VT1724_REG_I2C_BYTE_ADDR    0x11    /* byte */
#define VT1724_REG_I2C_DATA        0x12    /* byte */
#define VT1724_REG_I2C_CTRL        0x13    /* byte */
#define   VT1724_I2C_EEPROM        0x80    /* 1 = EEPROM exists */
#define   VT1724_I2C_BUSY        0x01    /* busy bit */
 
#define VT1724_REG_GPIO_DATA    0x14    /* word */
#define VT1724_REG_GPIO_WRITE_MASK    0x16 /* word */
#define VT1724_REG_GPIO_DIRECTION    0x18 /* dword? (3 bytes) 0=input 1=output. 
                       bit3 - during reset used for Eeprom power-on strapping
                       if TESTEN# pin active, bit 2 always input*/
#define VT1724_REG_POWERDOWN    0x1c
#define VT1724_REG_GPIO_DATA_22    0x1e /* byte direction for GPIO 16:22 */
#define VT1724_REG_GPIO_WRITE_MASK_22    0x1f /* byte write mask for GPIO 16:22 */
 
 
/* 
 *  Professional multi-track direct control registers
 */
 
#define ICEMT1724(ice, x) ((ice)->profi_port + VT1724_MT_##x)
 
#define VT1724_MT_IRQ            0x00    /* byte - interrupt mask */
#define   VT1724_MULTI_PDMA4    0x80    /* SPDIF Out / PDMA4 */
#define      VT1724_MULTI_PDMA3    0x40    /* PDMA3 */
#define   VT1724_MULTI_PDMA2    0x20    /* PDMA2 */
#define   VT1724_MULTI_PDMA1    0x10    /* PDMA1 */
#define   VT1724_MULTI_FIFO_ERR 0x08    /* DMA FIFO underrun/overrun. */
#define   VT1724_MULTI_RDMA1    0x04    /* RDMA1 (S/PDIF input) */
#define   VT1724_MULTI_RDMA0    0x02    /* RMDA0 */
#define   VT1724_MULTI_PDMA0    0x01    /* MC Interleave/PDMA0 */
 
#define VT1724_MT_RATE            0x01    /* byte - sampling rate select */
#define   VT1724_SPDIF_MASTER        0x10    /* S/PDIF input is master clock */
#define VT1724_MT_I2S_FORMAT        0x02    /* byte - I2S data format */
#define   VT1724_MT_I2S_MCLK_128X    0x08
#define   VT1724_MT_I2S_FORMAT_MASK    0x03
#define   VT1724_MT_I2S_FORMAT_I2S    0x00
#define VT1724_MT_DMA_INT_MASK        0x03    /* byte -DMA Interrupt Mask */
/* lool to VT1724_MULTI_* */
#define VT1724_MT_AC97_INDEX        0x04    /* byte - AC'97 index */
#define VT1724_MT_AC97_CMD        0x05    /* byte - AC'97 command & status */
#define   VT1724_AC97_COLD    0x80    /* cold reset */
#define   VT1724_AC97_WARM    0x40    /* warm reset */
#define   VT1724_AC97_WRITE    0x20    /* W: write, R: write in progress */
#define   VT1724_AC97_READ    0x10    /* W: read, R: read in progress */
#define   VT1724_AC97_READY    0x08    /* codec ready status bit */
#define   VT1724_AC97_ID_MASK    0x03    /* codec id mask */
#define VT1724_MT_AC97_DATA        0x06    /* word - AC'97 data */
#define VT1724_MT_PLAYBACK_ADDR        0x10    /* dword - playback address */
#define VT1724_MT_PLAYBACK_SIZE        0x14    /* dword - playback size */
#define VT1724_MT_DMA_CONTROL        0x18    /* byte - control */
#define   VT1724_PDMA4_START    0x80    /* SPDIF out / PDMA4 start */
#define   VT1724_PDMA3_START    0x40    /* PDMA3 start */
#define   VT1724_PDMA2_START    0x20    /* PDMA2 start */
#define   VT1724_PDMA1_START    0x10    /* PDMA1 start */
#define   VT1724_RDMA1_START    0x04    /* RDMA1 start */
#define   VT1724_RDMA0_START    0x02    /* RMDA0 start */
#define   VT1724_PDMA0_START    0x01    /* MC Interleave / PDMA0 start */
#define VT1724_MT_BURST            0x19    /* Interleaved playback DMA Active streams / PCI burst size */
#define VT1724_MT_DMA_FIFO_ERR        0x1a    /*Global playback and record DMA FIFO Underrun/Overrun */
#define   VT1724_PDMA4_UNDERRUN        0x80
#define   VT1724_PDMA2_UNDERRUN        0x40
#define   VT1724_PDMA3_UNDERRUN        0x20
#define   VT1724_PDMA1_UNDERRUN        0x10
#define   VT1724_RDMA1_UNDERRUN        0x04
#define   VT1724_RDMA0_UNDERRUN        0x02
#define   VT1724_PDMA0_UNDERRUN        0x01
#define VT1724_MT_DMA_PAUSE        0x1b    /*Global playback and record DMA FIFO pause/resume */
#define      VT1724_PDMA4_PAUSE    0x80
#define      VT1724_PDMA3_PAUSE    0x40
#define      VT1724_PDMA2_PAUSE    0x20
#define      VT1724_PDMA1_PAUSE    0x10
#define      VT1724_RDMA1_PAUSE    0x04
#define      VT1724_RDMA0_PAUSE    0x02
#define      VT1724_PDMA0_PAUSE    0x01
#define VT1724_MT_PLAYBACK_COUNT    0x1c    /* word - playback count */
#define VT1724_MT_CAPTURE_ADDR        0x20    /* dword - capture address */
#define VT1724_MT_CAPTURE_SIZE        0x24    /* word - capture size */
#define VT1724_MT_CAPTURE_COUNT        0x26    /* word - capture count */
 
#define VT1724_MT_ROUTE_PLAYBACK    0x2c    /* word */
 
#define VT1724_MT_RDMA1_ADDR        0x30    /* dword - RDMA1 capture address */
#define VT1724_MT_RDMA1_SIZE        0x34    /* word - RDMA1 capture size */
#define VT1724_MT_RDMA1_COUNT        0x36    /* word - RDMA1 capture count */
 
#define VT1724_MT_SPDIF_CTRL        0x3c    /* word */
#define VT1724_MT_MONITOR_PEAKINDEX    0x3e    /* byte */
#define VT1724_MT_MONITOR_PEAKDATA    0x3f    /* byte */
 
/* concurrent stereo channels */
#define VT1724_MT_PDMA4_ADDR        0x40    /* dword */
#define VT1724_MT_PDMA4_SIZE        0x44    /* word */
#define VT1724_MT_PDMA4_COUNT        0x46    /* word */
#define VT1724_MT_PDMA3_ADDR        0x50    /* dword */
#define VT1724_MT_PDMA3_SIZE        0x54    /* word */
#define VT1724_MT_PDMA3_COUNT        0x56    /* word */
#define VT1724_MT_PDMA2_ADDR        0x60    /* dword */
#define VT1724_MT_PDMA2_SIZE        0x64    /* word */
#define VT1724_MT_PDMA2_COUNT        0x66    /* word */
#define VT1724_MT_PDMA1_ADDR        0x70    /* dword */
#define VT1724_MT_PDMA1_SIZE        0x74    /* word */
#define VT1724_MT_PDMA1_COUNT        0x76    /* word */
 
 
unsigned char snd_vt1724_read_i2c(struct snd_ice1712 *ice, unsigned char dev, unsigned char addr);
void snd_vt1724_write_i2c(struct snd_ice1712 *ice, unsigned char dev, unsigned char addr, unsigned char data);
 
#endif /* __SOUND_VT1724_H */