[PATCH] [3.3] ARM: tegra: use APB DMA for accessing APB devices

Olof Johansson olof at lixom.net
Tue Oct 18 14:55:04 EDT 2011


On Tue, Oct 18, 2011 at 11:37 AM, Colin Cross <ccross at android.com> wrote:
> On Tue, Oct 18, 2011 at 11:18 AM, Olof Johansson <olof at lixom.net> wrote:
>> From: Jon Mayo <jmayo at nvidia.com>
>>
>> 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 at nvidia.com>, improved by Colin Cross <ccross at android.com>
>> and later moved to separate driver by Jon Mayo <jmayo at nvidia.com>.
>>
>> Signed-off-by: Jon Mayo <jmayo at nvidia.com>
>> [olof: hooked up init calls to dma init, minor cleanups]
>> Signed-off-by: Olof Johansson <olof at lixom.net>
>> ---
>>  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



More information about the linux-arm-kernel mailing list