diff options
author | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2024-08-23 22:50:32 -0700 |
---|---|---|
committer | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2024-09-05 22:56:46 -0700 |
commit | 5c2002677e8f428d63369ea65ee008967147527e (patch) | |
tree | 6b741501f24460e3d701db4b8d91c6775b61b082 /drivers/input | |
parent | 9ba33f6145728c09c8e4578ffa8e94aef47b4e68 (diff) | |
download | linux-stable-5c2002677e8f428d63369ea65ee008967147527e.tar.gz linux-stable-5c2002677e8f428d63369ea65ee008967147527e.tar.bz2 linux-stable-5c2002677e8f428d63369ea65ee008967147527e.zip |
Input: zforce_ts - use guard notation when acquiring mutexes
Guard notation allows for simpler code and ensures that mutexes are
automatically released in all code paths.
Tested-by: Andreas Kemnade <andreas@kemnade.info> # Tolino Shine2HD
Link: https://lore.kernel.org/r/20240824055047.1706392-9-dmitry.torokhov@gmail.com
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Diffstat (limited to 'drivers/input')
-rw-r--r-- | drivers/input/touchscreen/zforce_ts.c | 45 |
1 files changed, 24 insertions, 21 deletions
diff --git a/drivers/input/touchscreen/zforce_ts.c b/drivers/input/touchscreen/zforce_ts.c index 004ef728fb90..0dea389594bd 100644 --- a/drivers/input/touchscreen/zforce_ts.c +++ b/drivers/input/touchscreen/zforce_ts.c @@ -578,17 +578,13 @@ static void zforce_input_close(struct input_dev *dev) return; } -static int zforce_suspend(struct device *dev) +static int __zforce_suspend(struct zforce_ts *ts) { - struct i2c_client *client = to_i2c_client(dev); - struct zforce_ts *ts = i2c_get_clientdata(client); + struct i2c_client *client = ts->client; struct input_dev *input = ts->input; - int ret = 0; - - mutex_lock(&input->mutex); + int ret; - WRITE_ONCE(ts->suspending, true); - smp_mb(); + guard(mutex)(&input->mutex); /* * When configured as a wakeup source device should always wake @@ -601,7 +597,7 @@ static int zforce_suspend(struct device *dev) if (!input_device_enabled(input)) { ret = zforce_start(ts); if (ret) - goto unlock; + return ret; } enable_irq_wake(client->irq); @@ -611,18 +607,28 @@ static int zforce_suspend(struct device *dev) ret = zforce_stop(ts); if (ret) - goto unlock; + return ret; disable_irq(client->irq); } ts->suspended = true; + return 0; +} -unlock: +static int zforce_suspend(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct zforce_ts *ts = i2c_get_clientdata(client); + int ret; + + WRITE_ONCE(ts->suspending, true); smp_mb(); - WRITE_ONCE(ts->suspending, false); - mutex_unlock(&input->mutex); + ret = __zforce_suspend(ts); + + smp_mb(); + WRITE_ONCE(ts->suspending, false); return ret; } @@ -632,9 +638,9 @@ static int zforce_resume(struct device *dev) struct i2c_client *client = to_i2c_client(dev); struct zforce_ts *ts = i2c_get_clientdata(client); struct input_dev *input = ts->input; - int ret = 0; + int ret; - mutex_lock(&input->mutex); + guard(mutex)(&input->mutex); ts->suspended = false; @@ -647,7 +653,7 @@ static int zforce_resume(struct device *dev) if (!input_device_enabled(input)) { ret = zforce_stop(ts); if (ret) - goto unlock; + return ret; } } else if (input_device_enabled(input)) { dev_dbg(&client->dev, "resume without being a wakeup source\n"); @@ -656,13 +662,10 @@ static int zforce_resume(struct device *dev) ret = zforce_start(ts); if (ret < 0) - goto unlock; + return ret; } -unlock: - mutex_unlock(&input->mutex); - - return ret; + return 0; } static DEFINE_SIMPLE_DEV_PM_OPS(zforce_pm_ops, zforce_suspend, zforce_resume); |