[2/5] ASoC: pcm179x: Refactor regmap value lookup

Message ID 20261002090308.941453-3-roman@amarulasolutions.com
State Superseded
Headers
Series ASoC: pcm179x: Add support for pcm1795 and pcm1796 |

Commit Message

Roman Smrž Oct. 2, 2026, 9:03 a.m. UTC
Use a table lookup to find values for fmt register instead of switch
statements to prepare for additional codec variants of the same family.

Signed-off-by: Roman Smrž <roman@amarulasolutions.com>
---
 sound/soc/codecs/pcm179x.c | 60 +++++++++++++++++++-------------------
 1 file changed, 30 insertions(+), 30 deletions(-)
  

Comments

Dario Binacchi Oct. 2, 2026, 9:23 a.m. UTC | #1
Hi Roman

On Fri, Oct 2, 2026 at 11:03 AM Roman Smrž <roman@amarulasolutions.com> wrote:
>
> Use a table lookup to find values for fmt register instead of switch
> statements to prepare for additional codec variants of the same family.
>
> Signed-off-by: Roman Smrž <roman@amarulasolutions.com>
> ---
>  sound/soc/codecs/pcm179x.c | 60 +++++++++++++++++++-------------------
>  1 file changed, 30 insertions(+), 30 deletions(-)
>
> diff --git a/sound/soc/codecs/pcm179x.c b/sound/soc/codecs/pcm179x.c
> index cb70927872aa..61b87dab3266 100644
> --- a/sound/soc/codecs/pcm179x.c
> +++ b/sound/soc/codecs/pcm179x.c
> @@ -65,6 +65,31 @@ struct pcm179x_private {
>         unsigned int rate;
>  };
>
> +struct pcm179x_fmt_table {
> +       unsigned int fmt;       /* SND_SOC_DAIFMT_* */
> +       unsigned int width;     /* sample width in bits */
> +       unsigned int value;     /* FMT[2:0] */
> +};
> +
> +static const struct pcm179x_fmt_table pcm1792a_fmt[] = {
> +       { SND_SOC_DAIFMT_RIGHT_J, 16, 0 },
> +       { SND_SOC_DAIFMT_RIGHT_J, 24, 2 },
> +       { SND_SOC_DAIFMT_RIGHT_J, 32, 2 },
> +       { SND_SOC_DAIFMT_I2S,     16, 4 },
> +       { SND_SOC_DAIFMT_I2S,     24, 5 },
> +       { SND_SOC_DAIFMT_I2S,     32, 5 },
> +};
> +
> +static int pcm179x_fmt_value(struct pcm179x_private *priv, unsigned int fmt,
> +                            unsigned int width)
> +{
> +       for (unsigned int i = 0; i < ARRAY_SIZE(pcm1792a_fmt); i++)
> +               if (pcm1792a_fmt[i].fmt == fmt && pcm1792a_fmt[i].width == width)
> +                       return pcm1792a_fmt[i].value;
> +
> +       return -EINVAL;
> +}
> +
>  static int pcm179x_set_dai_fmt(struct snd_soc_dai *codec_dai,
>                               unsigned int format)
>  {
> @@ -96,40 +121,15 @@ static int pcm179x_hw_params(struct snd_pcm_substream *substream,
>  {
>         struct snd_soc_component *component = dai->component;
>         struct pcm179x_private *priv = snd_soc_component_get_drvdata(component);
> -       int val = 0, ret;
> +       int val, ret;
>
>         priv->rate = params_rate(params);
>
> -       switch (priv->format & SND_SOC_DAIFMT_FORMAT_MASK) {
> -       case SND_SOC_DAIFMT_RIGHT_J:
> -               switch (params_width(params)) {
> -               case 24:
> -               case 32:
> -                       val = 2;
> -                       break;
> -               case 16:
> -                       val = 0;
> -                       break;
> -               default:
> -                       return -EINVAL;
> -               }
> -               break;
> -       case SND_SOC_DAIFMT_I2S:
> -               switch (params_width(params)) {
> -               case 24:
> -               case 32:
> -                       val = 5;
> -                       break;
> -               case 16:
> -                       val = 4;
> -                       break;
> -               default:
> -                       return -EINVAL;
> -               }
> -               break;
> -       default:
> +       val = pcm179x_fmt_value(priv, priv->format & SND_SOC_DAIFMT_FORMAT_MASK,
> +                               params_width(params));
> +       if (val < 0) {
>                 dev_err(component->dev, "Invalid DAI format\n");
> -               return -EINVAL;
> +               return val;
>         }
>
>         val = val << PCM179X_FMT_SHIFT | PCM179X_ATLD_ENABLE;
> --
> 2.55.0
>
>

Reviewed-by: Dario Binacchi <dario.binacchi@amarulasolutions.com>

Regards,
Dario
  

Patch

diff --git a/sound/soc/codecs/pcm179x.c b/sound/soc/codecs/pcm179x.c
index cb70927872aa..61b87dab3266 100644
--- a/sound/soc/codecs/pcm179x.c
+++ b/sound/soc/codecs/pcm179x.c
@@ -65,6 +65,31 @@  struct pcm179x_private {
 	unsigned int rate;
 };
 
+struct pcm179x_fmt_table {
+	unsigned int fmt;	/* SND_SOC_DAIFMT_* */
+	unsigned int width;	/* sample width in bits */
+	unsigned int value;	/* FMT[2:0] */
+};
+
+static const struct pcm179x_fmt_table pcm1792a_fmt[] = {
+	{ SND_SOC_DAIFMT_RIGHT_J, 16, 0 },
+	{ SND_SOC_DAIFMT_RIGHT_J, 24, 2 },
+	{ SND_SOC_DAIFMT_RIGHT_J, 32, 2 },
+	{ SND_SOC_DAIFMT_I2S,     16, 4 },
+	{ SND_SOC_DAIFMT_I2S,     24, 5 },
+	{ SND_SOC_DAIFMT_I2S,     32, 5 },
+};
+
+static int pcm179x_fmt_value(struct pcm179x_private *priv, unsigned int fmt,
+			     unsigned int width)
+{
+	for (unsigned int i = 0; i < ARRAY_SIZE(pcm1792a_fmt); i++)
+		if (pcm1792a_fmt[i].fmt == fmt && pcm1792a_fmt[i].width == width)
+			return pcm1792a_fmt[i].value;
+
+	return -EINVAL;
+}
+
 static int pcm179x_set_dai_fmt(struct snd_soc_dai *codec_dai,
                              unsigned int format)
 {
@@ -96,40 +121,15 @@  static int pcm179x_hw_params(struct snd_pcm_substream *substream,
 {
 	struct snd_soc_component *component = dai->component;
 	struct pcm179x_private *priv = snd_soc_component_get_drvdata(component);
-	int val = 0, ret;
+	int val, ret;
 
 	priv->rate = params_rate(params);
 
-	switch (priv->format & SND_SOC_DAIFMT_FORMAT_MASK) {
-	case SND_SOC_DAIFMT_RIGHT_J:
-		switch (params_width(params)) {
-		case 24:
-		case 32:
-			val = 2;
-			break;
-		case 16:
-			val = 0;
-			break;
-		default:
-			return -EINVAL;
-		}
-		break;
-	case SND_SOC_DAIFMT_I2S:
-		switch (params_width(params)) {
-		case 24:
-		case 32:
-			val = 5;
-			break;
-		case 16:
-			val = 4;
-			break;
-		default:
-			return -EINVAL;
-		}
-		break;
-	default:
+	val = pcm179x_fmt_value(priv, priv->format & SND_SOC_DAIFMT_FORMAT_MASK,
+				params_width(params));
+	if (val < 0) {
 		dev_err(component->dev, "Invalid DAI format\n");
-		return -EINVAL;
+		return val;
 	}
 
 	val = val << PCM179X_FMT_SHIFT | PCM179X_ATLD_ENABLE;