From decf93e1baa793ed54e15aac7e4e3ffc62d823ca Mon Sep 17 00:00:00 2001 From: huangjq9 Date: Wed, 6 Nov 2019 10:08:20 +0800 Subject: [PATCH] stylus_pen: enable interrupt handler after wq inited - enable hall's interrupt handler need after workqueue inited; - fix the stylus_pen probabilistic cause of the kernel panic at startup. - optimize the hall drivers's destruction process; Change-Id: I02f455465e089e7822dca7f663c12fe955ea7603 Signed-off-by: huangjq9 Reviewed-on: https://gerrit.mot.com/1449781 SLTApproved: Slta Waiver SME-Granted: SME Approvals Granted Tested-by: Jira Key Reviewed-by: Jun Weng Reviewed-by: Huosheng Liao Submit-Approved: Jira Key --- drivers/misc/pen/bu520xx_pen.c | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/drivers/misc/pen/bu520xx_pen.c b/drivers/misc/pen/bu520xx_pen.c index 284f6ff30a47..0c270915ad58 100644 --- a/drivers/misc/pen/bu520xx_pen.c +++ b/drivers/misc/pen/bu520xx_pen.c @@ -436,11 +436,6 @@ static int bu520xx_pen_probe(struct platform_device *pdev) gpio_request(hall_sensor_dev->gpio,"pen_detect_gpio"); gpio_direction_input(hall_sensor_dev->gpio); - //set irq - ret = set_irq_hall_sensor(); - if (ret < 0) - goto fail_for_irq_hall_sensor; - //create input_dev hall_sensor_dev->pen_indev = NULL; ret = pen_input_device_create(); @@ -460,14 +455,25 @@ static int bu520xx_pen_probe(struct platform_device *pdev) #else wakeup_source_init(&hall_sensor_dev->wake_lock, "pen_suspend_blocker"); #endif + //set irq + ret = set_irq_hall_sensor(); + if (ret < 0) + goto fail_for_irq_hall_sensor; pen_info("hall_sensor_init Done.\r\n"); return 0; -fail_for_create_input_dev: - free_irq(hall_sensor_dev->irq, hall_sensor_dev); - fail_for_irq_hall_sensor: + destroy_workqueue(hall_sensor_do_wq); + destroy_workqueue(hall_sensor_wq); + input_free_device(hall_sensor_dev->pen_indev); +#ifdef CONFIG_HAS_WAKELOCK + wake_lock_destroy(&hall_sensor_dev->wake_lock); +#else + wakeup_source_trash(&hall_sensor_dev->wake_lock); +#endif +fail_for_create_input_dev: + hall_sensor_dev->pen_indev=NULL; gpio_free(hall_sensor_dev->gpio); fail_for_set_gpio_hall_sensor: kfree(hall_sensor_dev);