Skip to content

Commit c337bf3

Browse files
Srinivas-Kandagatlabroonie
authored andcommitted
ASoC: q6dsp: q6apm-dai: Add trigger/pointer compress DAI callbacks
Add q6apm trigger and pointer compress DAI callbacks to support compress offload playback. Co-developed-by: Mohammad Rafi Shaik <quic_mohs@quicinc.com> Signed-off-by: Mohammad Rafi Shaik <quic_mohs@quicinc.com> Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org> Link: https://lore.kernel.org/r/20230619101653.9750-10-srinivas.kandagatla@linaro.org Signed-off-by: Mark Brown <broonie@kernel.org>
1 parent c0c8773 commit c337bf3

2 files changed

Lines changed: 68 additions & 0 deletions

File tree

sound/soc/qcom/qdsp6/q6apm-dai.c

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -568,11 +568,78 @@ static int q6apm_dai_compr_get_codec_caps(struct snd_soc_component *component,
568568

569569
return 0;
570570
}
571+
572+
static int q6apm_dai_compr_pointer(struct snd_soc_component *component,
573+
struct snd_compr_stream *stream,
574+
struct snd_compr_tstamp *tstamp)
575+
{
576+
struct snd_compr_runtime *runtime = stream->runtime;
577+
struct q6apm_dai_rtd *prtd = runtime->private_data;
578+
unsigned long flags;
579+
580+
spin_lock_irqsave(&prtd->lock, flags);
581+
tstamp->copied_total = prtd->copied_total;
582+
tstamp->byte_offset = prtd->copied_total % prtd->pcm_size;
583+
spin_unlock_irqrestore(&prtd->lock, flags);
584+
585+
return 0;
586+
}
587+
588+
static int q6apm_dai_compr_trigger(struct snd_soc_component *component,
589+
struct snd_compr_stream *stream, int cmd)
590+
{
591+
struct snd_compr_runtime *runtime = stream->runtime;
592+
struct q6apm_dai_rtd *prtd = runtime->private_data;
593+
int ret = 0;
594+
595+
switch (cmd) {
596+
case SNDRV_PCM_TRIGGER_START:
597+
case SNDRV_PCM_TRIGGER_RESUME:
598+
case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
599+
ret = q6apm_write_async(prtd->graph, prtd->pcm_count, 0, 0, NO_TIMESTAMP);
600+
break;
601+
case SNDRV_PCM_TRIGGER_STOP:
602+
break;
603+
case SNDRV_PCM_TRIGGER_SUSPEND:
604+
case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
605+
break;
606+
case SND_COMPR_TRIGGER_NEXT_TRACK:
607+
prtd->next_track = true;
608+
break;
609+
case SND_COMPR_TRIGGER_DRAIN:
610+
case SND_COMPR_TRIGGER_PARTIAL_DRAIN:
611+
prtd->notify_on_drain = true;
612+
break;
613+
default:
614+
ret = -EINVAL;
615+
break;
616+
}
617+
618+
return ret;
619+
}
620+
621+
static int q6apm_dai_compr_ack(struct snd_soc_component *component, struct snd_compr_stream *stream,
622+
size_t count)
623+
{
624+
struct snd_compr_runtime *runtime = stream->runtime;
625+
struct q6apm_dai_rtd *prtd = runtime->private_data;
626+
unsigned long flags;
627+
628+
spin_lock_irqsave(&prtd->lock, flags);
629+
prtd->bytes_received += count;
630+
spin_unlock_irqrestore(&prtd->lock, flags);
631+
632+
return count;
633+
}
634+
571635
static const struct snd_compress_ops q6apm_dai_compress_ops = {
572636
.open = q6apm_dai_compr_open,
573637
.free = q6apm_dai_compr_free,
574638
.get_caps = q6apm_dai_compr_get_caps,
575639
.get_codec_caps = q6apm_dai_compr_get_codec_caps,
640+
.pointer = q6apm_dai_compr_pointer,
641+
.trigger = q6apm_dai_compr_trigger,
642+
.ack = q6apm_dai_compr_ack,
576643
};
577644

578645
static const struct snd_soc_component_driver q6apm_fe_dai_component = {

sound/soc/qcom/qdsp6/q6apm.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646

4747
#define APM_MAX_SESSIONS 8
4848
#define APM_LAST_BUFFER_FLAG BIT(30)
49+
#define NO_TIMESTAMP 0xFF00
4950

5051
struct q6apm {
5152
struct device *dev;

0 commit comments

Comments
 (0)