From: Greg Kroah-Hartman Date: Fri, 17 May 2019 13:14:59 +0000 (+0200) Subject: 4.14-stable patches X-Git-Tag: v4.9.178~34 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=d93337f243164c29a7b0af73a9f0afe4d814d3ed;p=thirdparty%2Fkernel%2Fstable-queue.git 4.14-stable patches 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-codec-hdac_hdmi-add-device_link-to-card-device.patch asoc-max98090-fix-restore-of-dapm-muxes.patch asoc-rt5677-spi-disable-16bit-spi-transfers.patch --- diff --git a/queue-4.14/alsa-hda-hdmi-consider-eld_valid-when-reporting-jack-event.patch b/queue-4.14/alsa-hda-hdmi-consider-eld_valid-when-reporting-jack-event.patch new file mode 100644 index 00000000000..03c98ab3377 --- /dev/null +++ b/queue-4.14/alsa-hda-hdmi-consider-eld_valid-when-reporting-jack-event.patch @@ -0,0 +1,58 @@ +From 7f641e26a6df9269cb25dd7a4b0a91d6586ed441 Mon Sep 17 00:00:00 2001 +From: Hui Wang +Date: Mon, 6 May 2019 22:09:32 +0800 +Subject: ALSA: hda/hdmi - Consider eld_valid when reporting jack event + +From: Hui Wang + +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 +Cc: +Signed-off-by: Takashi Iwai +Signed-off-by: Greg Kroah-Hartman + +--- + 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 +@@ -1549,9 +1549,11 @@ static bool hdmi_present_sense_via_verbs + ret = !repoll || !eld->monitor_present || 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); + return ret; + } diff --git a/queue-4.14/alsa-hda-hdmi-read-the-pin-sense-from-register-when-repolling.patch b/queue-4.14/alsa-hda-hdmi-read-the-pin-sense-from-register-when-repolling.patch new file mode 100644 index 00000000000..14311e3e3e0 --- /dev/null +++ b/queue-4.14/alsa-hda-hdmi-read-the-pin-sense-from-register-when-repolling.patch @@ -0,0 +1,45 @@ +From 8c2e6728c2bf95765b724e07d0278ae97cd1ee0d Mon Sep 17 00:00:00 2001 +From: Hui Wang +Date: Mon, 6 May 2019 22:09:31 +0800 +Subject: ALSA: hda/hdmi - Read the pin sense from register when repolling + +From: Hui Wang + +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 +Cc: +Signed-off-by: Takashi Iwai +Signed-off-by: Greg Kroah-Hartman + +--- + 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 +@@ -1661,6 +1661,11 @@ static void hdmi_repoll_eld(struct work_ + container_of(to_delayed_work(work), struct hdmi_spec_per_pin, work); + struct hda_codec *codec = per_pin->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; + + if (per_pin->repoll_count++ > 6) + per_pin->repoll_count = 0; diff --git a/queue-4.14/alsa-hda-realtek-eapd-turn-on-later.patch b/queue-4.14/alsa-hda-realtek-eapd-turn-on-later.patch new file mode 100644 index 00000000000..95723ea4acc --- /dev/null +++ b/queue-4.14/alsa-hda-realtek-eapd-turn-on-later.patch @@ -0,0 +1,40 @@ +From 607ca3bd220f4022e6f5356026b19dafc363863a Mon Sep 17 00:00:00 2001 +From: Kailang Yang +Date: Fri, 26 Apr 2019 16:35:41 +0800 +Subject: ALSA: hda/realtek - EAPD turn on later + +From: Kailang Yang + +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 +Cc: +Signed-off-by: Takashi Iwai +Signed-off-by: Greg Kroah-Hartman + +--- + 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 +@@ -781,11 +781,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.14/alsa-usb-audio-fix-a-memory-leak-bug.patch b/queue-4.14/alsa-usb-audio-fix-a-memory-leak-bug.patch new file mode 100644 index 00000000000..c7d60277347 --- /dev/null +++ b/queue-4.14/alsa-usb-audio-fix-a-memory-leak-bug.patch @@ -0,0 +1,40 @@ +From cb5173594d50c72b7bfa14113dfc5084b4d2f726 Mon Sep 17 00:00:00 2001 +From: Wenwen Wang +Date: Sat, 27 Apr 2019 01:06:46 -0500 +Subject: ALSA: usb-audio: Fix a memory leak bug + +From: Wenwen Wang + +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 +Cc: +Signed-off-by: Takashi Iwai +Signed-off-by: Greg Kroah-Hartman + +--- + sound/usb/mixer.c | 2 ++ + 1 file changed, 2 insertions(+) + +--- a/sound/usb/mixer.c ++++ b/sound/usb/mixer.c +@@ -2184,6 +2184,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.14/asoc-codec-hdac_hdmi-add-device_link-to-card-device.patch b/queue-4.14/asoc-codec-hdac_hdmi-add-device_link-to-card-device.patch new file mode 100644 index 00000000000..fd4bc051fee --- /dev/null +++ b/queue-4.14/asoc-codec-hdac_hdmi-add-device_link-to-card-device.patch @@ -0,0 +1,47 @@ +From 01c8327667c249818d3712c3e25c7ad2aca7f389 Mon Sep 17 00:00:00 2001 +From: Libin Yang +Date: Sat, 13 Apr 2019 21:18:12 +0800 +Subject: ASoC: codec: hdac_hdmi add device_link to card device + +From: Libin Yang + +commit 01c8327667c249818d3712c3e25c7ad2aca7f389 upstream. + +In resume from S3, HDAC HDMI codec driver dapm event callback may be +operated before HDMI codec driver turns on the display audio power +domain because of the contest between display driver and hdmi codec driver. + +This patch adds the device_link between soc card device (consumer) and +hdmi codec device (supplier) to make sure the sequence is always correct. + +Signed-off-by: Libin Yang +Reviewed-by: Takashi Iwai +Acked-by: Pierre-Louis Bossart +Signed-off-by: Mark Brown +Cc: stable@vger.kernel.org +Signed-off-by: Greg Kroah-Hartman + +--- + sound/soc/codecs/hdac_hdmi.c | 11 +++++++++++ + 1 file changed, 11 insertions(+) + +--- a/sound/soc/codecs/hdac_hdmi.c ++++ b/sound/soc/codecs/hdac_hdmi.c +@@ -1856,6 +1856,17 @@ static void hdmi_codec_complete(struct d + hdac_hdmi_skl_enable_dp12(&edev->hdac); + + /* ++ * Setup a device_link between card device and HDMI codec device. ++ * The card device is the consumer and the HDMI codec device is ++ * the supplier. With this setting, we can make sure that the audio ++ * domain in display power will be always turned on before operating ++ * on the HDMI audio codec registers. ++ * Let's use the flag DL_FLAG_AUTOREMOVE_CONSUMER. This can make ++ * sure the device link is freed when the machine driver is removed. ++ */ ++ device_link_add(component->card->dev, &hdev->dev, DL_FLAG_RPM_ACTIVE | ++ DL_FLAG_AUTOREMOVE_CONSUMER); ++ /* + * As the ELD notify callback request is not entertained while the + * device is in suspend state. Need to manually check detection of + * all pins here. pin capablity change is not support, so use the diff --git a/queue-4.14/asoc-max98090-fix-restore-of-dapm-muxes.patch b/queue-4.14/asoc-max98090-fix-restore-of-dapm-muxes.patch new file mode 100644 index 00000000000..3c054d58b6e --- /dev/null +++ b/queue-4.14/asoc-max98090-fix-restore-of-dapm-muxes.patch @@ -0,0 +1,53 @@ +From ecb2795c08bc825ebd604997e5be440b060c5b18 Mon Sep 17 00:00:00 2001 +From: Jon Hunter +Date: Wed, 1 May 2019 15:29:38 +0100 +Subject: ASoC: max98090: Fix restore of DAPM Muxes + +From: Jon Hunter + +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 +Signed-off-by: Mark Brown +Cc: stable@vger.kernel.org +Signed-off-by: Greg Kroah-Hartman + +--- + 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.14/asoc-rt5677-spi-disable-16bit-spi-transfers.patch b/queue-4.14/asoc-rt5677-spi-disable-16bit-spi-transfers.patch new file mode 100644 index 00000000000..6cd04ae14ea --- /dev/null +++ b/queue-4.14/asoc-rt5677-spi-disable-16bit-spi-transfers.patch @@ -0,0 +1,131 @@ +From a46eb523220e242affb9a6bc9bb8efc05f4f7459 Mon Sep 17 00:00:00 2001 +From: Curtis Malainey +Date: Fri, 3 May 2019 12:32:14 -0700 +Subject: ASoC: RT5677-SPI: Disable 16Bit SPI Transfers + +From: Curtis Malainey + +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 +Reviewed-by: Ben Zhang +Signed-off-by: Mark Brown +Cc: stable@vger.kernel.org +Signed-off-by: Greg Kroah-Hartman + +--- + 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 +@@ -58,13 +58,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 +@@ -79,15 +81,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; + } +@@ -108,7 +108,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; +@@ -124,7 +124,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; + } +@@ -159,13 +159,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; +@@ -178,22 +178,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; diff --git a/queue-4.14/series b/queue-4.14/series index 0ed9d27806c..3a24df5e19b 100644 --- a/queue-4.14/series +++ b/queue-4.14/series @@ -22,3 +22,10 @@ crypto-x86-crct10dif-pcl-fix-use-via-crypto_shash_digest.patch crypto-gcm-fix-incompatibility-between-gcm-and-gcm_base.patch crypto-rockchip-update-iv-buffer-to-contain-the-next-iv.patch crypto-arm-aes-neonbs-don-t-access-already-freed-walk.iv.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 +asoc-codec-hdac_hdmi-add-device_link-to-card-device.patch