ARM: omap: move dma channel allocation into plat-omap code
authorRussell King <rmk+kernel@arm.linux.org.uk>
Fri, 8 Nov 2013 18:10:42 +0000 (18:10 +0000)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Thu, 3 Apr 2014 23:31:46 +0000 (00:31 +0100)
This really needs to be there, because otherwise the plat-omap code can
kfree() this data structure, and then re-use the pointer later.

Acked-by: Tony Lindgren <tony@atomide.com>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
arch/arm/mach-omap1/dma.c
arch/arm/mach-omap2/dma.c
arch/arm/plat-omap/dma.c
include/linux/omap-dma.h

index c979e3f88bbb51f040b101b195619909a3edbe7e..d170f7d0a6ac756117db30ccf183ad325c6c299d 100644 (file)
@@ -325,17 +325,6 @@ static int __init omap1_system_dma_init(void)
        d->dev_caps             |= CLEAR_CSR_ON_READ;
        d->dev_caps             |= IS_WORD_16;
 
-
-       d->chan = kzalloc(sizeof(struct omap_dma_lch) *
-                                       (d->lch_count), GFP_KERNEL);
-       if (!d->chan) {
-               dev_err(&pdev->dev,
-                       "%s: Memory allocation failed for d->chan!\n",
-                       __func__);
-               ret = -ENOMEM;
-               goto exit_release_d;
-       }
-
        if (cpu_is_omap15xx())
                d->chan_count = 9;
        else if (cpu_is_omap16xx() || cpu_is_omap7xx()) {
@@ -359,14 +348,14 @@ static int __init omap1_system_dma_init(void)
        if (ret) {
                dev_err(&pdev->dev, "%s: Unable to add resources for %s%d\n",
                        __func__, pdev->name, pdev->id);
-               goto exit_release_chan;
+               goto exit_release_d;
        }
 
        ret = platform_device_add(pdev);
        if (ret) {
                dev_err(&pdev->dev, "%s: Unable to add resources for %s%d\n",
                        __func__, pdev->name, pdev->id);
-               goto exit_release_chan;
+               goto exit_release_d;
        }
 
        dma_pdev = platform_device_register_full(&omap_dma_dev_info);
@@ -379,8 +368,6 @@ static int __init omap1_system_dma_init(void)
 
 exit_release_pdev:
        platform_device_del(pdev);
-exit_release_chan:
-       kfree(d->chan);
 exit_release_d:
        kfree(d);
 exit_release_p:
index 244ff5012aeddf8a3583b6ddfdebff24f12c76ea..9f210d637354386c8b808d3669a1e0851430abdf 100644 (file)
@@ -251,13 +251,6 @@ static int __init omap2_system_dma_init_dev(struct omap_hwmod *oh, void *unused)
        }
 
        d = oh->dev_attr;
-       d->chan = kzalloc(sizeof(struct omap_dma_lch) *
-                                       (d->lch_count), GFP_KERNEL);
-
-       if (!d->chan) {
-               dev_err(&pdev->dev, "%s: kzalloc fail\n", __func__);
-               return -ENOMEM;
-       }
 
        if (cpu_is_omap34xx() && (omap_type() != OMAP2_DEVICE_TYPE_GP))
                d->dev_caps |= HS_CHANNELS_RESERVED;
index d4d9a5e62152712097eb4664e3442c264a911542..5f5b975887fc8424723d6566d687c82cf54328bc 100644 (file)
@@ -2030,9 +2030,16 @@ static int omap_system_dma_probe(struct platform_device *pdev)
 
        dma_lch_count           = d->lch_count;
        dma_chan_count          = dma_lch_count;
-       dma_chan                = d->chan;
        enable_1510_mode        = d->dev_caps & ENABLE_1510_MODE;
 
+       dma_chan = devm_kcalloc(&pdev->dev, dma_lch_count,
+                               sizeof(struct omap_dma_lch), GFP_KERNEL);
+       if (!dma_chan) {
+               dev_err(&pdev->dev, "%s: kzalloc fail\n", __func__);
+               return -ENOMEM;
+       }
+
+
        if (dma_omap2plus()) {
                dma_linked_lch = kzalloc(sizeof(struct dma_link_info) *
                                                dma_lch_count, GFP_KERNEL);
@@ -2117,7 +2124,6 @@ exit_dma_irq_fail:
        }
 
 exit_dma_lch_fail:
-       kfree(dma_chan);
        return ret;
 }
 
@@ -2137,7 +2143,6 @@ static int omap_system_dma_remove(struct platform_device *pdev)
                        free_irq(dma_irq, (void *)(irq_rel + 1));
                }
        }
-       kfree(dma_chan);
        return 0;
 }
 
index 41328725721ae12f696bc151a0b7a25587681ede..7813636a193da8a3e5a45de51c776336d1e782e9 100644 (file)
@@ -268,7 +268,6 @@ struct omap_dma_dev_attr {
        u32 dev_caps;
        u16 lch_count;
        u16 chan_count;
-       struct omap_dma_lch *chan;
 };
 
 enum {