{
        struct snd_soc_pcm_runtime *rtd = substream->private_data;
        struct snd_soc_component *component;
-       int i, ret = 0;
+       int i, r, ret = 0;
 
        for_each_rtd_components(rtd, i, component) {
                if (component == last)
                        break;
 
-               ret |= snd_soc_component_close(component, substream);
+               r = snd_soc_component_close(component, substream);
+               if (r < 0)
+                       ret = r; /* use last ret */
+
                snd_soc_component_module_put_when_close(component);
        }
 
 {
        struct snd_soc_pcm_runtime *rtd = substream->private_data;
        struct snd_soc_component *component;
-       int i, ret = 0;
+       int i, r, ret = 0;
 
        for_each_rtd_components(rtd, i, component) {
                if (component == last)
                        break;
 
-               ret |= snd_soc_component_hw_free(component, substream);
+               r = snd_soc_component_hw_free(component, substream);
+               if (r < 0)
+                       ret = r; /* use last ret */
        }
 
        return ret;