Unverified Commit 37a2c94c authored by Mark Brown's avatar Mark Brown
Browse files

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
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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);
+10 −0
Original line number Diff line number Diff line
@@ -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
+8 −0
Original line number Diff line number Diff line
@@ -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[] = {
+7 −2
Original line number Diff line number Diff line
@@ -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;