1 /*
2  * Copyright (c) 2022 Vestas Wind Systems A/S
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 #ifndef ZEPHYR_INCLUDE_DRIVERS_CAN_TRANSCEIVER_H_
8 #define ZEPHYR_INCLUDE_DRIVERS_CAN_TRANSCEIVER_H_
9 
10 #include <zephyr/drivers/can.h>
11 #include <zephyr/device.h>
12 
13 #ifdef __cplusplus
14 extern "C" {
15 #endif
16 
17 /**
18  * @brief CAN Transceiver Driver APIs
19  * @defgroup can_transceiver CAN Transceiver
20  * @since 3.1
21  * @version 0.1.0
22  * @ingroup io_interfaces
23  * @{
24  */
25 
26 /**
27  * @cond INTERNAL_HIDDEN
28  *
29  * For internal driver use only, skip these in public documentation.
30  */
31 
32 /**
33  * @brief Callback API upon enabling CAN transceiver
34  * See @a can_transceiver_enable() for argument description
35  */
36 typedef int (*can_transceiver_enable_t)(const struct device *dev, can_mode_t mode);
37 
38 /**
39  * @brief Callback API upon disabling CAN transceiver
40  * See @a can_transceiver_disable() for argument description
41  */
42 typedef int (*can_transceiver_disable_t)(const struct device *dev);
43 
44 __subsystem struct can_transceiver_driver_api {
45 	can_transceiver_enable_t enable;
46 	can_transceiver_disable_t disable;
47 };
48 
49 /** @endcond */
50 
51 /**
52  * @brief Enable CAN transceiver
53  *
54  * Enable the CAN transceiver.
55  *
56  * @note The CAN transceiver is controlled by the CAN controller driver and
57  *       should not normally be controlled by the application.
58  *
59  * @see can_start()
60  *
61  * @param dev Pointer to the device structure for the driver instance.
62  * @param mode Operation mode.
63  * @retval 0 If successful.
64  * @retval -EIO General input/output error, failed to enable device.
65  */
can_transceiver_enable(const struct device * dev,can_mode_t mode)66 static inline int can_transceiver_enable(const struct device *dev, can_mode_t mode)
67 {
68 	return DEVICE_API_GET(can_transceiver, dev)->enable(dev, mode);
69 }
70 
71 /**
72  * @brief Disable CAN transceiver
73  *
74  * Disable the CAN transceiver.
75 
76  * @note The CAN transceiver is controlled by the CAN controller driver and
77  *       should not normally be controlled by the application.
78  *
79  * @see can_stop()
80  *
81  * @param dev Pointer to the device structure for the driver instance.
82  * @retval 0 If successful.
83  * @retval -EIO General input/output error, failed to disable device.
84  */
can_transceiver_disable(const struct device * dev)85 static inline int can_transceiver_disable(const struct device *dev)
86 {
87 	return DEVICE_API_GET(can_transceiver, dev)->disable(dev);
88 }
89 
90 /**
91  * @}
92  */
93 
94 #ifdef __cplusplus
95 }
96 #endif
97 
98 #endif /* ZEPHYR_INCLUDE_DRIVERS_CAN_TRANSCEIVER_H_ */
99