]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - sound/soc/soc-topology.c
Merge branch 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[linux.git] / sound / soc / soc-topology.c
index 986b8b2f90fba577cce10462e75ad9966258b49f..3fd5d9c867b9b5d30c39eee8d615849d094630b6 100644 (file)
 #define SOC_TPLG_PASS_START    SOC_TPLG_PASS_MANIFEST
 #define SOC_TPLG_PASS_END      SOC_TPLG_PASS_LINK
 
-/*
- * Old version of ABI structs, supported for backward compatibility.
- */
-
-/* Manifest v4 */
-struct snd_soc_tplg_manifest_v4 {
-       __le32 size;            /* in bytes of this structure */
-       __le32 control_elems;   /* number of control elements */
-       __le32 widget_elems;    /* number of widget elements */
-       __le32 graph_elems;     /* number of graph elements */
-       __le32 pcm_elems;       /* number of PCM elements */
-       __le32 dai_link_elems;  /* number of DAI link elements */
-       struct snd_soc_tplg_private priv;
-} __packed;
-
-/* Stream Capabilities v4 */
-struct snd_soc_tplg_stream_caps_v4 {
-       __le32 size;            /* in bytes of this structure */
-       char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
-       __le64 formats; /* supported formats SNDRV_PCM_FMTBIT_* */
-       __le32 rates;           /* supported rates SNDRV_PCM_RATE_* */
-       __le32 rate_min;        /* min rate */
-       __le32 rate_max;        /* max rate */
-       __le32 channels_min;    /* min channels */
-       __le32 channels_max;    /* max channels */
-       __le32 periods_min;     /* min number of periods */
-       __le32 periods_max;     /* max number of periods */
-       __le32 period_size_min; /* min period size bytes */
-       __le32 period_size_max; /* max period size bytes */
-       __le32 buffer_size_min; /* min buffer size bytes */
-       __le32 buffer_size_max; /* max buffer size bytes */
-} __packed;
-
-/* PCM v4 */
-struct snd_soc_tplg_pcm_v4 {
-       __le32 size;            /* in bytes of this structure */
-       char pcm_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
-       char dai_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
-       __le32 pcm_id;          /* unique ID - used to match with DAI link */
-       __le32 dai_id;          /* unique ID - used to match */
-       __le32 playback;        /* supports playback mode */
-       __le32 capture;         /* supports capture mode */
-       __le32 compress;        /* 1 = compressed; 0 = PCM */
-       struct snd_soc_tplg_stream stream[SND_SOC_TPLG_STREAM_CONFIG_MAX]; /* for DAI link */
-       __le32 num_streams;     /* number of streams */
-       struct snd_soc_tplg_stream_caps_v4 caps[2]; /* playback and capture for DAI */
-} __packed;
-
-/* Physical link config v4 */
-struct snd_soc_tplg_link_config_v4 {
-       __le32 size;            /* in bytes of this structure */
-       __le32 id;              /* unique ID - used to match */
-       struct snd_soc_tplg_stream stream[SND_SOC_TPLG_STREAM_CONFIG_MAX]; /* supported configs playback and captrure */
-       __le32 num_streams;     /* number of streams */
-} __packed;
-
 /* topology context */
 struct soc_tplg {
        const struct firmware *fw;
@@ -1754,6 +1698,9 @@ static int soc_tplg_dai_create(struct soc_tplg *tplg,
                set_stream_info(stream, caps);
        }
 
+       if (pcm->compress)
+               dai_drv->compress_new = snd_soc_new_compress;
+
        /* pass control to component driver for optional further init */
        ret = soc_tplg_dai_load(tplg, dai_drv);
        if (ret < 0) {
@@ -2006,6 +1953,21 @@ static void set_link_hw_format(struct snd_soc_dai_link *link,
 
                link->dai_fmt = hw_config->fmt & SND_SOC_DAIFMT_FORMAT_MASK;
 
+               /* clock gating */
+               switch (hw_config->clock_gated) {
+               case SND_SOC_TPLG_DAI_CLK_GATE_GATED:
+                       link->dai_fmt |= SND_SOC_DAIFMT_GATED;
+                       break;
+
+               case SND_SOC_TPLG_DAI_CLK_GATE_CONT:
+                       link->dai_fmt |= SND_SOC_DAIFMT_CONT;
+                       break;
+
+               default:
+                       /* ignore the value */
+                       break;
+               }
+
                /* clock signal polarity */
                invert_bclk = hw_config->invert_bclk;
                invert_fsync = hw_config->invert_fsync;
@@ -2019,13 +1981,15 @@ static void set_link_hw_format(struct snd_soc_dai_link *link,
                        link->dai_fmt |= SND_SOC_DAIFMT_IB_IF;
 
                /* clock masters */
-               bclk_master = hw_config->bclk_master;
-               fsync_master = hw_config->fsync_master;
-               if (!bclk_master && !fsync_master)
+               bclk_master = (hw_config->bclk_master ==
+                              SND_SOC_TPLG_BCLK_CM);
+               fsync_master = (hw_config->fsync_master ==
+                               SND_SOC_TPLG_FSYNC_CM);
+               if (bclk_master && fsync_master)
                        link->dai_fmt |= SND_SOC_DAIFMT_CBM_CFM;
-               else if (bclk_master && !fsync_master)
-                       link->dai_fmt |= SND_SOC_DAIFMT_CBS_CFM;
                else if (!bclk_master && fsync_master)
+                       link->dai_fmt |= SND_SOC_DAIFMT_CBS_CFM;
+               else if (bclk_master && !fsync_master)
                        link->dai_fmt |= SND_SOC_DAIFMT_CBM_CFS;
                else
                        link->dai_fmt |= SND_SOC_DAIFMT_CBS_CFS;
@@ -2293,8 +2257,11 @@ static int manifest_new_ver(struct soc_tplg *tplg,
        *manifest = NULL;
 
        if (src->size != sizeof(*src_v4)) {
-               dev_err(tplg->dev, "ASoC: invalid manifest size\n");
-               return -EINVAL;
+               dev_warn(tplg->dev, "ASoC: invalid manifest size %d\n",
+                        src->size);
+               if (src->size)
+                       return -EINVAL;
+               src->size = sizeof(*src_v4);
        }
 
        dev_warn(tplg->dev, "ASoC: old version of manifest\n");