summaryrefslogtreecommitdiff
path: root/drivers/headset_observe
diff options
context:
space:
mode:
authorBinyuan Lan <lby@rock-chips.com>2017-11-10 10:05:58 +0800
committerTao Huang <huangtao@rock-chips.com>2017-11-10 11:52:56 +0800
commitb6999a3a2217eb87500887a402f6559cbcd1de8b (patch)
tree6e7f539b0af51db69be467611a1ecc1e9f2f15ec /drivers/headset_observe
parent53ec11e6a6d8122d02b33ecc6d09b6ddc4f77ac3 (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.c35
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);