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 "mxc_device.h"
24 #include "mxc_errors.h"
25 #include "mxc_assert.h"
26 #include "mxc_sys.h"
27 #include "icc.h"
28 #include "icc_reva.h"
29 #include "icc_reva_regs.h"
30 
31 /* **** Definitions **** */
32 
33 /* **** Globals **** */
34 
35 /* **** Functions **** */
MXC_ICC_Ready(mxc_icc_reva_regs_t * icc)36 static int MXC_ICC_Ready(mxc_icc_reva_regs_t *icc)
37 {
38     return (icc->ctrl & MXC_F_ICC_REVA_CTRL_RDY);
39 }
40 
MXC_ICC_RevA_ID(mxc_icc_reva_regs_t * icc,mxc_icc_info_t cid)41 int MXC_ICC_RevA_ID(mxc_icc_reva_regs_t *icc, mxc_icc_info_t cid)
42 {
43     if (icc == NULL) {
44         return E_NULL_PTR;
45     }
46 
47     switch (cid) {
48     case ICC_INFO_RELNUM:
49         return ((icc->info & MXC_F_ICC_REVA_INFO_RELNUM) >> MXC_F_ICC_REVA_INFO_RELNUM_POS);
50 
51     case ICC_INFO_PARTNUM:
52         return ((icc->info & MXC_F_ICC_REVA_INFO_PARTNUM) >> MXC_F_ICC_REVA_INFO_PARTNUM_POS);
53 
54     case ICC_INFO_ID:
55         return ((icc->info & MXC_F_ICC_REVA_INFO_ID) >> MXC_F_ICC_REVA_INFO_ID_POS);
56 
57     default:
58         return E_BAD_PARAM;
59     }
60 }
61 
MXC_ICC_RevA_Enable(mxc_icc_reva_regs_t * icc)62 void MXC_ICC_RevA_Enable(mxc_icc_reva_regs_t *icc)
63 {
64     // Invalidate cache and wait until ready
65     icc->ctrl &= ~MXC_F_ICC_REVA_CTRL_EN;
66     icc->invalidate = 1;
67 
68     while (!(MXC_ICC_Ready(icc))) {}
69 
70     // Enable Cache
71     icc->ctrl |= MXC_F_ICC_REVA_CTRL_EN;
72     while (!(MXC_ICC_Ready(icc))) {}
73 }
74 
MXC_ICC_RevA_Disable(mxc_icc_reva_regs_t * icc)75 void MXC_ICC_RevA_Disable(mxc_icc_reva_regs_t *icc)
76 {
77     // Disable Cache
78     icc->ctrl &= ~MXC_F_ICC_REVA_CTRL_EN;
79 }
80