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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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.

>        return 0;
>  fail:
>        writel(0, addr + APB_DMA_GEN);
> --
> 1.7.4.1
>
>
--
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


[Index of Archives]     [ARM Kernel]     [Linux ARM]     [Linux ARM MSM]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux