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

gpio: sch311x: Use devm_gpiochip_add_data() to simplify remove path

Use devm version of gpiochip_add() function to handle removal for us.

Signed-off-by: Andrew Davis <afd@ti.com>
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>

authored by

Andrew Davis and committed by
Bartosz Golaszewski
4cf381bf 81b01099

+2 -24
+2 -24
drivers/gpio/gpio-sch311x.c
··· 281 281 if (!priv) 282 282 return -ENOMEM; 283 283 284 - platform_set_drvdata(pdev, priv); 285 - 286 284 for (i = 0; i < ARRAY_SIZE(priv->blocks); i++) { 287 285 block = &priv->blocks[i]; 288 286 ··· 303 305 block->data_reg = sch311x_gpio_blocks[i].data_reg; 304 306 block->runtime_reg = pdata->runtime_reg; 305 307 306 - err = gpiochip_add_data(&block->chip, block); 308 + err = devm_gpiochip_add_data(&pdev->dev, &block->chip, block); 307 309 if (err < 0) { 308 310 dev_err(&pdev->dev, 309 311 "Could not register gpiochip, %d\n", err); 310 - goto exit_err; 312 + return err; 311 313 } 312 314 dev_info(&pdev->dev, 313 315 "SMSC SCH311x GPIO block %d registered.\n", i); 314 316 } 315 317 316 318 return 0; 317 - 318 - exit_err: 319 - /* release already registered chips */ 320 - for (--i; i >= 0; i--) 321 - gpiochip_remove(&priv->blocks[i].chip); 322 - return err; 323 - } 324 - 325 - static int sch311x_gpio_remove(struct platform_device *pdev) 326 - { 327 - struct sch311x_gpio_priv *priv = platform_get_drvdata(pdev); 328 - int i; 329 - 330 - for (i = 0; i < ARRAY_SIZE(priv->blocks); i++) { 331 - gpiochip_remove(&priv->blocks[i].chip); 332 - dev_info(&pdev->dev, 333 - "SMSC SCH311x GPIO block %d unregistered.\n", i); 334 - } 335 - return 0; 336 319 } 337 320 338 321 static struct platform_driver sch311x_gpio_driver = { 339 322 .driver.name = DRV_NAME, 340 323 .probe = sch311x_gpio_probe, 341 - .remove = sch311x_gpio_remove, 342 324 }; 343 325 344 326