26 Sep, 2018

1 commit

  • [ Upstream commit ff2d6acdf6f13d9f8fdcd890844c6d7535ac1f10 ]

    Without this commit the following intervals [x y), (x y) were be
    replaced to (y-1 y) by snd_interval_refine_last(). This was also done
    if y-1 is part of the previous interval.
    With this changes it will be replaced with [y-1 y) in case of y-1 is
    part of the previous interval. A similar behavior will be used for
    snd_interval_refine_first().

    This commit adapts the changes for alsa-lib of commit
    9bb985c ("pcm: snd_interval_refine_first/last: exclude value only if
    also excluded before")

    Signed-off-by: Timo Wischer
    Signed-off-by: Takashi Iwai
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Timo Wischer
     

24 Jan, 2018

1 commit

  • commit 23b19b7b50fe1867da8d431eea9cd3e4b6328c2c upstream.

    muldiv32() contains a snd_BUG_ON() (which is morphed as WARN_ON() with
    debug option) for checking the case of 0 / 0. This would be helpful
    if this happens only as a logical error; however, since the hw refine
    is performed with any data set provided by user, the inconsistent
    values that can trigger such a condition might be passed easily.
    Actually, syzbot caught this by passing some zero'ed old hw_params
    ioctl.

    So, having snd_BUG_ON() there is simply superfluous and rather
    harmful to give unnecessary confusions. Let's get rid of it.

    Reported-by: syzbot+7e6ee55011deeebce15d@syzkaller.appspotmail.com
    Signed-off-by: Takashi Iwai
    Signed-off-by: Greg Kroah-Hartman

    Takashi Iwai
     

17 Jan, 2018

1 commit

  • commit fe08f34d066f4404934a509b6806db1a4f700c86 upstream.

    syzkaller triggered kernel warnings through PCM OSS emulation at
    closing a stream:
    WARNING: CPU: 0 PID: 3502 at sound/core/pcm_lib.c:1635
    snd_pcm_hw_param_first+0x289/0x690 sound/core/pcm_lib.c:1635
    Call Trace:
    ....
    snd_pcm_hw_param_near.constprop.27+0x78d/0x9a0 sound/core/oss/pcm_oss.c:457
    snd_pcm_oss_change_params+0x17d3/0x3720 sound/core/oss/pcm_oss.c:969
    snd_pcm_oss_make_ready+0xaa/0x130 sound/core/oss/pcm_oss.c:1128
    snd_pcm_oss_sync+0x257/0x830 sound/core/oss/pcm_oss.c:1638
    snd_pcm_oss_release+0x20b/0x280 sound/core/oss/pcm_oss.c:2431
    __fput+0x327/0x7e0 fs/file_table.c:210
    ....

    This happens while it tries to open and set up the aloop device
    concurrently. The warning above (invoked from snd_BUG_ON() macro) is
    to detect the unexpected logical error where snd_pcm_hw_refine() call
    shouldn't fail. The theory is true for the case where the hw_params
    config rules are static. But for an aloop device, the hw_params rule
    condition does vary dynamically depending on the connected target;
    when another device is opened and changes the parameters, the device
    connected in another side is also affected, and it caused the error
    from snd_pcm_hw_refine().

    That is, the simplest "solution" for this is to remove the incorrect
    assumption of static rules, and treat such an error as a normal error
    path. As there are a couple of other places using snd_BUG_ON()
    incorrectly, this patch removes these spurious snd_BUG_ON() calls.

    Reported-by: syzbot+6f11c7e2a1b91d466432@syzkaller.appspotmail.com
    Signed-off-by: Takashi Iwai
    Signed-off-by: Greg Kroah-Hartman

    Takashi Iwai
     

30 Nov, 2017

1 commit

  • commit 20e3f985bb875fea4f86b04eba4b6cc29bfd6b71 upstream.

    commit 3179f6200188 ("ALSA: core: add .get_time_info") had a side effect
    of changing the behaviour of the PCM runtime tstamp. Prior to this
    change tstamp was not updated by snd_pcm_update_hw_ptr0() unless the
    hw_ptr had moved, after this change tstamp was always updated.

    For an application using alsa-lib, doing snd_pcm_readi() followed by
    snd_pcm_status() to estimate the age of the read samples by subtracting
    status->avail * [sample rate] from status->tstamp this change degraded
    the accuracy of the estimate on devices where the pcm hw does not
    provide a granular hw_ptr, e.g., devices using
    soc-generic-dmaengine-pcm.c and a dma-engine with residue_granularity
    DMA_RESIDUE_GRANULARITY_DESCRIPTOR. The accuracy of the estimate
    depended on the latency between the PCM hw completing a period and the
    driver called snd_pcm_period_elapsed() to notify ALSA core, typically
    determined by interrupt handling latency. After the change the accuracy
    of the estimate depended on the latency between the PCM hw completing a
    period and the application calling snd_pcm_status(), determined by the
    scheduling of the application process. The maximum error of the
    estimate is one period length in both cases, but the error average and
    variance is smaller when it depends on interrupt latency.

    Instead of always updating tstamp, update it only if audio_tstamp
    changed.

    Fixes: 3179f6200188 ("ALSA: core: add .get_time_info")
    Suggested-by: Pierre-Louis Bossart
    Signed-off-by: Henrik Eriksson
    Signed-off-by: Takashi Iwai
    Signed-off-by: Greg Kroah-Hartman

    Henrik Eriksson
     

07 Jul, 2017

1 commit

  • Pull sound updates from Takashi Iwai:
    "This development cycle resulted in a fair amount of changes in both
    core and driver sides. The most significant change in ALSA core is
    about PCM. Also the support of of-graph card and the new DAPM widget
    for DSP are noteworthy changes in ASoC core. And there're lots of
    small changes splat over the tree, as you can see in diffstat.

    Below are a few highlights:

    ALSA core:
    - Removal of set_fs() hackery from PCM core stuff, and the code
    reorganization / optimization thereafter
    - Improved support of PCM ack ops, and a new ABI for improved
    control/status mmap handling
    - Lots of constifications in various codes

    ASoC core:
    - The support of of-graph card, which may work as a better generic
    device for a replacement of simple-card
    - New widget types intended mainly for use with DSPs

    ASoC drivers:
    - New drivers for Allwinner V3s SoCs
    - Ensonic ES8316 codec support
    - More Intel SKL and KBL works
    - More device support for Intel SST Atom (mostly for cheap tablets
    and 2-in-1 devices)
    - Support for Rockchip PDM controllers
    - Support for STM32 I2S and S/PDIF controllers
    - Support for ZTE AUD96P22 codecs

    HD-audio:
    - Support of new Realtek codecs (ALC215/ALC285/ALC289), more quirks
    for HP and Dell machines
    - A few more fixes for i915 component binding"

    * tag 'sound-4.13-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: (418 commits)
    ALSA: hda - Fix unbalance of i915 module refcount
    ASoC: Intel: Skylake: Remove driver debugfs exit
    ASoC: Intel: Skylake: explicitly add the headers sst-dsp.h
    ALSA: hda/realtek - Remove GPIO_MASK
    ALSA: hda/realtek - Fix typo of pincfg for Dell quirk
    ALSA: pcm: add a documentation for tracepoints
    ALSA: atmel: ac97c: fix error return code in atmel_ac97c_probe()
    ALSA: x86: fix error return code in hdmi_lpe_audio_probe()
    ASoC: Intel: Skylake: Add support to read firmware registers
    ASoC: Intel: Skylake: Add sram address to sst_addr structure
    ASoC: Intel: Skylake: Debugfs facility to dump module config
    ASoC: Intel: Skylake: Add debugfs support
    ASoC: fix semicolon.cocci warnings
    ASoC: rt5645: Add quirk override by module option
    ASoC: rsnd: make arrays path and cmd_case static const
    ASoC: audio-graph-card: add widgets and routing for external amplifier support
    ASoC: audio-graph-card: update bindings for amplifier support
    ASoC: rt5665: calibration should be done before jack detection
    ASoC: rsnd: constify dev_pm_ops structures.
    ASoC: nau8825: change crosstalk-bypass property to bool type
    ...

    Linus Torvalds
     

24 Jun, 2017

1 commit


20 Jun, 2017

3 commits

  • Rename:

    wait_queue_t => wait_queue_entry_t

    'wait_queue_t' was always a slight misnomer: its name implies that it's a "queue",
    but in reality it's a queue *entry*. The 'real' queue is the wait queue head,
    which had to carry the name.

    Start sorting this out by renaming it to 'wait_queue_entry_t'.

    This also allows the real structure name 'struct __wait_queue' to
    lose its double underscore and become 'struct wait_queue_entry',
    which is the more canonical nomenclature for such data types.

    Cc: Linus Torvalds
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Cc: linux-kernel@vger.kernel.org
    Signed-off-by: Ingo Molnar

    Ingo Molnar
     
  • The ALSA PCM core refers to the appl_ptr value stored on the mmapped
    page that is shared between kernel and user-space. Although the
    reference is performed in the PCM stream lock, it doesn't guarantee
    the atomic access when the value gets updated concurrently from the
    user-space on another CPU.

    In most of codes, this is no big problem, but still there are a few
    places that may result in slight inconsistencies because they access
    runtime->control->appl_ptr multiple times; that is, the second read
    might be a different value from the first value. It can be even
    backward or jumping, as we have no control for it. Hence, the
    calculation may give an unexpected value. Luckily, there is no
    security vulnerability by that, as far as I've checked. But still we
    should address it.

    This patch tries to reduce such possible cases. The fix is simple --
    we just read once, store it to a local variable and use it for the
    rest calculations. The READ_ONCE() macro is used for it in order to
    avoid the ill-effect by possible compiler optimizations.

    Reviewed-by: Takashi Sakamoto
    Signed-off-by: Takashi Iwai

    Takashi Iwai
     
  • Takashi Iwai
     

16 Jun, 2017

1 commit


14 Jun, 2017

3 commits

  • The standard PCM chmap helper callbacks treat the NULL info->chmap as
    a fatal error and spews the kernel warning with stack trace when
    CONFIG_SND_DEBUG is on. This was OK, originally it was supposed to be
    always static and non-NULL. But, as the recent addition of Intel LPE
    audio driver shows, the chmap content may vary dynamically, and it can
    be even NULL when disconnected. The user still sees the kernel
    warning unnecessarily.

    For clearing such a confusion, this patch simply removes the
    snd_BUG_ON() in each place, just returns an error without warning.

    Cc: # v4.11+
    Signed-off-by: Takashi Iwai

    Takashi Iwai
     
  • Drivers can implement 'struct snd_pcm_ops.ioctl' to handle some requests
    from ALSA PCM core. These requests are internal purpose in kernel land.
    Usually common set of operations are used for it.

    SNDRV_PCM_IOCTL1_INFO is one of the requests. According to code comment,
    it has been obsoleted in the old days.

    We can see old releases in ftp.alsa-project.org. The command was firstly
    introduced in v0.5.0 release as SND_PCM_IOCTL1_INFO, to allow drivers to
    fill data of 'struct snd_pcm_channel_info' type. In v0.9.0 release,
    this was obsoleted by the other commands for ioctl(2) such as
    SNDRV_PCM_IOCTL_CHANNEL_INFO.

    This commit removes the long-abandoned command, bye.

    Signed-off-by: Takashi Sakamoto
    Signed-off-by: Takashi Iwai

    Takashi Sakamoto
     
  • We call ack callback whenever appl_ptr gets updated via
    pcm_lib_apply_appl_ptr(). There are various code paths to call this
    function. A part of them are for read/write/forward/rewind, where the
    appl_ptr is always changed and thus the call of ack is mandatory.
    OTOH, another part of code paths are from the explicit user call,
    e.g. via SYNC_PTR ioctl. There, we may receive the same appl_ptr
    value, and in such a case, calling ack is obviously superfluous.

    This patch adds the check of the given appl_ptr value, and returns
    immediately if it's no real update.

    Reviewed-by: Takashi Sakamoto
    Signed-off-by: Takashi Iwai

    Takashi Iwai
     

12 Jun, 2017

2 commits

  • In design of ALSA PCM core, status and control data for runtime of ALSA
    PCM substream are shared between kernel/user spaces by page frame
    mapping with read-only attribute. Both of hardware-side and
    application-side position on PCM buffer are maintained as a part of
    the status data. In a view of ALSA PCM application, these two positions
    can be updated by executing ioctl(2) with some commands.

    There's an event of tracepoint for hardware-side position; 'hwptr'.
    On the other hand, no events for application-side position. This commit
    adds a new event for this purpose; 'applptr'. When the application-side
    position is changed in kernel space, this event is probed with useful
    information for developers.

    I note that the event is not probed for all of ALSA PCM applications, When
    applications are written by read/write programming scenario, the event is
    surely probed. The applications execute ioctl(2) with
    SNDRV_PCM_IOCTL_[READ|WRITE][N/I]_FRAMES to read/write any PCM frame, then
    ALSA PCM core updates the application-side position in kernel land.
    However, when applications are written by mmap programming scenario, if
    maintaining the application side position in kernel space accurately,
    applications should voluntarily execute ioctl(2) with
    SNDRV_PCM_IOCTL_SYNC_PTR to commit the number of handled PCM frames. If
    not voluntarily, the application-side position is not changed, thus the
    added event is not probed.

    There's a loophole, using architectures to which ALSA PCM core judges
    non cache coherent. In this case, the status and control data is not mapped
    into processe's VMA for any applications. Userland library, alsa-lib, is
    programmed for this case. It executes ioctl(2) with
    SNDRV_PCM_IOCTL_SYNC_PTR command every time to requiring the status and
    control data.

    ARM is such an architecture. Below is an example with serial sound interface
    (ssi) on i.mx6 quad core SoC. I use v4.1 kernel released by fsl-community
    with patches from VIA Tech. Inc. for VAB820, and my backport patches for
    relevant features for this patchset. I use Ubuntu 17.04 from
    ports.ubuntu.com as user land for armhf architecture.

    $ aplay -v -M -D hw:imx6vab820sgtl5,0 /dev/urandom -f S16_LE -r 48000 --period-size=128 --buffer-size=256
    Playing raw data '/dev/urandom' : Signed 16 bit Little Endian, Rate 48000 Hz, Mono
    Hardware PCM card 0 'imx6-vab820-sgtl5000' device 0 subdevice 0
    Its setup is:
    stream : PLAYBACK
    access : MMAP_INTERLEAVED
    format : S16_LE
    subformat : STD
    channels : 1
    rate : 48000
    exact rate : 48000 (48000/1)
    msbits : 16
    buffer_size : 256
    period_size : 128
    period_time : 2666
    tstamp_mode : NONE
    tstamp_type : MONOTONIC
    period_step : 1
    avail_min : 128
    period_event : 0
    start_threshold : 256
    stop_threshold : 256
    silence_threshold: 0
    silence_size : 0
    boundary : 1073741824
    appl_ptr : 0
    hw_ptr : 0
    mmap_area[0] = 0x76f98000,0,16 (16)

    $ trace-cmd record -e snd_pcm:hwptr -e snd_pcm:applptr
    $ trace-cmd report
    ...
    60.208495: applptr: pcmC0D0p/sub0: prev=1792, curr=1792, avail=0, period=128, buf=256
    60.208633: applptr: pcmC0D0p/sub0: prev=1792, curr=1792, avail=0, period=128, buf=256
    60.210022: hwptr: pcmC0D0p/sub0: IRQ: pos=128, old=1536, base=1536, period=128, buf=256
    60.210202: applptr: pcmC0D0p/sub0: prev=1792, curr=1792, avail=128, period=128, buf=256
    60.210344: hwptr: pcmC0D0p/sub0: POS: pos=128, old=1664, base=1536, period=128, buf=256
    60.210348: applptr: pcmC0D0p/sub0: prev=1792, curr=1792, avail=128, period=128, buf=256
    60.210486: applptr: pcmC0D0p/sub0: prev=1792, curr=1792, avail=128, period=128, buf=256
    60.210626: applptr: pcmC0D0p/sub0: prev=1792, curr=1920, avail=0, period=128, buf=256
    60.211002: applptr: pcmC0D0p/sub0: prev=1920, curr=1920, avail=0, period=128, buf=256
    60.211142: hwptr: pcmC0D0p/sub0: POS: pos=128, old=1664, base=1536, period=128, buf=256
    60.211146: applptr: pcmC0D0p/sub0: prev=1920, curr=1920, avail=0, period=128, buf=256
    60.211287: applptr: pcmC0D0p/sub0: prev=1920, curr=1920, avail=0, period=128, buf=256
    60.212690: hwptr: pcmC0D0p/sub0: IRQ: pos=0, old=1664, base=1536, period=128, buf=256
    60.212866: applptr: pcmC0D0p/sub0: prev=1920, curr=1920, avail=128, period=128, buf=256
    60.212999: hwptr: pcmC0D0p/sub0: POS: pos=0, old=1792, base=1792, period=128, buf=256
    60.213003: applptr: pcmC0D0p/sub0: prev=1920, curr=1920, avail=128, period=128, buf=256
    60.213135: applptr: pcmC0D0p/sub0: prev=1920, curr=1920, avail=128, period=128, buf=256
    60.213276: applptr: pcmC0D0p/sub0: prev=1920, curr=2048, avail=0, period=128, buf=256
    60.213654: applptr: pcmC0D0p/sub0: prev=2048, curr=2048, avail=0, period=128, buf=256
    60.213796: hwptr: pcmC0D0p/sub0: POS: pos=0, old=1792, base=1792, period=128, buf=256
    60.213800: applptr: pcmC0D0p/sub0: prev=2048, curr=2048, avail=0, period=128, buf=256
    60.213937: applptr: pcmC0D0p/sub0: prev=2048, curr=2048, avail=0, period=128, buf=256
    60.215356: hwptr: pcmC0D0p/sub0: IRQ: pos=128, old=1792, base=1792, period=128, buf=256
    60.215542: applptr: pcmC0D0p/sub0: prev=2048, curr=2048, avail=128, period=128, buf=256
    60.215679: hwptr: pcmC0D0p/sub0: POS: pos=128, old=1920, base=1792, period=128, buf=256
    60.215683: applptr: pcmC0D0p/sub0: prev=2048, curr=2048, avail=128, period=128, buf=256
    60.215813: applptr: pcmC0D0p/sub0: prev=2048, curr=2048, avail=128, period=128, buf=256
    60.215947: applptr: pcmC0D0p/sub0: prev=2048, curr=2176, avail=0, period=128, buf=256
    ...

    We can surely see 'applptr' event is probed even if the application run
    for mmap programming scenario ('-M' option and 'hw' plugin). Below is a
    result of strace:

    02:44:15.886382 ioctl(4, SNDRV_PCM_IOCTL_SYNC_PTR, 0x56a32b30) = 0
    02:44:15.887203 poll([{fd=4, events=POLLOUT|POLLERR|POLLNVAL}], 1, -1) = 1 ([{fd=4, revents=POLLOUT}])
    02:44:15.887471 ioctl(4, SNDRV_PCM_IOCTL_SYNC_PTR, 0x56a32b30) = 0
    02:44:15.887637 ioctl(4, SNDRV_PCM_IOCTL_SYNC_PTR, 0x56a32b30) = 0
    02:44:15.887805 ioctl(4, SNDRV_PCM_IOCTL_SYNC_PTR, 0x56a32b30) = 0
    02:44:15.887969 ioctl(4, SNDRV_PCM_IOCTL_SYNC_PTR, 0x56a32b30) = 0
    02:44:15.888132 read(3, "..."..., 256) = 256
    02:44:15.889040 ioctl(4, SNDRV_PCM_IOCTL_SYNC_PTR, 0x56a32b30) = 0
    02:44:15.889221 ioctl(4, SNDRV_PCM_IOCTL_SYNC_PTR, 0x56a32b30) = 0
    02:44:15.889431 ioctl(4, SNDRV_PCM_IOCTL_SYNC_PTR, 0x56a32b30) = 0
    02:44:15.889606 poll([{fd=4, events=POLLOUT|POLLERR|POLLNVAL}], 1, -1) = 1 ([{fd=4, revents=POLLOUT}])
    02:44:15.889833 ioctl(4, SNDRV_PCM_IOCTL_SYNC_PTR, 0x56a32b30) = 0
    02:44:15.889998 ioctl(4, SNDRV_PCM_IOCTL_SYNC_PTR, 0x56a32b30) = 0
    02:44:15.890164 ioctl(4, SNDRV_PCM_IOCTL_SYNC_PTR, 0x56a32b30) = 0
    02:44:15.891048 ioctl(4, SNDRV_PCM_IOCTL_SYNC_PTR, 0x56a32b30) = 0
    02:44:15.891228 read(3, "..."..., 256) = 256
    02:44:15.891497 ioctl(4, SNDRV_PCM_IOCTL_SYNC_PTR, 0x56a32b30) = 0
    02:44:15.891661 ioctl(4, SNDRV_PCM_IOCTL_SYNC_PTR, 0x56a32b30) = 0
    02:44:15.891829 ioctl(4, SNDRV_PCM_IOCTL_SYNC_PTR, 0x56a32b30) = 0
    02:44:15.891991 poll([{fd=4, events=POLLOUT|POLLERR|POLLNVAL}], 1, -1) = 1 ([{fd=4, revents=POLLOUT}])
    02:44:15.893007 ioctl(4, SNDRV_PCM_IOCTL_SYNC_PTR, 0x56a32b30) = 0

    We can see 7 calls of ioctl(2) with SNDRV_PCM_IOCTL_SYNC_PTR per loop with
    call of poll(2). 128 PCM frames are transferred per loop of one poll(2),
    because the PCM substream is configured with S16_LE format and 1 channel
    (2 byte * 1 * 128 = 256 bytes). This equals to the size of period of PCM
    buffer. Comparing to the probed data, one of the 7 calls of ioctl(2) is
    actually used to commit the number of copied PCM frames to kernel space.
    The other calls are just used to check runtime status of PCM substream;
    e.g. XRUN.

    The tracepoint event is useful to investigate this case. I note that below
    modules are related to the above sample.

    * snd-soc-dummy.ko
    * snd-soc-imx-sgtl5000.ko
    * snd-soc-fsl-ssi.ko
    * snd-soc-imx-pcm-dma.ko
    * snd-soc-sgtl5000.ko

    My additional note is lock acquisition. The event is probed under acquiring
    PCM stream lock. This means that calculation in the event is free from
    any hardware events.

    Signed-off-by: Takashi Sakamoto
    Signed-off-by: Takashi Iwai

    Takashi Sakamoto
     
  • In a series of recent work, ALSA PCM core got some arrangements to handle
    application-side position on PCM buffer. However, relevant codes still
    disperse to two translation units

    This commit unifies these codes into a helper function.

    Signed-off-by: Takashi Sakamoto
    Signed-off-by: Takashi Iwai

    Takashi Sakamoto
     

09 Jun, 2017

1 commit

  • As of v4.12, snd_pcm_hw_params_choose() is just called in a process
    context of ioctl(2) with SNDRV_PCM_IOCTL_HW_PARAMS. The function locates
    in a different file, which has no tracepoints.

    This commit moves the function to a file with the tracepoints for later
    commit.

    Signed-off-by: Takashi Sakamoto
    Signed-off-by: Takashi Iwai

    Takashi Sakamoto
     

03 Jun, 2017

9 commits

  • Now all materials are ready, let's allow the direct in-kernel
    read/write, i.e. a kernel-space buffer is passed for read or write,
    instead of the normal user-space buffer. This feature is used by OSS
    layer and UAC1 driver, for example.

    The __snd_pcm_lib_xfer() takes in_kernel argument that indicates the
    in-kernel buffer copy. When this flag is set, another transfer code
    is used. It's either via copy_kernel PCM ops or the normal memcpy(),
    depending on the driver setup.

    As external API, snd_pcm_kernel_read(), *_write() and other variants
    are provided.

    That's all. This support is really simple because of the code
    refactoring until now.

    Reviewed-by: Takashi Sakamoto
    Signed-off-by: Takashi Iwai

    Takashi Iwai
     
  • Use the existing silence helper codes for simplification.

    Reviewed-by: Takashi Sakamoto
    Signed-off-by: Takashi Iwai

    Takashi Iwai
     
  • Both __snd_pcm_lib_read() and __snd_pcm_write() functions have almost
    the same code to loop over samples. For simplification, this patch
    unifies both as the single helper, __snd_pcm_lib_xfer().

    Other than that, there should be no functional change by this patch.

    Reviewed-by: Takashi Sakamoto
    Signed-off-by: Takashi Iwai

    Takashi Iwai
     
  • This patch proceeds more abstraction of PCM read/write loop codes.

    For both interleaved and non-interleaved transfers, the same copy or
    silence transfer code (which is defined as pcm_transfer_f) is used
    now. This became possible since we switched to byte size to copy_*
    and fill_silence ops argument instead of frames.

    And, for both read and write, we can use the same copy function (which
    is defined as pcm_copy_f), just depending on whether interleaved or
    non-interleaved mode.

    The transfer function is determined at the beginning of the loop,
    depending on whether the driver gives the specific copy ops or it's
    the standard read/write.

    Another bonus by this change is that we now guarantee the silencing
    behavior when NULL buffer is passed to write helpers. It'll simplify
    some codes later.

    Reviewed-by: Takashi Sakamoto
    Signed-off-by: Takashi Iwai

    Takashi Iwai
     
  • Make snd_pcm_lib_read() and *_write() static inline functions that
    call the common helper functions directly. This reduces a slight
    amount of codes, and at the same time, it's a preparation for the
    further cleanups / fixes.

    Reviewed-by: Takashi Sakamoto
    Signed-off-by: Takashi Iwai

    Takashi Iwai
     
  • Just shuffle the codes, without any change otherwise.

    Reviewed-by: Takashi Sakamoto
    Signed-off-by: Takashi Iwai

    Takashi Iwai
     
  • Reviewed-by: Takashi Sakamoto
    Signed-off-by: Takashi Iwai

    Takashi Iwai
     
  • Now that all users of old copy and silence ops have been converted to
    the new PCM ops, the old stuff can be retired and go away.

    Reviewed-by: Takashi Sakamoto
    Signed-off-by: Takashi Iwai

    Takashi Iwai
     
  • For supporting the explicit in-kernel copy of PCM buffer data, and
    also for further code refactoring, three new PCM ops, copy_user,
    copy_kernel and fill_silence, are introduced. The old copy and
    silence ops will be deprecated and removed later once when all callers
    are converted.

    The copy_kernel ops is the new one, and it's supposed to transfer the
    PCM data from the given kernel buffer to the hardware ring-buffer (or
    vice-versa depending on the stream direction), while the copy_user ops
    is equivalent with the former copy ops, to transfer the data from the
    user-space buffer.

    The major difference of the new copy_* and fill_silence ops from the
    previous ops is that the new ops take bytes instead of frames for size
    and position arguments. It has two merits: first, it allows the
    callback implementation often simpler (just call directly memcpy() &
    co), and second, it may unify the implementations of both interleaved
    and non-interleaved cases, as we'll see in the later patch.

    As of this stage, copy_kernel ops isn't referred yet, but only
    copy_user is used.

    Reviewed-by: Takashi Sakamoto
    Acked-by: Mark Brown
    Signed-off-by: Takashi Iwai

    Takashi Iwai
     

26 May, 2017

1 commit

  • Several files are used to construct PCM core module, a.k.a snd-pcm.
    Although available APIs are described in 'include/sound/pcm.h', some of
    them are not exported as symbols in kernel space. Such APIs are just for
    module local usage.

    This commit adds module local header file and move some function prototypes
    into it so that scopes of them are controlled properly and developers
    get no confusion from unavailable symbols.

    Signed-off-by: Takashi Sakamoto
    Signed-off-by: Takashi Iwai

    Takashi Sakamoto
     

17 May, 2017

2 commits


02 Mar, 2017

1 commit


10 May, 2016

1 commit

  • When snd_pcm_add_chmap_ctls() is called to the PCM stream to which a
    chmap has been already assigned, it returns as an error due to the
    conflicting snd_ctl_add() result. However, this also clears the
    already assigned chmap_kctl field via pcm_chmap_ctl_private_free(),
    and becomes inconsistent in the later operation.

    This patch adds the check of the conflicting chmap kctl before
    actually trying to allocate / assign. The check failure is treated as
    a kernel warning, as the double call of snd_pcm_add_chmap_ctls() is
    basically a driver bug and having the stack trace would help
    developers to figure out the bad code path.

    Signed-off-by: Takashi Iwai

    Takashi Iwai
     

15 Apr, 2016

1 commit

  • Currently kill_fasync() is called outside the stream lock in
    snd_pcm_period_elapsed(). This is potentially racy, since the stream
    may get released even during the irq handler is running. Although
    snd_pcm_release_substream() calls snd_pcm_drop(), this doesn't
    guarantee that the irq handler finishes, thus the kill_fasync() call
    outside the stream spin lock may be invoked after the substream is
    detached, as recently reported by KASAN.

    As a quick workaround, move kill_fasync() call inside the stream
    lock. The fasync is rarely used interface, so this shouldn't have a
    big impact from the performance POV.

    Ideally, we should implement some sync mechanism for the proper finish
    of stream and irq handler. But this oneliner should suffice for most
    cases, so far.

    Reported-by: Baozeng Ding
    Signed-off-by: Takashi Iwai

    Takashi Iwai
     

11 Mar, 2016

1 commit

  • The commit [d507941beb1e: ALSA: pcm: Correct PCM BUG error message]
    made the warning prefix back to "BUG:" due to its previous wrong
    prefix. But a kernel message containing "BUG:" seems taken as an Oops
    message wrongly by some brain-dead daemons, and it annoys users in the
    end. Instead of teaching daemons, change the string again to a more
    reasonable one.

    Fixes: 507941beb1e ('ALSA: pcm: Correct PCM BUG error message')
    Cc: # v3.19+
    Signed-off-by: Takashi Iwai

    Takashi Iwai
     

28 Oct, 2015

1 commit

  • The ALSA core does not modify the constraints provided by a driver. Most
    constraint helper functions already take a const pointer to the constraint
    description, the exception at the moment being the ratden and ratnum
    constraints. Make those const as well, this allows a driver to declare them
    as const.

    Signed-off-by: Lars-Peter Clausen
    Signed-off-by: Takashi Iwai

    Lars-Peter Clausen
     

22 Oct, 2015

1 commit

  • While there is nothing wrong with the transfer_ack_begin and
    transfer_ack_end callbacks per-se, the last documented user was part of the
    alsa-driver 0.5.12a package, which was released 14 years ago and even
    predates the upstream integration of the ALSA core and has subsequently
    been superseded by newer alsa-driver releases.

    This seems to indicate that there is no need for having these callbacks and
    they are just cruft that can be removed.

    Signed-off-by: Lars-Peter Clausen
    Signed-off-by: Takashi Iwai

    Lars-Peter Clausen
     

16 Oct, 2015

1 commit

  • PCM timer is not always used. For embedded device, we need an interface
    to disable it when it is not needed, to shrink the kernel size and
    memory footprint, here add CONFIG_SND_PCM_TIMER for it.

    When both CONFIG_SND_PCM_TIMER and CONFIG_SND_TIMER is unselected,
    about 25KB saving bonus we can get.

    Please be noted that when disabled, those stubs who using pcm timer
    (e.g. dmix, dsnoop & co) may work incorrectlly.

    Suggested-by: Takashi Iwai
    Signed-off-by: Jie Yang
    Signed-off-by: Takashi Iwai

    Jie Yang
     

19 May, 2015

1 commit

  • Currently in snd_pcm_update_hw_ptr0 during interrupt,
    we consider there were double acknowledged interrupts when:
    1. HW reported pointer is smaller than expected, and
    2. Time from last update time (hdelta) is over half a buffer time.

    However, when HW reported pointer is only a few bytes smaller than
    expected, and when hdelta is just a little larger than half a buffer time
    (e.g. ping-pong buffer), it wrongly treats this IRQ as double acknowledged.

    The condition #2 uses jiffies, but jiffies is not high resolution
    since it is integer. We should consider jiffies inaccuracy.

    Signed-off-by: Koro Chen
    Signed-off-by: Takashi Iwai

    Koro Chen
     

21 Feb, 2015

1 commit

  • Introduce more generic .get_time_info to retrieve
    system timestamp and audio timestamp in single routine.
    Backwards compatibility is preserved with same functionality
    as with .wall_clock method (to be removed in following commits
    to avoid breaking git bisect)

    Signed-off-by: Pierre-Louis Bossart
    Signed-off-by: Takashi Iwai

    Pierre-Louis Bossart
     

05 Feb, 2015

1 commit

  • …e/sound into for-next

    ASoC: Updates for v3.20

    More updates for v3.20:

    - Lots of refactoring from Lars-Peter Clausen, moving drivers to more
    data driven initialization and rationalizing a lot of DAPM usage.
    - Much improved handling of CDCLK clocks on Samsung I2S controllers.
    - Lots of driver specific cleanups and feature improvements.
    - CODEC support for TI PCM514x and TLV320AIC3104 devices.
    - Board support for Tegra systems with Realtek RT5677.

    Conflicts:
    sound/soc/intel/sst-mfld-platform-pcm.c

    Takashi Iwai
     

29 Jan, 2015

1 commit

  • Add helper functions to allow drivers to specify several disjoint
    ranges for a variable. In particular, there is a codec (PCM512x) that
    has a hole in its supported range of rates, due to PLL and divider
    restrictions.

    This is like snd_pcm_hw_constraint_list(), but for ranges instead of
    points.

    Signed-off-by: Peter Rosin
    Reviewed-by: Lars-Peter Clausen
    Reviewed-by: Takashi Iwai
    Signed-off-by: Mark Brown

    Peter Rosin
     

30 Dec, 2014

1 commit

  • Currently the msbits constraints requires to specify a specific sample
    format width for which the constraint should be applied. But often the
    number of most significant bits is not sample format specific, but rather a
    absolute limit. E.g. the PCM interface might accept 32-bit and 24-bit
    samples, but the DAC has a 16-bit resolution and throws away the LSBs. In
    this case for both 32-bit and 24-bit format msbits should be set to 16. This
    patch extends snd_pcm_hw_constraint_msbits() so that a wildcard constraint
    can be setup that is applied for all formats with a sample width larger than
    the specified msbits. Choosing the wildcard constraint is done by setting
    the sample width parameter of the function to 0.

    Signed-off-by: Lars-Peter Clausen
    Signed-off-by: Takashi Iwai

    Lars-Peter Clausen