| /* |
| * 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); |