drivers: memc: Add device PM to MCUX Flexspi driver
Add Device level power manangement support to the
MCUX FlexSPI driver.
#ifdef CONFIG_PINCTRL
#include <zephyr/drivers/pinctrl.h>
#endif
+#include <zephyr/pm/device.h>
#include "memc_mcux_flexspi.h"
@@ -174,6 +175,37 @@ static int memc_flexspi_init(const struct device *dev)
return 0;
}
+#ifdef CONFIG_PM_DEVICE
+static int memc_flexspi_pm_action(const struct device *dev, enum pm_device_action action)
+{
+ struct memc_flexspi_data *data = dev->data;
+ int ret;
+
+ switch (action) {
+ case PM_DEVICE_ACTION_RESUME:
+#ifdef CONFIG_PINCTRL
+ ret = pinctrl_apply_state(data->pincfg, PINCTRL_STATE_DEFAULT);
+ if (ret < 0 && ret != -ENOENT) {
+ return ret;
+ }
+#endif
+ break;
+ case PM_DEVICE_ACTION_SUSPEND:
+#ifdef CONFIG_PINCTRL
+ ret = pinctrl_apply_state(data->pincfg, PINCTRL_STATE_SLEEP);
+ if (ret < 0 && ret != -ENOENT) {
+ return ret;
+ }
+#endif
+ break;
+ default:
+ return -ENOTSUP;
+ }
+
+ return 0;
+}
+#endif
+
#if defined(CONFIG_XIP) && defined(CONFIG_CODE_FLEXSPI)
#define MEMC_FLEXSPI_CFG_XIP(node_id) DT_SAME_NODE(node_id, DT_NODELABEL(flexspi))
#elif defined(CONFIG_XIP) && defined(CONFIG_CODE_FLEXSPI2)
@@ -209,9 +241,11 @@ static int memc_flexspi_init(const struct device *dev)
PINCTRL_INIT(n) \
}; \
\
+ PM_DEVICE_DT_INST_DEFINE(n, memc_flexspi_pm_action); \
+ \
DEVICE_DT_INST_DEFINE(n, \
memc_flexspi_init, \
- NULL, \
+ PM_DEVICE_DT_INST_GET(n), \
&memc_flexspi_data_##n, \
NULL, \
POST_KERNEL, \
