Commit 42eb317f7d089f878a06aa358d1f168eac3e5afd
Committed by
Florian Tobias Schandinat
1 parent
fb18155925
Exists in
smarc-l5.0.0_1.0.0-ga
and in
5 other branches
grvga: Fix error handling issues
This patch fixes two problems with the error handling in the grvga_probe function and simplifies it making the code easier to read. - If the call to grvga_parse_custom on line 370 fails we use the wrong label so that release_mem_region will be called without a call to request_mem_region being made. - If the call to ioremap on line 436 fails we should not try to call iounmap in the error handling code. This patch introduces the following changes: - Converts request_mem_region into its devm_ equivalent which simplifies the otherwise messy clean up code. - Changes the labels for correct error handling and their names to make the code easier to read. Signed-off-by: Emil Goode <emilgoode@gmail.com> Signed-off-by: Florian Tobias Schandinat <FlorianSchandinat@gmx.de>
Showing 1 changed file with 22 additions and 25 deletions Side-by-side Diff
drivers/video/grvga.c
... | ... | @@ -354,7 +354,7 @@ |
354 | 354 | */ |
355 | 355 | if (fb_get_options("grvga", &options)) { |
356 | 356 | retval = -ENODEV; |
357 | - goto err; | |
357 | + goto free_fb; | |
358 | 358 | } |
359 | 359 | |
360 | 360 | if (!options || !*options) |
... | ... | @@ -370,7 +370,7 @@ |
370 | 370 | if (grvga_parse_custom(this_opt, &info->var) < 0) { |
371 | 371 | dev_err(&dev->dev, "Failed to parse custom mode (%s).\n", this_opt); |
372 | 372 | retval = -EINVAL; |
373 | - goto err1; | |
373 | + goto free_fb; | |
374 | 374 | } |
375 | 375 | } else if (!strncmp(this_opt, "addr", 4)) |
376 | 376 | grvga_fix_addr = simple_strtoul(this_opt + 5, NULL, 16); |
377 | 377 | |
... | ... | @@ -387,10 +387,11 @@ |
387 | 387 | info->flags = FBINFO_DEFAULT | FBINFO_PARTIAL_PAN_OK | FBINFO_HWACCEL_YPAN; |
388 | 388 | info->fix.smem_len = grvga_mem_size; |
389 | 389 | |
390 | - if (!request_mem_region(dev->resource[0].start, resource_size(&dev->resource[0]), "grlib-svgactrl regs")) { | |
390 | + if (!devm_request_mem_region(&dev->dev, dev->resource[0].start, | |
391 | + resource_size(&dev->resource[0]), "grlib-svgactrl regs")) { | |
391 | 392 | dev_err(&dev->dev, "registers already mapped\n"); |
392 | 393 | retval = -EBUSY; |
393 | - goto err; | |
394 | + goto free_fb; | |
394 | 395 | } |
395 | 396 | |
396 | 397 | par->regs = of_ioremap(&dev->resource[0], 0, |
397 | 398 | |
... | ... | @@ -400,14 +401,14 @@ |
400 | 401 | if (!par->regs) { |
401 | 402 | dev_err(&dev->dev, "failed to map registers\n"); |
402 | 403 | retval = -ENOMEM; |
403 | - goto err1; | |
404 | + goto free_fb; | |
404 | 405 | } |
405 | 406 | |
406 | 407 | retval = fb_alloc_cmap(&info->cmap, 256, 0); |
407 | 408 | if (retval < 0) { |
408 | 409 | dev_err(&dev->dev, "failed to allocate mem with fb_alloc_cmap\n"); |
409 | 410 | retval = -ENOMEM; |
410 | - goto err2; | |
411 | + goto unmap_regs; | |
411 | 412 | } |
412 | 413 | |
413 | 414 | if (mode_opt) { |
... | ... | @@ -415,7 +416,7 @@ |
415 | 416 | grvga_modedb, sizeof(grvga_modedb), &grvga_modedb[0], 8); |
416 | 417 | if (!retval || retval == 4) { |
417 | 418 | retval = -EINVAL; |
418 | - goto err3; | |
419 | + goto dealloc_cmap; | |
419 | 420 | } |
420 | 421 | } |
421 | 422 | |
422 | 423 | |
... | ... | @@ -427,10 +428,11 @@ |
427 | 428 | |
428 | 429 | physical_start = grvga_fix_addr; |
429 | 430 | |
430 | - if (!request_mem_region(physical_start, grvga_mem_size, dev->name)) { | |
431 | + if (!devm_request_mem_region(&dev->dev, physical_start, | |
432 | + grvga_mem_size, dev->name)) { | |
431 | 433 | dev_err(&dev->dev, "failed to request memory region\n"); |
432 | 434 | retval = -ENOMEM; |
433 | - goto err3; | |
435 | + goto dealloc_cmap; | |
434 | 436 | } |
435 | 437 | |
436 | 438 | virtual_start = (unsigned long) ioremap(physical_start, grvga_mem_size); |
... | ... | @@ -438,7 +440,7 @@ |
438 | 440 | if (!virtual_start) { |
439 | 441 | dev_err(&dev->dev, "error mapping framebuffer memory\n"); |
440 | 442 | retval = -ENOMEM; |
441 | - goto err4; | |
443 | + goto dealloc_cmap; | |
442 | 444 | } |
443 | 445 | } else { /* Allocate frambuffer memory */ |
444 | 446 | |
... | ... | @@ -451,7 +453,7 @@ |
451 | 453 | "unable to allocate framebuffer memory (%lu bytes)\n", |
452 | 454 | grvga_mem_size); |
453 | 455 | retval = -ENOMEM; |
454 | - goto err3; | |
456 | + goto dealloc_cmap; | |
455 | 457 | } |
456 | 458 | |
457 | 459 | physical_start = dma_map_single(&dev->dev, (void *)virtual_start, grvga_mem_size, DMA_TO_DEVICE); |
... | ... | @@ -484,7 +486,7 @@ |
484 | 486 | retval = register_framebuffer(info); |
485 | 487 | if (retval < 0) { |
486 | 488 | dev_err(&dev->dev, "failed to register framebuffer\n"); |
487 | - goto err4; | |
489 | + goto free_mem; | |
488 | 490 | } |
489 | 491 | |
490 | 492 | __raw_writel(physical_start, &par->regs->fb_pos); |
491 | 493 | |
492 | 494 | |
493 | 495 | |
494 | 496 | |
495 | 497 | |
... | ... | @@ -493,21 +495,18 @@ |
493 | 495 | |
494 | 496 | return 0; |
495 | 497 | |
496 | -err4: | |
498 | +free_mem: | |
497 | 499 | dev_set_drvdata(&dev->dev, NULL); |
498 | - if (grvga_fix_addr) { | |
499 | - release_mem_region(physical_start, grvga_mem_size); | |
500 | + if (grvga_fix_addr) | |
500 | 501 | iounmap((void *)virtual_start); |
501 | - } else | |
502 | + else | |
502 | 503 | kfree((void *)virtual_start); |
503 | -err3: | |
504 | +dealloc_cmap: | |
504 | 505 | fb_dealloc_cmap(&info->cmap); |
505 | -err2: | |
506 | +unmap_regs: | |
506 | 507 | of_iounmap(&dev->resource[0], par->regs, |
507 | 508 | resource_size(&dev->resource[0])); |
508 | -err1: | |
509 | - release_mem_region(dev->resource[0].start, resource_size(&dev->resource[0])); | |
510 | -err: | |
509 | +free_fb: | |
511 | 510 | framebuffer_release(info); |
512 | 511 | |
513 | 512 | return retval; |
514 | 513 | |
515 | 514 | |
... | ... | @@ -524,12 +523,10 @@ |
524 | 523 | |
525 | 524 | of_iounmap(&device->resource[0], par->regs, |
526 | 525 | resource_size(&device->resource[0])); |
527 | - release_mem_region(device->resource[0].start, resource_size(&device->resource[0])); | |
528 | 526 | |
529 | - if (!par->fb_alloced) { | |
530 | - release_mem_region(info->fix.smem_start, info->fix.smem_len); | |
527 | + if (!par->fb_alloced) | |
531 | 528 | iounmap(info->screen_base); |
532 | - } else | |
529 | + else | |
533 | 530 | kfree((void *)info->screen_base); |
534 | 531 | |
535 | 532 | framebuffer_release(info); |