aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCharles Keepax <ckeepax@opensource.wolfsonmicro.com>2016-03-28 09:29:24 -0400
committerMark Brown <broonie@kernel.org>2016-03-29 13:11:10 -0400
commitc13202f7d7101a6f5542f3a31b9a6787ae7b746c (patch)
tree574af44434c13370f1017a7b864c1f7c533186d6
parent9abe3dc77ea7ccad1c2112257bb352435dcee0ff (diff)
ASoC: cs47l24: Add support for audio trace firmware
cs47l24 supports the audio trace firmware, this streams of audio to be captured from the CODEC over a compressed audio channel for analysis/debugging of audio processing firmwares. Signed-off-by: Charles Keepax <ckeepax@opensource.wolfsonmicro.com> Signed-off-by: Mark Brown <broonie@kernel.org>
-rw-r--r--sound/soc/codecs/cs47l24.c38
1 files changed, 35 insertions, 3 deletions
diff --git a/sound/soc/codecs/cs47l24.c b/sound/soc/codecs/cs47l24.c
index 383700a178c7..6b8b5571d3cc 100644
--- a/sound/soc/codecs/cs47l24.c
+++ b/sound/soc/codecs/cs47l24.c
@@ -807,6 +807,9 @@ static const struct snd_soc_dapm_route cs47l24_dapm_routes[] = {
807 { "IN2L PGA", NULL, "IN2L" }, 807 { "IN2L PGA", NULL, "IN2L" },
808 { "IN2R PGA", NULL, "IN2R" }, 808 { "IN2R PGA", NULL, "IN2R" },
809 809
810 { "Audio Trace DSP", NULL, "DSP2" },
811 { "Audio Trace DSP", NULL, "SYSCLK" },
812
810 ARIZONA_MIXER_ROUTES("OUT1L", "HPOUT1L"), 813 ARIZONA_MIXER_ROUTES("OUT1L", "HPOUT1L"),
811 ARIZONA_MIXER_ROUTES("OUT1R", "HPOUT1R"), 814 ARIZONA_MIXER_ROUTES("OUT1R", "HPOUT1R"),
812 815
@@ -1016,6 +1019,27 @@ static struct snd_soc_dai_driver cs47l24_dai[] = {
1016 .formats = CS47L24_FORMATS, 1019 .formats = CS47L24_FORMATS,
1017 }, 1020 },
1018 }, 1021 },
1022 {
1023 .name = "cs47l24-cpu-trace",
1024 .capture = {
1025 .stream_name = "Audio Trace CPU",
1026 .channels_min = 1,
1027 .channels_max = 6,
1028 .rates = CS47L24_RATES,
1029 .formats = CS47L24_FORMATS,
1030 },
1031 .compress_new = snd_soc_new_compress,
1032 },
1033 {
1034 .name = "cs47l24-dsp-trace",
1035 .capture = {
1036 .stream_name = "Audio Trace DSP",
1037 .channels_min = 1,
1038 .channels_max = 6,
1039 .rates = CS47L24_RATES,
1040 .formats = CS47L24_FORMATS,
1041 },
1042 },
1019}; 1043};
1020 1044
1021static int cs47l24_open(struct snd_compr_stream *stream) 1045static int cs47l24_open(struct snd_compr_stream *stream)
@@ -1027,6 +1051,8 @@ static int cs47l24_open(struct snd_compr_stream *stream)
1027 1051
1028 if (strcmp(rtd->codec_dai->name, "cs47l24-dsp-voicectrl") == 0) { 1052 if (strcmp(rtd->codec_dai->name, "cs47l24-dsp-voicectrl") == 0) {
1029 n_adsp = 2; 1053 n_adsp = 2;
1054 } else if (strcmp(rtd->codec_dai->name, "cs47l24-dsp-trace") == 0) {
1055 n_adsp = 1;
1030 } else { 1056 } else {
1031 dev_err(arizona->dev, 1057 dev_err(arizona->dev,
1032 "No suitable compressed stream for DAI '%s'\n", 1058 "No suitable compressed stream for DAI '%s'\n",
@@ -1041,10 +1067,16 @@ static irqreturn_t cs47l24_adsp2_irq(int irq, void *data)
1041{ 1067{
1042 struct cs47l24_priv *priv = data; 1068 struct cs47l24_priv *priv = data;
1043 struct arizona *arizona = priv->core.arizona; 1069 struct arizona *arizona = priv->core.arizona;
1044 int ret; 1070 int serviced = 0;
1071 int i, ret;
1072
1073 for (i = 1; i <= 2; ++i) {
1074 ret = wm_adsp_compr_handle_irq(&priv->core.adsp[i]);
1075 if (ret != -ENODEV)
1076 serviced++;
1077 }
1045 1078
1046 ret = wm_adsp_compr_handle_irq(&priv->core.adsp[2]); 1079 if (!serviced) {
1047 if (ret == -ENODEV) {
1048 dev_err(arizona->dev, "Spurious compressed data IRQ\n"); 1080 dev_err(arizona->dev, "Spurious compressed data IRQ\n");
1049 return IRQ_NONE; 1081 return IRQ_NONE;
1050 } 1082 }