drivers: i3c: Add i3c sandbox simple test.

Add s simple test for the I3C uclass in sandbox.

Signed-off-by: Dinesh Maniyam <dinesh.maniyam@altera.com>
This commit is contained in:
Dinesh Maniyam 2025-08-06 12:32:29 +08:00 committed by Heiko Schocher
parent 03caa3769a
commit ca4c92cbff
6 changed files with 106 additions and 0 deletions

View File

@ -936,6 +936,14 @@
};
};
i3c0 {
compatible = "sandbox,i3c";
};
i3c1 {
compatible = "sandbox,i3c";
};
bootcount@0 {
compatible = "u-boot,bootcount-rtc";
rtc = <&rtc_1>;

View File

@ -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"

View File

@ -2,3 +2,4 @@
obj-y := i3c-uclass.o device.o master.o
obj-y += master/
obj-$(CONFIG_I3C_SANDBOX) += sandbox_i3c.o

56
drivers/i3c/sandbox_i3c.c Normal file
View File

@ -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, u32 dev_number,
u8 *buf, u32 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, u32 dev_number,
u8 *buf, u32 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,
};

View File

@ -58,6 +58,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

34
test/dm/i3c.c Normal file
View File

@ -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);