GNU Linux-libre 4.9.337-gnu1
[releases.git] / sound / core / pcm.c
1 /*
2  *  Digital Audio (PCM) abstract layer
3  *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
4  *
5  *
6  *   This program is free software; you can redistribute it and/or modify
7  *   it under the terms of the GNU General Public License as published by
8  *   the Free Software Foundation; either version 2 of the License, or
9  *   (at your option) any later version.
10  *
11  *   This program is distributed in the hope that it will be useful,
12  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  *   GNU General Public License for more details.
15  *
16  *   You should have received a copy of the GNU General Public License
17  *   along with this program; if not, write to the Free Software
18  *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
19  *
20  */
21
22 #include <linux/init.h>
23 #include <linux/slab.h>
24 #include <linux/module.h>
25 #include <linux/time.h>
26 #include <linux/mutex.h>
27 #include <linux/device.h>
28 #include <linux/nospec.h>
29 #include <sound/core.h>
30 #include <sound/minors.h>
31 #include <sound/pcm.h>
32 #include <sound/timer.h>
33 #include <sound/control.h>
34 #include <sound/info.h>
35
36 MODULE_AUTHOR("Jaroslav Kysela <perex@perex.cz>, Abramo Bagnara <abramo@alsa-project.org>");
37 MODULE_DESCRIPTION("Midlevel PCM code for ALSA.");
38 MODULE_LICENSE("GPL");
39
40 static LIST_HEAD(snd_pcm_devices);
41 static LIST_HEAD(snd_pcm_notify_list);
42 static DEFINE_MUTEX(register_mutex);
43
44 static int snd_pcm_free(struct snd_pcm *pcm);
45 static int snd_pcm_dev_free(struct snd_device *device);
46 static int snd_pcm_dev_register(struct snd_device *device);
47 static int snd_pcm_dev_disconnect(struct snd_device *device);
48
49 static struct snd_pcm *snd_pcm_get(struct snd_card *card, int device)
50 {
51         struct snd_pcm *pcm;
52
53         list_for_each_entry(pcm, &snd_pcm_devices, list) {
54                 if (pcm->card == card && pcm->device == device)
55                         return pcm;
56         }
57         return NULL;
58 }
59
60 static int snd_pcm_next(struct snd_card *card, int device)
61 {
62         struct snd_pcm *pcm;
63
64         list_for_each_entry(pcm, &snd_pcm_devices, list) {
65                 if (pcm->card == card && pcm->device > device)
66                         return pcm->device;
67                 else if (pcm->card->number > card->number)
68                         return -1;
69         }
70         return -1;
71 }
72
73 static int snd_pcm_add(struct snd_pcm *newpcm)
74 {
75         struct snd_pcm *pcm;
76
77         if (newpcm->internal)
78                 return 0;
79
80         list_for_each_entry(pcm, &snd_pcm_devices, list) {
81                 if (pcm->card == newpcm->card && pcm->device == newpcm->device)
82                         return -EBUSY;
83                 if (pcm->card->number > newpcm->card->number ||
84                                 (pcm->card == newpcm->card &&
85                                 pcm->device > newpcm->device)) {
86                         list_add(&newpcm->list, pcm->list.prev);
87                         return 0;
88                 }
89         }
90         list_add_tail(&newpcm->list, &snd_pcm_devices);
91         return 0;
92 }
93
94 static int snd_pcm_control_ioctl(struct snd_card *card,
95                                  struct snd_ctl_file *control,
96                                  unsigned int cmd, unsigned long arg)
97 {
98         switch (cmd) {
99         case SNDRV_CTL_IOCTL_PCM_NEXT_DEVICE:
100                 {
101                         int device;
102
103                         if (get_user(device, (int __user *)arg))
104                                 return -EFAULT;
105                         mutex_lock(&register_mutex);
106                         device = snd_pcm_next(card, device);
107                         mutex_unlock(&register_mutex);
108                         if (put_user(device, (int __user *)arg))
109                                 return -EFAULT;
110                         return 0;
111                 }
112         case SNDRV_CTL_IOCTL_PCM_INFO:
113                 {
114                         struct snd_pcm_info __user *info;
115                         unsigned int device, subdevice;
116                         int stream;
117                         struct snd_pcm *pcm;
118                         struct snd_pcm_str *pstr;
119                         struct snd_pcm_substream *substream;
120                         int err;
121
122                         info = (struct snd_pcm_info __user *)arg;
123                         if (get_user(device, &info->device))
124                                 return -EFAULT;
125                         if (get_user(stream, &info->stream))
126                                 return -EFAULT;
127                         if (stream < 0 || stream > 1)
128                                 return -EINVAL;
129                         stream = array_index_nospec(stream, 2);
130                         if (get_user(subdevice, &info->subdevice))
131                                 return -EFAULT;
132                         mutex_lock(&register_mutex);
133                         pcm = snd_pcm_get(card, device);
134                         if (pcm == NULL) {
135                                 err = -ENXIO;
136                                 goto _error;
137                         }
138                         pstr = &pcm->streams[stream];
139                         if (pstr->substream_count == 0) {
140                                 err = -ENOENT;
141                                 goto _error;
142                         }
143                         if (subdevice >= pstr->substream_count) {
144                                 err = -ENXIO;
145                                 goto _error;
146                         }
147                         for (substream = pstr->substream; substream;
148                              substream = substream->next)
149                                 if (substream->number == (int)subdevice)
150                                         break;
151                         if (substream == NULL) {
152                                 err = -ENXIO;
153                                 goto _error;
154                         }
155                         mutex_lock(&pcm->open_mutex);
156                         err = snd_pcm_info_user(substream, info);
157                         mutex_unlock(&pcm->open_mutex);
158                 _error:
159                         mutex_unlock(&register_mutex);
160                         return err;
161                 }
162         case SNDRV_CTL_IOCTL_PCM_PREFER_SUBDEVICE:
163                 {
164                         int val;
165                         
166                         if (get_user(val, (int __user *)arg))
167                                 return -EFAULT;
168                         control->preferred_subdevice[SND_CTL_SUBDEV_PCM] = val;
169                         return 0;
170                 }
171         }
172         return -ENOIOCTLCMD;
173 }
174
175 #define FORMAT(v) [SNDRV_PCM_FORMAT_##v] = #v
176
177 static char *snd_pcm_format_names[] = {
178         FORMAT(S8),
179         FORMAT(U8),
180         FORMAT(S16_LE),
181         FORMAT(S16_BE),
182         FORMAT(U16_LE),
183         FORMAT(U16_BE),
184         FORMAT(S24_LE),
185         FORMAT(S24_BE),
186         FORMAT(U24_LE),
187         FORMAT(U24_BE),
188         FORMAT(S32_LE),
189         FORMAT(S32_BE),
190         FORMAT(U32_LE),
191         FORMAT(U32_BE),
192         FORMAT(FLOAT_LE),
193         FORMAT(FLOAT_BE),
194         FORMAT(FLOAT64_LE),
195         FORMAT(FLOAT64_BE),
196         FORMAT(IEC958_SUBFRAME_LE),
197         FORMAT(IEC958_SUBFRAME_BE),
198         FORMAT(MU_LAW),
199         FORMAT(A_LAW),
200         FORMAT(IMA_ADPCM),
201         FORMAT(MPEG),
202         FORMAT(GSM),
203         FORMAT(SPECIAL),
204         FORMAT(S24_3LE),
205         FORMAT(S24_3BE),
206         FORMAT(U24_3LE),
207         FORMAT(U24_3BE),
208         FORMAT(S20_3LE),
209         FORMAT(S20_3BE),
210         FORMAT(U20_3LE),
211         FORMAT(U20_3BE),
212         FORMAT(S18_3LE),
213         FORMAT(S18_3BE),
214         FORMAT(U18_3LE),
215         FORMAT(U18_3BE),
216         FORMAT(G723_24),
217         FORMAT(G723_24_1B),
218         FORMAT(G723_40),
219         FORMAT(G723_40_1B),
220         FORMAT(DSD_U8),
221         FORMAT(DSD_U16_LE),
222         FORMAT(DSD_U32_LE),
223         FORMAT(DSD_U16_BE),
224         FORMAT(DSD_U32_BE),
225 };
226
227 /**
228  * snd_pcm_format_name - Return a name string for the given PCM format
229  * @format: PCM format
230  */
231 const char *snd_pcm_format_name(snd_pcm_format_t format)
232 {
233         if ((__force unsigned int)format >= ARRAY_SIZE(snd_pcm_format_names))
234                 return "Unknown";
235         return snd_pcm_format_names[(__force unsigned int)format];
236 }
237 EXPORT_SYMBOL_GPL(snd_pcm_format_name);
238
239 #ifdef CONFIG_SND_VERBOSE_PROCFS
240
241 #define STATE(v) [SNDRV_PCM_STATE_##v] = #v
242 #define STREAM(v) [SNDRV_PCM_STREAM_##v] = #v
243 #define READY(v) [SNDRV_PCM_READY_##v] = #v
244 #define XRUN(v) [SNDRV_PCM_XRUN_##v] = #v
245 #define SILENCE(v) [SNDRV_PCM_SILENCE_##v] = #v
246 #define TSTAMP(v) [SNDRV_PCM_TSTAMP_##v] = #v
247 #define ACCESS(v) [SNDRV_PCM_ACCESS_##v] = #v
248 #define START(v) [SNDRV_PCM_START_##v] = #v
249 #define SUBFORMAT(v) [SNDRV_PCM_SUBFORMAT_##v] = #v 
250
251 static char *snd_pcm_stream_names[] = {
252         STREAM(PLAYBACK),
253         STREAM(CAPTURE),
254 };
255
256 static char *snd_pcm_state_names[] = {
257         STATE(OPEN),
258         STATE(SETUP),
259         STATE(PREPARED),
260         STATE(RUNNING),
261         STATE(XRUN),
262         STATE(DRAINING),
263         STATE(PAUSED),
264         STATE(SUSPENDED),
265 };
266
267 static char *snd_pcm_access_names[] = {
268         ACCESS(MMAP_INTERLEAVED), 
269         ACCESS(MMAP_NONINTERLEAVED),
270         ACCESS(MMAP_COMPLEX),
271         ACCESS(RW_INTERLEAVED),
272         ACCESS(RW_NONINTERLEAVED),
273 };
274
275 static char *snd_pcm_subformat_names[] = {
276         SUBFORMAT(STD), 
277 };
278
279 static char *snd_pcm_tstamp_mode_names[] = {
280         TSTAMP(NONE),
281         TSTAMP(ENABLE),
282 };
283
284 static const char *snd_pcm_stream_name(int stream)
285 {
286         return snd_pcm_stream_names[stream];
287 }
288
289 static const char *snd_pcm_access_name(snd_pcm_access_t access)
290 {
291         return snd_pcm_access_names[(__force int)access];
292 }
293
294 static const char *snd_pcm_subformat_name(snd_pcm_subformat_t subformat)
295 {
296         return snd_pcm_subformat_names[(__force int)subformat];
297 }
298
299 static const char *snd_pcm_tstamp_mode_name(int mode)
300 {
301         return snd_pcm_tstamp_mode_names[mode];
302 }
303
304 static const char *snd_pcm_state_name(snd_pcm_state_t state)
305 {
306         return snd_pcm_state_names[(__force int)state];
307 }
308
309 #if IS_ENABLED(CONFIG_SND_PCM_OSS)
310 #include <linux/soundcard.h>
311
312 static const char *snd_pcm_oss_format_name(int format)
313 {
314         switch (format) {
315         case AFMT_MU_LAW:
316                 return "MU_LAW";
317         case AFMT_A_LAW:
318                 return "A_LAW";
319         case AFMT_IMA_ADPCM:
320                 return "IMA_ADPCM";
321         case AFMT_U8:
322                 return "U8";
323         case AFMT_S16_LE:
324                 return "S16_LE";
325         case AFMT_S16_BE:
326                 return "S16_BE";
327         case AFMT_S8:
328                 return "S8";
329         case AFMT_U16_LE:
330                 return "U16_LE";
331         case AFMT_U16_BE:
332                 return "U16_BE";
333         case AFMT_MPEG:
334                 return "MPEG";
335         default:
336                 return "unknown";
337         }
338 }
339 #endif
340
341 static void snd_pcm_proc_info_read(struct snd_pcm_substream *substream,
342                                    struct snd_info_buffer *buffer)
343 {
344         struct snd_pcm_info *info;
345         int err;
346
347         if (! substream)
348                 return;
349
350         info = kmalloc(sizeof(*info), GFP_KERNEL);
351         if (!info)
352                 return;
353
354         err = snd_pcm_info(substream, info);
355         if (err < 0) {
356                 snd_iprintf(buffer, "error %d\n", err);
357                 kfree(info);
358                 return;
359         }
360         snd_iprintf(buffer, "card: %d\n", info->card);
361         snd_iprintf(buffer, "device: %d\n", info->device);
362         snd_iprintf(buffer, "subdevice: %d\n", info->subdevice);
363         snd_iprintf(buffer, "stream: %s\n", snd_pcm_stream_name(info->stream));
364         snd_iprintf(buffer, "id: %s\n", info->id);
365         snd_iprintf(buffer, "name: %s\n", info->name);
366         snd_iprintf(buffer, "subname: %s\n", info->subname);
367         snd_iprintf(buffer, "class: %d\n", info->dev_class);
368         snd_iprintf(buffer, "subclass: %d\n", info->dev_subclass);
369         snd_iprintf(buffer, "subdevices_count: %d\n", info->subdevices_count);
370         snd_iprintf(buffer, "subdevices_avail: %d\n", info->subdevices_avail);
371         kfree(info);
372 }
373
374 static void snd_pcm_stream_proc_info_read(struct snd_info_entry *entry,
375                                           struct snd_info_buffer *buffer)
376 {
377         snd_pcm_proc_info_read(((struct snd_pcm_str *)entry->private_data)->substream,
378                                buffer);
379 }
380
381 static void snd_pcm_substream_proc_info_read(struct snd_info_entry *entry,
382                                              struct snd_info_buffer *buffer)
383 {
384         snd_pcm_proc_info_read(entry->private_data, buffer);
385 }
386
387 static void snd_pcm_substream_proc_hw_params_read(struct snd_info_entry *entry,
388                                                   struct snd_info_buffer *buffer)
389 {
390         struct snd_pcm_substream *substream = entry->private_data;
391         struct snd_pcm_runtime *runtime;
392
393         mutex_lock(&substream->pcm->open_mutex);
394         runtime = substream->runtime;
395         if (!runtime) {
396                 snd_iprintf(buffer, "closed\n");
397                 goto unlock;
398         }
399         if (runtime->status->state == SNDRV_PCM_STATE_OPEN) {
400                 snd_iprintf(buffer, "no setup\n");
401                 goto unlock;
402         }
403         snd_iprintf(buffer, "access: %s\n", snd_pcm_access_name(runtime->access));
404         snd_iprintf(buffer, "format: %s\n", snd_pcm_format_name(runtime->format));
405         snd_iprintf(buffer, "subformat: %s\n", snd_pcm_subformat_name(runtime->subformat));
406         snd_iprintf(buffer, "channels: %u\n", runtime->channels);       
407         snd_iprintf(buffer, "rate: %u (%u/%u)\n", runtime->rate, runtime->rate_num, runtime->rate_den); 
408         snd_iprintf(buffer, "period_size: %lu\n", runtime->period_size);        
409         snd_iprintf(buffer, "buffer_size: %lu\n", runtime->buffer_size);        
410 #if IS_ENABLED(CONFIG_SND_PCM_OSS)
411         if (substream->oss.oss) {
412                 snd_iprintf(buffer, "OSS format: %s\n", snd_pcm_oss_format_name(runtime->oss.format));
413                 snd_iprintf(buffer, "OSS channels: %u\n", runtime->oss.channels);       
414                 snd_iprintf(buffer, "OSS rate: %u\n", runtime->oss.rate);
415                 snd_iprintf(buffer, "OSS period bytes: %lu\n", (unsigned long)runtime->oss.period_bytes);
416                 snd_iprintf(buffer, "OSS periods: %u\n", runtime->oss.periods);
417                 snd_iprintf(buffer, "OSS period frames: %lu\n", (unsigned long)runtime->oss.period_frames);
418         }
419 #endif
420  unlock:
421         mutex_unlock(&substream->pcm->open_mutex);
422 }
423
424 static void snd_pcm_substream_proc_sw_params_read(struct snd_info_entry *entry,
425                                                   struct snd_info_buffer *buffer)
426 {
427         struct snd_pcm_substream *substream = entry->private_data;
428         struct snd_pcm_runtime *runtime;
429
430         mutex_lock(&substream->pcm->open_mutex);
431         runtime = substream->runtime;
432         if (!runtime) {
433                 snd_iprintf(buffer, "closed\n");
434                 goto unlock;
435         }
436         if (runtime->status->state == SNDRV_PCM_STATE_OPEN) {
437                 snd_iprintf(buffer, "no setup\n");
438                 goto unlock;
439         }
440         snd_iprintf(buffer, "tstamp_mode: %s\n", snd_pcm_tstamp_mode_name(runtime->tstamp_mode));
441         snd_iprintf(buffer, "period_step: %u\n", runtime->period_step);
442         snd_iprintf(buffer, "avail_min: %lu\n", runtime->control->avail_min);
443         snd_iprintf(buffer, "start_threshold: %lu\n", runtime->start_threshold);
444         snd_iprintf(buffer, "stop_threshold: %lu\n", runtime->stop_threshold);
445         snd_iprintf(buffer, "silence_threshold: %lu\n", runtime->silence_threshold);
446         snd_iprintf(buffer, "silence_size: %lu\n", runtime->silence_size);
447         snd_iprintf(buffer, "boundary: %lu\n", runtime->boundary);
448  unlock:
449         mutex_unlock(&substream->pcm->open_mutex);
450 }
451
452 static void snd_pcm_substream_proc_status_read(struct snd_info_entry *entry,
453                                                struct snd_info_buffer *buffer)
454 {
455         struct snd_pcm_substream *substream = entry->private_data;
456         struct snd_pcm_runtime *runtime;
457         struct snd_pcm_status status;
458         int err;
459
460         mutex_lock(&substream->pcm->open_mutex);
461         runtime = substream->runtime;
462         if (!runtime) {
463                 snd_iprintf(buffer, "closed\n");
464                 goto unlock;
465         }
466         memset(&status, 0, sizeof(status));
467         err = snd_pcm_status(substream, &status);
468         if (err < 0) {
469                 snd_iprintf(buffer, "error %d\n", err);
470                 goto unlock;
471         }
472         snd_iprintf(buffer, "state: %s\n", snd_pcm_state_name(status.state));
473         snd_iprintf(buffer, "owner_pid   : %d\n", pid_vnr(substream->pid));
474         snd_iprintf(buffer, "trigger_time: %ld.%09ld\n",
475                 status.trigger_tstamp.tv_sec, status.trigger_tstamp.tv_nsec);
476         snd_iprintf(buffer, "tstamp      : %ld.%09ld\n",
477                 status.tstamp.tv_sec, status.tstamp.tv_nsec);
478         snd_iprintf(buffer, "delay       : %ld\n", status.delay);
479         snd_iprintf(buffer, "avail       : %ld\n", status.avail);
480         snd_iprintf(buffer, "avail_max   : %ld\n", status.avail_max);
481         snd_iprintf(buffer, "-----\n");
482         snd_iprintf(buffer, "hw_ptr      : %ld\n", runtime->status->hw_ptr);
483         snd_iprintf(buffer, "appl_ptr    : %ld\n", runtime->control->appl_ptr);
484  unlock:
485         mutex_unlock(&substream->pcm->open_mutex);
486 }
487
488 #ifdef CONFIG_SND_PCM_XRUN_DEBUG
489 static void snd_pcm_xrun_injection_write(struct snd_info_entry *entry,
490                                          struct snd_info_buffer *buffer)
491 {
492         struct snd_pcm_substream *substream = entry->private_data;
493         struct snd_pcm_runtime *runtime;
494
495         snd_pcm_stream_lock_irq(substream);
496         runtime = substream->runtime;
497         if (runtime && runtime->status->state == SNDRV_PCM_STATE_RUNNING)
498                 snd_pcm_stop(substream, SNDRV_PCM_STATE_XRUN);
499         snd_pcm_stream_unlock_irq(substream);
500 }
501
502 static void snd_pcm_xrun_debug_read(struct snd_info_entry *entry,
503                                     struct snd_info_buffer *buffer)
504 {
505         struct snd_pcm_str *pstr = entry->private_data;
506         snd_iprintf(buffer, "%d\n", pstr->xrun_debug);
507 }
508
509 static void snd_pcm_xrun_debug_write(struct snd_info_entry *entry,
510                                      struct snd_info_buffer *buffer)
511 {
512         struct snd_pcm_str *pstr = entry->private_data;
513         char line[64];
514         if (!snd_info_get_line(buffer, line, sizeof(line)))
515                 pstr->xrun_debug = simple_strtoul(line, NULL, 10);
516 }
517 #endif
518
519 static int snd_pcm_stream_proc_init(struct snd_pcm_str *pstr)
520 {
521         struct snd_pcm *pcm = pstr->pcm;
522         struct snd_info_entry *entry;
523         char name[16];
524
525         sprintf(name, "pcm%i%c", pcm->device, 
526                 pstr->stream == SNDRV_PCM_STREAM_PLAYBACK ? 'p' : 'c');
527         if ((entry = snd_info_create_card_entry(pcm->card, name, pcm->card->proc_root)) == NULL)
528                 return -ENOMEM;
529         entry->mode = S_IFDIR | S_IRUGO | S_IXUGO;
530         if (snd_info_register(entry) < 0) {
531                 snd_info_free_entry(entry);
532                 return -ENOMEM;
533         }
534         pstr->proc_root = entry;
535
536         if ((entry = snd_info_create_card_entry(pcm->card, "info", pstr->proc_root)) != NULL) {
537                 snd_info_set_text_ops(entry, pstr, snd_pcm_stream_proc_info_read);
538                 if (snd_info_register(entry) < 0) {
539                         snd_info_free_entry(entry);
540                         entry = NULL;
541                 }
542         }
543         pstr->proc_info_entry = entry;
544
545 #ifdef CONFIG_SND_PCM_XRUN_DEBUG
546         if ((entry = snd_info_create_card_entry(pcm->card, "xrun_debug",
547                                                 pstr->proc_root)) != NULL) {
548                 entry->c.text.read = snd_pcm_xrun_debug_read;
549                 entry->c.text.write = snd_pcm_xrun_debug_write;
550                 entry->mode |= S_IWUSR;
551                 entry->private_data = pstr;
552                 if (snd_info_register(entry) < 0) {
553                         snd_info_free_entry(entry);
554                         entry = NULL;
555                 }
556         }
557         pstr->proc_xrun_debug_entry = entry;
558 #endif
559         return 0;
560 }
561
562 static int snd_pcm_stream_proc_done(struct snd_pcm_str *pstr)
563 {
564 #ifdef CONFIG_SND_PCM_XRUN_DEBUG
565         snd_info_free_entry(pstr->proc_xrun_debug_entry);
566         pstr->proc_xrun_debug_entry = NULL;
567 #endif
568         snd_info_free_entry(pstr->proc_info_entry);
569         pstr->proc_info_entry = NULL;
570         snd_info_free_entry(pstr->proc_root);
571         pstr->proc_root = NULL;
572         return 0;
573 }
574
575 static int snd_pcm_substream_proc_init(struct snd_pcm_substream *substream)
576 {
577         struct snd_info_entry *entry;
578         struct snd_card *card;
579         char name[16];
580
581         card = substream->pcm->card;
582
583         sprintf(name, "sub%i", substream->number);
584         if ((entry = snd_info_create_card_entry(card, name, substream->pstr->proc_root)) == NULL)
585                 return -ENOMEM;
586         entry->mode = S_IFDIR | S_IRUGO | S_IXUGO;
587         if (snd_info_register(entry) < 0) {
588                 snd_info_free_entry(entry);
589                 return -ENOMEM;
590         }
591         substream->proc_root = entry;
592
593         if ((entry = snd_info_create_card_entry(card, "info", substream->proc_root)) != NULL) {
594                 snd_info_set_text_ops(entry, substream,
595                                       snd_pcm_substream_proc_info_read);
596                 if (snd_info_register(entry) < 0) {
597                         snd_info_free_entry(entry);
598                         entry = NULL;
599                 }
600         }
601         substream->proc_info_entry = entry;
602
603         if ((entry = snd_info_create_card_entry(card, "hw_params", substream->proc_root)) != NULL) {
604                 snd_info_set_text_ops(entry, substream,
605                                       snd_pcm_substream_proc_hw_params_read);
606                 if (snd_info_register(entry) < 0) {
607                         snd_info_free_entry(entry);
608                         entry = NULL;
609                 }
610         }
611         substream->proc_hw_params_entry = entry;
612
613         if ((entry = snd_info_create_card_entry(card, "sw_params", substream->proc_root)) != NULL) {
614                 snd_info_set_text_ops(entry, substream,
615                                       snd_pcm_substream_proc_sw_params_read);
616                 if (snd_info_register(entry) < 0) {
617                         snd_info_free_entry(entry);
618                         entry = NULL;
619                 }
620         }
621         substream->proc_sw_params_entry = entry;
622
623         if ((entry = snd_info_create_card_entry(card, "status", substream->proc_root)) != NULL) {
624                 snd_info_set_text_ops(entry, substream,
625                                       snd_pcm_substream_proc_status_read);
626                 if (snd_info_register(entry) < 0) {
627                         snd_info_free_entry(entry);
628                         entry = NULL;
629                 }
630         }
631         substream->proc_status_entry = entry;
632
633 #ifdef CONFIG_SND_PCM_XRUN_DEBUG
634         entry = snd_info_create_card_entry(card, "xrun_injection",
635                                            substream->proc_root);
636         if (entry) {
637                 entry->private_data = substream;
638                 entry->c.text.read = NULL;
639                 entry->c.text.write = snd_pcm_xrun_injection_write;
640                 entry->mode = S_IFREG | S_IWUSR;
641                 if (snd_info_register(entry) < 0) {
642                         snd_info_free_entry(entry);
643                         entry = NULL;
644                 }
645         }
646         substream->proc_xrun_injection_entry = entry;
647 #endif /* CONFIG_SND_PCM_XRUN_DEBUG */
648
649         return 0;
650 }
651
652 static int snd_pcm_substream_proc_done(struct snd_pcm_substream *substream)
653 {
654         snd_info_free_entry(substream->proc_info_entry);
655         substream->proc_info_entry = NULL;
656         snd_info_free_entry(substream->proc_hw_params_entry);
657         substream->proc_hw_params_entry = NULL;
658         snd_info_free_entry(substream->proc_sw_params_entry);
659         substream->proc_sw_params_entry = NULL;
660         snd_info_free_entry(substream->proc_status_entry);
661         substream->proc_status_entry = NULL;
662 #ifdef CONFIG_SND_PCM_XRUN_DEBUG
663         snd_info_free_entry(substream->proc_xrun_injection_entry);
664         substream->proc_xrun_injection_entry = NULL;
665 #endif
666         snd_info_free_entry(substream->proc_root);
667         substream->proc_root = NULL;
668         return 0;
669 }
670 #else /* !CONFIG_SND_VERBOSE_PROCFS */
671 static inline int snd_pcm_stream_proc_init(struct snd_pcm_str *pstr) { return 0; }
672 static inline int snd_pcm_stream_proc_done(struct snd_pcm_str *pstr) { return 0; }
673 static inline int snd_pcm_substream_proc_init(struct snd_pcm_substream *substream) { return 0; }
674 static inline int snd_pcm_substream_proc_done(struct snd_pcm_substream *substream) { return 0; }
675 #endif /* CONFIG_SND_VERBOSE_PROCFS */
676
677 static const struct attribute_group *pcm_dev_attr_groups[];
678
679 /**
680  * snd_pcm_new_stream - create a new PCM stream
681  * @pcm: the pcm instance
682  * @stream: the stream direction, SNDRV_PCM_STREAM_XXX
683  * @substream_count: the number of substreams
684  *
685  * Creates a new stream for the pcm.
686  * The corresponding stream on the pcm must have been empty before
687  * calling this, i.e. zero must be given to the argument of
688  * snd_pcm_new().
689  *
690  * Return: Zero if successful, or a negative error code on failure.
691  */
692 int snd_pcm_new_stream(struct snd_pcm *pcm, int stream, int substream_count)
693 {
694         int idx, err;
695         struct snd_pcm_str *pstr = &pcm->streams[stream];
696         struct snd_pcm_substream *substream, *prev;
697
698 #if IS_ENABLED(CONFIG_SND_PCM_OSS)
699         mutex_init(&pstr->oss.setup_mutex);
700 #endif
701         pstr->stream = stream;
702         pstr->pcm = pcm;
703         pstr->substream_count = substream_count;
704         if (!substream_count)
705                 return 0;
706
707         snd_device_initialize(&pstr->dev, pcm->card);
708         pstr->dev.groups = pcm_dev_attr_groups;
709         dev_set_name(&pstr->dev, "pcmC%iD%i%c", pcm->card->number, pcm->device,
710                      stream == SNDRV_PCM_STREAM_PLAYBACK ? 'p' : 'c');
711
712         if (!pcm->internal) {
713                 err = snd_pcm_stream_proc_init(pstr);
714                 if (err < 0) {
715                         pcm_err(pcm, "Error in snd_pcm_stream_proc_init\n");
716                         return err;
717                 }
718         }
719         prev = NULL;
720         for (idx = 0, prev = NULL; idx < substream_count; idx++) {
721                 substream = kzalloc(sizeof(*substream), GFP_KERNEL);
722                 if (!substream)
723                         return -ENOMEM;
724                 substream->pcm = pcm;
725                 substream->pstr = pstr;
726                 substream->number = idx;
727                 substream->stream = stream;
728                 sprintf(substream->name, "subdevice #%i", idx);
729                 substream->buffer_bytes_max = UINT_MAX;
730                 if (prev == NULL)
731                         pstr->substream = substream;
732                 else
733                         prev->next = substream;
734
735                 if (!pcm->internal) {
736                         err = snd_pcm_substream_proc_init(substream);
737                         if (err < 0) {
738                                 pcm_err(pcm,
739                                         "Error in snd_pcm_stream_proc_init\n");
740                                 if (prev == NULL)
741                                         pstr->substream = NULL;
742                                 else
743                                         prev->next = NULL;
744                                 kfree(substream);
745                                 return err;
746                         }
747                 }
748                 substream->group = &substream->self_group;
749                 spin_lock_init(&substream->self_group.lock);
750                 mutex_init(&substream->self_group.mutex);
751                 INIT_LIST_HEAD(&substream->self_group.substreams);
752                 list_add_tail(&substream->link_list, &substream->self_group.substreams);
753                 atomic_set(&substream->mmap_count, 0);
754                 prev = substream;
755         }
756         return 0;
757 }                               
758 EXPORT_SYMBOL(snd_pcm_new_stream);
759
760 static int _snd_pcm_new(struct snd_card *card, const char *id, int device,
761                 int playback_count, int capture_count, bool internal,
762                 struct snd_pcm **rpcm)
763 {
764         struct snd_pcm *pcm;
765         int err;
766         static struct snd_device_ops ops = {
767                 .dev_free = snd_pcm_dev_free,
768                 .dev_register = snd_pcm_dev_register,
769                 .dev_disconnect = snd_pcm_dev_disconnect,
770         };
771
772         if (snd_BUG_ON(!card))
773                 return -ENXIO;
774         if (rpcm)
775                 *rpcm = NULL;
776         pcm = kzalloc(sizeof(*pcm), GFP_KERNEL);
777         if (!pcm)
778                 return -ENOMEM;
779         pcm->card = card;
780         pcm->device = device;
781         pcm->internal = internal;
782         mutex_init(&pcm->open_mutex);
783         init_waitqueue_head(&pcm->open_wait);
784         INIT_LIST_HEAD(&pcm->list);
785         if (id)
786                 strlcpy(pcm->id, id, sizeof(pcm->id));
787         if ((err = snd_pcm_new_stream(pcm, SNDRV_PCM_STREAM_PLAYBACK, playback_count)) < 0) {
788                 snd_pcm_free(pcm);
789                 return err;
790         }
791         if ((err = snd_pcm_new_stream(pcm, SNDRV_PCM_STREAM_CAPTURE, capture_count)) < 0) {
792                 snd_pcm_free(pcm);
793                 return err;
794         }
795         if ((err = snd_device_new(card, SNDRV_DEV_PCM, pcm, &ops)) < 0) {
796                 snd_pcm_free(pcm);
797                 return err;
798         }
799         if (rpcm)
800                 *rpcm = pcm;
801         return 0;
802 }
803
804 /**
805  * snd_pcm_new - create a new PCM instance
806  * @card: the card instance
807  * @id: the id string
808  * @device: the device index (zero based)
809  * @playback_count: the number of substreams for playback
810  * @capture_count: the number of substreams for capture
811  * @rpcm: the pointer to store the new pcm instance
812  *
813  * Creates a new PCM instance.
814  *
815  * The pcm operators have to be set afterwards to the new instance
816  * via snd_pcm_set_ops().
817  *
818  * Return: Zero if successful, or a negative error code on failure.
819  */
820 int snd_pcm_new(struct snd_card *card, const char *id, int device,
821                 int playback_count, int capture_count, struct snd_pcm **rpcm)
822 {
823         return _snd_pcm_new(card, id, device, playback_count, capture_count,
824                         false, rpcm);
825 }
826 EXPORT_SYMBOL(snd_pcm_new);
827
828 /**
829  * snd_pcm_new_internal - create a new internal PCM instance
830  * @card: the card instance
831  * @id: the id string
832  * @device: the device index (zero based - shared with normal PCMs)
833  * @playback_count: the number of substreams for playback
834  * @capture_count: the number of substreams for capture
835  * @rpcm: the pointer to store the new pcm instance
836  *
837  * Creates a new internal PCM instance with no userspace device or procfs
838  * entries. This is used by ASoC Back End PCMs in order to create a PCM that
839  * will only be used internally by kernel drivers. i.e. it cannot be opened
840  * by userspace. It provides existing ASoC components drivers with a substream
841  * and access to any private data.
842  *
843  * The pcm operators have to be set afterwards to the new instance
844  * via snd_pcm_set_ops().
845  *
846  * Return: Zero if successful, or a negative error code on failure.
847  */
848 int snd_pcm_new_internal(struct snd_card *card, const char *id, int device,
849         int playback_count, int capture_count,
850         struct snd_pcm **rpcm)
851 {
852         return _snd_pcm_new(card, id, device, playback_count, capture_count,
853                         true, rpcm);
854 }
855 EXPORT_SYMBOL(snd_pcm_new_internal);
856
857 static void free_chmap(struct snd_pcm_str *pstr)
858 {
859         if (pstr->chmap_kctl) {
860                 struct snd_card *card = pstr->pcm->card;
861
862                 down_write(&card->controls_rwsem);
863                 snd_ctl_remove(card, pstr->chmap_kctl);
864                 up_write(&card->controls_rwsem);
865                 pstr->chmap_kctl = NULL;
866         }
867 }
868
869 static void snd_pcm_free_stream(struct snd_pcm_str * pstr)
870 {
871         struct snd_pcm_substream *substream, *substream_next;
872 #if IS_ENABLED(CONFIG_SND_PCM_OSS)
873         struct snd_pcm_oss_setup *setup, *setupn;
874 #endif
875         substream = pstr->substream;
876         while (substream) {
877                 substream_next = substream->next;
878                 snd_pcm_timer_done(substream);
879                 snd_pcm_substream_proc_done(substream);
880                 kfree(substream);
881                 substream = substream_next;
882         }
883         snd_pcm_stream_proc_done(pstr);
884 #if IS_ENABLED(CONFIG_SND_PCM_OSS)
885         for (setup = pstr->oss.setup_list; setup; setup = setupn) {
886                 setupn = setup->next;
887                 kfree(setup->task_name);
888                 kfree(setup);
889         }
890 #endif
891         free_chmap(pstr);
892         if (pstr->substream_count)
893                 put_device(&pstr->dev);
894 }
895
896 static int snd_pcm_free(struct snd_pcm *pcm)
897 {
898         struct snd_pcm_notify *notify;
899
900         if (!pcm)
901                 return 0;
902         if (!pcm->internal) {
903                 list_for_each_entry(notify, &snd_pcm_notify_list, list)
904                         notify->n_unregister(pcm);
905         }
906         if (pcm->private_free)
907                 pcm->private_free(pcm);
908         snd_pcm_lib_preallocate_free_for_all(pcm);
909         snd_pcm_free_stream(&pcm->streams[SNDRV_PCM_STREAM_PLAYBACK]);
910         snd_pcm_free_stream(&pcm->streams[SNDRV_PCM_STREAM_CAPTURE]);
911         kfree(pcm);
912         return 0;
913 }
914
915 static int snd_pcm_dev_free(struct snd_device *device)
916 {
917         struct snd_pcm *pcm = device->device_data;
918         return snd_pcm_free(pcm);
919 }
920
921 int snd_pcm_attach_substream(struct snd_pcm *pcm, int stream,
922                              struct file *file,
923                              struct snd_pcm_substream **rsubstream)
924 {
925         struct snd_pcm_str * pstr;
926         struct snd_pcm_substream *substream;
927         struct snd_pcm_runtime *runtime;
928         struct snd_card *card;
929         int prefer_subdevice;
930         size_t size;
931
932         if (snd_BUG_ON(!pcm || !rsubstream))
933                 return -ENXIO;
934         if (snd_BUG_ON(stream != SNDRV_PCM_STREAM_PLAYBACK &&
935                        stream != SNDRV_PCM_STREAM_CAPTURE))
936                 return -EINVAL;
937         *rsubstream = NULL;
938         pstr = &pcm->streams[stream];
939         if (pstr->substream == NULL || pstr->substream_count == 0)
940                 return -ENODEV;
941
942         card = pcm->card;
943         prefer_subdevice = snd_ctl_get_preferred_subdevice(card, SND_CTL_SUBDEV_PCM);
944
945         if (pcm->info_flags & SNDRV_PCM_INFO_HALF_DUPLEX) {
946                 int opposite = !stream;
947
948                 for (substream = pcm->streams[opposite].substream; substream;
949                      substream = substream->next) {
950                         if (SUBSTREAM_BUSY(substream))
951                                 return -EAGAIN;
952                 }
953         }
954
955         if (file->f_flags & O_APPEND) {
956                 if (prefer_subdevice < 0) {
957                         if (pstr->substream_count > 1)
958                                 return -EINVAL; /* must be unique */
959                         substream = pstr->substream;
960                 } else {
961                         for (substream = pstr->substream; substream;
962                              substream = substream->next)
963                                 if (substream->number == prefer_subdevice)
964                                         break;
965                 }
966                 if (! substream)
967                         return -ENODEV;
968                 if (! SUBSTREAM_BUSY(substream))
969                         return -EBADFD;
970                 substream->ref_count++;
971                 *rsubstream = substream;
972                 return 0;
973         }
974
975         for (substream = pstr->substream; substream; substream = substream->next) {
976                 if (!SUBSTREAM_BUSY(substream) &&
977                     (prefer_subdevice == -1 ||
978                      substream->number == prefer_subdevice))
979                         break;
980         }
981         if (substream == NULL)
982                 return -EAGAIN;
983
984         runtime = kzalloc(sizeof(*runtime), GFP_KERNEL);
985         if (runtime == NULL)
986                 return -ENOMEM;
987
988         size = PAGE_ALIGN(sizeof(struct snd_pcm_mmap_status));
989         runtime->status = snd_malloc_pages(size, GFP_KERNEL);
990         if (runtime->status == NULL) {
991                 kfree(runtime);
992                 return -ENOMEM;
993         }
994         memset((void*)runtime->status, 0, size);
995
996         size = PAGE_ALIGN(sizeof(struct snd_pcm_mmap_control));
997         runtime->control = snd_malloc_pages(size, GFP_KERNEL);
998         if (runtime->control == NULL) {
999                 snd_free_pages((void*)runtime->status,
1000                                PAGE_ALIGN(sizeof(struct snd_pcm_mmap_status)));
1001                 kfree(runtime);
1002                 return -ENOMEM;
1003         }
1004         memset((void*)runtime->control, 0, size);
1005
1006         init_waitqueue_head(&runtime->sleep);
1007         init_waitqueue_head(&runtime->tsleep);
1008
1009         runtime->status->state = SNDRV_PCM_STATE_OPEN;
1010
1011         substream->runtime = runtime;
1012         substream->private_data = pcm->private_data;
1013         substream->ref_count = 1;
1014         substream->f_flags = file->f_flags;
1015         substream->pid = get_pid(task_pid(current));
1016         pstr->substream_opened++;
1017         *rsubstream = substream;
1018         return 0;
1019 }
1020
1021 void snd_pcm_detach_substream(struct snd_pcm_substream *substream)
1022 {
1023         struct snd_pcm_runtime *runtime;
1024
1025         if (PCM_RUNTIME_CHECK(substream))
1026                 return;
1027         runtime = substream->runtime;
1028         if (runtime->private_free != NULL)
1029                 runtime->private_free(runtime);
1030         snd_free_pages((void*)runtime->status,
1031                        PAGE_ALIGN(sizeof(struct snd_pcm_mmap_status)));
1032         snd_free_pages((void*)runtime->control,
1033                        PAGE_ALIGN(sizeof(struct snd_pcm_mmap_control)));
1034         kfree(runtime->hw_constraints.rules);
1035         /* Avoid concurrent access to runtime via PCM timer interface */
1036         if (substream->timer)
1037                 spin_lock_irq(&substream->timer->lock);
1038         substream->runtime = NULL;
1039         if (substream->timer)
1040                 spin_unlock_irq(&substream->timer->lock);
1041         kfree(runtime);
1042         put_pid(substream->pid);
1043         substream->pid = NULL;
1044         substream->pstr->substream_opened--;
1045 }
1046
1047 static ssize_t show_pcm_class(struct device *dev,
1048                               struct device_attribute *attr, char *buf)
1049 {
1050         struct snd_pcm_str *pstr = container_of(dev, struct snd_pcm_str, dev);
1051         struct snd_pcm *pcm = pstr->pcm;
1052         const char *str;
1053         static const char *strs[SNDRV_PCM_CLASS_LAST + 1] = {
1054                 [SNDRV_PCM_CLASS_GENERIC] = "generic",
1055                 [SNDRV_PCM_CLASS_MULTI] = "multi",
1056                 [SNDRV_PCM_CLASS_MODEM] = "modem",
1057                 [SNDRV_PCM_CLASS_DIGITIZER] = "digitizer",
1058         };
1059
1060         if (pcm->dev_class > SNDRV_PCM_CLASS_LAST)
1061                 str = "none";
1062         else
1063                 str = strs[pcm->dev_class];
1064         return snprintf(buf, PAGE_SIZE, "%s\n", str);
1065 }
1066
1067 static DEVICE_ATTR(pcm_class, S_IRUGO, show_pcm_class, NULL);
1068 static struct attribute *pcm_dev_attrs[] = {
1069         &dev_attr_pcm_class.attr,
1070         NULL
1071 };
1072
1073 static struct attribute_group pcm_dev_attr_group = {
1074         .attrs  = pcm_dev_attrs,
1075 };
1076
1077 static const struct attribute_group *pcm_dev_attr_groups[] = {
1078         &pcm_dev_attr_group,
1079         NULL
1080 };
1081
1082 static int snd_pcm_dev_register(struct snd_device *device)
1083 {
1084         int cidx, err;
1085         struct snd_pcm_substream *substream;
1086         struct snd_pcm_notify *notify;
1087         struct snd_pcm *pcm;
1088
1089         if (snd_BUG_ON(!device || !device->device_data))
1090                 return -ENXIO;
1091         pcm = device->device_data;
1092         if (pcm->internal)
1093                 return 0;
1094
1095         mutex_lock(&register_mutex);
1096         err = snd_pcm_add(pcm);
1097         if (err)
1098                 goto unlock;
1099         for (cidx = 0; cidx < 2; cidx++) {
1100                 int devtype = -1;
1101                 if (pcm->streams[cidx].substream == NULL)
1102                         continue;
1103                 switch (cidx) {
1104                 case SNDRV_PCM_STREAM_PLAYBACK:
1105                         devtype = SNDRV_DEVICE_TYPE_PCM_PLAYBACK;
1106                         break;
1107                 case SNDRV_PCM_STREAM_CAPTURE:
1108                         devtype = SNDRV_DEVICE_TYPE_PCM_CAPTURE;
1109                         break;
1110                 }
1111                 /* register pcm */
1112                 err = snd_register_device(devtype, pcm->card, pcm->device,
1113                                           &snd_pcm_f_ops[cidx], pcm,
1114                                           &pcm->streams[cidx].dev);
1115                 if (err < 0) {
1116                         list_del_init(&pcm->list);
1117                         goto unlock;
1118                 }
1119
1120                 for (substream = pcm->streams[cidx].substream; substream; substream = substream->next)
1121                         snd_pcm_timer_init(substream);
1122         }
1123
1124         list_for_each_entry(notify, &snd_pcm_notify_list, list)
1125                 notify->n_register(pcm);
1126
1127  unlock:
1128         mutex_unlock(&register_mutex);
1129         return err;
1130 }
1131
1132 static int snd_pcm_dev_disconnect(struct snd_device *device)
1133 {
1134         struct snd_pcm *pcm = device->device_data;
1135         struct snd_pcm_notify *notify;
1136         struct snd_pcm_substream *substream;
1137         int cidx;
1138
1139         mutex_lock(&register_mutex);
1140         mutex_lock(&pcm->open_mutex);
1141         wake_up(&pcm->open_wait);
1142         list_del_init(&pcm->list);
1143         for (cidx = 0; cidx < 2; cidx++) {
1144                 for (substream = pcm->streams[cidx].substream; substream; substream = substream->next) {
1145                         snd_pcm_stream_lock_irq(substream);
1146                         if (substream->runtime) {
1147                                 substream->runtime->status->state = SNDRV_PCM_STATE_DISCONNECTED;
1148                                 wake_up(&substream->runtime->sleep);
1149                                 wake_up(&substream->runtime->tsleep);
1150                         }
1151                         snd_pcm_stream_unlock_irq(substream);
1152                 }
1153         }
1154         if (!pcm->internal) {
1155                 list_for_each_entry(notify, &snd_pcm_notify_list, list)
1156                         notify->n_disconnect(pcm);
1157         }
1158         for (cidx = 0; cidx < 2; cidx++) {
1159                 if (!pcm->internal)
1160                         snd_unregister_device(&pcm->streams[cidx].dev);
1161                 free_chmap(&pcm->streams[cidx]);
1162         }
1163         mutex_unlock(&pcm->open_mutex);
1164         mutex_unlock(&register_mutex);
1165         return 0;
1166 }
1167
1168 /**
1169  * snd_pcm_notify - Add/remove the notify list
1170  * @notify: PCM notify list
1171  * @nfree: 0 = register, 1 = unregister
1172  *
1173  * This adds the given notifier to the global list so that the callback is
1174  * called for each registered PCM devices.  This exists only for PCM OSS
1175  * emulation, so far.
1176  */
1177 int snd_pcm_notify(struct snd_pcm_notify *notify, int nfree)
1178 {
1179         struct snd_pcm *pcm;
1180
1181         if (snd_BUG_ON(!notify ||
1182                        !notify->n_register ||
1183                        !notify->n_unregister ||
1184                        !notify->n_disconnect))
1185                 return -EINVAL;
1186         mutex_lock(&register_mutex);
1187         if (nfree) {
1188                 list_del(&notify->list);
1189                 list_for_each_entry(pcm, &snd_pcm_devices, list)
1190                         notify->n_unregister(pcm);
1191         } else {
1192                 list_add_tail(&notify->list, &snd_pcm_notify_list);
1193                 list_for_each_entry(pcm, &snd_pcm_devices, list)
1194                         notify->n_register(pcm);
1195         }
1196         mutex_unlock(&register_mutex);
1197         return 0;
1198 }
1199 EXPORT_SYMBOL(snd_pcm_notify);
1200
1201 #ifdef CONFIG_SND_PROC_FS
1202 /*
1203  *  Info interface
1204  */
1205
1206 static void snd_pcm_proc_read(struct snd_info_entry *entry,
1207                               struct snd_info_buffer *buffer)
1208 {
1209         struct snd_pcm *pcm;
1210
1211         mutex_lock(&register_mutex);
1212         list_for_each_entry(pcm, &snd_pcm_devices, list) {
1213                 snd_iprintf(buffer, "%02i-%02i: %s : %s",
1214                             pcm->card->number, pcm->device, pcm->id, pcm->name);
1215                 if (pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream)
1216                         snd_iprintf(buffer, " : playback %i",
1217                                     pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream_count);
1218                 if (pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream)
1219                         snd_iprintf(buffer, " : capture %i",
1220                                     pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream_count);
1221                 snd_iprintf(buffer, "\n");
1222         }
1223         mutex_unlock(&register_mutex);
1224 }
1225
1226 static struct snd_info_entry *snd_pcm_proc_entry;
1227
1228 static void snd_pcm_proc_init(void)
1229 {
1230         struct snd_info_entry *entry;
1231
1232         if ((entry = snd_info_create_module_entry(THIS_MODULE, "pcm", NULL)) != NULL) {
1233                 snd_info_set_text_ops(entry, NULL, snd_pcm_proc_read);
1234                 if (snd_info_register(entry) < 0) {
1235                         snd_info_free_entry(entry);
1236                         entry = NULL;
1237                 }
1238         }
1239         snd_pcm_proc_entry = entry;
1240 }
1241
1242 static void snd_pcm_proc_done(void)
1243 {
1244         snd_info_free_entry(snd_pcm_proc_entry);
1245 }
1246
1247 #else /* !CONFIG_SND_PROC_FS */
1248 #define snd_pcm_proc_init()
1249 #define snd_pcm_proc_done()
1250 #endif /* CONFIG_SND_PROC_FS */
1251
1252
1253 /*
1254  *  ENTRY functions
1255  */
1256
1257 static int __init alsa_pcm_init(void)
1258 {
1259         snd_ctl_register_ioctl(snd_pcm_control_ioctl);
1260         snd_ctl_register_ioctl_compat(snd_pcm_control_ioctl);
1261         snd_pcm_proc_init();
1262         return 0;
1263 }
1264
1265 static void __exit alsa_pcm_exit(void)
1266 {
1267         snd_ctl_unregister_ioctl(snd_pcm_control_ioctl);
1268         snd_ctl_unregister_ioctl_compat(snd_pcm_control_ioctl);
1269         snd_pcm_proc_done();
1270 }
1271
1272 module_init(alsa_pcm_init)
1273 module_exit(alsa_pcm_exit)