linux/arch/arm/mach-tegra
Stephen Warren ccac05152e ARM: Tegra: DMA: Fail safe if initialization fails
tegra_dma_init currently simply bails out early if any initialization fails.
This skips various data-structure initialization. In turn, this means that
tegra_dma_allocate_channel can still hand out channels. In this case, when
tegra_dma_free_channel is called, which calls tegra_dma_cancel, the walking
on ch->list will OOPS since the list's next/prev pointers may still be
NULL.

To solve this, add an explicit "initialized" flag, only set this once _init
has fully completed successfully, and have _allocate_channel refuse to hand
out channels if this is not set.

While at it, simplify _init:
* Remove redundant memsets
* Use bitmap_fill to mark all channels as in-use up-front, and remove
  some now-redundant bitmap initialization loops.
* Only mark a channel as free once all channel-related initialization has
  completed.

Finally, the successful exit path from _init always has ret==0, so just
hard-code that return. The error path still returns ret.

Signed-off-by: Stephen Warren <swarren@nvidia.com>
Signed-off-by: Colin Cross <ccross@android.com>
2011-02-23 14:06:03 -08:00
..
2011-02-22 17:28:11 -08:00
2011-02-22 17:28:11 -08:00
2010-08-05 14:57:02 -07:00
2010-08-05 14:57:01 -07:00
2011-01-14 12:06:26 +00:00
2010-10-21 18:11:24 -07:00
2011-02-09 22:18:30 -08:00
2010-08-05 14:57:01 -07:00
2010-10-21 18:13:02 -07:00
2011-01-06 22:32:52 +00:00