mirror of
https://github.com/torvalds/linux.git
synced 2026-06-01 02:53:36 +02:00
ASoC: Intel: avs: Set of streaming fixes
Merge series from Cezary Rojewski <cezary.rojewski@intel.com>: Small set of patches two of which fix problems observed during shutdown and XRUN scenarios for PCM streaming. These ensure HDAudio HOST stream is reset and re-setup during XRUNs and synchronize avs_dai_fe_shutdown() and period-elapsed work (thread) so that no slab-use-after-free panics occur. The last change makes the 'format' parameter provided by a compress-application taken into account - currently its ignored. Such approach helps us increase the coverage of data probing (debug) functionality.
This commit is contained in:
commit
a35551a32d
|
|
@ -651,6 +651,7 @@ static void avs_dai_fe_shutdown(struct snd_pcm_substream *substream, struct snd_
|
|||
|
||||
data = snd_soc_dai_get_dma_data(dai, substream);
|
||||
|
||||
disable_work_sync(&data->period_elapsed_work);
|
||||
snd_hdac_ext_stream_release(data->host_stream, HDAC_EXT_STREAM_TYPE_HOST);
|
||||
avs_dai_shutdown(substream, dai);
|
||||
}
|
||||
|
|
@ -754,6 +755,8 @@ static int avs_dai_fe_prepare(struct snd_pcm_substream *substream, struct snd_so
|
|||
data = snd_soc_dai_get_dma_data(dai, substream);
|
||||
host_stream = data->host_stream;
|
||||
|
||||
if (runtime->state == SNDRV_PCM_STATE_XRUN)
|
||||
hdac_stream(host_stream)->prepared = false;
|
||||
if (hdac_stream(host_stream)->prepared)
|
||||
return 0;
|
||||
|
||||
|
|
|
|||
|
|
@ -14,8 +14,8 @@
|
|||
#include "debug.h"
|
||||
#include "messages.h"
|
||||
|
||||
static int avs_dsp_init_probe(struct avs_dev *adev, union avs_connector_node_id node_id,
|
||||
size_t buffer_size)
|
||||
static int avs_dsp_init_probe(struct avs_dev *adev, struct snd_compr_params *params, int bps,
|
||||
union avs_connector_node_id node_id, size_t buffer_size)
|
||||
{
|
||||
struct avs_probe_cfg cfg = {{0}};
|
||||
struct avs_module_entry mentry;
|
||||
|
|
@ -27,12 +27,16 @@ static int avs_dsp_init_probe(struct avs_dev *adev, union avs_connector_node_id
|
|||
return ret;
|
||||
|
||||
/*
|
||||
* Probe module uses no cycles, audio data format and input and output
|
||||
* frame sizes are unused. It is also not owned by any pipeline.
|
||||
* Probe module uses no cycles, input and output frame sizes are unused.
|
||||
* It is also not owned by any pipeline.
|
||||
*/
|
||||
cfg.base.ibs = 1;
|
||||
/* BSS module descriptor is always segment of index=2. */
|
||||
cfg.base.is_pages = mentry.segments[2].flags.length;
|
||||
cfg.base.audio_fmt.sampling_freq = params->codec.sample_rate;
|
||||
cfg.base.audio_fmt.bit_depth = bps;
|
||||
cfg.base.audio_fmt.num_channels = params->codec.ch_out;
|
||||
cfg.base.audio_fmt.valid_bit_depth = bps;
|
||||
cfg.gtw_cfg.node_id = node_id;
|
||||
cfg.gtw_cfg.dma_buffer_size = buffer_size;
|
||||
|
||||
|
|
@ -128,8 +132,6 @@ static int avs_probe_compr_set_params(struct snd_compr_stream *cstream,
|
|||
struct hdac_ext_stream *host_stream = avs_compr_get_host_stream(cstream);
|
||||
struct snd_compr_runtime *rtd = cstream->runtime;
|
||||
struct avs_dev *adev = to_avs_dev(dai->dev);
|
||||
/* compr params do not store bit depth, default to S32_LE. */
|
||||
snd_pcm_format_t format = SNDRV_PCM_FORMAT_S32_LE;
|
||||
unsigned int format_val;
|
||||
int bps, ret;
|
||||
|
||||
|
|
@ -142,7 +144,7 @@ static int avs_probe_compr_set_params(struct snd_compr_stream *cstream,
|
|||
ret = snd_compr_malloc_pages(cstream, rtd->buffer_size);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
bps = snd_pcm_format_physical_width(format);
|
||||
bps = snd_pcm_format_physical_width(params->codec.format);
|
||||
if (bps < 0)
|
||||
return bps;
|
||||
format_val = snd_hdac_stream_format(params->codec.ch_out, bps, params->codec.sample_rate);
|
||||
|
|
@ -166,7 +168,7 @@ static int avs_probe_compr_set_params(struct snd_compr_stream *cstream,
|
|||
node_id.vindex = hdac_stream(host_stream)->stream_tag - 1;
|
||||
node_id.dma_type = AVS_DMA_HDA_HOST_INPUT;
|
||||
|
||||
ret = avs_dsp_init_probe(adev, node_id, rtd->dma_bytes);
|
||||
ret = avs_dsp_init_probe(adev, params, bps, node_id, rtd->dma_bytes);
|
||||
if (ret < 0) {
|
||||
dev_err(dai->dev, "probe init failed: %d\n", ret);
|
||||
avs_dsp_enable_d0ix(adev);
|
||||
|
|
|
|||
|
|
@ -313,6 +313,7 @@ struct asoc_sdw_codec_info codec_info_list[] = {
|
|||
},
|
||||
{
|
||||
.part_id = 0x1321,
|
||||
.name_prefix = "rt1320",
|
||||
.dais = {
|
||||
{
|
||||
.direction = {true, false},
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user