]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
4.4-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 17 May 2019 13:11:10 +0000 (15:11 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 17 May 2019 13:11:10 +0000 (15:11 +0200)
added patches:
alsa-hda-hdmi-consider-eld_valid-when-reporting-jack-event.patch
alsa-hda-hdmi-read-the-pin-sense-from-register-when-repolling.patch
alsa-hda-realtek-eapd-turn-on-later.patch
alsa-usb-audio-fix-a-memory-leak-bug.patch
asoc-max98090-fix-restore-of-dapm-muxes.patch
asoc-rt5677-spi-disable-16bit-spi-transfers.patch

queue-4.4/alsa-hda-hdmi-consider-eld_valid-when-reporting-jack-event.patch [new file with mode: 0644]
queue-4.4/alsa-hda-hdmi-read-the-pin-sense-from-register-when-repolling.patch [new file with mode: 0644]
queue-4.4/alsa-hda-realtek-eapd-turn-on-later.patch [new file with mode: 0644]
queue-4.4/alsa-usb-audio-fix-a-memory-leak-bug.patch [new file with mode: 0644]
queue-4.4/asoc-max98090-fix-restore-of-dapm-muxes.patch [new file with mode: 0644]
queue-4.4/asoc-rt5677-spi-disable-16bit-spi-transfers.patch [new file with mode: 0644]
queue-4.4/series

diff --git a/queue-4.4/alsa-hda-hdmi-consider-eld_valid-when-reporting-jack-event.patch b/queue-4.4/alsa-hda-hdmi-consider-eld_valid-when-reporting-jack-event.patch
new file mode 100644 (file)
index 0000000..dce01a6
--- /dev/null
@@ -0,0 +1,58 @@
+From 7f641e26a6df9269cb25dd7a4b0a91d6586ed441 Mon Sep 17 00:00:00 2001
+From: Hui Wang <hui.wang@canonical.com>
+Date: Mon, 6 May 2019 22:09:32 +0800
+Subject: ALSA: hda/hdmi - Consider eld_valid when reporting jack event
+
+From: Hui Wang <hui.wang@canonical.com>
+
+commit 7f641e26a6df9269cb25dd7a4b0a91d6586ed441 upstream.
+
+On the machines with AMD GPU or Nvidia GPU, we often meet this issue:
+after s3, there are 4 HDMI/DP audio devices in the gnome-sound-setting
+even there is no any monitors plugged.
+
+When this problem happens, we check the /proc/asound/cardX/eld#N.M, we
+will find the monitor_present=1, eld_valid=0.
+
+The root cause is BIOS or GPU driver makes the PRESENCE valid even no
+monitor plugged, and of course the driver will not get the valid
+eld_data subsequently.
+
+In this situation, we should not report the jack_plugged event, to do
+so, let us change the function hdmi_present_sense_via_verbs(). In this
+function, it reads the pin_sense via snd_hda_pin_sense(), after
+calling this function, the jack_dirty is 0, and before exiting
+via_verbs(), we change the shadow pin_sense according to both
+monitor_present and eld_valid, then in the snd_hda_jack_report_sync(),
+since the jack_dirty is still 0, it will report jack event according
+to this modified shadow pin_sense.
+
+After this change, the driver will not report Jack_is_plugged event
+through hdmi_present_sense_via_verbs() if monitor_present is 1 and
+eld_valid is 0.
+
+Signed-off-by: Hui Wang <hui.wang@canonical.com>
+Cc: <stable@vger.kernel.org>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ sound/pci/hda/patch_hdmi.c |    6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+--- a/sound/pci/hda/patch_hdmi.c
++++ b/sound/pci/hda/patch_hdmi.c
+@@ -1636,9 +1636,11 @@ static bool hdmi_present_sense(struct hd
+       ret = !repoll || !pin_eld->monitor_present || pin_eld->eld_valid;
+       jack = snd_hda_jack_tbl_get(codec, pin_nid);
+-      if (jack)
++      if (jack) {
+               jack->block_report = !ret;
+-
++              jack->pin_sense = (eld->monitor_present && eld->eld_valid) ?
++                      AC_PINSENSE_PRESENCE : 0;
++      }
+       mutex_unlock(&per_pin->lock);
+       snd_hda_power_down_pm(codec);
+       return ret;
diff --git a/queue-4.4/alsa-hda-hdmi-read-the-pin-sense-from-register-when-repolling.patch b/queue-4.4/alsa-hda-hdmi-read-the-pin-sense-from-register-when-repolling.patch
new file mode 100644 (file)
index 0000000..708f89a
--- /dev/null
@@ -0,0 +1,45 @@
+From 8c2e6728c2bf95765b724e07d0278ae97cd1ee0d Mon Sep 17 00:00:00 2001
+From: Hui Wang <hui.wang@canonical.com>
+Date: Mon, 6 May 2019 22:09:31 +0800
+Subject: ALSA: hda/hdmi - Read the pin sense from register when repolling
+
+From: Hui Wang <hui.wang@canonical.com>
+
+commit 8c2e6728c2bf95765b724e07d0278ae97cd1ee0d upstream.
+
+The driver will check the monitor presence when resuming from suspend,
+starting poll or interrupt triggers. In these 3 situations, the
+jack_dirty will be set to 1 first, then the hda_jack.c reads the
+pin_sense from register, after reading the register, the jack_dirty
+will be set to 0. But hdmi_repoll_work() is enabled in these 3
+situations, It will read the pin_sense a couple of times subsequently,
+since the jack_dirty is 0 now, It does not read the register anymore,
+instead it uses the shadow pin_sense which is read at the first time.
+
+It is meaningless to check the shadow pin_sense a couple of times,
+we need to read the register to check the real plugging state, so
+we set the jack_dirty to 1 in the hdmi_repoll_work().
+
+Signed-off-by: Hui Wang <hui.wang@canonical.com>
+Cc: <stable@vger.kernel.org>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ sound/pci/hda/patch_hdmi.c |    5 +++++
+ 1 file changed, 5 insertions(+)
+
+--- a/sound/pci/hda/patch_hdmi.c
++++ b/sound/pci/hda/patch_hdmi.c
+@@ -2501,6 +2501,11 @@ static int simple_playback_init(struct h
+ static void simple_playback_free(struct hda_codec *codec)
+ {
+       struct hdmi_spec *spec = codec->spec;
++      struct hda_jack_tbl *jack;
++
++      jack = snd_hda_jack_tbl_get(codec, per_pin->pin_nid);
++      if (jack)
++              jack->jack_dirty = 1;
+       hdmi_array_free(spec);
+       kfree(spec);
diff --git a/queue-4.4/alsa-hda-realtek-eapd-turn-on-later.patch b/queue-4.4/alsa-hda-realtek-eapd-turn-on-later.patch
new file mode 100644 (file)
index 0000000..827985b
--- /dev/null
@@ -0,0 +1,40 @@
+From 607ca3bd220f4022e6f5356026b19dafc363863a Mon Sep 17 00:00:00 2001
+From: Kailang Yang <kailang@realtek.com>
+Date: Fri, 26 Apr 2019 16:35:41 +0800
+Subject: ALSA: hda/realtek - EAPD turn on later
+
+From: Kailang Yang <kailang@realtek.com>
+
+commit 607ca3bd220f4022e6f5356026b19dafc363863a upstream.
+
+Let EAPD turn on after set pin output.
+
+[ NOTE: This change is supposed to reduce the possible click noises at
+  (runtime) PM resume.  The functionality should be same (i.e. the
+  verbs are executed correctly) no matter which order is, so this
+  should be safe to apply for all codecs -- tiwai ]
+
+Signed-off-by: Kailang Yang <kailang@realtek.com>
+Cc: <stable@vger.kernel.org>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ sound/pci/hda/patch_realtek.c |    3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+--- a/sound/pci/hda/patch_realtek.c
++++ b/sound/pci/hda/patch_realtek.c
+@@ -772,11 +772,10 @@ static int alc_init(struct hda_codec *co
+       if (spec->init_hook)
+               spec->init_hook(codec);
++      snd_hda_gen_init(codec);
+       alc_fix_pll(codec);
+       alc_auto_init_amp(codec, spec->init_amp);
+-      snd_hda_gen_init(codec);
+-
+       snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_INIT);
+       return 0;
diff --git a/queue-4.4/alsa-usb-audio-fix-a-memory-leak-bug.patch b/queue-4.4/alsa-usb-audio-fix-a-memory-leak-bug.patch
new file mode 100644 (file)
index 0000000..d4307a5
--- /dev/null
@@ -0,0 +1,40 @@
+From cb5173594d50c72b7bfa14113dfc5084b4d2f726 Mon Sep 17 00:00:00 2001
+From: Wenwen Wang <wang6495@umn.edu>
+Date: Sat, 27 Apr 2019 01:06:46 -0500
+Subject: ALSA: usb-audio: Fix a memory leak bug
+
+From: Wenwen Wang <wang6495@umn.edu>
+
+commit cb5173594d50c72b7bfa14113dfc5084b4d2f726 upstream.
+
+In parse_audio_selector_unit(), the string array 'namelist' is allocated
+through kmalloc_array(), and each string pointer in this array, i.e.,
+'namelist[]', is allocated through kmalloc() in the following for loop.
+Then, a control instance 'kctl' is created by invoking snd_ctl_new1(). If
+an error occurs during the creation process, the string array 'namelist',
+including all string pointers in the array 'namelist[]', should be freed,
+before the error code ENOMEM is returned. However, the current code does
+not free 'namelist[]', resulting in memory leaks.
+
+To fix the above issue, free all string pointers 'namelist[]' in a loop.
+
+Signed-off-by: Wenwen Wang <wang6495@umn.edu>
+Cc: <stable@vger.kernel.org>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ sound/usb/mixer.c |    2 ++
+ 1 file changed, 2 insertions(+)
+
+--- a/sound/usb/mixer.c
++++ b/sound/usb/mixer.c
+@@ -2112,6 +2112,8 @@ static int parse_audio_selector_unit(str
+       kctl = snd_ctl_new1(&mixer_selectunit_ctl, cval);
+       if (! kctl) {
+               usb_audio_err(state->chip, "cannot malloc kcontrol\n");
++              for (i = 0; i < desc->bNrInPins; i++)
++                      kfree(namelist[i]);
+               kfree(namelist);
+               kfree(cval);
+               return -ENOMEM;
diff --git a/queue-4.4/asoc-max98090-fix-restore-of-dapm-muxes.patch b/queue-4.4/asoc-max98090-fix-restore-of-dapm-muxes.patch
new file mode 100644 (file)
index 0000000..3c054d5
--- /dev/null
@@ -0,0 +1,53 @@
+From ecb2795c08bc825ebd604997e5be440b060c5b18 Mon Sep 17 00:00:00 2001
+From: Jon Hunter <jonathanh@nvidia.com>
+Date: Wed, 1 May 2019 15:29:38 +0100
+Subject: ASoC: max98090: Fix restore of DAPM Muxes
+
+From: Jon Hunter <jonathanh@nvidia.com>
+
+commit ecb2795c08bc825ebd604997e5be440b060c5b18 upstream.
+
+The max98090 driver defines 3 DAPM muxes; one for the right line output
+(LINMOD Mux), one for the left headphone mixer source (MIXHPLSEL Mux)
+and one for the right headphone mixer source (MIXHPRSEL Mux). The same
+bit is used for the mux as well as the DAPM enable, and although the mux
+can be correctly configured, after playback has completed, the mux will
+be reset during the disable phase. This is preventing the state of these
+muxes from being saved and restored correctly on system reboot. Fix this
+by marking these muxes as SND_SOC_NOPM.
+
+Note this has been verified this on the Tegra124 Nyan Big which features
+the MAX98090 codec.
+
+Signed-off-by: Jon Hunter <jonathanh@nvidia.com>
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Cc: stable@vger.kernel.org
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ sound/soc/codecs/max98090.c |   12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+--- a/sound/soc/codecs/max98090.c
++++ b/sound/soc/codecs/max98090.c
+@@ -1209,14 +1209,14 @@ static const struct snd_soc_dapm_widget
+               &max98090_right_rcv_mixer_controls[0],
+               ARRAY_SIZE(max98090_right_rcv_mixer_controls)),
+-      SND_SOC_DAPM_MUX("LINMOD Mux", M98090_REG_LOUTR_MIXER,
+-              M98090_LINMOD_SHIFT, 0, &max98090_linmod_mux),
++      SND_SOC_DAPM_MUX("LINMOD Mux", SND_SOC_NOPM, 0, 0,
++              &max98090_linmod_mux),
+-      SND_SOC_DAPM_MUX("MIXHPLSEL Mux", M98090_REG_HP_CONTROL,
+-              M98090_MIXHPLSEL_SHIFT, 0, &max98090_mixhplsel_mux),
++      SND_SOC_DAPM_MUX("MIXHPLSEL Mux", SND_SOC_NOPM, 0, 0,
++              &max98090_mixhplsel_mux),
+-      SND_SOC_DAPM_MUX("MIXHPRSEL Mux", M98090_REG_HP_CONTROL,
+-              M98090_MIXHPRSEL_SHIFT, 0, &max98090_mixhprsel_mux),
++      SND_SOC_DAPM_MUX("MIXHPRSEL Mux", SND_SOC_NOPM, 0, 0,
++              &max98090_mixhprsel_mux),
+       SND_SOC_DAPM_PGA("HP Left Out", M98090_REG_OUTPUT_ENABLE,
+               M98090_HPLEN_SHIFT, 0, NULL, 0),
diff --git a/queue-4.4/asoc-rt5677-spi-disable-16bit-spi-transfers.patch b/queue-4.4/asoc-rt5677-spi-disable-16bit-spi-transfers.patch
new file mode 100644 (file)
index 0000000..b9285b9
--- /dev/null
@@ -0,0 +1,131 @@
+From a46eb523220e242affb9a6bc9bb8efc05f4f7459 Mon Sep 17 00:00:00 2001
+From: Curtis Malainey <cujomalainey@chromium.org>
+Date: Fri, 3 May 2019 12:32:14 -0700
+Subject: ASoC: RT5677-SPI: Disable 16Bit SPI Transfers
+
+From: Curtis Malainey <cujomalainey@chromium.org>
+
+commit a46eb523220e242affb9a6bc9bb8efc05f4f7459 upstream.
+
+The current algorithm allows 3 types of transfers, 16bit, 32bit and
+burst. According to Realtek, 16bit transfers have a special restriction
+in that it is restricted to the memory region of
+0x18020000 ~ 0x18021000. This region is the memory location of the I2C
+registers. The current algorithm does not uphold this restriction and
+therefore fails to complete writes.
+
+Since this has been broken for some time it likely no one is using it.
+Better to simply disable the 16 bit writes. This will allow users to
+properly load firmware over SPI without data corruption.
+
+Signed-off-by: Curtis Malainey <cujomalainey@chromium.org>
+Reviewed-by: Ben Zhang <benzh@chromium.org>
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Cc: stable@vger.kernel.org
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ sound/soc/codecs/rt5677-spi.c |   35 ++++++++++++++++-------------------
+ 1 file changed, 16 insertions(+), 19 deletions(-)
+
+--- a/sound/soc/codecs/rt5677-spi.c
++++ b/sound/soc/codecs/rt5677-spi.c
+@@ -60,13 +60,15 @@ static DEFINE_MUTEX(spi_mutex);
+  * RT5677_SPI_READ/WRITE_32:  Transfer 4 bytes
+  * RT5677_SPI_READ/WRITE_BURST:       Transfer any multiples of 8 bytes
+  *
+- * For example, reading 260 bytes at 0x60030002 uses the following commands:
+- * 0x60030002 RT5677_SPI_READ_16      2 bytes
++ * Note:
++ * 16 Bit writes and reads are restricted to the address range
++ * 0x18020000 ~ 0x18021000
++ *
++ * For example, reading 256 bytes at 0x60030004 uses the following commands:
+  * 0x60030004 RT5677_SPI_READ_32      4 bytes
+  * 0x60030008 RT5677_SPI_READ_BURST   240 bytes
+  * 0x600300F8 RT5677_SPI_READ_BURST   8 bytes
+  * 0x60030100 RT5677_SPI_READ_32      4 bytes
+- * 0x60030104 RT5677_SPI_READ_16      2 bytes
+  *
+  * Input:
+  * @read: true for read commands; false for write commands
+@@ -81,15 +83,13 @@ static u8 rt5677_spi_select_cmd(bool rea
+ {
+       u8 cmd;
+-      if (align == 2 || align == 6 || remain == 2) {
+-              cmd = RT5677_SPI_READ_16;
+-              *len = 2;
+-      } else if (align == 4 || remain <= 6) {
++      if (align == 4 || remain <= 4) {
+               cmd = RT5677_SPI_READ_32;
+               *len = 4;
+       } else {
+               cmd = RT5677_SPI_READ_BURST;
+-              *len = min_t(u32, remain & ~7, RT5677_SPI_BURST_LEN);
++              *len = (((remain - 1) >> 3) + 1) << 3;
++              *len = min_t(u32, *len, RT5677_SPI_BURST_LEN);
+       }
+       return read ? cmd : cmd + 1;
+ }
+@@ -110,7 +110,7 @@ static void rt5677_spi_reverse(u8 *dst,
+       }
+ }
+-/* Read DSP address space using SPI. addr and len have to be 2-byte aligned. */
++/* Read DSP address space using SPI. addr and len have to be 4-byte aligned. */
+ int rt5677_spi_read(u32 addr, void *rxbuf, size_t len)
+ {
+       u32 offset;
+@@ -126,7 +126,7 @@ int rt5677_spi_read(u32 addr, void *rxbu
+       if (!g_spi)
+               return -ENODEV;
+-      if ((addr & 1) || (len & 1)) {
++      if ((addr & 3) || (len & 3)) {
+               dev_err(&g_spi->dev, "Bad read align 0x%x(%zu)\n", addr, len);
+               return -EACCES;
+       }
+@@ -161,13 +161,13 @@ int rt5677_spi_read(u32 addr, void *rxbu
+ }
+ EXPORT_SYMBOL_GPL(rt5677_spi_read);
+-/* Write DSP address space using SPI. addr has to be 2-byte aligned.
+- * If len is not 2-byte aligned, an extra byte of zero is written at the end
++/* Write DSP address space using SPI. addr has to be 4-byte aligned.
++ * If len is not 4-byte aligned, then extra zeros are written at the end
+  * as padding.
+  */
+ int rt5677_spi_write(u32 addr, const void *txbuf, size_t len)
+ {
+-      u32 offset, len_with_pad = len;
++      u32 offset;
+       int status = 0;
+       struct spi_transfer t;
+       struct spi_message m;
+@@ -180,22 +180,19 @@ int rt5677_spi_write(u32 addr, const voi
+       if (!g_spi)
+               return -ENODEV;
+-      if (addr & 1) {
++      if (addr & 3) {
+               dev_err(&g_spi->dev, "Bad write align 0x%x(%zu)\n", addr, len);
+               return -EACCES;
+       }
+-      if (len & 1)
+-              len_with_pad = len + 1;
+-
+       memset(&t, 0, sizeof(t));
+       t.tx_buf = buf;
+       t.speed_hz = RT5677_SPI_FREQ;
+       spi_message_init_with_transfers(&m, &t, 1);
+-      for (offset = 0; offset < len_with_pad;) {
++      for (offset = 0; offset < len;) {
+               spi_cmd = rt5677_spi_select_cmd(false, (addr + offset) & 7,
+-                              len_with_pad - offset, &t.len);
++                              len - offset, &t.len);
+               /* Construct SPI message header */
+               buf[0] = spi_cmd;
index 2e0dd71d24b4625412d1aa77e4cf3d810db83fc7..e4bb82b8e6bc97afcbac721fe02c59b305ebf419 100644 (file)
@@ -5,3 +5,9 @@ crypto-chacha20poly1305-set-cra_name-correctly.patch
 crypto-vmx-fix-copy-paste-error-in-ctr-mode.patch
 crypto-crct10dif-generic-fix-use-via-crypto_shash_digest.patch
 crypto-x86-crct10dif-pcl-fix-use-via-crypto_shash_digest.patch
+alsa-usb-audio-fix-a-memory-leak-bug.patch
+alsa-hda-hdmi-read-the-pin-sense-from-register-when-repolling.patch
+alsa-hda-hdmi-consider-eld_valid-when-reporting-jack-event.patch
+alsa-hda-realtek-eapd-turn-on-later.patch
+asoc-max98090-fix-restore-of-dapm-muxes.patch
+asoc-rt5677-spi-disable-16bit-spi-transfers.patch