>>>> int hda_bus_ml_get_capabilities(struct hdac_bus *bus) >>>> { >>>> - if (bus->mlcap) >>>> - return snd_hdac_ext_bus_get_ml_capabilities(bus); >>>> + u32 link_count; >>>> + int ret; >>>> + int i; >>>> + >>>> + if (!bus->mlcap) >>>> + return 0; >>>> + >>>> + link_count = readl(bus->mlcap + AZX_REG_ML_MLCD) + 1; >>>> + >>>> + dev_dbg(bus->dev, "HDAudio Multi-Link count: %d\n", link_count); >>>> + >>>> + for (i = 0; i < link_count; i++) { >>>> + ret = hda_ml_alloc_h2link(bus, i); >>>> + if (ret < 0) { >>>> + hda_bus_ml_free(bus); >>>> + return ret; >>>> + } >>>> + } >>>> return 0; >>> >>> This makes that each call of hda_bus_ml_get_capabilities() adds the >>> h2link entries blindly. If the driver calls it multiple times >>> mistakenly (the function name sounds as if it's just a helper to query >>> the capability bits), it'll lead to doubly entries. Maybe adding some >>> check would be safer, IMO. >> >> Interesting comment, I didn't think of that one. >> >> This function is currently called in the probe and indirectly via >> hda_init_caps(). I think the driver framework guarantees the probe is >> only called once, doesn't it? >> >> we can also rename this function to make it clearer if there are any >> suggestions, but the name is aligned with previous implementations of >> the snd_hdac_ext stuff. > > Yeah, naming it as an init function would avoid the misuse. Sure thing, I'll rename it as hda_bus_ml_init(). Thanks for the feedback.