aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/platform
diff options
context:
space:
mode:
authorJulia Lawall <Julia.Lawall@lip6.fr>2012-08-14 08:23:06 -0400
committerMauro Carvalho Chehab <mchehab@redhat.com>2012-08-15 17:58:52 -0400
commitd1bb4b29a74ea81b8282011479bc36417620b5fa (patch)
tree8ef2d16603990d90c67fa782d09bd9d1a4845959 /drivers/media/platform
parent071408b6dcc1cb29150699621e13b0ddb81e3cf1 (diff)
[media] drivers/media/platform/mx2_emmaprp.c: use devm_kzalloc and devm_clk_get
Using devm_kzalloc simplifies the code and ensures that the use of devm_request_irq is safe. When kzalloc and kfree were used, the interrupt could be triggered after the handler's data argument had been freed. This also introduces some missing initializations of the return variable ret, and uses devm_request_and_ioremap instead of the combination of devm_request_mem_region and devm_ioremap. The problem of a free after a devm_request_irq was found using the following semantic match (http://coccinelle.lip6.fr/) // <smpl> @r exists@ expression e1,e2,x,a,b,c,d; identifier free; position p1,p2; @@ devm_request_irq@p1(e1,e2,...,x) ... when any when != e2 = a when != x = b if (...) { ... when != e2 = c when != x = d free@p2(...,x,...); ... return ...; } // </smpl> Signed-off-by: Julia Lawall <Julia.Lawall@lip6.fr> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/platform')
-rw-r--r--drivers/media/platform/mx2_emmaprp.c31
1 files changed, 12 insertions, 19 deletions
diff --git a/drivers/media/platform/mx2_emmaprp.c b/drivers/media/platform/mx2_emmaprp.c
index 2810015d78f4..dab380a8d1c6 100644
--- a/drivers/media/platform/mx2_emmaprp.c
+++ b/drivers/media/platform/mx2_emmaprp.c
@@ -896,7 +896,7 @@ static int emmaprp_probe(struct platform_device *pdev)
896 int irq_emma; 896 int irq_emma;
897 int ret; 897 int ret;
898 898
899 pcdev = kzalloc(sizeof *pcdev, GFP_KERNEL); 899 pcdev = devm_kzalloc(&pdev->dev, sizeof(*pcdev), GFP_KERNEL);
900 if (!pcdev) 900 if (!pcdev)
901 return -ENOMEM; 901 return -ENOMEM;
902 902
@@ -904,27 +904,24 @@ static int emmaprp_probe(struct platform_device *pdev)
904 904
905 pcdev->clk_emma_ipg = devm_clk_get(&pdev->dev, "ipg"); 905 pcdev->clk_emma_ipg = devm_clk_get(&pdev->dev, "ipg");
906 if (IS_ERR(pcdev->clk_emma_ipg)) { 906 if (IS_ERR(pcdev->clk_emma_ipg)) {
907 ret = PTR_ERR(pcdev->clk_emma_ipg); 907 return PTR_ERR(pcdev->clk_emma_ipg);
908 goto free_dev;
909 } 908 }
910 909
911 pcdev->clk_emma_ahb = devm_clk_get(&pdev->dev, "ahb"); 910 pcdev->clk_emma_ahb = devm_clk_get(&pdev->dev, "ahb");
912 if (IS_ERR(pcdev->clk_emma_ipg)) { 911 if (IS_ERR(pcdev->clk_emma_ipg)) {
913 ret = PTR_ERR(pcdev->clk_emma_ahb); 912 return PTR_ERR(pcdev->clk_emma_ahb);
914 goto free_dev;
915 } 913 }
916 914
917 irq_emma = platform_get_irq(pdev, 0); 915 irq_emma = platform_get_irq(pdev, 0);
918 res_emma = platform_get_resource(pdev, IORESOURCE_MEM, 0); 916 res_emma = platform_get_resource(pdev, IORESOURCE_MEM, 0);
919 if (irq_emma < 0 || res_emma == NULL) { 917 if (irq_emma < 0 || res_emma == NULL) {
920 dev_err(&pdev->dev, "Missing platform resources data\n"); 918 dev_err(&pdev->dev, "Missing platform resources data\n");
921 ret = -ENODEV; 919 return -ENODEV;
922 goto free_dev;
923 } 920 }
924 921
925 ret = v4l2_device_register(&pdev->dev, &pcdev->v4l2_dev); 922 ret = v4l2_device_register(&pdev->dev, &pcdev->v4l2_dev);
926 if (ret) 923 if (ret)
927 goto free_dev; 924 return ret;
928 925
929 mutex_init(&pcdev->dev_mutex); 926 mutex_init(&pcdev->dev_mutex);
930 927
@@ -946,21 +943,20 @@ static int emmaprp_probe(struct platform_device *pdev)
946 943
947 platform_set_drvdata(pdev, pcdev); 944 platform_set_drvdata(pdev, pcdev);
948 945
949 if (devm_request_mem_region(&pdev->dev, res_emma->start, 946 pcdev->base_emma = devm_request_and_ioremap(&pdev->dev, res_emma);
950 resource_size(res_emma), MEM2MEM_NAME) == NULL) 947 if (!pcdev->base_emma) {
951 goto rel_vdev; 948 ret = -ENXIO;
952
953 pcdev->base_emma = devm_ioremap(&pdev->dev, res_emma->start,
954 resource_size(res_emma));
955 if (!pcdev->base_emma)
956 goto rel_vdev; 949 goto rel_vdev;
950 }
957 951
958 pcdev->irq_emma = irq_emma; 952 pcdev->irq_emma = irq_emma;
959 pcdev->res_emma = res_emma; 953 pcdev->res_emma = res_emma;
960 954
961 if (devm_request_irq(&pdev->dev, pcdev->irq_emma, emmaprp_irq, 955 if (devm_request_irq(&pdev->dev, pcdev->irq_emma, emmaprp_irq,
962 0, MEM2MEM_NAME, pcdev) < 0) 956 0, MEM2MEM_NAME, pcdev) < 0) {
957 ret = -ENODEV;
963 goto rel_vdev; 958 goto rel_vdev;
959 }
964 960
965 pcdev->alloc_ctx = vb2_dma_contig_init_ctx(&pdev->dev); 961 pcdev->alloc_ctx = vb2_dma_contig_init_ctx(&pdev->dev);
966 if (IS_ERR(pcdev->alloc_ctx)) { 962 if (IS_ERR(pcdev->alloc_ctx)) {
@@ -993,8 +989,6 @@ rel_vdev:
993 video_device_release(vfd); 989 video_device_release(vfd);
994unreg_dev: 990unreg_dev:
995 v4l2_device_unregister(&pcdev->v4l2_dev); 991 v4l2_device_unregister(&pcdev->v4l2_dev);
996free_dev:
997 kfree(pcdev);
998 992
999 return ret; 993 return ret;
1000} 994}
@@ -1009,7 +1003,6 @@ static int emmaprp_remove(struct platform_device *pdev)
1009 v4l2_m2m_release(pcdev->m2m_dev); 1003 v4l2_m2m_release(pcdev->m2m_dev);
1010 vb2_dma_contig_cleanup_ctx(pcdev->alloc_ctx); 1004 vb2_dma_contig_cleanup_ctx(pcdev->alloc_ctx);
1011 v4l2_device_unregister(&pcdev->v4l2_dev); 1005 v4l2_device_unregister(&pcdev->v4l2_dev);
1012 kfree(pcdev);
1013 1006
1014 return 0; 1007 return 0;
1015} 1008}