diff options
author | Guennadi Liakhovetski <g.liakhovetski@gmx.de> | 2013-07-02 11:45:55 -0400 |
---|---|---|
committer | Vinod Koul <vinod.koul@intel.com> | 2013-08-27 04:54:19 -0400 |
commit | c1c63a14f4f2419d093acd7164eccdff315baa86 (patch) | |
tree | 6e49bb37b43512da60e934f7ef47d484f807a59d /drivers/dma | |
parent | ca8b387803072a16baf6d8090591b10bfdf4e253 (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.c | 11 | ||||
-rw-r--r-- | drivers/dma/sh/shdma.c | 66 | ||||
-rw-r--r-- | drivers/dma/sh/sudmac.c | 1 |
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) | |||
831 | int shdma_request_irq(struct shdma_chan *schan, int irq, | 831 | int 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 | } |
841 | EXPORT_SYMBOL(shdma_request_irq); | 841 | EXPORT_SYMBOL(shdma_request_irq); |
842 | 842 | ||
843 | void shdma_free_irq(struct shdma_chan *schan) | ||
844 | { | ||
845 | if (schan->irq >= 0) | ||
846 | free_irq(schan->irq, schan); | ||
847 | } | ||
848 | EXPORT_SYMBOL(shdma_free_irq); | ||
849 | |||
850 | void shdma_chan_probe(struct shdma_dev *sdev, | 843 | void 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, | |||
551 | err_no_irq: | 552 | err_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); | ||
876 | eirq_err: | 859 | eirq_err: |
877 | #endif | 860 | #endif |
878 | rst_err: | 861 | rst_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); |
888 | eshdma: | 871 | eshdma: |
889 | if (dmars) | ||
890 | iounmap(shdev->dmars); | ||
891 | emapdmars: | ||
892 | iounmap(shdev->chan_reg); | ||
893 | synchronize_rcu(); | 872 | synchronize_rcu(); |
894 | emapchan: | ||
895 | kfree(shdev); | ||
896 | ealloc: | ||
897 | if (dmars) | ||
898 | release_mem_region(dmars->start, resource_size(dmars)); | ||
899 | ermrdmars: | ||
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; |