1 /* SPDX-License-Identifier: GPL-2.0+ */
2 /*
3  * Copyright (C) 2025 Altera Corporation <www.altera.com>
4  */
5 
6 #include <linux/i3c/master.h>
7 
8 /**
9  * struct dm_i3c_ops - Driver operations for the I3C uclass
10  *
11  * This structure defines the set of operations that a driver must implement
12  * for interacting with an I3C controller in U-Boot.
13  *
14  */
15 struct dm_i3c_ops {
16 /**
17  * @i3c_xfers: Transfer messages in I3C
18  *
19  * @dev: I3C controller device instance.
20  * @xfers: List of I3C private SDR transfer messages.
21  * @nxfers: The number of messages to transfer.
22  *
23  * Return: 0 on success, negative error code on failure.
24  */
25 	int (*i3c_xfers)(struct i3c_dev_desc *dev,
26 			 struct i3c_priv_xfer *xfers,
27 			 u32 nxfers);
28 
29 /**
30  * @read: Perform I3C read transaction.
31  *
32  * @dev: Chip to read from
33  * @dev_number: The target device number from the driver model.
34  * @buf: Place to put data
35  * @num_bytes: Number of bytes to read.
36  *
37  * Return: 0 on success, negative error code on failure.
38  */
39 	int (*read)(struct udevice *dev, u32 dev_number,
40 		    u8 *buf, u32 num_bytes);
41 
42 /**
43  * @write: Perform I3C write transaction.
44  *
45  * @dev: Chip to write to
46  * @dev_number: The target device number from the driver model.
47  * @buf: Buffer containing data to write
48  * @num_bytes: Number of bytes to write.
49  *
50  * Return: 0 on success, negative error code on failure.
51  */
52 	int (*write)(struct udevice *dev, u32 dev_number,
53 		     u8 *buf, u32 num_bytes);
54 };
55 
56 /**
57  * i3c_get_ops - Retrieve the I3C operation functions for a device
58  * @dev: The I3C controller device.
59  *
60  * This macro returns the set of operation functions (`dm_i3c_ops`) implemented
61  * by the driver associated with the specified device. These operations define
62  * how the driver performs I3C communication tasks such as reading, writing,
63  * and message transfers.
64  *
65  * Return: The I3C operation structure for the device.
66  */
67 #define i3c_get_ops(dev)	((struct dm_i3c_ops *)(dev)->driver->ops)
68 
69 /**
70  * dm_i3c_write - Perform I3C write transaction
71  *
72  * @dev: Chip to write to
73  * @dev_number: The target device number from the driver model.
74  * @buf: Buffer containing data to write
75  * @num_bytes: Number of bytes to write.
76  *
77  * Return: 0 on success, negative error code on failure.
78  */
79 int dm_i3c_write(struct udevice *dev, u32 dev_number,
80 		 u8 *buf, u32 num_bytes);
81 
82 /**
83  * dm_i3c_read - Perform I3C read transaction
84  *
85  * @dev: Chip to read from
86  * @dev_number: The target device number from the driver model.
87  * @buf: Place to put data
88  * @num_bytes: Number of bytes to read.
89  *
90  * Return: 0 on success, negative error code on failure.
91  */
92 int dm_i3c_read(struct udevice *dev, u32 dev_number,
93 		u8 *buf, u32 num_bytes);
94