1. 11 Mar, 2019 8 commits
    • Jiada Wang's avatar
      ASoC: rsnd: src: Avoid a potential deadlock · ba164a49
      Jiada Wang authored
      lockdep warns us that priv->lock and k->k_lock can cause a
      deadlock when after acquire of k->k_lock, process is interrupted
      by src, while in another routine of src .init, k->k_lock is
      acquired with priv->lock held.
      
      This patch avoids a potential deadlock by not calling soc_device_match()
      in SRC .init callback, instead it adds new soc fields in priv->flags to
      differentiate SoCs.
      
      Fixes: linux-next commit 7674bec4 ("ASoC: rsnd: update BSDSR/BSDISR handling")
      Signed-off-by: default avatarJiada Wang <jiada_wang@mentor.com>
      Acked-by: default avatarKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
      Signed-off-by: default avatarMark Brown <broonie@kernel.org>
      ba164a49
    • Olivier Moysan's avatar
      ASoC: stm32: i2s: fix registers declaration in regmap · a39fe6e2
      Olivier Moysan authored
      - Declare SR as volatile, as it is changed by hardware.
      - Remove TXDR from readable and volatile register list,
      as it is intended for write accesses only.
      Signed-off-by: default avatarOlivier Moysan <olivier.moysan@st.com>
      Signed-off-by: default avatarMark Brown <broonie@kernel.org>
      a39fe6e2
    • John Hsu's avatar
      ASoC: nau8824: fix the issue of the widget with prefix name · 844a4a36
      John Hsu authored
      The driver has two issues when machine add prefix name for codec.
      (1)The stream name of DAI can't find the AIF widgets.
      (2)The drivr can enable/disalbe the MICBIAS and SAR widgets.
      
      The patch will fix these issues caused by prefixed name added.
      Signed-off-by: default avatarJohn Hsu <KCHSU0@nuvoton.com>
      Signed-off-by: default avatarMark Brown <broonie@kernel.org>
      844a4a36
    • KaiChieh Chuang's avatar
      ASoC: dpcm: prevent snd_soc_dpcm use after free · a9764869
      KaiChieh Chuang authored
      The dpcm get from fe_clients/be_clients
      may be free before use
      
      Add a spin lock at snd_soc_card level,
      to protect the dpcm instance.
      The lock may be used in atomic context, so use spin lock.
      
      Use irq spin lock version,
      since the lock may be used in interrupts.
      
      possible race condition between
      void dpcm_be_disconnect(
      	...
      	list_del(&dpcm->list_be);
      	list_del(&dpcm->list_fe);
      	kfree(dpcm);
      	...
      
      and
      	for_each_dpcm_fe()
      	for_each_dpcm_be*()
      
      race condition example
      Thread 1:
          snd_soc_dapm_mixer_update_power()
              -> soc_dpcm_runtime_update()
                  -> dpcm_be_disconnect()
                      -> kfree(dpcm);
      Thread 2:
          dpcm_fe_dai_trigger()
              -> dpcm_be_dai_trigger()
                  -> snd_soc_dpcm_can_be_free_stop()
                      -> if (dpcm->fe == fe)
      
      Excpetion Scenario:
      	two FE link to same BE
      	FE1 -> BE
      	FE2 ->
      
      	Thread 1: switch of mixer between FE2 -> BE
      	Thread 2: pcm_stop FE1
      
      Exception:
      
      Unable to handle kernel paging request at virtual address dead0000000000e0
      
      pc=<> [<ffffff8960e2cd10>] dpcm_be_dai_trigger+0x29c/0x47c
      	sound/soc/soc-pcm.c:3226
      		if (dpcm->fe == fe)
      lr=<> [<ffffff8960e2f694>] dpcm_fe_dai_do_trigger+0x94/0x26c
      
      Backtrace:
      [<ffffff89602dba80>] notify_die+0x68/0xb8
      [<ffffff896028c7dc>] die+0x118/0x2a8
      [<ffffff89602a2f84>] __do_kernel_fault+0x13c/0x14c
      [<ffffff89602a27f4>] do_translation_fault+0x64/0xa0
      [<ffffff8960280cf8>] do_mem_abort+0x4c/0xd0
      [<ffffff8960282ad0>] el1_da+0x24/0x40
      [<ffffff8960e2cd10>] dpcm_be_dai_trigger+0x29c/0x47c
      [<ffffff8960e2f694>] dpcm_fe_dai_do_trigger+0x94/0x26c
      [<ffffff8960e2edec>] dpcm_fe_dai_trigger+0x3c/0x44
      [<ffffff8960de5588>] snd_pcm_do_stop+0x50/0x5c
      [<ffffff8960dded24>] snd_pcm_action+0xb4/0x13c
      [<ffffff8960ddfdb4>] snd_pcm_drop+0xa0/0x128
      [<ffffff8960de69bc>] snd_pcm_common_ioctl+0x9d8/0x30f0
      [<ffffff8960de1cac>] snd_pcm_ioctl_compat+0x29c/0x2f14
      [<ffffff89604c9d60>] compat_SyS_ioctl+0x128/0x244
      [<ffffff8960283740>] el0_svc_naked+0x34/0x38
      [<ffffffffffffffff>] 0xffffffffffffffff
      Signed-off-by: default avatarKaiChieh Chuang <kaichieh.chuang@mediatek.com>
      Signed-off-by: default avatarMark Brown <broonie@kernel.org>
      a9764869
    • Rander Wang's avatar
      ASoC:intel:skl:fix a simultaneous playback & capture issue on hda platform · c899df3e
      Rander Wang authored
      If playback and capture are enabled concurrently, when the capture stops
      the output becomes inaudile. The playback application will become stuck
      and underrun after a timeout.
      
      This is caused by mistaken use of the stream_id, which should only be
      set for playback and not for capture
      
      Tested on Apollolake and Kabylake with SST driver.
      Signed-off-by: default avatarRander Wang <rander.wang@linux.intel.com>
      Acked-by: default avatarPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
      Signed-off-by: default avatarMark Brown <broonie@kernel.org>
      c899df3e
    • Rander Wang's avatar
      ASoC:hdac_hda:use correct format to setup hda codec · 03d0aa4d
      Rander Wang authored
      The current implementation of the hdac_hda codec results in zero-valued
      samples on capture and noise with headset playback when SOF is used on
      platforms with an on-board HDaudio codec. This is root-caused to SOF
      using be_hw_params_fixup, and the prepare() call using invalid runtime
      fields to determine the format.
      
      This patch moves the format handling to the hw_params() callback, as
      done already for hdac_hdmi, to make sure the fixed-up information is
      taken into account but keeps the codec initialization in prepare() as
      the stream_tag is only available at that time. Moving everything in the
      prepare() callback is possible but the code is less elegant so this
      two-step solution was chosen.
      
      The solution was tested with the SST driver with no regressions, and all
      the issues with SOF playback and capture are solved.
      Signed-off-by: default avatarRander Wang <rander.wang@linux.intel.com>
      Acked-by: default avatarPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
      Signed-off-by: default avatarMark Brown <broonie@kernel.org>
      03d0aa4d
    • Rander Wang's avatar
      ASoC:soc-pcm:fix a codec fixup issue in TDM case · 570f18b6
      Rander Wang authored
      On HDaudio platforms, if playback is started when capture is working,
      there is no audible output.
      
      This can be root-caused to the use of the rx|tx_mask to store an HDaudio
      stream tag.
      
      If capture is stared before playback, rx_mask would be non-zero on HDaudio
      platform, then the channel number of playback, which is in the same codec
      dai with the capture, would be changed by soc_pcm_codec_params_fixup based
      on the tx_mask at first, then overwritten by this function based on rx_mask
      at last.
      
      According to the author of tx|rx_mask, tx_mask is for playback and rx_mask
      is for capture. And stream direction is checked at all other references of
      tx|rx_mask in ASoC, so here should be an error. This patch checks stream
      direction for tx|rx_mask for fixup function.
      
      This issue would affect not only HDaudio+ASoC, but also I2S codecs if the
      channel number based on rx_mask is not equal to the one for tx_mask. It could
      be rarely reproduecd because most drivers in kernel set the same channel number
      to tx|rx_mask or rx_mask is zero.
      
      Tested on all platforms using stream_tag & HDaudio and intel I2S platforms.
      Signed-off-by: default avatarRander Wang <rander.wang@linux.intel.com>
      Acked-by: default avatarPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
      Signed-off-by: default avatarMark Brown <broonie@kernel.org>
      570f18b6
    • Sylwester Nawrocki's avatar
      ASoC: samsung: i2s: Fix DAPM routes for capture stream · 42e4cedd
      Sylwester Nawrocki authored
      This patch sets missing stream_name of capture part of the DAI driver
      so we can define DAPM routing properly also for the capture stream.
      
      While at it "Playback" suffix is added to the playback stream names
      to clearly identify playback/capture.
      
      Together with related dts patch this fixes NULL pointer dereference
      when opening ALSA device for recording on Odroid XU3.
      
      Fixes: 64aba9bc ("ASoC: samsung: i2s: Add widgets and routes for DPCM support")
      Signed-off-by: default avatarSylwester Nawrocki <s.nawrocki@samsung.com>
      Signed-off-by: default avatarMark Brown <broonie@kernel.org>
      42e4cedd
  2. 04 Mar, 2019 3 commits
  3. 03 Mar, 2019 7 commits
  4. 28 Feb, 2019 2 commits
  5. 26 Feb, 2019 11 commits
  6. 22 Feb, 2019 6 commits
  7. 21 Feb, 2019 1 commit
  8. 20 Feb, 2019 2 commits
    • Takashi Iwai's avatar
      ASoC: qcom: Fix of-node refcount unbalance in qcom_snd_parse_of() · 70b77321
      Takashi Iwai authored
      Although qcom_snd_parse_of() tries to manage the of-node refcount,
      there are still a few places that lead to the unblanced refcount in
      the error code path.  Namely,
      
      - for_each_child_of_node() needs to unreference the iterator node if
        aborting the loop in the middle,
      - cpu, codec and platform node objects have to be unreferenced at each
        iteration,
      - platform and codec node objects have to be referred before jumping
        to the error handling code that unreference them unconditionally.
      
      This patch tries to address these by moving the assignment of platform
      and codec node objects to the beginning of the loop and adding the
      of_node_put() calls adequately.
      
      Fixes: c25e295c ("ASoC: qcom: Add support to parse common audio device nodes")
      Cc: Patrick Lai <plai@codeaurora.org>
      Cc: Banajit Goswami <bgoswami@codeaurora.org>
      Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
      Signed-off-by: default avatarMark Brown <broonie@kernel.org>
      70b77321
    • Takashi Iwai's avatar
      ASoC: qcom: Fix of-node refcount unbalance in apq8016_sbc_parse_of() · 8d166720
      Takashi Iwai authored
      The apq8016 driver leaves the of-node refcount at aborting from the
      loop of for_each_child_of_node() in the error path.  Not only the
      iterator node of for_each_child_of_node(), the children nodes referred
      from it for codec and cpu have to be properly unreferenced.
      
      Fixes: bdb052e8 ("ASoC: qcom: add apq8016 sound card support")
      Cc: Patrick Lai <plai@codeaurora.org>
      Cc: Banajit Goswami <bgoswami@codeaurora.org>
      Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
      Signed-off-by: default avatarMark Brown <broonie@kernel.org>
      8d166720