ret = 0;
                }
 
+               substream.stream = SNDRV_PCM_STREAM_CAPTURE;
                snd_soc_dapm_widget_for_each_source_path(w, path) {
                        source = path->source->priv;
 
+                       if (source->driver->ops->hw_free)
+                               source->driver->ops->hw_free(&substream,
+                                                            source);
+
                        source->active--;
-                       if (source->driver->ops->shutdown) {
-                               substream.stream = SNDRV_PCM_STREAM_CAPTURE;
+                       if (source->driver->ops->shutdown)
                                source->driver->ops->shutdown(&substream,
                                                              source);
-                       }
                }
 
+               substream.stream = SNDRV_PCM_STREAM_PLAYBACK;
                snd_soc_dapm_widget_for_each_sink_path(w, path) {
                        sink = path->sink->priv;
 
+                       if (sink->driver->ops->hw_free)
+                               sink->driver->ops->hw_free(&substream, sink);
+
                        sink->active--;
-                       if (sink->driver->ops->shutdown) {
-                               substream.stream = SNDRV_PCM_STREAM_PLAYBACK;
+                       if (sink->driver->ops->shutdown)
                                sink->driver->ops->shutdown(&substream, sink);
-                       }
                }
                break;