From ffdc12a18296ddb8c85e2c4fcdcd6d6a0cfae20a Mon Sep 17 00:00:00 2001 From: XiaoTan Luo Date: Thu, 23 Dec 2021 16:57:28 +0800 Subject: [PATCH] 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 Change-Id: I974d757819c3ffdd801711dc6561753ee2ee455a --- sound/soc/rockchip/rockchip_multicodecs.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/sound/soc/rockchip/rockchip_multicodecs.c b/sound/soc/rockchip/rockchip_multicodecs.c index 0acab8eae95f..9486a2e5db2d 100644 --- a/sound/soc/rockchip/rockchip_multicodecs.c +++ b/sound/soc/rockchip/rockchip_multicodecs.c @@ -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;