diff options
author | Andrew Jackson <Andrew.Jackson@arm.com> | 2014-11-06 06:39:47 -0500 |
---|---|---|
committer | Vinod Koul <vinod.koul@intel.com> | 2014-11-17 03:20:34 -0500 |
commit | cee42392f5f0482d5cc71635a9c57b4ccdadb886 (patch) | |
tree | 8720d4f171bf5f344a7ca06bcc0a8cade3ee5e3f | |
parent | 6d80f45f502e9f5270993122ac477a06176aa368 (diff) |
dmaengine: pl330: Correct device assignment.
Commit f6f2421c0a1c removed pl330_info structure by embedding it into
pl330_dmac structure, but did not ensure that the dmac->ddma.dev
pointer gets initialised before use. When dma_alloc_coherent() gets
called on arm64 a WARN() gets triggered due to dev being NULL.
------------[ cut here ]------------
WARNING: CPU: 1 PID: 1 at arch/arm64/mm/dma-mapping.c:49 __dma_alloc_coherent+0xd0/0xe0()
Use an actual device structure for DMA allocation
Modules linked in:
CPU: 1 PID: 1 Comm: swapper/0 Not tainted 3.17.0+ #5
Call trace:
[<ffffffc000087f24>] dump_backtrace+0x0/0x130
[<ffffffc000088064>] show_stack+0x10/0x1c
[<ffffffc0004e8af8>] dump_stack+0x74/0xb8
[<ffffffc0000aa444>] warn_slowpath_common+0x8c/0xb4
[<ffffffc0000aa4b8>] warn_slowpath_fmt+0x4c/0x58
[<ffffffc000092580>] __dma_alloc_coherent+0xcc/0xe0
[<ffffffc000092734>] __dma_alloc_noncoherent+0x64/0x158
[<ffffffc000312cd8>] pl330_probe+0x650/0x8f0
[<ffffffc00030e1d4>] amba_probe+0xa0/0xc8
[<ffffffc000350240>] really_probe+0xc4/0x22c
[<ffffffc0003504b4>] __driver_attach+0xa0/0xa8
[<ffffffc00034e5fc>] bus_for_each_dev+0x54/0x98
[<ffffffc00034fd8c>] driver_attach+0x1c/0x28
[<ffffffc00034fa08>] bus_add_driver+0x14c/0x204
[<ffffffc000350b84>] driver_register+0x64/0x130
[<ffffffc00030dcf8>] amba_driver_register+0x50/0x5c
[<ffffffc0006a60d0>] pl330_driver_init+0x10/0x1c
[<ffffffc0000814ac>] do_one_initcall+0x88/0x19c
[<ffffffc00068dab8>] kernel_init_freeable+0x140/0x1e0
[<ffffffc0004e5e18>] kernel_init+0x10/0xd4
---[ end trace 76f2d47a444e523e ]---
(NULL device *): dmac_alloc_resources:1821 Can't allocate memory!
(NULL device *): Unable to create channels for DMAC
This patch will also ensure that any dev_err messages are printed
with the appropriate device name.
Signed-off-by: Liviu Dudau <Liviu.Dudau@arm.com>
Signed-off-by: Andrew Jackson <Andrew.Jackson@arm.com>
Signed-off-by: Vinod Koul <vinod.koul@intel.com>
-rw-r--r-- | drivers/dma/pl330.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/drivers/dma/pl330.c b/drivers/dma/pl330.c index 4839bfa74a10..83e2257c324a 100644 --- a/drivers/dma/pl330.c +++ b/drivers/dma/pl330.c | |||
@@ -2610,6 +2610,9 @@ pl330_probe(struct amba_device *adev, const struct amba_id *id) | |||
2610 | return -ENOMEM; | 2610 | return -ENOMEM; |
2611 | } | 2611 | } |
2612 | 2612 | ||
2613 | pd = &pl330->ddma; | ||
2614 | pd->dev = &adev->dev; | ||
2615 | |||
2613 | pl330->mcbufsz = pdat ? pdat->mcbuf_sz : 0; | 2616 | pl330->mcbufsz = pdat ? pdat->mcbuf_sz : 0; |
2614 | 2617 | ||
2615 | res = &adev->res; | 2618 | res = &adev->res; |
@@ -2646,7 +2649,6 @@ pl330_probe(struct amba_device *adev, const struct amba_id *id) | |||
2646 | if (!add_desc(pl330, GFP_KERNEL, NR_DEFAULT_DESC)) | 2649 | if (!add_desc(pl330, GFP_KERNEL, NR_DEFAULT_DESC)) |
2647 | dev_warn(&adev->dev, "unable to allocate desc\n"); | 2650 | dev_warn(&adev->dev, "unable to allocate desc\n"); |
2648 | 2651 | ||
2649 | pd = &pl330->ddma; | ||
2650 | INIT_LIST_HEAD(&pd->channels); | 2652 | INIT_LIST_HEAD(&pd->channels); |
2651 | 2653 | ||
2652 | /* Initialize channel parameters */ | 2654 | /* Initialize channel parameters */ |
@@ -2683,7 +2685,6 @@ pl330_probe(struct amba_device *adev, const struct amba_id *id) | |||
2683 | list_add_tail(&pch->chan.device_node, &pd->channels); | 2685 | list_add_tail(&pch->chan.device_node, &pd->channels); |
2684 | } | 2686 | } |
2685 | 2687 | ||
2686 | pd->dev = &adev->dev; | ||
2687 | if (pdat) { | 2688 | if (pdat) { |
2688 | pd->cap_mask = pdat->cap_mask; | 2689 | pd->cap_mask = pdat->cap_mask; |
2689 | } else { | 2690 | } else { |