* [PATCH v2 1/5] ASoC: dt-bindings: Add ti,pcm1795 and ti,pcm1796
2026-10-16 10:33 [PATCH v2 0/5] ASoC: pcm179x: Add support for pcm1795 and pcm1796 Roman Smrž
@ 2026-10-16 10:33 ` Roman Smrž
2026-10-16 10:33 ` [PATCH v2 2/5] ASoC: pcm179x: Refactor regmap value lookup Roman Smrž
` (3 subsequent siblings)
4 siblings, 0 replies; 7+ messages in thread
From: Roman Smrž @ 2026-10-16 10:33 UTC (permalink / raw)
To: Peter Rosin, Martin Povišer, Lars-Peter Clausen,
Nuno Sá, Liam Girdwood, Mark Brown, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Shenghao Ding, Kevin Lu,
Baojun Xu, Sen Wang, Jaroslav Kysela, Takashi Iwai
Cc: asahi, linux-sound, patches, devicetree, linux-kernel,
linux-amarula, Michael Trimarchi, Roman Smrž
From: Michael Trimarchi <michael@amarulasolutions.com>
The PCM1795 and PCM1796 are cost/power-reduced variants of PCM1792A.
Both are register compatible with the PCM1792A, so they belong in the
trivial codec schema.
Signed-off-by: Michael Trimarchi <michael@amarulasolutions.com>
Signed-off-by: Roman Smrž <roman@amarulasolutions.com>
---
Changes in v2:
- Updated description.
---
Documentation/devicetree/bindings/sound/trivial-codec.yaml | 2 ++
1 file changed, 2 insertions(+)
diff --git a/Documentation/devicetree/bindings/sound/trivial-codec.yaml b/Documentation/devicetree/bindings/sound/trivial-codec.yaml
index 9a35dfb17349..a24a21c855e1 100644
--- a/Documentation/devicetree/bindings/sound/trivial-codec.yaml
+++ b/Documentation/devicetree/bindings/sound/trivial-codec.yaml
@@ -36,6 +36,8 @@ properties:
- sdw3019f836300
- ti,pcm1789
- ti,pcm1792a
+ - ti,pcm1795
+ - ti,pcm1796
- ti,pcm5102a
- wlf,wm8510
- wlf,wm8523
--
2.55.0
^ permalink raw reply related [flat|nested] 7+ messages in thread* [PATCH v2 2/5] ASoC: pcm179x: Refactor regmap value lookup
2026-10-16 10:33 [PATCH v2 0/5] ASoC: pcm179x: Add support for pcm1795 and pcm1796 Roman Smrž
2026-10-16 10:33 ` [PATCH v2 1/5] ASoC: dt-bindings: Add ti,pcm1795 and ti,pcm1796 Roman Smrž
@ 2026-10-16 10:33 ` Roman Smrž
2026-10-16 10:33 ` [PATCH v2 3/5] ASoC: pcm179x: Add left-justified formats for pcm1792a Roman Smrž
` (2 subsequent siblings)
4 siblings, 0 replies; 7+ messages in thread
From: Roman Smrž @ 2026-10-16 10:33 UTC (permalink / raw)
To: Peter Rosin, Martin Povišer, Lars-Peter Clausen,
Nuno Sá, Liam Girdwood, Mark Brown, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Shenghao Ding, Kevin Lu,
Baojun Xu, Sen Wang, Jaroslav Kysela, Takashi Iwai
Cc: asahi, linux-sound, patches, devicetree, linux-kernel,
linux-amarula, Roman Smrž
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
^ permalink raw reply related [flat|nested] 7+ messages in thread* [PATCH v2 3/5] ASoC: pcm179x: Add left-justified formats for pcm1792a
2026-10-16 10:33 [PATCH v2 0/5] ASoC: pcm179x: Add support for pcm1795 and pcm1796 Roman Smrž
2026-10-16 10:33 ` [PATCH v2 1/5] ASoC: dt-bindings: Add ti,pcm1795 and ti,pcm1796 Roman Smrž
2026-10-16 10:33 ` [PATCH v2 2/5] ASoC: pcm179x: Refactor regmap value lookup Roman Smrž
@ 2026-10-16 10:33 ` Roman Smrž
2026-10-16 10:33 ` [PATCH v2 4/5] ASoC: pcm179x: Add compatible string for pcm1796 and spi_ids entry Roman Smrž
2026-10-16 10:33 ` [PATCH v2 5/5] ASoC: pcm179x: Add support for pcm1975 Roman Smrž
4 siblings, 0 replies; 7+ messages in thread
From: Roman Smrž @ 2026-10-16 10:33 UTC (permalink / raw)
To: Peter Rosin, Martin Povišer, Lars-Peter Clausen,
Nuno Sá, Liam Girdwood, Mark Brown, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Shenghao Ding, Kevin Lu,
Baojun Xu, Sen Wang, Jaroslav Kysela, Takashi Iwai
Cc: asahi, linux-sound, patches, devicetree, linux-kernel,
linux-amarula, Roman Smrž
The left-justified format is supported per the datasheet, but was
missing in the table.
Signed-off-by: Roman Smrž <roman@amarulasolutions.com>
---
sound/soc/codecs/pcm179x.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/sound/soc/codecs/pcm179x.c b/sound/soc/codecs/pcm179x.c
index 61b87dab3266..fae5de318b6e 100644
--- a/sound/soc/codecs/pcm179x.c
+++ b/sound/soc/codecs/pcm179x.c
@@ -75,6 +75,8 @@ 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_LEFT_J, 24, 3 },
+ { SND_SOC_DAIFMT_LEFT_J, 32, 3 },
{ SND_SOC_DAIFMT_I2S, 16, 4 },
{ SND_SOC_DAIFMT_I2S, 24, 5 },
{ SND_SOC_DAIFMT_I2S, 32, 5 },
@@ -144,6 +146,7 @@ static int pcm179x_hw_params(struct snd_pcm_substream *substream,
static const u64 pcm179x_selectable_formats =
SND_SOC_POSSIBLE_DAIFMT_I2S |
+ SND_SOC_POSSIBLE_DAIFMT_LEFT_J |
SND_SOC_POSSIBLE_DAIFMT_RIGHT_J;
static const struct snd_soc_dai_ops pcm179x_dai_ops = {
--
2.55.0
^ permalink raw reply related [flat|nested] 7+ messages in thread* [PATCH v2 4/5] ASoC: pcm179x: Add compatible string for pcm1796 and spi_ids entry
2026-10-16 10:33 [PATCH v2 0/5] ASoC: pcm179x: Add support for pcm1795 and pcm1796 Roman Smrž
` (2 preceding siblings ...)
2026-10-16 10:33 ` [PATCH v2 3/5] ASoC: pcm179x: Add left-justified formats for pcm1792a Roman Smrž
@ 2026-10-16 10:33 ` Roman Smrž
2026-10-16 10:33 ` [PATCH v2 5/5] ASoC: pcm179x: Add support for pcm1975 Roman Smrž
4 siblings, 0 replies; 7+ messages in thread
From: Roman Smrž @ 2026-10-16 10:33 UTC (permalink / raw)
To: Peter Rosin, Martin Povišer, Lars-Peter Clausen,
Nuno Sá, Liam Girdwood, Mark Brown, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Shenghao Ding, Kevin Lu,
Baojun Xu, Sen Wang, Jaroslav Kysela, Takashi Iwai
Cc: asahi, linux-sound, patches, devicetree, linux-kernel,
linux-amarula, Roman Smrž
The PCM1796 is fully compatible with the PCM1792A.
Signed-off-by: Roman Smrž <roman@amarulasolutions.com>
---
Changes in v2:
- Added missing entry to spi_ids.
---
sound/soc/codecs/pcm179x-i2c.c | 1 +
sound/soc/codecs/pcm179x-spi.c | 2 ++
2 files changed, 3 insertions(+)
diff --git a/sound/soc/codecs/pcm179x-i2c.c b/sound/soc/codecs/pcm179x-i2c.c
index 5337bcc7c62c..e81e20fadadf 100644
--- a/sound/soc/codecs/pcm179x-i2c.c
+++ b/sound/soc/codecs/pcm179x-i2c.c
@@ -32,6 +32,7 @@ static int pcm179x_i2c_probe(struct i2c_client *client)
#ifdef CONFIG_OF
static const struct of_device_id pcm179x_of_match[] = {
{ .compatible = "ti,pcm1792a", },
+ { .compatible = "ti,pcm1796", },
{ }
};
MODULE_DEVICE_TABLE(of, pcm179x_of_match);
diff --git a/sound/soc/codecs/pcm179x-spi.c b/sound/soc/codecs/pcm179x-spi.c
index 192fee90c971..4b873f2986c7 100644
--- a/sound/soc/codecs/pcm179x-spi.c
+++ b/sound/soc/codecs/pcm179x-spi.c
@@ -31,12 +31,14 @@ static int pcm179x_spi_probe(struct spi_device *spi)
static const struct of_device_id pcm179x_of_match[] __maybe_unused = {
{ .compatible = "ti,pcm1792a", },
+ { .compatible = "ti,pcm1796" },
{ }
};
MODULE_DEVICE_TABLE(of, pcm179x_of_match);
static const struct spi_device_id pcm179x_spi_ids[] = {
{ "pcm1792a", 0 },
+ { "pcm1796", 0 },
{ "pcm179x", 0 },
{ },
};
--
2.55.0
^ permalink raw reply related [flat|nested] 7+ messages in thread* [PATCH v2 5/5] ASoC: pcm179x: Add support for pcm1975
2026-10-16 10:33 [PATCH v2 0/5] ASoC: pcm179x: Add support for pcm1795 and pcm1796 Roman Smrž
` (3 preceding siblings ...)
2026-10-16 10:33 ` [PATCH v2 4/5] ASoC: pcm179x: Add compatible string for pcm1796 and spi_ids entry Roman Smrž
@ 2026-10-16 10:33 ` Roman Smrž
2026-10-16 10:52 ` sashiko-bot
4 siblings, 1 reply; 7+ messages in thread
From: Roman Smrž @ 2026-10-16 10:33 UTC (permalink / raw)
To: Peter Rosin, Martin Povišer, Lars-Peter Clausen,
Nuno Sá, Liam Girdwood, Mark Brown, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Shenghao Ding, Kevin Lu,
Baojun Xu, Sen Wang, Jaroslav Kysela, Takashi Iwai
Cc: asahi, linux-sound, patches, devicetree, linux-kernel,
linux-amarula, Michael Trimarchi, Roman Smrž
From: Michael Trimarchi <michael@amarulasolutions.com>
The PCM1795 is register compatible with the PCM1792A, but it encodes two
of the register 18 FMT[2:0] values differently: code 001 selects 32-bit
standard data instead of 20-bit, and code 100 selects 32-bit I2S instead
of 16-bit I2S. It has no 20-bit format at all. The PCM1796 shares the
PCM1792A encoding.
The model is read with device_get_match_data(), so each bus driver
carries the model in its own of_device_id table. The tables cannot move
to the common file: MODULE_DEVICE_TABLE() aliases a table that has to be
defined in the same translation unit.
Signed-off-by: Michael Trimarchi <michael@amarulasolutions.com>
Signed-off-by: Roman Smrž <roman@amarulasolutions.com>
---
Changes in v2:
- Added missing entry to spi_ids.
---
sound/soc/codecs/pcm179x-i2c.c | 3 +-
sound/soc/codecs/pcm179x-spi.c | 4 ++-
sound/soc/codecs/pcm179x.c | 62 ++++++++++++++++++++++++++++++++++++++----
sound/soc/codecs/pcm179x.h | 12 ++++++--
4 files changed, 72 insertions(+), 9 deletions(-)
diff --git a/sound/soc/codecs/pcm179x-i2c.c b/sound/soc/codecs/pcm179x-i2c.c
index e81e20fadadf..751f4b74647a 100644
--- a/sound/soc/codecs/pcm179x-i2c.c
+++ b/sound/soc/codecs/pcm179x-i2c.c
@@ -32,7 +32,8 @@ static int pcm179x_i2c_probe(struct i2c_client *client)
#ifdef CONFIG_OF
static const struct of_device_id pcm179x_of_match[] = {
{ .compatible = "ti,pcm1792a", },
- { .compatible = "ti,pcm1796", },
+ { .compatible = "ti,pcm1795", .data = (void *)PCM1795, },
+ { .compatible = "ti,pcm1796", .data = (void *)PCM1796, },
{ }
};
MODULE_DEVICE_TABLE(of, pcm179x_of_match);
diff --git a/sound/soc/codecs/pcm179x-spi.c b/sound/soc/codecs/pcm179x-spi.c
index 4b873f2986c7..a6c6ac1eb97b 100644
--- a/sound/soc/codecs/pcm179x-spi.c
+++ b/sound/soc/codecs/pcm179x-spi.c
@@ -31,13 +31,15 @@ static int pcm179x_spi_probe(struct spi_device *spi)
static const struct of_device_id pcm179x_of_match[] __maybe_unused = {
{ .compatible = "ti,pcm1792a", },
- { .compatible = "ti,pcm1796" },
+ { .compatible = "ti,pcm1795", .data = (void *)PCM1795, },
+ { .compatible = "ti,pcm1796", .data = (void *)PCM1796, },
{ }
};
MODULE_DEVICE_TABLE(of, pcm179x_of_match);
static const struct spi_device_id pcm179x_spi_ids[] = {
{ "pcm1792a", 0 },
+ { "pcm1795", 0 },
{ "pcm1796", 0 },
{ "pcm179x", 0 },
{ },
diff --git a/sound/soc/codecs/pcm179x.c b/sound/soc/codecs/pcm179x.c
index fae5de318b6e..8e9b9e98c8df 100644
--- a/sound/soc/codecs/pcm179x.c
+++ b/sound/soc/codecs/pcm179x.c
@@ -19,6 +19,7 @@
#include <sound/soc.h>
#include <sound/tlv.h>
#include <linux/of.h>
+#include <linux/property.h>
#include "pcm179x.h"
@@ -63,6 +64,7 @@ struct pcm179x_private {
struct regmap *regmap;
unsigned int format;
unsigned int rate;
+ enum pcm179x_type codec_model;
};
struct pcm179x_fmt_table {
@@ -71,7 +73,17 @@ struct pcm179x_fmt_table {
unsigned int value; /* FMT[2:0] */
};
-static const struct pcm179x_fmt_table pcm1792a_fmt[] = {
+/*
+ * Register 18 FMT[2:0] is not encoded the same way by every model: value 001
+ * and value 100 are 20-bit and 16-bit I2S on the PCM1792A/PCM1796 but 32-bit
+ * and 32-bit I2S on the PCM1795, and neither model has a 32-bit
+ * left-justified mode.
+ *
+ * The PCM1792A/PCM1796 have no 32-bit format at all, so a 32-bit container
+ * keeps the 24-bit value and is clocked out as 24-bit data, as this driver has
+ * always done. Only the PCM1795 has real 32-bit formats.
+ */
+static const struct pcm179x_fmt_table pcm179x_fmt[] = {
{ SND_SOC_DAIFMT_RIGHT_J, 16, 0 },
{ SND_SOC_DAIFMT_RIGHT_J, 24, 2 },
{ SND_SOC_DAIFMT_RIGHT_J, 32, 2 },
@@ -82,16 +94,53 @@ static const struct pcm179x_fmt_table pcm1792a_fmt[] = {
{ SND_SOC_DAIFMT_I2S, 32, 5 },
};
+static const struct pcm179x_fmt_table pcm1795_fmt[] = {
+ { SND_SOC_DAIFMT_RIGHT_J, 16, 0 },
+ { SND_SOC_DAIFMT_RIGHT_J, 24, 2 },
+ { SND_SOC_DAIFMT_RIGHT_J, 32, 1 },
+ { SND_SOC_DAIFMT_LEFT_J, 24, 3 },
+ { SND_SOC_DAIFMT_I2S, 24, 5 },
+ { SND_SOC_DAIFMT_I2S, 32, 4 },
+};
+
+struct pcm179x_model {
+ u64 formats;
+ const struct pcm179x_fmt_table *fmt;
+ unsigned int num_fmt;
+};
+
+static const struct pcm179x_model pcm179x_models[] = {
+ [PCM1792A] = { PCM179X_FORMATS, pcm179x_fmt, ARRAY_SIZE(pcm179x_fmt) },
+ [PCM1795] = { PCM1795_FORMATS, pcm1795_fmt, ARRAY_SIZE(pcm1795_fmt) },
+ [PCM1796] = { PCM179X_FORMATS, pcm179x_fmt, ARRAY_SIZE(pcm179x_fmt) },
+};
+
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;
+ const struct pcm179x_model *model = &pcm179x_models[priv->codec_model];
+ const struct pcm179x_fmt_table *fmt_tbl = model->fmt;
+
+ for (unsigned int i = 0; i < model->num_fmt; i++)
+ if (fmt_tbl[i].fmt == fmt && fmt_tbl[i].width == width)
+ return fmt_tbl[i].value;
return -EINVAL;
}
+static int pcm179x_startup(struct snd_pcm_substream *substream,
+ struct snd_soc_dai *dai)
+{
+ struct snd_soc_component *component = dai->component;
+ struct pcm179x_private *priv = snd_soc_component_get_drvdata(component);
+ u64 formats = pcm179x_models[priv->codec_model].formats;
+
+ snd_pcm_hw_constraint_mask64(substream->runtime,
+ SNDRV_PCM_HW_PARAM_FORMAT, formats);
+
+ return 0;
+}
+
static int pcm179x_set_dai_fmt(struct snd_soc_dai *codec_dai,
unsigned int format)
{
@@ -150,6 +199,7 @@ static const u64 pcm179x_selectable_formats =
SND_SOC_POSSIBLE_DAIFMT_RIGHT_J;
static const struct snd_soc_dai_ops pcm179x_dai_ops = {
+ .startup = pcm179x_startup,
.set_fmt = pcm179x_set_dai_fmt,
.hw_params = pcm179x_hw_params,
.mute_stream = pcm179x_mute,
@@ -191,7 +241,7 @@ static struct snd_soc_dai_driver pcm179x_dai = {
.rates = SNDRV_PCM_RATE_CONTINUOUS,
.rate_min = 10000,
.rate_max = 200000,
- .formats = PCM1792A_FORMATS, },
+ .formats = PCM179X_FORMATS, },
.ops = &pcm179x_dai_ops,
};
@@ -227,6 +277,8 @@ int pcm179x_common_init(struct device *dev, struct regmap *regmap)
if (!pcm179x)
return -ENOMEM;
+ pcm179x->codec_model =
+ (enum pcm179x_type)(uintptr_t)device_get_match_data(dev);
pcm179x->regmap = regmap;
dev_set_drvdata(dev, pcm179x);
diff --git a/sound/soc/codecs/pcm179x.h b/sound/soc/codecs/pcm179x.h
index 0039ca8ee742..33971fa93546 100644
--- a/sound/soc/codecs/pcm179x.h
+++ b/sound/soc/codecs/pcm179x.h
@@ -8,8 +8,16 @@
#ifndef __PCM179X_H__
#define __PCM179X_H__
-#define PCM1792A_FORMATS (SNDRV_PCM_FMTBIT_S32_LE | SNDRV_PCM_FMTBIT_S24_LE | \
- SNDRV_PCM_FMTBIT_S16_LE)
+enum pcm179x_type {
+ PCM1792A,
+ PCM1795,
+ PCM1796,
+};
+
+#define PCM179X_FORMATS (SNDRV_PCM_FMTBIT_S32_LE | SNDRV_PCM_FMTBIT_S24_LE | \
+ SNDRV_PCM_FMTBIT_S16_LE)
+
+#define PCM1795_FORMATS (SNDRV_PCM_FMTBIT_S32_LE | SNDRV_PCM_FMTBIT_S24_LE)
extern const struct regmap_config pcm179x_regmap_config;
--
2.55.0
^ permalink raw reply related [flat|nested] 7+ messages in thread* Re: [PATCH v2 5/5] ASoC: pcm179x: Add support for pcm1975
2026-10-16 10:33 ` [PATCH v2 5/5] ASoC: pcm179x: Add support for pcm1975 Roman Smrž
@ 2026-10-16 10:52 ` sashiko-bot
0 siblings, 0 replies; 7+ messages in thread
From: sashiko-bot @ 2026-10-16 10:52 UTC (permalink / raw)
To: Roman Smrž; +Cc: devicetree, robh, conor+dt
Thank you for your contribution! Sashiko AI review found 3 potential issue(s) to consider:
- [Medium] sound: pcm1795 misidentified as pcm1792a on spi/i2c due to missing driver_data
- [Medium] ASoC: pcm179x: 16-bit format missing for PCM1795
- [Medium] ASoC: pcm1795: hw_params fails with -EINVAL for 32-bit LEFT_J streams
--
commit 82f31b72b82184d1d5d7c469d77cb1c8fab51b6d
Author: Michael Trimarchi <michael@amarulasolutions.com>
Subject: ASoC: pcm179x: Add support for pcm1975
The commit adds support for the PCM1795 audio codec, introducing a new codec
model differentiation based on device match data. It adds device match tables
for OF along with SPI ID tables, and separate format handling tables and
startup constraints for the new model.
> diff --git a/sound/soc/codecs/pcm179x-spi.c b/sound/soc/codecs/pcm179x-spi.c
> index 4b873f2986c77..a6c6ac1eb97b2 100644
> --- a/sound/soc/codecs/pcm179x-spi.c
> +++ b/sound/soc/codecs/pcm179x-spi.c
[ ... ]
> @@ -31,13 +31,15 @@ static int pcm179x_spi_probe(struct spi_device *spi)
[ ... ]
> static const struct spi_device_id pcm179x_spi_ids[] = {
> { "pcm1792a", 0 },
> + { "pcm1795", 0 },
> { "pcm1796", 0 },
> { "pcm179x", 0 },
> { },
[Severity: Medium]
Since the driver differentiates models using enum pcm179x_type where
PCM1795 is 1, will leaving the driver_data as 0 cause non-OF setups to
misidentify the PCM1795 as a PCM1792A?
When device_get_match_data() is called in pcm179x_common_init(), it will
resolve to 0 for these legacy boards. This could break audio playback
for formats encoded differently between models, such as 32-bit I2S.
Additionally, should the new models be added to the I2C ID table in
pcm179x-i2c.c for the same reason?
> diff --git a/sound/soc/codecs/pcm179x.c b/sound/soc/codecs/pcm179x.c
> index fae5de318b6ea..8e9b9e98c8dff 100644
> --- a/sound/soc/codecs/pcm179x.c
> +++ b/sound/soc/codecs/pcm179x.c
[ ... ]
> @@ -82,16 +94,53 @@ static const struct pcm179x_fmt_table pcm1792a_fmt[] = {
> { SND_SOC_DAIFMT_I2S, 32, 5 },
> };
>
> +static const struct pcm179x_fmt_table pcm1795_fmt[] = {
> + { SND_SOC_DAIFMT_RIGHT_J, 16, 0 },
> + { SND_SOC_DAIFMT_RIGHT_J, 24, 2 },
> + { SND_SOC_DAIFMT_RIGHT_J, 32, 1 },
> + { SND_SOC_DAIFMT_LEFT_J, 24, 3 },
> + { SND_SOC_DAIFMT_I2S, 24, 5 },
> + { SND_SOC_DAIFMT_I2S, 32, 4 },
> +};
[Severity: Medium]
Is there a missing entry here for { SND_SOC_DAIFMT_LEFT_J, 32, 3 }?
Because PCM1795_FORMATS includes SNDRV_PCM_FMTBIT_S32_LE and the ASoC core
allows LEFT_J for all models, userspace can request 32-bit LEFT_J streams.
Without an entry in this table, pcm179x_fmt_value() will fail and return
-EINVAL during pcm179x_hw_params(), causing playback to fail at runtime.
> diff --git a/sound/soc/codecs/pcm179x.h b/sound/soc/codecs/pcm179x.h
> index 0039ca8ee7420..33971fa935469 100644
> --- a/sound/soc/codecs/pcm179x.h
> +++ b/sound/soc/codecs/pcm179x.h
[ ... ]
> @@ -8,8 +8,16 @@
> #ifndef __PCM179X_H__
> #define __PCM179X_H__
>
> -#define PCM1792A_FORMATS (SNDRV_PCM_FMTBIT_S32_LE | SNDRV_PCM_FMTBIT_S24_LE | \
> - SNDRV_PCM_FMTBIT_S16_LE)
> +enum pcm179x_type {
> + PCM1792A,
> + PCM1795,
> + PCM1796,
> +};
> +
> +#define PCM179X_FORMATS (SNDRV_PCM_FMTBIT_S32_LE | SNDRV_PCM_FMTBIT_S24_LE | \
> + SNDRV_PCM_FMTBIT_S16_LE)
> +
> +#define PCM1795_FORMATS (SNDRV_PCM_FMTBIT_S32_LE | SNDRV_PCM_FMTBIT_S24_LE)
[Severity: Medium]
Does the PCM1795 support 16-bit audio streams?
The pcm1795_fmt table in pcm179x.c contains an entry for 16-bit Right-J:
{ SND_SOC_DAIFMT_RIGHT_J, 16, 0 },
By excluding SNDRV_PCM_FMTBIT_S16_LE from PCM1795_FORMATS, the ALSA core
unconditionally rejects all 16-bit streams at open time. This forces
userspace to upsample or pad streams, and makes the 16-bit Right-J
table entry unreachable dead code.
--
Sashiko AI review · https://sashiko.dev/#/patchset/20261016-work-v2-0-9340b9555fbb@amarulasolutions.com?part=5
^ permalink raw reply [flat|nested] 7+ messages in thread