如果声卡用的是rockchip,multicodecs-card,那么原因可能是因为rk_multicodecs_probe函数中获取adc资源时(devm_iio_channel_get)adc资源还没有准备好。
之后在插入耳机的状态下,驱动会执行到adc_jack_handler函数的iio_read_channel_processed代码中,因为adc资源获取出错导致iio_read_channel_processed函数执行无法访问正确的adc资源,从而出现内存错误而报错。
解决方法:在rk_multicodecs_probe函数中增加判断机制,若获取adc资源出错则返回EPROBE_DEFER,此错误值表示延迟一段时间后(待adc资源准备完成)再次执行probe函数。
代码如下:
struct iio_channel *adc;
adc = devm_iio_channel_get(&pdev->dev, "adc-detect");
if (IS_ERR(adc))
{
if(PTR_ERR(adc) == -EPROBE_DEFER){
return -EPROBE_DEFER;
}
}
附报错日志: