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