1 /*
2  * @ : Copyright (c) 2021 Phytium Information Technology, Inc.
3  *
4  * SPDX-License-Identifier: Apache-2.0.
5  *
6  * @Date: 2021-03-31 14:59:20
7  * @LastEditTime: 2021-05-25 16:46:54
8  * @Description:  This files is for sd ctrl irq handling
9  *
10  * @Modify History: * * Ver   Who        Date         Changes
11  * ----- ------     --------    --------------------------------------
12  */
13 
14 #include "ft_sdctrl.h"
15 #include "ft_sdctrl_hw.h"
16 #include "ft_assert.h"
17 #include "ft_types.h"
18 #include "ft_io.h"
19 #include "ft_printf.h"
20 #include "ft_debug.h"
21 
22 #ifndef LOG_LOCAL_LEVEL
23 #define LOG_LOCAL_LEVEL FT_LOG_NONE
24 #endif
25 #define FT_SD_CTRL_DEBUG_I(format, ...) FT_DEBUG_PRINT_I(FT_SD_CTRL_DEBUG_TAG, format, ##__VA_ARGS__)
26 #define FT_SD_CTRL_DEBUG_E(format, ...) FT_DEBUG_PRINT_E(FT_SD_CTRL_DEBUG_TAG, format, ##__VA_ARGS__)
27 #define FT_SD_CTRL_DEBUG_W(format, ...) FT_DEBUG_PRINT_W(FT_SD_CTRL_DEBUG_TAG, format, ##__VA_ARGS__)
28 
FSdCtrl_NormalIrq(FT_INOUT FtsdCtrl_t * pFtsdCtrl)29 void FSdCtrl_NormalIrq(FT_INOUT FtsdCtrl_t *pFtsdCtrl)
30 {
31     FSdCtrl_Config_t *pConfig;
32     FSdCtrl_IrqConfig_t *irqConfig;
33     Ft_assertVoid(FT_NULL != pFtsdCtrl);
34     pConfig = &pFtsdCtrl->config;
35     irqConfig = &pFtsdCtrl->irqConfig;
36 
37     //FT_SD_CTRL_DEBUG_I("enter cmd irq procedure\r\n");
38     if (irqConfig->pCmdCallback)
39     {
40         irqConfig->pCmdCallback(irqConfig->pCmdArgs);
41     }
42 
43     /* clear interrupts */
44     Ft_out32(pConfig->baseAddress + NORMAL_INT_STATUS_REG, NORMAL_INT_STATUS_ALL_MASK);
45     Ft_out32(pConfig->baseAddress + NORMAL_INT_STATUS_REG, 0);
46 }
47 
FSdCtrl_DmaIrq(FT_INOUT FtsdCtrl_t * pFtsdCtrl)48 void FSdCtrl_DmaIrq(FT_INOUT FtsdCtrl_t *pFtsdCtrl)
49 {
50     FSdCtrl_Config_t *pConfig;
51     FSdCtrl_IrqConfig_t *irqConfig;
52     Ft_assertVoid(FT_NULL != pFtsdCtrl);
53     pConfig = &pFtsdCtrl->config;
54     irqConfig = &pFtsdCtrl->irqConfig;
55 
56     if (irqConfig->pDmaDataCallback)
57     {
58         irqConfig->pDmaDataCallback(irqConfig->pDmaDataArgs);
59     }
60 
61     /* clear interrupts */
62     Ft_out32(pConfig->baseAddress + BD_ISR_REG, BD_ISR_ALL_MASK);
63     Ft_out32(pConfig->baseAddress + BD_ISR_REG, 0);
64 }
65 
FSdCtrl_ErrIrq(FT_INOUT FtsdCtrl_t * pFtsdCtrl)66 void FSdCtrl_ErrIrq(FT_INOUT FtsdCtrl_t *pFtsdCtrl)
67 {
68     FSdCtrl_Config_t *pConfig;
69     FSdCtrl_IrqConfig_t *irqConfig;
70     Ft_assertVoid(FT_NULL != pFtsdCtrl);
71     pConfig = &pFtsdCtrl->config;
72     irqConfig = &pFtsdCtrl->irqConfig;
73 
74     if (irqConfig->pErrorCallback)
75     {
76         irqConfig->pErrorCallback(irqConfig->pErrorArgs);
77     }
78 
79     /* clear interrupts */
80     Ft_out32(pConfig->baseAddress + ERROR_INT_STATUS_REG, ERROR_INT_STATUS_ALL_MASK);
81     Ft_out32(pConfig->baseAddress + ERROR_INT_STATUS_REG, 0);
82 }
83 
FSdCtrl_SetHandler(FT_INOUT FtsdCtrl_t * pFtsdCtrl,FT_IN FSdCtrl_IrqCallbackSelect_t selectIndex,void * FuncPtr,void * Args)84 ft_error_t FSdCtrl_SetHandler(FT_INOUT FtsdCtrl_t *pFtsdCtrl, FT_IN FSdCtrl_IrqCallbackSelect_t selectIndex,
85                               void *FuncPtr, void *Args)
86 {
87     Ft_assertNonvoid(pFtsdCtrl != NULL);
88     Ft_assertNonvoid(FuncPtr != NULL);
89     Ft_assertNonvoid(pFtsdCtrl->isReady == FT_COMPONENT_IS_READLY);
90 
91     switch (selectIndex)
92     {
93     case FTSDCTRL_DMADATAIRQID:
94         pFtsdCtrl->irqConfig.pDmaDataCallback = FuncPtr;
95         pFtsdCtrl->irqConfig.pDmaDataArgs = Args;
96         break;
97     case FTSDCTRL_CMDIRQID:
98         pFtsdCtrl->irqConfig.pCmdCallback = FuncPtr;
99         pFtsdCtrl->irqConfig.pCmdArgs = Args;
100         break;
101     case FTSDCTRL_ERRORIRQID:
102         pFtsdCtrl->irqConfig.pErrorCallback = FuncPtr;
103         pFtsdCtrl->irqConfig.pErrorArgs = Args;
104         break;
105     default:
106         return FTSDC_FAILURE;
107     }
108 
109     return FTSDC_SUCCESS;
110 }
111