Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    1) /* SPDX-License-Identifier: GPL-2.0-or-later */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    2) #ifndef __SOUND_PCM_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    3) #define __SOUND_PCM_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    4) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    5) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    6)  *  Digital Audio (PCM) abstract layer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    7)  *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    8)  *                   Abramo Bagnara <abramo@alsa-project.org>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    9)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   10) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   11) #include <sound/asound.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   12) #include <sound/memalloc.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   13) #include <sound/minors.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   14) #include <linux/poll.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   15) #include <linux/mm.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   16) #include <linux/bitops.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   17) #include <linux/pm_qos.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   18) #include <linux/refcount.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   19) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   20) #define snd_pcm_substream_chip(substream) ((substream)->private_data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   21) #define snd_pcm_chip(pcm) ((pcm)->private_data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   22) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   23) #if IS_ENABLED(CONFIG_SND_PCM_OSS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   24) #include <sound/pcm_oss.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   25) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   26) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   27) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   28)  *  Hardware (lowlevel) section
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   29)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   30) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   31) struct snd_pcm_hardware {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   32) 	unsigned int info;		/* SNDRV_PCM_INFO_* */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   33) 	u64 formats;			/* SNDRV_PCM_FMTBIT_* */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   34) 	unsigned int rates;		/* SNDRV_PCM_RATE_* */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   35) 	unsigned int rate_min;		/* min rate */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   36) 	unsigned int rate_max;		/* max rate */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   37) 	unsigned int channels_min;	/* min channels */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   38) 	unsigned int channels_max;	/* max channels */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   39) 	size_t buffer_bytes_max;	/* max buffer size */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   40) 	size_t period_bytes_min;	/* min period size */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   41) 	size_t period_bytes_max;	/* max period size */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   42) 	unsigned int periods_min;	/* min # of periods */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   43) 	unsigned int periods_max;	/* max # of periods */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   44) 	size_t fifo_size;		/* fifo size in bytes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   45) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   46) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   47) struct snd_pcm_status64;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   48) struct snd_pcm_substream;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   49) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   50) struct snd_pcm_audio_tstamp_config; /* definitions further down */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   51) struct snd_pcm_audio_tstamp_report;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   52) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   53) struct snd_pcm_ops {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   54) 	int (*open)(struct snd_pcm_substream *substream);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   55) 	int (*close)(struct snd_pcm_substream *substream);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   56) 	int (*ioctl)(struct snd_pcm_substream * substream,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   57) 		     unsigned int cmd, void *arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   58) 	int (*hw_params)(struct snd_pcm_substream *substream,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   59) 			 struct snd_pcm_hw_params *params);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   60) 	int (*hw_free)(struct snd_pcm_substream *substream);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   61) 	int (*prepare)(struct snd_pcm_substream *substream);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   62) 	int (*trigger)(struct snd_pcm_substream *substream, int cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   63) 	int (*sync_stop)(struct snd_pcm_substream *substream);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   64) 	snd_pcm_uframes_t (*pointer)(struct snd_pcm_substream *substream);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   65) 	int (*get_time_info)(struct snd_pcm_substream *substream,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   66) 			struct timespec64 *system_ts, struct timespec64 *audio_ts,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   67) 			struct snd_pcm_audio_tstamp_config *audio_tstamp_config,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   68) 			struct snd_pcm_audio_tstamp_report *audio_tstamp_report);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   69) 	int (*fill_silence)(struct snd_pcm_substream *substream, int channel,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   70) 			    unsigned long pos, unsigned long bytes);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   71) 	int (*copy_user)(struct snd_pcm_substream *substream, int channel,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   72) 			 unsigned long pos, void __user *buf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   73) 			 unsigned long bytes);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   74) 	int (*copy_kernel)(struct snd_pcm_substream *substream, int channel,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   75) 			   unsigned long pos, void *buf, unsigned long bytes);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   76) 	struct page *(*page)(struct snd_pcm_substream *substream,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   77) 			     unsigned long offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   78) 	int (*mmap)(struct snd_pcm_substream *substream, struct vm_area_struct *vma);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   79) 	int (*ack)(struct snd_pcm_substream *substream);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   80) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   81) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   82) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   83)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   84)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   85) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   86) #if defined(CONFIG_SND_DYNAMIC_MINORS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   87) #define SNDRV_PCM_DEVICES	(SNDRV_OS_MINORS-2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   88) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   89) #define SNDRV_PCM_DEVICES	8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   90) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   91) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   92) #define SNDRV_PCM_IOCTL1_RESET		0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   93) /* 1 is absent slot. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   94) #define SNDRV_PCM_IOCTL1_CHANNEL_INFO	2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   95) /* 3 is absent slot. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   96) #define SNDRV_PCM_IOCTL1_FIFO_SIZE	4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   97) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   98) #define SNDRV_PCM_TRIGGER_STOP		0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   99) #define SNDRV_PCM_TRIGGER_START		1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  100) #define SNDRV_PCM_TRIGGER_PAUSE_PUSH	3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  101) #define SNDRV_PCM_TRIGGER_PAUSE_RELEASE	4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  102) #define SNDRV_PCM_TRIGGER_SUSPEND	5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  103) #define SNDRV_PCM_TRIGGER_RESUME	6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  104) #define SNDRV_PCM_TRIGGER_DRAIN		7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  105) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  106) #define SNDRV_PCM_POS_XRUN		((snd_pcm_uframes_t)-1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  107) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  108) /* If you change this don't forget to change rates[] table in pcm_native.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  109) #define SNDRV_PCM_RATE_5512		(1<<0)		/* 5512Hz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  110) #define SNDRV_PCM_RATE_8000		(1<<1)		/* 8000Hz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  111) #define SNDRV_PCM_RATE_11025		(1<<2)		/* 11025Hz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  112) #define SNDRV_PCM_RATE_16000		(1<<3)		/* 16000Hz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  113) #define SNDRV_PCM_RATE_22050		(1<<4)		/* 22050Hz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  114) #define SNDRV_PCM_RATE_32000		(1<<5)		/* 32000Hz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  115) #define SNDRV_PCM_RATE_44100		(1<<6)		/* 44100Hz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  116) #define SNDRV_PCM_RATE_48000		(1<<7)		/* 48000Hz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  117) #define SNDRV_PCM_RATE_64000		(1<<8)		/* 64000Hz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  118) #define SNDRV_PCM_RATE_88200		(1<<9)		/* 88200Hz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  119) #define SNDRV_PCM_RATE_96000		(1<<10)		/* 96000Hz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  120) #define SNDRV_PCM_RATE_176400		(1<<11)		/* 176400Hz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  121) #define SNDRV_PCM_RATE_192000		(1<<12)		/* 192000Hz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  122) #define SNDRV_PCM_RATE_352800		(1<<13)		/* 352800Hz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  123) #define SNDRV_PCM_RATE_384000		(1<<14)		/* 384000Hz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  124) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  125) #define SNDRV_PCM_RATE_CONTINUOUS	(1<<30)		/* continuous range */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  126) #define SNDRV_PCM_RATE_KNOT		(1<<31)		/* supports more non-continuos rates */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  127) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  128) #define SNDRV_PCM_RATE_8000_44100	(SNDRV_PCM_RATE_8000|SNDRV_PCM_RATE_11025|\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  129) 					 SNDRV_PCM_RATE_16000|SNDRV_PCM_RATE_22050|\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  130) 					 SNDRV_PCM_RATE_32000|SNDRV_PCM_RATE_44100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  131) #define SNDRV_PCM_RATE_8000_48000	(SNDRV_PCM_RATE_8000_44100|SNDRV_PCM_RATE_48000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  132) #define SNDRV_PCM_RATE_8000_96000	(SNDRV_PCM_RATE_8000_48000|SNDRV_PCM_RATE_64000|\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  133) 					 SNDRV_PCM_RATE_88200|SNDRV_PCM_RATE_96000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  134) #define SNDRV_PCM_RATE_8000_192000	(SNDRV_PCM_RATE_8000_96000|SNDRV_PCM_RATE_176400|\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  135) 					 SNDRV_PCM_RATE_192000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  136) #define SNDRV_PCM_RATE_8000_384000	(SNDRV_PCM_RATE_8000_192000|\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  137) 					 SNDRV_PCM_RATE_352800|\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  138) 					 SNDRV_PCM_RATE_384000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  139) #define _SNDRV_PCM_FMTBIT(fmt)		(1ULL << (__force int)SNDRV_PCM_FORMAT_##fmt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  140) #define SNDRV_PCM_FMTBIT_S8		_SNDRV_PCM_FMTBIT(S8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  141) #define SNDRV_PCM_FMTBIT_U8		_SNDRV_PCM_FMTBIT(U8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  142) #define SNDRV_PCM_FMTBIT_S16_LE		_SNDRV_PCM_FMTBIT(S16_LE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  143) #define SNDRV_PCM_FMTBIT_S16_BE		_SNDRV_PCM_FMTBIT(S16_BE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  144) #define SNDRV_PCM_FMTBIT_U16_LE		_SNDRV_PCM_FMTBIT(U16_LE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  145) #define SNDRV_PCM_FMTBIT_U16_BE		_SNDRV_PCM_FMTBIT(U16_BE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  146) #define SNDRV_PCM_FMTBIT_S24_LE		_SNDRV_PCM_FMTBIT(S24_LE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  147) #define SNDRV_PCM_FMTBIT_S24_BE		_SNDRV_PCM_FMTBIT(S24_BE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  148) #define SNDRV_PCM_FMTBIT_U24_LE		_SNDRV_PCM_FMTBIT(U24_LE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  149) #define SNDRV_PCM_FMTBIT_U24_BE		_SNDRV_PCM_FMTBIT(U24_BE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  150) #define SNDRV_PCM_FMTBIT_S32_LE		_SNDRV_PCM_FMTBIT(S32_LE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  151) #define SNDRV_PCM_FMTBIT_S32_BE		_SNDRV_PCM_FMTBIT(S32_BE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  152) #define SNDRV_PCM_FMTBIT_U32_LE		_SNDRV_PCM_FMTBIT(U32_LE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  153) #define SNDRV_PCM_FMTBIT_U32_BE		_SNDRV_PCM_FMTBIT(U32_BE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  154) #define SNDRV_PCM_FMTBIT_FLOAT_LE	_SNDRV_PCM_FMTBIT(FLOAT_LE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  155) #define SNDRV_PCM_FMTBIT_FLOAT_BE	_SNDRV_PCM_FMTBIT(FLOAT_BE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  156) #define SNDRV_PCM_FMTBIT_FLOAT64_LE	_SNDRV_PCM_FMTBIT(FLOAT64_LE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  157) #define SNDRV_PCM_FMTBIT_FLOAT64_BE	_SNDRV_PCM_FMTBIT(FLOAT64_BE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  158) #define SNDRV_PCM_FMTBIT_IEC958_SUBFRAME_LE _SNDRV_PCM_FMTBIT(IEC958_SUBFRAME_LE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  159) #define SNDRV_PCM_FMTBIT_IEC958_SUBFRAME_BE _SNDRV_PCM_FMTBIT(IEC958_SUBFRAME_BE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  160) #define SNDRV_PCM_FMTBIT_MU_LAW		_SNDRV_PCM_FMTBIT(MU_LAW)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  161) #define SNDRV_PCM_FMTBIT_A_LAW		_SNDRV_PCM_FMTBIT(A_LAW)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  162) #define SNDRV_PCM_FMTBIT_IMA_ADPCM	_SNDRV_PCM_FMTBIT(IMA_ADPCM)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  163) #define SNDRV_PCM_FMTBIT_MPEG		_SNDRV_PCM_FMTBIT(MPEG)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  164) #define SNDRV_PCM_FMTBIT_GSM		_SNDRV_PCM_FMTBIT(GSM)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  165) #define SNDRV_PCM_FMTBIT_S20_LE	_SNDRV_PCM_FMTBIT(S20_LE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  166) #define SNDRV_PCM_FMTBIT_U20_LE	_SNDRV_PCM_FMTBIT(U20_LE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  167) #define SNDRV_PCM_FMTBIT_S20_BE	_SNDRV_PCM_FMTBIT(S20_BE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  168) #define SNDRV_PCM_FMTBIT_U20_BE	_SNDRV_PCM_FMTBIT(U20_BE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  169) #define SNDRV_PCM_FMTBIT_SPECIAL	_SNDRV_PCM_FMTBIT(SPECIAL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  170) #define SNDRV_PCM_FMTBIT_S24_3LE	_SNDRV_PCM_FMTBIT(S24_3LE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  171) #define SNDRV_PCM_FMTBIT_U24_3LE	_SNDRV_PCM_FMTBIT(U24_3LE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  172) #define SNDRV_PCM_FMTBIT_S24_3BE	_SNDRV_PCM_FMTBIT(S24_3BE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  173) #define SNDRV_PCM_FMTBIT_U24_3BE	_SNDRV_PCM_FMTBIT(U24_3BE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  174) #define SNDRV_PCM_FMTBIT_S20_3LE	_SNDRV_PCM_FMTBIT(S20_3LE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  175) #define SNDRV_PCM_FMTBIT_U20_3LE	_SNDRV_PCM_FMTBIT(U20_3LE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  176) #define SNDRV_PCM_FMTBIT_S20_3BE	_SNDRV_PCM_FMTBIT(S20_3BE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  177) #define SNDRV_PCM_FMTBIT_U20_3BE	_SNDRV_PCM_FMTBIT(U20_3BE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  178) #define SNDRV_PCM_FMTBIT_S18_3LE	_SNDRV_PCM_FMTBIT(S18_3LE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  179) #define SNDRV_PCM_FMTBIT_U18_3LE	_SNDRV_PCM_FMTBIT(U18_3LE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  180) #define SNDRV_PCM_FMTBIT_S18_3BE	_SNDRV_PCM_FMTBIT(S18_3BE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  181) #define SNDRV_PCM_FMTBIT_U18_3BE	_SNDRV_PCM_FMTBIT(U18_3BE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  182) #define SNDRV_PCM_FMTBIT_G723_24	_SNDRV_PCM_FMTBIT(G723_24)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  183) #define SNDRV_PCM_FMTBIT_G723_24_1B	_SNDRV_PCM_FMTBIT(G723_24_1B)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  184) #define SNDRV_PCM_FMTBIT_G723_40	_SNDRV_PCM_FMTBIT(G723_40)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  185) #define SNDRV_PCM_FMTBIT_G723_40_1B	_SNDRV_PCM_FMTBIT(G723_40_1B)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  186) #define SNDRV_PCM_FMTBIT_DSD_U8		_SNDRV_PCM_FMTBIT(DSD_U8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  187) #define SNDRV_PCM_FMTBIT_DSD_U16_LE	_SNDRV_PCM_FMTBIT(DSD_U16_LE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  188) #define SNDRV_PCM_FMTBIT_DSD_U32_LE	_SNDRV_PCM_FMTBIT(DSD_U32_LE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  189) #define SNDRV_PCM_FMTBIT_DSD_U16_BE	_SNDRV_PCM_FMTBIT(DSD_U16_BE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  190) #define SNDRV_PCM_FMTBIT_DSD_U32_BE	_SNDRV_PCM_FMTBIT(DSD_U32_BE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  191) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  192) #ifdef SNDRV_LITTLE_ENDIAN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  193) #define SNDRV_PCM_FMTBIT_S16		SNDRV_PCM_FMTBIT_S16_LE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  194) #define SNDRV_PCM_FMTBIT_U16		SNDRV_PCM_FMTBIT_U16_LE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  195) #define SNDRV_PCM_FMTBIT_S24		SNDRV_PCM_FMTBIT_S24_LE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  196) #define SNDRV_PCM_FMTBIT_U24		SNDRV_PCM_FMTBIT_U24_LE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  197) #define SNDRV_PCM_FMTBIT_S32		SNDRV_PCM_FMTBIT_S32_LE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  198) #define SNDRV_PCM_FMTBIT_U32		SNDRV_PCM_FMTBIT_U32_LE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  199) #define SNDRV_PCM_FMTBIT_FLOAT		SNDRV_PCM_FMTBIT_FLOAT_LE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  200) #define SNDRV_PCM_FMTBIT_FLOAT64	SNDRV_PCM_FMTBIT_FLOAT64_LE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  201) #define SNDRV_PCM_FMTBIT_IEC958_SUBFRAME SNDRV_PCM_FMTBIT_IEC958_SUBFRAME_LE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  202) #define SNDRV_PCM_FMTBIT_S20		SNDRV_PCM_FMTBIT_S20_LE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  203) #define SNDRV_PCM_FMTBIT_U20		SNDRV_PCM_FMTBIT_U20_LE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  204) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  205) #ifdef SNDRV_BIG_ENDIAN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  206) #define SNDRV_PCM_FMTBIT_S16		SNDRV_PCM_FMTBIT_S16_BE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  207) #define SNDRV_PCM_FMTBIT_U16		SNDRV_PCM_FMTBIT_U16_BE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  208) #define SNDRV_PCM_FMTBIT_S24		SNDRV_PCM_FMTBIT_S24_BE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  209) #define SNDRV_PCM_FMTBIT_U24		SNDRV_PCM_FMTBIT_U24_BE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  210) #define SNDRV_PCM_FMTBIT_S32		SNDRV_PCM_FMTBIT_S32_BE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  211) #define SNDRV_PCM_FMTBIT_U32		SNDRV_PCM_FMTBIT_U32_BE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  212) #define SNDRV_PCM_FMTBIT_FLOAT		SNDRV_PCM_FMTBIT_FLOAT_BE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  213) #define SNDRV_PCM_FMTBIT_FLOAT64	SNDRV_PCM_FMTBIT_FLOAT64_BE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  214) #define SNDRV_PCM_FMTBIT_IEC958_SUBFRAME SNDRV_PCM_FMTBIT_IEC958_SUBFRAME_BE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  215) #define SNDRV_PCM_FMTBIT_S20		SNDRV_PCM_FMTBIT_S20_BE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  216) #define SNDRV_PCM_FMTBIT_U20		SNDRV_PCM_FMTBIT_U20_BE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  217) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  218) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  219) struct snd_pcm_file {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  220) 	struct snd_pcm_substream *substream;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  221) 	int no_compat_mmap;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  222) 	unsigned int user_pversion;	/* supported protocol version */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  223) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  224) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  225) struct snd_pcm_hw_rule;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  226) typedef int (*snd_pcm_hw_rule_func_t)(struct snd_pcm_hw_params *params,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  227) 				      struct snd_pcm_hw_rule *rule);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  228) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  229) struct snd_pcm_hw_rule {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  230) 	unsigned int cond;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  231) 	int var;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  232) 	int deps[4];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  233) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  234) 	snd_pcm_hw_rule_func_t func;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  235) 	void *private;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  236) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  237) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  238) struct snd_pcm_hw_constraints {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  239) 	struct snd_mask masks[SNDRV_PCM_HW_PARAM_LAST_MASK - 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  240) 			 SNDRV_PCM_HW_PARAM_FIRST_MASK + 1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  241) 	struct snd_interval intervals[SNDRV_PCM_HW_PARAM_LAST_INTERVAL -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  242) 			     SNDRV_PCM_HW_PARAM_FIRST_INTERVAL + 1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  243) 	unsigned int rules_num;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  244) 	unsigned int rules_all;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  245) 	struct snd_pcm_hw_rule *rules;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  246) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  247) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  248) static inline struct snd_mask *constrs_mask(struct snd_pcm_hw_constraints *constrs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  249) 					    snd_pcm_hw_param_t var)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  250) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  251) 	return &constrs->masks[var - SNDRV_PCM_HW_PARAM_FIRST_MASK];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  252) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  253) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  254) static inline struct snd_interval *constrs_interval(struct snd_pcm_hw_constraints *constrs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  255) 						    snd_pcm_hw_param_t var)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  256) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  257) 	return &constrs->intervals[var - SNDRV_PCM_HW_PARAM_FIRST_INTERVAL];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  258) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  259) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  260) struct snd_ratnum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  261) 	unsigned int num;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  262) 	unsigned int den_min, den_max, den_step;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  263) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  264) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  265) struct snd_ratden {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  266) 	unsigned int num_min, num_max, num_step;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  267) 	unsigned int den;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  268) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  269) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  270) struct snd_pcm_hw_constraint_ratnums {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  271) 	int nrats;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  272) 	const struct snd_ratnum *rats;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  273) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  274) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  275) struct snd_pcm_hw_constraint_ratdens {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  276) 	int nrats;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  277) 	const struct snd_ratden *rats;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  278) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  279) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  280) struct snd_pcm_hw_constraint_list {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  281) 	const unsigned int *list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  282) 	unsigned int count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  283) 	unsigned int mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  284) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  285) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  286) struct snd_pcm_hw_constraint_ranges {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  287) 	unsigned int count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  288) 	const struct snd_interval *ranges;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  289) 	unsigned int mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  290) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  291) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  292) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  293)  * userspace-provided audio timestamp config to kernel,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  294)  * structure is for internal use only and filled with dedicated unpack routine
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  295)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  296) struct snd_pcm_audio_tstamp_config {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  297) 	/* 5 of max 16 bits used */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  298) 	u32 type_requested:4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  299) 	u32 report_delay:1; /* add total delay to A/D or D/A */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  300) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  301) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  302) static inline void snd_pcm_unpack_audio_tstamp_config(__u32 data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  303) 						struct snd_pcm_audio_tstamp_config *config)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  304) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  305) 	config->type_requested = data & 0xF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  306) 	config->report_delay = (data >> 4) & 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  307) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  308) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  309) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  310)  * kernel-provided audio timestamp report to user-space
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  311)  * structure is for internal use only and read by dedicated pack routine
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  312)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  313) struct snd_pcm_audio_tstamp_report {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  314) 	/* 6 of max 16 bits used for bit-fields */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  315) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  316) 	/* for backwards compatibility */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  317) 	u32 valid:1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  318) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  319) 	/* actual type if hardware could not support requested timestamp */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  320) 	u32 actual_type:4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  321) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  322) 	/* accuracy represented in ns units */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  323) 	u32 accuracy_report:1; /* 0 if accuracy unknown, 1 if accuracy field is valid */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  324) 	u32 accuracy; /* up to 4.29s, will be packed in separate field  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  325) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  326) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  327) static inline void snd_pcm_pack_audio_tstamp_report(__u32 *data, __u32 *accuracy,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  328) 						const struct snd_pcm_audio_tstamp_report *report)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  329) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  330) 	u32 tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  331) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  332) 	tmp = report->accuracy_report;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  333) 	tmp <<= 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  334) 	tmp |= report->actual_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  335) 	tmp <<= 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  336) 	tmp |= report->valid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  337) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  338) 	*data &= 0xffff; /* zero-clear MSBs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  339) 	*data |= (tmp << 16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  340) 	*accuracy = report->accuracy;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  341) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  342) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  343) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  344) struct snd_pcm_runtime {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  345) 	/* -- Status -- */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  346) 	struct snd_pcm_substream *trigger_master;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  347) 	struct timespec64 trigger_tstamp;	/* trigger timestamp */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  348) 	bool trigger_tstamp_latched;     /* trigger timestamp latched in low-level driver/hardware */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  349) 	int overrange;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  350) 	snd_pcm_uframes_t avail_max;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  351) 	snd_pcm_uframes_t hw_ptr_base;	/* Position at buffer restart */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  352) 	snd_pcm_uframes_t hw_ptr_interrupt; /* Position at interrupt time */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  353) 	unsigned long hw_ptr_jiffies;	/* Time when hw_ptr is updated */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  354) 	unsigned long hw_ptr_buffer_jiffies; /* buffer time in jiffies */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  355) 	snd_pcm_sframes_t delay;	/* extra delay; typically FIFO size */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  356) 	u64 hw_ptr_wrap;                /* offset for hw_ptr due to boundary wrap-around */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  357) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  358) 	/* -- HW params -- */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  359) 	snd_pcm_access_t access;	/* access mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  360) 	snd_pcm_format_t format;	/* SNDRV_PCM_FORMAT_* */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  361) 	snd_pcm_subformat_t subformat;	/* subformat */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  362) 	unsigned int rate;		/* rate in Hz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  363) 	unsigned int channels;		/* channels */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  364) 	snd_pcm_uframes_t period_size;	/* period size */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  365) 	unsigned int periods;		/* periods */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  366) 	snd_pcm_uframes_t buffer_size;	/* buffer size */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  367) 	snd_pcm_uframes_t min_align;	/* Min alignment for the format */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  368) 	size_t byte_align;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  369) 	unsigned int frame_bits;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  370) 	unsigned int sample_bits;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  371) 	unsigned int info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  372) 	unsigned int rate_num;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  373) 	unsigned int rate_den;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  374) 	unsigned int no_period_wakeup: 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  375) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  376) 	/* -- SW params -- */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  377) 	int tstamp_mode;		/* mmap timestamp is updated */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  378)   	unsigned int period_step;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  379) 	snd_pcm_uframes_t start_threshold;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  380) 	snd_pcm_uframes_t stop_threshold;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  381) 	snd_pcm_uframes_t silence_threshold; /* Silence filling happens when
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  382) 						noise is nearest than this */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  383) 	snd_pcm_uframes_t silence_size;	/* Silence filling size */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  384) 	snd_pcm_uframes_t boundary;	/* pointers wrap point */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  385) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  386) 	snd_pcm_uframes_t silence_start; /* starting pointer to silence area */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  387) 	snd_pcm_uframes_t silence_filled; /* size filled with silence */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  388) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  389) 	union snd_pcm_sync_id sync;	/* hardware synchronization ID */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  390) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  391) 	/* -- mmap -- */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  392) 	struct snd_pcm_mmap_status *status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  393) 	struct snd_pcm_mmap_control *control;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  394) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  395) 	/* -- locking / scheduling -- */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  396) 	snd_pcm_uframes_t twake; 	/* do transfer (!poll) wakeup if non-zero */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  397) 	wait_queue_head_t sleep;	/* poll sleep */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  398) 	wait_queue_head_t tsleep;	/* transfer sleep */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  399) 	struct fasync_struct *fasync;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  400) 	bool stop_operating;		/* sync_stop will be called */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  401) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  402) 	/* -- private section -- */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  403) 	void *private_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  404) 	void (*private_free)(struct snd_pcm_runtime *runtime);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  405) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  406) 	/* -- hardware description -- */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  407) 	struct snd_pcm_hardware hw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  408) 	struct snd_pcm_hw_constraints hw_constraints;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  409) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  410) 	/* -- timer -- */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  411) 	unsigned int timer_resolution;	/* timer resolution */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  412) 	int tstamp_type;		/* timestamp type */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  413) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  414) 	/* -- DMA -- */           
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  415) 	unsigned char *dma_area;	/* DMA area */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  416) 	dma_addr_t dma_addr;		/* physical bus address (not accessible from main CPU) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  417) 	size_t dma_bytes;		/* size of DMA area */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  418) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  419) 	struct snd_dma_buffer *dma_buffer_p;	/* allocated buffer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  420) 	unsigned int buffer_changed:1;	/* buffer allocation changed; set only in managed mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  421) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  422) 	/* -- audio timestamp config -- */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  423) 	struct snd_pcm_audio_tstamp_config audio_tstamp_config;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  424) 	struct snd_pcm_audio_tstamp_report audio_tstamp_report;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  425) 	struct timespec64 driver_tstamp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  426) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  427) #if IS_ENABLED(CONFIG_SND_PCM_OSS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  428) 	/* -- OSS things -- */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  429) 	struct snd_pcm_oss_runtime oss;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  430) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  431) #ifndef __GENKSYMS__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  432) 	struct mutex buffer_mutex;	/* protect for buffer changes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  433) 	atomic_t buffer_accessing;	/* >0: in r/w operation, <0: blocked */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  434) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  435) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  436) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  437) struct snd_pcm_group {		/* keep linked substreams */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  438) 	spinlock_t lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  439) 	struct mutex mutex;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  440) 	struct list_head substreams;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  441) 	refcount_t refs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  442) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  443) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  444) struct pid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  445) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  446) struct snd_pcm_substream {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  447) 	struct snd_pcm *pcm;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  448) 	struct snd_pcm_str *pstr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  449) 	void *private_data;		/* copied from pcm->private_data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  450) 	int number;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  451) 	char name[32];			/* substream name */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  452) 	int stream;			/* stream (direction) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  453) 	struct pm_qos_request latency_pm_qos_req; /* pm_qos request */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  454) 	size_t buffer_bytes_max;	/* limit ring buffer size */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  455) 	struct snd_dma_buffer dma_buffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  456) 	size_t dma_max;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  457) 	/* -- hardware operations -- */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  458) 	const struct snd_pcm_ops *ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  459) 	/* -- runtime information -- */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  460) 	struct snd_pcm_runtime *runtime;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  461)         /* -- timer section -- */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  462) 	struct snd_timer *timer;		/* timer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  463) 	unsigned timer_running: 1;	/* time is running */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  464) 	long wait_time;	/* time in ms for R/W to wait for avail */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  465) 	/* -- next substream -- */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  466) 	struct snd_pcm_substream *next;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  467) 	/* -- linked substreams -- */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  468) 	struct list_head link_list;	/* linked list member */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  469) 	struct snd_pcm_group self_group;	/* fake group for non linked substream (with substream lock inside) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  470) 	struct snd_pcm_group *group;		/* pointer to current group */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  471) 	/* -- assigned files -- */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  472) 	int ref_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  473) 	atomic_t mmap_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  474) 	unsigned int f_flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  475) 	void (*pcm_release)(struct snd_pcm_substream *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  476) 	struct pid *pid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  477) #if IS_ENABLED(CONFIG_SND_PCM_OSS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  478) 	/* -- OSS things -- */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  479) 	struct snd_pcm_oss_substream oss;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  480) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  481) #ifdef CONFIG_SND_VERBOSE_PROCFS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  482) 	struct snd_info_entry *proc_root;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  483) #endif /* CONFIG_SND_VERBOSE_PROCFS */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  484) 	/* misc flags */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  485) 	unsigned int hw_opened: 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  486) 	unsigned int managed_buffer_alloc:1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  487) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  488) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  489) #define SUBSTREAM_BUSY(substream) ((substream)->ref_count > 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  490) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  491) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  492) struct snd_pcm_str {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  493) 	int stream;				/* stream (direction) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  494) 	struct snd_pcm *pcm;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  495) 	/* -- substreams -- */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  496) 	unsigned int substream_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  497) 	unsigned int substream_opened;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  498) 	struct snd_pcm_substream *substream;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  499) #if IS_ENABLED(CONFIG_SND_PCM_OSS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  500) 	/* -- OSS things -- */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  501) 	struct snd_pcm_oss_stream oss;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  502) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  503) #ifdef CONFIG_SND_VERBOSE_PROCFS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  504) 	struct snd_info_entry *proc_root;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  505) #ifdef CONFIG_SND_PCM_XRUN_DEBUG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  506) 	unsigned int xrun_debug;	/* 0 = disabled, 1 = verbose, 2 = stacktrace */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  507) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  508) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  509) 	struct snd_kcontrol *chmap_kctl; /* channel-mapping controls */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  510) 	struct device dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  511) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  512) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  513) struct snd_pcm {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  514) 	struct snd_card *card;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  515) 	struct list_head list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  516) 	int device; /* device number */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  517) 	unsigned int info_flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  518) 	unsigned short dev_class;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  519) 	unsigned short dev_subclass;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  520) 	char id[64];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  521) 	char name[80];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  522) 	struct snd_pcm_str streams[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  523) 	struct mutex open_mutex;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  524) 	wait_queue_head_t open_wait;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  525) 	void *private_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  526) 	void (*private_free) (struct snd_pcm *pcm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  527) 	bool internal; /* pcm is for internal use only */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  528) 	bool nonatomic; /* whole PCM operations are in non-atomic context */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  529) 	bool no_device_suspend; /* don't invoke device PM suspend */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  530) #if IS_ENABLED(CONFIG_SND_PCM_OSS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  531) 	struct snd_pcm_oss oss;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  532) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  533) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  534) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  535) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  536)  *  Registering
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  537)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  538) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  539) extern const struct file_operations snd_pcm_f_ops[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  540) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  541) int snd_pcm_new(struct snd_card *card, const char *id, int device,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  542) 		int playback_count, int capture_count,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  543) 		struct snd_pcm **rpcm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  544) int snd_pcm_new_internal(struct snd_card *card, const char *id, int device,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  545) 		int playback_count, int capture_count,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  546) 		struct snd_pcm **rpcm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  547) int snd_pcm_new_stream(struct snd_pcm *pcm, int stream, int substream_count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  548) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  549) #if IS_ENABLED(CONFIG_SND_PCM_OSS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  550) struct snd_pcm_notify {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  551) 	int (*n_register) (struct snd_pcm * pcm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  552) 	int (*n_disconnect) (struct snd_pcm * pcm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  553) 	int (*n_unregister) (struct snd_pcm * pcm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  554) 	struct list_head list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  555) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  556) int snd_pcm_notify(struct snd_pcm_notify *notify, int nfree);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  557) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  558) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  559) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  560)  *  Native I/O
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  561)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  562) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  563) int snd_pcm_info(struct snd_pcm_substream *substream, struct snd_pcm_info *info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  564) int snd_pcm_info_user(struct snd_pcm_substream *substream,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  565) 		      struct snd_pcm_info __user *info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  566) int snd_pcm_status64(struct snd_pcm_substream *substream,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  567) 		     struct snd_pcm_status64 *status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  568) int snd_pcm_start(struct snd_pcm_substream *substream);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  569) int snd_pcm_stop(struct snd_pcm_substream *substream, snd_pcm_state_t status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  570) int snd_pcm_drain_done(struct snd_pcm_substream *substream);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  571) int snd_pcm_stop_xrun(struct snd_pcm_substream *substream);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  572) #ifdef CONFIG_PM
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  573) int snd_pcm_suspend_all(struct snd_pcm *pcm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  574) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  575) static inline int snd_pcm_suspend_all(struct snd_pcm *pcm)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  576) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  577) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  578) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  579) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  580) int snd_pcm_kernel_ioctl(struct snd_pcm_substream *substream, unsigned int cmd, void *arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  581) int snd_pcm_open_substream(struct snd_pcm *pcm, int stream, struct file *file,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  582) 			   struct snd_pcm_substream **rsubstream);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  583) void snd_pcm_release_substream(struct snd_pcm_substream *substream);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  584) int snd_pcm_attach_substream(struct snd_pcm *pcm, int stream, struct file *file,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  585) 			     struct snd_pcm_substream **rsubstream);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  586) void snd_pcm_detach_substream(struct snd_pcm_substream *substream);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  587) int snd_pcm_mmap_data(struct snd_pcm_substream *substream, struct file *file, struct vm_area_struct *area);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  588) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  589) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  590) #ifdef CONFIG_SND_DEBUG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  591) void snd_pcm_debug_name(struct snd_pcm_substream *substream,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  592) 			   char *name, size_t len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  593) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  594) static inline void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  595) snd_pcm_debug_name(struct snd_pcm_substream *substream, char *buf, size_t size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  596) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  597) 	*buf = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  598) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  599) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  600) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  601) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  602)  *  PCM library
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  603)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  604) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  605) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  606)  * snd_pcm_stream_linked - Check whether the substream is linked with others
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  607)  * @substream: substream to check
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  608)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  609)  * Returns true if the given substream is being linked with others.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  610)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  611) static inline int snd_pcm_stream_linked(struct snd_pcm_substream *substream)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  612) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  613) 	return substream->group != &substream->self_group;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  614) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  615) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  616) void snd_pcm_stream_lock(struct snd_pcm_substream *substream);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  617) void snd_pcm_stream_unlock(struct snd_pcm_substream *substream);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  618) void snd_pcm_stream_lock_irq(struct snd_pcm_substream *substream);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  619) void snd_pcm_stream_unlock_irq(struct snd_pcm_substream *substream);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  620) unsigned long _snd_pcm_stream_lock_irqsave(struct snd_pcm_substream *substream);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  621) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  622) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  623)  * snd_pcm_stream_lock_irqsave - Lock the PCM stream
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  624)  * @substream: PCM substream
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  625)  * @flags: irq flags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  626)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  627)  * This locks the PCM stream like snd_pcm_stream_lock() but with the local
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  628)  * IRQ (only when nonatomic is false).  In nonatomic case, this is identical
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  629)  * as snd_pcm_stream_lock().
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  630)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  631) #define snd_pcm_stream_lock_irqsave(substream, flags)		 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  632) 	do {							 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  633) 		typecheck(unsigned long, flags);		 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  634) 		flags = _snd_pcm_stream_lock_irqsave(substream); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  635) 	} while (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  636) void snd_pcm_stream_unlock_irqrestore(struct snd_pcm_substream *substream,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  637) 				      unsigned long flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  638) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  639) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  640)  * snd_pcm_group_for_each_entry - iterate over the linked substreams
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  641)  * @s: the iterator
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  642)  * @substream: the substream
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  643)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  644)  * Iterate over the all linked substreams to the given @substream.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  645)  * When @substream isn't linked with any others, this gives returns @substream
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  646)  * itself once.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  647)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  648) #define snd_pcm_group_for_each_entry(s, substream) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  649) 	list_for_each_entry(s, &substream->group->substreams, link_list)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  650) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  651) #define for_each_pcm_streams(stream)			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  652) 	for (stream  = SNDRV_PCM_STREAM_PLAYBACK;	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  653) 	     stream <= SNDRV_PCM_STREAM_LAST;		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  654) 	     stream++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  655) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  656) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  657)  * snd_pcm_running - Check whether the substream is in a running state
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  658)  * @substream: substream to check
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  659)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  660)  * Returns true if the given substream is in the state RUNNING, or in the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  661)  * state DRAINING for playback.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  662)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  663) static inline int snd_pcm_running(struct snd_pcm_substream *substream)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  664) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  665) 	return (substream->runtime->status->state == SNDRV_PCM_STATE_RUNNING ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  666) 		(substream->runtime->status->state == SNDRV_PCM_STATE_DRAINING &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  667) 		 substream->stream == SNDRV_PCM_STREAM_PLAYBACK));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  668) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  669) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  670) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  671)  * bytes_to_samples - Unit conversion of the size from bytes to samples
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  672)  * @runtime: PCM runtime instance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  673)  * @size: size in bytes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  674)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  675) static inline ssize_t bytes_to_samples(struct snd_pcm_runtime *runtime, ssize_t size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  676) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  677) 	return size * 8 / runtime->sample_bits;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  678) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  679) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  680) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  681)  * bytes_to_frames - Unit conversion of the size from bytes to frames
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  682)  * @runtime: PCM runtime instance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  683)  * @size: size in bytes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  684)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  685) static inline snd_pcm_sframes_t bytes_to_frames(struct snd_pcm_runtime *runtime, ssize_t size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  686) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  687) 	return size * 8 / runtime->frame_bits;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  688) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  689) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  690) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  691)  * samples_to_bytes - Unit conversion of the size from samples to bytes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  692)  * @runtime: PCM runtime instance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  693)  * @size: size in samples
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  694)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  695) static inline ssize_t samples_to_bytes(struct snd_pcm_runtime *runtime, ssize_t size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  696) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  697) 	return size * runtime->sample_bits / 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  698) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  699) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  700) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  701)  * frames_to_bytes - Unit conversion of the size from frames to bytes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  702)  * @runtime: PCM runtime instance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  703)  * @size: size in frames
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  704)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  705) static inline ssize_t frames_to_bytes(struct snd_pcm_runtime *runtime, snd_pcm_sframes_t size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  706) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  707) 	return size * runtime->frame_bits / 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  708) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  709) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  710) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  711)  * frame_aligned - Check whether the byte size is aligned to frames
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  712)  * @runtime: PCM runtime instance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  713)  * @bytes: size in bytes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  714)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  715) static inline int frame_aligned(struct snd_pcm_runtime *runtime, ssize_t bytes)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  716) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  717) 	return bytes % runtime->byte_align == 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  718) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  719) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  720) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  721)  * snd_pcm_lib_buffer_bytes - Get the buffer size of the current PCM in bytes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  722)  * @substream: PCM substream
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  723)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  724) static inline size_t snd_pcm_lib_buffer_bytes(struct snd_pcm_substream *substream)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  725) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  726) 	struct snd_pcm_runtime *runtime = substream->runtime;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  727) 	return frames_to_bytes(runtime, runtime->buffer_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  728) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  729) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  730) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  731)  * snd_pcm_lib_period_bytes - Get the period size of the current PCM in bytes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  732)  * @substream: PCM substream
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  733)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  734) static inline size_t snd_pcm_lib_period_bytes(struct snd_pcm_substream *substream)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  735) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  736) 	struct snd_pcm_runtime *runtime = substream->runtime;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  737) 	return frames_to_bytes(runtime, runtime->period_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  738) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  739) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  740) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  741)  * snd_pcm_playback_avail - Get the available (writable) space for playback
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  742)  * @runtime: PCM runtime instance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  743)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  744)  * Result is between 0 ... (boundary - 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  745)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  746) static inline snd_pcm_uframes_t snd_pcm_playback_avail(struct snd_pcm_runtime *runtime)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  747) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  748) 	snd_pcm_sframes_t avail = runtime->status->hw_ptr + runtime->buffer_size - runtime->control->appl_ptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  749) 	if (avail < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  750) 		avail += runtime->boundary;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  751) 	else if ((snd_pcm_uframes_t) avail >= runtime->boundary)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  752) 		avail -= runtime->boundary;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  753) 	return avail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  754) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  755) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  756) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  757)  * snd_pcm_capture_avail - Get the available (readable) space for capture
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  758)  * @runtime: PCM runtime instance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  759)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  760)  * Result is between 0 ... (boundary - 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  761)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  762) static inline snd_pcm_uframes_t snd_pcm_capture_avail(struct snd_pcm_runtime *runtime)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  763) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  764) 	snd_pcm_sframes_t avail = runtime->status->hw_ptr - runtime->control->appl_ptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  765) 	if (avail < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  766) 		avail += runtime->boundary;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  767) 	return avail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  768) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  769) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  770) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  771)  * snd_pcm_playback_hw_avail - Get the queued space for playback
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  772)  * @runtime: PCM runtime instance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  773)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  774) static inline snd_pcm_sframes_t snd_pcm_playback_hw_avail(struct snd_pcm_runtime *runtime)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  775) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  776) 	return runtime->buffer_size - snd_pcm_playback_avail(runtime);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  777) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  778) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  779) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  780)  * snd_pcm_capture_hw_avail - Get the free space for capture
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  781)  * @runtime: PCM runtime instance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  782)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  783) static inline snd_pcm_sframes_t snd_pcm_capture_hw_avail(struct snd_pcm_runtime *runtime)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  784) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  785) 	return runtime->buffer_size - snd_pcm_capture_avail(runtime);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  786) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  787) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  788) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  789)  * snd_pcm_playback_ready - check whether the playback buffer is available
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  790)  * @substream: the pcm substream instance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  791)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  792)  * Checks whether enough free space is available on the playback buffer.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  793)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  794)  * Return: Non-zero if available, or zero if not.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  795)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  796) static inline int snd_pcm_playback_ready(struct snd_pcm_substream *substream)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  797) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  798) 	struct snd_pcm_runtime *runtime = substream->runtime;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  799) 	return snd_pcm_playback_avail(runtime) >= runtime->control->avail_min;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  800) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  801) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  802) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  803)  * snd_pcm_capture_ready - check whether the capture buffer is available
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  804)  * @substream: the pcm substream instance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  805)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  806)  * Checks whether enough capture data is available on the capture buffer.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  807)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  808)  * Return: Non-zero if available, or zero if not.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  809)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  810) static inline int snd_pcm_capture_ready(struct snd_pcm_substream *substream)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  811) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  812) 	struct snd_pcm_runtime *runtime = substream->runtime;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  813) 	return snd_pcm_capture_avail(runtime) >= runtime->control->avail_min;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  814) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  815) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  816) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  817)  * snd_pcm_playback_data - check whether any data exists on the playback buffer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  818)  * @substream: the pcm substream instance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  819)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  820)  * Checks whether any data exists on the playback buffer.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  821)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  822)  * Return: Non-zero if any data exists, or zero if not. If stop_threshold
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  823)  * is bigger or equal to boundary, then this function returns always non-zero.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  824)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  825) static inline int snd_pcm_playback_data(struct snd_pcm_substream *substream)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  826) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  827) 	struct snd_pcm_runtime *runtime = substream->runtime;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  828) 	
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  829) 	if (runtime->stop_threshold >= runtime->boundary)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  830) 		return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  831) 	return snd_pcm_playback_avail(runtime) < runtime->buffer_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  832) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  833) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  834) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  835)  * snd_pcm_playback_empty - check whether the playback buffer is empty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  836)  * @substream: the pcm substream instance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  837)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  838)  * Checks whether the playback buffer is empty.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  839)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  840)  * Return: Non-zero if empty, or zero if not.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  841)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  842) static inline int snd_pcm_playback_empty(struct snd_pcm_substream *substream)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  843) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  844) 	struct snd_pcm_runtime *runtime = substream->runtime;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  845) 	return snd_pcm_playback_avail(runtime) >= runtime->buffer_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  846) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  847) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  848) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  849)  * snd_pcm_capture_empty - check whether the capture buffer is empty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  850)  * @substream: the pcm substream instance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  851)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  852)  * Checks whether the capture buffer is empty.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  853)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  854)  * Return: Non-zero if empty, or zero if not.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  855)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  856) static inline int snd_pcm_capture_empty(struct snd_pcm_substream *substream)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  857) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  858) 	struct snd_pcm_runtime *runtime = substream->runtime;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  859) 	return snd_pcm_capture_avail(runtime) == 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  860) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  861) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  862) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  863)  * snd_pcm_trigger_done - Mark the master substream
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  864)  * @substream: the pcm substream instance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  865)  * @master: the linked master substream
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  866)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  867)  * When multiple substreams of the same card are linked and the hardware
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  868)  * supports the single-shot operation, the driver calls this in the loop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  869)  * in snd_pcm_group_for_each_entry() for marking the substream as "done".
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  870)  * Then most of trigger operations are performed only to the given master
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  871)  * substream.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  872)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  873)  * The trigger_master mark is cleared at timestamp updates at the end
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  874)  * of trigger operations.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  875)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  876) static inline void snd_pcm_trigger_done(struct snd_pcm_substream *substream, 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  877) 					struct snd_pcm_substream *master)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  878) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  879) 	substream->runtime->trigger_master = master;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  880) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  881) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  882) static inline int hw_is_mask(int var)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  883) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  884) 	return var >= SNDRV_PCM_HW_PARAM_FIRST_MASK &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  885) 		var <= SNDRV_PCM_HW_PARAM_LAST_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  886) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  887) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  888) static inline int hw_is_interval(int var)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  889) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  890) 	return var >= SNDRV_PCM_HW_PARAM_FIRST_INTERVAL &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  891) 		var <= SNDRV_PCM_HW_PARAM_LAST_INTERVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  892) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  893) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  894) static inline struct snd_mask *hw_param_mask(struct snd_pcm_hw_params *params,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  895) 				     snd_pcm_hw_param_t var)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  896) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  897) 	return &params->masks[var - SNDRV_PCM_HW_PARAM_FIRST_MASK];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  898) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  899) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  900) static inline struct snd_interval *hw_param_interval(struct snd_pcm_hw_params *params,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  901) 					     snd_pcm_hw_param_t var)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  902) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  903) 	return &params->intervals[var - SNDRV_PCM_HW_PARAM_FIRST_INTERVAL];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  904) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  905) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  906) static inline const struct snd_mask *hw_param_mask_c(const struct snd_pcm_hw_params *params,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  907) 					     snd_pcm_hw_param_t var)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  908) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  909) 	return &params->masks[var - SNDRV_PCM_HW_PARAM_FIRST_MASK];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  910) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  911) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  912) static inline const struct snd_interval *hw_param_interval_c(const struct snd_pcm_hw_params *params,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  913) 						     snd_pcm_hw_param_t var)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  914) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  915) 	return &params->intervals[var - SNDRV_PCM_HW_PARAM_FIRST_INTERVAL];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  916) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  917) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  918) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  919)  * params_channels - Get the number of channels from the hw params
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  920)  * @p: hw params
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  921)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  922) static inline unsigned int params_channels(const struct snd_pcm_hw_params *p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  923) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  924) 	return hw_param_interval_c(p, SNDRV_PCM_HW_PARAM_CHANNELS)->min;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  925) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  926) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  927) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  928)  * params_rate - Get the sample rate from the hw params
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  929)  * @p: hw params
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  930)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  931) static inline unsigned int params_rate(const struct snd_pcm_hw_params *p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  932) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  933) 	return hw_param_interval_c(p, SNDRV_PCM_HW_PARAM_RATE)->min;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  934) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  935) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  936) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  937)  * params_period_size - Get the period size (in frames) from the hw params
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  938)  * @p: hw params
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  939)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  940) static inline unsigned int params_period_size(const struct snd_pcm_hw_params *p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  941) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  942) 	return hw_param_interval_c(p, SNDRV_PCM_HW_PARAM_PERIOD_SIZE)->min;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  943) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  944) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  945) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  946)  * params_periods - Get the number of periods from the hw params
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  947)  * @p: hw params
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  948)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  949) static inline unsigned int params_periods(const struct snd_pcm_hw_params *p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  950) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  951) 	return hw_param_interval_c(p, SNDRV_PCM_HW_PARAM_PERIODS)->min;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  952) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  953) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  954) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  955)  * params_buffer_size - Get the buffer size (in frames) from the hw params
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  956)  * @p: hw params
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  957)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  958) static inline unsigned int params_buffer_size(const struct snd_pcm_hw_params *p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  959) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  960) 	return hw_param_interval_c(p, SNDRV_PCM_HW_PARAM_BUFFER_SIZE)->min;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  961) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  962) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  963) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  964)  * params_buffer_bytes - Get the buffer size (in bytes) from the hw params
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  965)  * @p: hw params
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  966)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  967) static inline unsigned int params_buffer_bytes(const struct snd_pcm_hw_params *p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  968) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  969) 	return hw_param_interval_c(p, SNDRV_PCM_HW_PARAM_BUFFER_BYTES)->min;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  970) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  971) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  972) int snd_interval_refine(struct snd_interval *i, const struct snd_interval *v);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  973) int snd_interval_list(struct snd_interval *i, unsigned int count,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  974) 		      const unsigned int *list, unsigned int mask);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  975) int snd_interval_ranges(struct snd_interval *i, unsigned int count,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  976) 			const struct snd_interval *list, unsigned int mask);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  977) int snd_interval_ratnum(struct snd_interval *i,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  978) 			unsigned int rats_count, const struct snd_ratnum *rats,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  979) 			unsigned int *nump, unsigned int *denp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  980) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  981) void _snd_pcm_hw_params_any(struct snd_pcm_hw_params *params);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  982) void _snd_pcm_hw_param_setempty(struct snd_pcm_hw_params *params, snd_pcm_hw_param_t var);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  983) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  984) int snd_pcm_hw_refine(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  985) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  986) int snd_pcm_hw_constraint_mask64(struct snd_pcm_runtime *runtime, snd_pcm_hw_param_t var,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  987) 				 u_int64_t mask);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  988) int snd_pcm_hw_constraint_minmax(struct snd_pcm_runtime *runtime, snd_pcm_hw_param_t var,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  989) 				 unsigned int min, unsigned int max);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  990) int snd_pcm_hw_constraint_integer(struct snd_pcm_runtime *runtime, snd_pcm_hw_param_t var);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  991) int snd_pcm_hw_constraint_list(struct snd_pcm_runtime *runtime, 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  992) 			       unsigned int cond,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  993) 			       snd_pcm_hw_param_t var,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  994) 			       const struct snd_pcm_hw_constraint_list *l);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  995) int snd_pcm_hw_constraint_ranges(struct snd_pcm_runtime *runtime,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  996) 				 unsigned int cond,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  997) 				 snd_pcm_hw_param_t var,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  998) 				 const struct snd_pcm_hw_constraint_ranges *r);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  999) int snd_pcm_hw_constraint_ratnums(struct snd_pcm_runtime *runtime, 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000) 				  unsigned int cond,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) 				  snd_pcm_hw_param_t var,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) 				  const struct snd_pcm_hw_constraint_ratnums *r);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) int snd_pcm_hw_constraint_ratdens(struct snd_pcm_runtime *runtime, 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) 				  unsigned int cond,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) 				  snd_pcm_hw_param_t var,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) 				  const struct snd_pcm_hw_constraint_ratdens *r);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) int snd_pcm_hw_constraint_msbits(struct snd_pcm_runtime *runtime, 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008) 				 unsigned int cond,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009) 				 unsigned int width,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) 				 unsigned int msbits);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) int snd_pcm_hw_constraint_step(struct snd_pcm_runtime *runtime,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) 			       unsigned int cond,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013) 			       snd_pcm_hw_param_t var,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) 			       unsigned long step);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015) int snd_pcm_hw_constraint_pow2(struct snd_pcm_runtime *runtime,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) 			       unsigned int cond,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017) 			       snd_pcm_hw_param_t var);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) int snd_pcm_hw_rule_noresample(struct snd_pcm_runtime *runtime,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) 			       unsigned int base_rate);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020) int snd_pcm_hw_rule_add(struct snd_pcm_runtime *runtime,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) 			unsigned int cond,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) 			int var,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023) 			snd_pcm_hw_rule_func_t func, void *private,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) 			int dep, ...);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027)  * snd_pcm_hw_constraint_single() - Constrain parameter to a single value
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028)  * @runtime: PCM runtime instance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029)  * @var: The hw_params variable to constrain
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030)  * @val: The value to constrain to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032)  * Return: Positive if the value is changed, zero if it's not changed, or a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033)  * negative error code.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) static inline int snd_pcm_hw_constraint_single(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036) 	struct snd_pcm_runtime *runtime, snd_pcm_hw_param_t var,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037) 	unsigned int val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) 	return snd_pcm_hw_constraint_minmax(runtime, var, val, val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042) int snd_pcm_format_signed(snd_pcm_format_t format);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043) int snd_pcm_format_unsigned(snd_pcm_format_t format);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044) int snd_pcm_format_linear(snd_pcm_format_t format);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) int snd_pcm_format_little_endian(snd_pcm_format_t format);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046) int snd_pcm_format_big_endian(snd_pcm_format_t format);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) #if 0 /* just for kernel-doc */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049)  * snd_pcm_format_cpu_endian - Check the PCM format is CPU-endian
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050)  * @format: the format to check
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052)  * Return: 1 if the given PCM format is CPU-endian, 0 if
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053)  * opposite, or a negative error code if endian not specified.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) int snd_pcm_format_cpu_endian(snd_pcm_format_t format);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056) #endif /* DocBook */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057) #ifdef SNDRV_LITTLE_ENDIAN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) #define snd_pcm_format_cpu_endian(format) snd_pcm_format_little_endian(format)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) #define snd_pcm_format_cpu_endian(format) snd_pcm_format_big_endian(format)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062) int snd_pcm_format_width(snd_pcm_format_t format);			/* in bits */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063) int snd_pcm_format_physical_width(snd_pcm_format_t format);		/* in bits */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) ssize_t snd_pcm_format_size(snd_pcm_format_t format, size_t samples);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065) const unsigned char *snd_pcm_format_silence_64(snd_pcm_format_t format);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066) int snd_pcm_format_set_silence(snd_pcm_format_t format, void *buf, unsigned int frames);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068) void snd_pcm_set_ops(struct snd_pcm * pcm, int direction,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) 		     const struct snd_pcm_ops *ops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070) void snd_pcm_set_sync(struct snd_pcm_substream *substream);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071) int snd_pcm_lib_ioctl(struct snd_pcm_substream *substream,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072) 		      unsigned int cmd, void *arg);                      
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) void snd_pcm_period_elapsed(struct snd_pcm_substream *substream);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) snd_pcm_sframes_t __snd_pcm_lib_xfer(struct snd_pcm_substream *substream,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075) 				     void *buf, bool interleaved,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) 				     snd_pcm_uframes_t frames, bool in_kernel);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078) static inline snd_pcm_sframes_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079) snd_pcm_lib_write(struct snd_pcm_substream *substream,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080) 		  const void __user *buf, snd_pcm_uframes_t frames)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082) 	return __snd_pcm_lib_xfer(substream, (void __force *)buf, true, frames, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085) static inline snd_pcm_sframes_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) snd_pcm_lib_read(struct snd_pcm_substream *substream,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087) 		 void __user *buf, snd_pcm_uframes_t frames)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089) 	return __snd_pcm_lib_xfer(substream, (void __force *)buf, true, frames, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) static inline snd_pcm_sframes_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093) snd_pcm_lib_writev(struct snd_pcm_substream *substream,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094) 		   void __user **bufs, snd_pcm_uframes_t frames)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096) 	return __snd_pcm_lib_xfer(substream, (void *)bufs, false, frames, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099) static inline snd_pcm_sframes_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) snd_pcm_lib_readv(struct snd_pcm_substream *substream,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101) 		  void __user **bufs, snd_pcm_uframes_t frames)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103) 	return __snd_pcm_lib_xfer(substream, (void *)bufs, false, frames, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106) static inline snd_pcm_sframes_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107) snd_pcm_kernel_write(struct snd_pcm_substream *substream,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108) 		     const void *buf, snd_pcm_uframes_t frames)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110) 	return __snd_pcm_lib_xfer(substream, (void *)buf, true, frames, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) static inline snd_pcm_sframes_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114) snd_pcm_kernel_read(struct snd_pcm_substream *substream,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115) 		    void *buf, snd_pcm_uframes_t frames)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117) 	return __snd_pcm_lib_xfer(substream, buf, true, frames, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120) static inline snd_pcm_sframes_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121) snd_pcm_kernel_writev(struct snd_pcm_substream *substream,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122) 		      void **bufs, snd_pcm_uframes_t frames)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124) 	return __snd_pcm_lib_xfer(substream, bufs, false, frames, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127) static inline snd_pcm_sframes_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128) snd_pcm_kernel_readv(struct snd_pcm_substream *substream,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129) 		     void **bufs, snd_pcm_uframes_t frames)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131) 	return __snd_pcm_lib_xfer(substream, bufs, false, frames, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134) int snd_pcm_hw_limit_rates(struct snd_pcm_hardware *hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136) static inline int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137) snd_pcm_limit_hw_rates(struct snd_pcm_runtime *runtime)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139) 	return snd_pcm_hw_limit_rates(&runtime->hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142) unsigned int snd_pcm_rate_to_rate_bit(unsigned int rate);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143) unsigned int snd_pcm_rate_bit_to_rate(unsigned int rate_bit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144) unsigned int snd_pcm_rate_mask_intersect(unsigned int rates_a,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145) 					 unsigned int rates_b);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146) unsigned int snd_pcm_rate_range_to_bits(unsigned int rate_min,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147) 					unsigned int rate_max);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150)  * snd_pcm_set_runtime_buffer - Set the PCM runtime buffer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151)  * @substream: PCM substream to set
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152)  * @bufp: the buffer information, NULL to clear
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154)  * Copy the buffer information to runtime->dma_buffer when @bufp is non-NULL.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155)  * Otherwise it clears the current buffer information.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157) static inline void snd_pcm_set_runtime_buffer(struct snd_pcm_substream *substream,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158) 					      struct snd_dma_buffer *bufp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160) 	struct snd_pcm_runtime *runtime = substream->runtime;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161) 	if (bufp) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162) 		runtime->dma_buffer_p = bufp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163) 		runtime->dma_area = bufp->area;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164) 		runtime->dma_addr = bufp->addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165) 		runtime->dma_bytes = bufp->bytes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167) 		runtime->dma_buffer_p = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168) 		runtime->dma_area = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169) 		runtime->dma_addr = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170) 		runtime->dma_bytes = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175)  * snd_pcm_gettime - Fill the timespec64 depending on the timestamp mode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176)  * @runtime: PCM runtime instance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177)  * @tv: timespec64 to fill
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179) static inline void snd_pcm_gettime(struct snd_pcm_runtime *runtime,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180) 				   struct timespec64 *tv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182) 	switch (runtime->tstamp_type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183) 	case SNDRV_PCM_TSTAMP_TYPE_MONOTONIC:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184) 		ktime_get_ts64(tv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186) 	case SNDRV_PCM_TSTAMP_TYPE_MONOTONIC_RAW:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187) 		ktime_get_raw_ts64(tv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190) 		ktime_get_real_ts64(tv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196)  *  Memory
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199) void snd_pcm_lib_preallocate_free(struct snd_pcm_substream *substream);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200) void snd_pcm_lib_preallocate_free_for_all(struct snd_pcm *pcm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201) void snd_pcm_lib_preallocate_pages(struct snd_pcm_substream *substream,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202) 				  int type, struct device *data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203) 				  size_t size, size_t max);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204) void snd_pcm_lib_preallocate_pages_for_all(struct snd_pcm *pcm,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205) 					  int type, void *data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206) 					  size_t size, size_t max);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207) int snd_pcm_lib_malloc_pages(struct snd_pcm_substream *substream, size_t size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208) int snd_pcm_lib_free_pages(struct snd_pcm_substream *substream);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210) void snd_pcm_set_managed_buffer(struct snd_pcm_substream *substream, int type,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211) 				struct device *data, size_t size, size_t max);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212) void snd_pcm_set_managed_buffer_all(struct snd_pcm *pcm, int type,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213) 				    struct device *data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214) 				    size_t size, size_t max);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216) int _snd_pcm_lib_alloc_vmalloc_buffer(struct snd_pcm_substream *substream,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217) 				      size_t size, gfp_t gfp_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218) int snd_pcm_lib_free_vmalloc_buffer(struct snd_pcm_substream *substream);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219) struct page *snd_pcm_lib_get_vmalloc_page(struct snd_pcm_substream *substream,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220) 					  unsigned long offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222)  * snd_pcm_lib_alloc_vmalloc_buffer - allocate virtual DMA buffer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223)  * @substream: the substream to allocate the buffer to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224)  * @size: the requested buffer size, in bytes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226)  * Allocates the PCM substream buffer using vmalloc(), i.e., the memory is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227)  * contiguous in kernel virtual space, but not in physical memory.  Use this
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228)  * if the buffer is accessed by kernel code but not by device DMA.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230)  * Return: 1 if the buffer was changed, 0 if not changed, or a negative error
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231)  * code.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233) static inline int snd_pcm_lib_alloc_vmalloc_buffer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234) 			(struct snd_pcm_substream *substream, size_t size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236) 	return _snd_pcm_lib_alloc_vmalloc_buffer(substream, size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237) 						 GFP_KERNEL | __GFP_HIGHMEM | __GFP_ZERO);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241)  * snd_pcm_lib_alloc_vmalloc_32_buffer - allocate 32-bit-addressable buffer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242)  * @substream: the substream to allocate the buffer to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243)  * @size: the requested buffer size, in bytes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245)  * This function works like snd_pcm_lib_alloc_vmalloc_buffer(), but uses
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246)  * vmalloc_32(), i.e., the pages are allocated from 32-bit-addressable memory.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248)  * Return: 1 if the buffer was changed, 0 if not changed, or a negative error
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1249)  * code.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1250)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251) static inline int snd_pcm_lib_alloc_vmalloc_32_buffer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252) 			(struct snd_pcm_substream *substream, size_t size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254) 	return _snd_pcm_lib_alloc_vmalloc_buffer(substream, size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1255) 						 GFP_KERNEL | GFP_DMA32 | __GFP_ZERO);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1256) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1257) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1258) #define snd_pcm_get_dma_buf(substream) ((substream)->runtime->dma_buffer_p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1259) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1260) #ifdef CONFIG_SND_DMA_SGBUF
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1261) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1262)  * SG-buffer handling
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1263)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1264) #define snd_pcm_substream_sgbuf(substream) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1265) 	snd_pcm_get_dma_buf(substream)->private_data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1266) #endif /* SND_DMA_SGBUF */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1267) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1268) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1269)  * snd_pcm_sgbuf_get_addr - Get the DMA address at the corresponding offset
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1270)  * @substream: PCM substream
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1271)  * @ofs: byte offset
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1272)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1273) static inline dma_addr_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1274) snd_pcm_sgbuf_get_addr(struct snd_pcm_substream *substream, unsigned int ofs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1275) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1276) 	return snd_sgbuf_get_addr(snd_pcm_get_dma_buf(substream), ofs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1277) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1278) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1279) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1280)  * snd_pcm_sgbuf_get_ptr - Get the virtual address at the corresponding offset
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1281)  * @substream: PCM substream
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1282)  * @ofs: byte offset
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1283)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1284) static inline void *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1285) snd_pcm_sgbuf_get_ptr(struct snd_pcm_substream *substream, unsigned int ofs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1286) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1287) 	return snd_sgbuf_get_ptr(snd_pcm_get_dma_buf(substream), ofs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1288) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1289) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1290) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1291)  * snd_pcm_sgbuf_get_chunk_size - Compute the max size that fits within the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1292)  * contig. page from the given size
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1293)  * @substream: PCM substream
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1294)  * @ofs: byte offset
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1295)  * @size: byte size to examine
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1296)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1297) static inline unsigned int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1298) snd_pcm_sgbuf_get_chunk_size(struct snd_pcm_substream *substream,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1299) 			     unsigned int ofs, unsigned int size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1300) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1301) 	return snd_sgbuf_get_chunk_size(snd_pcm_get_dma_buf(substream), ofs, size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1302) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1303) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1304) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1305)  * snd_pcm_mmap_data_open - increase the mmap counter
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1306)  * @area: VMA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1307)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1308)  * PCM mmap callback should handle this counter properly
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1309)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1310) static inline void snd_pcm_mmap_data_open(struct vm_area_struct *area)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1311) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1312) 	struct snd_pcm_substream *substream = (struct snd_pcm_substream *)area->vm_private_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1313) 	atomic_inc(&substream->mmap_count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1314) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1315) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1316) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1317)  * snd_pcm_mmap_data_close - decrease the mmap counter
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1318)  * @area: VMA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1319)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1320)  * PCM mmap callback should handle this counter properly
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1321)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1322) static inline void snd_pcm_mmap_data_close(struct vm_area_struct *area)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1323) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1324) 	struct snd_pcm_substream *substream = (struct snd_pcm_substream *)area->vm_private_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1325) 	atomic_dec(&substream->mmap_count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1326) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1327) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1328) int snd_pcm_lib_default_mmap(struct snd_pcm_substream *substream,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1329) 			     struct vm_area_struct *area);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1330) /* mmap for io-memory area */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1331) #if defined(CONFIG_X86) || defined(CONFIG_PPC) || defined(CONFIG_ALPHA)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1332) #define SNDRV_PCM_INFO_MMAP_IOMEM	SNDRV_PCM_INFO_MMAP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1333) int snd_pcm_lib_mmap_iomem(struct snd_pcm_substream *substream, struct vm_area_struct *area);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1334) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1335) #define SNDRV_PCM_INFO_MMAP_IOMEM	0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1336) #define snd_pcm_lib_mmap_iomem	NULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1337) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1338) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1339) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1340)  * snd_pcm_limit_isa_dma_size - Get the max size fitting with ISA DMA transfer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1341)  * @dma: DMA number
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1342)  * @max: pointer to store the max size
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1343)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1344) static inline void snd_pcm_limit_isa_dma_size(int dma, size_t *max)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1345) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1346) 	*max = dma < 4 ? 64 * 1024 : 128 * 1024;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1347) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1348) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1349) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1350)  *  Misc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1351)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1352) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1353) #define SNDRV_PCM_DEFAULT_CON_SPDIF	(IEC958_AES0_CON_EMPHASIS_NONE|\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1354) 					 (IEC958_AES1_CON_ORIGINAL<<8)|\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1355) 					 (IEC958_AES1_CON_PCM_CODER<<8)|\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1356) 					 (IEC958_AES3_CON_FS_48000<<24))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1357) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1358) const char *snd_pcm_format_name(snd_pcm_format_t format);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1359) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1360) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1361)  * snd_pcm_stream_str - Get a string naming the direction of a stream
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1362)  * @substream: the pcm substream instance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1363)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1364)  * Return: A string naming the direction of the stream.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1365)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1366) static inline const char *snd_pcm_stream_str(struct snd_pcm_substream *substream)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1367) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1368) 	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1369) 		return "Playback";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1370) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1371) 		return "Capture";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1372) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1373) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1374) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1375)  * PCM channel-mapping control API
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1376)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1377) /* array element of channel maps */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1378) struct snd_pcm_chmap_elem {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1379) 	unsigned char channels;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1380) 	unsigned char map[15];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1381) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1382) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1383) /* channel map information; retrieved via snd_kcontrol_chip() */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1384) struct snd_pcm_chmap {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1385) 	struct snd_pcm *pcm;	/* assigned PCM instance */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1386) 	int stream;		/* PLAYBACK or CAPTURE */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1387) 	struct snd_kcontrol *kctl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1388) 	const struct snd_pcm_chmap_elem *chmap;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1389) 	unsigned int max_channels;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1390) 	unsigned int channel_mask;	/* optional: active channels bitmask */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1391) 	void *private_data;	/* optional: private data pointer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1392) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1393) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1394) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1395)  * snd_pcm_chmap_substream - get the PCM substream assigned to the given chmap info
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1396)  * @info: chmap information
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1397)  * @idx: the substream number index
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1398)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1399) static inline struct snd_pcm_substream *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1400) snd_pcm_chmap_substream(struct snd_pcm_chmap *info, unsigned int idx)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1401) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1402) 	struct snd_pcm_substream *s;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1403) 	for (s = info->pcm->streams[info->stream].substream; s; s = s->next)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1404) 		if (s->number == idx)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1405) 			return s;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1406) 	return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1407) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1408) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1409) /* ALSA-standard channel maps (RL/RR prior to C/LFE) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1410) extern const struct snd_pcm_chmap_elem snd_pcm_std_chmaps[];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1411) /* Other world's standard channel maps (C/LFE prior to RL/RR) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1412) extern const struct snd_pcm_chmap_elem snd_pcm_alt_chmaps[];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1413) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1414) /* bit masks to be passed to snd_pcm_chmap.channel_mask field */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1415) #define SND_PCM_CHMAP_MASK_24	((1U << 2) | (1U << 4))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1416) #define SND_PCM_CHMAP_MASK_246	(SND_PCM_CHMAP_MASK_24 | (1U << 6))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1417) #define SND_PCM_CHMAP_MASK_2468	(SND_PCM_CHMAP_MASK_246 | (1U << 8))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1418) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1419) int snd_pcm_add_chmap_ctls(struct snd_pcm *pcm, int stream,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1420) 			   const struct snd_pcm_chmap_elem *chmap,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1421) 			   int max_channels,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1422) 			   unsigned long private_value,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1423) 			   struct snd_pcm_chmap **info_ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1424) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1425) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1426)  * pcm_format_to_bits - Strong-typed conversion of pcm_format to bitwise
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1427)  * @pcm_format: PCM format
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1428)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1429) static inline u64 pcm_format_to_bits(snd_pcm_format_t pcm_format)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1430) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1431) 	return 1ULL << (__force int) pcm_format;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1432) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1433) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1434) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1435)  * pcm_for_each_format - helper to iterate for each format type
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1436)  * @f: the iterator variable in snd_pcm_format_t type
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1437)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1438) #define pcm_for_each_format(f)						\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1439) 	for ((f) = SNDRV_PCM_FORMAT_FIRST;				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1440) 	     (__force int)(f) <= (__force int)SNDRV_PCM_FORMAT_LAST;	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1441) 	     (f) = (__force snd_pcm_format_t)((__force int)(f) + 1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1442) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1443) #if IS_ENABLED(CONFIG_SND_SOC_ROCKCHIP_VAD)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1444) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1445)  * snd_pcm_vad_read - Read raw pcm data from vad buffer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1446)  * @substream: PCM substream instance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1447)  * @buf: dst buf
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1448)  * @frames: size in frame
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1449)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1450)  * Result is read frames for success or errno for fail
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1451)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1452) snd_pcm_sframes_t snd_pcm_vad_read(struct snd_pcm_substream *substream,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1453) 				   void __user *buf, snd_pcm_uframes_t frames);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1454) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1455)  * snd_pcm_vad_avail - Get the available (readable) space for vad
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1456)  * @substream: PCM substream instance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1457)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1458)  * Result is between 0 ... (boundary - 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1459)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1460) snd_pcm_uframes_t snd_pcm_vad_avail(struct snd_pcm_substream *substream);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1461) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1462)  * snd_pcm_vad_attached - Check whether vad is attached to substream or not
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1463)  * @substream: PCM substream instance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1464)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1465)  * Result is true for attached or false for detached
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1466)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1467) bool snd_pcm_vad_attached(struct snd_pcm_substream *substream);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1468) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1469)  * snd_pcm_vad_preprocess - Pre process vad data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1470)  * @substream: PCM substream instance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1471)  * @size: size in frame
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1472)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1473)  * Result is zero for success or errno for fail
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1474)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1475) int snd_pcm_vad_preprocess(struct snd_pcm_substream *substream,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1476) 			   void *buf, snd_pcm_uframes_t size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1477) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1478)  * snd_pcm_vad_memcpy - Copy vad data to dst
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1479)  * @substream: PCM substream instance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1480)  * @buf: dst buf
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1481)  * @frames:  size in frame
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1482)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1483)  * Result is copied frames for success or errno for fail
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1484)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1485) snd_pcm_sframes_t snd_pcm_vad_memcpy(struct snd_pcm_substream *substream,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1486) 				     void *buf, snd_pcm_uframes_t frames);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1487) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1488) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1489) /* printk helpers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1490) #define pcm_err(pcm, fmt, args...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1491) 	dev_err((pcm)->card->dev, fmt, ##args)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1492) #define pcm_warn(pcm, fmt, args...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1493) 	dev_warn((pcm)->card->dev, fmt, ##args)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1494) #define pcm_dbg(pcm, fmt, args...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1495) 	dev_dbg((pcm)->card->dev, fmt, ##args)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1496) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1497) struct snd_pcm_status64 {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1498) 	snd_pcm_state_t state;		/* stream state */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1499) 	u8 rsvd[4];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1500) 	s64 trigger_tstamp_sec;		/* time when stream was started/stopped/paused */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1501) 	s64 trigger_tstamp_nsec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1502) 	s64 tstamp_sec;			/* reference timestamp */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1503) 	s64 tstamp_nsec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1504) 	snd_pcm_uframes_t appl_ptr;	/* appl ptr */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1505) 	snd_pcm_uframes_t hw_ptr;	/* hw ptr */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1506) 	snd_pcm_sframes_t delay;	/* current delay in frames */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1507) 	snd_pcm_uframes_t avail;	/* number of frames available */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1508) 	snd_pcm_uframes_t avail_max;	/* max frames available on hw since last status */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1509) 	snd_pcm_uframes_t overrange;	/* count of ADC (capture) overrange detections from last status */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1510) 	snd_pcm_state_t suspended_state; /* suspended stream state */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1511) 	__u32 audio_tstamp_data;	 /* needed for 64-bit alignment, used for configs/report to/from userspace */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1512) 	s64 audio_tstamp_sec;		/* sample counter, wall clock, PHC or on-demand sync'ed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1513) 	s64 audio_tstamp_nsec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1514) 	s64 driver_tstamp_sec;		/* useful in case reference system tstamp is reported with delay */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1515) 	s64 driver_tstamp_nsec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1516) 	__u32 audio_tstamp_accuracy;	/* in ns units, only valid if indicated in audio_tstamp_data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1517) 	unsigned char reserved[52-4*sizeof(s64)]; /* must be filled with zero */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1518) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1519) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1520) #define SNDRV_PCM_IOCTL_STATUS64	_IOR('A', 0x20, struct snd_pcm_status64)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1521) #define SNDRV_PCM_IOCTL_STATUS_EXT64	_IOWR('A', 0x24, struct snd_pcm_status64)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1522) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1523) struct snd_pcm_status32 {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1524) 	snd_pcm_state_t state;		/* stream state */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1525) 	s32 trigger_tstamp_sec;	/* time when stream was started/stopped/paused */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1526) 	s32 trigger_tstamp_nsec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1527) 	s32 tstamp_sec;		/* reference timestamp */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1528) 	s32 tstamp_nsec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1529) 	u32 appl_ptr;		/* appl ptr */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1530) 	u32 hw_ptr;		/* hw ptr */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1531) 	s32 delay;		/* current delay in frames */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1532) 	u32 avail;		/* number of frames available */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1533) 	u32 avail_max;		/* max frames available on hw since last status */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1534) 	u32 overrange;		/* count of ADC (capture) overrange detections from last status */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1535) 	snd_pcm_state_t suspended_state;	/* suspended stream state */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1536) 	u32 audio_tstamp_data;	/* needed for 64-bit alignment, used for configs/report to/from userspace */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1537) 	s32 audio_tstamp_sec;	/* sample counter, wall clock, PHC or on-demand sync'ed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1538) 	s32 audio_tstamp_nsec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1539) 	s32 driver_tstamp_sec;	/* useful in case reference system tstamp is reported with delay */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1540) 	s32 driver_tstamp_nsec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1541) 	u32 audio_tstamp_accuracy;	/* in ns units, only valid if indicated in audio_tstamp_data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1542) 	unsigned char reserved[52-4*sizeof(s32)]; /* must be filled with zero */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1543) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1544) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1545) #define SNDRV_PCM_IOCTL_STATUS32	_IOR('A', 0x20, struct snd_pcm_status32)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1546) #define SNDRV_PCM_IOCTL_STATUS_EXT32	_IOWR('A', 0x24, struct snd_pcm_status32)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1547) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1548) #endif /* __SOUND_PCM_H */