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