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

uio: uio_fsl_elbc_gpcm: use device-managed allocators

This change moves all the simple allocations to use device-managed
allocator functions. This way their life-time is tied to the
platform_device object, so when this gets free'd these allocations also get
cleaned up.
The final effect is that error & exit paths get cleaned up a bit.

Signed-off-by: Alexandru Ardelean <alexandru.ardelean@analog.com>
Link: https://lore.kernel.org/r/20201119154903.82099-3-alexandru.ardelean@analog.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

authored by

Alexandru Ardelean and committed by
Greg Kroah-Hartman
d57801c4 16d546c4

+9 -23
+9 -23
drivers/uio/uio_fsl_elbc_gpcm.c
··· 299 299 /* get optional uio name */ 300 300 if (of_property_read_string(node, "uio_name", &dt_name) != 0) 301 301 dt_name = "eLBC_GPCM"; 302 - *name = kstrdup(dt_name, GFP_KERNEL); 302 + *name = devm_kstrdup(priv->dev, dt_name, GFP_KERNEL); 303 303 if (!*name) 304 304 return -ENOMEM; 305 305 ··· 324 324 return -ENODEV; 325 325 326 326 /* allocate private data */ 327 - priv = kzalloc(sizeof(*priv), GFP_KERNEL); 327 + priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); 328 328 if (!priv) 329 329 return -ENOMEM; 330 330 priv->dev = &pdev->dev; ··· 334 334 ret = get_of_data(priv, node, &res, &reg_br_new, &reg_or_new, 335 335 &irq, &uio_name); 336 336 if (ret) 337 - goto out_err0; 337 + return ret; 338 338 339 339 /* allocate UIO structure */ 340 - info = kzalloc(sizeof(*info), GFP_KERNEL); 341 - if (!info) { 342 - ret = -ENOMEM; 343 - goto out_err0; 344 - } 340 + info = devm_kzalloc(&pdev->dev, sizeof(*info), GFP_KERNEL); 341 + if (!info) 342 + return -ENOMEM; 345 343 346 344 /* get current BR/OR values */ 347 345 reg_br_cur = in_be32(&priv->lbc->bank[priv->bank].br); ··· 352 354 != fsl_lbc_addr(res.start)) { 353 355 dev_err(priv->dev, 354 356 "bank in use by another peripheral\n"); 355 - ret = -ENODEV; 356 - goto out_err1; 357 + return -ENODEV; 357 358 } 358 359 359 360 /* warn if behavior settings changing */ ··· 379 382 info->mem[0].internal_addr = ioremap(res.start, resource_size(&res)); 380 383 if (!info->mem[0].internal_addr) { 381 384 dev_err(priv->dev, "failed to map chip region\n"); 382 - ret = -ENODEV; 383 - goto out_err1; 385 + return -ENODEV; 384 386 } 385 387 386 388 /* set all UIO data */ 387 - info->mem[0].name = kasprintf(GFP_KERNEL, "%pOFn", node); 389 + info->mem[0].name = devm_kasprintf(&pdev->dev, GFP_KERNEL, "%pOFn", node); 388 390 info->mem[0].addr = res.start; 389 391 info->mem[0].size = resource_size(&res); 390 392 info->mem[0].memtype = UIO_MEM_PHYS; ··· 424 428 if (priv->shutdown) 425 429 priv->shutdown(info, true); 426 430 iounmap(info->mem[0].internal_addr); 427 - out_err1: 428 - kfree(info->mem[0].name); 429 - kfree(info); 430 - out_err0: 431 - kfree(uio_name); 432 - kfree(priv); 433 431 return ret; 434 432 } 435 433 ··· 437 447 if (priv->shutdown) 438 448 priv->shutdown(info, false); 439 449 iounmap(info->mem[0].internal_addr); 440 - kfree(info->mem[0].name); 441 - kfree(info->name); 442 - kfree(info); 443 - kfree(priv); 444 450 445 451 return 0; 446 452