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 #include "pt.h"
22 #include "gcr_regs.h"
23 #include "pt_regs.h"
24 #include "ptg_regs.h"
25 #include "pt_reva.h"
26 
MXC_PT_Init(mxc_ptg_regs_t * ptg,mxc_clk_scale_t clk_scale)27 void MXC_PT_Init(mxc_ptg_regs_t *ptg, mxc_clk_scale_t clk_scale)
28 {
29     MXC_ASSERT(clk_scale <= 128);
30     MXC_GCR->perckcn0 &= ~MXC_F_GCR_PERCKCN0_PTD;
31 
32     MXC_GCR->rstr1 |= MXC_F_GCR_RSTR1_PT;
33 
34     while (MXC_GCR->rstr1 & MXC_F_GCR_RSTR1_PT) {}
35 
36     //set clock scale
37     MXC_GCR->clkcn &= ~MXC_S_GCR_CLKCN_PSC_DIV128;
38 
39     switch (clk_scale) {
40     case MXC_PT_CLK_DIV1:
41         MXC_GCR->clkcn |= MXC_S_GCR_CLKCN_PSC_DIV1;
42         break;
43 
44     case MXC_PT_CLK_DIV2:
45         MXC_GCR->clkcn |= MXC_S_GCR_CLKCN_PSC_DIV2;
46         break;
47 
48     case MXC_PT_CLK_DIV4:
49         MXC_GCR->clkcn |= MXC_S_GCR_CLKCN_PSC_DIV4;
50         break;
51 
52     case MXC_PT_CLK_DIV8:
53         MXC_GCR->clkcn |= MXC_S_GCR_CLKCN_PSC_DIV8;
54         break;
55 
56     case MXC_PT_CLK_DIV16:
57         MXC_GCR->clkcn |= MXC_S_GCR_CLKCN_PSC_DIV16;
58         break;
59 
60     case MXC_PT_CLK_DIV32:
61         MXC_GCR->clkcn |= MXC_S_GCR_CLKCN_PSC_DIV32;
62         break;
63 
64     case MXC_PT_CLK_DIV64:
65         MXC_GCR->clkcn |= MXC_S_GCR_CLKCN_PSC_DIV64;
66         break;
67 
68     case MXC_PT_CLK_DIV128:
69         MXC_GCR->clkcn |= MXC_S_GCR_CLKCN_PSC_DIV128;
70         break;
71     }
72 
73     MXC_PT_RevA_Init((mxc_ptg_reva_regs_t *)ptg, clk_scale);
74 }
75 
MXC_PT_Shutdown(mxc_ptg_regs_t * ptg,uint32_t pts)76 void MXC_PT_Shutdown(mxc_ptg_regs_t *ptg, uint32_t pts)
77 {
78     if (MXC_PT_RevA_Shutdown((mxc_ptg_reva_regs_t *)ptg, pts)) {
79         MXC_GCR->perckcn0 |= MXC_F_GCR_PERCKCN0_PTD;
80     }
81 }
82 
MXC_PT_Config(mxc_ptg_regs_t * ptg,mxc_pt_cfg_t * cfg)83 int MXC_PT_Config(mxc_ptg_regs_t *ptg, mxc_pt_cfg_t *cfg)
84 {
85     MXC_PT_RevA_Config((mxc_ptg_reva_regs_t *)ptg, cfg);
86 
87     switch (cfg->channel) {
88     case 0:
89         MXC_GPIO_Config(&gpio_cfg_pt0);
90         break;
91 
92     case 1:
93         MXC_GPIO_Config(&gpio_cfg_pt1);
94         break;
95 
96     case 2:
97         MXC_GPIO_Config(&gpio_cfg_pt2);
98         break;
99 
100     case 3:
101         MXC_GPIO_Config(&gpio_cfg_pt3);
102         break;
103 
104     case 4:
105         MXC_GPIO_Config(&gpio_cfg_pt4);
106         break;
107 
108     case 5:
109         MXC_GPIO_Config(&gpio_cfg_pt5);
110         break;
111 
112     case 6:
113         MXC_GPIO_Config(&gpio_cfg_pt6);
114         break;
115 
116     case 7:
117         MXC_GPIO_Config(&gpio_cfg_pt7);
118         break;
119 
120     case 8:
121         MXC_GPIO_Config(&gpio_cfg_pt8);
122         break;
123 
124     case 9:
125         MXC_GPIO_Config(&gpio_cfg_pt9);
126         break;
127 
128     case 10:
129         MXC_GPIO_Config(&gpio_cfg_pt10);
130         break;
131 
132     case 11:
133         MXC_GPIO_Config(&gpio_cfg_pt11);
134         break;
135 
136     case 12:
137         MXC_GPIO_Config(&gpio_cfg_pt12);
138         break;
139 
140     case 13:
141         MXC_GPIO_Config(&gpio_cfg_pt13);
142         break;
143 
144     case 14:
145         MXC_GPIO_Config(&gpio_cfg_pt14);
146         break;
147 
148     case 15:
149         MXC_GPIO_Config(&gpio_cfg_pt15);
150         break;
151 
152     default:
153         return E_BAD_PARAM;
154         break;
155     }
156 
157     return E_NO_ERROR;
158 }
159 
MXC_PT_SqrWaveConfig(mxc_ptg_regs_t * ptg,unsigned channel,uint32_t freq)160 int MXC_PT_SqrWaveConfig(mxc_ptg_regs_t *ptg, unsigned channel, uint32_t freq)
161 {
162     mxc_pt_cfg_t sqwcfg;
163 
164     MXC_PT_RevA_SqrWaveConfig((mxc_ptg_reva_regs_t *)ptg, &sqwcfg, channel, freq);
165     return MXC_PT_Config(ptg, &sqwcfg);
166 }
167 
MXC_PT_Start(mxc_ptg_regs_t * ptg,unsigned pts)168 void MXC_PT_Start(mxc_ptg_regs_t *ptg, unsigned pts)
169 {
170     MXC_PT_RevA_Start((mxc_ptg_reva_regs_t *)ptg, pts);
171 }
172 
MXC_PT_Stop(mxc_ptg_regs_t * ptg,unsigned pts)173 void MXC_PT_Stop(mxc_ptg_regs_t *ptg, unsigned pts)
174 {
175     MXC_PT_RevA_Stop((mxc_ptg_reva_regs_t *)ptg, pts);
176 }
177 
MXC_PT_IsActive(mxc_ptg_regs_t * ptg,uint32_t pts)178 uint32_t MXC_PT_IsActive(mxc_ptg_regs_t *ptg, uint32_t pts)
179 {
180     return MXC_PT_RevA_IsActive((mxc_ptg_reva_regs_t *)ptg, pts);
181 }
182 
MXC_PT_SetPattern(unsigned pts,uint32_t pattern)183 void MXC_PT_SetPattern(unsigned pts, uint32_t pattern)
184 {
185     MXC_PT_RevA_SetPattern(pts, pattern);
186 }
187 
MXC_PT_EnableInt(mxc_ptg_regs_t * ptg,uint32_t pts)188 void MXC_PT_EnableInt(mxc_ptg_regs_t *ptg, uint32_t pts)
189 {
190     MXC_PT_RevA_EnableInt((mxc_ptg_reva_regs_t *)ptg, pts);
191 }
192 
MXC_PT_DisableInt(mxc_ptg_regs_t * ptg,uint32_t pts)193 void MXC_PT_DisableInt(mxc_ptg_regs_t *ptg, uint32_t pts)
194 {
195     MXC_PT_RevA_DisableInt((mxc_ptg_reva_regs_t *)ptg, pts);
196 }
197 
MXC_PT_GetFlags(mxc_ptg_regs_t * ptg)198 uint32_t MXC_PT_GetFlags(mxc_ptg_regs_t *ptg)
199 {
200     return MXC_PT_RevA_GetFlags((mxc_ptg_reva_regs_t *)ptg);
201 }
202 
MXC_PT_ClearFlags(mxc_ptg_regs_t * ptg,uint32_t flags)203 void MXC_PT_ClearFlags(mxc_ptg_regs_t *ptg, uint32_t flags)
204 {
205     MXC_PT_RevA_ClearFlags((mxc_ptg_reva_regs_t *)ptg, flags);
206 }
207 
MXC_PT_EnableRestart(unsigned start,unsigned stop,uint8_t restartIndex)208 void MXC_PT_EnableRestart(unsigned start, unsigned stop, uint8_t restartIndex)
209 {
210     MXC_PT_RevA_EnableRestart(start, stop, restartIndex);
211 }
212 
MXC_PT_DisableRestart(unsigned channel,uint8_t restartIndex)213 void MXC_PT_DisableRestart(unsigned channel, uint8_t restartIndex)
214 {
215     MXC_PT_RevA_DisableRestart(channel, restartIndex);
216 }
217 
MXC_PT_Resync(mxc_ptg_regs_t * ptg,uint32_t pts)218 void MXC_PT_Resync(mxc_ptg_regs_t *ptg, uint32_t pts)
219 {
220     MXC_PT_RevA_Resync((mxc_ptg_reva_regs_t *)ptg, pts);
221 }
222