1 /******************************************************************************
2  *
3  * Copyright (C) 2022-2023 Maxim Integrated Products, Inc. (now owned by
4  * Analog Devices, Inc.),
5  * Copyright (C) 2023-2024 Analog Devices, Inc.
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *     http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  *
19  ******************************************************************************/
20 
21 /****** Includes *******/
22 #include <stddef.h>
23 #include <stdint.h>
24 #include <stdbool.h>
25 #include "mxc_device.h"
26 #include "mxc_assert.h"
27 #include "mxc_lock.h"
28 #include "mxc_sys.h"
29 #include "dma.h"
30 #include "dma_reva.h"
31 #include "dma_regs.h"
32 
33 /***** Definitions *****/
34 
35 /******* Globals *******/
36 
37 /****** Functions ******/
38 
getDMAInstance(int ch)39 static mxc_dma_regs_t *getDMAInstance(int ch)
40 {
41     if (ch < (MXC_DMA_CHANNELS / MXC_DMA_INSTANCES)) {
42         return MXC_DMA0;
43     } else if (ch >= (MXC_DMA_CHANNELS / MXC_DMA_INSTANCES) && ch < MXC_DMA_CHANNELS) {
44         return MXC_DMA1;
45     }
46 
47     return NULL;
48 }
49 
MXC_DMA_Init(mxc_dma_regs_t * dma)50 int MXC_DMA_Init(mxc_dma_regs_t *dma)
51 {
52 #ifndef MSDK_NO_GPIO_CLK_INIT
53     switch (MXC_DMA_GET_IDX(dma)) {
54     case 0:
55         if (!MXC_SYS_IsClockEnabled(MXC_SYS_PERIPH_CLOCK_DMA)) {
56             MXC_SYS_ClockEnable(MXC_SYS_PERIPH_CLOCK_DMA);
57             MXC_SYS_Reset_Periph(MXC_SYS_RESET_DMA0);
58         }
59         break;
60     case 1:
61         if (!MXC_SYS_IsClockEnabled(MXC_SYS_PERIPH_CLOCK_DMA1)) {
62             MXC_SYS_ClockEnable(MXC_SYS_PERIPH_CLOCK_DMA1);
63             MXC_SYS_Reset_Periph(MXC_SYS_RESET_DMA1);
64         }
65         break;
66     default:
67         return E_BAD_PARAM;
68     }
69 #endif
70 
71     return MXC_DMA_RevA_Init((mxc_dma_reva_regs_t *)dma);
72 }
73 
MXC_DMA_DeInit(mxc_dma_regs_t * dma)74 void MXC_DMA_DeInit(mxc_dma_regs_t *dma)
75 {
76     return MXC_DMA_RevA_DeInit((mxc_dma_reva_regs_t *)dma);
77 }
78 
MXC_DMA_AcquireChannel(mxc_dma_regs_t * dma)79 int MXC_DMA_AcquireChannel(mxc_dma_regs_t *dma)
80 {
81     if (MXC_DMA_GET_IDX(dma) == -1) {
82         return E_BAD_PARAM;
83     }
84 
85     return MXC_DMA_RevA_AcquireChannel((mxc_dma_reva_regs_t *)dma);
86 }
87 
MXC_DMA_ReleaseChannel(int ch)88 int MXC_DMA_ReleaseChannel(int ch)
89 {
90     return MXC_DMA_RevA_ReleaseChannel(ch);
91 }
92 
MXC_DMA_ConfigChannel(mxc_dma_config_t config,mxc_dma_srcdst_t srcdst)93 int MXC_DMA_ConfigChannel(mxc_dma_config_t config, mxc_dma_srcdst_t srcdst)
94 {
95     return MXC_DMA_RevA_ConfigChannel(config, srcdst);
96 }
97 
MXC_DMA_AdvConfigChannel(mxc_dma_adv_config_t advConfig)98 int MXC_DMA_AdvConfigChannel(mxc_dma_adv_config_t advConfig)
99 {
100     return MXC_DMA_RevA_AdvConfigChannel(advConfig);
101 }
102 
MXC_DMA_SetSrcDst(mxc_dma_srcdst_t srcdst)103 int MXC_DMA_SetSrcDst(mxc_dma_srcdst_t srcdst)
104 {
105     return MXC_DMA_RevA_SetSrcDst(srcdst);
106 }
107 
MXC_DMA_GetSrcDst(mxc_dma_srcdst_t * srcdst)108 int MXC_DMA_GetSrcDst(mxc_dma_srcdst_t *srcdst)
109 {
110     return MXC_DMA_RevA_GetSrcDst(srcdst);
111 }
112 
MXC_DMA_SetSrcReload(mxc_dma_srcdst_t srcdst)113 int MXC_DMA_SetSrcReload(mxc_dma_srcdst_t srcdst)
114 {
115     return MXC_DMA_RevA_SetSrcReload(srcdst);
116 }
117 
MXC_DMA_GetSrcReload(mxc_dma_srcdst_t * srcdst)118 int MXC_DMA_GetSrcReload(mxc_dma_srcdst_t *srcdst)
119 {
120     return MXC_DMA_RevA_GetSrcReload(srcdst);
121 }
122 
MXC_DMA_SetCallback(int ch,void (* callback)(int,int))123 int MXC_DMA_SetCallback(int ch, void (*callback)(int, int))
124 {
125     return MXC_DMA_RevA_SetCallback(ch, callback);
126 }
127 
MXC_DMA_SetChannelInterruptEn(int ch,bool chdis,bool ctz)128 int MXC_DMA_SetChannelInterruptEn(int ch, bool chdis, bool ctz)
129 {
130     return MXC_DMA_RevA_SetChannelInterruptEn(ch, chdis, ctz);
131 }
132 
MXC_DMA_ChannelEnableInt(int ch,int flags)133 int MXC_DMA_ChannelEnableInt(int ch, int flags)
134 {
135     return MXC_DMA_RevA_ChannelEnableInt(ch, flags);
136 }
137 
MXC_DMA_ChannelDisableInt(int ch,int flags)138 int MXC_DMA_ChannelDisableInt(int ch, int flags)
139 {
140     return MXC_DMA_RevA_ChannelDisableInt(ch, flags);
141 }
142 
MXC_DMA_ChannelGetFlags(int ch)143 int MXC_DMA_ChannelGetFlags(int ch)
144 {
145     return MXC_DMA_RevA_ChannelGetFlags(ch);
146 }
147 
MXC_DMA_ChannelClearFlags(int ch,int flags)148 int MXC_DMA_ChannelClearFlags(int ch, int flags)
149 {
150     return MXC_DMA_RevA_ChannelClearFlags(ch, flags);
151 }
152 
MXC_DMA_EnableInt(int ch)153 int MXC_DMA_EnableInt(int ch)
154 {
155     mxc_dma_regs_t *dma = getDMAInstance(ch);
156     return MXC_DMA_RevA_EnableInt((mxc_dma_reva_regs_t *)dma, ch);
157 }
158 
MXC_DMA_DisableInt(int ch)159 int MXC_DMA_DisableInt(int ch)
160 {
161     mxc_dma_regs_t *dma = getDMAInstance(ch);
162     return MXC_DMA_RevA_DisableInt((mxc_dma_reva_regs_t *)dma, ch);
163 }
164 
MXC_DMA_Start(int ch)165 int MXC_DMA_Start(int ch)
166 {
167     return MXC_DMA_RevA_Start(ch);
168 }
169 
MXC_DMA_Stop(int ch)170 int MXC_DMA_Stop(int ch)
171 {
172     return MXC_DMA_RevA_Stop(ch);
173 }
174 
MXC_DMA_GetCHRegs(int ch)175 mxc_dma_ch_regs_t *MXC_DMA_GetCHRegs(int ch)
176 {
177     return MXC_DMA_RevA_GetCHRegs(ch);
178 }
179 
MXC_DMA_Handler(mxc_dma_regs_t * dma)180 void MXC_DMA_Handler(mxc_dma_regs_t *dma)
181 {
182     if (MXC_DMA_GET_IDX(dma) != -1) {
183         MXC_DMA_RevA_Handler((mxc_dma_reva_regs_t *)dma);
184     }
185 }
186 
MXC_DMA_MemCpy(mxc_dma_regs_t * dma,void * dest,void * src,int len,mxc_dma_complete_cb_t callback)187 int MXC_DMA_MemCpy(mxc_dma_regs_t *dma, void *dest, void *src, int len,
188                    mxc_dma_complete_cb_t callback)
189 {
190     return MXC_DMA_RevA_MemCpy((mxc_dma_reva_regs_t *)dma, dest, src, len, callback);
191 }
192 
MXC_DMA_DoTransfer(mxc_dma_regs_t * dma,mxc_dma_config_t config,mxc_dma_srcdst_t firstSrcDst,mxc_dma_trans_chain_t callback)193 int MXC_DMA_DoTransfer(mxc_dma_regs_t *dma, mxc_dma_config_t config, mxc_dma_srcdst_t firstSrcDst,
194                        mxc_dma_trans_chain_t callback)
195 {
196     return MXC_DMA_RevA_DoTransfer((mxc_dma_reva_regs_t *)dma, config, firstSrcDst, callback);
197 }
198