struct snd_pcm_hw_params *params);
 void snd_soc_dai_hw_free(struct snd_soc_dai *dai,
                         struct snd_pcm_substream *substream);
+int snd_soc_dai_startup(struct snd_soc_dai *dai,
+                       struct snd_pcm_substream *substream);
 
 struct snd_soc_dai_ops {
        /*
 
        if (dai->driver->ops->hw_free)
                dai->driver->ops->hw_free(substream, dai);
 }
+
+int snd_soc_dai_startup(struct snd_soc_dai *dai,
+                       struct snd_pcm_substream *substream)
+{
+       int ret = 0;
+
+       if (dai->driver->ops->startup)
+               ret = dai->driver->ops->startup(substream, dai);
+
+       return ret;
+}
 
                snd_soc_dapm_widget_for_each_source_path(w, path) {
                        source = path->source->priv;
 
-                       if (source->driver->ops->startup) {
-                               ret = source->driver->ops->startup(&substream,
-                                                                  source);
-                               if (ret < 0) {
-                                       dev_err(source->dev,
-                                               "ASoC: startup() failed: %d\n",
-                                               ret);
-                                       goto out;
-                               }
+                       ret = snd_soc_dai_startup(source, &substream);
+                       if (ret < 0) {
+                               dev_err(source->dev,
+                                       "ASoC: startup() failed: %d\n", ret);
+                               goto out;
                        }
                        source->active++;
                        ret = snd_soc_dai_hw_params(source, &substream, params);
                snd_soc_dapm_widget_for_each_sink_path(w, path) {
                        sink = path->sink->priv;
 
-                       if (sink->driver->ops->startup) {
-                               ret = sink->driver->ops->startup(&substream,
-                                                                sink);
-                               if (ret < 0) {
-                                       dev_err(sink->dev,
-                                               "ASoC: startup() failed: %d\n",
-                                               ret);
-                                       goto out;
-                               }
+                       ret = snd_soc_dai_startup(sink, &substream);
+                       if (ret < 0) {
+                               dev_err(sink->dev,
+                                       "ASoC: startup() failed: %d\n", ret);
+                               goto out;
                        }
                        sink->active++;
                        ret = snd_soc_dai_hw_params(sink, &substream, params);
 
        mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass);
 
        /* startup the audio subsystem */
-       if (cpu_dai->driver->ops->startup) {
-               ret = cpu_dai->driver->ops->startup(substream, cpu_dai);
-               if (ret < 0) {
-                       dev_err(cpu_dai->dev, "ASoC: can't open interface"
-                               " %s: %d\n", cpu_dai->name, ret);
-                       goto out;
-               }
+       ret = snd_soc_dai_startup(cpu_dai, substream);
+       if (ret < 0) {
+               dev_err(cpu_dai->dev, "ASoC: can't open interface %s: %d\n",
+                       cpu_dai->name, ret);
+               goto out;
        }
 
        ret = soc_pcm_components_open(substream, &component);
                goto component_err;
 
        for_each_rtd_codec_dai(rtd, i, codec_dai) {
-               if (codec_dai->driver->ops->startup) {
-                       ret = codec_dai->driver->ops->startup(substream,
-                                                             codec_dai);
-                       if (ret < 0) {
-                               dev_err(codec_dai->dev,
-                                       "ASoC: can't open codec %s: %d\n",
-                                       codec_dai->name, ret);
-                               goto codec_dai_err;
-                       }
+               ret = snd_soc_dai_startup(codec_dai, substream);
+               if (ret < 0) {
+                       dev_err(codec_dai->dev,
+                               "ASoC: can't open codec %s: %d\n",
+                               codec_dai->name, ret);
+                       goto codec_dai_err;
                }
 
                if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)