zephyr/main: configure DFU detection GPIO-pin uisng DTS

Added support for configure GPIO-pin used for triggering the
recovery DFU using DTS. That pin is assigned thanks to
`mcuboot-button0` pin-allias.

DTS configuration takes precedence over the Kconfig pin configurations.

Signed-off-by: Andrzej Puzdrowski <andrzej.puzdrowski@nordicsemi.no>
diff --git a/boot/zephyr/main.c b/boot/zephyr/main.c
index 1525086..c9da8e5 100644
--- a/boot/zephyr/main.c
+++ b/boot/zephyr/main.c
@@ -370,13 +370,27 @@
 #if defined(CONFIG_MCUBOOT_SERIAL) || defined(CONFIG_BOOT_USB_DFU_GPIO)
 
 #ifdef CONFIG_MCUBOOT_SERIAL
+#define BUTTON_0_DETECT_DELAY CONFIG_BOOT_SERIAL_DETECT_DELAY
+#else
+#define BUTTON_0_DETECT_DELAY CONFIG_BOOT_USB_DFU_DETECT_DELAY
+#endif
+
+
+#define BUTTON_0_NODE DT_ALIAS(mcuboot_button0)
+
+#if DT_NODE_EXISTS(BUTTON_0_NODE) && DT_NODE_HAS_PROP(BUTTON_0_NODE, gpios)
+
+static const struct gpio_dt_spec button0 = GPIO_DT_SPEC_GET(BUTTON_0_NODE, gpios);
+
+#else /* fallback to legacy configuration */
+
+#if defined(CONFIG_MCUBOOT_SERIAL)
 
 #define BUTTON_0_GPIO_LABEL CONFIG_BOOT_SERIAL_DETECT_PORT
 #define BUTTON_0_GPIO_PIN CONFIG_BOOT_SERIAL_DETECT_PIN
 #define BUTTON_0_GPIO_FLAGS ((CONFIG_BOOT_SERIAL_DETECT_PIN_VAL) ?\
                                 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN) :\
                                 (GPIO_ACTIVE_LOW | GPIO_PULL_UP))
-#define BUTTON_0_DETECT_DELAY CONFIG_BOOT_SERIAL_DETECT_DELAY
 
 #elif defined(CONFIG_BOOT_USB_DFU_GPIO)
 
@@ -385,7 +399,16 @@
 #define BUTTON_0_GPIO_FLAGS ((CONFIG_BOOT_USB_DFU_DETECT_PIN_VAL) ?\
                                 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN) :\
                                 (GPIO_ACTIVE_LOW | GPIO_PULL_UP))
-#define BUTTON_0_DETECT_DELAY CONFIG_BOOT_USB_DFU_DETECT_DELAY
+
+#endif
+
+#define BUTTON_0_LEGACY 1
+
+static struct gpio_dt_spec button0 = {
+	.port = NULL,
+	.pin = BUTTON_0_GPIO_PIN,
+	.dt_flags = BUTTON_0_GPIO_FLAGS
+};
 
 #endif
 
@@ -393,20 +416,24 @@
 {
     int rc;
     int pin_active;
-    struct device const *detect_port;
 
-    detect_port = device_get_binding(BUTTON_0_GPIO_LABEL);
-    __ASSERT(detect_port, "Error: Bad port for boot detection.\n");
+#ifdef BUTTON_0_LEGACY
+    button0.port = device_get_binding(BUTTON_0_GPIO_LABEL);
+    if (button0.port == NULL) {
+        __ASSERT(false, "Error: Bad port for boot detection.\n");
+        return false;
+    }
+#else
+    if (!device_is_ready(button0.port)) {
+        __ASSERT(false, "GPIO device is not ready.\n");
+        return false;
+    }
+#endif
 
-    /* The default presence value is 0 which would normally be
-     * active-low, but historically the raw value was checked so we'll
-     * use the raw interface.
-     */
-    rc = gpio_pin_configure(detect_port, BUTTON_0_GPIO_PIN,
-                             BUTTON_0_GPIO_FLAGS | GPIO_INPUT);
+    rc = gpio_pin_configure_dt(&button0, GPIO_INPUT);
     __ASSERT(rc == 0, "Failed to initialize boot detect pin.\n");
 
-    rc = gpio_pin_get(detect_port, BUTTON_0_GPIO_PIN);
+    rc = gpio_pin_get_dt(&button0);
     pin_active = rc;
 
     __ASSERT(rc >= 0, "Failed to read boot detect pin.\n");
@@ -423,7 +450,7 @@
             int64_t timestamp = k_uptime_get();
 
             for(;;) {
-                rc = gpio_pin_get(detect_port, BUTTON_0_GPIO_PIN);
+                rc = gpio_pin_get_dt(&button0);
                 pin_active = rc;
                 __ASSERT(rc >= 0, "Failed to read boot detect pin.\n");