From mboxrd@z Thu Jan 1 00:00:00 1970 From: Pierre-Louis Bossart Subject: Re: [alsa-devel] [PATCH 03/14] ALSA: hdac: Fix codec name after machine driver is unloaded and reloaded Date: Wed, 5 Jun 2019 10:13:34 -0500 Message-ID: References: <20190605134556.10322-1-amadeuszx.slawinski@linux.intel.com> <20190605134556.10322-4-amadeuszx.slawinski@linux.intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit Return-path: In-Reply-To: <20190605134556.10322-4-amadeuszx.slawinski@linux.intel.com> Content-Language: en-US Sender: linux-kernel-owner@vger.kernel.org To: =?UTF-8?Q?Amadeusz_S=c5=82awi=c5=84ski?= , alsa-devel@alsa-project.org Cc: Cezary Rojewski , linux-kernel@vger.kernel.org, Takashi Iwai , Jie Yang , Liam Girdwood , Mark Brown , =?UTF-8?Q?Amadeusz_S=c5=82awi=c5=84ski?= List-Id: alsa-devel@alsa-project.org On 6/5/19 8:45 AM, Amadeusz Sławiński wrote: > From: Amadeusz Sławiński > > This resets internal index used for enumarating codecs. This will only > work on assumption that platform has one codec. Anyway if there is more, > it won't work with current machine drivers, because we can't guarantee > order in which they are enumerated. This workarounds the fact that most > intel machine drivers have the following defined: > .codec_name = "ehdaudio0D2", > However when we unload and reload machine driver idx gets incremented, > so .codec_name would've needed to be set to ehdaudio1D2 on first reload > and so on. > > Signed-off-by: Amadeusz Sławiński > --- > sound/hda/ext/hdac_ext_bus.c | 11 ++++++++++- > 1 file changed, 10 insertions(+), 1 deletion(-) > > diff --git a/sound/hda/ext/hdac_ext_bus.c b/sound/hda/ext/hdac_ext_bus.c > index f33ba58b753c..c84d69c2eba4 100644 > --- a/sound/hda/ext/hdac_ext_bus.c > +++ b/sound/hda/ext/hdac_ext_bus.c > @@ -77,6 +77,8 @@ static const struct hdac_io_ops hdac_ext_default_io = { > .dma_free_pages = hdac_ext_dma_free_pages, > }; > > +static int idx; > + > /** > * snd_hdac_ext_bus_init - initialize a HD-audio extended bus > * @ebus: the pointer to extended bus object > @@ -93,7 +95,6 @@ int snd_hdac_ext_bus_init(struct hdac_bus *bus, struct device *dev, > const struct hdac_ext_bus_ops *ext_ops) > { > int ret; > - static int idx; > > /* check if io ops are provided, if not load the defaults */ > if (io_ops == NULL) > @@ -118,6 +119,14 @@ EXPORT_SYMBOL_GPL(snd_hdac_ext_bus_init); > void snd_hdac_ext_bus_exit(struct hdac_bus *bus) > { > snd_hdac_bus_exit(bus); > + /* FIXME: this is workaround > + * reset index used for bus->idx, because machine drivers expect > + * the codec name to be ehdaudio0D2, where 0 is bus->idx > + * we only perform reset if there is one used device, if there is more > + * all bets are off > + */ > + if (idx == 1) > + idx = 0; The real fix would be to stop incrementing idx in snd_hdac_ext_bus_init, which would make sense only if we had multiple controllers. SOF pegged bus->idx to zero. > WARN_ON(!list_empty(&bus->hlink_list)); > } > EXPORT_SYMBOL_GPL(snd_hdac_ext_bus_exit); >