summaryrefslogtreecommitdiff
path: root/firmware/target/arm/imx233/dma-imx233.c
diff options
context:
space:
mode:
authorAmaury Pouly <pamaury@rockbox.org>2011-06-17 22:30:58 +0000
committerAmaury Pouly <pamaury@rockbox.org>2011-06-17 22:30:58 +0000
commit2cf33133820ee17e4b5d2d622db15dedff1a1f6e (patch)
tree60eddf4c3f16d5d274bc111ce53db02cfe75a6e8 /firmware/target/arm/imx233/dma-imx233.c
parentd4800fa3851d2d89c1be03ec99af81f277892579 (diff)
downloadrockbox-2cf33133820ee17e4b5d2d622db15dedff1a1f6e.tar.gz
rockbox-2cf33133820ee17e4b5d2d622db15dedff1a1f6e.zip
fuze+: add more clocking code, add dma code, add ssp code, add stub usb code, update storage to SD + MMC, beginning of the driver
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@30010 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/target/arm/imx233/dma-imx233.c')
-rw-r--r--firmware/target/arm/imx233/dma-imx233.c133
1 files changed, 133 insertions, 0 deletions
diff --git a/firmware/target/arm/imx233/dma-imx233.c b/firmware/target/arm/imx233/dma-imx233.c
new file mode 100644
index 0000000000..d75c334aeb
--- /dev/null
+++ b/firmware/target/arm/imx233/dma-imx233.c
@@ -0,0 +1,133 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
9 *
10 * Copyright (C) 2011 by amaury Pouly
11 *
12 * Based on Rockbox iriver bootloader by Linus Nielsen Feltzing
13 * and the ipodlinux bootloader by Daniel Palffy and Bernard Leach
14 *
15 * This program is free software; you can redistribute it and/or
16 * modify it under the terms of the GNU General Public License
17 * as published by the Free Software Foundation; either version 2
18 * of the License, or (at your option) any later version.
19 *
20 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
21 * KIND, either express or implied.
22 *
23 ****************************************************************************/
24#include "config.h"
25#include "system.h"
26#include "dma-imx233.h"
27
28void imx233_dma_init(void)
29{
30 /* Enable APHB and APBX */
31 __REG_CLR(HW_APBH_CTRL0) = __BLOCK_CLKGATE | __BLOCK_SFTRST;
32 __REG_CLR(HW_APBX_CTRL0) = __BLOCK_CLKGATE | __BLOCK_SFTRST;
33}
34
35void imx233_dma_reset_channel(unsigned chan)
36{
37 if(APB_IS_APBX_CHANNEL(chan))
38 __REG_SET(HW_APBX_CHANNEL_CTRL) =
39 HW_APBX_CHANNEL_CTRL__RESET_CHANNEL(APB_GET_DMA_CHANNEL(chan));
40 else
41 __REG_SET(HW_APBH_CTRL0) =
42 HW_APBH_CTRL0__RESET_CHANNEL(APB_GET_DMA_CHANNEL(chan));
43}
44
45void imx233_dma_clkgate_channel(unsigned chan, bool enable_clock)
46{
47 if(APB_IS_APBX_CHANNEL(chan))
48 return;
49 if(enable_clock)
50 __REG_CLR(HW_APBH_CTRL0) =
51 HW_APBH_CTRL0__CLKGATE_CHANNEL(APB_GET_DMA_CHANNEL(chan));
52 else
53 __REG_SET(HW_APBH_CTRL0) =
54 HW_APBH_CTRL0__CLKGATE_CHANNEL(APB_GET_DMA_CHANNEL(chan));
55}
56
57void imx233_dma_enable_channel_interrupt(unsigned chan, bool enable)
58{
59 volatile uint32_t *ptr;
60 uint32_t bm;
61 if(APB_IS_APBX_CHANNEL(chan))
62 {
63 ptr = &HW_APBX_CTRL1;
64 bm = HW_APBX_CTRL1__CHx_CMDCMPLT_IRQ_EN(APB_GET_DMA_CHANNEL(chan));
65 }
66 else
67 {
68 ptr = &HW_APBH_CTRL1;;
69 bm = HW_APBH_CTRL1__CHx_CMDCMPLT_IRQ_EN(APB_GET_DMA_CHANNEL(chan));
70 }
71
72 if(enable)
73 {
74 __REG_SET(*ptr) = bm;
75 imx233_dma_clear_channel_interrupt(chan);
76 }
77 else
78 __REG_CLR(*ptr) = bm;
79}
80
81void imx233_dma_clear_channel_interrupt(unsigned chan)
82{
83 if(APB_IS_APBX_CHANNEL(chan))
84 {
85 __REG_CLR(HW_APBX_CTRL1) =
86 HW_APBX_CTRL1__CHx_CMDCMPLT_IRQ(APB_GET_DMA_CHANNEL(chan));
87 __REG_CLR(HW_APBX_CTRL2) =
88 HW_APBX_CTRL2__CHx_ERROR_IRQ(APB_GET_DMA_CHANNEL(chan));
89 }
90 else
91 {
92 __REG_CLR(HW_APBH_CTRL1) =
93 HW_APBH_CTRL1__CHx_CMDCMPLT_IRQ(APB_GET_DMA_CHANNEL(chan));
94 __REG_CLR(HW_APBH_CTRL2) =
95 HW_APBH_CTRL2__CHx_ERROR_IRQ(APB_GET_DMA_CHANNEL(chan));
96 }
97}
98
99bool imx233_dma_is_channel_error_irq(unsigned chan)
100{
101 if(APB_IS_APBX_CHANNEL(chan))
102 return !!(HW_APBX_CTRL2 &
103 HW_APBX_CTRL2__CHx_ERROR_IRQ(APB_GET_DMA_CHANNEL(chan)));
104 else
105 return !!(HW_APBH_CTRL2 &
106 HW_APBH_CTRL2__CHx_ERROR_IRQ(APB_GET_DMA_CHANNEL(chan)));
107}
108
109void imx233_dma_start_command(unsigned chan, struct apb_dma_command_t *cmd)
110{
111 if(APB_IS_APBX_CHANNEL(chan))
112 {
113 HW_APBX_CHx_NXTCMDAR(APB_GET_DMA_CHANNEL(chan)) = (uint32_t)cmd;
114 HW_APBX_CHx_SEMA(APB_GET_DMA_CHANNEL(chan)) = 1;
115 }
116 else
117 {
118 HW_APBH_CHx_NXTCMDAR(APB_GET_DMA_CHANNEL(chan)) = (uint32_t)cmd;
119 HW_APBH_CHx_SEMA(APB_GET_DMA_CHANNEL(chan)) = 1;
120 }
121}
122
123void imx233_dma_wait_completion(unsigned chan)
124{
125 volatile uint32_t *sema;
126 if(APB_IS_APBX_CHANNEL(chan))
127 sema = &HW_APBX_CHx_SEMA(APB_GET_DMA_CHANNEL(chan));
128 else
129 sema = &HW_APBH_CHx_SEMA(APB_GET_DMA_CHANNEL(chan));
130
131 while(*sema & HW_APB_CHx_SEMA__PHORE_BM)
132 ;
133}