diff options
author | Binyuan Lan <lby@rock-chips.com> | 2017-11-10 10:05:58 +0800 |
---|---|---|
committer | Tao Huang <huangtao@rock-chips.com> | 2017-11-10 11:52:56 +0800 |
commit | b6999a3a2217eb87500887a402f6559cbcd1de8b (patch) | |
tree | 6e7f539b0af51db69be467611a1ecc1e9f2f15ec /drivers/headset_observe | |
parent | 53ec11e6a6d8122d02b33ecc6d09b6ddc4f77ac3 (diff) |
rk_headset: fix NULL pointer
Oops:
[ 3.155334] Unable to handle kernel NULL pointer dereference at virtual address 00000020
[ 3.665572] pgd = c0004000
[ 3.668307] [00000020] *pgd=00000000
[ 3.671955] Internal error: Oops: 5 [#1] PREEMPT SMP ARM
[ 3.677298] Modules linked in:
[ 3.680428] CPU: 0 PID: 1 Comm: swapper/0 Not tainted 4.4.83 #354
[ 3.686543] Hardware name: Generic DT based system
[ 3.691365] task: ef0b8000 task.stack: ef0a4000
[ 3.695948] PC is at _test_and_set_bit+0x24/0x4c
[ 3.700612] LR is at queue_delayed_work_on+0x28/0x54
Change-Id: I6d6e20f466c616334d593e7b54330468df44ae7c
Signed-off-by: Binyuan Lan <lby@rock-chips.com>
Diffstat (limited to 'drivers/headset_observe')
-rw-r--r--[-rwxr-xr-x] | drivers/headset_observe/rk_headset.c | 35 |
1 files changed, 15 insertions, 20 deletions
diff --git a/drivers/headset_observe/rk_headset.c b/drivers/headset_observe/rk_headset.c index e6b6a289a548..522ba44340ed 100755..100644 --- a/drivers/headset_observe/rk_headset.c +++ b/drivers/headset_observe/rk_headset.c @@ -373,13 +373,14 @@ int rk_headset_probe(struct platform_device *pdev,struct rk_headset_pdata *pdata { int ret; struct headset_priv *headset; - + headset = kzalloc(sizeof(struct headset_priv), GFP_KERNEL); if (headset == NULL) { dev_err(&pdev->dev, "failed to allocate driver data\n"); return -ENOMEM; } + headset_info = headset; headset->pdata = pdata; headset->headset_status = HEADSET_OUT; headset->hook_status = HOOK_UP; @@ -429,42 +430,36 @@ int rk_headset_probe(struct platform_device *pdev,struct rk_headset_pdata *pdata hs_early_suspend.level = ~0x0; register_early_suspend(&hs_early_suspend); #endif - //------------------------------------------------------------------ if (pdata->headset_gpio) { - if(!pdata->headset_gpio){ - dev_err(&pdev->dev,"failed init headset,please full hook_io_init function in board\n"); - goto failed_free_dev; - } - headset->irq[HEADSET] = gpio_to_irq(pdata->headset_gpio); if(pdata->headset_insert_type == HEADSET_IN_HIGH) headset->irq_type[HEADSET] = IRQF_TRIGGER_RISING; else headset->irq_type[HEADSET] = IRQF_TRIGGER_FALLING; - ret = request_irq(headset->irq[HEADSET], headset_interrupt, headset->irq_type[HEADSET], "headset_input", NULL); - if (ret) + ret = devm_request_irq(&pdev->dev, headset->irq[HEADSET], headset_interrupt, headset->irq_type[HEADSET], "headset_input", NULL); + if (ret) goto failed_free_dev; if (pdata->headset_wakeup) enable_irq_wake(headset->irq[HEADSET]); - } - else + } else { + dev_err(&pdev->dev, "failed init headset,please full hook_io_init function in board\n"); goto failed_free_dev; -//------------------------------------------------------------------ + } + if (pdata->hook_gpio) { headset->irq[HOOK] = gpio_to_irq(pdata->hook_gpio); headset->irq_type[HOOK] = pdata->hook_down_type == HOOK_DOWN_HIGH ? IRQF_TRIGGER_RISING : IRQF_TRIGGER_FALLING; - - ret = request_irq(headset->irq[HOOK], hook_interrupt, headset->irq_type[HOOK] , "headset_hook", NULL); - if (ret) + + ret = devm_request_irq(&pdev->dev, headset->irq[HOOK], hook_interrupt, headset->irq_type[HOOK], "headset_hook", NULL); + if (ret) goto failed_free_dev; disable_irq(headset->irq[HOOK]); } -//------------------------------------------------------------------ - headset_info = headset; - schedule_delayed_work(&headset->h_delayed_work[HEADSET], msecs_to_jiffies(500)); - return 0; - + + schedule_delayed_work(&headset->h_delayed_work[HEADSET], msecs_to_jiffies(500)); + return 0; + failed_free_dev: platform_set_drvdata(pdev, NULL); input_free_device(headset->input_dev); |