ALSA: hda: Unify get_response handling
Now most of the get_response handling became quite similar between HDA-core and legacy drivers, and the only differences are: - the handling of extra-long polling delay for some codecs - the debug message for the stalled communication and both are worth to share in the common code. This patch unifies the code into snd_hdac_bus_get_response(), and use this from the legacy get_response callback. It results in a good amount of code reduction in the end. Reviewed-by: Kai Vehmanen <kai.vehmanen@linux.intel.com> Link: https://lore.kernel.org/r/20191212191101.19517-3-tiwai@suse.de Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
@@ -242,6 +242,7 @@ int snd_hdac_bus_get_response(struct hdac_bus *bus, unsigned int addr,
|
||||
unsigned long timeout;
|
||||
unsigned long loopcounter;
|
||||
wait_queue_entry_t wait;
|
||||
bool warned = false;
|
||||
|
||||
init_wait_entry(&wait, 0);
|
||||
timeout = jiffies + msecs_to_jiffies(1000);
|
||||
@@ -264,9 +265,17 @@ int snd_hdac_bus_get_response(struct hdac_bus *bus, unsigned int addr,
|
||||
spin_unlock_irq(&bus->reg_lock);
|
||||
if (time_after(jiffies, timeout))
|
||||
break;
|
||||
#define LOOP_COUNT_MAX 3000
|
||||
if (!bus->polling_mode) {
|
||||
schedule_timeout(msecs_to_jiffies(2));
|
||||
} else if (loopcounter > 3000) {
|
||||
} else if (bus->needs_damn_long_delay ||
|
||||
loopcounter > LOOP_COUNT_MAX) {
|
||||
if (loopcounter > LOOP_COUNT_MAX && !warned) {
|
||||
dev_dbg_ratelimited(bus->dev,
|
||||
"too slow response, last cmd=%#08x\n",
|
||||
bus->last_cmd[addr]);
|
||||
warned = true;
|
||||
}
|
||||
msleep(2); /* temporary workaround */
|
||||
} else {
|
||||
udelay(10);
|
||||
|
Reference in New Issue
Block a user