dai names ending with "Playback" and "Capture" respectively as dapm core
 will link and power those dais based on the name.
 
-Note that in current device tree there is no way to mark a dai_link
-as codec to codec. However, it may change in future.
+A dai_link in a "simple-audio-card" will automatically be detected as
+codec to codec when all DAIs on the link belong to codec components.
+The dai_link will be initialized with the subset of stream parameters
+(channels, format, sample rate) supported by all DAIs on the link. Since
+there is no way to provide these parameters in the device tree, this is
+mostly useful for communication with simple fixed-function codecs, such
+as a Bluetooth controller or cellular modem.
 
        return 0;
 }
 
+static int asoc_simple_init_dai_link_params(struct snd_soc_pcm_runtime *rtd,
+                                           struct simple_dai_props *dai_props)
+{
+       struct snd_soc_dai_link *dai_link = rtd->dai_link;
+       struct snd_soc_component *component;
+       struct snd_soc_pcm_stream *params;
+       struct snd_pcm_hardware hw;
+       int i, ret, stream;
+
+       /* Only codecs should have non_legacy_dai_naming set. */
+       for_each_rtd_components(rtd, i, component) {
+               if (!component->driver->non_legacy_dai_naming)
+                       return 0;
+       }
+
+       /* Assumes the capabilities are the same for all supported streams */
+       for (stream = 0; stream < 2; stream++) {
+               ret = snd_soc_runtime_calc_hw(rtd, &hw, stream);
+               if (ret == 0)
+                       break;
+       }
+
+       if (ret < 0) {
+               dev_err(rtd->dev, "simple-card: no valid dai_link params\n");
+               return ret;
+       }
+
+       params = devm_kzalloc(rtd->dev, sizeof(*params), GFP_KERNEL);
+       if (!params)
+               return -ENOMEM;
+
+       params->formats = hw.formats;
+       params->rates = hw.rates;
+       params->rate_min = hw.rate_min;
+       params->rate_max = hw.rate_max;
+       params->channels_min = hw.channels_min;
+       params->channels_max = hw.channels_max;
+
+       dai_link->params = params;
+       dai_link->num_params = 1;
+
+       return 0;
+}
+
 int asoc_simple_dai_init(struct snd_soc_pcm_runtime *rtd)
 {
        struct asoc_simple_priv *priv = snd_soc_card_get_drvdata(rtd->card);
        if (ret < 0)
                return ret;
 
+       ret = asoc_simple_init_dai_link_params(rtd, dai_props);
+       if (ret < 0)
+               return ret;
+
        return 0;
 }
 EXPORT_SYMBOL_GPL(asoc_simple_dai_init);