162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * pcm_local.h - a local header file for snd-pcm module.
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright (c) Takashi Sakamoto <o-takashi@sakamocchi.jp>
662306a36Sopenharmony_ci */
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#ifndef __SOUND_CORE_PCM_LOCAL_H
962306a36Sopenharmony_ci#define __SOUND_CORE_PCM_LOCAL_H
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ciextern const struct snd_pcm_hw_constraint_list snd_pcm_known_rates;
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_civoid snd_interval_mul(const struct snd_interval *a,
1462306a36Sopenharmony_ci		      const struct snd_interval *b, struct snd_interval *c);
1562306a36Sopenharmony_civoid snd_interval_div(const struct snd_interval *a,
1662306a36Sopenharmony_ci		      const struct snd_interval *b, struct snd_interval *c);
1762306a36Sopenharmony_civoid snd_interval_muldivk(const struct snd_interval *a,
1862306a36Sopenharmony_ci			  const struct snd_interval *b,
1962306a36Sopenharmony_ci			  unsigned int k, struct snd_interval *c);
2062306a36Sopenharmony_civoid snd_interval_mulkdiv(const struct snd_interval *a, unsigned int k,
2162306a36Sopenharmony_ci			  const struct snd_interval *b, struct snd_interval *c);
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ciint snd_pcm_hw_constraint_mask(struct snd_pcm_runtime *runtime,
2462306a36Sopenharmony_ci			       snd_pcm_hw_param_t var, u_int32_t mask);
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ciint pcm_lib_apply_appl_ptr(struct snd_pcm_substream *substream,
2762306a36Sopenharmony_ci			   snd_pcm_uframes_t appl_ptr);
2862306a36Sopenharmony_ciint snd_pcm_update_state(struct snd_pcm_substream *substream,
2962306a36Sopenharmony_ci			 struct snd_pcm_runtime *runtime);
3062306a36Sopenharmony_ciint snd_pcm_update_hw_ptr(struct snd_pcm_substream *substream);
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_civoid snd_pcm_playback_silence(struct snd_pcm_substream *substream,
3362306a36Sopenharmony_ci			      snd_pcm_uframes_t new_hw_ptr);
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_cistatic inline snd_pcm_uframes_t
3662306a36Sopenharmony_cisnd_pcm_avail(struct snd_pcm_substream *substream)
3762306a36Sopenharmony_ci{
3862306a36Sopenharmony_ci	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
3962306a36Sopenharmony_ci		return snd_pcm_playback_avail(substream->runtime);
4062306a36Sopenharmony_ci	else
4162306a36Sopenharmony_ci		return snd_pcm_capture_avail(substream->runtime);
4262306a36Sopenharmony_ci}
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_cistatic inline snd_pcm_uframes_t
4562306a36Sopenharmony_cisnd_pcm_hw_avail(struct snd_pcm_substream *substream)
4662306a36Sopenharmony_ci{
4762306a36Sopenharmony_ci	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
4862306a36Sopenharmony_ci		return snd_pcm_playback_hw_avail(substream->runtime);
4962306a36Sopenharmony_ci	else
5062306a36Sopenharmony_ci		return snd_pcm_capture_hw_avail(substream->runtime);
5162306a36Sopenharmony_ci}
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ci#ifdef CONFIG_SND_PCM_TIMER
5462306a36Sopenharmony_civoid snd_pcm_timer_resolution_change(struct snd_pcm_substream *substream);
5562306a36Sopenharmony_civoid snd_pcm_timer_init(struct snd_pcm_substream *substream);
5662306a36Sopenharmony_civoid snd_pcm_timer_done(struct snd_pcm_substream *substream);
5762306a36Sopenharmony_ci#else
5862306a36Sopenharmony_cistatic inline void
5962306a36Sopenharmony_cisnd_pcm_timer_resolution_change(struct snd_pcm_substream *substream) {}
6062306a36Sopenharmony_cistatic inline void snd_pcm_timer_init(struct snd_pcm_substream *substream) {}
6162306a36Sopenharmony_cistatic inline void snd_pcm_timer_done(struct snd_pcm_substream *substream) {}
6262306a36Sopenharmony_ci#endif
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_civoid __snd_pcm_xrun(struct snd_pcm_substream *substream);
6562306a36Sopenharmony_civoid snd_pcm_group_init(struct snd_pcm_group *group);
6662306a36Sopenharmony_civoid snd_pcm_sync_stop(struct snd_pcm_substream *substream, bool sync_irq);
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_ci#define PCM_RUNTIME_CHECK(sub) snd_BUG_ON(!(sub) || !(sub)->runtime)
6962306a36Sopenharmony_ci
7062306a36Sopenharmony_ci/* loop over all PCM substreams */
7162306a36Sopenharmony_ci#define for_each_pcm_substream(pcm, str, subs) \
7262306a36Sopenharmony_ci	for ((str) = 0; (str) < 2; (str)++) \
7362306a36Sopenharmony_ci		for ((subs) = (pcm)->streams[str].substream; (subs); \
7462306a36Sopenharmony_ci		     (subs) = (subs)->next)
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_cistatic inline void snd_pcm_dma_buffer_sync(struct snd_pcm_substream *substream,
7762306a36Sopenharmony_ci					   enum snd_dma_sync_mode mode)
7862306a36Sopenharmony_ci{
7962306a36Sopenharmony_ci	if (substream->runtime->info & SNDRV_PCM_INFO_EXPLICIT_SYNC)
8062306a36Sopenharmony_ci		snd_dma_buffer_sync(snd_pcm_get_dma_buf(substream), mode);
8162306a36Sopenharmony_ci}
8262306a36Sopenharmony_ci
8362306a36Sopenharmony_ci#endif	/* __SOUND_CORE_PCM_LOCAL_H */
84