| From a20d918502f1d7ef2d58d7c36626315665e66667 Mon Sep 17 00:00:00 2001 |
| From: Takashi Iwai <tiwai@suse.de> |
| Date: Mon, 13 Apr 2020 10:20:32 +0200 |
| Subject: [PATCH] ALSA: hda: Keep the controller initialization even if no |
| codecs found |
| |
| commit 9479e75fca370a5220784f7596bf598c4dad0b9b upstream. |
| |
| Currently, when the HD-audio controller driver doesn't detect any |
| codecs, it tries to abort the probe. But this abort happens at the |
| delayed probe, i.e. the primary probe call already returned success, |
| hence the driver is never unbound until user does so explicitly. |
| As a result, it may leave the HD-audio device in the running state |
| without the runtime PM. More badly, if the device is a HD-audio bus |
| that is tied with a GPU, GPU cannot reach to the full power down and |
| consumes unnecessarily much power. |
| |
| This patch changes the logic after no-codec situation; it continues |
| probing without the further codec initialization but keep the |
| controller driver running normally. |
| |
| BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=207043 |
| Tested-by: Roy Spliet <nouveau@spliet.org> |
| Link: https://lore.kernel.org/r/20200413082034.25166-5-tiwai@suse.de |
| Signed-off-by: Takashi Iwai <tiwai@suse.de> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c |
| index 477153bd687f..06cc562af247 100644 |
| --- a/sound/pci/hda/hda_intel.c |
| +++ b/sound/pci/hda/hda_intel.c |
| @@ -1950,7 +1950,7 @@ static int azx_first_init(struct azx *chip) |
| /* codec detection */ |
| if (!azx_bus(chip)->codec_mask) { |
| dev_err(card->dev, "no codecs found!\n"); |
| - return -ENODEV; |
| + /* keep running the rest for the runtime PM */ |
| } |
| |
| if (azx_acquire_irq(chip, 0) < 0) |
| @@ -2294,9 +2294,11 @@ static int azx_probe_continue(struct azx *chip) |
| #endif |
| |
| /* create codec instances */ |
| - err = azx_probe_codecs(chip, azx_max_codecs[chip->driver_type]); |
| - if (err < 0) |
| - goto out_free; |
| + if (bus->codec_mask) { |
| + err = azx_probe_codecs(chip, azx_max_codecs[chip->driver_type]); |
| + if (err < 0) |
| + goto out_free; |
| + } |
| |
| #ifdef CONFIG_SND_HDA_PATCH_LOADER |
| if (chip->fw) { |
| @@ -2310,7 +2312,7 @@ static int azx_probe_continue(struct azx *chip) |
| #endif |
| } |
| #endif |
| - if ((probe_only[dev] & 1) == 0) { |
| + if (bus->codec_mask && !(probe_only[dev] & 1)) { |
| err = azx_codec_configure(chip); |
| if (err < 0) |
| goto out_free; |
| -- |
| 2.7.4 |
| |