ASoC: rockchip: multicodecs: Fix panic when get adc error

[   30.670500] Internal error: Oops: 96000005 [#1] SMP
[   30.670947] Modules linked in:
[   30.671257] CPU: 0 PID: 105 Comm: kworker/u16:1 Not tainted 5.10.66 #172
[   30.671866] Hardware name: Rockchip RK3588 EVB1 LP4 V10 Board (DT)
[   30.672447] Workqueue: events_power_efficient adc_jack_handler
[   30.672989] pstate: 60c00009 (nZCv daif +PAN +UAO -TCO BTYPE=--)
[   30.673548] pc : iio_read_channel_processed+0x28/0xdc
[   30.674023] lr : adc_jack_handler+0xc8/0x188
[   30.674418] sp : ffffffc012783d50
[   30.674731] x29: ffffffc012783d50 x28: 0000000000000000
[   30.675240] x27: ffffffc011cc9960 x26: 0000000000000000
[   30.675735] x25: ffffffc011a17980 x24: 0000000000000000
[   30.676232] x23: ffffff840002e100 x22: ffffffc011cc99a0
[   30.676728] x21: ffffffc012783da4 x20: ffffffffffffffed
[   30.677234] x19: ffffff8402c6c880 x18: 0000000000000000
[   30.677730] x17: 0000000000000000 x16: 0000000000000000
[   30.678236] x15: 0000000000000000 x14: 0000000000000000
[   30.678742] x13: 0000000000000000 x12: 0000000000000000
[   30.679247] x11: 0000000000000000 x10: 0000000000000db0
[   30.679753] x9 : ffffffc010b90a58 x8 : ffffff840098da7c
[   30.680259] x7 : fefefefefefefeff x6 : 0000746e65696369
[   30.680765] x5 : 0000000000000018 x4 : ffffff840098da6c
[   30.681262] x3 : ffffff8400f15000 x2 : 0000000000000000
[   30.681758] x1 : ffffffc012783da4 x0 : ffffffffffffffed
[   31.074520] Call trace:
[   31.074764]  iio_read_channel_processed+0x28/0xdc
[   31.075205]  adc_jack_handler+0xc8/0x188
[   31.075576]  process_one_work+0x1e0/0x298
[   31.075955]  worker_thread+0x1e4/0x27c
[   31.076310]  kthread+0xf8/0x108
[   31.076609]  ret_from_fork+0x10/0x30
[   31.076957] Code: a90153f3 aa0003f4 f90013f5 aa010

Signed-off-by: XiaoTan Luo <lxt@rock-chips.com>
Change-Id: I974d757819c3ffdd801711dc6561753ee2ee455a
This commit is contained in:
XiaoTan Luo
2021-12-23 16:57:28 +08:00
committed by Tao Huang
parent 500092fdf3
commit ffdc12a182

View File

@@ -256,6 +256,13 @@ static void adc_jack_handler(struct work_struct *work)
return;
}
if (!mc_data->adc) {
/* no ADC, so is headphone */
snd_soc_jack_report(jack_headset, SND_JACK_HEADPHONE, SND_JACK_HEADSET);
extcon_set_state_sync(mc_data->extcon, EXTCON_JACK_HEADPHONE, true);
extcon_set_state_sync(mc_data->extcon, EXTCON_JACK_MICROPHONE, false);
return;
}
ret = iio_read_channel_processed(mc_data->adc, &adc);
if (ret < 0) {
/* failed to read ADC, so assume headphone */
@@ -671,8 +678,10 @@ static int rk_multicodecs_probe(struct platform_device *pdev)
mc_data->adc = devm_iio_channel_get(&pdev->dev, "adc-detect");
if (IS_ERR(mc_data->adc)) {
if (PTR_ERR(mc_data->adc) != -EPROBE_DEFER)
if (PTR_ERR(mc_data->adc) != -EPROBE_DEFER) {
mc_data->adc = NULL;
dev_warn(&pdev->dev, "Failed to get ADC channel");
}
} else {
if (mc_data->adc->channel->type != IIO_VOLTAGE)
return -EINVAL;