1 /*
2  * Copyright (c) 2022 Google LLC
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 /**
8  * @file
9  * @brief Backend APIs for the BC1.2 emulators.
10  */
11 
12 #ifndef ZEPHYR_INCLUDE_DRIVERS_USB_EMUL_BC12_H_
13 #define ZEPHYR_INCLUDE_DRIVERS_USB_EMUL_BC12_H_
14 
15 #include <zephyr/drivers/emul.h>
16 #include <zephyr/drivers/usb/usb_bc12.h>
17 
18 #ifdef __cplusplus
19 extern "C" {
20 #endif
21 
22 /**
23  * @brief BC1.2 backend emulator APIs
24  * @defgroup b12_emulator_backend BC1.2 backed emulator APIs
25  * @ingroup io_interfaces
26  * @{
27  */
28 
29 /**
30  * @cond INTERNAL_HIDDEN
31  *
32  * These are for internal use only, so skip these in public documentation.
33  */
34 __subsystem struct bc12_emul_driver_api {
35 	int (*set_charging_partner)(const struct emul *emul, enum bc12_type partner_type);
36 	int (*set_pd_partner)(const struct emul *emul, bool connected);
37 };
38 /**
39  * @endcond
40  */
41 
42 /**
43  * @brief Set the charging partner type connected to the BC1.2 device.
44  *
45  * The corresponding BC1.2 emulator updates the vendor specific registers
46  * to simulate connection of the specified charging partner type.  The emulator
47  * also generates an interrupt for processing by the real driver, if supported.
48  *
49  * @param target Pointer to the emulator structure for the BC1.2 emulator instance.
50  * @param partner_type The simulated partner type.  Set to BC12_TYPE_NONE to
51  * disconnect the charging partner.
52  *
53  * @retval 0 If successful.
54  * @retval -EINVAL if the partner type is not supported.
55  */
bc12_emul_set_charging_partner(const struct emul * target,enum bc12_type partner_type)56 static inline int bc12_emul_set_charging_partner(const struct emul *target,
57 						 enum bc12_type partner_type)
58 {
59 	const struct bc12_emul_driver_api *backend_api =
60 		(const struct bc12_emul_driver_api *)target->backend_api;
61 
62 	return backend_api->set_charging_partner(target, partner_type);
63 }
64 
65 /**
66  * @brief Set the portable device partner state.
67  *
68  * The corresponding BC1.2 emulator updates the vendor specific registers
69  * to simulate connection or disconnection of a portable device partner.
70  * The emulator also generates an interrupt for processing by the real driver,
71  * if supported.
72  *
73  * @param target Pointer to the emulator structure for the BC1.2 emulator instance.
74  * @param connected If true, emulate a connection of a portable device partner. If
75  * false, emulate a disconnect event.
76  *
77  * @retval 0 If successful.
78  * @retval -EINVAL if the connection/disconnection of PD partner is not supported.
79  */
bc12_emul_set_pd_partner(const struct emul * target,bool connected)80 static inline int bc12_emul_set_pd_partner(const struct emul *target, bool connected)
81 {
82 	const struct bc12_emul_driver_api *backend_api =
83 		(const struct bc12_emul_driver_api *)target->backend_api;
84 
85 	return backend_api->set_pd_partner(target, connected);
86 }
87 
88 #ifdef __cplusplus
89 }
90 #endif
91 
92 /**
93  * @}
94  */
95 
96 #endif /* ZEPHYR_INCLUDE_DRIVERS_USB_EMUL_BC12_H_ */
97