Skip to content

Commit c7fe19e

Browse files
author
Bartosz Golaszewski
committed
gpio: adnp: use lock guards for the I2C lock
Reduce the code complexity by using automatic lock guards with the I2C mutex. Link: https://lore.kernel.org/r/20250306-gpiochip-set-conversion-v2-1-a76e72e21425@linaro.org Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
1 parent 4605601 commit c7fe19e

1 file changed

Lines changed: 48 additions & 72 deletions

File tree

drivers/gpio/gpio-adnp.c

Lines changed: 48 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
* Copyright (C) 2011-2012 Avionic Design GmbH
44
*/
55

6+
#include <linux/cleanup.h>
67
#include <linux/gpio/driver.h>
78
#include <linux/i2c.h>
89
#include <linux/interrupt.h>
@@ -102,9 +103,9 @@ static void adnp_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
102103
{
103104
struct adnp *adnp = gpiochip_get_data(chip);
104105

105-
mutex_lock(&adnp->i2c_lock);
106+
guard(mutex)(&adnp->i2c_lock);
107+
106108
__adnp_gpio_set(adnp, offset, value);
107-
mutex_unlock(&adnp->i2c_lock);
108109
}
109110

110111
static int adnp_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
@@ -115,32 +116,26 @@ static int adnp_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
115116
u8 value;
116117
int err;
117118

118-
mutex_lock(&adnp->i2c_lock);
119+
guard(mutex)(&adnp->i2c_lock);
119120

120121
err = adnp_read(adnp, GPIO_DDR(adnp) + reg, &value);
121122
if (err < 0)
122-
goto out;
123+
return err;
123124

124125
value &= ~BIT(pos);
125126

126127
err = adnp_write(adnp, GPIO_DDR(adnp) + reg, value);
127128
if (err < 0)
128-
goto out;
129+
return err;
129130

130131
err = adnp_read(adnp, GPIO_DDR(adnp) + reg, &value);
131132
if (err < 0)
132-
goto out;
133-
134-
if (value & BIT(pos)) {
135-
err = -EPERM;
136-
goto out;
137-
}
133+
return err;
138134

139-
err = 0;
135+
if (value & BIT(pos))
136+
return -EPERM;
140137

141-
out:
142-
mutex_unlock(&adnp->i2c_lock);
143-
return err;
138+
return 0;
144139
}
145140

146141
static int adnp_gpio_direction_output(struct gpio_chip *chip, unsigned offset,
@@ -152,33 +147,28 @@ static int adnp_gpio_direction_output(struct gpio_chip *chip, unsigned offset,
152147
int err;
153148
u8 val;
154149

155-
mutex_lock(&adnp->i2c_lock);
150+
guard(mutex)(&adnp->i2c_lock);
156151

157152
err = adnp_read(adnp, GPIO_DDR(adnp) + reg, &val);
158153
if (err < 0)
159-
goto out;
154+
return err;
160155

161156
val |= BIT(pos);
162157

163158
err = adnp_write(adnp, GPIO_DDR(adnp) + reg, val);
164159
if (err < 0)
165-
goto out;
160+
return err;
166161

167162
err = adnp_read(adnp, GPIO_DDR(adnp) + reg, &val);
168163
if (err < 0)
169-
goto out;
164+
return err;
170165

171-
if (!(val & BIT(pos))) {
172-
err = -EPERM;
173-
goto out;
174-
}
166+
if (!(val & BIT(pos)))
167+
return -EPERM;
175168

176169
__adnp_gpio_set(adnp, offset, value);
177-
err = 0;
178170

179-
out:
180-
mutex_unlock(&adnp->i2c_lock);
181-
return err;
171+
return 0;
182172
}
183173

184174
static void adnp_gpio_dbg_show(struct seq_file *s, struct gpio_chip *chip)
@@ -188,27 +178,26 @@ static void adnp_gpio_dbg_show(struct seq_file *s, struct gpio_chip *chip)
188178
int err;
189179

190180
for (i = 0; i < num_regs; i++) {
191-
u8 ddr, plr, ier, isr;
192-
193-
mutex_lock(&adnp->i2c_lock);
181+
u8 ddr = 0, plr = 0, ier = 0, isr = 0;
194182

195-
err = adnp_read(adnp, GPIO_DDR(adnp) + i, &ddr);
196-
if (err < 0)
197-
goto unlock;
183+
scoped_guard(mutex, &adnp->i2c_lock) {
184+
err = adnp_read(adnp, GPIO_DDR(adnp) + i, &ddr);
185+
if (err < 0)
186+
return;
198187

199-
err = adnp_read(adnp, GPIO_PLR(adnp) + i, &plr);
200-
if (err < 0)
201-
goto unlock;
188+
err = adnp_read(adnp, GPIO_PLR(adnp) + i, &plr);
189+
if (err < 0)
190+
return;
202191

203-
err = adnp_read(adnp, GPIO_IER(adnp) + i, &ier);
204-
if (err < 0)
205-
goto unlock;
192+
err = adnp_read(adnp, GPIO_IER(adnp) + i, &ier);
193+
if (err < 0)
194+
return;
206195

207-
err = adnp_read(adnp, GPIO_ISR(adnp) + i, &isr);
208-
if (err < 0)
209-
goto unlock;
196+
err = adnp_read(adnp, GPIO_ISR(adnp) + i, &isr);
197+
if (err < 0)
198+
return;
210199

211-
mutex_unlock(&adnp->i2c_lock);
200+
}
212201

213202
for (j = 0; j < 8; j++) {
214203
unsigned int bit = (i << adnp->reg_shift) + j;
@@ -233,11 +222,6 @@ static void adnp_gpio_dbg_show(struct seq_file *s, struct gpio_chip *chip)
233222
direction, level, interrupt, pending);
234223
}
235224
}
236-
237-
return;
238-
239-
unlock:
240-
mutex_unlock(&adnp->i2c_lock);
241225
}
242226

243227
static irqreturn_t adnp_irq(int irq, void *data)
@@ -249,32 +233,24 @@ static irqreturn_t adnp_irq(int irq, void *data)
249233

250234
for (i = 0; i < num_regs; i++) {
251235
unsigned int base = i << adnp->reg_shift, bit;
252-
u8 changed, level, isr, ier;
236+
u8 changed, level = 0, isr = 0, ier = 0;
253237
unsigned long pending;
254238
int err;
255239

256-
mutex_lock(&adnp->i2c_lock);
240+
scoped_guard(mutex, &adnp->i2c_lock) {
241+
err = adnp_read(adnp, GPIO_PLR(adnp) + i, &level);
242+
if (err < 0)
243+
continue;
257244

258-
err = adnp_read(adnp, GPIO_PLR(adnp) + i, &level);
259-
if (err < 0) {
260-
mutex_unlock(&adnp->i2c_lock);
261-
continue;
262-
}
263-
264-
err = adnp_read(adnp, GPIO_ISR(adnp) + i, &isr);
265-
if (err < 0) {
266-
mutex_unlock(&adnp->i2c_lock);
267-
continue;
268-
}
245+
err = adnp_read(adnp, GPIO_ISR(adnp) + i, &isr);
246+
if (err < 0)
247+
continue;
269248

270-
err = adnp_read(adnp, GPIO_IER(adnp) + i, &ier);
271-
if (err < 0) {
272-
mutex_unlock(&adnp->i2c_lock);
273-
continue;
249+
err = adnp_read(adnp, GPIO_IER(adnp) + i, &ier);
250+
if (err < 0)
251+
continue;
274252
}
275253

276-
mutex_unlock(&adnp->i2c_lock);
277-
278254
/* determine pins that changed levels */
279255
changed = level ^ adnp->irq_level[i];
280256

@@ -366,12 +342,12 @@ static void adnp_irq_bus_unlock(struct irq_data *d)
366342
struct adnp *adnp = gpiochip_get_data(gc);
367343
unsigned int num_regs = 1 << adnp->reg_shift, i;
368344

369-
mutex_lock(&adnp->i2c_lock);
370-
371-
for (i = 0; i < num_regs; i++)
372-
adnp_write(adnp, GPIO_IER(adnp) + i, adnp->irq_enable[i]);
345+
scoped_guard(mutex, &adnp->i2c_lock) {
346+
for (i = 0; i < num_regs; i++)
347+
adnp_write(adnp, GPIO_IER(adnp) + i,
348+
adnp->irq_enable[i]);
349+
}
373350

374-
mutex_unlock(&adnp->i2c_lock);
375351
mutex_unlock(&adnp->irq_lock);
376352
}
377353

0 commit comments

Comments
 (0)