From: Petr Cvek <petrcvekcz@gmail.com>
To: daniel@zonque.org, broonie@kernel.org, philipp.zabel@gmail.com,
haojian.zhuang@gmail.com, Robert Jarzmik <robert.jarzmik@free.fr>,
lgirdwood@gmail.com
Cc: alsa-devel@alsa-project.org, linux-arm-kernel@lists.infradead.org
Subject: ASoC: pxa: possible regressions
Date: Wed, 8 Aug 2018 04:24:30 +0200 [thread overview]
Message-ID: <5be00a36-d54b-e8ab-2d5f-4c1870f14aac@gmail.com> (raw)
Hello,
I was trying to update my system (PXA Magician) to 4.18-next and i've
ran into few problems with sound. My setup has only a few changes from
vanilla (change to using devm_snd_soc_register_card+devm_gpio_request).
I've started digging around:
1) unimportant goto
Commit 7afd1b0b2ef9a812095 ("ASoC: pxa: move some functions to
pxa2xx-lib") is this construct necessary?
if (pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream) {
ret = pxa2xx_pcm_preallocate_dma_buffer(pcm,
SNDRV_PCM_STREAM_CAPTURE);
if (ret)
goto out;
}
out:
return ret;
After calling pxa2xx_pcm_preallocate_dma_buffer() the code will jump to
out anyway.
2) wrong units (sample rate vs osc rate)
Commit 05739375f1c0a1048 ("ASoC: pxa-ssp: remove .set_pll() and
.set_clkdiv() callbacks"). The function pxa_ssp_hw_params() get's called
with sample rate so:
/* The values in the table are for 16 bits */
if (width == 32)
acds--;
ret = pxa_ssp_set_pll(priv, bclk);
if (ret < 0)
return ret;
ssacd = pxa_ssp_read_reg(ssp, SSACD);
ssacd &= ~(SSACD_ACDS(7) | SSACD_SCDB_1X);
pxa_ssp_set_pll() will try to set something like 8000, 44100, ... and
not the speed of an oscilator. The line should be probably:
ret = pxa_ssp_set_pll(priv, m->pll);
and there is a previous call to pxa_ssp_set_pll():
if (sscr0 & SSCR0_ACS) {
ret = pxa_ssp_set_pll(priv, bclk);
This one is OK I suppose?
3) setup fails
Recent changes in ASoC PXA DMA are causing a fail of a condition in
pxa_ssp_hw_params():
if ((sscr0 & SSCR0_MOD) && !ttsa) {
dev_err(&ssp->pdev->dev, "No TDM timeslot configured\n");
return -EINVAL;
}
It seems the SSCR0_MOD flag is set in the fall through switch statement
in pxa_ssp_configure_dai_fmt():
case SND_SOC_DAIFMT_DSP_A:
sspsp |= SSPSP_FSRT;
/* fall through */
case SND_SOC_DAIFMT_DSP_B:
sscr0 |= SSCR0_MOD | SSCR0_PSP;
sscr1 |= SSCR1_TRAIL | SSCR1_RWOT;
break;
the switch statement is an old code and it worked in the past versions.
4) names are not unique
The initialization of magician_dai structure wants to have (at least in
the past versions) for the .name item:
static struct snd_soc_dai_link magician_dai[] = {
{
.name = "uda1380",
.stream_name = "UDA1380 Playback",
.cpu_dai_name = "pxa-ssp-dai.0",
...
{
.name = "uda1380",
.stream_name = "UDA1380 Capture",
.cpu_dai_name = "pxa2xx-i2s",
my personal branch has them named as "uda1380_playback" and
"uda1380_capture".
5) Unbalanced references
When trying to play a sound (with quick-and-dirty workarounds for
problems above):
# cat /dev/urandom | aplay -
the system will crash when terminating aplay (stopping playback). The
backtrace:
------------[ cut here ]------------
WARNING: CPU: 0 PID: 352 at drivers/dma/dmaengine.c:788
dma_release_channel+0x44/0xa0
chan reference count 0 != 1
Modules linked in: snd_soc_magician snd_soc_uda1380 snd_soc_pxa2xx_i2s
spi_pxa2xx_platform snd_soc_pxa_ssp snd_soc_pxa2xx snd_pxa2xx_lib
snd_pcm_dmaengine snd_soc_core snd_pcm videobuf2_common snd_timer snd
ssp soundcore ... [last unloaded: udc_core]
CPU: 0 PID: 352 Comm: aplay Tainted: G C
4.18.0-rc6-next-20180726-magician+ #15
Hardware name: HTC Magician
[<c0107d90>] (unwind_backtrace) from [<c010594c>] (show_stack+0x10/0x14)
[<c010594c>] (show_stack) from [<c0111680>] (__warn+0xd4/0xec)
[<c0111680>] (__warn) from [<c01112d0>] (warn_slowpath_fmt+0x44/0x6c)
[<c01112d0>] (warn_slowpath_fmt) from [<c034908c>]
(dma_release_channel+0x44/0xa0)
[<c034908c>] (dma_release_channel) from [<bf3183d4>]
(snd_dmaengine_pcm_close_release_chan+0x2c/0x3c [snd_pcm_dmaengine])
[<bf3183d4>] (snd_dmaengine_pcm_close_release_chan
[snd_pcm_dmaengine]) from [<bf1e4fbc>]
(soc_pcm_components_close+0x64/0x70 [snd_soc_core])
[<bf1e4fbc>] (soc_pcm_components_close [snd_soc_core]) from
[<bf1e74a0>] (soc_pcm_close+0xac/0x1c0 [snd_soc_core])
[<bf1e74a0>] (soc_pcm_close [snd_soc_core]) from [<bf1407c8>]
(snd_pcm_release_substream+0x68/0xb8 [snd_pcm])
[<bf1407c8>] (snd_pcm_release_substream [snd_pcm]) from [<bf14085c>]
(snd_pcm_release+0x44/0x8c [snd_pcm])
[<bf14085c>] (snd_pcm_release [snd_pcm]) from [<c01c39e4>]
(__fput+0xdc/0x1e8)
[<c01c39e4>] (__fput) from [<c0129e7c>] (task_work_run+0xc4/0xd4)
[<c0129e7c>] (task_work_run) from [<c01053ac>] (do_work_pending+0xc0/0xc8)
[<c01053ac>] (do_work_pending) from [<c0101068>]
(slow_work_pending+0xc/0x20)
Exception stack(0xc2ffbfb0 to 0xc2ffbff8)
bfa0: 00000000 01f7a1a0 01f6fa3c
00000000
bfc0: 01f7a150 00000000 0009283c 00000006 000003f0 01f7a4c8 00000000
01f7a4c8
bfe0: b6ebbd70 be8ea960 b6e287b8 b6cd2018 60000010 00000004
---[ end trace b671f6531db6f6b3 ]---
I've only managed to discover there are two calls of
pxa2xx_soc_pcm_new() (where DMA buffer is allocated) for both dai links:
magician-audio magician-audio: uda1380-hifi-playback <-> pxa-ssp-dai.0
mapping ok
...
magician-audio magician-audio: uda1380-hifi-capture <-> pxa2xx-i2s
mapping ok
but I don't know if this information is relevant.
thanks for any help,
Petr Cvek
WARNING: multiple messages have this Message-ID (diff)
From: petrcvekcz@gmail.com (Petr Cvek)
To: linux-arm-kernel@lists.infradead.org
Subject: ASoC: pxa: possible regressions
Date: Wed, 8 Aug 2018 04:24:30 +0200 [thread overview]
Message-ID: <5be00a36-d54b-e8ab-2d5f-4c1870f14aac@gmail.com> (raw)
Hello,
I was trying to update my system (PXA Magician) to 4.18-next and i've
ran into few problems with sound. My setup has only a few changes from
vanilla (change to using devm_snd_soc_register_card+devm_gpio_request).
I've started digging around:
1) unimportant goto
Commit 7afd1b0b2ef9a812095 ("ASoC: pxa: move some functions to
pxa2xx-lib") is this construct necessary?
if (pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream) {
ret = pxa2xx_pcm_preallocate_dma_buffer(pcm,
SNDRV_PCM_STREAM_CAPTURE);
if (ret)
goto out;
}
out:
return ret;
After calling pxa2xx_pcm_preallocate_dma_buffer() the code will jump to
out anyway.
2) wrong units (sample rate vs osc rate)
Commit 05739375f1c0a1048 ("ASoC: pxa-ssp: remove .set_pll() and
.set_clkdiv() callbacks"). The function pxa_ssp_hw_params() get's called
with sample rate so:
/* The values in the table are for 16 bits */
if (width == 32)
acds--;
ret = pxa_ssp_set_pll(priv, bclk);
if (ret < 0)
return ret;
ssacd = pxa_ssp_read_reg(ssp, SSACD);
ssacd &= ~(SSACD_ACDS(7) | SSACD_SCDB_1X);
pxa_ssp_set_pll() will try to set something like 8000, 44100, ... and
not the speed of an oscilator. The line should be probably:
ret = pxa_ssp_set_pll(priv, m->pll);
and there is a previous call to pxa_ssp_set_pll():
if (sscr0 & SSCR0_ACS) {
ret = pxa_ssp_set_pll(priv, bclk);
This one is OK I suppose?
3) setup fails
Recent changes in ASoC PXA DMA are causing a fail of a condition in
pxa_ssp_hw_params():
if ((sscr0 & SSCR0_MOD) && !ttsa) {
dev_err(&ssp->pdev->dev, "No TDM timeslot configured\n");
return -EINVAL;
}
It seems the SSCR0_MOD flag is set in the fall through switch statement
in pxa_ssp_configure_dai_fmt():
case SND_SOC_DAIFMT_DSP_A:
sspsp |= SSPSP_FSRT;
/* fall through */
case SND_SOC_DAIFMT_DSP_B:
sscr0 |= SSCR0_MOD | SSCR0_PSP;
sscr1 |= SSCR1_TRAIL | SSCR1_RWOT;
break;
the switch statement is an old code and it worked in the past versions.
4) names are not unique
The initialization of magician_dai structure wants to have (at least in
the past versions) for the .name item:
static struct snd_soc_dai_link magician_dai[] = {
{
.name = "uda1380",
.stream_name = "UDA1380 Playback",
.cpu_dai_name = "pxa-ssp-dai.0",
...
{
.name = "uda1380",
.stream_name = "UDA1380 Capture",
.cpu_dai_name = "pxa2xx-i2s",
my personal branch has them named as "uda1380_playback" and
"uda1380_capture".
5) Unbalanced references
When trying to play a sound (with quick-and-dirty workarounds for
problems above):
# cat /dev/urandom | aplay -
the system will crash when terminating aplay (stopping playback). The
backtrace:
------------[ cut here ]------------
WARNING: CPU: 0 PID: 352 at drivers/dma/dmaengine.c:788
dma_release_channel+0x44/0xa0
chan reference count 0 != 1
Modules linked in: snd_soc_magician snd_soc_uda1380 snd_soc_pxa2xx_i2s
spi_pxa2xx_platform snd_soc_pxa_ssp snd_soc_pxa2xx snd_pxa2xx_lib
snd_pcm_dmaengine snd_soc_core snd_pcm videobuf2_common snd_timer snd
ssp soundcore ... [last unloaded: udc_core]
CPU: 0 PID: 352 Comm: aplay Tainted: G C
4.18.0-rc6-next-20180726-magician+ #15
Hardware name: HTC Magician
[<c0107d90>] (unwind_backtrace) from [<c010594c>] (show_stack+0x10/0x14)
[<c010594c>] (show_stack) from [<c0111680>] (__warn+0xd4/0xec)
[<c0111680>] (__warn) from [<c01112d0>] (warn_slowpath_fmt+0x44/0x6c)
[<c01112d0>] (warn_slowpath_fmt) from [<c034908c>]
(dma_release_channel+0x44/0xa0)
[<c034908c>] (dma_release_channel) from [<bf3183d4>]
(snd_dmaengine_pcm_close_release_chan+0x2c/0x3c [snd_pcm_dmaengine])
[<bf3183d4>] (snd_dmaengine_pcm_close_release_chan
[snd_pcm_dmaengine]) from [<bf1e4fbc>]
(soc_pcm_components_close+0x64/0x70 [snd_soc_core])
[<bf1e4fbc>] (soc_pcm_components_close [snd_soc_core]) from
[<bf1e74a0>] (soc_pcm_close+0xac/0x1c0 [snd_soc_core])
[<bf1e74a0>] (soc_pcm_close [snd_soc_core]) from [<bf1407c8>]
(snd_pcm_release_substream+0x68/0xb8 [snd_pcm])
[<bf1407c8>] (snd_pcm_release_substream [snd_pcm]) from [<bf14085c>]
(snd_pcm_release+0x44/0x8c [snd_pcm])
[<bf14085c>] (snd_pcm_release [snd_pcm]) from [<c01c39e4>]
(__fput+0xdc/0x1e8)
[<c01c39e4>] (__fput) from [<c0129e7c>] (task_work_run+0xc4/0xd4)
[<c0129e7c>] (task_work_run) from [<c01053ac>] (do_work_pending+0xc0/0xc8)
[<c01053ac>] (do_work_pending) from [<c0101068>]
(slow_work_pending+0xc/0x20)
Exception stack(0xc2ffbfb0 to 0xc2ffbff8)
bfa0: 00000000 01f7a1a0 01f6fa3c
00000000
bfc0: 01f7a150 00000000 0009283c 00000006 000003f0 01f7a4c8 00000000
01f7a4c8
bfe0: b6ebbd70 be8ea960 b6e287b8 b6cd2018 60000010 00000004
---[ end trace b671f6531db6f6b3 ]---
I've only managed to discover there are two calls of
pxa2xx_soc_pcm_new() (where DMA buffer is allocated) for both dai links:
magician-audio magician-audio: uda1380-hifi-playback <-> pxa-ssp-dai.0
mapping ok
...
magician-audio magician-audio: uda1380-hifi-capture <-> pxa2xx-i2s
mapping ok
but I don't know if this information is relevant.
thanks for any help,
Petr Cvek
next reply other threads:[~2018-08-08 2:24 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-08-08 2:24 Petr Cvek [this message]
2018-08-08 2:24 ` ASoC: pxa: possible regressions Petr Cvek
2018-08-08 5:38 ` Daniel Mack
2018-08-08 5:38 ` Daniel Mack
2018-08-08 9:07 ` Petr Cvek
2018-08-08 9:07 ` Petr Cvek
2018-08-13 5:54 ` Daniel Mack
2018-08-13 5:54 ` Daniel Mack
2018-08-15 14:29 ` Petr Cvek
2018-08-15 14:29 ` Petr Cvek
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=5be00a36-d54b-e8ab-2d5f-4c1870f14aac@gmail.com \
--to=petrcvekcz@gmail.com \
--cc=alsa-devel@alsa-project.org \
--cc=broonie@kernel.org \
--cc=daniel@zonque.org \
--cc=haojian.zhuang@gmail.com \
--cc=lgirdwood@gmail.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=philipp.zabel@gmail.com \
--cc=robert.jarzmik@free.fr \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.