1 /*
2  * Copyright (c) 2020-2021 Huawei Device Co., Ltd.
3  *
4  * HDF is dual licensed: you can use it either under the terms of
5  * the GPL, or the BSD license, at your option.
6  * See the LICENSE file in the root of this repository for complete details.
7  */
8 
9 #ifndef MMC_SDIO_H
10 #define MMC_SDIO_H
11 
12 #include "mmc_sd.h"
13 #include "osal_thread.h"
14 #include "sdio_if.h"
15 
16 #ifdef __cplusplus
17 #if __cplusplus
18 extern "C" {
19 #endif
20 #endif /* __cplusplus */
21 
22 struct SdioFunction {
23     struct SdioDevice *dev;
24     uint32_t maxBlkSize;
25     uint32_t curBlkSize;
26     uint32_t funcNum;
27     uint8_t funcClass;
28     uint16_t vendorId;
29     uint16_t deviceId;
30     uint32_t timeOut;
31     SdioIrqHandler *irqHandler;
32 };
33 
34 struct SdioRegister {
35     struct SdioCccr cccr;
36     struct SdioCis cis;
37 };
38 
39 struct SdioDevice {
40     struct SdDevice sd;
41     struct SdioDeviceOps *sdioOps;
42     struct SdioRegister sdioReg;
43     uint32_t functions;
44     struct SdioFunction *sdioFunc[SDIO_MAX_FUNCTION_NUMBER];
45     struct SdioFunction *curFunction;
46     struct OsalThread thread;  /* irq thread */
47     struct OsalSem sem;
48     bool irqPending;
49     bool threadRunning;
50 };
51 
52 struct SdioDeviceOps {
53     int32_t (*incrAddrReadBytes)(struct SdioDevice *, uint8_t *, uint32_t, uint32_t);
54     int32_t (*incrAddrWriteBytes)(struct SdioDevice *, uint8_t *, uint32_t, uint32_t);
55     int32_t (*fixedAddrReadBytes)(struct SdioDevice *, uint8_t *, uint32_t, uint32_t, uint32_t);
56     int32_t (*fixedAddrWriteBytes)(struct SdioDevice *, uint8_t *, uint32_t, uint32_t, uint32_t);
57     int32_t (*func0ReadBytes)(struct SdioDevice *, uint8_t *, uint32_t, uint32_t);
58     int32_t (*func0WriteBytes)(struct SdioDevice *, uint8_t *, uint32_t, uint32_t);
59     int32_t (*setBlockSize)(struct SdioDevice *, uint32_t);
60     int32_t (*getCommonInfo)(struct SdioDevice *, SdioCommonInfo *, uint32_t);
61     int32_t (*setCommonInfo)(struct SdioDevice *, SdioCommonInfo *, uint32_t);
62     int32_t (*flushData)(struct SdioDevice *);
63     int32_t (*enableFunc)(struct SdioDevice *);
64     int32_t (*disableFunc)(struct SdioDevice *);
65     int32_t (*claimIrq)(struct SdioDevice *, SdioIrqHandler *);
66     int32_t (*releaseIrq)(struct SdioDevice *);
67     int32_t (*findFunc)(struct SdioDevice *, struct SdioFunctionConfig *);
68     int32_t (*claimHost)(struct SdioDevice *);
69     int32_t (*releaseHost)(struct SdioDevice *);
70 };
71 
72 int32_t SdioDeviceFindFunction(struct SdioDevice *sdio, struct SdioFunctionConfig *config);
73 int32_t SdioDeviceIncrAddrReadBytes(struct SdioDevice *sdio,
74     uint8_t *data, uint32_t addr, uint32_t size);
75 int32_t SdioDeviceIncrAddrWriteBytes(struct SdioDevice *sdio,
76     uint8_t *data, uint32_t addr, uint32_t size);
77 int32_t SdioDeviceFixedAddrReadBytes(struct SdioDevice *sdio,
78     uint8_t *data, uint32_t addr, uint32_t size, uint32_t scatterLen);
79 int32_t SdioDeviceFixedAddrWriteBytes(struct SdioDevice *sdio,
80     uint8_t *data, uint32_t addr, uint32_t size, uint32_t scatterLen);
81 int32_t SdioDeviceFunc0ReadBytes(struct SdioDevice *sdio,
82     uint8_t *data, uint32_t addr, uint32_t size);
83 int32_t SdioDeviceFunc0WriteBytes(struct SdioDevice *sdio,
84     uint8_t *data, uint32_t addr, uint32_t size);
85 int32_t SdioDeviceSetBlockSize(struct SdioDevice *sdio, uint32_t blockSize);
86 int32_t SdioDeviceGetCommonInfo(struct SdioDevice *sdio,
87     SdioCommonInfo *info, SdioCommonInfoType infoType);
88 int32_t SdioDeviceSetCommonInfo(struct SdioDevice *sdio,
89     SdioCommonInfo *info, SdioCommonInfoType infoType);
90 int32_t SdioDeviceFlushData(struct SdioDevice *sdio);
91 int32_t SdioDeviceClaimHost(struct SdioDevice *sdio);
92 int32_t SdioDeviceReleaseHost(struct SdioDevice *sdio);
93 int32_t SdioDeviceEnableFunc(struct SdioDevice *sdio);
94 int32_t SdioDeviceDisableFunc(struct SdioDevice *sdio);
95 int32_t SdioDeviceClaimIrq(struct SdioDevice *sdio, SdioIrqHandler *irqHandler);
96 int32_t SdioDeviceReleaseIrq(struct SdioDevice *sdio);
97 
98 void SdioDeviceAddOps(struct SdioDevice *sdio, void *ops);
99 
100 #ifdef __cplusplus
101 #if __cplusplus
102 }
103 #endif
104 #endif /* __cplusplus */
105 
106 #endif /* MMC_SDIO_H */
107