6b13f685e
김민수
BSP 최초 추가
|
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
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
|
#ifndef __SOUND_MIXART_H
#define __SOUND_MIXART_H
#include <linux/interrupt.h>
#include <linux/mutex.h>
#include <sound/pcm.h>
#define MIXART_DRIVER_VERSION 0x000100 /* 0.1.0 */
struct mixart_uid {
u32 object_id;
u32 desc;
};
struct mem_area {
unsigned long phys;
void __iomem *virt;
struct resource *res;
};
struct mixart_route {
unsigned char connected;
unsigned char phase_inv;
int volume;
};
#define MIXART_MOTHERBOARD_XLX_INDEX 0
#define MIXART_MOTHERBOARD_ELF_INDEX 1
#define MIXART_AESEBUBOARD_XLX_INDEX 2
#define MIXART_HARDW_FILES_MAX_INDEX 3 /* xilinx, elf, AESEBU xilinx */
#define MIXART_MAX_CARDS 4
#define MSG_FIFO_SIZE 16
#define MIXART_MAX_PHYS_CONNECTORS (MIXART_MAX_CARDS * 2 * 2) /* 4 * stereo * (analog+digital) */
struct mixart_mgr {
unsigned int num_cards;
struct snd_mixart *chip[MIXART_MAX_CARDS];
struct pci_dev *pci;
int irq;
struct mem_area mem[2];
char shortname[32];
char longname[80];
struct tasklet_struct msg_taskq;
u32 pending_event;
wait_queue_head_t msg_sleep;
u32 msg_fifo[MSG_FIFO_SIZE];
int msg_fifo_readptr;
int msg_fifo_writeptr;
atomic_t msg_processed;
spinlock_t lock;
spinlock_t msg_lock;
struct mutex msg_mutex;
struct mutex setup_mutex;
unsigned int dsp_loaded;
unsigned int board_type;
struct snd_dma_buffer flowinfo;
struct snd_dma_buffer bufferinfo;
struct mixart_uid uid_console_manager;
int sample_rate;
int ref_count_rate;
struct mutex mixer_mutex;
};
#define MIXART_STREAM_STATUS_FREE 0
#define MIXART_STREAM_STATUS_OPEN 1
#define MIXART_STREAM_STATUS_RUNNING 2
#define MIXART_STREAM_STATUS_DRAINING 3
#define MIXART_STREAM_STATUS_PAUSE 4
#define MIXART_PLAYBACK_STREAMS 4
#define MIXART_CAPTURE_STREAMS 1
#define MIXART_PCM_ANALOG 0
#define MIXART_PCM_DIGITAL 1
#define MIXART_PCM_TOTAL 2
#define MIXART_MAX_STREAM_PER_CARD (MIXART_PCM_TOTAL * (MIXART_PLAYBACK_STREAMS + MIXART_CAPTURE_STREAMS) )
#define MIXART_NOTIFY_CARD_MASK 0xF000
#define MIXART_NOTIFY_CARD_OFFSET 12
#define MIXART_NOTIFY_PCM_MASK 0x0F00
#define MIXART_NOTIFY_PCM_OFFSET 8
#define MIXART_NOTIFY_CAPT_MASK 0x0080
#define MIXART_NOTIFY_SUBS_MASK 0x007F
struct mixart_stream {
struct snd_pcm_substream *substream;
struct mixart_pipe *pipe;
int pcm_number;
int status;
u64 abs_period_elapsed;
u32 buf_periods;
u32 buf_period_frag;
int channels;
};
enum mixart_pipe_status {
PIPE_UNDEFINED,
PIPE_STOPPED,
PIPE_RUNNING,
PIPE_CLOCK_SET
};
struct mixart_pipe {
struct mixart_uid group_uid;
int stream_count;
struct mixart_uid uid_left_connector;
struct mixart_uid uid_right_connector;
enum mixart_pipe_status status;
int references;
int monitoring;
};
struct snd_mixart {
struct snd_card *card;
struct mixart_mgr *mgr;
int chip_idx;
struct snd_hwdep *hwdep;
struct snd_pcm *pcm;
struct snd_pcm *pcm_dig;
struct mixart_pipe pipe_in_ana;
struct mixart_pipe pipe_out_ana;
struct mixart_pipe pipe_in_dig;
struct mixart_pipe pipe_out_dig;
struct mixart_stream playback_stream[MIXART_PCM_TOTAL][MIXART_PLAYBACK_STREAMS];
struct mixart_stream capture_stream[MIXART_PCM_TOTAL];
struct mixart_uid uid_out_analog_physio;
struct mixart_uid uid_in_analog_physio;
int analog_playback_active[2];
int analog_playback_volume[2];
int analog_capture_volume[2];
int digital_playback_active[2*MIXART_PLAYBACK_STREAMS][2];
int digital_playback_volume[2*MIXART_PLAYBACK_STREAMS][2];
int digital_capture_volume[2][2];
int monitoring_active[2];
int monitoring_volume[2];
};
struct mixart_bufferinfo
{
u32 buffer_address;
u32 reserved[5];
u32 available_length;
u32 buffer_id;
};
struct mixart_flowinfo
{
u32 bufferinfo_array_phy_address;
u32 reserved[11];
u32 bufferinfo_count;
u32 capture;
};
int snd_mixart_create_pcm(struct snd_mixart * chip);
struct mixart_pipe *snd_mixart_add_ref_pipe(struct snd_mixart *chip, int pcm_number, int capture, int monitoring);
int snd_mixart_kill_ref_pipe(struct mixart_mgr *mgr, struct mixart_pipe *pipe, int monitoring);
#endif /* __SOUND_MIXART_H */
|