return false;
 }
 
+static bool same_amp_caps(struct hda_codec *codec, hda_nid_t nid1,
+                         hda_nid_t nid2, int dir)
+{
+       if (!(get_wcaps(codec, nid1) & (1 << (dir + 1))))
+               return !(get_wcaps(codec, nid2) & (1 << (dir + 1)));
+       return (query_amp_caps(codec, nid1, dir) ==
+               query_amp_caps(codec, nid2, dir));
+}
+
 #define nid_has_mute(codec, nid, dir) \
        check_amp_caps(codec, nid, dir, AC_AMPCAP_MUTE)
 #define nid_has_volume(codec, nid, dir) \
 
        for (n = 0; n < nums; n++) {
                bool multi = false;
+               bool multi_cap_vol = spec->multi_cap_vol;
                bool inv_dmic = false;
                int vol, sw;
 
                        parse_capvol_in_path(codec, path);
                        if (!vol)
                                vol = path->ctls[NID_PATH_VOL_CTL];
-                       else if (vol != path->ctls[NID_PATH_VOL_CTL])
+                       else if (vol != path->ctls[NID_PATH_VOL_CTL]) {
                                multi = true;
+                               if (!same_amp_caps(codec, vol,
+                                   path->ctls[NID_PATH_VOL_CTL], HDA_INPUT))
+                                       multi_cap_vol = true;
+                       }
                        if (!sw)
                                sw = path->ctls[NID_PATH_MUTE_CTL];
-                       else if (sw != path->ctls[NID_PATH_MUTE_CTL])
+                       else if (sw != path->ctls[NID_PATH_MUTE_CTL]) {
                                multi = true;
+                               if (!same_amp_caps(codec, sw,
+                                   path->ctls[NID_PATH_MUTE_CTL], HDA_INPUT))
+                                       multi_cap_vol = true;
+                       }
                        if (is_inv_dmic_pin(codec, spec->imux_pins[i]))
                                inv_dmic = true;
                }
                if (!multi)
                        err = create_single_cap_vol_ctl(codec, n, vol, sw,
                                                        inv_dmic);
-               else if (!spec->multi_cap_vol)
+               else if (!multi_cap_vol)
                        err = create_bind_cap_vol_ctl(codec, n, vol, sw);
                else
                        err = create_multi_cap_vol_ctl(codec);