xref: /rk3399_rockchip-uboot/drivers/dma/fsl_dma.c (revision 017f11f68ef543e866be033bcb7b8058a8a380d8)
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