1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Digital Audio (PCM) abstract layer
4 * Copyright (c) by Jaroslav Kysela <perex@perex.cz>
7 #include <linux/init.h>
8 #include <linux/slab.h>
9 #include <linux/module.h>
10 #include <linux/time.h>
11 #include <linux/mutex.h>
12 #include <linux/device.h>
13 #include <linux/nospec.h>
14 #include <sound/core.h>
15 #include <sound/minors.h>
16 #include <sound/pcm.h>
17 #include <sound/timer.h>
18 #include <sound/control.h>
19 #include <sound/info.h>
21 #include "pcm_local.h"
23 MODULE_AUTHOR("Jaroslav Kysela <perex@perex.cz>, Abramo Bagnara <abramo@alsa-project.org>");
24 MODULE_DESCRIPTION("Midlevel PCM code for ALSA.");
25 MODULE_LICENSE("GPL");
27 static LIST_HEAD(snd_pcm_devices
);
28 static DEFINE_MUTEX(register_mutex
);
29 #if IS_ENABLED(CONFIG_SND_PCM_OSS)
30 static LIST_HEAD(snd_pcm_notify_list
);
33 static int snd_pcm_free(struct snd_pcm
*pcm
);
34 static int snd_pcm_dev_free(struct snd_device
*device
);
35 static int snd_pcm_dev_register(struct snd_device
*device
);
36 static int snd_pcm_dev_disconnect(struct snd_device
*device
);
38 static struct snd_pcm
*snd_pcm_get(struct snd_card
*card
, int device
)
42 list_for_each_entry(pcm
, &snd_pcm_devices
, list
) {
43 if (pcm
->card
== card
&& pcm
->device
== device
)
49 static int snd_pcm_next(struct snd_card
*card
, int device
)
53 list_for_each_entry(pcm
, &snd_pcm_devices
, list
) {
54 if (pcm
->card
== card
&& pcm
->device
> device
)
56 else if (pcm
->card
->number
> card
->number
)
62 static int snd_pcm_add(struct snd_pcm
*newpcm
)
69 list_for_each_entry(pcm
, &snd_pcm_devices
, list
) {
70 if (pcm
->card
== newpcm
->card
&& pcm
->device
== newpcm
->device
)
72 if (pcm
->card
->number
> newpcm
->card
->number
||
73 (pcm
->card
== newpcm
->card
&&
74 pcm
->device
> newpcm
->device
)) {
75 list_add(&newpcm
->list
, pcm
->list
.prev
);
79 list_add_tail(&newpcm
->list
, &snd_pcm_devices
);
83 static int snd_pcm_control_ioctl(struct snd_card
*card
,
84 struct snd_ctl_file
*control
,
85 unsigned int cmd
, unsigned long arg
)
88 case SNDRV_CTL_IOCTL_PCM_NEXT_DEVICE
:
92 if (get_user(device
, (int __user
*)arg
))
94 scoped_guard(mutex
, ®ister_mutex
)
95 device
= snd_pcm_next(card
, device
);
96 if (put_user(device
, (int __user
*)arg
))
100 case SNDRV_CTL_IOCTL_PCM_INFO
:
102 struct snd_pcm_info __user
*info
;
103 unsigned int device
, subdevice
;
106 struct snd_pcm_str
*pstr
;
107 struct snd_pcm_substream
*substream
;
109 info
= (struct snd_pcm_info __user
*)arg
;
110 if (get_user(device
, &info
->device
))
112 if (get_user(stream
, &info
->stream
))
114 if (stream
< 0 || stream
> 1)
116 stream
= array_index_nospec(stream
, 2);
117 if (get_user(subdevice
, &info
->subdevice
))
119 guard(mutex
)(®ister_mutex
);
120 pcm
= snd_pcm_get(card
, device
);
123 pstr
= &pcm
->streams
[stream
];
124 if (pstr
->substream_count
== 0)
126 if (subdevice
>= pstr
->substream_count
)
128 for (substream
= pstr
->substream
; substream
;
129 substream
= substream
->next
)
130 if (substream
->number
== (int)subdevice
)
132 if (substream
== NULL
)
134 guard(mutex
)(&pcm
->open_mutex
);
135 return snd_pcm_info_user(substream
, info
);
137 case SNDRV_CTL_IOCTL_PCM_PREFER_SUBDEVICE
:
141 if (get_user(val
, (int __user
*)arg
))
143 control
->preferred_subdevice
[SND_CTL_SUBDEV_PCM
] = val
;
150 #define FORMAT(v) [SNDRV_PCM_FORMAT_##v] = #v
152 static const char * const snd_pcm_format_names
[] = {
171 FORMAT(IEC958_SUBFRAME_LE
),
172 FORMAT(IEC958_SUBFRAME_BE
),
207 * snd_pcm_format_name - Return a name string for the given PCM format
208 * @format: PCM format
210 * Return: the format name string
212 const char *snd_pcm_format_name(snd_pcm_format_t format
)
214 unsigned int format_num
= (__force
unsigned int)format
;
216 if (format_num
>= ARRAY_SIZE(snd_pcm_format_names
) || !snd_pcm_format_names
[format_num
])
218 return snd_pcm_format_names
[format_num
];
220 EXPORT_SYMBOL_GPL(snd_pcm_format_name
);
222 #ifdef CONFIG_SND_VERBOSE_PROCFS
224 #define STATE(v) [SNDRV_PCM_STATE_##v] = #v
225 #define STREAM(v) [SNDRV_PCM_STREAM_##v] = #v
226 #define READY(v) [SNDRV_PCM_READY_##v] = #v
227 #define XRUN(v) [SNDRV_PCM_XRUN_##v] = #v
228 #define SILENCE(v) [SNDRV_PCM_SILENCE_##v] = #v
229 #define TSTAMP(v) [SNDRV_PCM_TSTAMP_##v] = #v
230 #define ACCESS(v) [SNDRV_PCM_ACCESS_##v] = #v
231 #define START(v) [SNDRV_PCM_START_##v] = #v
232 #define SUBFORMAT(v) [SNDRV_PCM_SUBFORMAT_##v] = #v
234 static const char * const snd_pcm_stream_names
[] = {
239 static const char * const snd_pcm_state_names
[] = {
251 static const char * const snd_pcm_access_names
[] = {
252 ACCESS(MMAP_INTERLEAVED
),
253 ACCESS(MMAP_NONINTERLEAVED
),
254 ACCESS(MMAP_COMPLEX
),
255 ACCESS(RW_INTERLEAVED
),
256 ACCESS(RW_NONINTERLEAVED
),
259 static const char * const snd_pcm_subformat_names
[] = {
261 SUBFORMAT(MSBITS_MAX
),
262 SUBFORMAT(MSBITS_20
),
263 SUBFORMAT(MSBITS_24
),
266 static const char * const snd_pcm_tstamp_mode_names
[] = {
271 static const char *snd_pcm_stream_name(int stream
)
273 return snd_pcm_stream_names
[stream
];
276 static const char *snd_pcm_access_name(snd_pcm_access_t access
)
278 return snd_pcm_access_names
[(__force
int)access
];
281 static const char *snd_pcm_subformat_name(snd_pcm_subformat_t subformat
)
283 return snd_pcm_subformat_names
[(__force
int)subformat
];
286 static const char *snd_pcm_tstamp_mode_name(int mode
)
288 return snd_pcm_tstamp_mode_names
[mode
];
291 static const char *snd_pcm_state_name(snd_pcm_state_t state
)
293 return snd_pcm_state_names
[(__force
int)state
];
296 #if IS_ENABLED(CONFIG_SND_PCM_OSS)
297 #include <linux/soundcard.h>
299 static const char *snd_pcm_oss_format_name(int format
)
328 static void snd_pcm_proc_info_read(struct snd_pcm_substream
*substream
,
329 struct snd_info_buffer
*buffer
)
331 struct snd_pcm_info
*info
__free(kfree
) = NULL
;
337 info
= kmalloc(sizeof(*info
), GFP_KERNEL
);
341 err
= snd_pcm_info(substream
, info
);
343 snd_iprintf(buffer
, "error %d\n", err
);
346 snd_iprintf(buffer
, "card: %d\n", info
->card
);
347 snd_iprintf(buffer
, "device: %d\n", info
->device
);
348 snd_iprintf(buffer
, "subdevice: %d\n", info
->subdevice
);
349 snd_iprintf(buffer
, "stream: %s\n", snd_pcm_stream_name(info
->stream
));
350 snd_iprintf(buffer
, "id: %s\n", info
->id
);
351 snd_iprintf(buffer
, "name: %s\n", info
->name
);
352 snd_iprintf(buffer
, "subname: %s\n", info
->subname
);
353 snd_iprintf(buffer
, "class: %d\n", info
->dev_class
);
354 snd_iprintf(buffer
, "subclass: %d\n", info
->dev_subclass
);
355 snd_iprintf(buffer
, "subdevices_count: %d\n", info
->subdevices_count
);
356 snd_iprintf(buffer
, "subdevices_avail: %d\n", info
->subdevices_avail
);
359 static void snd_pcm_stream_proc_info_read(struct snd_info_entry
*entry
,
360 struct snd_info_buffer
*buffer
)
362 snd_pcm_proc_info_read(((struct snd_pcm_str
*)entry
->private_data
)->substream
,
366 static void snd_pcm_substream_proc_info_read(struct snd_info_entry
*entry
,
367 struct snd_info_buffer
*buffer
)
369 snd_pcm_proc_info_read(entry
->private_data
, buffer
);
372 static void snd_pcm_substream_proc_hw_params_read(struct snd_info_entry
*entry
,
373 struct snd_info_buffer
*buffer
)
375 struct snd_pcm_substream
*substream
= entry
->private_data
;
376 struct snd_pcm_runtime
*runtime
;
378 guard(mutex
)(&substream
->pcm
->open_mutex
);
379 runtime
= substream
->runtime
;
381 snd_iprintf(buffer
, "closed\n");
384 if (runtime
->state
== SNDRV_PCM_STATE_OPEN
) {
385 snd_iprintf(buffer
, "no setup\n");
388 snd_iprintf(buffer
, "access: %s\n", snd_pcm_access_name(runtime
->access
));
389 snd_iprintf(buffer
, "format: %s\n", snd_pcm_format_name(runtime
->format
));
390 snd_iprintf(buffer
, "subformat: %s\n", snd_pcm_subformat_name(runtime
->subformat
));
391 snd_iprintf(buffer
, "channels: %u\n", runtime
->channels
);
392 snd_iprintf(buffer
, "rate: %u (%u/%u)\n", runtime
->rate
, runtime
->rate_num
, runtime
->rate_den
);
393 snd_iprintf(buffer
, "period_size: %lu\n", runtime
->period_size
);
394 snd_iprintf(buffer
, "buffer_size: %lu\n", runtime
->buffer_size
);
395 #if IS_ENABLED(CONFIG_SND_PCM_OSS)
396 if (substream
->oss
.oss
) {
397 snd_iprintf(buffer
, "OSS format: %s\n", snd_pcm_oss_format_name(runtime
->oss
.format
));
398 snd_iprintf(buffer
, "OSS channels: %u\n", runtime
->oss
.channels
);
399 snd_iprintf(buffer
, "OSS rate: %u\n", runtime
->oss
.rate
);
400 snd_iprintf(buffer
, "OSS period bytes: %lu\n", (unsigned long)runtime
->oss
.period_bytes
);
401 snd_iprintf(buffer
, "OSS periods: %u\n", runtime
->oss
.periods
);
402 snd_iprintf(buffer
, "OSS period frames: %lu\n", (unsigned long)runtime
->oss
.period_frames
);
407 static void snd_pcm_substream_proc_sw_params_read(struct snd_info_entry
*entry
,
408 struct snd_info_buffer
*buffer
)
410 struct snd_pcm_substream
*substream
= entry
->private_data
;
411 struct snd_pcm_runtime
*runtime
;
413 guard(mutex
)(&substream
->pcm
->open_mutex
);
414 runtime
= substream
->runtime
;
416 snd_iprintf(buffer
, "closed\n");
419 if (runtime
->state
== SNDRV_PCM_STATE_OPEN
) {
420 snd_iprintf(buffer
, "no setup\n");
423 snd_iprintf(buffer
, "tstamp_mode: %s\n", snd_pcm_tstamp_mode_name(runtime
->tstamp_mode
));
424 snd_iprintf(buffer
, "period_step: %u\n", runtime
->period_step
);
425 snd_iprintf(buffer
, "avail_min: %lu\n", runtime
->control
->avail_min
);
426 snd_iprintf(buffer
, "start_threshold: %lu\n", runtime
->start_threshold
);
427 snd_iprintf(buffer
, "stop_threshold: %lu\n", runtime
->stop_threshold
);
428 snd_iprintf(buffer
, "silence_threshold: %lu\n", runtime
->silence_threshold
);
429 snd_iprintf(buffer
, "silence_size: %lu\n", runtime
->silence_size
);
430 snd_iprintf(buffer
, "boundary: %lu\n", runtime
->boundary
);
433 static void snd_pcm_substream_proc_status_read(struct snd_info_entry
*entry
,
434 struct snd_info_buffer
*buffer
)
436 struct snd_pcm_substream
*substream
= entry
->private_data
;
437 struct snd_pcm_runtime
*runtime
;
438 struct snd_pcm_status64 status
;
441 guard(mutex
)(&substream
->pcm
->open_mutex
);
442 runtime
= substream
->runtime
;
444 snd_iprintf(buffer
, "closed\n");
447 memset(&status
, 0, sizeof(status
));
448 err
= snd_pcm_status64(substream
, &status
);
450 snd_iprintf(buffer
, "error %d\n", err
);
453 snd_iprintf(buffer
, "state: %s\n", snd_pcm_state_name(status
.state
));
454 snd_iprintf(buffer
, "owner_pid : %d\n", pid_vnr(substream
->pid
));
455 snd_iprintf(buffer
, "trigger_time: %lld.%09lld\n",
456 status
.trigger_tstamp_sec
, status
.trigger_tstamp_nsec
);
457 snd_iprintf(buffer
, "tstamp : %lld.%09lld\n",
458 status
.tstamp_sec
, status
.tstamp_nsec
);
459 snd_iprintf(buffer
, "delay : %ld\n", status
.delay
);
460 snd_iprintf(buffer
, "avail : %ld\n", status
.avail
);
461 snd_iprintf(buffer
, "avail_max : %ld\n", status
.avail_max
);
462 snd_iprintf(buffer
, "-----\n");
463 snd_iprintf(buffer
, "hw_ptr : %ld\n", runtime
->status
->hw_ptr
);
464 snd_iprintf(buffer
, "appl_ptr : %ld\n", runtime
->control
->appl_ptr
);
465 #ifdef CONFIG_SND_PCM_XRUN_DEBUG
466 snd_iprintf(buffer
, "xrun_counter: %d\n", substream
->xrun_counter
);
470 #ifdef CONFIG_SND_PCM_XRUN_DEBUG
471 static void snd_pcm_xrun_injection_write(struct snd_info_entry
*entry
,
472 struct snd_info_buffer
*buffer
)
474 struct snd_pcm_substream
*substream
= entry
->private_data
;
476 snd_pcm_stop_xrun(substream
);
479 static void snd_pcm_xrun_debug_read(struct snd_info_entry
*entry
,
480 struct snd_info_buffer
*buffer
)
482 struct snd_pcm_str
*pstr
= entry
->private_data
;
483 snd_iprintf(buffer
, "%d\n", pstr
->xrun_debug
);
486 static void snd_pcm_xrun_debug_write(struct snd_info_entry
*entry
,
487 struct snd_info_buffer
*buffer
)
489 struct snd_pcm_str
*pstr
= entry
->private_data
;
491 if (!snd_info_get_line(buffer
, line
, sizeof(line
)))
492 pstr
->xrun_debug
= simple_strtoul(line
, NULL
, 10);
496 static int snd_pcm_stream_proc_init(struct snd_pcm_str
*pstr
)
498 struct snd_pcm
*pcm
= pstr
->pcm
;
499 struct snd_info_entry
*entry
;
502 sprintf(name
, "pcm%i%c", pcm
->device
,
503 pstr
->stream
== SNDRV_PCM_STREAM_PLAYBACK
? 'p' : 'c');
504 entry
= snd_info_create_card_entry(pcm
->card
, name
,
505 pcm
->card
->proc_root
);
508 entry
->mode
= S_IFDIR
| 0555;
509 pstr
->proc_root
= entry
;
510 entry
= snd_info_create_card_entry(pcm
->card
, "info", pstr
->proc_root
);
512 snd_info_set_text_ops(entry
, pstr
, snd_pcm_stream_proc_info_read
);
513 #ifdef CONFIG_SND_PCM_XRUN_DEBUG
514 entry
= snd_info_create_card_entry(pcm
->card
, "xrun_debug",
517 snd_info_set_text_ops(entry
, pstr
, snd_pcm_xrun_debug_read
);
518 entry
->c
.text
.write
= snd_pcm_xrun_debug_write
;
525 static int snd_pcm_stream_proc_done(struct snd_pcm_str
*pstr
)
527 snd_info_free_entry(pstr
->proc_root
);
528 pstr
->proc_root
= NULL
;
532 static struct snd_info_entry
*
533 create_substream_info_entry(struct snd_pcm_substream
*substream
,
535 void (*read
)(struct snd_info_entry
*,
536 struct snd_info_buffer
*))
538 struct snd_info_entry
*entry
;
540 entry
= snd_info_create_card_entry(substream
->pcm
->card
, name
,
541 substream
->proc_root
);
543 snd_info_set_text_ops(entry
, substream
, read
);
547 static int snd_pcm_substream_proc_init(struct snd_pcm_substream
*substream
)
549 struct snd_info_entry
*entry
;
550 struct snd_card
*card
;
553 card
= substream
->pcm
->card
;
555 sprintf(name
, "sub%i", substream
->number
);
556 entry
= snd_info_create_card_entry(card
, name
,
557 substream
->pstr
->proc_root
);
560 entry
->mode
= S_IFDIR
| 0555;
561 substream
->proc_root
= entry
;
563 create_substream_info_entry(substream
, "info",
564 snd_pcm_substream_proc_info_read
);
565 create_substream_info_entry(substream
, "hw_params",
566 snd_pcm_substream_proc_hw_params_read
);
567 create_substream_info_entry(substream
, "sw_params",
568 snd_pcm_substream_proc_sw_params_read
);
569 create_substream_info_entry(substream
, "status",
570 snd_pcm_substream_proc_status_read
);
572 #ifdef CONFIG_SND_PCM_XRUN_DEBUG
573 entry
= create_substream_info_entry(substream
, "xrun_injection", NULL
);
575 entry
->c
.text
.write
= snd_pcm_xrun_injection_write
;
576 entry
->mode
= S_IFREG
| 0200;
578 #endif /* CONFIG_SND_PCM_XRUN_DEBUG */
583 #else /* !CONFIG_SND_VERBOSE_PROCFS */
584 static inline int snd_pcm_stream_proc_init(struct snd_pcm_str
*pstr
) { return 0; }
585 static inline int snd_pcm_stream_proc_done(struct snd_pcm_str
*pstr
) { return 0; }
586 static inline int snd_pcm_substream_proc_init(struct snd_pcm_substream
*substream
) { return 0; }
587 #endif /* CONFIG_SND_VERBOSE_PROCFS */
589 static const struct attribute_group
*pcm_dev_attr_groups
[];
592 * PM callbacks: we need to deal only with suspend here, as the resume is
593 * triggered either from user-space or the driver's resume callback
595 #ifdef CONFIG_PM_SLEEP
596 static int do_pcm_suspend(struct device
*dev
)
598 struct snd_pcm_str
*pstr
= dev_get_drvdata(dev
);
600 if (!pstr
->pcm
->no_device_suspend
)
601 snd_pcm_suspend_all(pstr
->pcm
);
606 static const struct dev_pm_ops pcm_dev_pm_ops
= {
607 SET_SYSTEM_SLEEP_PM_OPS(do_pcm_suspend
, NULL
)
610 /* device type for PCM -- basically only for passing PM callbacks */
611 static const struct device_type pcm_dev_type
= {
613 .pm
= &pcm_dev_pm_ops
,
617 * snd_pcm_new_stream - create a new PCM stream
618 * @pcm: the pcm instance
619 * @stream: the stream direction, SNDRV_PCM_STREAM_XXX
620 * @substream_count: the number of substreams
622 * Creates a new stream for the pcm.
623 * The corresponding stream on the pcm must have been empty before
624 * calling this, i.e. zero must be given to the argument of
627 * Return: Zero if successful, or a negative error code on failure.
629 int snd_pcm_new_stream(struct snd_pcm
*pcm
, int stream
, int substream_count
)
632 struct snd_pcm_str
*pstr
= &pcm
->streams
[stream
];
633 struct snd_pcm_substream
*substream
, *prev
;
635 #if IS_ENABLED(CONFIG_SND_PCM_OSS)
636 mutex_init(&pstr
->oss
.setup_mutex
);
638 pstr
->stream
= stream
;
640 pstr
->substream_count
= substream_count
;
641 if (!substream_count
)
644 err
= snd_device_alloc(&pstr
->dev
, pcm
->card
);
647 dev_set_name(pstr
->dev
, "pcmC%iD%i%c", pcm
->card
->number
, pcm
->device
,
648 stream
== SNDRV_PCM_STREAM_PLAYBACK
? 'p' : 'c');
649 pstr
->dev
->groups
= pcm_dev_attr_groups
;
650 pstr
->dev
->type
= &pcm_dev_type
;
651 dev_set_drvdata(pstr
->dev
, pstr
);
653 if (!pcm
->internal
) {
654 err
= snd_pcm_stream_proc_init(pstr
);
656 pcm_err(pcm
, "Error in snd_pcm_stream_proc_init\n");
661 for (idx
= 0, prev
= NULL
; idx
< substream_count
; idx
++) {
662 substream
= kzalloc(sizeof(*substream
), GFP_KERNEL
);
665 substream
->pcm
= pcm
;
666 substream
->pstr
= pstr
;
667 substream
->number
= idx
;
668 substream
->stream
= stream
;
669 sprintf(substream
->name
, "subdevice #%i", idx
);
670 substream
->buffer_bytes_max
= UINT_MAX
;
672 pstr
->substream
= substream
;
674 prev
->next
= substream
;
676 if (!pcm
->internal
) {
677 err
= snd_pcm_substream_proc_init(substream
);
680 "Error in snd_pcm_stream_proc_init\n");
682 pstr
->substream
= NULL
;
689 substream
->group
= &substream
->self_group
;
690 snd_pcm_group_init(&substream
->self_group
);
691 list_add_tail(&substream
->link_list
, &substream
->self_group
.substreams
);
692 atomic_set(&substream
->mmap_count
, 0);
697 EXPORT_SYMBOL(snd_pcm_new_stream
);
699 static int _snd_pcm_new(struct snd_card
*card
, const char *id
, int device
,
700 int playback_count
, int capture_count
, bool internal
,
701 struct snd_pcm
**rpcm
)
705 static const struct snd_device_ops ops
= {
706 .dev_free
= snd_pcm_dev_free
,
707 .dev_register
= snd_pcm_dev_register
,
708 .dev_disconnect
= snd_pcm_dev_disconnect
,
710 static const struct snd_device_ops internal_ops
= {
711 .dev_free
= snd_pcm_dev_free
,
714 if (snd_BUG_ON(!card
))
718 pcm
= kzalloc(sizeof(*pcm
), GFP_KERNEL
);
722 pcm
->device
= device
;
723 pcm
->internal
= internal
;
724 mutex_init(&pcm
->open_mutex
);
725 init_waitqueue_head(&pcm
->open_wait
);
726 INIT_LIST_HEAD(&pcm
->list
);
728 strscpy(pcm
->id
, id
, sizeof(pcm
->id
));
730 err
= snd_pcm_new_stream(pcm
, SNDRV_PCM_STREAM_PLAYBACK
,
735 err
= snd_pcm_new_stream(pcm
, SNDRV_PCM_STREAM_CAPTURE
, capture_count
);
739 err
= snd_device_new(card
, SNDRV_DEV_PCM
, pcm
,
740 internal
? &internal_ops
: &ops
);
754 * snd_pcm_new - create a new PCM instance
755 * @card: the card instance
757 * @device: the device index (zero based)
758 * @playback_count: the number of substreams for playback
759 * @capture_count: the number of substreams for capture
760 * @rpcm: the pointer to store the new pcm instance
762 * Creates a new PCM instance.
764 * The pcm operators have to be set afterwards to the new instance
765 * via snd_pcm_set_ops().
767 * Return: Zero if successful, or a negative error code on failure.
769 int snd_pcm_new(struct snd_card
*card
, const char *id
, int device
,
770 int playback_count
, int capture_count
, struct snd_pcm
**rpcm
)
772 return _snd_pcm_new(card
, id
, device
, playback_count
, capture_count
,
775 EXPORT_SYMBOL(snd_pcm_new
);
778 * snd_pcm_new_internal - create a new internal PCM instance
779 * @card: the card instance
781 * @device: the device index (zero based - shared with normal PCMs)
782 * @playback_count: the number of substreams for playback
783 * @capture_count: the number of substreams for capture
784 * @rpcm: the pointer to store the new pcm instance
786 * Creates a new internal PCM instance with no userspace device or procfs
787 * entries. This is used by ASoC Back End PCMs in order to create a PCM that
788 * will only be used internally by kernel drivers. i.e. it cannot be opened
789 * by userspace. It provides existing ASoC components drivers with a substream
790 * and access to any private data.
792 * The pcm operators have to be set afterwards to the new instance
793 * via snd_pcm_set_ops().
795 * Return: Zero if successful, or a negative error code on failure.
797 int snd_pcm_new_internal(struct snd_card
*card
, const char *id
, int device
,
798 int playback_count
, int capture_count
,
799 struct snd_pcm
**rpcm
)
801 return _snd_pcm_new(card
, id
, device
, playback_count
, capture_count
,
804 EXPORT_SYMBOL(snd_pcm_new_internal
);
806 static void free_chmap(struct snd_pcm_str
*pstr
)
808 if (pstr
->chmap_kctl
) {
809 struct snd_card
*card
= pstr
->pcm
->card
;
811 snd_ctl_remove(card
, pstr
->chmap_kctl
);
812 pstr
->chmap_kctl
= NULL
;
816 static void snd_pcm_free_stream(struct snd_pcm_str
* pstr
)
818 struct snd_pcm_substream
*substream
, *substream_next
;
819 #if IS_ENABLED(CONFIG_SND_PCM_OSS)
820 struct snd_pcm_oss_setup
*setup
, *setupn
;
823 /* free all proc files under the stream */
824 snd_pcm_stream_proc_done(pstr
);
826 substream
= pstr
->substream
;
828 substream_next
= substream
->next
;
829 snd_pcm_timer_done(substream
);
831 substream
= substream_next
;
833 #if IS_ENABLED(CONFIG_SND_PCM_OSS)
834 for (setup
= pstr
->oss
.setup_list
; setup
; setup
= setupn
) {
835 setupn
= setup
->next
;
836 kfree(setup
->task_name
);
841 if (pstr
->substream_count
)
842 put_device(pstr
->dev
);
845 #if IS_ENABLED(CONFIG_SND_PCM_OSS)
846 #define pcm_call_notify(pcm, call) \
848 struct snd_pcm_notify *_notify; \
849 list_for_each_entry(_notify, &snd_pcm_notify_list, list) \
850 _notify->call(pcm); \
853 #define pcm_call_notify(pcm, call) do {} while (0)
856 static int snd_pcm_free(struct snd_pcm
*pcm
)
861 pcm_call_notify(pcm
, n_unregister
);
862 if (pcm
->private_free
)
863 pcm
->private_free(pcm
);
864 snd_pcm_lib_preallocate_free_for_all(pcm
);
865 snd_pcm_free_stream(&pcm
->streams
[SNDRV_PCM_STREAM_PLAYBACK
]);
866 snd_pcm_free_stream(&pcm
->streams
[SNDRV_PCM_STREAM_CAPTURE
]);
871 static int snd_pcm_dev_free(struct snd_device
*device
)
873 struct snd_pcm
*pcm
= device
->device_data
;
874 return snd_pcm_free(pcm
);
877 int snd_pcm_attach_substream(struct snd_pcm
*pcm
, int stream
,
879 struct snd_pcm_substream
**rsubstream
)
881 struct snd_pcm_str
* pstr
;
882 struct snd_pcm_substream
*substream
;
883 struct snd_pcm_runtime
*runtime
;
884 struct snd_card
*card
;
885 int prefer_subdevice
;
888 if (snd_BUG_ON(!pcm
|| !rsubstream
))
890 if (snd_BUG_ON(stream
!= SNDRV_PCM_STREAM_PLAYBACK
&&
891 stream
!= SNDRV_PCM_STREAM_CAPTURE
))
894 pstr
= &pcm
->streams
[stream
];
895 if (pstr
->substream
== NULL
|| pstr
->substream_count
== 0)
899 prefer_subdevice
= snd_ctl_get_preferred_subdevice(card
, SND_CTL_SUBDEV_PCM
);
901 if (pcm
->info_flags
& SNDRV_PCM_INFO_HALF_DUPLEX
) {
902 int opposite
= !stream
;
904 for (substream
= pcm
->streams
[opposite
].substream
; substream
;
905 substream
= substream
->next
) {
906 if (SUBSTREAM_BUSY(substream
))
911 if (file
->f_flags
& O_APPEND
) {
912 if (prefer_subdevice
< 0) {
913 if (pstr
->substream_count
> 1)
914 return -EINVAL
; /* must be unique */
915 substream
= pstr
->substream
;
917 for (substream
= pstr
->substream
; substream
;
918 substream
= substream
->next
)
919 if (substream
->number
== prefer_subdevice
)
924 if (! SUBSTREAM_BUSY(substream
))
926 substream
->ref_count
++;
927 *rsubstream
= substream
;
931 for (substream
= pstr
->substream
; substream
; substream
= substream
->next
) {
932 if (!SUBSTREAM_BUSY(substream
) &&
933 (prefer_subdevice
== -1 ||
934 substream
->number
== prefer_subdevice
))
937 if (substream
== NULL
)
940 runtime
= kzalloc(sizeof(*runtime
), GFP_KERNEL
);
944 size
= PAGE_ALIGN(sizeof(struct snd_pcm_mmap_status
));
945 runtime
->status
= alloc_pages_exact(size
, GFP_KERNEL
);
946 if (runtime
->status
== NULL
) {
950 memset(runtime
->status
, 0, size
);
952 size
= PAGE_ALIGN(sizeof(struct snd_pcm_mmap_control
));
953 runtime
->control
= alloc_pages_exact(size
, GFP_KERNEL
);
954 if (runtime
->control
== NULL
) {
955 free_pages_exact(runtime
->status
,
956 PAGE_ALIGN(sizeof(struct snd_pcm_mmap_status
)));
960 memset(runtime
->control
, 0, size
);
962 init_waitqueue_head(&runtime
->sleep
);
963 init_waitqueue_head(&runtime
->tsleep
);
965 __snd_pcm_set_state(runtime
, SNDRV_PCM_STATE_OPEN
);
966 mutex_init(&runtime
->buffer_mutex
);
967 atomic_set(&runtime
->buffer_accessing
, 0);
969 substream
->runtime
= runtime
;
970 substream
->private_data
= pcm
->private_data
;
971 substream
->ref_count
= 1;
972 substream
->f_flags
= file
->f_flags
;
973 substream
->pid
= get_pid(task_pid(current
));
974 pstr
->substream_opened
++;
975 *rsubstream
= substream
;
976 #ifdef CONFIG_SND_PCM_XRUN_DEBUG
977 substream
->xrun_counter
= 0;
978 #endif /* CONFIG_SND_PCM_XRUN_DEBUG */
982 void snd_pcm_detach_substream(struct snd_pcm_substream
*substream
)
984 struct snd_pcm_runtime
*runtime
;
986 if (PCM_RUNTIME_CHECK(substream
))
988 runtime
= substream
->runtime
;
989 if (runtime
->private_free
!= NULL
)
990 runtime
->private_free(runtime
);
991 free_pages_exact(runtime
->status
,
992 PAGE_ALIGN(sizeof(struct snd_pcm_mmap_status
)));
993 free_pages_exact(runtime
->control
,
994 PAGE_ALIGN(sizeof(struct snd_pcm_mmap_control
)));
995 kfree(runtime
->hw_constraints
.rules
);
996 /* Avoid concurrent access to runtime via PCM timer interface */
997 if (substream
->timer
) {
998 scoped_guard(spinlock_irq
, &substream
->timer
->lock
)
999 substream
->runtime
= NULL
;
1001 substream
->runtime
= NULL
;
1003 mutex_destroy(&runtime
->buffer_mutex
);
1004 snd_fasync_free(runtime
->fasync
);
1006 put_pid(substream
->pid
);
1007 substream
->pid
= NULL
;
1008 substream
->pstr
->substream_opened
--;
1011 static ssize_t
pcm_class_show(struct device
*dev
,
1012 struct device_attribute
*attr
, char *buf
)
1014 struct snd_pcm_str
*pstr
= dev_get_drvdata(dev
);
1015 struct snd_pcm
*pcm
= pstr
->pcm
;
1017 static const char *strs
[SNDRV_PCM_CLASS_LAST
+ 1] = {
1018 [SNDRV_PCM_CLASS_GENERIC
] = "generic",
1019 [SNDRV_PCM_CLASS_MULTI
] = "multi",
1020 [SNDRV_PCM_CLASS_MODEM
] = "modem",
1021 [SNDRV_PCM_CLASS_DIGITIZER
] = "digitizer",
1024 if (pcm
->dev_class
> SNDRV_PCM_CLASS_LAST
)
1027 str
= strs
[pcm
->dev_class
];
1028 return sysfs_emit(buf
, "%s\n", str
);
1031 static DEVICE_ATTR_RO(pcm_class
);
1032 static struct attribute
*pcm_dev_attrs
[] = {
1033 &dev_attr_pcm_class
.attr
,
1037 static const struct attribute_group pcm_dev_attr_group
= {
1038 .attrs
= pcm_dev_attrs
,
1041 static const struct attribute_group
*pcm_dev_attr_groups
[] = {
1042 &pcm_dev_attr_group
,
1046 static int snd_pcm_dev_register(struct snd_device
*device
)
1049 struct snd_pcm_substream
*substream
;
1050 struct snd_pcm
*pcm
;
1052 if (snd_BUG_ON(!device
|| !device
->device_data
))
1054 pcm
= device
->device_data
;
1056 guard(mutex
)(®ister_mutex
);
1057 err
= snd_pcm_add(pcm
);
1060 for (cidx
= 0; cidx
< 2; cidx
++) {
1062 if (pcm
->streams
[cidx
].substream
== NULL
)
1065 case SNDRV_PCM_STREAM_PLAYBACK
:
1066 devtype
= SNDRV_DEVICE_TYPE_PCM_PLAYBACK
;
1068 case SNDRV_PCM_STREAM_CAPTURE
:
1069 devtype
= SNDRV_DEVICE_TYPE_PCM_CAPTURE
;
1073 err
= snd_register_device(devtype
, pcm
->card
, pcm
->device
,
1074 &snd_pcm_f_ops
[cidx
], pcm
,
1075 pcm
->streams
[cidx
].dev
);
1077 list_del_init(&pcm
->list
);
1081 for (substream
= pcm
->streams
[cidx
].substream
; substream
; substream
= substream
->next
)
1082 snd_pcm_timer_init(substream
);
1085 pcm_call_notify(pcm
, n_register
);
1089 static int snd_pcm_dev_disconnect(struct snd_device
*device
)
1091 struct snd_pcm
*pcm
= device
->device_data
;
1092 struct snd_pcm_substream
*substream
;
1095 guard(mutex
)(®ister_mutex
);
1096 guard(mutex
)(&pcm
->open_mutex
);
1097 wake_up(&pcm
->open_wait
);
1098 list_del_init(&pcm
->list
);
1100 for_each_pcm_substream(pcm
, cidx
, substream
) {
1101 snd_pcm_stream_lock_irq(substream
);
1102 if (substream
->runtime
) {
1103 if (snd_pcm_running(substream
))
1104 snd_pcm_stop(substream
, SNDRV_PCM_STATE_DISCONNECTED
);
1105 /* to be sure, set the state unconditionally */
1106 __snd_pcm_set_state(substream
->runtime
,
1107 SNDRV_PCM_STATE_DISCONNECTED
);
1108 wake_up(&substream
->runtime
->sleep
);
1109 wake_up(&substream
->runtime
->tsleep
);
1111 snd_pcm_stream_unlock_irq(substream
);
1114 for_each_pcm_substream(pcm
, cidx
, substream
)
1115 snd_pcm_sync_stop(substream
, false);
1117 pcm_call_notify(pcm
, n_disconnect
);
1118 for (cidx
= 0; cidx
< 2; cidx
++) {
1119 if (pcm
->streams
[cidx
].dev
)
1120 snd_unregister_device(pcm
->streams
[cidx
].dev
);
1121 free_chmap(&pcm
->streams
[cidx
]);
1126 #if IS_ENABLED(CONFIG_SND_PCM_OSS)
1128 * snd_pcm_notify - Add/remove the notify list
1129 * @notify: PCM notify list
1130 * @nfree: 0 = register, 1 = unregister
1132 * This adds the given notifier to the global list so that the callback is
1133 * called for each registered PCM devices. This exists only for PCM OSS
1134 * emulation, so far.
1136 * Return: zero if successful, or a negative error code
1138 int snd_pcm_notify(struct snd_pcm_notify
*notify
, int nfree
)
1140 struct snd_pcm
*pcm
;
1142 if (snd_BUG_ON(!notify
||
1143 !notify
->n_register
||
1144 !notify
->n_unregister
||
1145 !notify
->n_disconnect
))
1147 guard(mutex
)(®ister_mutex
);
1149 list_del(¬ify
->list
);
1150 list_for_each_entry(pcm
, &snd_pcm_devices
, list
)
1151 notify
->n_unregister(pcm
);
1153 list_add_tail(¬ify
->list
, &snd_pcm_notify_list
);
1154 list_for_each_entry(pcm
, &snd_pcm_devices
, list
)
1155 notify
->n_register(pcm
);
1159 EXPORT_SYMBOL(snd_pcm_notify
);
1160 #endif /* CONFIG_SND_PCM_OSS */
1162 #ifdef CONFIG_SND_PROC_FS
1167 static void snd_pcm_proc_read(struct snd_info_entry
*entry
,
1168 struct snd_info_buffer
*buffer
)
1170 struct snd_pcm
*pcm
;
1172 guard(mutex
)(®ister_mutex
);
1173 list_for_each_entry(pcm
, &snd_pcm_devices
, list
) {
1174 snd_iprintf(buffer
, "%02i-%02i: %s : %s",
1175 pcm
->card
->number
, pcm
->device
, pcm
->id
, pcm
->name
);
1176 if (pcm
->streams
[SNDRV_PCM_STREAM_PLAYBACK
].substream
)
1177 snd_iprintf(buffer
, " : playback %i",
1178 pcm
->streams
[SNDRV_PCM_STREAM_PLAYBACK
].substream_count
);
1179 if (pcm
->streams
[SNDRV_PCM_STREAM_CAPTURE
].substream
)
1180 snd_iprintf(buffer
, " : capture %i",
1181 pcm
->streams
[SNDRV_PCM_STREAM_CAPTURE
].substream_count
);
1182 snd_iprintf(buffer
, "\n");
1186 static struct snd_info_entry
*snd_pcm_proc_entry
;
1188 static void snd_pcm_proc_init(void)
1190 struct snd_info_entry
*entry
;
1192 entry
= snd_info_create_module_entry(THIS_MODULE
, "pcm", NULL
);
1194 snd_info_set_text_ops(entry
, NULL
, snd_pcm_proc_read
);
1195 if (snd_info_register(entry
) < 0) {
1196 snd_info_free_entry(entry
);
1200 snd_pcm_proc_entry
= entry
;
1203 static void snd_pcm_proc_done(void)
1205 snd_info_free_entry(snd_pcm_proc_entry
);
1208 #else /* !CONFIG_SND_PROC_FS */
1209 #define snd_pcm_proc_init()
1210 #define snd_pcm_proc_done()
1211 #endif /* CONFIG_SND_PROC_FS */
1218 static int __init
alsa_pcm_init(void)
1220 snd_ctl_register_ioctl(snd_pcm_control_ioctl
);
1221 snd_ctl_register_ioctl_compat(snd_pcm_control_ioctl
);
1222 snd_pcm_proc_init();
1226 static void __exit
alsa_pcm_exit(void)
1228 snd_ctl_unregister_ioctl(snd_pcm_control_ioctl
);
1229 snd_ctl_unregister_ioctl_compat(snd_pcm_control_ioctl
);
1230 snd_pcm_proc_done();
1233 module_init(alsa_pcm_init
)
1234 module_exit(alsa_pcm_exit
)