diff options
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 | } |
