[2/5] ASoC: pcm179x: Refactor regmap value lookup
Commit Message
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
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
@@ -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;