mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-06 10:58:48 +09:00
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:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user