sandbox: add test of wdt_gpio driver
authorRasmus Villemoes <rasmus.villemoes@prevas.dk>
Thu, 19 Aug 2021 09:57:05 +0000 (11:57 +0200)
committerStefan Roese <sr@denx.de>
Tue, 31 Aug 2021 10:04:03 +0000 (12:04 +0200)
It seems that no other test has claimed gpio_a:7 yet, so use that.

The only small wrinkle is modifying the existing wdt test to use
uclass_get_device_by_driver() since we now have two UCLASS_WDT
instances in play, so it's a little more robust to fetch the device by
driver and not merely uclass+index.

Reviewed-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Stefan Roese <sr@denx.de>
Signed-off-by: Rasmus Villemoes <rasmus.villemoes@prevas.dk>
arch/sandbox/dts/test.dts
configs/sandbox64_defconfig
configs/sandbox_defconfig
test/dm/wdt.c

index 962bdbe..e91387a 100644 (file)
                };
        };
 
+       gpio-wdt {
+               gpios = <&gpio_a 7 0>;
+               compatible = "linux,wdt-gpio";
+               always-running;
+       };
+
        mbox: mbox {
                compatible = "sandbox,mbox";
                #mbox-cells = <1>;
index 3627a06..6cad90b 100644 (file)
@@ -225,6 +225,7 @@ CONFIG_SPLASH_SCREEN_ALIGN=y
 CONFIG_VIDEO_BMP_RLE8=y
 # CONFIG_WATCHDOG_AUTOSTART is not set
 CONFIG_WDT=y
+CONFIG_WDT_GPIO=y
 CONFIG_WDT_SANDBOX=y
 CONFIG_FS_CBFS=y
 CONFIG_FS_CRAMFS=y
index ec6b1c2..2b8d147 100644 (file)
@@ -283,6 +283,7 @@ CONFIG_W1_EEPROM=y
 CONFIG_W1_EEPROM_SANDBOX=y
 # CONFIG_WATCHDOG_AUTOSTART is not set
 CONFIG_WDT=y
+CONFIG_WDT_GPIO=y
 CONFIG_WDT_SANDBOX=y
 CONFIG_FS_CBFS=y
 CONFIG_FS_CRAMFS=y
index 24b991d..abff853 100644 (file)
@@ -6,6 +6,7 @@
 #include <common.h>
 #include <dm.h>
 #include <wdt.h>
+#include <asm/gpio.h>
 #include <asm/state.h>
 #include <asm/test.h>
 #include <dm/test.h>
@@ -19,7 +20,8 @@ static int dm_test_wdt_base(struct unit_test_state *uts)
        struct udevice *dev;
        const u64 timeout = 42;
 
-       ut_assertok(uclass_get_device(UCLASS_WDT, 0, &dev));
+       ut_assertok(uclass_get_device_by_driver(UCLASS_WDT,
+                                               DM_DRIVER_GET(wdt_sandbox), &dev));
        ut_assertnonnull(dev);
        ut_asserteq(0, state->wdt.counter);
        ut_asserteq(false, state->wdt.running);
@@ -39,3 +41,35 @@ static int dm_test_wdt_base(struct unit_test_state *uts)
        return 0;
 }
 DM_TEST(dm_test_wdt_base, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);
+
+static int dm_test_wdt_gpio(struct unit_test_state *uts)
+{
+       /*
+        * The sandbox wdt gpio is "connected" to gpio bank a, offset
+        * 7. Use the sandbox back door to verify that the gpio-wdt
+        * driver behaves as expected.
+        */
+       struct udevice *wdt, *gpio;
+       const u64 timeout = 42;
+       const int offset = 7;
+       int val;
+
+       ut_assertok(uclass_get_device_by_driver(UCLASS_WDT,
+                                               DM_DRIVER_GET(wdt_gpio), &wdt));
+       ut_assertnonnull(wdt);
+
+       ut_assertok(uclass_get_device_by_name(UCLASS_GPIO, "base-gpios", &gpio));
+       ut_assertnonnull(gpio);
+       ut_assertok(wdt_start(wdt, timeout, 0));
+
+       val = sandbox_gpio_get_value(gpio, offset);
+       ut_assertok(wdt_reset(wdt));
+       ut_asserteq(!val, sandbox_gpio_get_value(gpio, offset));
+       ut_assertok(wdt_reset(wdt));
+       ut_asserteq(val, sandbox_gpio_get_value(gpio, offset));
+
+       ut_asserteq(-ENOSYS, wdt_stop(wdt));
+
+       return 0;
+}
+DM_TEST(dm_test_wdt_gpio, UT_TESTF_SCAN_FDT);