From c50762fa4c98d2773fa35dc413f7a18a61560e6d Mon Sep 17 00:00:00 2001 From: Wen Xie Date: Wed, 26 Sep 2018 17:29:36 +0800 Subject: [PATCH] DLKM:optimise drv2624 remove function -release related resource about vibtator registered in probe -issue:DLKM // kernel panic when rmmod drv2624 module Change-Id: Icbd222c3f7bff00dd87be366ca2cb00eb8546ad6 Signed-off-by: Wen Xie Reviewed-on: https://gerrit.mot.com/1246599 SLTApproved: Slta Waiver SME-Granted: SME Approvals Granted Tested-by: Jira Key Reviewed-by: Wang Wang Submit-Approved: Jira Key --- drivers/misc/drv2624_mmi/drv2624_mmi.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/drivers/misc/drv2624_mmi/drv2624_mmi.c b/drivers/misc/drv2624_mmi/drv2624_mmi.c index 4ada18fb1203..1df2d4dc0fd7 100644 --- a/drivers/misc/drv2624_mmi/drv2624_mmi.c +++ b/drivers/misc/drv2624_mmi/drv2624_mmi.c @@ -1610,6 +1610,7 @@ drv2624_probe(struct i2c_client *client, const struct i2c_device_id *id) static int drv2624_remove(struct i2c_client *client) { struct drv2624_data *ctrl = i2c_get_clientdata(client); + int i = 0; if (gpio_is_valid(ctrl->msPlatData.mnGpioNRST)) gpio_free(ctrl->msPlatData.mnGpioNRST); @@ -1617,8 +1618,15 @@ static int drv2624_remove(struct i2c_client *client) if (gpio_is_valid(ctrl->msPlatData.mnGpioINT)) gpio_free(ctrl->msPlatData.mnGpioINT); - misc_deregister(&drv2624_misc); + free_irq(client->irq, ctrl); + cancel_work_sync(&ctrl->vibrator_work); drv2624_class_vibrator(ctrl, false); + wake_lock_destroy(&ctrl->wklock); + misc_deregister(&drv2624_misc); + for (i = 0; i < ARRAY_SIZE(drv2624_led_classdev_attrs); i++) + sysfs_remove_file(&ctrl->cdev.dev->kobj, + &drv2624_led_classdev_attrs[i].attr); + devm_led_classdev_unregister(ctrl->dev, &(ctrl->cdev)); return 0; }