Line data Source code
1 1 : /**
2 : * @file
3 : *
4 : * @brief Public APIs for MDIO drivers.
5 : */
6 :
7 : /*
8 : * Copyright (c) 2021 IP-Logix Inc.
9 : * Copyright 2023 NXP
10 : *
11 : * SPDX-License-Identifier: Apache-2.0
12 : */
13 : #ifndef ZEPHYR_INCLUDE_DRIVERS_MDIO_H_
14 : #define ZEPHYR_INCLUDE_DRIVERS_MDIO_H_
15 :
16 : /**
17 : * @brief MDIO Interface
18 : * @defgroup mdio_interface MDIO Interface
19 : * @ingroup io_interfaces
20 : * @{
21 : */
22 : #include <zephyr/types.h>
23 : #include <zephyr/device.h>
24 : #include <errno.h>
25 :
26 : #ifdef __cplusplus
27 : extern "C" {
28 : #endif
29 :
30 : /**
31 : * @cond INTERNAL_HIDDEN
32 : *
33 : * These are for internal use only, so skip these in
34 : * public documentation.
35 : */
36 : __subsystem struct mdio_driver_api {
37 : /** Enable the MDIO bus device */
38 : void (*bus_enable)(const struct device *dev);
39 :
40 : /** Disable the MDIO bus device */
41 : void (*bus_disable)(const struct device *dev);
42 :
43 : /** Read data from MDIO bus */
44 : int (*read)(const struct device *dev, uint8_t prtad, uint8_t regad,
45 : uint16_t *data);
46 :
47 : /** Write data to MDIO bus */
48 : int (*write)(const struct device *dev, uint8_t prtad, uint8_t regad,
49 : uint16_t data);
50 :
51 : /** Read data from MDIO bus using Clause 45 access */
52 : int (*read_c45)(const struct device *dev, uint8_t prtad, uint8_t devad,
53 : uint16_t regad, uint16_t *data);
54 :
55 : /** Write data to MDIO bus using Clause 45 access */
56 : int (*write_c45)(const struct device *dev, uint8_t prtad, uint8_t devad,
57 : uint16_t regad, uint16_t data);
58 : };
59 : /**
60 : * @endcond
61 : */
62 :
63 : /**
64 : * @brief Enable MDIO bus
65 : *
66 : * @param[in] dev Pointer to the device structure for the controller
67 : *
68 : */
69 1 : __syscall void mdio_bus_enable(const struct device *dev);
70 :
71 : static inline void z_impl_mdio_bus_enable(const struct device *dev)
72 : {
73 : const struct mdio_driver_api *api =
74 : (const struct mdio_driver_api *)dev->api;
75 :
76 : if (api->bus_enable != NULL) {
77 : api->bus_enable(dev);
78 : }
79 : }
80 :
81 : /**
82 : * @brief Disable MDIO bus and tri-state drivers
83 : *
84 : * @param[in] dev Pointer to the device structure for the controller
85 : *
86 : */
87 1 : __syscall void mdio_bus_disable(const struct device *dev);
88 :
89 : static inline void z_impl_mdio_bus_disable(const struct device *dev)
90 : {
91 : const struct mdio_driver_api *api =
92 : (const struct mdio_driver_api *)dev->api;
93 :
94 : if (api->bus_disable != NULL) {
95 : api->bus_disable(dev);
96 : }
97 : }
98 :
99 : /**
100 : * @brief Read from MDIO Bus
101 : *
102 : * This routine provides a generic interface to perform a read on the
103 : * MDIO bus.
104 : *
105 : * @param[in] dev Pointer to the device structure for the controller
106 : * @param[in] prtad Port address
107 : * @param[in] regad Register address
108 : * @param data Pointer to receive read data
109 : *
110 : * @retval 0 If successful.
111 : * @retval -EIO General input / output error.
112 : * @retval -ETIMEDOUT If transaction timedout on the bus
113 : * @retval -ENOSYS if read is not supported
114 : */
115 1 : __syscall int mdio_read(const struct device *dev, uint8_t prtad, uint8_t regad,
116 : uint16_t *data);
117 :
118 : static inline int z_impl_mdio_read(const struct device *dev, uint8_t prtad,
119 : uint8_t regad, uint16_t *data)
120 : {
121 : const struct mdio_driver_api *api =
122 : (const struct mdio_driver_api *)dev->api;
123 :
124 : if (api->read == NULL) {
125 : return -ENOSYS;
126 : }
127 :
128 : return api->read(dev, prtad, regad, data);
129 : }
130 :
131 :
132 : /**
133 : * @brief Write to MDIO bus
134 : *
135 : * This routine provides a generic interface to perform a write on the
136 : * MDIO bus.
137 : *
138 : * @param[in] dev Pointer to the device structure for the controller
139 : * @param[in] prtad Port address
140 : * @param[in] regad Register address
141 : * @param[in] data Data to write
142 : *
143 : * @retval 0 If successful.
144 : * @retval -EIO General input / output error.
145 : * @retval -ETIMEDOUT If transaction timedout on the bus
146 : * @retval -ENOSYS if write is not supported
147 : */
148 1 : __syscall int mdio_write(const struct device *dev, uint8_t prtad, uint8_t regad,
149 : uint16_t data);
150 :
151 : static inline int z_impl_mdio_write(const struct device *dev, uint8_t prtad,
152 : uint8_t regad, uint16_t data)
153 : {
154 : const struct mdio_driver_api *api =
155 : (const struct mdio_driver_api *)dev->api;
156 :
157 : if (api->write == NULL) {
158 : return -ENOSYS;
159 : }
160 :
161 : return api->write(dev, prtad, regad, data);
162 : }
163 :
164 : /**
165 : * @brief Read from MDIO Bus using Clause 45 access
166 : *
167 : * This routine provides an interface to perform a read on the MDIO bus using
168 : * IEEE 802.3 Clause 45 access.
169 : *
170 : * @param[in] dev Pointer to the device structure for the controller
171 : * @param[in] prtad Port address
172 : * @param[in] devad Device address
173 : * @param[in] regad Register address
174 : * @param data Pointer to receive read data
175 : *
176 : * @retval 0 If successful.
177 : * @retval -EIO General input / output error.
178 : * @retval -ETIMEDOUT If transaction timedout on the bus
179 : * @retval -ENOSYS if write using Clause 45 access is not supported
180 : */
181 1 : __syscall int mdio_read_c45(const struct device *dev, uint8_t prtad,
182 : uint8_t devad, uint16_t regad, uint16_t *data);
183 :
184 : static inline int z_impl_mdio_read_c45(const struct device *dev, uint8_t prtad,
185 : uint8_t devad, uint16_t regad,
186 : uint16_t *data)
187 : {
188 : const struct mdio_driver_api *api =
189 : (const struct mdio_driver_api *)dev->api;
190 :
191 : if (api->read_c45 == NULL) {
192 : return -ENOSYS;
193 : }
194 :
195 : return api->read_c45(dev, prtad, devad, regad, data);
196 : }
197 :
198 : /**
199 : * @brief Write to MDIO bus using Clause 45 access
200 : *
201 : * This routine provides an interface to perform a write on the MDIO bus using
202 : * IEEE 802.3 Clause 45 access.
203 : *
204 : * @param[in] dev Pointer to the device structure for the controller
205 : * @param[in] prtad Port address
206 : * @param[in] devad Device address
207 : * @param[in] regad Register address
208 : * @param[in] data Data to write
209 : *
210 : * @retval 0 If successful.
211 : * @retval -EIO General input / output error.
212 : * @retval -ETIMEDOUT If transaction timedout on the bus
213 : * @retval -ENOSYS if write using Clause 45 access is not supported
214 : */
215 1 : __syscall int mdio_write_c45(const struct device *dev, uint8_t prtad,
216 : uint8_t devad, uint16_t regad, uint16_t data);
217 :
218 : static inline int z_impl_mdio_write_c45(const struct device *dev, uint8_t prtad,
219 : uint8_t devad, uint16_t regad,
220 : uint16_t data)
221 : {
222 : const struct mdio_driver_api *api =
223 : (const struct mdio_driver_api *)dev->api;
224 :
225 : if (api->write_c45 == NULL) {
226 : return -ENOSYS;
227 : }
228 :
229 : return api->write_c45(dev, prtad, devad, regad, data);
230 : }
231 :
232 : #ifdef __cplusplus
233 : }
234 : #endif
235 :
236 : /**
237 : * @}
238 : */
239 :
240 : #include <zephyr/syscalls/mdio.h>
241 :
242 : #endif /* ZEPHYR_INCLUDE_DRIVERS_MDIO_H_ */
|