On Tue, Oct 18, 2011 at 11:37 AM, Colin Cross <ccross@xxxxxxxxxxx> wrote: > On Tue, Oct 18, 2011 at 11:18 AM, Olof Johansson <olof@xxxxxxxxx> wrote: >> From: Jon Mayo <jmayo@xxxxxxxxxx> >> >> Tegra2 hangs if APB registers are accessed from the cpu during an >> apb dma operation. The workaround is to use apb dma to read/write the >> registers instead. >> >> There is a dependency loop between fuses, clocks, and APBDMA. If dma >> is enabled, fuse reads must go through APBDMA to avoid corruption due >> to a hw bug. APBDMA requires a clock to be enabled. Clocks must read >> a fuse to determine allowable cpu frequencies. >> >> Separate out the fuse DMA initialization, and allow the fuse read >> and write functions to be called without using DMA before the DMA >> initialization has been completed. Access to the fuses before APBDMA >> is initialized won't hit the hardware bug because nothing else can be >> using DMA. >> >> Original fuse registar access code from Varun Wadekar >> <vwadekar@xxxxxxxxxx>, improved by Colin Cross <ccross@xxxxxxxxxxx> >> and later moved to separate driver by Jon Mayo <jmayo@xxxxxxxxxx>. >> >> Signed-off-by: Jon Mayo <jmayo@xxxxxxxxxx> >> [olof: hooked up init calls to dma init, minor cleanups] >> Signed-off-by: Olof Johansson <olof@xxxxxxxxx> >> --- >> arch/arm/mach-tegra/Makefile | 1 + >> arch/arm/mach-tegra/apbio.c | 149 ++++++++++++++++++++++++++++++++++++++++++ >> arch/arm/mach-tegra/apbio.h | 22 ++++++ >> arch/arm/mach-tegra/dma.c | 4 + >> 4 files changed, 176 insertions(+), 0 deletions(-) >> create mode 100644 arch/arm/mach-tegra/apbio.c >> create mode 100644 arch/arm/mach-tegra/apbio.h >> > <snip> > >> diff --git a/arch/arm/mach-tegra/dma.c b/arch/arm/mach-tegra/dma.c >> index c0cf967..b7b6957 100644 >> --- a/arch/arm/mach-tegra/dma.c >> +++ b/arch/arm/mach-tegra/dma.c >> @@ -33,6 +33,8 @@ >> #include <mach/iomap.h> >> #include <mach/suspend.h> >> >> +#include "apbio.h" >> + >> #define APB_DMA_GEN 0x000 >> #define GEN_ENABLE (1<<31) >> >> @@ -735,6 +737,8 @@ int __init tegra_dma_init(void) >> >> tegra_dma_initialized = true; >> >> + tegra_init_apb_dma(); >> + > It seems wrong for the dma api init to call init on one of the users > of the dma api. For explicit ordering dependencies like this, maybe > postcore_initcall is not the right way to trigger tegra_dma_init. Yeah, it's not ideal but moving dma init to an explicit call isn't a great solution either. Pick your poison. :) Driver probe deferral should help here since it'll make it possible to describe the dependencies. Until that's merged, how about a big ugly comment saying: /* FIXME: move apb_dma init to deferred driver probe model instead */ -Olof -- To unsubscribe from this list: send the line "unsubscribe linux-tegra" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html