diff options
author | Daniel Mack <zonque@gmail.com> | 2014-03-05 11:12:49 -0500 |
---|---|---|
committer | Tomi Valkeinen <tomi.valkeinen@ti.com> | 2014-03-07 08:04:53 -0500 |
commit | a9b47c7f23908bf2a5536040c46624178ba5f5c0 (patch) | |
tree | 71afdfb12933fc3951b9b5d750c70879427345a2 /drivers/video | |
parent | 3437b2b83f3bdb99ae4ffc2fd1e1608d6e06fffe (diff) |
video: pxa3xx-gcu: switch to devres functions
Switch to devres allocators to clean up the error unwinding paths.
Signed-off-by: Daniel Mack <zonque@gmail.com>
Acked-by: Haojian Zhuang <haojian.zhuang@gmail.com>
Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
Diffstat (limited to 'drivers/video')
-rw-r--r-- | drivers/video/pxa3xx-gcu.c | 113 |
1 files changed, 39 insertions, 74 deletions
diff --git a/drivers/video/pxa3xx-gcu.c b/drivers/video/pxa3xx-gcu.c index 73c29ecf080f..417f9a27eb7d 100644 --- a/drivers/video/pxa3xx-gcu.c +++ b/drivers/video/pxa3xx-gcu.c | |||
@@ -593,18 +593,10 @@ static int pxa3xx_gcu_probe(struct platform_device *pdev) | |||
593 | struct pxa3xx_gcu_priv *priv; | 593 | struct pxa3xx_gcu_priv *priv; |
594 | struct device *dev = &pdev->dev; | 594 | struct device *dev = &pdev->dev; |
595 | 595 | ||
596 | priv = kzalloc(sizeof(struct pxa3xx_gcu_priv), GFP_KERNEL); | 596 | priv = devm_kzalloc(dev, sizeof(struct pxa3xx_gcu_priv), GFP_KERNEL); |
597 | if (!priv) | 597 | if (!priv) |
598 | return -ENOMEM; | 598 | return -ENOMEM; |
599 | 599 | ||
600 | for (i = 0; i < 8; i++) { | ||
601 | ret = pxa3xx_gcu_add_buffer(dev, priv); | ||
602 | if (ret) { | ||
603 | dev_err(dev, "failed to allocate DMA memory\n"); | ||
604 | goto err_free_priv; | ||
605 | } | ||
606 | } | ||
607 | |||
608 | init_waitqueue_head(&priv->wait_idle); | 600 | init_waitqueue_head(&priv->wait_idle); |
609 | init_waitqueue_head(&priv->wait_free); | 601 | init_waitqueue_head(&priv->wait_free); |
610 | spin_lock_init(&priv->spinlock); | 602 | spin_lock_init(&priv->spinlock); |
@@ -618,73 +610,63 @@ static int pxa3xx_gcu_probe(struct platform_device *pdev) | |||
618 | priv->misc_dev.name = DRV_NAME, | 610 | priv->misc_dev.name = DRV_NAME, |
619 | priv->misc_dev.fops = &pxa3xx_gcu_miscdev_fops; | 611 | priv->misc_dev.fops = &pxa3xx_gcu_miscdev_fops; |
620 | 612 | ||
621 | /* register misc device */ | ||
622 | ret = misc_register(&priv->misc_dev); | ||
623 | if (ret < 0) { | ||
624 | dev_err(dev, "misc_register() for minor %d failed\n", | ||
625 | MISCDEV_MINOR); | ||
626 | goto err_free_priv; | ||
627 | } | ||
628 | |||
629 | /* handle IO resources */ | 613 | /* handle IO resources */ |
630 | r = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 614 | r = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
631 | if (r == NULL) { | 615 | priv->mmio_base = devm_request_and_ioremap(dev, r); |
632 | dev_err(dev, "no I/O memory resource defined\n"); | 616 | if (IS_ERR(priv->mmio_base)) { |
633 | ret = -ENODEV; | 617 | dev_err(dev, "failed to map I/O memory\n"); |
634 | goto err_misc_deregister; | 618 | return PTR_ERR(priv->mmio_base); |
635 | } | 619 | } |
636 | 620 | ||
637 | if (!request_mem_region(r->start, resource_size(r), pdev->name)) { | 621 | /* enable the clock */ |
638 | dev_err(dev, "failed to request I/O memory\n"); | 622 | priv->clk = devm_clk_get(dev, NULL); |
639 | ret = -EBUSY; | 623 | if (IS_ERR(priv->clk)) { |
640 | goto err_misc_deregister; | 624 | dev_err(dev, "failed to get clock\n"); |
625 | return PTR_ERR(priv->clk); | ||
641 | } | 626 | } |
642 | 627 | ||
643 | priv->mmio_base = ioremap_nocache(r->start, resource_size(r)); | 628 | /* request the IRQ */ |
644 | if (!priv->mmio_base) { | 629 | irq = platform_get_irq(pdev, 0); |
645 | dev_err(dev, "failed to map I/O memory\n"); | 630 | if (irq < 0) { |
646 | ret = -EBUSY; | 631 | dev_err(dev, "no IRQ defined\n"); |
647 | goto err_free_mem_region; | 632 | return -ENODEV; |
633 | } | ||
634 | |||
635 | ret = devm_request_irq(dev, irq, pxa3xx_gcu_handle_irq, | ||
636 | 0, DRV_NAME, priv); | ||
637 | if (ret < 0) { | ||
638 | dev_err(dev, "request_irq failed\n"); | ||
639 | return ret; | ||
648 | } | 640 | } |
649 | 641 | ||
650 | /* allocate dma memory */ | 642 | /* allocate dma memory */ |
651 | priv->shared = dma_alloc_coherent(dev, SHARED_SIZE, | 643 | priv->shared = dma_alloc_coherent(dev, SHARED_SIZE, |
652 | &priv->shared_phys, GFP_KERNEL); | 644 | &priv->shared_phys, GFP_KERNEL); |
653 | |||
654 | if (!priv->shared) { | 645 | if (!priv->shared) { |
655 | dev_err(dev, "failed to allocate DMA memory\n"); | 646 | dev_err(dev, "failed to allocate DMA memory\n"); |
656 | ret = -ENOMEM; | 647 | return -ENOMEM; |
657 | goto err_free_io; | ||
658 | } | 648 | } |
659 | 649 | ||
660 | /* enable the clock */ | 650 | /* register misc device */ |
661 | priv->clk = clk_get(dev, NULL); | 651 | ret = misc_register(&priv->misc_dev); |
662 | if (IS_ERR(priv->clk)) { | 652 | if (ret < 0) { |
663 | dev_err(dev, "failed to get clock\n"); | 653 | dev_err(dev, "misc_register() for minor %d failed\n", |
664 | ret = -ENODEV; | 654 | MISCDEV_MINOR); |
665 | goto err_free_dma; | 655 | goto err_free_dma; |
666 | } | 656 | } |
667 | 657 | ||
668 | ret = clk_enable(priv->clk); | 658 | ret = clk_enable(priv->clk); |
669 | if (ret < 0) { | 659 | if (ret < 0) { |
670 | dev_err(dev, "failed to enable clock\n"); | 660 | dev_err(dev, "failed to enable clock\n"); |
671 | goto err_put_clk; | 661 | goto err_misc_deregister; |
672 | } | ||
673 | |||
674 | /* request the IRQ */ | ||
675 | irq = platform_get_irq(pdev, 0); | ||
676 | if (irq < 0) { | ||
677 | dev_err(dev, "no IRQ defined\n"); | ||
678 | ret = -ENODEV; | ||
679 | goto err_put_clk; | ||
680 | } | 662 | } |
681 | 663 | ||
682 | ret = request_irq(irq, pxa3xx_gcu_handle_irq, | 664 | for (i = 0; i < 8; i++) { |
683 | 0, DRV_NAME, priv); | 665 | ret = pxa3xx_gcu_add_buffer(dev, priv); |
684 | if (ret) { | 666 | if (ret) { |
685 | dev_err(dev, "request_irq failed\n"); | 667 | dev_err(dev, "failed to allocate DMA memory\n"); |
686 | ret = -EBUSY; | 668 | goto err_disable_clk; |
687 | goto err_put_clk; | 669 | } |
688 | } | 670 | } |
689 | 671 | ||
690 | platform_set_drvdata(pdev, priv); | 672 | platform_set_drvdata(pdev, priv); |
@@ -697,45 +679,28 @@ static int pxa3xx_gcu_probe(struct platform_device *pdev) | |||
697 | SHARED_SIZE, irq); | 679 | SHARED_SIZE, irq); |
698 | return 0; | 680 | return 0; |
699 | 681 | ||
700 | err_put_clk: | ||
701 | clk_disable(priv->clk); | ||
702 | clk_put(priv->clk); | ||
703 | |||
704 | err_free_dma: | 682 | err_free_dma: |
705 | dma_free_coherent(dev, SHARED_SIZE, | 683 | dma_free_coherent(dev, SHARED_SIZE, |
706 | priv->shared, priv->shared_phys); | 684 | priv->shared, priv->shared_phys); |
707 | 685 | ||
708 | err_free_io: | ||
709 | iounmap(priv->mmio_base); | ||
710 | |||
711 | err_free_mem_region: | ||
712 | release_mem_region(r->start, resource_size(r)); | ||
713 | |||
714 | err_misc_deregister: | 686 | err_misc_deregister: |
715 | misc_deregister(&priv->misc_dev); | 687 | misc_deregister(&priv->misc_dev); |
716 | 688 | ||
717 | err_free_priv: | 689 | err_disable_clk: |
718 | pxa3xx_gcu_free_buffers(dev, priv); | 690 | clk_disable(priv->clk); |
719 | kfree(priv); | 691 | |
720 | return ret; | 692 | return ret; |
721 | } | 693 | } |
722 | 694 | ||
723 | static int pxa3xx_gcu_remove(struct platform_device *pdev) | 695 | static int pxa3xx_gcu_remove(struct platform_device *pdev) |
724 | { | 696 | { |
725 | struct pxa3xx_gcu_priv *priv = platform_get_drvdata(pdev); | 697 | struct pxa3xx_gcu_priv *priv = platform_get_drvdata(pdev); |
726 | struct resource *r = priv->resource_mem; | ||
727 | struct device *dev = &pdev->dev; | 698 | struct device *dev = &pdev->dev; |
728 | 699 | ||
729 | pxa3xx_gcu_wait_idle(priv); | 700 | pxa3xx_gcu_wait_idle(priv); |
730 | |||
731 | misc_deregister(&priv->misc_dev); | 701 | misc_deregister(&priv->misc_dev); |
732 | dma_free_coherent(dev, SHARED_SIZE, | 702 | dma_free_coherent(dev, SHARED_SIZE, priv->shared, priv->shared_phys); |
733 | priv->shared, priv->shared_phys); | ||
734 | iounmap(priv->mmio_base); | ||
735 | release_mem_region(r->start, resource_size(r)); | ||
736 | clk_disable(priv->clk); | ||
737 | pxa3xx_gcu_free_buffers(dev, priv); | 703 | pxa3xx_gcu_free_buffers(dev, priv); |
738 | kfree(priv); | ||
739 | 704 | ||
740 | return 0; | 705 | return 0; |
741 | } | 706 | } |