Add tests of each API call using a sandbox pinctrl device.

Signed-off-by: Simon Glass <s...@chromium.org>
---

 arch/sandbox/dts/test.dts               | 11 ++++-
 configs/sandbox_defconfig               |  1 +
 drivers/pinctrl/Makefile                |  1 +
 drivers/pinctrl/pinctrl_sandbox.c       | 80 +++++++++++++++++++++++++++++++++
 include/dt-bindings/clock/sandbox-clk.h | 10 +++++
 test/dm/Makefile                        |  1 +
 test/dm/pinctrl.c                       | 63 ++++++++++++++++++++++++++
 7 files changed, 166 insertions(+), 1 deletion(-)
 create mode 100644 drivers/pinctrl/pinctrl_sandbox.c
 create mode 100644 include/dt-bindings/clock/sandbox-clk.h
 create mode 100644 test/dm/pinctrl.c

diff --git a/arch/sandbox/dts/test.dts b/arch/sandbox/dts/test.dts
index 3c9abb3..7447f80 100644
--- a/arch/sandbox/dts/test.dts
+++ b/arch/sandbox/dts/test.dts
@@ -1,3 +1,5 @@
+#include <dt-bindings/clock/sandbox-clk.h>
+
 /dts-v1/;
 
 / {
@@ -105,7 +107,7 @@
                compatible = "denx,u-boot-fdt-test";
        };
 
-       clk@0 {
+       clk: clk@0 {
                compatible = "sandbox,clk";
        };
 
@@ -149,6 +151,7 @@
                reg = <0>;
                compatible = "sandbox,i2c";
                clock-frequency = <100000>;
+               clocks = <&clk SANDBOX_CLK_I2C>;
                eeprom@2c {
                        reg = <0x2c>;
                        compatible = "i2c-eeprom";
@@ -183,6 +186,7 @@
        pci: pci-controller {
                compatible = "sandbox,pci";
                device_type = "pci";
+               clocks = <&clk SANDBOX_CLK_PCI>;
                #address-cells = <3>;
                #size-cells = <2>;
                ranges = <0x02000000 0 0x10000000 0x10000000 0 0x2000
@@ -196,10 +200,15 @@
                };
        };
 
+       pinctrl@0 {
+               compatible = "sandbox,pinctrl";
+       };
+
        spi@0 {
                #address-cells = <1>;
                #size-cells = <0>;
                reg = <0>;
+               clocks = <&clk SANDBOX_CLK_SPI>;
                compatible = "sandbox,spi";
                cs-gpios = <0>, <&gpio_a 0>;
                spi.bin@0 {
diff --git a/configs/sandbox_defconfig b/configs/sandbox_defconfig
index 290d7c4..6fd4fa2 100644
--- a/configs/sandbox_defconfig
+++ b/configs/sandbox_defconfig
@@ -44,3 +44,4 @@ CONFIG_UT_DM=y
 CONFIG_UT_ENV=y
 CONFIG_SANDBOX_SERIAL=y
 CONFIG_CLK=y
+CONFIG_PINCTRL=y
diff --git a/drivers/pinctrl/Makefile b/drivers/pinctrl/Makefile
index 764b1bf..0464a7b 100644
--- a/drivers/pinctrl/Makefile
+++ b/drivers/pinctrl/Makefile
@@ -7,3 +7,4 @@
 
 obj-$(CONFIG_PINCTRL) += pinctrl-uclass.o
 obj-$(CONFIG_ARCH_ROCKCHIP) += rockchip/
+obj-$(CONFIG_SANDBOX) += pinctrl_sandbox.o
diff --git a/drivers/pinctrl/pinctrl_sandbox.c 
b/drivers/pinctrl/pinctrl_sandbox.c
new file mode 100644
index 0000000..9a26b96
--- /dev/null
+++ b/drivers/pinctrl/pinctrl_sandbox.c
@@ -0,0 +1,80 @@
+/*
+ * Copyright (c) 2015 Google, Inc
+ * Written by Simon Glass <s...@chromium.org>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <errno.h>
+#include <pinctrl.h>
+#include <asm/test.h>
+#include <dt-bindings/clock/sandbox-clk.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+static int sandbox_pinctrl_request(struct udevice *dev, int func, int flags)
+{
+       debug("%s: func=%x, flags=%x\n", __func__, func, flags);
+
+       /* We require particular flag values, just as a sanity check */
+       switch (func) {
+       case PERIPH_ID_SPI:
+               if (flags != 1)
+                       return -EINVAL;
+               break;
+       case PERIPH_ID_I2C:
+               if (flags != 0)
+                       return -EINVAL;
+               break;
+       case PERIPH_ID_PCI:
+               if (flags != 7)
+                       return -EINVAL;
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       return 0;
+}
+
+static int sandbox_pinctrl_get_periph_id(struct udevice *dev,
+                                       struct udevice *periph)
+{
+       u32 cell[2];
+       int ret;
+
+       ret = fdtdec_get_int_array(gd->fdt_blob, periph->of_offset,
+                                  "clocks", cell, ARRAY_SIZE(cell));
+       if (ret < 0)
+               return -EINVAL;
+
+       switch (cell[1]) {
+       case SANDBOX_CLK_SPI:
+               return PERIPH_ID_SPI;
+       case SANDBOX_CLK_I2C:
+               return PERIPH_ID_I2C;
+       case SANDBOX_CLK_PCI:
+               return PERIPH_ID_PCI;
+       }
+
+       return -ENOENT;
+}
+
+static struct pinctrl_ops sandbox_pinctrl_ops = {
+       .request        = sandbox_pinctrl_request,
+       .get_periph_id  = sandbox_pinctrl_get_periph_id,
+};
+
+static const struct udevice_id sandbox_pinctrl_ids[] = {
+       { .compatible = "sandbox,pinctrl" },
+       { }
+};
+
+U_BOOT_DRIVER(pinctrl_sandbox) = {
+       .name           = "pinctrl_sandbox",
+       .id             = UCLASS_PINCTRL,
+       .of_match       = sandbox_pinctrl_ids,
+       .ops            = &sandbox_pinctrl_ops,
+};
diff --git a/include/dt-bindings/clock/sandbox-clk.h 
b/include/dt-bindings/clock/sandbox-clk.h
new file mode 100644
index 0000000..edc7c29
--- /dev/null
+++ b/include/dt-bindings/clock/sandbox-clk.h
@@ -0,0 +1,10 @@
+/*
+ * Copyright (c) 2015 Google, Inc
+ * Author: Simon Glass <s...@chromium.org>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#define SANDBOX_CLK_SPI                42
+#define SANDBOX_CLK_PCI                43
+#define SANDBOX_CLK_I2C                44
diff --git a/test/dm/Makefile b/test/dm/Makefile
index 7947545..d781535 100644
--- a/test/dm/Makefile
+++ b/test/dm/Makefile
@@ -20,6 +20,7 @@ obj-$(CONFIG_DM_ETH) += eth.o
 obj-$(CONFIG_DM_GPIO) += gpio.o
 obj-$(CONFIG_DM_I2C) += i2c.o
 obj-$(CONFIG_DM_PCI) += pci.o
+obj-$(CONFIG_PINCTRL) += pinctrl.o
 obj-$(CONFIG_DM_RTC) += rtc.o
 obj-$(CONFIG_DM_SPI_FLASH) += sf.o
 obj-$(CONFIG_DM_SPI) += spi.o
diff --git a/test/dm/pinctrl.c b/test/dm/pinctrl.c
new file mode 100644
index 0000000..f0fe6f2
--- /dev/null
+++ b/test/dm/pinctrl.c
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2015 Google, Inc
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <pinctrl.h>
+#include <asm/io.h>
+#include <asm/test.h>
+#include <dm/test.h>
+#include <linux/err.h>
+#include <test/ut.h>
+
+/* Test that we can obtain peripheral IDs */
+static int dm_test_pinctrl_periph(struct unit_test_state *uts)
+{
+       struct udevice *pinctrl, *dev;
+
+       ut_assertok(uclass_get_device(UCLASS_PINCTRL, 0, &pinctrl));
+       ut_assertok(uclass_get_device_by_seq(UCLASS_SPI, 0, &dev));
+       ut_asserteq(PERIPH_ID_SPI, pinctrl_get_periph_id(pinctrl, dev));
+
+       ut_assertok(uclass_get_device_by_seq(UCLASS_I2C, 0, &dev));
+       ut_asserteq(PERIPH_ID_I2C, pinctrl_get_periph_id(pinctrl, dev));
+
+       ut_assertok(uclass_get_device_by_seq(UCLASS_PCI, 0, &dev));
+       ut_asserteq(PERIPH_ID_PCI, pinctrl_get_periph_id(pinctrl, dev));
+
+       return 0;
+}
+DM_TEST(dm_test_pinctrl_periph, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
+
+/* Test that we can adjust pinctrl settings */
+static int dm_test_pinctrl_request(struct unit_test_state *uts)
+{
+       struct udevice *pinctrl, *dev;
+       int id;
+
+       ut_assertok(uclass_get_device(UCLASS_PINCTRL, 0, &pinctrl));
+
+       ut_assertok(uclass_get_device_by_seq(UCLASS_SPI, 0, &dev));
+       id = pinctrl_get_periph_id(pinctrl, dev);
+       ut_asserteq(-EINVAL, pinctrl_request(pinctrl, id, 0));
+       ut_asserteq(-EINVAL, pinctrl_request_noflags(pinctrl, id));
+       ut_assertok(pinctrl_request(pinctrl, id, 1));
+
+       ut_assertok(uclass_get_device_by_seq(UCLASS_I2C, 0, &dev));
+       id = pinctrl_get_periph_id(pinctrl, dev);
+       ut_asserteq(-EINVAL, pinctrl_request(pinctrl, id, 2));
+       ut_assertok(pinctrl_request_noflags(pinctrl, id));
+       ut_assertok(pinctrl_request(pinctrl, id, 0));
+
+       ut_assertok(uclass_get_device_by_seq(UCLASS_PCI, 0, &dev));
+       id = pinctrl_get_periph_id(pinctrl, dev);
+       ut_asserteq(-EINVAL, pinctrl_request(pinctrl, id, 0));
+       ut_asserteq(-EINVAL, pinctrl_request_noflags(pinctrl, id));
+       ut_assertok(pinctrl_request(pinctrl, id, 7));
+
+       return 0;
+}
+DM_TEST(dm_test_pinctrl_request, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
-- 
2.4.3.573.g4eafbef

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to