lkml.org 
[lkml]   [2018]   [Mar]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.4 05/36] ALSA: hda: Add a power_save blacklist
    Date
    4.4-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Hans de Goede <hdegoede@redhat.com>

    commit 1ba8f9d308174e647b864c36209b4d7934d99888 upstream.

    On some boards setting power_save to a non 0 value leads to clicking /
    popping sounds when ever we enter/leave powersaving mode. Ideally we would
    figure out how to avoid these sounds, but that is not always feasible.

    This commit adds a blacklist for devices where powersaving is known to
    cause problems and disables it on these devices.

    Note I tried to put this blacklist in userspace first:
    https://github.com/systemd/systemd/pull/8128

    But the systemd maintainers rightfully pointed out that it would be
    impossible to then later remove entries once we actually find a way to
    make power-saving work on listed boards without issues. Having this list
    in the kernel will allow removal of the blacklist entry in the same commit
    which fixes the clicks / plops.

    The blacklist only applies to the default power_save module-option value,
    if a user explicitly sets the module-option then the blacklist is not
    used.

    [ added an ifdef CONFIG_PM for the build error -- tiwai]

    BugLink: https://bugzilla.redhat.com/show_bug.cgi?id=1525104
    BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=198611
    Cc: stable@vger.kernel.org
    Signed-off-by: Hans de Goede <hdegoede@redhat.com>
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    sound/pci/hda/hda_intel.c | 38 ++++++++++++++++++++++++++++++++++++--
    1 file changed, 36 insertions(+), 2 deletions(-)

    --- a/sound/pci/hda/hda_intel.c
    +++ b/sound/pci/hda/hda_intel.c
    @@ -179,7 +179,7 @@ static const struct kernel_param_ops par
    };
    #define param_check_xint param_check_int

    -static int power_save = CONFIG_SND_HDA_POWER_SAVE_DEFAULT;
    +static int power_save = -1;
    module_param(power_save, xint, 0644);
    MODULE_PARM_DESC(power_save, "Automatic power-saving timeout "
    "(in second, 0 = disable).");
    @@ -2055,6 +2055,24 @@ out_free:
    return err;
    }

    +#ifdef CONFIG_PM
    +/* On some boards setting power_save to a non 0 value leads to clicking /
    + * popping sounds when ever we enter/leave powersaving mode. Ideally we would
    + * figure out how to avoid these sounds, but that is not always feasible.
    + * So we keep a list of devices where we disable powersaving as its known
    + * to causes problems on these devices.
    + */
    +static struct snd_pci_quirk power_save_blacklist[] = {
    + /* https://bugzilla.redhat.com/show_bug.cgi?id=1525104 */
    + SND_PCI_QUIRK(0x1849, 0x0c0c, "Asrock B85M-ITX", 0),
    + /* https://bugzilla.redhat.com/show_bug.cgi?id=1525104 */
    + SND_PCI_QUIRK(0x1043, 0x8733, "Asus Prime X370-Pro", 0),
    + /* https://bugzilla.kernel.org/show_bug.cgi?id=198611 */
    + SND_PCI_QUIRK(0x17aa, 0x2227, "Lenovo X1 Carbon 3rd Gen", 0),
    + {}
    +};
    +#endif /* CONFIG_PM */
    +
    /* number of codec slots for each chipset: 0 = default slots (i.e. 4) */
    static unsigned int azx_max_codecs[AZX_NUM_DRIVERS] = {
    [AZX_DRIVER_NVIDIA] = 8,
    @@ -2067,6 +2085,7 @@ static int azx_probe_continue(struct azx
    struct hdac_bus *bus = azx_bus(chip);
    struct pci_dev *pci = chip->pci;
    int dev = chip->dev_index;
    + int val;
    int err;

    hda->probe_continued = 1;
    @@ -2142,7 +2161,22 @@ static int azx_probe_continue(struct azx

    chip->running = 1;
    azx_add_card_list(chip);
    - snd_hda_set_power_save(&chip->bus, power_save * 1000);
    +
    + val = power_save;
    +#ifdef CONFIG_PM
    + if (val == -1) {
    + const struct snd_pci_quirk *q;
    +
    + val = CONFIG_SND_HDA_POWER_SAVE_DEFAULT;
    + q = snd_pci_quirk_lookup(chip->pci, power_save_blacklist);
    + if (q && val) {
    + dev_info(chip->card->dev, "device %04x:%04x is on the power_save blacklist, forcing power_save to 0\n",
    + q->subvendor, q->subdevice);
    + val = 0;
    + }
    + }
    +#endif /* CONFIG_PM */
    + snd_hda_set_power_save(&chip->bus, val * 1000);
    if (azx_has_pm_runtime(chip) || hda->use_vga_switcheroo)
    pm_runtime_put_noidle(&pci->dev);


    \
     
     \ /
      Last update: 2018-03-10 01:45    [W:2.968 / U:0.404 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site