boards: arm: Add support for Silabs EFM32WG-STK3800

The EFM32 Wonder Gecko Starter Kit contains sensors and
peripherals demonstarting the usage of the EFM32WG MCU
family. This patch add basic support for this board.

Signed-off-by: Christian Taedcke <hacking@taedcke.com>
Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
diff --git a/boards/arm/efm32wg_stk3800/Kconfig b/boards/arm/efm32wg_stk3800/Kconfig
new file mode 100644
index 0000000..cf7971f
--- /dev/null
+++ b/boards/arm/efm32wg_stk3800/Kconfig
@@ -0,0 +1,19 @@
+# Kconfig - EFM32WG STK3800 board configuration
+#
+# Copyright (c) 2017 Christian Taedcke
+#
+# SPDX-License-Identifier: Apache-2.0
+
+if BOARD_EFM32WG_STK3800
+
+config BOARD_INIT_PRIORITY
+	int
+
+	# omit prompt to signify a "hidden" option
+	default KERNEL_INIT_PRIORITY_DEFAULT
+	depends on GPIO
+	help
+	  Board initialization priority. This must be bigger than
+	  GPIO_GECKO_COMMON_INIT_PRIORITY.
+
+endif # BOARD_EFM32WG_STK3800
diff --git a/boards/arm/efm32wg_stk3800/Kconfig.board b/boards/arm/efm32wg_stk3800/Kconfig.board
new file mode 100644
index 0000000..82d8192
--- /dev/null
+++ b/boards/arm/efm32wg_stk3800/Kconfig.board
@@ -0,0 +1,11 @@
+# Kconfig - EFM32WG STK3800 board
+#
+# Copyright (c) 2017, Christian Taedcke
+#
+# SPDX-License-Identifier: Apache-2.0
+#
+
+config BOARD_EFM32WG_STK3800
+	bool "SiLabs EFM32WG-STK3800 (Wonder Gecko)"
+	depends on SOC_SERIES_EFM32WG
+	select SOC_PART_NUMBER_EFM32WG990F256
diff --git a/boards/arm/efm32wg_stk3800/Kconfig.defconfig b/boards/arm/efm32wg_stk3800/Kconfig.defconfig
new file mode 100644
index 0000000..25a7763
--- /dev/null
+++ b/boards/arm/efm32wg_stk3800/Kconfig.defconfig
@@ -0,0 +1,51 @@
+# Kconfig - EFM32WG STK3800 board
+#
+# Copyright (c) 2017, Christian Taedcke
+#
+# SPDX-License-Identifier: Apache-2.0
+#
+
+if BOARD_EFM32WG_STK3800
+
+config BOARD
+	default efm32wg_stk3800
+
+config CMU_HFXO_FREQ
+	default 48000000
+
+config CMU_LFXO_FREQ
+	default 32768
+
+if GPIO_GECKO
+
+config GPIO_GECKO_PORTA
+	def_bool y
+
+config GPIO_GECKO_PORTB
+	def_bool y
+
+config GPIO_GECKO_PORTC
+	def_bool n
+
+config GPIO_GECKO_PORTD
+	def_bool n
+
+config GPIO_GECKO_PORTE
+	def_bool y
+
+config GPIO_GECKO_PORTF
+	def_bool y
+
+endif # GPIO_GECKO
+
+if UART_GECKO
+
+config UART_GECKO_0
+	def_bool y
+
+config UART_GECKO_0_GPIO_LOC
+	default 1
+
+endif # UART_GECKO
+
+endif # BOARD_EFM32WG_STK3800
diff --git a/boards/arm/efm32wg_stk3800/Makefile b/boards/arm/efm32wg_stk3800/Makefile
new file mode 100644
index 0000000..6ece6a9
--- /dev/null
+++ b/boards/arm/efm32wg_stk3800/Makefile
@@ -0,0 +1,10 @@
+# Makefile - EFM32WG-STK3800 board
+#
+# Copyright (c) 2017, Christian Taedcke
+#
+# SPDX-License-Identifier: Apache-2.0
+#
+
+ccflags-y +=-I$(srctree)/drivers
+
+obj-$(CONFIG_UART_GECKO) += board.o
diff --git a/boards/arm/efm32wg_stk3800/board.c b/boards/arm/efm32wg_stk3800/board.c
new file mode 100644
index 0000000..d6df966
--- /dev/null
+++ b/boards/arm/efm32wg_stk3800/board.c
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2017 Christian Taedcke
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+#include <init.h>
+#include <board.h>
+#include <gpio.h>
+#include <misc/printk.h>
+
+static int efm32wg_stk3800_init(struct device *dev)
+{
+	struct device *bce_dev; /* Board Controller Enable Gpio Device */
+
+	ARG_UNUSED(dev);
+
+	/* Enable the board controller to be able to use the serial port */
+	bce_dev = device_get_binding(BC_ENABLE_GPIO_NAME);
+
+	if (!bce_dev) {
+		printk("Board controller gpio port was not found!\n");
+		return -ENODEV;
+	}
+
+	gpio_pin_configure(bce_dev, BC_ENABLE_GPIO_PIN, GPIO_DIR_OUT);
+	gpio_pin_write(bce_dev, BC_ENABLE_GPIO_PIN, 1);
+
+	return 0;
+}
+
+/* needs to be done after GPIO driver init */
+SYS_INIT(efm32wg_stk3800_init, PRE_KERNEL_1, CONFIG_BOARD_INIT_PRIORITY);
diff --git a/boards/arm/efm32wg_stk3800/board.h b/boards/arm/efm32wg_stk3800/board.h
new file mode 100644
index 0000000..4aeb835
--- /dev/null
+++ b/boards/arm/efm32wg_stk3800/board.h
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2017 Christian Taedcke
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+#ifndef __INC_BOARD_H
+#define __INC_BOARD_H
+
+#include <soc.h>
+
+/* Push button PB0 */
+#define PB0_GPIO_NAME	CONFIG_GPIO_GECKO_PORTB_NAME
+#define PB0_GPIO_PIN	9
+
+/* Push button PB1 */
+#define PB1_GPIO_NAME	CONFIG_GPIO_GECKO_PORTB_NAME
+#define PB1_GPIO_PIN	10
+
+/* LED 0 */
+#define LED0_GPIO_NAME	CONFIG_GPIO_GECKO_PORTE_NAME
+#define LED0_GPIO_PORT  LED0_GPIO_NAME
+#define LED0_GPIO_PIN	2
+
+/* LED 1 */
+#define LED1_GPIO_NAME	CONFIG_GPIO_GECKO_PORTE_NAME
+#define LED1_GPIO_PIN	3
+
+/* Push button switch 0. There is no physical switch on the board with this
+ * name, so create an alias to SW3 to make the basic button sample work.
+ */
+#define SW0_GPIO_NAME	PB0_GPIO_NAME
+#define SW0_GPIO_PIN	PB0_GPIO_PIN
+
+/* This pin is used to enable the serial port using the board controller */
+#define BC_ENABLE_GPIO_NAME  CONFIG_GPIO_GECKO_PORTF_NAME
+#define BC_ENABLE_GPIO_PIN   7
+
+#endif /* __INC_BOARD_H */
diff --git a/boards/arm/efm32wg_stk3800/doc/efm32wg_stk3800.jpg b/boards/arm/efm32wg_stk3800/doc/efm32wg_stk3800.jpg
new file mode 100644
index 0000000..7ec398a
--- /dev/null
+++ b/boards/arm/efm32wg_stk3800/doc/efm32wg_stk3800.jpg
Binary files differ
diff --git a/boards/arm/efm32wg_stk3800/doc/efm32wg_stk3800.rst b/boards/arm/efm32wg_stk3800/doc/efm32wg_stk3800.rst
new file mode 100644
index 0000000..8b8ca19
--- /dev/null
+++ b/boards/arm/efm32wg_stk3800/doc/efm32wg_stk3800.rst
@@ -0,0 +1,174 @@
+.. _efm32wg_stk3800:
+
+EFM32WG-STK3800
+###############
+
+Overview
+********
+
+The EFM32 Wonder Gecko Starter Kit EFM32WG-STK3800 contains a MCU from the
+EFM32WG family built on ARM® Cortex®-M4F processor with excellent low
+power capabilities.
+
+.. image:: efm32wg_stk3800.jpg
+   :width: 375px
+   :align: center
+   :alt: EFM32WG-STK3800
+
+Hardware
+********
+
+- Advanced Energy Monitoring provides real-time information about the energy
+  consumption of an application or prototype design.
+- 32MByte parallel NAND Flash
+- 160 segment Energy Micro LCD
+- 2 user buttons, 2 LEDs and a touch slider
+- Ambient Light Sensor and Inductive-capacitive metal sensor
+- On-board Segger J-Link USB debugger
+
+For more information about the EFM32WG SoC and EFM32WG-STK3800 board:
+
+- `EFM32WG Website`_
+- `EFM32WG Datasheet`_
+- `EFM32WG Reference Manual`_
+- `EFM32WG-STK3800 Website`_
+- `EFM32WG-STK3800 User Guide`_
+- `EFM32WG-STK3800 Schematics`_
+
+Supported Features
+==================
+
+The efm32wg_stk3800oard configuration supports the following hardware features:
+
++-----------+------------+-------------------------------------+
+| Interface | Controller | Driver/Component                    |
++===========+============+=====================================+
+| NVIC      | on-chip    | nested vector interrupt controller  |
++-----------+------------+-------------------------------------+
+| SYSTICK   | on-chip    | systick                             |
++-----------+------------+-------------------------------------+
+| GPIO      | on-chip    | gpio                                |
++-----------+------------+-------------------------------------+
+| UART      | on-chip    | serial port-polling;                |
+|           |            | serial port-interrupt               |
++-----------+------------+-------------------------------------+
+
+The default configuration can be found in the defconfig file:
+
+	``boards/arm/efm32wg_stk3800/efm32wg_stk3800_defconfig``
+
+Other hardware features are currently not supported by the port.
+
+Connections and IOs
+===================
+
+The EFM32WG SoC has six gpio controllers (PORTA to PORTF), but only three are
+currently enabled (PORTB, PORTE and PORTF) for the EFM32WG-STK3800 board.
+
+In the following table, the column Name contains Pin names. For example, PE2
+means Pin number 2 on PORTE, as used in the board's datasheets and manuals.
+
++-------+-------------+-------------------------------------+
+| Name  | Function    | Usage                               |
++=======+=============+=====================================+
+| PE2   | GPIO        | LED0                                |
++-------+-------------+-------------------------------------+
+| PE3   | GPIO        | LED1                                |
++-------+-------------+-------------------------------------+
+| PB0   | GPIO        | Push Button PB0                     |
++-------+-------------+-------------------------------------+
+| PB1   | GPIO        | Push Button PB1                     |
++-------+-------------+-------------------------------------+
+| PF7   | GPIO        | Board Controller Enable             |
+|       |             | EFM_BC_EN                           |
++-------+-------------+-------------------------------------+
+| PE0   | UART0_TX    | UART Console EFM_BC_TX U0_TX #1     |
++-------+-------------+-------------------------------------+
+| PE1   | UART0_RX    | UART Console EFM_BC_RX U0_RX #1     |
++-------+-------------+-------------------------------------+
+
+System Clock
+============
+
+The EFM32WG SoC is configured to use the 48 MHz external oscillator on the
+board.
+
+Serial Port
+===========
+
+The EFM32WG SoC has three USARTs, two UARTs and two Low Energy UARTs (LEUART).
+UART0 is connected to the board controller and is used for the console.
+
+Programming and Debugging
+*************************
+
+.. note:
+   Before useing the kit the first time, you should update the J-Link firmware
+   from `J-Link-Downloads`_
+
+Flashing
+========
+
+The EFM32WG-STK3800 includes an `J-Link`_ serial and debug adaptor built into the
+board. The adaptor provides:
+
+- A USB connection to the host computer, which exposes a Mass Storage and a
+  USB Serial Port.
+- A Serial Flash device, which implements the USB flash disk file storage.
+- A physical UART connection which is relayed over interface USB Serial port.
+
+Flashing an application to EFM32-STK3800
+----------------------------------------
+
+The sample application :ref:`hello_world` is used for this example.
+Build the Zephyr kernel and application:
+
+.. code-block:: console
+
+   $ cd <zephyr_root_path>
+   $ . zephyr-env.sh
+   $ cd samples/hello_world/
+   $ make BOARD=efm32wg_stk3800
+
+Connect the EFM32WG-STK3800 to your host computer using the USB port and you
+should see a USB connection which exposes a Mass Storage (STK3800) and a
+USB Serial Port. Copy the generated zephyr.bin in the STK3800 drive.
+
+Open a serial terminal (minicom, putty, etc.) with the following settings:
+
+- Speed: 115200
+- Data: 8 bits
+- Parity: None
+- Stop bits: 1
+
+Reset the board and you should be able to see on the corresponding Serial Port
+the following message:
+
+.. code-block:: console
+
+   Hello World! arm
+
+
+.. _EFM32WG-STK3800 Website:
+   http://www.silabs.com/products/development-tools/mcu/32-bit/efm32-wonder-gecko-starter-kit
+
+.. _EFM32WG-STK3800 User Guide:
+   http://www.silabs.com/documents/public/user-guides/efm32wg-stk3800-ug.pdf
+
+.. _EFM32WG-STK3800 Schematics:
+   http://www.silabs.com/documents/public/schematic-files/BRD2400A_A00.pdf
+
+.. _EFM32WG Website:
+   http://www.silabs.com/products/mcu/32-bit/efm32-wonder-gecko
+
+.. _EFM32WG Datasheet:
+   http://www.silabs.com/documents/public/data-sheets/EFM32WG990.pdf
+
+.. _EFM32WG Reference Manual:
+   http://www.silabs.com/documents/public/reference-manuals/EFM32WG-RM.pdf
+
+.. _J-Link:
+   https://www.segger.com/jlink-debug-probes.html
+
+.. _J-Link-Downloads:
+   https://www.segger.com/downloads/jlink
diff --git a/boards/arm/efm32wg_stk3800/efm32wg_stk3800.yaml b/boards/arm/efm32wg_stk3800/efm32wg_stk3800.yaml
new file mode 100644
index 0000000..90065fe
--- /dev/null
+++ b/boards/arm/efm32wg_stk3800/efm32wg_stk3800.yaml
@@ -0,0 +1,13 @@
+identifier: efm32wg_stk3800
+name: EFM32WG-STK3800
+type: mcu
+arch: arm
+ram: 32
+flash: 256
+toolchain:
+  - zephyr
+  - gccarmemb
+testing:
+  ignore_tags:
+    - net
+    - bluetooth
diff --git a/boards/arm/efm32wg_stk3800/efm32wg_stk3800_defconfig b/boards/arm/efm32wg_stk3800/efm32wg_stk3800_defconfig
new file mode 100644
index 0000000..63edd59
--- /dev/null
+++ b/boards/arm/efm32wg_stk3800/efm32wg_stk3800_defconfig
@@ -0,0 +1,11 @@
+CONFIG_ARM=y
+CONFIG_SOC_FAMILY_EXX32=y
+CONFIG_SOC_SERIES_EFM32WG=y
+CONFIG_BOARD_EFM32WG_STK3800=y
+CONFIG_CONSOLE=y
+CONFIG_UART_CONSOLE=y
+CONFIG_SERIAL=y
+CONFIG_CORTEX_M_SYSTICK=y
+CONFIG_GPIO=y
+CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC=48000000
+CONFIG_CMU_HFCLK_HFXO=y
diff --git a/dts/arm/Makefile b/dts/arm/Makefile
index 4a3c13a..56c17cfe 100644
--- a/dts/arm/Makefile
+++ b/dts/arm/Makefile
@@ -49,6 +49,7 @@
 dtb-$(CONFIG_BOARD_STM32F3_DISCO)       =       stm32f3_disco.dts_compiled
 dtb-$(CONFIG_BOARD_OLIMEX_STM32_P405)	=	olimex_stm32_p405.dts_compiled
 dtb-$(CONFIG_BOARD_STM32F429I_DISC1)	=	stm32f429i_disc1.dts_compiled
+dtb-$(CONFIG_BOARD_EFM32WG_STK3800)	=	efm32wg_stk3800.dts_compiled
 
 always	:= $(dtb-y)
 endif
diff --git a/dts/arm/efm32wg_stk3800.dts b/dts/arm/efm32wg_stk3800.dts
new file mode 100644
index 0000000..b3c4288
--- /dev/null
+++ b/dts/arm/efm32wg_stk3800.dts
@@ -0,0 +1,24 @@
+/*
+ * Copyright (c) 2017 I-SENSE group of ICCS
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+/dts-v1/;
+#include <silabs/efm32wg.dtsi>
+
+/ {
+	model = "Silicon Labs EFM32WG STK3800 board";
+	compatible = "silabs,efm32wg_stk3800", "silabs,efm32wg";
+
+	chosen {
+		zephyr,console = &uart0;
+		zephyr,sram = &sram0;
+		zephyr,flash = &flash0;
+	};
+};
+
+&uart0 {
+	current-speed = <115200>;
+	status = "ok";
+};
diff --git a/dts/arm/efm32wg_stk3800.fixup b/dts/arm/efm32wg_stk3800.fixup
new file mode 100644
index 0000000..e9355a1
--- /dev/null
+++ b/dts/arm/efm32wg_stk3800.fixup
@@ -0,0 +1,12 @@
+/* This file is a temporary workaround for mapping of the generated information
+ * to the current driver definitions.  This will be removed when the drivers
+ * are modified to handle the generated information, or the mapping of
+ * generated data matches the driver definitions.
+ */
+
+
+#define CONFIG_NUM_IRQ_PRIO_BITS	ARM_V7M_NVIC_E000E100_ARM_NUM_IRQ_PRIORITY_BITS
+#define CONFIG_UART_GECKO_0_NAME	SILABS_EFM32_USART_4000C000_LABEL
+
+#define CONFIG_UART_GECKO_0_BAUD_RATE	SILABS_EFM32_USART_4000C000_CURRENT_SPEED
+#define CONFIG_UART_GECKO_0_IRQ_PRI	SILABS_EFM32_USART_4000C000_IRQ_0_PRIORITY