[alsa-devel] [RFC 3/3] ASoC: davinci-mcasp: add cpu dai health callback
Ben Gardiner
bengardiner at nanometrics.ca
Fri Sep 30 23:23:03 CEST 2011
The McASP has RERR and XERR bits in its RSTAT and XSTAT registers which
report the OR'd state of several potential errors.
Register a function to check the status of these bits and report HW errors
back up the stack.
[not ready yet, please comment]
Not-Signed-off-by: Ben Gardiner <bengardiner at nanometrics.ca>
---
sound/soc/davinci/davinci-mcasp.c | 26 ++++++++++++++++++++++++++
1 files changed, 26 insertions(+), 0 deletions(-)
diff --git a/sound/soc/davinci/davinci-mcasp.c b/sound/soc/davinci/davinci-mcasp.c
index 7173df2..ca4073f 100644
--- a/sound/soc/davinci/davinci-mcasp.c
+++ b/sound/soc/davinci/davinci-mcasp.c
@@ -273,6 +273,11 @@
#define MUTETXDMAERR BIT(12)
/*
+ * DAVINCI_MCASP_RXSTAT_REG - Receiver Status Register bits
+ */
+#define RERR BIT(8)
+
+/*
* DAVINCI_MCASP_REVTCTL_REG - Receiver DMA Event Control Register bits
*/
#define RXDATADMADIS BIT(0)
@@ -283,6 +288,11 @@
#define TXDATADMADIS BIT(0)
/*
+ * DAVINCI_MCASP_TXSTAT_REG - Transmitter Status Register bits
+ */
+#define XERR BIT(8)
+
+/*
* DAVINCI_MCASP_W[R]FIFOCTL - Write/Read FIFO Control Register bits
*/
#define FIFO_ENABLE BIT(16)
@@ -813,6 +823,19 @@ static int davinci_mcasp_startup(struct snd_pcm_substream *substream,
return 0;
}
+static int davinci_mcasp_health(struct snd_pcm_substream *substream,
+ void *data)
+{
+ struct davinci_audio_dev *dev = data;
+
+ if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
+ return mcasp_get_reg(dev->base + DAVINCI_MCASP_TXSTAT_REG) &
+ XERR;
+ else
+ return mcasp_get_reg(dev->base + DAVINCI_MCASP_RXSTAT_REG) &
+ RERR;
+}
+
static struct snd_soc_dai_ops davinci_mcasp_dai_ops = {
.startup = davinci_mcasp_startup,
.trigger = davinci_mcasp_trigger,
@@ -919,6 +942,9 @@ static int davinci_mcasp_probe(struct platform_device *pdev)
dma_data->dma_addr = (dma_addr_t) (pdata->tx_dma_offset +
mem->start);
+ dma_data->health = davinci_mcasp_health;
+ dma_data->health_drvdata = dev;
+
/* first TX, then RX */
res = platform_get_resource(pdev, IORESOURCE_DMA, 0);
if (!res) {
--
1.7.4.1
More information about the Alsa-devel
mailing list