ASoC: Intel: avs: Unhardcode HDAudio BE DAI drivers description
authorCezary Rojewski <cezary.rojewski@intel.com>
Fri, 17 Nov 2023 12:06:10 +0000 (13:06 +0100)
committerTakashi Iwai <tiwai@suse.de>
Mon, 27 Nov 2023 16:28:59 +0000 (17:28 +0100)
To not expose more than in fact is supported by the codec, update CPU
DAI initialization procedure to rely on codec capabilities instead of
hardcoding them. This includes subformat which is currently ignored.

As capabilities for HDMI streams are initialized on PCM open, leave it
as is for now.

Acked-by: Mark Brown <broonie@kernel.org>
Signed-off-by: Cezary Rojewski <cezary.rojewski@intel.com>
Acked-by: Jaroslav Kysela <perex@perex.cz>
Link: https://lore.kernel.org/r/20231117120610.1755254-17-cezary.rojewski@intel.com
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/soc/intel/avs/pcm.c

index b6c48f88ca85baa84a68605a50632f9bbbf890fb..4dfc5a1ebb7c26803cb9b12e60aa6a814aa1adf0 100644 (file)
@@ -17,6 +17,7 @@
 #include "avs.h"
 #include "path.h"
 #include "topology.h"
+#include "../../codecs/hda.h"
 
 struct avs_dma_data {
        struct avs_tplg_path_template *template;
@@ -1406,6 +1407,15 @@ static int avs_component_hda_probe(struct snd_soc_component *component)
                                ret = -ENOMEM;
                                goto exit;
                        }
+
+                       if (!hda_codec_is_display(codec)) {
+                               dais[i].playback.formats = pcm->stream[0].formats;
+                               dais[i].playback.subformats = pcm->stream[0].subformats;
+                               dais[i].playback.rates = pcm->stream[0].rates;
+                               dais[i].playback.channels_min = pcm->stream[0].channels_min;
+                               dais[i].playback.channels_max = pcm->stream[0].channels_max;
+                               dais[i].playback.sig_bits = pcm->stream[0].maxbps;
+                       }
                }
 
                if (pcm->stream[1].substreams) {
@@ -1416,6 +1426,15 @@ static int avs_component_hda_probe(struct snd_soc_component *component)
                                ret = -ENOMEM;
                                goto exit;
                        }
+
+                       if (!hda_codec_is_display(codec)) {
+                               dais[i].capture.formats = pcm->stream[1].formats;
+                               dais[i].capture.subformats = pcm->stream[1].subformats;
+                               dais[i].capture.rates = pcm->stream[1].rates;
+                               dais[i].capture.channels_min = pcm->stream[1].channels_min;
+                               dais[i].capture.channels_max = pcm->stream[1].channels_max;
+                               dais[i].capture.sig_bits = pcm->stream[1].maxbps;
+                       }
                }
 
                dai = snd_soc_register_dai(component, &dais[i], false);