On Thu, Jul 29, 2021 at 06:23:10PM +0100, Biju Das wrote:
+config SND_SOC_RZ
- tristate "RZ/G2L series SSIF-2 support"
- depends on ARCH_R9A07G044 || COMPILE_TEST
- select SND_SIMPLE_CARD
- help
Why is the DAI selecting a specific sound card, and if it must then why would it use simple-card and not the more modern audio-graph-card? The select should almost certainly just be removed entirely, this is not something DAI drivers do - cards use DAIs, not the other way around.
+++ b/sound/soc/sh/rz-ssi.c @@ -0,0 +1,871 @@ +// SPDX-License-Identifier: GPL-2.0 +/*
- Renesas RZ/G2L ASoC Serial Sound Interface (SSIF-2) Driver
- Copyright (C) 2021 Renesas Electronics Corp.
Please make the entire comment a C++ one so things look more intentional.
+static int rz_ssi_stream_init(struct rz_ssi_priv *ssi,
struct rz_ssi_stream *strm,
struct snd_pcm_substream *substream)
+{
- struct snd_pcm_runtime *runtime = substream->runtime;
- strm->substream = substream;
- if (runtime->sample_bits != 16) {
dev_err(ssi->dev, "Unsupported sample width: %d\n",
runtime->sample_bits);
strm->substream = NULL;
return -EINVAL;
- }
- if (runtime->frame_bits != 32) {
dev_err(ssi->dev, "Unsupported frame width: %d\n",
runtime->sample_bits);
strm->substream = NULL;
return -EINVAL;
- }
- if (runtime->channels != 2) {
dev_err(ssi->dev, "Number of channels not matched\n");
strm->substream = NULL;
return -EINVAL;
- }
Why are we only validating these here which is called from...
- switch (cmd) {
- case SNDRV_PCM_TRIGGER_START:
/* Soft Reset */
rz_ssi_reg_mask_setl(ssi, SSIFCR, 0, SSIFCR_SSIRST);
rz_ssi_reg_mask_setl(ssi, SSIFCR, SSIFCR_SSIRST, 0);
udelay(5);
ret = rz_ssi_stream_init(ssi, strm, substream);
if (ret)
goto done;
...trigger. This stuff should be being validated when we set parameters in hw_params() and can usefully report the error.
+static int rz_ssi_dai_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) +{
- struct rz_ssi_priv *ssi = snd_soc_dai_get_drvdata(dai);
- /* set master/slave audio interface */
- switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
- case SND_SOC_DAIFMT_CBS_CFS:
asm("nop"); /* codec is slave */
break;
That asm("nop") looks interesting... I can't think why that'd be needed? Please also use the modern versions of these defines, consumer and provider rather than slave and master.