aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/dma
diff options
context:
space:
mode:
authorGuennadi Liakhovetski <g.liakhovetski@gmx.de>2013-07-02 11:45:55 -0400
committerVinod Koul <vinod.koul@intel.com>2013-08-27 04:54:19 -0400
commitc1c63a14f4f2419d093acd7164eccdff315baa86 (patch)
tree6e49bb37b43512da60e934f7ef47d484f807a59d /drivers/dma
parentca8b387803072a16baf6d8090591b10bfdf4e253 (diff)
DMA: shdma: switch to managed resource allocation
Switch shdma to using devm_* managed functions for allocation of memory, requesting IRQs, mapping IO resources etc. Signed-off-by: Guennadi Liakhovetski <g.liakhovetski+renesas@gmail.com> Signed-off-by: Vinod Koul <vinod.koul@intel.com>
Diffstat (limited to 'drivers/dma')
-rw-r--r--drivers/dma/sh/shdma-base.c11
-rw-r--r--drivers/dma/sh/shdma.c66
-rw-r--r--drivers/dma/sh/sudmac.c1
3 files changed, 15 insertions, 63 deletions
diff --git a/drivers/dma/sh/shdma-base.c b/drivers/dma/sh/shdma-base.c
index 28ca36121631..c5ea256c2819 100644
--- a/drivers/dma/sh/shdma-base.c
+++ b/drivers/dma/sh/shdma-base.c
@@ -831,8 +831,8 @@ static irqreturn_t chan_irqt(int irq, void *dev)
831int shdma_request_irq(struct shdma_chan *schan, int irq, 831int shdma_request_irq(struct shdma_chan *schan, int irq,
832 unsigned long flags, const char *name) 832 unsigned long flags, const char *name)
833{ 833{
834 int ret = request_threaded_irq(irq, chan_irq, chan_irqt, 834 int ret = devm_request_threaded_irq(schan->dev, irq, chan_irq,
835 flags, name, schan); 835 chan_irqt, flags, name, schan);
836 836
837 schan->irq = ret < 0 ? ret : irq; 837 schan->irq = ret < 0 ? ret : irq;
838 838
@@ -840,13 +840,6 @@ int shdma_request_irq(struct shdma_chan *schan, int irq,
840} 840}
841EXPORT_SYMBOL(shdma_request_irq); 841EXPORT_SYMBOL(shdma_request_irq);
842 842
843void shdma_free_irq(struct shdma_chan *schan)
844{
845 if (schan->irq >= 0)
846 free_irq(schan->irq, schan);
847}
848EXPORT_SYMBOL(shdma_free_irq);
849
850void shdma_chan_probe(struct shdma_dev *sdev, 843void shdma_chan_probe(struct shdma_dev *sdev,
851 struct shdma_chan *schan, int id) 844 struct shdma_chan *schan, int id)
852{ 845{
diff --git a/drivers/dma/sh/shdma.c b/drivers/dma/sh/shdma.c
index 53bd6308fc2f..e507bb285fd0 100644
--- a/drivers/dma/sh/shdma.c
+++ b/drivers/dma/sh/shdma.c
@@ -515,7 +515,8 @@ static int sh_dmae_chan_probe(struct sh_dmae_device *shdev, int id,
515 struct shdma_chan *schan; 515 struct shdma_chan *schan;
516 int err; 516 int err;
517 517
518 sh_chan = kzalloc(sizeof(struct sh_dmae_chan), GFP_KERNEL); 518 sh_chan = devm_kzalloc(sdev->dma_dev.dev, sizeof(struct sh_dmae_chan),
519 GFP_KERNEL);
519 if (!sh_chan) { 520 if (!sh_chan) {
520 dev_err(sdev->dma_dev.dev, 521 dev_err(sdev->dma_dev.dev,
521 "No free memory for allocating dma channels!\n"); 522 "No free memory for allocating dma channels!\n");
@@ -551,7 +552,6 @@ static int sh_dmae_chan_probe(struct sh_dmae_device *shdev, int id,
551err_no_irq: 552err_no_irq:
552 /* remove from dmaengine device node */ 553 /* remove from dmaengine device node */
553 shdma_chan_remove(schan); 554 shdma_chan_remove(schan);
554 kfree(sh_chan);
555 return err; 555 return err;
556} 556}
557 557
@@ -562,14 +562,9 @@ static void sh_dmae_chan_remove(struct sh_dmae_device *shdev)
562 int i; 562 int i;
563 563
564 shdma_for_each_chan(schan, &shdev->shdma_dev, i) { 564 shdma_for_each_chan(schan, &shdev->shdma_dev, i) {
565 struct sh_dmae_chan *sh_chan = container_of(schan,
566 struct sh_dmae_chan, shdma_chan);
567 BUG_ON(!schan); 565 BUG_ON(!schan);
568 566
569 shdma_free_irq(&sh_chan->shdma_chan);
570
571 shdma_chan_remove(schan); 567 shdma_chan_remove(schan);
572 kfree(sh_chan);
573 } 568 }
574 dma_dev->chancnt = 0; 569 dma_dev->chancnt = 0;
575} 570}
@@ -706,33 +701,22 @@ static int sh_dmae_probe(struct platform_device *pdev)
706 if (!chan || !errirq_res) 701 if (!chan || !errirq_res)
707 return -ENODEV; 702 return -ENODEV;
708 703
709 if (!request_mem_region(chan->start, resource_size(chan), pdev->name)) { 704 shdev = devm_kzalloc(&pdev->dev, sizeof(struct sh_dmae_device),
710 dev_err(&pdev->dev, "DMAC register region already claimed\n"); 705 GFP_KERNEL);
711 return -EBUSY;
712 }
713
714 if (dmars && !request_mem_region(dmars->start, resource_size(dmars), pdev->name)) {
715 dev_err(&pdev->dev, "DMAC DMARS region already claimed\n");
716 err = -EBUSY;
717 goto ermrdmars;
718 }
719
720 err = -ENOMEM;
721 shdev = kzalloc(sizeof(struct sh_dmae_device), GFP_KERNEL);
722 if (!shdev) { 706 if (!shdev) {
723 dev_err(&pdev->dev, "Not enough memory\n"); 707 dev_err(&pdev->dev, "Not enough memory\n");
724 goto ealloc; 708 return -ENOMEM;
725 } 709 }
726 710
727 dma_dev = &shdev->shdma_dev.dma_dev; 711 dma_dev = &shdev->shdma_dev.dma_dev;
728 712
729 shdev->chan_reg = ioremap(chan->start, resource_size(chan)); 713 shdev->chan_reg = devm_ioremap_resource(&pdev->dev, chan);
730 if (!shdev->chan_reg) 714 if (IS_ERR(shdev->chan_reg))
731 goto emapchan; 715 return PTR_ERR(shdev->chan_reg);
732 if (dmars) { 716 if (dmars) {
733 shdev->dmars = ioremap(dmars->start, resource_size(dmars)); 717 shdev->dmars = devm_ioremap_resource(&pdev->dev, dmars);
734 if (!shdev->dmars) 718 if (IS_ERR(shdev->dmars))
735 goto emapdmars; 719 return PTR_ERR(shdev->dmars);
736 } 720 }
737 721
738 if (!pdata->slave_only) 722 if (!pdata->slave_only)
@@ -793,8 +777,8 @@ static int sh_dmae_probe(struct platform_device *pdev)
793 777
794 errirq = errirq_res->start; 778 errirq = errirq_res->start;
795 779
796 err = request_irq(errirq, sh_dmae_err, irqflags, 780 err = devm_request_irq(&pdev->dev, errirq, sh_dmae_err, irqflags,
797 "DMAC Address Error", shdev); 781 "DMAC Address Error", shdev);
798 if (err) { 782 if (err) {
799 dev_err(&pdev->dev, 783 dev_err(&pdev->dev,
800 "DMA failed requesting irq #%d, error %d\n", 784 "DMA failed requesting irq #%d, error %d\n",
@@ -872,7 +856,6 @@ chan_probe_err:
872 sh_dmae_chan_remove(shdev); 856 sh_dmae_chan_remove(shdev);
873 857
874#if defined(CONFIG_CPU_SH4) || defined(CONFIG_ARCH_SHMOBILE) 858#if defined(CONFIG_CPU_SH4) || defined(CONFIG_ARCH_SHMOBILE)
875 free_irq(errirq, shdev);
876eirq_err: 859eirq_err:
877#endif 860#endif
878rst_err: 861rst_err:
@@ -886,18 +869,7 @@ rst_err:
886 platform_set_drvdata(pdev, NULL); 869 platform_set_drvdata(pdev, NULL);
887 shdma_cleanup(&shdev->shdma_dev); 870 shdma_cleanup(&shdev->shdma_dev);
888eshdma: 871eshdma:
889 if (dmars)
890 iounmap(shdev->dmars);
891emapdmars:
892 iounmap(shdev->chan_reg);
893 synchronize_rcu(); 872 synchronize_rcu();
894emapchan:
895 kfree(shdev);
896ealloc:
897 if (dmars)
898 release_mem_region(dmars->start, resource_size(dmars));
899ermrdmars:
900 release_mem_region(chan->start, resource_size(chan));
901 873
902 return err; 874 return err;
903} 875}
@@ -923,21 +895,9 @@ static int sh_dmae_remove(struct platform_device *pdev)
923 sh_dmae_chan_remove(shdev); 895 sh_dmae_chan_remove(shdev);
924 shdma_cleanup(&shdev->shdma_dev); 896 shdma_cleanup(&shdev->shdma_dev);
925 897
926 if (shdev->dmars)
927 iounmap(shdev->dmars);
928 iounmap(shdev->chan_reg);
929
930 platform_set_drvdata(pdev, NULL); 898 platform_set_drvdata(pdev, NULL);
931 899
932 synchronize_rcu(); 900 synchronize_rcu();
933 kfree(shdev);
934
935 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
936 if (res)
937 release_mem_region(res->start, resource_size(res));
938 res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
939 if (res)
940 release_mem_region(res->start, resource_size(res));
941 901
942 return 0; 902 return 0;
943} 903}
diff --git a/drivers/dma/sh/sudmac.c b/drivers/dma/sh/sudmac.c
index e7c94bbddb53..347790167e59 100644
--- a/drivers/dma/sh/sudmac.c
+++ b/drivers/dma/sh/sudmac.c
@@ -302,7 +302,6 @@ static void sudmac_chan_remove(struct sudmac_device *su_dev)
302 302
303 BUG_ON(!schan); 303 BUG_ON(!schan);
304 304
305 shdma_free_irq(&sc->shdma_chan);
306 shdma_chan_remove(schan); 305 shdma_chan_remove(schan);
307 } 306 }
308 dma_dev->chancnt = 0; 307 dma_dev->chancnt = 0;