diff options
author | Sachin Kamat <sachin.kamat@linaro.org> | 2012-05-14 05:31:24 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2012-05-20 08:05:18 -0400 |
commit | 32fced05ad9ef4736e4a89b2361cccf56227529b (patch) | |
tree | 240505865b7c2fea153a0870e10604736a2474ec /drivers/media | |
parent | 3e9095d54c3712ffda70dc84f9273d4b5d24c0fd (diff) |
[media] s5p-g2d: Use devm_* functions in g2d.c file
devm_* functions are device managed functions and make error handling
and cleanup simpler.
Signed-off-by: Sachin Kamat <sachin.kamat@linaro.org>
Signed-off-by: Sylwester Nawrocki <s.nawrocki@samsung.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media')
-rw-r--r-- | drivers/media/video/s5p-g2d/g2d.c | 47 | ||||
-rw-r--r-- | drivers/media/video/s5p-g2d/g2d.h | 1 |
2 files changed, 11 insertions, 37 deletions
diff --git a/drivers/media/video/s5p-g2d/g2d.c b/drivers/media/video/s5p-g2d/g2d.c index 2270b7c1425b..7c98ee7377ee 100644 --- a/drivers/media/video/s5p-g2d/g2d.c +++ b/drivers/media/video/s5p-g2d/g2d.c | |||
@@ -674,42 +674,27 @@ static int g2d_probe(struct platform_device *pdev) | |||
674 | struct resource *res; | 674 | struct resource *res; |
675 | int ret = 0; | 675 | int ret = 0; |
676 | 676 | ||
677 | dev = kzalloc(sizeof(*dev), GFP_KERNEL); | 677 | dev = devm_kzalloc(&pdev->dev, sizeof(*dev), GFP_KERNEL); |
678 | if (!dev) | 678 | if (!dev) |
679 | return -ENOMEM; | 679 | return -ENOMEM; |
680 | |||
680 | spin_lock_init(&dev->ctrl_lock); | 681 | spin_lock_init(&dev->ctrl_lock); |
681 | mutex_init(&dev->mutex); | 682 | mutex_init(&dev->mutex); |
682 | atomic_set(&dev->num_inst, 0); | 683 | atomic_set(&dev->num_inst, 0); |
683 | init_waitqueue_head(&dev->irq_queue); | 684 | init_waitqueue_head(&dev->irq_queue); |
684 | 685 | ||
685 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 686 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
686 | if (!res) { | ||
687 | dev_err(&pdev->dev, "failed to find registers\n"); | ||
688 | ret = -ENOENT; | ||
689 | goto free_dev; | ||
690 | } | ||
691 | 687 | ||
692 | dev->res_regs = request_mem_region(res->start, resource_size(res), | 688 | dev->regs = devm_request_and_ioremap(&pdev->dev, res); |
693 | dev_name(&pdev->dev)); | 689 | if (dev->regs == NULL) { |
694 | 690 | dev_err(&pdev->dev, "Failed to obtain io memory\n"); | |
695 | if (!dev->res_regs) { | 691 | return -ENOENT; |
696 | dev_err(&pdev->dev, "failed to obtain register region\n"); | ||
697 | ret = -ENOENT; | ||
698 | goto free_dev; | ||
699 | } | ||
700 | |||
701 | dev->regs = ioremap(res->start, resource_size(res)); | ||
702 | if (!dev->regs) { | ||
703 | dev_err(&pdev->dev, "failed to map registers\n"); | ||
704 | ret = -ENOENT; | ||
705 | goto rel_res_regs; | ||
706 | } | 692 | } |
707 | 693 | ||
708 | dev->clk = clk_get(&pdev->dev, "sclk_fimg2d"); | 694 | dev->clk = clk_get(&pdev->dev, "sclk_fimg2d"); |
709 | if (IS_ERR_OR_NULL(dev->clk)) { | 695 | if (IS_ERR_OR_NULL(dev->clk)) { |
710 | dev_err(&pdev->dev, "failed to get g2d clock\n"); | 696 | dev_err(&pdev->dev, "failed to get g2d clock\n"); |
711 | ret = -ENXIO; | 697 | return -ENXIO; |
712 | goto unmap_regs; | ||
713 | } | 698 | } |
714 | 699 | ||
715 | ret = clk_prepare(dev->clk); | 700 | ret = clk_prepare(dev->clk); |
@@ -740,7 +725,8 @@ static int g2d_probe(struct platform_device *pdev) | |||
740 | 725 | ||
741 | dev->irq = res->start; | 726 | dev->irq = res->start; |
742 | 727 | ||
743 | ret = request_irq(dev->irq, g2d_isr, 0, pdev->name, dev); | 728 | ret = devm_request_irq(&pdev->dev, dev->irq, g2d_isr, |
729 | 0, pdev->name, dev); | ||
744 | if (ret) { | 730 | if (ret) { |
745 | dev_err(&pdev->dev, "failed to install IRQ\n"); | 731 | dev_err(&pdev->dev, "failed to install IRQ\n"); |
746 | goto put_clk_gate; | 732 | goto put_clk_gate; |
@@ -749,7 +735,7 @@ static int g2d_probe(struct platform_device *pdev) | |||
749 | dev->alloc_ctx = vb2_dma_contig_init_ctx(&pdev->dev); | 735 | dev->alloc_ctx = vb2_dma_contig_init_ctx(&pdev->dev); |
750 | if (IS_ERR(dev->alloc_ctx)) { | 736 | if (IS_ERR(dev->alloc_ctx)) { |
751 | ret = PTR_ERR(dev->alloc_ctx); | 737 | ret = PTR_ERR(dev->alloc_ctx); |
752 | goto rel_irq; | 738 | goto unprep_clk_gate; |
753 | } | 739 | } |
754 | 740 | ||
755 | ret = v4l2_device_register(&pdev->dev, &dev->v4l2_dev); | 741 | ret = v4l2_device_register(&pdev->dev, &dev->v4l2_dev); |
@@ -797,8 +783,6 @@ unreg_v4l2_dev: | |||
797 | v4l2_device_unregister(&dev->v4l2_dev); | 783 | v4l2_device_unregister(&dev->v4l2_dev); |
798 | alloc_ctx_cleanup: | 784 | alloc_ctx_cleanup: |
799 | vb2_dma_contig_cleanup_ctx(dev->alloc_ctx); | 785 | vb2_dma_contig_cleanup_ctx(dev->alloc_ctx); |
800 | rel_irq: | ||
801 | free_irq(dev->irq, dev); | ||
802 | unprep_clk_gate: | 786 | unprep_clk_gate: |
803 | clk_unprepare(dev->gate); | 787 | clk_unprepare(dev->gate); |
804 | put_clk_gate: | 788 | put_clk_gate: |
@@ -807,12 +791,7 @@ unprep_clk: | |||
807 | clk_unprepare(dev->clk); | 791 | clk_unprepare(dev->clk); |
808 | put_clk: | 792 | put_clk: |
809 | clk_put(dev->clk); | 793 | clk_put(dev->clk); |
810 | unmap_regs: | 794 | |
811 | iounmap(dev->regs); | ||
812 | rel_res_regs: | ||
813 | release_resource(dev->res_regs); | ||
814 | free_dev: | ||
815 | kfree(dev); | ||
816 | return ret; | 795 | return ret; |
817 | } | 796 | } |
818 | 797 | ||
@@ -825,14 +804,10 @@ static int g2d_remove(struct platform_device *pdev) | |||
825 | video_unregister_device(dev->vfd); | 804 | video_unregister_device(dev->vfd); |
826 | v4l2_device_unregister(&dev->v4l2_dev); | 805 | v4l2_device_unregister(&dev->v4l2_dev); |
827 | vb2_dma_contig_cleanup_ctx(dev->alloc_ctx); | 806 | vb2_dma_contig_cleanup_ctx(dev->alloc_ctx); |
828 | free_irq(dev->irq, dev); | ||
829 | clk_unprepare(dev->gate); | 807 | clk_unprepare(dev->gate); |
830 | clk_put(dev->gate); | 808 | clk_put(dev->gate); |
831 | clk_unprepare(dev->clk); | 809 | clk_unprepare(dev->clk); |
832 | clk_put(dev->clk); | 810 | clk_put(dev->clk); |
833 | iounmap(dev->regs); | ||
834 | release_resource(dev->res_regs); | ||
835 | kfree(dev); | ||
836 | return 0; | 811 | return 0; |
837 | } | 812 | } |
838 | 813 | ||
diff --git a/drivers/media/video/s5p-g2d/g2d.h b/drivers/media/video/s5p-g2d/g2d.h index 1b82065aeaef..6b765b0216c5 100644 --- a/drivers/media/video/s5p-g2d/g2d.h +++ b/drivers/media/video/s5p-g2d/g2d.h | |||
@@ -23,7 +23,6 @@ struct g2d_dev { | |||
23 | spinlock_t ctrl_lock; | 23 | spinlock_t ctrl_lock; |
24 | atomic_t num_inst; | 24 | atomic_t num_inst; |
25 | struct vb2_alloc_ctx *alloc_ctx; | 25 | struct vb2_alloc_ctx *alloc_ctx; |
26 | struct resource *res_regs; | ||
27 | void __iomem *regs; | 26 | void __iomem *regs; |
28 | struct clk *clk; | 27 | struct clk *clk; |
29 | struct clk *gate; | 28 | struct clk *gate; |