input/tps6507x-ts: a couple work queue cleanups
Subsystems (3)
PATCH 1/1 input/tps6507x-ts: a couple work queue cleanups
1) Use msecs_to_jiffies() instead of calculating by hand.
2) Call cancel_delayed_work_sync() instead of cancel_delayed_work() followed by a separate flush_workqueue().
3) Remove the "tsc->wq = 0;" Sparse complains about that because tsc->wq is a pointer, not an int. It's not needed because we just free the pointer anyway.
drivers/input/touchscreen/tps6507x-ts.c +4 -8
@@ -221,7 +221,7 @@ done:if (poll) { schd =queue_delayed_work (tsc->wq, &tsc->work, - tsc->poll_period *HZ /1000 ); +msecs_to_jiffies (tsc->poll_period));if (schd) tsc->polling =1 ;else {
@@ -326,7 +326,7 @@ static int tps6507x_ts_probe(struct platform_device *pdev) goto err2; schd =queue_delayed_work (tsc->wq, &tsc->work, - tsc->poll_period *HZ /1000 ); +msecs_to_jiffies (tsc->poll_period));if (schd) tsc->polling =1 ;
@@ -339,10 +339,8 @@ static int tps6507x_ts_probe(struct platform_device *pdev)return 0 ; err2: -cancel_delayed_work (&tsc->work); -flush_workqueue (tsc->wq); +cancel_delayed_work_sync (&tsc->work);destroy_workqueue (tsc->wq); - tsc->wq =0 ;input_free_device (input_dev); err1:kfree (tsc);
@@ -360,10 +358,8 @@ static int __devexit tps6507x_ts_remove(struct platform_device *pdev)if (!tsc)return 0 ; -cancel_delayed_work (&tsc->work); -flush_workqueue (tsc->wq); +cancel_delayed_work_sync (&tsc->work);destroy_workqueue (tsc->wq); - tsc->wq =0 ;input_free_device (input_dev);
Hi Dan,
Quoted 9 lines · Dan Carpenter
1) Use
msecs_to_jiffies()instead of calculating by hand.
2) Callcancel_delayed_work_sync()instead ofcancel_delayed_work()followed by a separateflush_workqueue().
3) Remove the "tsc->wq= 0;" Sparse complains about that becausetsc->wqis a pointer, not an int. It's not needed because we just free the pointer anyway.Signed-off-by Dan Carpenter <[email protected]>
Applied the patch, thank you, but more cleanups needed.
drivers/input/touchscreen/tps6507x-ts.c done: · line 225
Quoted 11 lines
drivers/input/touchscreen/tps6507x-ts.c +1
-1@@ -221,7 +221,7 @@ done:if (poll) { schd =queue_delayed_work (tsc->wq, &tsc->work, - tsc->poll_period *HZ /1000 ); +msecs_to_jiffies (tsc->poll_period));if (schd)
I think the driver author misunderstood the return values of queue_delayed_work().
Quoted 24 lines
drivers/input/touchscreen/tps6507x-ts.c +2
-4tsc->polling =1 ; else {@@ -326,7 +326,7 @@ static int tps6507x_ts_probe(struct platform_device *pdev) goto err2; schd =queue_delayed_work (tsc->wq, &tsc->work, - tsc->poll_period *HZ /1000 ); +msecs_to_jiffies (tsc->poll_period));if (schd) tsc->polling =1 ;@@ -339,10 +339,8 @@ static int tps6507x_ts_probe(struct platform_device *pdev)return 0 ; err2: -cancel_delayed_work (&tsc->work); -flush_workqueue (tsc->wq); +cancel_delayed_work_sync (&tsc->work);destroy_workqueue (tsc->wq); - tsc->wq =0 ;input_free_device (input_dev); err1:kfree (tsc);
drivers/input/touchscreen/tps6507x-ts.c static int __devexit tps6507x_ts_remove(struct platform_device *pdev) · line 364
Quoted 10 lines
drivers/input/touchscreen/tps6507x-ts.c +1
-3@@ -360,10 +358,8 @@ static int __devexit tps6507x_ts_remove(struct platform_device *pdev)if (!tsc)return 0 ; -cancel_delayed_work (&tsc->work); -flush_workqueue (tsc->wq); +cancel_delayed_work_sync (&tsc->work);destroy_workqueue (tsc->wq); - tsc->wq =0 ;input_free_device (input_dev);
This should be input_unregister_device().
I also question the production utility of a driver that continuously poll device every 30 ms... I think that it was merged prematurely, without adequate review ;(
Signature · 1 line
Dmitry