aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/platform/davinci
diff options
context:
space:
mode:
authorLad, Prabhakar <prabhakar.csengg@gmail.com>2013-07-13 03:50:27 -0400
committerMauro Carvalho Chehab <m.chehab@samsung.com>2013-07-26 12:18:22 -0400
commit371376d202ebbdda1d30caaf29125e4cb79884b1 (patch)
tree04a56f4cf683f983121741f3bc5099fcc389882e /drivers/media/platform/davinci
parent4b8a531e6bb0686203e9cf82a54dfe189de7d5c2 (diff)
[media] media: davinci: vpbe_venc: convert to devm_* api
Replace existing resource handling in the driver with managed device resource, this ensures more consistent error values and simplifies error paths. Signed-off-by: Lad, Prabhakar <prabhakar.csengg@gmail.com> Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com> Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
Diffstat (limited to 'drivers/media/platform/davinci')
-rw-r--r--drivers/media/platform/davinci/vpbe_venc.c97
1 files changed, 19 insertions, 78 deletions
diff --git a/drivers/media/platform/davinci/vpbe_venc.c b/drivers/media/platform/davinci/vpbe_venc.c
index 87eef9be08ed..14a023a75d2d 100644
--- a/drivers/media/platform/davinci/vpbe_venc.c
+++ b/drivers/media/platform/davinci/vpbe_venc.c
@@ -639,105 +639,46 @@ static int venc_probe(struct platform_device *pdev)
639 const struct platform_device_id *pdev_id; 639 const struct platform_device_id *pdev_id;
640 struct venc_state *venc; 640 struct venc_state *venc;
641 struct resource *res; 641 struct resource *res;
642 int ret;
643 642
644 venc = kzalloc(sizeof(struct venc_state), GFP_KERNEL); 643 if (!pdev->dev.platform_data) {
644 dev_err(&pdev->dev, "No platform data for VENC sub device");
645 return -EINVAL;
646 }
647
648 pdev_id = platform_get_device_id(pdev);
649 if (!pdev_id)
650 return -EINVAL;
651
652 venc = devm_kzalloc(&pdev->dev, sizeof(struct venc_state), GFP_KERNEL);
645 if (venc == NULL) 653 if (venc == NULL)
646 return -ENOMEM; 654 return -ENOMEM;
647 655
648 pdev_id = platform_get_device_id(pdev);
649 if (!pdev_id) {
650 ret = -EINVAL;
651 goto free_mem;
652 }
653 venc->venc_type = pdev_id->driver_data; 656 venc->venc_type = pdev_id->driver_data;
654 venc->pdev = &pdev->dev; 657 venc->pdev = &pdev->dev;
655 venc->pdata = pdev->dev.platform_data; 658 venc->pdata = pdev->dev.platform_data;
656 if (NULL == venc->pdata) { 659
657 dev_err(venc->pdev, "Unable to get platform data for"
658 " VENC sub device");
659 ret = -ENOENT;
660 goto free_mem;
661 }
662 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 660 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
663 if (!res) {
664 dev_err(venc->pdev,
665 "Unable to get VENC register address map\n");
666 ret = -ENODEV;
667 goto free_mem;
668 }
669 661
670 if (!request_mem_region(res->start, resource_size(res), "venc")) { 662 venc->venc_base = devm_ioremap_resource(&pdev->dev, res);
671 dev_err(venc->pdev, "Unable to reserve VENC MMIO region\n"); 663 if (IS_ERR(venc->venc_base))
672 ret = -ENODEV; 664 return PTR_ERR(venc->venc_base);
673 goto free_mem;
674 }
675
676 venc->venc_base = ioremap_nocache(res->start, resource_size(res));
677 if (!venc->venc_base) {
678 dev_err(venc->pdev, "Unable to map VENC IO space\n");
679 ret = -ENODEV;
680 goto release_venc_mem_region;
681 }
682 665
683 if (venc->venc_type != VPBE_VERSION_1) { 666 if (venc->venc_type != VPBE_VERSION_1) {
684 res = platform_get_resource(pdev, IORESOURCE_MEM, 1); 667 res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
685 if (!res) { 668
686 dev_err(venc->pdev, 669 venc->vdaccfg_reg = devm_ioremap_resource(&pdev->dev, res);
687 "Unable to get VDAC_CONFIG address map\n"); 670 if (IS_ERR(venc->vdaccfg_reg))
688 ret = -ENODEV; 671 return PTR_ERR(venc->vdaccfg_reg);
689 goto unmap_venc_io;
690 }
691
692 if (!request_mem_region(res->start,
693 resource_size(res), "venc")) {
694 dev_err(venc->pdev,
695 "Unable to reserve VDAC_CONFIG MMIO region\n");
696 ret = -ENODEV;
697 goto unmap_venc_io;
698 }
699
700 venc->vdaccfg_reg = ioremap_nocache(res->start,
701 resource_size(res));
702 if (!venc->vdaccfg_reg) {
703 dev_err(venc->pdev,
704 "Unable to map VDAC_CONFIG IO space\n");
705 ret = -ENODEV;
706 goto release_vdaccfg_mem_region;
707 }
708 } 672 }
709 spin_lock_init(&venc->lock); 673 spin_lock_init(&venc->lock);
710 platform_set_drvdata(pdev, venc); 674 platform_set_drvdata(pdev, venc);
711 dev_notice(venc->pdev, "VENC sub device probe success\n"); 675 dev_notice(venc->pdev, "VENC sub device probe success\n");
712 return 0;
713 676
714release_vdaccfg_mem_region: 677 return 0;
715 release_mem_region(res->start, resource_size(res));
716unmap_venc_io:
717 iounmap(venc->venc_base);
718release_venc_mem_region:
719 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
720 release_mem_region(res->start, resource_size(res));
721free_mem:
722 kfree(venc);
723 return ret;
724} 678}
725 679
726static int venc_remove(struct platform_device *pdev) 680static int venc_remove(struct platform_device *pdev)
727{ 681{
728 struct venc_state *venc = platform_get_drvdata(pdev);
729 struct resource *res;
730
731 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
732 iounmap((void *)venc->venc_base);
733 release_mem_region(res->start, resource_size(res));
734 if (venc->venc_type != VPBE_VERSION_1) {
735 res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
736 iounmap((void *)venc->vdaccfg_reg);
737 release_mem_region(res->start, resource_size(res));
738 }
739 kfree(venc);
740
741 return 0; 682 return 0;
742} 683}
743 684