blob: d2f9f78fd3aaa291173fce152fe268bdcde9d8ef [file] [log] [blame]
/*
* Copyright (c) 2023, Commonwealth Scientific and Industrial Research
* Organisation (CSIRO) ABN 41 687 119 230.
*
* SPDX-License-Identifier: Apache-2.0
*
* State checking in this test is done via the GPIO state instead of
* the PM API as this test runs without the PM api enabled.
*/
#include <zephyr/ztest.h>
#include <zephyr/drivers/gpio.h>
#include <zephyr/pm/device.h>
#include <zephyr/pm/device_runtime.h>
#define POWER_GPIO_CONFIG_IS(node_id, config)\
{\
const struct gpio_dt_spec gpio = GPIO_DT_SPEC_GET(node_id, enable_gpios);\
gpio_flags_t gpio_config; \
int gpio_ret = gpio_pin_get_config_dt(&gpio, &gpio_config); \
zassert_equal(gpio_ret, 0, "GPIO config retrieval failed"); \
zassert_equal(gpio_config, config, "Unexpected config");\
}
#define DEVICE_STATE_IS(node_id, value) \
rc = pm_device_state_get(DEVICE_DT_GET(node_id), &state); \
zassert_equal(rc, 0, "Device state retrieval failed"); \
zassert_equal(state, value, "Unexpected device state");
ZTEST(device_driver_init, test_device_driver_init)
{
#if IS_ENABLED(CONFIG_PM_DEVICE_RUNTIME)
enum pm_device_state state;
int rc;
state = -1;
zassert_equal(strcmp("", pm_device_state_str(state)), 0, "Invalid device state");
/* No device runtime PM, starts on */
DEVICE_STATE_IS(DT_NODELABEL(test_reg), PM_DEVICE_STATE_ACTIVE);
DEVICE_STATE_IS(DT_NODELABEL(test_reg_chained), PM_DEVICE_STATE_ACTIVE);
POWER_GPIO_CONFIG_IS(DT_NODELABEL(test_reg), GPIO_OUTPUT_HIGH);
POWER_GPIO_CONFIG_IS(DT_NODELABEL(test_reg_chained), GPIO_OUTPUT_HIGH);
zassert_equal(strcmp("active", pm_device_state_str(state)), 0, "Invalid device state");
/* Device powered, zephyr,pm-device-runtime-auto, starts suspended */
DEVICE_STATE_IS(DT_NODELABEL(test_reg_chained_auto), PM_DEVICE_STATE_SUSPENDED);
DEVICE_STATE_IS(DT_NODELABEL(test_reg_auto), PM_DEVICE_STATE_SUSPENDED);
POWER_GPIO_CONFIG_IS(DT_NODELABEL(test_reg_chained_auto), GPIO_OUTPUT_LOW);
POWER_GPIO_CONFIG_IS(DT_NODELABEL(test_reg_auto), GPIO_OUTPUT_LOW);
zassert_equal(strcmp("suspended", pm_device_state_str(state)), 0, "Invalid device state");
/* Device not powered, starts off */
DEVICE_STATE_IS(DT_NODELABEL(test_reg_auto_chained), PM_DEVICE_STATE_OFF);
DEVICE_STATE_IS(DT_NODELABEL(test_reg_auto_chained_auto), PM_DEVICE_STATE_OFF);
POWER_GPIO_CONFIG_IS(DT_NODELABEL(test_reg_auto_chained), GPIO_DISCONNECTED);
POWER_GPIO_CONFIG_IS(DT_NODELABEL(test_reg_auto_chained_auto), GPIO_DISCONNECTED);
zassert_equal(strcmp("off", pm_device_state_str(state)), 0, "Invalid device state");
#else
/* Every regulator should be in "active" mode automatically.
* State checking via GPIO as PM API is disabled.
*/
POWER_GPIO_CONFIG_IS(DT_NODELABEL(test_reg), GPIO_OUTPUT_HIGH);
POWER_GPIO_CONFIG_IS(DT_NODELABEL(test_reg_chained), GPIO_OUTPUT_HIGH);
POWER_GPIO_CONFIG_IS(DT_NODELABEL(test_reg_chained_auto), GPIO_OUTPUT_HIGH);
POWER_GPIO_CONFIG_IS(DT_NODELABEL(test_reg_auto), GPIO_OUTPUT_HIGH);
POWER_GPIO_CONFIG_IS(DT_NODELABEL(test_reg_auto_chained), GPIO_OUTPUT_HIGH);
POWER_GPIO_CONFIG_IS(DT_NODELABEL(test_reg_auto_chained_auto), GPIO_OUTPUT_HIGH);
POWER_GPIO_CONFIG_IS(DT_NODELABEL(test_reg_disabled), GPIO_DISCONNECTED);
#endif
}
ZTEST_SUITE(device_driver_init, NULL, NULL, NULL, NULL, NULL);