mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-06 05:13:18 +00:00
Fixes for McASP and dmaengine_pcm
Merge series from Jai Luthra <j-luthra@ti.com>: This series fixes two patches: 1. Fix the dmaengine API usage by calling dmaengine_synchronize() after dmaengine_terminate_async() when xrun events occur in application 2. Use the McASP AFIFO property from DT to refine the period size, instead of hardcoding minimum to 64 samples
This commit is contained in:
commit
37a2c94c68
@ -36,6 +36,7 @@ snd_pcm_uframes_t snd_dmaengine_pcm_pointer_no_residue(struct snd_pcm_substream
|
||||
int snd_dmaengine_pcm_open(struct snd_pcm_substream *substream,
|
||||
struct dma_chan *chan);
|
||||
int snd_dmaengine_pcm_close(struct snd_pcm_substream *substream);
|
||||
int snd_dmaengine_pcm_sync_stop(struct snd_pcm_substream *substream);
|
||||
|
||||
int snd_dmaengine_pcm_open_request_chan(struct snd_pcm_substream *substream,
|
||||
dma_filter_fn filter_fn, void *filter_data);
|
||||
|
@ -349,6 +349,16 @@ int snd_dmaengine_pcm_open_request_chan(struct snd_pcm_substream *substream,
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_dmaengine_pcm_open_request_chan);
|
||||
|
||||
int snd_dmaengine_pcm_sync_stop(struct snd_pcm_substream *substream)
|
||||
{
|
||||
struct dmaengine_pcm_runtime_data *prtd = substream_to_prtd(substream);
|
||||
|
||||
dmaengine_synchronize(prtd->dma_chan);
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_dmaengine_pcm_sync_stop);
|
||||
|
||||
/**
|
||||
* snd_dmaengine_pcm_close - Close a dmaengine based PCM substream
|
||||
* @substream: PCM substream
|
||||
|
@ -318,6 +318,12 @@ static int dmaengine_copy(struct snd_soc_component *component,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int dmaengine_pcm_sync_stop(struct snd_soc_component *component,
|
||||
struct snd_pcm_substream *substream)
|
||||
{
|
||||
return snd_dmaengine_pcm_sync_stop(substream);
|
||||
}
|
||||
|
||||
static const struct snd_soc_component_driver dmaengine_pcm_component = {
|
||||
.name = SND_DMAENGINE_PCM_DRV_NAME,
|
||||
.probe_order = SND_SOC_COMP_ORDER_LATE,
|
||||
@ -327,6 +333,7 @@ static const struct snd_soc_component_driver dmaengine_pcm_component = {
|
||||
.trigger = dmaengine_pcm_trigger,
|
||||
.pointer = dmaengine_pcm_pointer,
|
||||
.pcm_construct = dmaengine_pcm_new,
|
||||
.sync_stop = dmaengine_pcm_sync_stop,
|
||||
};
|
||||
|
||||
static const struct snd_soc_component_driver dmaengine_pcm_component_process = {
|
||||
@ -339,6 +346,7 @@ static const struct snd_soc_component_driver dmaengine_pcm_component_process = {
|
||||
.pointer = dmaengine_pcm_pointer,
|
||||
.copy = dmaengine_copy,
|
||||
.pcm_construct = dmaengine_pcm_new,
|
||||
.sync_stop = dmaengine_pcm_sync_stop,
|
||||
};
|
||||
|
||||
static const char * const dmaengine_pcm_dma_channel_names[] = {
|
||||
|
@ -1472,10 +1472,11 @@ static int davinci_mcasp_hw_rule_min_periodsize(
|
||||
{
|
||||
struct snd_interval *period_size = hw_param_interval(params,
|
||||
SNDRV_PCM_HW_PARAM_PERIOD_SIZE);
|
||||
u8 numevt = *((u8 *)rule->private);
|
||||
struct snd_interval frames;
|
||||
|
||||
snd_interval_any(&frames);
|
||||
frames.min = 64;
|
||||
frames.min = numevt;
|
||||
frames.integer = 1;
|
||||
|
||||
return snd_interval_refine(period_size, &frames);
|
||||
@ -1490,6 +1491,7 @@ static int davinci_mcasp_startup(struct snd_pcm_substream *substream,
|
||||
u32 max_channels = 0;
|
||||
int i, dir, ret;
|
||||
int tdm_slots = mcasp->tdm_slots;
|
||||
u8 *numevt;
|
||||
|
||||
/* Do not allow more then one stream per direction */
|
||||
if (mcasp->substreams[substream->stream])
|
||||
@ -1589,9 +1591,12 @@ static int davinci_mcasp_startup(struct snd_pcm_substream *substream,
|
||||
return ret;
|
||||
}
|
||||
|
||||
numevt = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) ?
|
||||
&mcasp->txnumevt :
|
||||
&mcasp->rxnumevt;
|
||||
snd_pcm_hw_rule_add(substream->runtime, 0,
|
||||
SNDRV_PCM_HW_PARAM_PERIOD_SIZE,
|
||||
davinci_mcasp_hw_rule_min_periodsize, NULL,
|
||||
davinci_mcasp_hw_rule_min_periodsize, numevt,
|
||||
SNDRV_PCM_HW_PARAM_PERIOD_SIZE, -1);
|
||||
|
||||
return 0;
|
||||
|
Loading…
Reference in New Issue
Block a user