1 /*
2  * Copyright (c) 2024 Nordic Semiconductor ASA
3  * SPDX-License-Identifier: Apache-2.0
4  */
5 
6 #ifndef ZEPHYR_INCLUDE_DRIVERS_MFD_NPM2100_H_
7 #define ZEPHYR_INCLUDE_DRIVERS_MFD_NPM2100_H_
8 
9 #ifdef __cplusplus
10 extern "C" {
11 #endif
12 
13 /**
14  * @defgroup mdf_interface_npm2100 MFD NPM2100 Interface
15  * @ingroup mfd_interfaces
16  * @{
17  */
18 
19 #include <stddef.h>
20 #include <stdint.h>
21 
22 #include <zephyr/device.h>
23 #include <zephyr/drivers/gpio.h>
24 
25 enum mfd_npm2100_event {
26 	NPM2100_EVENT_SYS_DIETEMP_WARN,
27 	NPM2100_EVENT_SYS_SHIPHOLD_FALL,
28 	NPM2100_EVENT_SYS_SHIPHOLD_RISE,
29 	NPM2100_EVENT_SYS_PGRESET_FALL,
30 	NPM2100_EVENT_SYS_PGRESET_RISE,
31 	NPM2100_EVENT_SYS_TIMER_EXPIRY,
32 	NPM2100_EVENT_ADC_VBAT_READY,
33 	NPM2100_EVENT_ADC_DIETEMP_READY,
34 	NPM2100_EVENT_ADC_DROOP_DETECT,
35 	NPM2100_EVENT_ADC_VOUT_READY,
36 	NPM2100_EVENT_GPIO0_FALL,
37 	NPM2100_EVENT_GPIO0_RISE,
38 	NPM2100_EVENT_GPIO1_FALL,
39 	NPM2100_EVENT_GPIO1_RISE,
40 	NPM2100_EVENT_BOOST_VBAT_WARN,
41 	NPM2100_EVENT_BOOST_VOUT_MIN,
42 	NPM2100_EVENT_BOOST_VOUT_WARN,
43 	NPM2100_EVENT_BOOST_VOUT_DPS,
44 	NPM2100_EVENT_BOOST_VOUT_OK,
45 	NPM2100_EVENT_LDOSW_OCP,
46 	NPM2100_EVENT_LDOSW_VINTFAIL,
47 	NPM2100_EVENT_MAX
48 };
49 
50 enum mfd_npm2100_timer_mode {
51 	NPM2100_TIMER_MODE_GENERAL_PURPOSE,
52 	NPM2100_TIMER_MODE_WDT_RESET,
53 	NPM2100_TIMER_MODE_WDT_POWER_CYCLE,
54 	NPM2100_TIMER_MODE_WAKEUP,
55 };
56 
57 /**
58  * @brief Write npm2100 timer register
59  *
60  * The timer tick resolution is 1/64 seconds.
61  * This function does not start the timer (see mfd_npm2100_start_timer()).
62  *
63  * @param dev npm2100 mfd device
64  * @param time_ms timer value in ms
65  * @param mode timer mode
66  * @retval 0 If successful
67  * @retval -EINVAL if time value is too large
68  * @retval -errno In case of any bus error (see i2c_write_dt())
69  */
70 int mfd_npm2100_set_timer(const struct device *dev, uint32_t time_ms,
71 			  enum mfd_npm2100_timer_mode mode);
72 
73 /**
74  * @brief Start npm2100 timer
75  *
76  * @param dev npm2100 mfd device
77  * @retval 0 If successful
78  * @retval -errno In case of any bus error (see i2c_write_dt())
79  */
80 int mfd_npm2100_start_timer(const struct device *dev);
81 
82 /**
83  * @brief npm2100 full power reset
84  *
85  * @param dev npm2100 mfd device
86  * @retval 0 If successful
87  * @retval -errno In case of any bus error (see i2c_write_dt())
88  */
89 int mfd_npm2100_reset(const struct device *dev);
90 
91 /**
92  * @brief npm2100 hibernate
93  *
94  * Enters low power state, and wakes after specified time or "shphld" pin signal.
95  * Pass-through mode can be used when the battery voltage is high enough to supply the pmic directly
96  * without boosting. This lowers the power consumption of the pmic when hibernate mode is active.
97  *
98  * @param dev npm2100 mfd device
99  * @param time_ms timer value in ms. Set to 0 to disable timer.
100  * @param pass_through set to use pass-through hibernate mode.
101  * @retval 0 If successful
102  * @retval -EINVAL if time value is too large
103  * @retval -EBUSY if the timer is already in use.
104  * @retval -errno In case of any bus error (see i2c_write_dt())
105  */
106 int mfd_npm2100_hibernate(const struct device *dev, uint32_t time_ms, bool pass_through);
107 
108 /**
109  * @brief Add npm2100 event callback
110  *
111  * @param dev npm2100 mfd device
112  * @param callback callback
113  * @return 0 on success, -errno on failure
114  */
115 int mfd_npm2100_add_callback(const struct device *dev, struct gpio_callback *callback);
116 
117 /**
118  * @brief Remove npm2100 event callback
119  *
120  * @param dev npm2100 mfd device
121  * @param callback callback
122  * @return 0 on success, -errno on failure
123  */
124 int mfd_npm2100_remove_callback(const struct device *dev, struct gpio_callback *callback);
125 
126 /** @} */
127 
128 #ifdef __cplusplus
129 }
130 #endif
131 
132 #endif /* ZEPHYR_INCLUDE_DRIVERS_MFD_NPM2100_H_ */
133