aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/video
diff options
context:
space:
mode:
authorDaniel Mack <zonque@gmail.com>2014-03-05 11:12:49 -0500
committerTomi Valkeinen <tomi.valkeinen@ti.com>2014-03-07 08:04:53 -0500
commita9b47c7f23908bf2a5536040c46624178ba5f5c0 (patch)
tree71afdfb12933fc3951b9b5d750c70879427345a2 /drivers/video
parent3437b2b83f3bdb99ae4ffc2fd1e1608d6e06fffe (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.c113
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
700err_put_clk:
701 clk_disable(priv->clk);
702 clk_put(priv->clk);
703
704err_free_dma: 682err_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
708err_free_io:
709 iounmap(priv->mmio_base);
710
711err_free_mem_region:
712 release_mem_region(r->start, resource_size(r));
713
714err_misc_deregister: 686err_misc_deregister:
715 misc_deregister(&priv->misc_dev); 687 misc_deregister(&priv->misc_dev);
716 688
717err_free_priv: 689err_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
723static int pxa3xx_gcu_remove(struct platform_device *pdev) 695static 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}