Hi Lars-Peter
occurs. The moment I start arecord, the console output from speaker-test stops, so it's locked up by starting arecord.
Are these implemented as two separate sound cards? If so I don't see how they could interfere with each other. There should not be any shared resources or locks between them at least on the ALSA side.
here are the definitions I've used in my driver - I had to translate my old code from kernel 4.11 to using the new macros so not sure if something got broken while doing that. I want my DAC and ADCs to be one sound card device.
SND_SOC_DAILINK_DEFS(ak4458, DAILINK_COMP_ARRAY(COMP_CPU("ff890000.i2s")), DAILINK_COMP_ARRAY(COMP_CODEC(NULL, "ak4458")), DAILINK_COMP_ARRAY(COMP_PLATFORM("ff890000.i2s")));
SND_SOC_DAILINK_DEFS(ak5558, DAILINK_COMP_ARRAY(COMP_CPU("audio-cpld")), DAILINK_COMP_ARRAY(COMP_CODEC(NULL, "ak5558")), DAILINK_COMP_ARRAY(COMP_PLATFORM("audio-cpld")));
enum { DAILINK_AK4458, DAILINK_AK5558, };
static struct snd_soc_dai_link rockchip_ak4458_ak5558_dai[] = { [DAILINK_AK4458] = { .name = "Audio out", .ops = &rockchip_ak4458_dai_ops, SND_SOC_DAILINK_REG(ak4458), }, [DAILINK_AK5558] = { .name = "Audio in", .ops = &rockchip_ak5558_dai_ops, SND_SOC_DAILINK_REG(ak5558), }, };
static struct snd_soc_card rockchip_ak4458_ak5558 = { .name = "ak4458-ak5558-audio", .dai_link = rockchip_ak4458_ak5558_dai, .num_links = ARRAY_SIZE(rockchip_ak4458_ak5558_dai), };
If possible try to narrow this down a bit more, this will help to track this down. If this is a more general issue it is quite likely that this is a more recently introduced problem, otherwise others would have already run into it. Maybe try one of the stable kernels like v5.4.
I will play around with a few different versions to see what happens.
To check if there is a locking issue somewhere compile your kernel with CONFIG_PROVE_LOCKING=y
do I need PROVE_RAW_LOCK_NESTING as well? what about PROVE_RCU and PROVE_RCU_LIST ?
Do both devices I2S and MMC use the same DMA? If so I could see things going wrong there since that would be shared resources in the DMA driver. If possible try to run the MMC driver without DMA and see what happens.
I think they both use DMA but I don't think the resources are shared, from what I can tell. My version of dw_mmc.c is 99% the same code but I just directly call my own callbacks in dw_mci_interrupt instead of dealing with the tasklet or work stuff.
Thanks for helping! Bert