diff options
author | Lad, Prabhakar <prabhakar.csengg@gmail.com> | 2013-07-13 03:50:27 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <m.chehab@samsung.com> | 2013-07-26 12:18:22 -0400 |
commit | 371376d202ebbdda1d30caaf29125e4cb79884b1 (patch) | |
tree | 04a56f4cf683f983121741f3bc5099fcc389882e /drivers/media/platform/davinci | |
parent | 4b8a531e6bb0686203e9cf82a54dfe189de7d5c2 (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.c | 97 |
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 | ||
714 | release_vdaccfg_mem_region: | 677 | return 0; |
715 | release_mem_region(res->start, resource_size(res)); | ||
716 | unmap_venc_io: | ||
717 | iounmap(venc->venc_base); | ||
718 | release_venc_mem_region: | ||
719 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
720 | release_mem_region(res->start, resource_size(res)); | ||
721 | free_mem: | ||
722 | kfree(venc); | ||
723 | return ret; | ||
724 | } | 678 | } |
725 | 679 | ||
726 | static int venc_remove(struct platform_device *pdev) | 680 | static 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 | ||