diff options
author | Sachin Kamat <sachin.kamat@linaro.org> | 2012-08-06 02:46:20 -0400 |
---|---|---|
committer | Inki Dae <inki.dae@samsung.com> | 2012-09-12 23:38:08 -0400 |
commit | b767593349c92049dcea4a8ce5c534c4a470099b (patch) | |
tree | 64f36df342176120d881aa2dfdb97d6039240607 /drivers/gpu | |
parent | ae18294018c7cf098777a33086073321477f723f (diff) |
drm/exynos: Use devm_* functions in exynos_drm_g2d.c file
devm_* functions are device managed functions and make error handling
and cleanup cleaner and simpler.
Signed-off-by: Sachin Kamat <sachin.kamat@linaro.org>
Signed-off-by: Inki Dae <inki.dae@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
Diffstat (limited to 'drivers/gpu')
-rw-r--r-- | drivers/gpu/drm/exynos/exynos_drm_g2d.c | 50 |
1 files changed, 10 insertions, 40 deletions
diff --git a/drivers/gpu/drm/exynos/exynos_drm_g2d.c b/drivers/gpu/drm/exynos/exynos_drm_g2d.c index d2d88f22a037..6adfa4e03265 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_g2d.c +++ b/drivers/gpu/drm/exynos/exynos_drm_g2d.c | |||
@@ -129,7 +129,6 @@ struct g2d_runqueue_node { | |||
129 | struct g2d_data { | 129 | struct g2d_data { |
130 | struct device *dev; | 130 | struct device *dev; |
131 | struct clk *gate_clk; | 131 | struct clk *gate_clk; |
132 | struct resource *regs_res; | ||
133 | void __iomem *regs; | 132 | void __iomem *regs; |
134 | int irq; | 133 | int irq; |
135 | struct workqueue_struct *g2d_workq; | 134 | struct workqueue_struct *g2d_workq; |
@@ -751,7 +750,7 @@ static int __devinit g2d_probe(struct platform_device *pdev) | |||
751 | struct exynos_drm_subdrv *subdrv; | 750 | struct exynos_drm_subdrv *subdrv; |
752 | int ret; | 751 | int ret; |
753 | 752 | ||
754 | g2d = kzalloc(sizeof(*g2d), GFP_KERNEL); | 753 | g2d = devm_kzalloc(&pdev->dev, sizeof(*g2d), GFP_KERNEL); |
755 | if (!g2d) { | 754 | if (!g2d) { |
756 | dev_err(dev, "failed to allocate driver data\n"); | 755 | dev_err(dev, "failed to allocate driver data\n"); |
757 | return -ENOMEM; | 756 | return -ENOMEM; |
@@ -759,10 +758,8 @@ static int __devinit g2d_probe(struct platform_device *pdev) | |||
759 | 758 | ||
760 | g2d->runqueue_slab = kmem_cache_create("g2d_runqueue_slab", | 759 | g2d->runqueue_slab = kmem_cache_create("g2d_runqueue_slab", |
761 | sizeof(struct g2d_runqueue_node), 0, 0, NULL); | 760 | sizeof(struct g2d_runqueue_node), 0, 0, NULL); |
762 | if (!g2d->runqueue_slab) { | 761 | if (!g2d->runqueue_slab) |
763 | ret = -ENOMEM; | 762 | return -ENOMEM; |
764 | goto err_free_mem; | ||
765 | } | ||
766 | 763 | ||
767 | g2d->dev = dev; | 764 | g2d->dev = dev; |
768 | 765 | ||
@@ -794,38 +791,26 @@ static int __devinit g2d_probe(struct platform_device *pdev) | |||
794 | pm_runtime_enable(dev); | 791 | pm_runtime_enable(dev); |
795 | 792 | ||
796 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 793 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
797 | if (!res) { | ||
798 | dev_err(dev, "failed to get I/O memory\n"); | ||
799 | ret = -ENOENT; | ||
800 | goto err_put_clk; | ||
801 | } | ||
802 | 794 | ||
803 | g2d->regs_res = request_mem_region(res->start, resource_size(res), | 795 | g2d->regs = devm_request_and_ioremap(&pdev->dev, res); |
804 | dev_name(dev)); | ||
805 | if (!g2d->regs_res) { | ||
806 | dev_err(dev, "failed to request I/O memory\n"); | ||
807 | ret = -ENOENT; | ||
808 | goto err_put_clk; | ||
809 | } | ||
810 | |||
811 | g2d->regs = ioremap(res->start, resource_size(res)); | ||
812 | if (!g2d->regs) { | 796 | if (!g2d->regs) { |
813 | dev_err(dev, "failed to remap I/O memory\n"); | 797 | dev_err(dev, "failed to remap I/O memory\n"); |
814 | ret = -ENXIO; | 798 | ret = -ENXIO; |
815 | goto err_release_res; | 799 | goto err_put_clk; |
816 | } | 800 | } |
817 | 801 | ||
818 | g2d->irq = platform_get_irq(pdev, 0); | 802 | g2d->irq = platform_get_irq(pdev, 0); |
819 | if (g2d->irq < 0) { | 803 | if (g2d->irq < 0) { |
820 | dev_err(dev, "failed to get irq\n"); | 804 | dev_err(dev, "failed to get irq\n"); |
821 | ret = g2d->irq; | 805 | ret = g2d->irq; |
822 | goto err_unmap_base; | 806 | goto err_put_clk; |
823 | } | 807 | } |
824 | 808 | ||
825 | ret = request_irq(g2d->irq, g2d_irq_handler, 0, "drm_g2d", g2d); | 809 | ret = devm_request_irq(&pdev->dev, g2d->irq, g2d_irq_handler, 0, |
810 | "drm_g2d", g2d); | ||
826 | if (ret < 0) { | 811 | if (ret < 0) { |
827 | dev_err(dev, "irq request failed\n"); | 812 | dev_err(dev, "irq request failed\n"); |
828 | goto err_unmap_base; | 813 | goto err_put_clk; |
829 | } | 814 | } |
830 | 815 | ||
831 | platform_set_drvdata(pdev, g2d); | 816 | platform_set_drvdata(pdev, g2d); |
@@ -838,7 +823,7 @@ static int __devinit g2d_probe(struct platform_device *pdev) | |||
838 | ret = exynos_drm_subdrv_register(subdrv); | 823 | ret = exynos_drm_subdrv_register(subdrv); |
839 | if (ret < 0) { | 824 | if (ret < 0) { |
840 | dev_err(dev, "failed to register drm g2d device\n"); | 825 | dev_err(dev, "failed to register drm g2d device\n"); |
841 | goto err_free_irq; | 826 | goto err_put_clk; |
842 | } | 827 | } |
843 | 828 | ||
844 | dev_info(dev, "The exynos g2d(ver %d.%d) successfully probed\n", | 829 | dev_info(dev, "The exynos g2d(ver %d.%d) successfully probed\n", |
@@ -846,13 +831,6 @@ static int __devinit g2d_probe(struct platform_device *pdev) | |||
846 | 831 | ||
847 | return 0; | 832 | return 0; |
848 | 833 | ||
849 | err_free_irq: | ||
850 | free_irq(g2d->irq, g2d); | ||
851 | err_unmap_base: | ||
852 | iounmap(g2d->regs); | ||
853 | err_release_res: | ||
854 | release_resource(g2d->regs_res); | ||
855 | kfree(g2d->regs_res); | ||
856 | err_put_clk: | 834 | err_put_clk: |
857 | pm_runtime_disable(dev); | 835 | pm_runtime_disable(dev); |
858 | clk_put(g2d->gate_clk); | 836 | clk_put(g2d->gate_clk); |
@@ -862,8 +840,6 @@ err_destroy_workqueue: | |||
862 | destroy_workqueue(g2d->g2d_workq); | 840 | destroy_workqueue(g2d->g2d_workq); |
863 | err_destroy_slab: | 841 | err_destroy_slab: |
864 | kmem_cache_destroy(g2d->runqueue_slab); | 842 | kmem_cache_destroy(g2d->runqueue_slab); |
865 | err_free_mem: | ||
866 | kfree(g2d); | ||
867 | return ret; | 843 | return ret; |
868 | } | 844 | } |
869 | 845 | ||
@@ -873,24 +849,18 @@ static int __devexit g2d_remove(struct platform_device *pdev) | |||
873 | 849 | ||
874 | cancel_work_sync(&g2d->runqueue_work); | 850 | cancel_work_sync(&g2d->runqueue_work); |
875 | exynos_drm_subdrv_unregister(&g2d->subdrv); | 851 | exynos_drm_subdrv_unregister(&g2d->subdrv); |
876 | free_irq(g2d->irq, g2d); | ||
877 | 852 | ||
878 | while (g2d->runqueue_node) { | 853 | while (g2d->runqueue_node) { |
879 | g2d_free_runqueue_node(g2d, g2d->runqueue_node); | 854 | g2d_free_runqueue_node(g2d, g2d->runqueue_node); |
880 | g2d->runqueue_node = g2d_get_runqueue_node(g2d); | 855 | g2d->runqueue_node = g2d_get_runqueue_node(g2d); |
881 | } | 856 | } |
882 | 857 | ||
883 | iounmap(g2d->regs); | ||
884 | release_resource(g2d->regs_res); | ||
885 | kfree(g2d->regs_res); | ||
886 | |||
887 | pm_runtime_disable(&pdev->dev); | 858 | pm_runtime_disable(&pdev->dev); |
888 | clk_put(g2d->gate_clk); | 859 | clk_put(g2d->gate_clk); |
889 | 860 | ||
890 | g2d_fini_cmdlist(g2d); | 861 | g2d_fini_cmdlist(g2d); |
891 | destroy_workqueue(g2d->g2d_workq); | 862 | destroy_workqueue(g2d->g2d_workq); |
892 | kmem_cache_destroy(g2d->runqueue_slab); | 863 | kmem_cache_destroy(g2d->runqueue_slab); |
893 | kfree(g2d); | ||
894 | 864 | ||
895 | return 0; | 865 | return 0; |
896 | } | 866 | } |