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