diff options
author | David S. Miller <davem@sunset.davemloft.net> | 2006-12-29 00:01:32 -0500 |
---|---|---|
committer | David S. Miller <davem@sunset.davemloft.net> | 2006-12-31 17:06:05 -0500 |
commit | e3a411a3dfc1d633504aa63efab32b7e00318454 (patch) | |
tree | 2ba6117448edd7056c8fa48cc6a696ae73a6c21a /drivers/video/leo.c | |
parent | 6fc5bae797a6632bbccdd49a1b6a96121368a4b9 (diff) |
[SPARC64]: Fix of_iounmap() region release.
We need to pass in the resource otherwise we cannot
release the region properly. We must know whether it is
an I/O or MEM resource.
Spotted by Eric Brower.
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/video/leo.c')
-rw-r--r-- | drivers/video/leo.c | 29 |
1 files changed, 15 insertions, 14 deletions
diff --git a/drivers/video/leo.c b/drivers/video/leo.c index f3a24338d9ac..a038aa5a9e1c 100644 --- a/drivers/video/leo.c +++ b/drivers/video/leo.c | |||
@@ -530,20 +530,21 @@ struct all_info { | |||
530 | struct leo_par par; | 530 | struct leo_par par; |
531 | }; | 531 | }; |
532 | 532 | ||
533 | static void leo_unmap_regs(struct all_info *all) | 533 | static void leo_unmap_regs(struct of_device *op, struct all_info *all) |
534 | { | 534 | { |
535 | if (all->par.lc_ss0_usr) | 535 | if (all->par.lc_ss0_usr) |
536 | of_iounmap(all->par.lc_ss0_usr, 0x1000); | 536 | of_iounmap(&op->resource[0], all->par.lc_ss0_usr, 0x1000); |
537 | if (all->par.ld_ss0) | 537 | if (all->par.ld_ss0) |
538 | of_iounmap(all->par.ld_ss0, 0x1000); | 538 | of_iounmap(&op->resource[0], all->par.ld_ss0, 0x1000); |
539 | if (all->par.ld_ss1) | 539 | if (all->par.ld_ss1) |
540 | of_iounmap(all->par.ld_ss1, 0x1000); | 540 | of_iounmap(&op->resource[0], all->par.ld_ss1, 0x1000); |
541 | if (all->par.lx_krn) | 541 | if (all->par.lx_krn) |
542 | of_iounmap(all->par.lx_krn, 0x1000); | 542 | of_iounmap(&op->resource[0], all->par.lx_krn, 0x1000); |
543 | if (all->par.cursor) | 543 | if (all->par.cursor) |
544 | of_iounmap(all->par.cursor, sizeof(struct leo_cursor)); | 544 | of_iounmap(&op->resource[0], |
545 | all->par.cursor, sizeof(struct leo_cursor)); | ||
545 | if (all->info.screen_base) | 546 | if (all->info.screen_base) |
546 | of_iounmap(all->info.screen_base, 0x800000); | 547 | of_iounmap(&op->resource[0], all->info.screen_base, 0x800000); |
547 | } | 548 | } |
548 | 549 | ||
549 | static int __devinit leo_init_one(struct of_device *op) | 550 | static int __devinit leo_init_one(struct of_device *op) |
@@ -592,7 +593,7 @@ static int __devinit leo_init_one(struct of_device *op) | |||
592 | !all->par.lx_krn || | 593 | !all->par.lx_krn || |
593 | !all->par.cursor || | 594 | !all->par.cursor || |
594 | !all->info.screen_base) { | 595 | !all->info.screen_base) { |
595 | leo_unmap_regs(all); | 596 | leo_unmap_regs(op, all); |
596 | kfree(all); | 597 | kfree(all); |
597 | return -ENOMEM; | 598 | return -ENOMEM; |
598 | } | 599 | } |
@@ -607,7 +608,7 @@ static int __devinit leo_init_one(struct of_device *op) | |||
607 | leo_blank(0, &all->info); | 608 | leo_blank(0, &all->info); |
608 | 609 | ||
609 | if (fb_alloc_cmap(&all->info.cmap, 256, 0)) { | 610 | if (fb_alloc_cmap(&all->info.cmap, 256, 0)) { |
610 | leo_unmap_regs(all); | 611 | leo_unmap_regs(op, all); |
611 | kfree(all); | 612 | kfree(all); |
612 | return -ENOMEM;; | 613 | return -ENOMEM;; |
613 | } | 614 | } |
@@ -617,7 +618,7 @@ static int __devinit leo_init_one(struct of_device *op) | |||
617 | err = register_framebuffer(&all->info); | 618 | err = register_framebuffer(&all->info); |
618 | if (err < 0) { | 619 | if (err < 0) { |
619 | fb_dealloc_cmap(&all->info.cmap); | 620 | fb_dealloc_cmap(&all->info.cmap); |
620 | leo_unmap_regs(all); | 621 | leo_unmap_regs(op, all); |
621 | kfree(all); | 622 | kfree(all); |
622 | return err; | 623 | return err; |
623 | } | 624 | } |
@@ -638,18 +639,18 @@ static int __devinit leo_probe(struct of_device *dev, const struct of_device_id | |||
638 | return leo_init_one(op); | 639 | return leo_init_one(op); |
639 | } | 640 | } |
640 | 641 | ||
641 | static int __devexit leo_remove(struct of_device *dev) | 642 | static int __devexit leo_remove(struct of_device *op) |
642 | { | 643 | { |
643 | struct all_info *all = dev_get_drvdata(&dev->dev); | 644 | struct all_info *all = dev_get_drvdata(&op->dev); |
644 | 645 | ||
645 | unregister_framebuffer(&all->info); | 646 | unregister_framebuffer(&all->info); |
646 | fb_dealloc_cmap(&all->info.cmap); | 647 | fb_dealloc_cmap(&all->info.cmap); |
647 | 648 | ||
648 | leo_unmap_regs(all); | 649 | leo_unmap_regs(op, all); |
649 | 650 | ||
650 | kfree(all); | 651 | kfree(all); |
651 | 652 | ||
652 | dev_set_drvdata(&dev->dev, NULL); | 653 | dev_set_drvdata(&op->dev, NULL); |
653 | 654 | ||
654 | return 0; | 655 | return 0; |
655 | } | 656 | } |