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
110111static 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
146141static 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
184174static 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
243227static 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