From d149d0b6d25f45bd7553f0566e4ff8b29b9290d3 Mon Sep 17 00:00:00 2001 From: chenlj2 Date: Thu, 27 Sep 2018 10:41:33 +0800 Subject: [PATCH] DLKM:optimise sar sensor remove function -release related resource about sarsensor registered in probe -issue:DLKM // kernel panic when rmmod sx932x_sar or abov_sar module Change-Id: Ib8da9744eab96c253f224232e111488ca2c93445 Signed-off-by: chenlj2 Reviewed-on: https://gerrit.mot.com/1247406 SME-Granted: SME Approvals Granted SLTApproved: Slta Waiver Tested-by: Jira Key Reviewed-by: Wen Xie Reviewed-by: Jun Weng Reviewed-by: Tao Sun Submit-Approved: Jira Key --- drivers/misc/abov/abov_sar_mmi.c | 13 +++++++------ drivers/misc/sx9325/sx9325_sar.c | 10 +++++----- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/drivers/misc/abov/abov_sar_mmi.c b/drivers/misc/abov/abov_sar_mmi.c index 64ca7534df18..a67f7339a098 100644 --- a/drivers/misc/abov/abov_sar_mmi.c +++ b/drivers/misc/abov/abov_sar_mmi.c @@ -1790,7 +1790,11 @@ static int abov_remove(struct i2c_client *client) pabovXX_t this = i2c_get_clientdata(client); pDevice = this->pDevice; + pplatData = client->dev.platform_data; if (this && pDevice) { + power_supply_unreg_notifier(&this->ps_notif); + cancel_work_sync(&this->fw_update_work.worker); + cancel_work_sync(&this->ps_notify_work); #ifdef USE_SENSORS_CLASS sensors_classdev_unregister(&sensors_capsensor_top_cdev); sensors_classdev_unregister(&sensors_capsensor_bottom_cdev); @@ -1803,17 +1807,14 @@ static int abov_remove(struct i2c_client *client) regulator_put(this->board->cap_svdd); } #endif - + if (gpio_is_valid(pplatData ->irq_gpio)) + gpio_free(pplatData ->irq_gpio); if (this->board->cap_vdd_en) { regulator_disable(this->board->cap_vdd); regulator_put(this->board->cap_vdd); } -#ifdef USE_SENSORS_CLASS - sensors_classdev_unregister(&sensors_capsensor_top_cdev); - sensors_classdev_unregister(&sensors_capsensor_bottom_cdev); -#endif sysfs_remove_group(&client->dev.kobj, &abov_attr_group); - pplatData = client->dev.platform_data; + class_unregister(&capsense_class); if (pplatData && pplatData->exit_platform_hw) pplatData->exit_platform_hw(); kfree(this->pDevice); diff --git a/drivers/misc/sx9325/sx9325_sar.c b/drivers/misc/sx9325/sx9325_sar.c index 39d55bce5e80..186030808447 100644 --- a/drivers/misc/sx9325/sx9325_sar.c +++ b/drivers/misc/sx9325/sx9325_sar.c @@ -1360,11 +1360,13 @@ static int sx9325_remove(struct i2c_client *client) psx93XX_t this = i2c_get_clientdata(client); pDevice = this->pDevice; + pplatData = client->dev.platform_data; if (this && pDevice) { #if defined(CONFIG_FB) fb_unregister_client(&this->fb_notif); #endif power_supply_unreg_notifier(&this->ps_notif); + cancel_work_sync(&this->ps_notify_work); #ifdef USE_SENSORS_CLASS sensors_classdev_unregister(&sensors_capsensor_top_cdev); @@ -1374,6 +1376,8 @@ static int sx9325_remove(struct i2c_client *client) input_unregister_device( pDevice->pbuttonInformation->input_bottom); + if (gpio_is_valid(pplatData ->irq_gpio)) + gpio_free(pplatData ->irq_gpio); if (this->board->cap_svdd_en) { regulator_disable(this->board->cap_svdd); regulator_put(this->board->cap_svdd); @@ -1383,13 +1387,9 @@ static int sx9325_remove(struct i2c_client *client) regulator_disable(this->board->cap_vdd); regulator_put(this->board->cap_vdd); } -#endif -#ifdef USE_SENSORS_CLASS - sensors_classdev_unregister(&sensors_capsensor_top_cdev); - sensors_classdev_unregister(&sensors_capsensor_bottom_cdev); #endif sysfs_remove_group(&client->dev.kobj, &sx9325_attr_group); - pplatData = client->dev.platform_data; + class_unregister(&capsense_class); if (pplatData && pplatData->exit_platform_hw) pplatData->exit_platform_hw(); kfree(this->pDevice);