[alsa-devel] [RFC 2/3] ASoC: davinci-pcm: add cpu-dai health callbacks
Ben Gardiner
bengardiner at nanometrics.ca
Fri Sep 30 23:23:02 CEST 2011
The CPU DAIs available to the davinci-pcm driver have the capability of
detecting and reporting errors.
Add callbacks to the struct davinci_pcm_dma_params passed to davinci-pcm
from the CPU DAI.
This has several shortcomings:
1) It bubbles up to the user as underruns, not a fatal error -- some may prefer
the former, I realize but the latter is more attractive to me. Same problem
as with the previous patch in this series.
2) passing it in the dma_params struct seems like dual-purposing that structure
3) the device instance must be passed as drvdata since I did not know how to get
back to the cpudai instance from a substream (sorry, please help!)
[not ready yet, please comment]
Not-Signed-off-by: Ben Gardiner <bengardiner at nanometrics.ca>
---
sound/soc/davinci/davinci-pcm.c | 8 +++++++-
sound/soc/davinci/davinci-pcm.h | 3 +++
2 files changed, 10 insertions(+), 1 deletions(-)
diff --git a/sound/soc/davinci/davinci-pcm.c b/sound/soc/davinci/davinci-pcm.c
index 41a3b5b..cb0e296 100644
--- a/sound/soc/davinci/davinci-pcm.c
+++ b/sound/soc/davinci/davinci-pcm.c
@@ -156,6 +156,8 @@ struct davinci_runtime_data {
struct edmacc_param asp_params;
struct edmacc_param ram_params;
unsigned error:1;
+ int (*cpudai_health)(struct snd_pcm_substream *, void *);
+ void *health_drvdata;
};
static void davinci_pcm_period_elapsed(struct snd_pcm_substream *substream)
@@ -655,7 +657,8 @@ davinci_pcm_pointer(struct snd_pcm_substream *substream)
error = prtd->error;
spin_unlock(&prtd->lock);
- if (error)
+ if (error || (prtd->cpudai_health &&
+ prtd->cpudai_health(substream, prtd->health_drvdata)))
return SNDRV_PCM_POS_XRUN;
if (asp_count < 0)
@@ -706,6 +709,9 @@ static int davinci_pcm_open(struct snd_pcm_substream *substream)
prtd->ram_link = -1;
prtd->ram_link2 = -1;
+ prtd->cpudai_health = pa->health;
+ prtd->health_drvdata = pa->health_drvdata;
+
runtime->private_data = prtd;
ret = davinci_pcm_dma_request(substream);
diff --git a/sound/soc/davinci/davinci-pcm.h b/sound/soc/davinci/davinci-pcm.h
index c0d6c9b..0474d97 100644
--- a/sound/soc/davinci/davinci-pcm.h
+++ b/sound/soc/davinci/davinci-pcm.h
@@ -26,6 +26,9 @@ struct davinci_pcm_dma_params {
unsigned char data_type; /* xfer data type */
unsigned char convert_mono_stereo;
unsigned int fifo_level;
+
+ int (*health)(struct snd_pcm_substream *, void *drvdata);
+ void *health_drvdata;
};
#endif
--
1.7.4.1
More information about the Alsa-devel
mailing list