Fix onda red. Unlike all other targets, it built the whole backlight driver in the...
[kugel-rb.git] / firmware / target / mips / ingenic_jz47xx / dma_acc-jz4740.c
blobc4d79a7567aeed97cae6867f2a4ba6bd6d0f2c33
1 /***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
10 * Copyright (C) 2008 by Maurus Cuelenaere
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
20 ****************************************************************************/
22 #include "system.h"
24 void memset(void *target, unsigned char c, size_t len)
26 int ch = DMA_CHANNEL;
27 unsigned int d;
28 unsigned char *dp;
30 if(len < 32)
31 _memset(target,c,len);
32 else
34 if(((unsigned int)target < 0xa0000000) && len)
35 dma_cache_wback_inv((unsigned long)target, len);
37 dp = (unsigned char *)((unsigned int)(&d) | 0xa0000000);
38 *(dp + 0) = c;
39 *(dp + 1) = c;
40 *(dp + 2) = c;
41 *(dp + 3) = c;
42 REG_DMAC_DSAR(ch) = PHYSADDR((unsigned long)dp);
43 REG_DMAC_DTAR(ch) = PHYSADDR((unsigned long)target);
44 REG_DMAC_DTCR(ch) = len / 32;
45 REG_DMAC_DRSR(ch) = DMAC_DRSR_RS_AUTO;
46 REG_DMAC_DCMD(ch) = DMAC_DCMD_DAI | DMAC_DCMD_SWDH_32 | DMAC_DCMD_DWDH_32 | DMAC_DCMD_DS_32BYTE;
47 REG_DMAC_DCCSR(ch) = DMAC_DCCSR_EN | DMAC_DCCSR_NDES;
49 while (REG_DMAC_DTCR(ch));
50 if(len % 32)
52 dp = (unsigned char *)((unsigned int)target + (len & (32 - 1)));
53 for(d = 0;d < (len % 32); d++)
54 *dp++ = c;
60 void memset16(void *target, unsigned short c, size_t len)
62 int ch = DMA_CHANNEL;
63 unsigned short d;
64 unsigned short *dp;
66 if(len < 32)
67 _memset16(target,c,len);
68 else
70 if(((unsigned int)target < 0xa0000000) && len)
71 dma_cache_wback_inv((unsigned long)target, len);
73 d = c;
74 REG_DMAC_DSAR(ch) = PHYSADDR((unsigned long)&d);
75 REG_DMAC_DTAR(ch) = PHYSADDR((unsigned long)target);
76 REG_DMAC_DTCR(ch) = len / 32;
77 REG_DMAC_DRSR(ch) = DMAC_DRSR_RS_AUTO;
78 REG_DMAC_DCMD(ch) = DMAC_DCMD_DAI | DMAC_DCMD_SWDH_16 | DMAC_DCMD_DWDH_16 | DMAC_DCMD_DS_32BYTE;
79 REG_DMAC_DCCSR(ch) = DMAC_DCCSR_EN | DMAC_DCCSR_NDES;
81 while (REG_DMAC_DTCR(ch));
82 if(len % 32)
84 dp = (unsigned short *)((unsigned int)target + (len & (32 - 1)));
85 for(d = 0; d < (len % 32); d++)
86 *dp++ = c;
91 void memcpy(void *target, const void *source, size_t len)
93 int ch = DMA_CHANNEL;
94 unsigned char *dp;
96 if(len < 4)
97 _memcpy(target, source, len);
99 if(((unsigned int)source < 0xa0000000) && len)
100 dma_cache_wback_inv((unsigned long)source, len);
102 if(((unsigned int)target < 0xa0000000) && len)
103 dma_cache_wback_inv((unsigned long)target, len);
105 REG_DMAC_DSAR(ch) = PHYSADDR((unsigned long)source);
106 REG_DMAC_DTAR(ch) = PHYSADDR((unsigned long)target);
107 REG_DMAC_DTCR(ch) = len / 4;
108 REG_DMAC_DRSR(ch) = DMAC_DRSR_RS_AUTO;
109 REG_DMAC_DCMD(ch) = DMAC_DCMD_DAI | DMAC_DCMD_SWDH_32 | DMAC_DCMD_DWDH_32 | DMAC_DCMD_DS_32BIT;
111 REG_DMAC_DCCSR(ch) = DMAC_DCCSR_EN | DMAC_DCCSR_NDES;
112 while (REG_DMAC_DTCR(ch));
113 if(len % 4)
115 dp = (unsigned char*)((unsigned int)target + (len & (4 - 1)));
116 for(i = 0; i < (len % 4); i++)
117 *dp++ = *source;