[alsa-devel] ASoC: pxa: possible regressions

Daniel Mack daniel at zonque.org
Wed Aug 8 07:38:16 CEST 2018


Hi Petr,

On Wednesday, August 08, 2018 04:24 AM, Petr Cvek wrote:
> I was trying to update my system (PXA Magician) to 4.18-next and i've
> ran into few problems with sound.

Ah, so you have a Magician platform, that's very good!

> My setup has only a few changes from
> vanilla (change to using devm_snd_soc_register_card+devm_gpio_request).

Care to share these changes, or ideally rebase them on top of 4.18-next 
for mainline inclusion? Also, I'm curious what mainline version you used 
to be based on that worked for you.

> I've started digging around:

Thanks for that. Are you also willing to send patches to fix things once 
they work for you?

> 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.

True. That's a cosmetic cleanup which can go in for 4.19. Would you want 
to send a patch after the merge window?

> 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():

Ah, yes. Does changing that fix it for you?

The changes in that machine driver where done blindly because I don't 
have Magician hardware, and I really don't like doing things that way.

> 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) {

What are the values of sscr0 and ttsa in your case? Can you cross-check 
that with a kernel that doesn't have my recent changes?

> 		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.

Yes, it was merely moved to some location that is called earlier. This 
was fixing a regression caused by a8bd0ee558714 ("ASoC: raumfeld: Use 
static DAI format setup"), so supposedly, all PXA sound was broken since 
v4.0.

> 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".

Care to send a patch for that as well, please?

> 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:

So you did hear a sound?

[...]

> 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.

That seems fine. The question is why there are are unbalanced calls to 
snd_dmaengine_pcm_close_release_chan(). Could you dig a bit further 
maybe and add some printk()?

Thanks for helping fix these regressions!


Daniel


More information about the Alsa-devel mailing list