diff options
Diffstat (limited to 'drivers/video/grvga.c')
-rw-r--r-- | drivers/video/grvga.c | 47 |
1 files changed, 22 insertions, 25 deletions
diff --git a/drivers/video/grvga.c b/drivers/video/grvga.c index da066c210923..5245f9a71892 100644 --- a/drivers/video/grvga.c +++ b/drivers/video/grvga.c | |||
@@ -354,7 +354,7 @@ static int __devinit grvga_probe(struct platform_device *dev) | |||
354 | */ | 354 | */ |
355 | if (fb_get_options("grvga", &options)) { | 355 | if (fb_get_options("grvga", &options)) { |
356 | retval = -ENODEV; | 356 | retval = -ENODEV; |
357 | goto err; | 357 | goto free_fb; |
358 | } | 358 | } |
359 | 359 | ||
360 | if (!options || !*options) | 360 | if (!options || !*options) |
@@ -370,7 +370,7 @@ static int __devinit grvga_probe(struct platform_device *dev) | |||
370 | if (grvga_parse_custom(this_opt, &info->var) < 0) { | 370 | if (grvga_parse_custom(this_opt, &info->var) < 0) { |
371 | dev_err(&dev->dev, "Failed to parse custom mode (%s).\n", this_opt); | 371 | dev_err(&dev->dev, "Failed to parse custom mode (%s).\n", this_opt); |
372 | retval = -EINVAL; | 372 | retval = -EINVAL; |
373 | goto err1; | 373 | goto free_fb; |
374 | } | 374 | } |
375 | } else if (!strncmp(this_opt, "addr", 4)) | 375 | } else if (!strncmp(this_opt, "addr", 4)) |
376 | grvga_fix_addr = simple_strtoul(this_opt + 5, NULL, 16); | 376 | grvga_fix_addr = simple_strtoul(this_opt + 5, NULL, 16); |
@@ -387,10 +387,11 @@ static int __devinit grvga_probe(struct platform_device *dev) | |||
387 | info->flags = FBINFO_DEFAULT | FBINFO_PARTIAL_PAN_OK | FBINFO_HWACCEL_YPAN; | 387 | info->flags = FBINFO_DEFAULT | FBINFO_PARTIAL_PAN_OK | FBINFO_HWACCEL_YPAN; |
388 | info->fix.smem_len = grvga_mem_size; | 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 | dev_err(&dev->dev, "registers already mapped\n"); | 392 | dev_err(&dev->dev, "registers already mapped\n"); |
392 | retval = -EBUSY; | 393 | retval = -EBUSY; |
393 | goto err; | 394 | goto free_fb; |
394 | } | 395 | } |
395 | 396 | ||
396 | par->regs = of_ioremap(&dev->resource[0], 0, | 397 | par->regs = of_ioremap(&dev->resource[0], 0, |
@@ -400,14 +401,14 @@ static int __devinit grvga_probe(struct platform_device *dev) | |||
400 | if (!par->regs) { | 401 | if (!par->regs) { |
401 | dev_err(&dev->dev, "failed to map registers\n"); | 402 | dev_err(&dev->dev, "failed to map registers\n"); |
402 | retval = -ENOMEM; | 403 | retval = -ENOMEM; |
403 | goto err1; | 404 | goto free_fb; |
404 | } | 405 | } |
405 | 406 | ||
406 | retval = fb_alloc_cmap(&info->cmap, 256, 0); | 407 | retval = fb_alloc_cmap(&info->cmap, 256, 0); |
407 | if (retval < 0) { | 408 | if (retval < 0) { |
408 | dev_err(&dev->dev, "failed to allocate mem with fb_alloc_cmap\n"); | 409 | dev_err(&dev->dev, "failed to allocate mem with fb_alloc_cmap\n"); |
409 | retval = -ENOMEM; | 410 | retval = -ENOMEM; |
410 | goto err2; | 411 | goto unmap_regs; |
411 | } | 412 | } |
412 | 413 | ||
413 | if (mode_opt) { | 414 | if (mode_opt) { |
@@ -415,7 +416,7 @@ static int __devinit grvga_probe(struct platform_device *dev) | |||
415 | grvga_modedb, sizeof(grvga_modedb), &grvga_modedb[0], 8); | 416 | grvga_modedb, sizeof(grvga_modedb), &grvga_modedb[0], 8); |
416 | if (!retval || retval == 4) { | 417 | if (!retval || retval == 4) { |
417 | retval = -EINVAL; | 418 | retval = -EINVAL; |
418 | goto err3; | 419 | goto dealloc_cmap; |
419 | } | 420 | } |
420 | } | 421 | } |
421 | 422 | ||
@@ -427,10 +428,11 @@ static int __devinit grvga_probe(struct platform_device *dev) | |||
427 | 428 | ||
428 | physical_start = grvga_fix_addr; | 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 | dev_err(&dev->dev, "failed to request memory region\n"); | 433 | dev_err(&dev->dev, "failed to request memory region\n"); |
432 | retval = -ENOMEM; | 434 | retval = -ENOMEM; |
433 | goto err3; | 435 | goto dealloc_cmap; |
434 | } | 436 | } |
435 | 437 | ||
436 | virtual_start = (unsigned long) ioremap(physical_start, grvga_mem_size); | 438 | virtual_start = (unsigned long) ioremap(physical_start, grvga_mem_size); |
@@ -438,7 +440,7 @@ static int __devinit grvga_probe(struct platform_device *dev) | |||
438 | if (!virtual_start) { | 440 | if (!virtual_start) { |
439 | dev_err(&dev->dev, "error mapping framebuffer memory\n"); | 441 | dev_err(&dev->dev, "error mapping framebuffer memory\n"); |
440 | retval = -ENOMEM; | 442 | retval = -ENOMEM; |
441 | goto err4; | 443 | goto dealloc_cmap; |
442 | } | 444 | } |
443 | } else { /* Allocate frambuffer memory */ | 445 | } else { /* Allocate frambuffer memory */ |
444 | 446 | ||
@@ -451,7 +453,7 @@ static int __devinit grvga_probe(struct platform_device *dev) | |||
451 | "unable to allocate framebuffer memory (%lu bytes)\n", | 453 | "unable to allocate framebuffer memory (%lu bytes)\n", |
452 | grvga_mem_size); | 454 | grvga_mem_size); |
453 | retval = -ENOMEM; | 455 | retval = -ENOMEM; |
454 | goto err3; | 456 | goto dealloc_cmap; |
455 | } | 457 | } |
456 | 458 | ||
457 | physical_start = dma_map_single(&dev->dev, (void *)virtual_start, grvga_mem_size, DMA_TO_DEVICE); | 459 | physical_start = dma_map_single(&dev->dev, (void *)virtual_start, grvga_mem_size, DMA_TO_DEVICE); |
@@ -484,7 +486,7 @@ static int __devinit grvga_probe(struct platform_device *dev) | |||
484 | retval = register_framebuffer(info); | 486 | retval = register_framebuffer(info); |
485 | if (retval < 0) { | 487 | if (retval < 0) { |
486 | dev_err(&dev->dev, "failed to register framebuffer\n"); | 488 | dev_err(&dev->dev, "failed to register framebuffer\n"); |
487 | goto err4; | 489 | goto free_mem; |
488 | } | 490 | } |
489 | 491 | ||
490 | __raw_writel(physical_start, &par->regs->fb_pos); | 492 | __raw_writel(physical_start, &par->regs->fb_pos); |
@@ -493,21 +495,18 @@ static int __devinit grvga_probe(struct platform_device *dev) | |||
493 | 495 | ||
494 | return 0; | 496 | return 0; |
495 | 497 | ||
496 | err4: | 498 | free_mem: |
497 | dev_set_drvdata(&dev->dev, NULL); | 499 | dev_set_drvdata(&dev->dev, NULL); |
498 | if (grvga_fix_addr) { | 500 | if (grvga_fix_addr) |
499 | release_mem_region(physical_start, grvga_mem_size); | ||
500 | iounmap((void *)virtual_start); | 501 | iounmap((void *)virtual_start); |
501 | } else | 502 | else |
502 | kfree((void *)virtual_start); | 503 | kfree((void *)virtual_start); |
503 | err3: | 504 | dealloc_cmap: |
504 | fb_dealloc_cmap(&info->cmap); | 505 | fb_dealloc_cmap(&info->cmap); |
505 | err2: | 506 | unmap_regs: |
506 | of_iounmap(&dev->resource[0], par->regs, | 507 | of_iounmap(&dev->resource[0], par->regs, |
507 | resource_size(&dev->resource[0])); | 508 | resource_size(&dev->resource[0])); |
508 | err1: | 509 | free_fb: |
509 | release_mem_region(dev->resource[0].start, resource_size(&dev->resource[0])); | ||
510 | err: | ||
511 | framebuffer_release(info); | 510 | framebuffer_release(info); |
512 | 511 | ||
513 | return retval; | 512 | return retval; |
@@ -524,12 +523,10 @@ static int __devexit grvga_remove(struct platform_device *device) | |||
524 | 523 | ||
525 | of_iounmap(&device->resource[0], par->regs, | 524 | of_iounmap(&device->resource[0], par->regs, |
526 | resource_size(&device->resource[0])); | 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) { | 527 | if (!par->fb_alloced) |
530 | release_mem_region(info->fix.smem_start, info->fix.smem_len); | ||
531 | iounmap(info->screen_base); | 528 | iounmap(info->screen_base); |
532 | } else | 529 | else |
533 | kfree((void *)info->screen_base); | 530 | kfree((void *)info->screen_base); |
534 | 531 | ||
535 | framebuffer_release(info); | 532 | framebuffer_release(info); |