diff options
author | Surya Teja Kudiri <quic_skudiri@quicinc.com> | 2023-02-20 11:23:15 +0530 |
---|---|---|
committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2023-03-17 02:14:23 -0700 |
commit | 720072033b7015d8300133401bd7f732c345a22f (patch) | |
tree | 4f910422d17b7082e38fca24de6075c9ef94d428 | |
parent | cb8bc5e42e58e9d0c3211e3bac6c7e1adfa401e5 (diff) | |
download | touch-720072033b7015d8300133401bd7f732c345a22f.tar.gz |
touch: derefernce NULL pointer during shutdown
dereference NULL pointers during shutdown and remove calls.
Change-Id: Ifae6edbc87d12a3f77cff6d2fd4bb9e4d24591ae
Signed-off-by: Surya Teja Kudiri <quic_skudiri@quicinc.com>
-rw-r--r-- | raydium/raydium_driver.c | 23 |
1 files changed, 17 insertions, 6 deletions
diff --git a/raydium/raydium_driver.c b/raydium/raydium_driver.c index 3ac39b2..41fda2e 100644 --- a/raydium/raydium_driver.c +++ b/raydium/raydium_driver.c @@ -1300,8 +1300,10 @@ static irqreturn_t raydium_ts_interrupt(int irq, void *dev_id) } else { if (!work_pending(&g_raydium_ts->work)) { /* Clear interrupts*/ - result = queue_work(g_raydium_ts->workqueue, - &g_raydium_ts->work); + if (g_raydium_ts->workqueue) { + result = queue_work(g_raydium_ts->workqueue, + &g_raydium_ts->work); + } if (!result) { /*queue_work fail*/ @@ -2512,6 +2514,9 @@ exit_check_functionality_failed: void raydium_ts_shutdown(struct i2c_client *client) { + LOGD(LOG_INFO, "[touch] %s: start\n", __func__); + + cancel_work_sync(&g_raydium_ts->work); if (g_raydium_ts->workqueue) { destroy_workqueue(g_raydium_ts->workqueue); g_raydium_ts->workqueue = NULL; @@ -2546,22 +2551,26 @@ if (active_panel) if (gpio_is_valid(g_raydium_ts->irq_gpio)) gpio_free(g_raydium_ts->irq_gpio); + raydium_enable_regulator(g_raydium_ts, false); raydium_get_regulator(g_raydium_ts, false); kfree(g_raydium_ts); i2c_set_clientdata(client, NULL); + LOGD(LOG_INFO, "[touch] %s: done\n", __func__); } static int raydium_ts_remove(struct i2c_client *client) { - if (g_raydium_ts->workqueue) { - destroy_workqueue(g_raydium_ts->workqueue); - g_raydium_ts->workqueue = NULL; - } + LOGD(LOG_INFO, "[touch] %s: start\n", __func__); + cancel_work_sync(&g_raydium_ts->work); + if (g_raydium_ts->workqueue) { + destroy_workqueue(g_raydium_ts->workqueue); + g_raydium_ts->workqueue = NULL; + } #if defined(CONFIG_FB) raydium_unregister_notifier(); #elif defined(CONFIG_HAS_EARLYSUSPEND) @@ -2590,12 +2599,14 @@ if (active_panel) if (gpio_is_valid(g_raydium_ts->irq_gpio)) gpio_free(g_raydium_ts->irq_gpio); + raydium_enable_regulator(g_raydium_ts, false); raydium_get_regulator(g_raydium_ts, false); kfree(g_raydium_ts); i2c_set_clientdata(client, NULL); + LOGD(LOG_INFO, "[touch] %s: done\n", __func__); return 0; } |