Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

gpio: 104-idio-16: Use devm_request_region

By the time request_region is called in the ACCES 104-IDIO-16 GPIO
driver, a corresponding device structure has already been allocated. The
devm_request_region function should be used to help simplify the cleanup
code and reduce the possible points of failure.

Signed-off-by: William Breathitt Gray <vilhelm.gray@gmail.com>
Reviewed-by: Alexandre Courbot <acourbot@nvidia.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>

authored by

William Breathitt Gray and committed by
Linus Walleij
cb32389c 5cfc0576

+8 -17
+8 -17
drivers/gpio/gpio-104-idio-16.c
··· 38 38 * @lock: synchronization lock to prevent I/O race conditions 39 39 * @irq_mask: I/O bits affected by interrupts 40 40 * @base: base port address of the GPIO device 41 - * @extent: extent of port address region of the GPIO device 42 41 * @irq: Interrupt line number 43 42 * @out_state: output bits state 44 43 */ ··· 46 47 spinlock_t lock; 47 48 unsigned long irq_mask; 48 49 unsigned base; 49 - unsigned extent; 50 50 unsigned irq; 51 51 unsigned out_state; 52 52 }; ··· 199 201 if (!idio16gpio) 200 202 return -ENOMEM; 201 203 202 - if (!request_region(base, extent, name)) { 203 - dev_err(dev, "Unable to lock %s port addresses (0x%X-0x%X)\n", 204 - name, base, base + extent); 205 - err = -EBUSY; 206 - goto err_lock_io_port; 204 + if (!devm_request_region(dev, base, extent, name)) { 205 + dev_err(dev, "Unable to lock port addresses (0x%X-0x%X)\n", 206 + base, base + extent); 207 + return -EBUSY; 207 208 } 208 209 209 210 idio16gpio->chip.label = name; ··· 216 219 idio16gpio->chip.get = idio_16_gpio_get; 217 220 idio16gpio->chip.set = idio_16_gpio_set; 218 221 idio16gpio->base = base; 219 - idio16gpio->extent = extent; 220 222 idio16gpio->irq = irq; 221 223 idio16gpio->out_state = 0xFFFF; 222 224 ··· 226 230 err = gpiochip_add_data(&idio16gpio->chip, idio16gpio); 227 231 if (err) { 228 232 dev_err(dev, "GPIO registering failed (%d)\n", err); 229 - goto err_gpio_register; 233 + return err; 230 234 } 231 235 232 236 /* Disable IRQ by default */ ··· 237 241 handle_edge_irq, IRQ_TYPE_NONE); 238 242 if (err) { 239 243 dev_err(dev, "Could not add irqchip (%d)\n", err); 240 - goto err_gpiochip_irqchip_add; 244 + goto err_gpiochip_remove; 241 245 } 242 246 243 247 err = request_irq(irq, idio_16_irq_handler, 0, name, idio16gpio); 244 248 if (err) { 245 249 dev_err(dev, "IRQ handler registering failed (%d)\n", err); 246 - goto err_request_irq; 250 + goto err_gpiochip_remove; 247 251 } 248 252 249 253 return 0; 250 254 251 - err_request_irq: 252 - err_gpiochip_irqchip_add: 255 + err_gpiochip_remove: 253 256 gpiochip_remove(&idio16gpio->chip); 254 - err_gpio_register: 255 - release_region(base, extent); 256 - err_lock_io_port: 257 257 return err; 258 258 } 259 259 ··· 259 267 260 268 free_irq(idio16gpio->irq, idio16gpio); 261 269 gpiochip_remove(&idio16gpio->chip); 262 - release_region(idio16gpio->base, idio16gpio->extent); 263 270 264 271 return 0; 265 272 }