test: Add tests for board uclass

Add tests for the new board uclass.

Reviewed-by: Simon Glass <sjg@chromium.org>
Signed-off-by: Mario Six <mario.six@gdsys.cc>
diff --git a/drivers/board/Kconfig b/drivers/board/Kconfig
index cc1cf27..2a3fc9c 100644
--- a/drivers/board/Kconfig
+++ b/drivers/board/Kconfig
@@ -10,8 +10,13 @@
 
 
 config BOARD_GAZERBEAM
-	bool "Enable device information for the Gazerbeam board"
+	bool "Enable board driver for the Gazerbeam board"
 	help
 	  Support querying device information for the gdsys Gazerbeam board.
 
+config BOARD_SANDBOX
+	bool "Enable board driver for the Sandbox board"
+	help
+	  Support querying device information for the Sandbox boards.
+
 endif
diff --git a/drivers/board/Makefile b/drivers/board/Makefile
index 12dd203..2224338 100644
--- a/drivers/board/Makefile
+++ b/drivers/board/Makefile
@@ -4,3 +4,4 @@
 # Mario Six,  Guntermann & Drunck GmbH, mario.six@gdsys.cc
 obj-$(CONFIG_BOARD) += board-uclass.o
 obj-$(CONFIG_BOARD_GAZERBEAM) += gazerbeam.o
+obj-$(CONFIG_BOARD_SANDBOX) += sandbox.o
diff --git a/drivers/board/sandbox.c b/drivers/board/sandbox.c
new file mode 100644
index 0000000..50621e4
--- /dev/null
+++ b/drivers/board/sandbox.c
@@ -0,0 +1,107 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * (C) Copyright 2018
+ * Mario Six, Guntermann & Drunck GmbH, mario.six@gdsys.cc
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <board.h>
+
+#include "sandbox.h"
+
+struct board_sandbox_priv {
+	bool called_detect;
+	int test_i1;
+	int test_i2;
+};
+
+char vacation_spots[][64] = {"R'lyeh", "Dreamlands", "Plateau of Leng",
+			     "Carcosa", "Yuggoth", "The Nameless City"};
+
+int board_sandbox_detect(struct udevice *dev)
+{
+	struct board_sandbox_priv *priv = dev_get_priv(dev);
+
+	priv->called_detect = true;
+	priv->test_i2 = 100;
+
+	return 0;
+}
+
+int board_sandbox_get_bool(struct udevice *dev, int id, bool *val)
+{
+	struct board_sandbox_priv *priv = dev_get_priv(dev);
+
+	switch (id) {
+	case BOOL_CALLED_DETECT:
+		/* Checks if the dectect method has been called */
+		*val = priv->called_detect;
+		return 0;
+	}
+
+	return -ENOENT;
+}
+
+int board_sandbox_get_int(struct udevice *dev, int id, int *val)
+{
+	struct board_sandbox_priv *priv = dev_get_priv(dev);
+
+	switch (id) {
+	case INT_TEST1:
+		*val = priv->test_i1;
+		/* Increments with every call */
+		priv->test_i1++;
+		return 0;
+	case INT_TEST2:
+		*val = priv->test_i2;
+		/* Decrements with every call */
+		priv->test_i2--;
+		return 0;
+	}
+
+	return -ENOENT;
+}
+
+int board_sandbox_get_str(struct udevice *dev, int id, size_t size, char *val)
+{
+	struct board_sandbox_priv *priv = dev_get_priv(dev);
+	int i1 = priv->test_i1;
+	int i2 = priv->test_i2;
+	int index = (i1 * i2) % ARRAY_SIZE(vacation_spots);
+
+	switch (id) {
+	case STR_VACATIONSPOT:
+		/* Picks a vacation spot depending on i1 and i2 */
+		snprintf(val, size, vacation_spots[index]);
+		return 0;
+	}
+
+	return -ENOENT;
+}
+
+static const struct udevice_id board_sandbox_ids[] = {
+	{ .compatible = "sandbox,board_sandbox" },
+	{ /* sentinel */ }
+};
+
+static const struct board_ops board_sandbox_ops = {
+	.detect = board_sandbox_detect,
+	.get_bool = board_sandbox_get_bool,
+	.get_int = board_sandbox_get_int,
+	.get_str = board_sandbox_get_str,
+};
+
+int board_sandbox_probe(struct udevice *dev)
+{
+	return 0;
+}
+
+U_BOOT_DRIVER(board_sandbox) = {
+	.name           = "board_sandbox",
+	.id             = UCLASS_BOARD,
+	.of_match       = board_sandbox_ids,
+	.ops		= &board_sandbox_ops,
+	.priv_auto_alloc_size = sizeof(struct board_sandbox_priv),
+	.probe          = board_sandbox_probe,
+};
diff --git a/drivers/board/sandbox.h b/drivers/board/sandbox.h
new file mode 100644
index 0000000..2cff494
--- /dev/null
+++ b/drivers/board/sandbox.h
@@ -0,0 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * (C) Copyright 2018
+ * Mario Six,  Guntermann & Drunck GmbH, mario.six@gdsys.cc
+ */
+
+enum {
+	BOOL_CALLED_DETECT,
+	INT_TEST1,
+	INT_TEST2,
+	STR_VACATIONSPOT,
+};