Commit 37a2c94c authored by Mark Brown's avatar Mark Brown

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
parents 524d3f12 c5dcf8ab
...@@ -36,6 +36,7 @@ snd_pcm_uframes_t snd_dmaengine_pcm_pointer_no_residue(struct snd_pcm_substream ...@@ -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, int snd_dmaengine_pcm_open(struct snd_pcm_substream *substream,
struct dma_chan *chan); struct dma_chan *chan);
int snd_dmaengine_pcm_close(struct snd_pcm_substream *substream); 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, int snd_dmaengine_pcm_open_request_chan(struct snd_pcm_substream *substream,
dma_filter_fn filter_fn, void *filter_data); dma_filter_fn filter_fn, void *filter_data);
......
...@@ -349,6 +349,16 @@ int snd_dmaengine_pcm_open_request_chan(struct snd_pcm_substream *substream, ...@@ -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); 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 * snd_dmaengine_pcm_close - Close a dmaengine based PCM substream
* @substream: PCM substream * @substream: PCM substream
......
...@@ -318,6 +318,12 @@ static int dmaengine_copy(struct snd_soc_component *component, ...@@ -318,6 +318,12 @@ static int dmaengine_copy(struct snd_soc_component *component,
return 0; 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 = { static const struct snd_soc_component_driver dmaengine_pcm_component = {
.name = SND_DMAENGINE_PCM_DRV_NAME, .name = SND_DMAENGINE_PCM_DRV_NAME,
.probe_order = SND_SOC_COMP_ORDER_LATE, .probe_order = SND_SOC_COMP_ORDER_LATE,
...@@ -327,6 +333,7 @@ static const struct snd_soc_component_driver dmaengine_pcm_component = { ...@@ -327,6 +333,7 @@ static const struct snd_soc_component_driver dmaengine_pcm_component = {
.trigger = dmaengine_pcm_trigger, .trigger = dmaengine_pcm_trigger,
.pointer = dmaengine_pcm_pointer, .pointer = dmaengine_pcm_pointer,
.pcm_construct = dmaengine_pcm_new, .pcm_construct = dmaengine_pcm_new,
.sync_stop = dmaengine_pcm_sync_stop,
}; };
static const struct snd_soc_component_driver dmaengine_pcm_component_process = { 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 = { ...@@ -339,6 +346,7 @@ static const struct snd_soc_component_driver dmaengine_pcm_component_process = {
.pointer = dmaengine_pcm_pointer, .pointer = dmaengine_pcm_pointer,
.copy = dmaengine_copy, .copy = dmaengine_copy,
.pcm_construct = dmaengine_pcm_new, .pcm_construct = dmaengine_pcm_new,
.sync_stop = dmaengine_pcm_sync_stop,
}; };
static const char * const dmaengine_pcm_dma_channel_names[] = { static const char * const dmaengine_pcm_dma_channel_names[] = {
......
...@@ -1472,10 +1472,11 @@ static int davinci_mcasp_hw_rule_min_periodsize( ...@@ -1472,10 +1472,11 @@ static int davinci_mcasp_hw_rule_min_periodsize(
{ {
struct snd_interval *period_size = hw_param_interval(params, struct snd_interval *period_size = hw_param_interval(params,
SNDRV_PCM_HW_PARAM_PERIOD_SIZE); SNDRV_PCM_HW_PARAM_PERIOD_SIZE);
u8 numevt = *((u8 *)rule->private);
struct snd_interval frames; struct snd_interval frames;
snd_interval_any(&frames); snd_interval_any(&frames);
frames.min = 64; frames.min = numevt;
frames.integer = 1; frames.integer = 1;
return snd_interval_refine(period_size, &frames); return snd_interval_refine(period_size, &frames);
...@@ -1490,6 +1491,7 @@ static int davinci_mcasp_startup(struct snd_pcm_substream *substream, ...@@ -1490,6 +1491,7 @@ static int davinci_mcasp_startup(struct snd_pcm_substream *substream,
u32 max_channels = 0; u32 max_channels = 0;
int i, dir, ret; int i, dir, ret;
int tdm_slots = mcasp->tdm_slots; int tdm_slots = mcasp->tdm_slots;
u8 *numevt;
/* Do not allow more then one stream per direction */ /* Do not allow more then one stream per direction */
if (mcasp->substreams[substream->stream]) if (mcasp->substreams[substream->stream])
...@@ -1589,9 +1591,12 @@ static int davinci_mcasp_startup(struct snd_pcm_substream *substream, ...@@ -1589,9 +1591,12 @@ static int davinci_mcasp_startup(struct snd_pcm_substream *substream,
return ret; return ret;
} }
numevt = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) ?
&mcasp->txnumevt :
&mcasp->rxnumevt;
snd_pcm_hw_rule_add(substream->runtime, 0, snd_pcm_hw_rule_add(substream->runtime, 0,
SNDRV_PCM_HW_PARAM_PERIOD_SIZE, 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); SNDRV_PCM_HW_PARAM_PERIOD_SIZE, -1);
return 0; return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment