Merge tag 'asoc-v5.7' of https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound into for-linus
ASoC: Updates for v5.7 This is a very big update for the core since Morimoto-san has been rather busy continuing his refactorings to clean up a lot of the cruft that we have accumilated over the years. We've also gained several new drivers, including initial (but still not complete) parts of the Intel SoundWire support. - Lots of refactorings to modernize the code from Morimoto-san. - Conversion of SND_SOC_ALL_CODECS to use imply from Geert Uytterhoeven. - Continued refactoring and fixing of the Intel support. - Soundwire and more advanced clocking support for Realtek RT5682. - Support for amlogic GX, Meson 8, Meson 8B and T9015 DAC, Broadcom DSL/PON, Ingenic JZ4760 and JZ4770, Realtek RL6231, and TI TAS2563 and TLV320ADCX140.
This commit is contained in:
@@ -488,6 +488,48 @@ out:
|
||||
}
|
||||
#endif /* !COMPR_CODEC_CAPS_OVERFLOW */
|
||||
|
||||
int snd_compr_malloc_pages(struct snd_compr_stream *stream, size_t size)
|
||||
{
|
||||
struct snd_dma_buffer *dmab;
|
||||
int ret;
|
||||
|
||||
if (snd_BUG_ON(!(stream) || !(stream)->runtime))
|
||||
return -EINVAL;
|
||||
dmab = kzalloc(sizeof(*dmab), GFP_KERNEL);
|
||||
if (!dmab)
|
||||
return -ENOMEM;
|
||||
dmab->dev = stream->dma_buffer.dev;
|
||||
ret = snd_dma_alloc_pages(dmab->dev.type, dmab->dev.dev, size, dmab);
|
||||
if (ret < 0) {
|
||||
kfree(dmab);
|
||||
return ret;
|
||||
}
|
||||
|
||||
snd_compr_set_runtime_buffer(stream, dmab);
|
||||
stream->runtime->dma_bytes = size;
|
||||
return 1;
|
||||
}
|
||||
EXPORT_SYMBOL(snd_compr_malloc_pages);
|
||||
|
||||
int snd_compr_free_pages(struct snd_compr_stream *stream)
|
||||
{
|
||||
struct snd_compr_runtime *runtime = stream->runtime;
|
||||
|
||||
if (snd_BUG_ON(!(stream) || !(stream)->runtime))
|
||||
return -EINVAL;
|
||||
if (runtime->dma_area == NULL)
|
||||
return 0;
|
||||
if (runtime->dma_buffer_p != &stream->dma_buffer) {
|
||||
/* It's a newly allocated buffer. Release it now. */
|
||||
snd_dma_free_pages(runtime->dma_buffer_p);
|
||||
kfree(runtime->dma_buffer_p);
|
||||
}
|
||||
|
||||
snd_compr_set_runtime_buffer(stream, NULL);
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(snd_compr_free_pages);
|
||||
|
||||
/* revisit this with snd_pcm_preallocate_xxx */
|
||||
static int snd_compr_allocate_buffer(struct snd_compr_stream *stream,
|
||||
struct snd_compr_params *params)
|
||||
|
@@ -240,6 +240,7 @@ EXPORT_SYMBOL_GPL(snd_dmaengine_pcm_pointer_no_residue);
|
||||
snd_pcm_uframes_t snd_dmaengine_pcm_pointer(struct snd_pcm_substream *substream)
|
||||
{
|
||||
struct dmaengine_pcm_runtime_data *prtd = substream_to_prtd(substream);
|
||||
struct snd_pcm_runtime *runtime = substream->runtime;
|
||||
struct dma_tx_state state;
|
||||
enum dma_status status;
|
||||
unsigned int buf_size;
|
||||
@@ -250,9 +251,12 @@ snd_pcm_uframes_t snd_dmaengine_pcm_pointer(struct snd_pcm_substream *substream)
|
||||
buf_size = snd_pcm_lib_buffer_bytes(substream);
|
||||
if (state.residue > 0 && state.residue <= buf_size)
|
||||
pos = buf_size - state.residue;
|
||||
|
||||
runtime->delay = bytes_to_frames(runtime,
|
||||
state.in_flight_bytes);
|
||||
}
|
||||
|
||||
return bytes_to_frames(substream->runtime, pos);
|
||||
return bytes_to_frames(runtime, pos);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_dmaengine_pcm_pointer);
|
||||
|
||||
|
@@ -479,32 +479,32 @@ int snd_pcm_format_set_silence(snd_pcm_format_t format, void *data, unsigned int
|
||||
EXPORT_SYMBOL(snd_pcm_format_set_silence);
|
||||
|
||||
/**
|
||||
* snd_pcm_limit_hw_rates - determine rate_min/rate_max fields
|
||||
* @runtime: the runtime instance
|
||||
* snd_pcm_hw_limit_rates - determine rate_min/rate_max fields
|
||||
* @hw: the pcm hw instance
|
||||
*
|
||||
* Determines the rate_min and rate_max fields from the rates bits of
|
||||
* the given runtime->hw.
|
||||
* the given hw.
|
||||
*
|
||||
* Return: Zero if successful.
|
||||
*/
|
||||
int snd_pcm_limit_hw_rates(struct snd_pcm_runtime *runtime)
|
||||
int snd_pcm_hw_limit_rates(struct snd_pcm_hardware *hw)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < (int)snd_pcm_known_rates.count; i++) {
|
||||
if (runtime->hw.rates & (1 << i)) {
|
||||
runtime->hw.rate_min = snd_pcm_known_rates.list[i];
|
||||
if (hw->rates & (1 << i)) {
|
||||
hw->rate_min = snd_pcm_known_rates.list[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
for (i = (int)snd_pcm_known_rates.count - 1; i >= 0; i--) {
|
||||
if (runtime->hw.rates & (1 << i)) {
|
||||
runtime->hw.rate_max = snd_pcm_known_rates.list[i];
|
||||
if (hw->rates & (1 << i)) {
|
||||
hw->rate_max = snd_pcm_known_rates.list[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(snd_pcm_limit_hw_rates);
|
||||
EXPORT_SYMBOL(snd_pcm_hw_limit_rates);
|
||||
|
||||
/**
|
||||
* snd_pcm_rate_to_rate_bit - converts sample rate to SNDRV_PCM_RATE_xxx bit
|
||||
|
Reference in New Issue
Block a user