1 /*
2 * Copyright (c) 2020-2022 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 SPI_CORE_H
10 #define SPI_CORE_H
11
12 #include "hdf_base.h"
13 #include "hdf_device_desc.h"
14 #include "hdf_dlist.h"
15 #include "spi_if.h"
16 #include "osal_mutex.h"
17
18 struct SpiCntlr;
19 struct SpiCntlrMethod;
20
21 struct SpiCntlrMethod {
22 int32_t (*GetCfg)(struct SpiCntlr *cntlr, struct SpiCfg *cfg);
23 int32_t (*SetCfg)(struct SpiCntlr *cntlr, struct SpiCfg *cfg);
24 int32_t (*Transfer)(struct SpiCntlr *cntlr, struct SpiMsg *msg, uint32_t count);
25 int32_t (*Open)(struct SpiCntlr *cntlr);
26 int32_t (*Close)(struct SpiCntlr *cntlr);
27 };
28
29 struct SpiCntlr {
30 struct IDeviceIoService service;
31 struct HdfDeviceObject *device;
32 uint32_t busNum;
33 uint32_t numCs;
34 uint32_t curCs;
35 struct OsalMutex lock;
36 struct SpiCntlrMethod *method;
37 struct DListHead list;
38 void *priv;
39 };
40
41 struct SpiDev {
42 struct SpiCntlr *cntlr;
43 struct DListHead list;
44 struct SpiCfg cfg;
45 uint32_t csNum;
46 void *priv;
47 };
48
49 struct SpiCntlr *SpiCntlrCreate(struct HdfDeviceObject *device);
50 void SpiCntlrDestroy(struct SpiCntlr *cntlr);
51
52 /**
53 * @brief Turn SpiCntlr to a HdfDeviceObject.
54 *
55 * @param cntlr Indicates the SPI cntlr device.
56 *
57 * @return Retrns the pointer of the HdfDeviceObject on success; returns NULL otherwise.
58 * @since 1.0
59 */
SpiCntlrToDevice(const struct SpiCntlr * cntlr)60 static inline struct HdfDeviceObject *SpiCntlrToDevice(const struct SpiCntlr *cntlr)
61 {
62 return (cntlr == NULL) ? NULL : cntlr->device;
63 }
64
65 /**
66 * @brief Turn HdfDeviceObject to an SpiCntlr.
67 *
68 * @param device Indicates a HdfDeviceObject.
69 *
70 * @return Retrns the pointer of the SpiCntlr on success; returns NULL otherwise.
71 * @since 1.0
72 */
SpiCntlrFromDevice(const struct HdfDeviceObject * device)73 static inline struct SpiCntlr *SpiCntlrFromDevice(const struct HdfDeviceObject *device)
74 {
75 return (device == NULL) ? NULL : (struct SpiCntlr *)device->service;
76 }
77
78 int32_t SpiCntlrTransfer(struct SpiCntlr *cntlr, uint32_t csNum, struct SpiMsg *msg, uint32_t count);
79 int32_t SpiCntlrSetCfg(struct SpiCntlr *cntlr, uint32_t csNum, struct SpiCfg *cfg);
80 int32_t SpiCntlrGetCfg(struct SpiCntlr *cntlr, uint32_t csNum, struct SpiCfg *cfg);
81 int32_t SpiCntlrOpen(struct SpiCntlr *cntlr, uint32_t csNum);
82 int32_t SpiCntlrClose(struct SpiCntlr *cntlr, uint32_t csNum);
83
84 #endif /* SPI_CORE_H */
85