1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Copyright (C) 2025 Altera Corporation <www.altera.com>
4  */
5 
6 #include <dm.h>
7 #include <errno.h>
8 #include <i3c.h>
9 #include <linux/i3c/master.h>
10 
11 struct sandbox_i3c_priv {
12 	struct i3c_priv_xfer i3c_xfers;
13 };
14 
sandbox_i3c_priv_read(struct udevice * dev,u32 dev_number,u8 * buf,u32 buf_size)15 static int sandbox_i3c_priv_read(struct udevice *dev, u32 dev_number,
16 				 u8 *buf, u32 buf_size)
17 {
18 	struct sandbox_i3c_priv *priv = dev_get_priv(dev);
19 	struct i3c_priv_xfer i3c_xfers;
20 
21 	i3c_xfers = priv->i3c_xfers;
22 	i3c_xfers.data.in = buf;
23 	i3c_xfers.len = buf_size;
24 
25 	return 0;
26 }
27 
sandbox_i3c_priv_write(struct udevice * dev,u32 dev_number,u8 * buf,u32 buf_size)28 static int sandbox_i3c_priv_write(struct udevice *dev, u32 dev_number,
29 				  u8 *buf, u32 buf_size)
30 {
31 	struct sandbox_i3c_priv *priv = dev_get_priv(dev);
32 	struct i3c_priv_xfer i3c_xfers;
33 
34 	i3c_xfers = priv->i3c_xfers;
35 	i3c_xfers.data.out = buf;
36 	i3c_xfers.len = buf_size;
37 
38 	return 0;
39 }
40 
41 static const struct dm_i3c_ops sandbox_i3c_ops = {
42 	.read = sandbox_i3c_priv_read,
43 	.write = sandbox_i3c_priv_write,
44 };
45 
46 static const struct udevice_id sandbox_i3c_ids[] = {
47 	{ .compatible = "sandbox,i3c" },
48 	{ }
49 };
50 
51 U_BOOT_DRIVER(i3c_sandbox) = {
52 	.name = "i3c_sandbox",
53 	.id = UCLASS_I3C,
54 	.of_match = sandbox_i3c_ids,
55 	.ops    = &sandbox_i3c_ops,
56 };
57