OSDN Git Service

ASoC: Intel: Skylake: Use NHLT API to search for blob
authorAmadeusz Sławiński <amadeuszx.slawinski@linux.intel.com>
Fri, 26 Nov 2021 14:03:55 +0000 (15:03 +0100)
committerTakashi Iwai <tiwai@suse.de>
Tue, 30 Nov 2021 15:49:34 +0000 (16:49 +0100)
With NHLT enriched with new search functions, remove local code in
favour of them. This also fixes broken behaviour: search should be based
on significant bits count rather than container size.

Signed-off-by: Amadeusz Sławiński <amadeuszx.slawinski@linux.intel.com>
Signed-off-by: Cezary Rojewski <cezary.rojewski@intel.com>
Acked-by: Mark Brown <broonie@kernel.org>
Link: https://lore.kernel.org/r/20211126140355.1042684-4-cezary.rojewski@intel.com
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/soc/intel/skylake/skl-nhlt.c
sound/soc/intel/skylake/skl-pcm.c
sound/soc/intel/skylake/skl-topology.c
sound/soc/intel/skylake/skl-topology.h
sound/soc/intel/skylake/skl.h

index 6422607..2439a57 100644 (file)
 #include "skl.h"
 #include "skl-i2s.h"
 
-static struct nhlt_specific_cfg *skl_get_specific_cfg(
-               struct device *dev, struct nhlt_fmt *fmt,
-               u8 no_ch, u32 rate, u16 bps, u8 linktype)
-{
-       struct nhlt_specific_cfg *sp_config;
-       struct wav_fmt *wfmt;
-       struct nhlt_fmt_cfg *fmt_config = fmt->fmt_config;
-       int i;
-
-       dev_dbg(dev, "Format count =%d\n", fmt->fmt_count);
-
-       for (i = 0; i < fmt->fmt_count; i++) {
-               wfmt = &fmt_config->fmt_ext.fmt;
-               dev_dbg(dev, "ch=%d fmt=%d s_rate=%d\n", wfmt->channels,
-                        wfmt->bits_per_sample, wfmt->samples_per_sec);
-               if (wfmt->channels == no_ch && wfmt->bits_per_sample == bps) {
-                       /*
-                        * if link type is dmic ignore rate check as the blob is
-                        * generic for all rates
-                        */
-                       sp_config = &fmt_config->config;
-                       if (linktype == NHLT_LINK_DMIC)
-                               return sp_config;
-
-                       if (wfmt->samples_per_sec == rate)
-                               return sp_config;
-               }
-
-               fmt_config = (struct nhlt_fmt_cfg *)(fmt_config->config.caps +
-                                               fmt_config->config.size);
-       }
-
-       return NULL;
-}
-
-static void dump_config(struct device *dev, u32 instance_id, u8 linktype,
-               u8 s_fmt, u8 num_channels, u32 s_rate, u8 dirn, u16 bps)
-{
-       dev_dbg(dev, "Input configuration\n");
-       dev_dbg(dev, "ch=%d fmt=%d s_rate=%d\n", num_channels, s_fmt, s_rate);
-       dev_dbg(dev, "vbus_id=%d link_type=%d\n", instance_id, linktype);
-       dev_dbg(dev, "bits_per_sample=%d\n", bps);
-}
-
-static bool skl_check_ep_match(struct device *dev, struct nhlt_endpoint *epnt,
-               u32 instance_id, u8 link_type, u8 dirn, u8 dev_type)
-{
-       dev_dbg(dev, "vbus_id=%d link_type=%d dir=%d dev_type = %d\n",
-                       epnt->virtual_bus_id, epnt->linktype,
-                       epnt->direction, epnt->device_type);
-
-       if ((epnt->virtual_bus_id == instance_id) &&
-                       (epnt->linktype == link_type) &&
-                       (epnt->direction == dirn)) {
-               /* do not check dev_type for DMIC link type */
-               if (epnt->linktype == NHLT_LINK_DMIC)
-                       return true;
-
-               if (epnt->device_type == dev_type)
-                       return true;
-       }
-
-       return false;
-}
-
-struct nhlt_specific_cfg
-*skl_get_ep_blob(struct skl_dev *skl, u32 instance, u8 link_type,
-                       u8 s_fmt, u8 num_ch, u32 s_rate,
-                       u8 dirn, u8 dev_type)
-{
-       struct nhlt_fmt *fmt;
-       struct nhlt_endpoint *epnt;
-       struct hdac_bus *bus = skl_to_bus(skl);
-       struct device *dev = bus->dev;
-       struct nhlt_specific_cfg *sp_config;
-       struct nhlt_acpi_table *nhlt = skl->nhlt;
-       u16 bps = (s_fmt == 16) ? 16 : 32;
-       u8 j;
-
-       dump_config(dev, instance, link_type, s_fmt, num_ch, s_rate, dirn, bps);
-
-       epnt = (struct nhlt_endpoint *)nhlt->desc;
-
-       dev_dbg(dev, "endpoint count =%d\n", nhlt->endpoint_count);
-
-       for (j = 0; j < nhlt->endpoint_count; j++) {
-               if (skl_check_ep_match(dev, epnt, instance, link_type,
-                                               dirn, dev_type)) {
-                       fmt = (struct nhlt_fmt *)(epnt->config.caps +
-                                                epnt->config.size);
-                       sp_config = skl_get_specific_cfg(dev, fmt, num_ch,
-                                                       s_rate, bps, link_type);
-                       if (sp_config)
-                               return sp_config;
-               }
-
-               epnt = (struct nhlt_endpoint *)((u8 *)epnt + epnt->length);
-       }
-
-       return NULL;
-}
-
 static void skl_nhlt_trim_space(char *trim)
 {
        char *s = trim;
index e4aa366..4c5d209 100644 (file)
@@ -317,6 +317,7 @@ static int skl_pcm_hw_params(struct snd_pcm_substream *substream,
        dev_dbg(dai->dev, "dma_id=%d\n", dma_id);
 
        p_params.s_fmt = snd_pcm_format_width(params_format(params));
+       p_params.s_cont = snd_pcm_format_physical_width(params_format(params));
        p_params.ch = params_channels(params);
        p_params.s_freq = params_rate(params);
        p_params.host_dma_id = dma_id;
@@ -405,6 +406,7 @@ static int skl_be_hw_params(struct snd_pcm_substream *substream,
        struct skl_pipe_params p_params = {0};
 
        p_params.s_fmt = snd_pcm_format_width(params_format(params));
+       p_params.s_cont = snd_pcm_format_physical_width(params_format(params));
        p_params.ch = params_channels(params);
        p_params.s_freq = params_rate(params);
        p_params.stream = substream->stream;
@@ -569,6 +571,7 @@ static int skl_link_hw_params(struct snd_pcm_substream *substream,
                snd_soc_dai_set_tdm_slot(codec_dai, 0, stream_tag, 0, 0);
 
        p_params.s_fmt = snd_pcm_format_width(params_format(params));
+       p_params.s_cont = snd_pcm_format_physical_width(params_format(params));
        p_params.ch = params_channels(params);
        p_params.s_freq = params_rate(params);
        p_params.stream = substream->stream;
index 89e4231..9bdf020 100644 (file)
@@ -285,7 +285,7 @@ static int skl_tplg_update_be_blob(struct snd_soc_dapm_widget *w,
 {
        struct skl_module_cfg *m_cfg = w->priv;
        int link_type, dir;
-       u32 ch, s_freq, s_fmt;
+       u32 ch, s_freq, s_fmt, s_cont;
        struct nhlt_specific_cfg *cfg;
        u8 dev_type = skl_tplg_be_dev_type(m_cfg->dev_type);
        int fmt_idx = m_cfg->fmt_idx;
@@ -301,7 +301,8 @@ static int skl_tplg_update_be_blob(struct snd_soc_dapm_widget *w,
                link_type = NHLT_LINK_DMIC;
                dir = SNDRV_PCM_STREAM_CAPTURE;
                s_freq = m_iface->inputs[0].fmt.s_freq;
-               s_fmt = m_iface->inputs[0].fmt.bit_depth;
+               s_fmt = m_iface->inputs[0].fmt.valid_bit_depth;
+               s_cont = m_iface->inputs[0].fmt.bit_depth;
                ch = m_iface->inputs[0].fmt.channels;
                break;
 
@@ -310,12 +311,14 @@ static int skl_tplg_update_be_blob(struct snd_soc_dapm_widget *w,
                if (m_cfg->hw_conn_type == SKL_CONN_SOURCE) {
                        dir = SNDRV_PCM_STREAM_PLAYBACK;
                        s_freq = m_iface->outputs[0].fmt.s_freq;
-                       s_fmt = m_iface->outputs[0].fmt.bit_depth;
+                       s_fmt = m_iface->outputs[0].fmt.valid_bit_depth;
+                       s_cont = m_iface->outputs[0].fmt.bit_depth;
                        ch = m_iface->outputs[0].fmt.channels;
                } else {
                        dir = SNDRV_PCM_STREAM_CAPTURE;
                        s_freq = m_iface->inputs[0].fmt.s_freq;
-                       s_fmt = m_iface->inputs[0].fmt.bit_depth;
+                       s_fmt = m_iface->inputs[0].fmt.valid_bit_depth;
+                       s_cont = m_iface->inputs[0].fmt.bit_depth;
                        ch = m_iface->inputs[0].fmt.channels;
                }
                break;
@@ -325,16 +328,17 @@ static int skl_tplg_update_be_blob(struct snd_soc_dapm_widget *w,
        }
 
        /* update the blob based on virtual bus_id and default params */
-       cfg = skl_get_ep_blob(skl, m_cfg->vbus_id, link_type,
-                                       s_fmt, ch, s_freq, dir, dev_type);
+       cfg = intel_nhlt_get_endpoint_blob(skl->dev, skl->nhlt, m_cfg->vbus_id,
+                                          link_type, s_fmt, s_cont, ch,
+                                          s_freq, dir, dev_type);
        if (cfg) {
                m_cfg->formats_config[SKL_PARAM_INIT].caps_size = cfg->size;
                m_cfg->formats_config[SKL_PARAM_INIT].caps = (u32 *)&cfg->caps;
        } else {
                dev_err(skl->dev, "Blob NULL for id %x type %d dirn %d\n",
                                        m_cfg->vbus_id, link_type, dir);
-               dev_err(skl->dev, "PCM: ch %d, freq %d, fmt %d\n",
-                                       ch, s_freq, s_fmt);
+               dev_err(skl->dev, "PCM: ch %d, freq %d, fmt %d/%d\n",
+                                       ch, s_freq, s_fmt, s_cont);
                return -EIO;
        }
 
@@ -1849,10 +1853,11 @@ static int skl_tplg_be_fill_pipe_params(struct snd_soc_dai *dai,
                pipe_fmt = &pipe->configs[pipe->pipe_config_idx].in_fmt;
 
        /* update the blob based on virtual bus_id*/
-       cfg = skl_get_ep_blob(skl, mconfig->vbus_id, link_type,
-                                       pipe_fmt->bps, pipe_fmt->channels,
-                                       pipe_fmt->freq, pipe->direction,
-                                       dev_type);
+       cfg = intel_nhlt_get_endpoint_blob(dai->dev, skl->nhlt,
+                                       mconfig->vbus_id, link_type,
+                                       pipe_fmt->bps, params->s_cont,
+                                       pipe_fmt->channels, pipe_fmt->freq,
+                                       pipe->direction, dev_type);
        if (cfg) {
                mconfig->formats_config[SKL_PARAM_INIT].caps_size = cfg->size;
                mconfig->formats_config[SKL_PARAM_INIT].caps = (u32 *)&cfg->caps;
index f0695b2..2296363 100644 (file)
@@ -284,6 +284,7 @@ struct skl_pipe_params {
        u32 ch;
        u32 s_freq;
        u32 s_fmt;
+       u32 s_cont;
        u8 linktype;
        snd_pcm_format_t format;
        int link_index;
index 33ed274..f55f8b3 100644 (file)
@@ -165,10 +165,6 @@ struct skl_dsp_ops {
 int skl_platform_unregister(struct device *dev);
 int skl_platform_register(struct device *dev);
 
-struct nhlt_specific_cfg *skl_get_ep_blob(struct skl_dev *skl, u32 instance,
-                                       u8 link_type, u8 s_fmt, u8 num_ch,
-                                       u32 s_rate, u8 dirn, u8 dev_type);
-
 int skl_nhlt_update_topology_bin(struct skl_dev *skl);
 int skl_init_dsp(struct skl_dev *skl);
 int skl_free_dsp(struct skl_dev *skl);