From: Dinesh Maniyam <dinesh.mani...@altera.com>

Add s simple test for the I3C uclass in sandbox.

Signed-off-by: Dinesh Maniyam <dinesh.mani...@altera.com>
---
 arch/sandbox/dts/test.dts |  8 ++++++
 drivers/i3c/Kconfig       |  6 +++++
 drivers/i3c/Makefile      |  1 +
 drivers/i3c/sandbox_i3c.c | 56 +++++++++++++++++++++++++++++++++++++++
 test/dm/Makefile          |  1 +
 test/dm/i3c.c             | 34 ++++++++++++++++++++++++
 6 files changed, 106 insertions(+)
 create mode 100644 drivers/i3c/sandbox_i3c.c
 create mode 100644 test/dm/i3c.c

diff --git a/arch/sandbox/dts/test.dts b/arch/sandbox/dts/test.dts
index b8f3012873e..491c7dd56b1 100644
--- a/arch/sandbox/dts/test.dts
+++ b/arch/sandbox/dts/test.dts
@@ -935,6 +935,14 @@
                };
        };
 
+       i3c0 {
+               compatible = "sandbox,i3c";
+       };
+
+       i3c1 {
+               compatible = "sandbox,i3c";
+       };
+
        bootcount@0 {
                compatible = "u-boot,bootcount-rtc";
                rtc = <&rtc_1>;
diff --git a/drivers/i3c/Kconfig b/drivers/i3c/Kconfig
index d4451057de0..d877a744353 100644
--- a/drivers/i3c/Kconfig
+++ b/drivers/i3c/Kconfig
@@ -14,6 +14,12 @@ menuconfig I3C
          If you want I3C support, you should say Y here and also to the
          specific driver for your bus adapter(s) below.
 
+config I3C_SANDBOX
+       bool "Enable support for the sandbox I3C"
+       help
+         This is a sandbox I3C used for testing. It provides 2 interfaces and
+         records the settings passed into it.
+
 if I3C
 
 source "drivers/i3c/master/Kconfig"
diff --git a/drivers/i3c/Makefile b/drivers/i3c/Makefile
index 5ddc4743c86..d38d2350c9a 100644
--- a/drivers/i3c/Makefile
+++ b/drivers/i3c/Makefile
@@ -2,3 +2,4 @@
 
 obj-y                          := i3c-uclass.o device.o master.o
 obj-y                          += master/
+obj-$(CONFIG_I3C_SANDBOX)      += sandbox_i3c.o
diff --git a/drivers/i3c/sandbox_i3c.c b/drivers/i3c/sandbox_i3c.c
new file mode 100644
index 00000000000..1b497a49041
--- /dev/null
+++ b/drivers/i3c/sandbox_i3c.c
@@ -0,0 +1,56 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2025 Altera Corporation <www.altera.com>
+ */
+
+#include <dm.h>
+#include <errno.h>
+#include <i3c.h>
+#include <linux/i3c/master.h>
+
+struct sandbox_i3c_priv {
+       struct i3c_priv_xfer i3c_xfers;
+};
+
+static int sandbox_i3c_priv_read(struct udevice *dev, u8 dev_number,
+                                u8 *buf, int buf_size)
+{
+       struct sandbox_i3c_priv *priv = dev_get_priv(dev);
+       struct i3c_priv_xfer i3c_xfers;
+
+       i3c_xfers = priv->i3c_xfers;
+       i3c_xfers.data.in = buf;
+       i3c_xfers.len = buf_size;
+
+       return 0;
+}
+
+static int sandbox_i3c_priv_write(struct udevice *dev, u8 dev_number,
+                                 u8 *buf, int buf_size)
+{
+       struct sandbox_i3c_priv *priv = dev_get_priv(dev);
+       struct i3c_priv_xfer i3c_xfers;
+
+       i3c_xfers = priv->i3c_xfers;
+       i3c_xfers.data.out = buf;
+       i3c_xfers.len = buf_size;
+
+       return 0;
+}
+
+static const struct dm_i3c_ops sandbox_i3c_ops = {
+       .read = sandbox_i3c_priv_read,
+       .write = sandbox_i3c_priv_write,
+};
+
+static const struct udevice_id sandbox_i3c_ids[] = {
+       { .compatible = "sandbox,i3c" },
+       { }
+};
+
+U_BOOT_DRIVER(i3c_sandbox) = {
+       .name = "i3c_sandbox",
+       .id = UCLASS_I3C,
+       .of_match = sandbox_i3c_ids,
+       .ops    = &sandbox_i3c_ops,
+};
diff --git a/test/dm/Makefile b/test/dm/Makefile
index e44f3d89e77..c6c12713d7f 100644
--- a/test/dm/Makefile
+++ b/test/dm/Makefile
@@ -59,6 +59,7 @@ obj-$(CONFIG_FWU_MDATA_GPT_BLK) += fwu_mdata.o
 obj-$(CONFIG_SANDBOX) += host.o
 obj-$(CONFIG_DM_HWSPINLOCK) += hwspinlock.o
 obj-$(CONFIG_DM_I2C) += i2c.o
+obj-$(CONFIG_I3C) += i3c.o
 obj-$(CONFIG_SOUND) += i2s.o
 obj-$(CONFIG_CLK_K210_SET_RATE) += k210_pll.o
 obj-$(CONFIG_IOMMU) += iommu.o
diff --git a/test/dm/i3c.c b/test/dm/i3c.c
new file mode 100644
index 00000000000..81336e67555
--- /dev/null
+++ b/test/dm/i3c.c
@@ -0,0 +1,34 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2025 Altera Corporation <www.altera.com>
+ */
+
+#include <dm.h>
+#include <i3c.h>
+#include <dm/test.h>
+#include <test/ut.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+/* Basic test of the i3c uclass */
+static int dm_test_i3c_base(struct unit_test_state *uts)
+{
+       struct udevice *dev;
+
+       ut_assertok(uclass_get_device(UCLASS_I3C, 0, &dev));
+       ut_assertok(dm_i3c_read(dev, 0, NULL, 1));
+       ut_assertok(dm_i3c_read(dev, 0, NULL, 4));
+       ut_assertok(dm_i3c_write(dev, 0, "AABB", 2));
+       ut_assertok(dm_i3c_write(dev, 0, "AABBCCDD", 4));
+
+       ut_assertok(uclass_get_device(UCLASS_I3C, 1, &dev));
+       ut_assertok(dm_i3c_read(dev, 1, NULL, 1));
+       ut_assertok(dm_i3c_read(dev, 1, NULL, 4));
+       ut_assertok(dm_i3c_write(dev, 1, "AABB", 2));
+       ut_assertok(dm_i3c_write(dev, 1, "AABBCCDD", 4));
+
+       ut_asserteq(-ENODEV, uclass_get_device(UCLASS_I3C, 2, &dev));
+
+       return 0;
+}
+DM_TEST(dm_test_i3c_base, UTF_SCAN_PDATA | UTF_SCAN_FDT);
-- 
2.35.3

Reply via email to