1*017f11f6SPeter Tyser /* 2*017f11f6SPeter Tyser * Copyright 2004,2007,2008 Freescale Semiconductor, Inc. 3*017f11f6SPeter Tyser * (C) Copyright 2002, 2003 Motorola Inc. 4*017f11f6SPeter Tyser * Xianghua Xiao (X.Xiao@motorola.com) 5*017f11f6SPeter Tyser * 6*017f11f6SPeter Tyser * (C) Copyright 2000 7*017f11f6SPeter Tyser * Wolfgang Denk, DENX Software Engineering, wd@denx.de. 8*017f11f6SPeter Tyser * 9*017f11f6SPeter Tyser * See file CREDITS for list of people who contributed to this 10*017f11f6SPeter Tyser * project. 11*017f11f6SPeter Tyser * 12*017f11f6SPeter Tyser * This program is free software; you can redistribute it and/or 13*017f11f6SPeter Tyser * modify it under the terms of the GNU General Public License as 14*017f11f6SPeter Tyser * published by the Free Software Foundation; either version 2 of 15*017f11f6SPeter Tyser * the License, or (at your option) any later version. 16*017f11f6SPeter Tyser * 17*017f11f6SPeter Tyser * This program is distributed in the hope that it will be useful, 18*017f11f6SPeter Tyser * but WITHOUT ANY WARRANTY; without even the implied warranty of 19*017f11f6SPeter Tyser * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 20*017f11f6SPeter Tyser * GNU General Public License for more details. 21*017f11f6SPeter Tyser * 22*017f11f6SPeter Tyser * You should have received a copy of the GNU General Public License 23*017f11f6SPeter Tyser * along with this program; if not, write to the Free Software 24*017f11f6SPeter Tyser * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 25*017f11f6SPeter Tyser * MA 02111-1307 USA 26*017f11f6SPeter Tyser */ 27*017f11f6SPeter Tyser 28*017f11f6SPeter Tyser #include <config.h> 29*017f11f6SPeter Tyser #include <common.h> 30*017f11f6SPeter Tyser #include <asm/fsl_dma.h> 31*017f11f6SPeter Tyser 32*017f11f6SPeter Tyser #if defined(CONFIG_MPC85xx) 33*017f11f6SPeter Tyser volatile ccsr_dma_t *dma_base = (void *)(CONFIG_SYS_MPC85xx_DMA_ADDR); 34*017f11f6SPeter Tyser #elif defined(CONFIG_MPC86xx) 35*017f11f6SPeter Tyser volatile ccsr_dma_t *dma_base = (void *)(CONFIG_SYS_MPC86xx_DMA_ADDR); 36*017f11f6SPeter Tyser #else 37*017f11f6SPeter Tyser #error "Freescale DMA engine not supported on your processor" 38*017f11f6SPeter Tyser #endif 39*017f11f6SPeter Tyser 40*017f11f6SPeter Tyser static void dma_sync(void) 41*017f11f6SPeter Tyser { 42*017f11f6SPeter Tyser #if defined(CONFIG_MPC85xx) 43*017f11f6SPeter Tyser asm("sync; isync; msync"); 44*017f11f6SPeter Tyser #elif defined(CONFIG_MPC86xx) 45*017f11f6SPeter Tyser asm("sync; isync"); 46*017f11f6SPeter Tyser #endif 47*017f11f6SPeter Tyser } 48*017f11f6SPeter Tyser 49*017f11f6SPeter Tyser static uint dma_check(void) { 50*017f11f6SPeter Tyser volatile fsl_dma_t *dma = &dma_base->dma[0]; 51*017f11f6SPeter Tyser volatile uint status = dma->sr; 52*017f11f6SPeter Tyser 53*017f11f6SPeter Tyser /* While the channel is busy, spin */ 54*017f11f6SPeter Tyser while (status & 4) 55*017f11f6SPeter Tyser status = dma->sr; 56*017f11f6SPeter Tyser 57*017f11f6SPeter Tyser /* clear MR[CS] channel start bit */ 58*017f11f6SPeter Tyser dma->mr &= 1; 59*017f11f6SPeter Tyser dma_sync(); 60*017f11f6SPeter Tyser 61*017f11f6SPeter Tyser if (status != 0) 62*017f11f6SPeter Tyser printf ("DMA Error: status = %x\n", status); 63*017f11f6SPeter Tyser 64*017f11f6SPeter Tyser return status; 65*017f11f6SPeter Tyser } 66*017f11f6SPeter Tyser 67*017f11f6SPeter Tyser void dma_init(void) { 68*017f11f6SPeter Tyser volatile fsl_dma_t *dma = &dma_base->dma[0]; 69*017f11f6SPeter Tyser 70*017f11f6SPeter Tyser dma->satr = 0x00040000; 71*017f11f6SPeter Tyser dma->datr = 0x00040000; 72*017f11f6SPeter Tyser dma->sr = 0xffffffff; /* clear any errors */ 73*017f11f6SPeter Tyser dma_sync(); 74*017f11f6SPeter Tyser } 75*017f11f6SPeter Tyser 76*017f11f6SPeter Tyser int dma_xfer(void *dest, uint count, void *src) { 77*017f11f6SPeter Tyser volatile fsl_dma_t *dma = &dma_base->dma[0]; 78*017f11f6SPeter Tyser 79*017f11f6SPeter Tyser dma->dar = (uint) dest; 80*017f11f6SPeter Tyser dma->sar = (uint) src; 81*017f11f6SPeter Tyser dma->bcr = count; 82*017f11f6SPeter Tyser 83*017f11f6SPeter Tyser /* Disable bandwidth control, use direct transfer mode */ 84*017f11f6SPeter Tyser dma->mr = 0xf000004; 85*017f11f6SPeter Tyser dma_sync(); 86*017f11f6SPeter Tyser 87*017f11f6SPeter Tyser /* Start the transfer */ 88*017f11f6SPeter Tyser dma->mr = 0xf000005; 89*017f11f6SPeter Tyser dma_sync(); 90*017f11f6SPeter Tyser 91*017f11f6SPeter Tyser return dma_check(); 92*017f11f6SPeter Tyser } 93