xref: /OK3568_Linux_fs/kernel/include/linux/i3c/ccc.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Copyright (C) 2018 Cadence Design Systems Inc.
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Author: Boris Brezillon <boris.brezillon@bootlin.com>
6*4882a593Smuzhiyun  */
7*4882a593Smuzhiyun 
8*4882a593Smuzhiyun #ifndef I3C_CCC_H
9*4882a593Smuzhiyun #define I3C_CCC_H
10*4882a593Smuzhiyun 
11*4882a593Smuzhiyun #include <linux/bitops.h>
12*4882a593Smuzhiyun #include <linux/i3c/device.h>
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun /* I3C CCC (Common Command Codes) related definitions */
15*4882a593Smuzhiyun #define I3C_CCC_DIRECT			BIT(7)
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun #define I3C_CCC_ID(id, broadcast)	\
18*4882a593Smuzhiyun 	((id) | ((broadcast) ? 0 : I3C_CCC_DIRECT))
19*4882a593Smuzhiyun 
20*4882a593Smuzhiyun /* Commands valid in both broadcast and unicast modes */
21*4882a593Smuzhiyun #define I3C_CCC_ENEC(broadcast)		I3C_CCC_ID(0x0, broadcast)
22*4882a593Smuzhiyun #define I3C_CCC_DISEC(broadcast)	I3C_CCC_ID(0x1, broadcast)
23*4882a593Smuzhiyun #define I3C_CCC_ENTAS(as, broadcast)	I3C_CCC_ID(0x2 + (as), broadcast)
24*4882a593Smuzhiyun #define I3C_CCC_RSTDAA(broadcast)	I3C_CCC_ID(0x6, broadcast)
25*4882a593Smuzhiyun #define I3C_CCC_SETMWL(broadcast)	I3C_CCC_ID(0x9, broadcast)
26*4882a593Smuzhiyun #define I3C_CCC_SETMRL(broadcast)	I3C_CCC_ID(0xa, broadcast)
27*4882a593Smuzhiyun #define I3C_CCC_SETXTIME(broadcast)	((broadcast) ? 0x28 : 0x98)
28*4882a593Smuzhiyun #define I3C_CCC_VENDOR(id, broadcast)	((id) + ((broadcast) ? 0x61 : 0xe0))
29*4882a593Smuzhiyun 
30*4882a593Smuzhiyun /* Broadcast-only commands */
31*4882a593Smuzhiyun #define I3C_CCC_ENTDAA			I3C_CCC_ID(0x7, true)
32*4882a593Smuzhiyun #define I3C_CCC_DEFSLVS			I3C_CCC_ID(0x8, true)
33*4882a593Smuzhiyun #define I3C_CCC_ENTTM			I3C_CCC_ID(0xb, true)
34*4882a593Smuzhiyun #define I3C_CCC_ENTHDR(x)		I3C_CCC_ID(0x20 + (x), true)
35*4882a593Smuzhiyun 
36*4882a593Smuzhiyun /* Unicast-only commands */
37*4882a593Smuzhiyun #define I3C_CCC_SETDASA			I3C_CCC_ID(0x7, false)
38*4882a593Smuzhiyun #define I3C_CCC_SETNEWDA		I3C_CCC_ID(0x8, false)
39*4882a593Smuzhiyun #define I3C_CCC_GETMWL			I3C_CCC_ID(0xb, false)
40*4882a593Smuzhiyun #define I3C_CCC_GETMRL			I3C_CCC_ID(0xc, false)
41*4882a593Smuzhiyun #define I3C_CCC_GETPID			I3C_CCC_ID(0xd, false)
42*4882a593Smuzhiyun #define I3C_CCC_GETBCR			I3C_CCC_ID(0xe, false)
43*4882a593Smuzhiyun #define I3C_CCC_GETDCR			I3C_CCC_ID(0xf, false)
44*4882a593Smuzhiyun #define I3C_CCC_GETSTATUS		I3C_CCC_ID(0x10, false)
45*4882a593Smuzhiyun #define I3C_CCC_GETACCMST		I3C_CCC_ID(0x11, false)
46*4882a593Smuzhiyun #define I3C_CCC_SETBRGTGT		I3C_CCC_ID(0x13, false)
47*4882a593Smuzhiyun #define I3C_CCC_GETMXDS			I3C_CCC_ID(0x14, false)
48*4882a593Smuzhiyun #define I3C_CCC_GETHDRCAP		I3C_CCC_ID(0x15, false)
49*4882a593Smuzhiyun #define I3C_CCC_GETXTIME		I3C_CCC_ID(0x19, false)
50*4882a593Smuzhiyun 
51*4882a593Smuzhiyun #define I3C_CCC_EVENT_SIR		BIT(0)
52*4882a593Smuzhiyun #define I3C_CCC_EVENT_MR		BIT(1)
53*4882a593Smuzhiyun #define I3C_CCC_EVENT_HJ		BIT(3)
54*4882a593Smuzhiyun 
55*4882a593Smuzhiyun /**
56*4882a593Smuzhiyun  * struct i3c_ccc_events - payload passed to ENEC/DISEC CCC
57*4882a593Smuzhiyun  *
58*4882a593Smuzhiyun  * @events: bitmask of I3C_CCC_EVENT_xxx events.
59*4882a593Smuzhiyun  *
60*4882a593Smuzhiyun  * Depending on the CCC command, the specific events coming from all devices
61*4882a593Smuzhiyun  * (broadcast version) or a specific device (unicast version) will be
62*4882a593Smuzhiyun  * enabled (ENEC) or disabled (DISEC).
63*4882a593Smuzhiyun  */
64*4882a593Smuzhiyun struct i3c_ccc_events {
65*4882a593Smuzhiyun 	u8 events;
66*4882a593Smuzhiyun };
67*4882a593Smuzhiyun 
68*4882a593Smuzhiyun /**
69*4882a593Smuzhiyun  * struct i3c_ccc_mwl - payload passed to SETMWL/GETMWL CCC
70*4882a593Smuzhiyun  *
71*4882a593Smuzhiyun  * @len: maximum write length in bytes
72*4882a593Smuzhiyun  *
73*4882a593Smuzhiyun  * The maximum write length is only applicable to SDR private messages or
74*4882a593Smuzhiyun  * extended Write CCCs (like SETXTIME).
75*4882a593Smuzhiyun  */
76*4882a593Smuzhiyun struct i3c_ccc_mwl {
77*4882a593Smuzhiyun 	__be16 len;
78*4882a593Smuzhiyun };
79*4882a593Smuzhiyun 
80*4882a593Smuzhiyun /**
81*4882a593Smuzhiyun  * struct i3c_ccc_mrl - payload passed to SETMRL/GETMRL CCC
82*4882a593Smuzhiyun  *
83*4882a593Smuzhiyun  * @len: maximum read length in bytes
84*4882a593Smuzhiyun  * @ibi_len: maximum IBI payload length
85*4882a593Smuzhiyun  *
86*4882a593Smuzhiyun  * The maximum read length is only applicable to SDR private messages or
87*4882a593Smuzhiyun  * extended Read CCCs (like GETXTIME).
88*4882a593Smuzhiyun  * The IBI length is only valid if the I3C slave is IBI capable
89*4882a593Smuzhiyun  * (%I3C_BCR_IBI_REQ_CAP is set).
90*4882a593Smuzhiyun  */
91*4882a593Smuzhiyun struct i3c_ccc_mrl {
92*4882a593Smuzhiyun 	__be16 read_len;
93*4882a593Smuzhiyun 	u8 ibi_len;
94*4882a593Smuzhiyun } __packed;
95*4882a593Smuzhiyun 
96*4882a593Smuzhiyun /**
97*4882a593Smuzhiyun  * struct i3c_ccc_dev_desc - I3C/I2C device descriptor used for DEFSLVS
98*4882a593Smuzhiyun  *
99*4882a593Smuzhiyun  * @dyn_addr: dynamic address assigned to the I3C slave or 0 if the entry is
100*4882a593Smuzhiyun  *	      describing an I2C slave.
101*4882a593Smuzhiyun  * @dcr: DCR value (not applicable to entries describing I2C devices)
102*4882a593Smuzhiyun  * @lvr: LVR value (not applicable to entries describing I3C devices)
103*4882a593Smuzhiyun  * @bcr: BCR value or 0 if this entry is describing an I2C slave
104*4882a593Smuzhiyun  * @static_addr: static address or 0 if the device does not have a static
105*4882a593Smuzhiyun  *		 address
106*4882a593Smuzhiyun  *
107*4882a593Smuzhiyun  * The DEFSLVS command should be passed an array of i3c_ccc_dev_desc
108*4882a593Smuzhiyun  * descriptors (one entry per I3C/I2C dev controlled by the master).
109*4882a593Smuzhiyun  */
110*4882a593Smuzhiyun struct i3c_ccc_dev_desc {
111*4882a593Smuzhiyun 	u8 dyn_addr;
112*4882a593Smuzhiyun 	union {
113*4882a593Smuzhiyun 		u8 dcr;
114*4882a593Smuzhiyun 		u8 lvr;
115*4882a593Smuzhiyun 	};
116*4882a593Smuzhiyun 	u8 bcr;
117*4882a593Smuzhiyun 	u8 static_addr;
118*4882a593Smuzhiyun };
119*4882a593Smuzhiyun 
120*4882a593Smuzhiyun /**
121*4882a593Smuzhiyun  * struct i3c_ccc_defslvs - payload passed to DEFSLVS CCC
122*4882a593Smuzhiyun  *
123*4882a593Smuzhiyun  * @count: number of dev descriptors
124*4882a593Smuzhiyun  * @master: descriptor describing the current master
125*4882a593Smuzhiyun  * @slaves: array of descriptors describing slaves controlled by the
126*4882a593Smuzhiyun  *	    current master
127*4882a593Smuzhiyun  *
128*4882a593Smuzhiyun  * Information passed to the broadcast DEFSLVS to propagate device
129*4882a593Smuzhiyun  * information to all masters currently acting as slaves on the bus.
130*4882a593Smuzhiyun  * This is only meaningful if you have more than one master.
131*4882a593Smuzhiyun  */
132*4882a593Smuzhiyun struct i3c_ccc_defslvs {
133*4882a593Smuzhiyun 	u8 count;
134*4882a593Smuzhiyun 	struct i3c_ccc_dev_desc master;
135*4882a593Smuzhiyun 	struct i3c_ccc_dev_desc slaves[0];
136*4882a593Smuzhiyun } __packed;
137*4882a593Smuzhiyun 
138*4882a593Smuzhiyun /**
139*4882a593Smuzhiyun  * enum i3c_ccc_test_mode - enum listing all available test modes
140*4882a593Smuzhiyun  *
141*4882a593Smuzhiyun  * @I3C_CCC_EXIT_TEST_MODE: exit test mode
142*4882a593Smuzhiyun  * @I3C_CCC_VENDOR_TEST_MODE: enter vendor test mode
143*4882a593Smuzhiyun  */
144*4882a593Smuzhiyun enum i3c_ccc_test_mode {
145*4882a593Smuzhiyun 	I3C_CCC_EXIT_TEST_MODE,
146*4882a593Smuzhiyun 	I3C_CCC_VENDOR_TEST_MODE,
147*4882a593Smuzhiyun };
148*4882a593Smuzhiyun 
149*4882a593Smuzhiyun /**
150*4882a593Smuzhiyun  * struct i3c_ccc_enttm - payload passed to ENTTM CCC
151*4882a593Smuzhiyun  *
152*4882a593Smuzhiyun  * @mode: one of the &enum i3c_ccc_test_mode modes
153*4882a593Smuzhiyun  *
154*4882a593Smuzhiyun  * Information passed to the ENTTM CCC to instruct an I3C device to enter a
155*4882a593Smuzhiyun  * specific test mode.
156*4882a593Smuzhiyun  */
157*4882a593Smuzhiyun struct i3c_ccc_enttm {
158*4882a593Smuzhiyun 	u8 mode;
159*4882a593Smuzhiyun };
160*4882a593Smuzhiyun 
161*4882a593Smuzhiyun /**
162*4882a593Smuzhiyun  * struct i3c_ccc_setda - payload passed to SETNEWDA and SETDASA CCCs
163*4882a593Smuzhiyun  *
164*4882a593Smuzhiyun  * @addr: dynamic address to assign to an I3C device
165*4882a593Smuzhiyun  *
166*4882a593Smuzhiyun  * Information passed to the SETNEWDA and SETDASA CCCs to assign/change the
167*4882a593Smuzhiyun  * dynamic address of an I3C device.
168*4882a593Smuzhiyun  */
169*4882a593Smuzhiyun struct i3c_ccc_setda {
170*4882a593Smuzhiyun 	u8 addr;
171*4882a593Smuzhiyun };
172*4882a593Smuzhiyun 
173*4882a593Smuzhiyun /**
174*4882a593Smuzhiyun  * struct i3c_ccc_getpid - payload passed to GETPID CCC
175*4882a593Smuzhiyun  *
176*4882a593Smuzhiyun  * @pid: 48 bits PID in big endian
177*4882a593Smuzhiyun  */
178*4882a593Smuzhiyun struct i3c_ccc_getpid {
179*4882a593Smuzhiyun 	u8 pid[6];
180*4882a593Smuzhiyun };
181*4882a593Smuzhiyun 
182*4882a593Smuzhiyun /**
183*4882a593Smuzhiyun  * struct i3c_ccc_getbcr - payload passed to GETBCR CCC
184*4882a593Smuzhiyun  *
185*4882a593Smuzhiyun  * @bcr: BCR (Bus Characteristic Register) value
186*4882a593Smuzhiyun  */
187*4882a593Smuzhiyun struct i3c_ccc_getbcr {
188*4882a593Smuzhiyun 	u8 bcr;
189*4882a593Smuzhiyun };
190*4882a593Smuzhiyun 
191*4882a593Smuzhiyun /**
192*4882a593Smuzhiyun  * struct i3c_ccc_getdcr - payload passed to GETDCR CCC
193*4882a593Smuzhiyun  *
194*4882a593Smuzhiyun  * @dcr: DCR (Device Characteristic Register) value
195*4882a593Smuzhiyun  */
196*4882a593Smuzhiyun struct i3c_ccc_getdcr {
197*4882a593Smuzhiyun 	u8 dcr;
198*4882a593Smuzhiyun };
199*4882a593Smuzhiyun 
200*4882a593Smuzhiyun #define I3C_CCC_STATUS_PENDING_INT(status)	((status) & GENMASK(3, 0))
201*4882a593Smuzhiyun #define I3C_CCC_STATUS_PROTOCOL_ERROR		BIT(5)
202*4882a593Smuzhiyun #define I3C_CCC_STATUS_ACTIVITY_MODE(status)	\
203*4882a593Smuzhiyun 	(((status) & GENMASK(7, 6)) >> 6)
204*4882a593Smuzhiyun 
205*4882a593Smuzhiyun /**
206*4882a593Smuzhiyun  * struct i3c_ccc_getstatus - payload passed to GETSTATUS CCC
207*4882a593Smuzhiyun  *
208*4882a593Smuzhiyun  * @status: status of the I3C slave (see I3C_CCC_STATUS_xxx macros for more
209*4882a593Smuzhiyun  *	    information).
210*4882a593Smuzhiyun  */
211*4882a593Smuzhiyun struct i3c_ccc_getstatus {
212*4882a593Smuzhiyun 	__be16 status;
213*4882a593Smuzhiyun };
214*4882a593Smuzhiyun 
215*4882a593Smuzhiyun /**
216*4882a593Smuzhiyun  * struct i3c_ccc_getaccmst - payload passed to GETACCMST CCC
217*4882a593Smuzhiyun  *
218*4882a593Smuzhiyun  * @newmaster: address of the master taking bus ownership
219*4882a593Smuzhiyun  */
220*4882a593Smuzhiyun struct i3c_ccc_getaccmst {
221*4882a593Smuzhiyun 	u8 newmaster;
222*4882a593Smuzhiyun };
223*4882a593Smuzhiyun 
224*4882a593Smuzhiyun /**
225*4882a593Smuzhiyun  * struct i3c_ccc_bridged_slave_desc - bridged slave descriptor
226*4882a593Smuzhiyun  *
227*4882a593Smuzhiyun  * @addr: dynamic address of the bridged device
228*4882a593Smuzhiyun  * @id: ID of the slave device behind the bridge
229*4882a593Smuzhiyun  */
230*4882a593Smuzhiyun struct i3c_ccc_bridged_slave_desc {
231*4882a593Smuzhiyun 	u8 addr;
232*4882a593Smuzhiyun 	__be16 id;
233*4882a593Smuzhiyun } __packed;
234*4882a593Smuzhiyun 
235*4882a593Smuzhiyun /**
236*4882a593Smuzhiyun  * struct i3c_ccc_setbrgtgt - payload passed to SETBRGTGT CCC
237*4882a593Smuzhiyun  *
238*4882a593Smuzhiyun  * @count: number of bridged slaves
239*4882a593Smuzhiyun  * @bslaves: bridged slave descriptors
240*4882a593Smuzhiyun  */
241*4882a593Smuzhiyun struct i3c_ccc_setbrgtgt {
242*4882a593Smuzhiyun 	u8 count;
243*4882a593Smuzhiyun 	struct i3c_ccc_bridged_slave_desc bslaves[0];
244*4882a593Smuzhiyun } __packed;
245*4882a593Smuzhiyun 
246*4882a593Smuzhiyun /**
247*4882a593Smuzhiyun  * enum i3c_sdr_max_data_rate - max data rate values for private SDR transfers
248*4882a593Smuzhiyun  */
249*4882a593Smuzhiyun enum i3c_sdr_max_data_rate {
250*4882a593Smuzhiyun 	I3C_SDR0_FSCL_MAX,
251*4882a593Smuzhiyun 	I3C_SDR1_FSCL_8MHZ,
252*4882a593Smuzhiyun 	I3C_SDR2_FSCL_6MHZ,
253*4882a593Smuzhiyun 	I3C_SDR3_FSCL_4MHZ,
254*4882a593Smuzhiyun 	I3C_SDR4_FSCL_2MHZ,
255*4882a593Smuzhiyun };
256*4882a593Smuzhiyun 
257*4882a593Smuzhiyun /**
258*4882a593Smuzhiyun  * enum i3c_tsco - clock to data turn-around
259*4882a593Smuzhiyun  */
260*4882a593Smuzhiyun enum i3c_tsco {
261*4882a593Smuzhiyun 	I3C_TSCO_8NS,
262*4882a593Smuzhiyun 	I3C_TSCO_9NS,
263*4882a593Smuzhiyun 	I3C_TSCO_10NS,
264*4882a593Smuzhiyun 	I3C_TSCO_11NS,
265*4882a593Smuzhiyun 	I3C_TSCO_12NS,
266*4882a593Smuzhiyun };
267*4882a593Smuzhiyun 
268*4882a593Smuzhiyun #define I3C_CCC_MAX_SDR_FSCL_MASK	GENMASK(2, 0)
269*4882a593Smuzhiyun #define I3C_CCC_MAX_SDR_FSCL(x)		((x) & I3C_CCC_MAX_SDR_FSCL_MASK)
270*4882a593Smuzhiyun 
271*4882a593Smuzhiyun /**
272*4882a593Smuzhiyun  * struct i3c_ccc_getmxds - payload passed to GETMXDS CCC
273*4882a593Smuzhiyun  *
274*4882a593Smuzhiyun  * @maxwr: write limitations
275*4882a593Smuzhiyun  * @maxrd: read limitations
276*4882a593Smuzhiyun  * @maxrdturn: maximum read turn-around expressed micro-seconds and
277*4882a593Smuzhiyun  *	       little-endian formatted
278*4882a593Smuzhiyun  */
279*4882a593Smuzhiyun struct i3c_ccc_getmxds {
280*4882a593Smuzhiyun 	u8 maxwr;
281*4882a593Smuzhiyun 	u8 maxrd;
282*4882a593Smuzhiyun 	u8 maxrdturn[3];
283*4882a593Smuzhiyun } __packed;
284*4882a593Smuzhiyun 
285*4882a593Smuzhiyun #define I3C_CCC_HDR_MODE(mode)		BIT(mode)
286*4882a593Smuzhiyun 
287*4882a593Smuzhiyun /**
288*4882a593Smuzhiyun  * struct i3c_ccc_gethdrcap - payload passed to GETHDRCAP CCC
289*4882a593Smuzhiyun  *
290*4882a593Smuzhiyun  * @modes: bitmap of supported HDR modes
291*4882a593Smuzhiyun  */
292*4882a593Smuzhiyun struct i3c_ccc_gethdrcap {
293*4882a593Smuzhiyun 	u8 modes;
294*4882a593Smuzhiyun } __packed;
295*4882a593Smuzhiyun 
296*4882a593Smuzhiyun /**
297*4882a593Smuzhiyun  * enum i3c_ccc_setxtime_subcmd - SETXTIME sub-commands
298*4882a593Smuzhiyun  */
299*4882a593Smuzhiyun enum i3c_ccc_setxtime_subcmd {
300*4882a593Smuzhiyun 	I3C_CCC_SETXTIME_ST = 0x7f,
301*4882a593Smuzhiyun 	I3C_CCC_SETXTIME_DT = 0xbf,
302*4882a593Smuzhiyun 	I3C_CCC_SETXTIME_ENTER_ASYNC_MODE0 = 0xdf,
303*4882a593Smuzhiyun 	I3C_CCC_SETXTIME_ENTER_ASYNC_MODE1 = 0xef,
304*4882a593Smuzhiyun 	I3C_CCC_SETXTIME_ENTER_ASYNC_MODE2 = 0xf7,
305*4882a593Smuzhiyun 	I3C_CCC_SETXTIME_ENTER_ASYNC_MODE3 = 0xfb,
306*4882a593Smuzhiyun 	I3C_CCC_SETXTIME_ASYNC_TRIGGER = 0xfd,
307*4882a593Smuzhiyun 	I3C_CCC_SETXTIME_TPH = 0x3f,
308*4882a593Smuzhiyun 	I3C_CCC_SETXTIME_TU = 0x9f,
309*4882a593Smuzhiyun 	I3C_CCC_SETXTIME_ODR = 0x8f,
310*4882a593Smuzhiyun };
311*4882a593Smuzhiyun 
312*4882a593Smuzhiyun /**
313*4882a593Smuzhiyun  * struct i3c_ccc_setxtime - payload passed to SETXTIME CCC
314*4882a593Smuzhiyun  *
315*4882a593Smuzhiyun  * @subcmd: one of the sub-commands ddefined in &enum i3c_ccc_setxtime_subcmd
316*4882a593Smuzhiyun  * @data: sub-command payload. Amount of data is determined by
317*4882a593Smuzhiyun  *	  &i3c_ccc_setxtime->subcmd
318*4882a593Smuzhiyun  */
319*4882a593Smuzhiyun struct i3c_ccc_setxtime {
320*4882a593Smuzhiyun 	u8 subcmd;
321*4882a593Smuzhiyun 	u8 data[0];
322*4882a593Smuzhiyun } __packed;
323*4882a593Smuzhiyun 
324*4882a593Smuzhiyun #define I3C_CCC_GETXTIME_SYNC_MODE	BIT(0)
325*4882a593Smuzhiyun #define I3C_CCC_GETXTIME_ASYNC_MODE(x)	BIT((x) + 1)
326*4882a593Smuzhiyun #define I3C_CCC_GETXTIME_OVERFLOW	BIT(7)
327*4882a593Smuzhiyun 
328*4882a593Smuzhiyun /**
329*4882a593Smuzhiyun  * struct i3c_ccc_getxtime - payload retrieved from GETXTIME CCC
330*4882a593Smuzhiyun  *
331*4882a593Smuzhiyun  * @supported_modes: bitmap describing supported XTIME modes
332*4882a593Smuzhiyun  * @state: current status (enabled mode and overflow status)
333*4882a593Smuzhiyun  * @frequency: slave's internal oscillator frequency in 500KHz steps
334*4882a593Smuzhiyun  * @inaccuracy: slave's internal oscillator inaccuracy in 0.1% steps
335*4882a593Smuzhiyun  */
336*4882a593Smuzhiyun struct i3c_ccc_getxtime {
337*4882a593Smuzhiyun 	u8 supported_modes;
338*4882a593Smuzhiyun 	u8 state;
339*4882a593Smuzhiyun 	u8 frequency;
340*4882a593Smuzhiyun 	u8 inaccuracy;
341*4882a593Smuzhiyun } __packed;
342*4882a593Smuzhiyun 
343*4882a593Smuzhiyun /**
344*4882a593Smuzhiyun  * struct i3c_ccc_cmd_payload - CCC payload
345*4882a593Smuzhiyun  *
346*4882a593Smuzhiyun  * @len: payload length
347*4882a593Smuzhiyun  * @data: payload data. This buffer must be DMA-able
348*4882a593Smuzhiyun  */
349*4882a593Smuzhiyun struct i3c_ccc_cmd_payload {
350*4882a593Smuzhiyun 	u16 len;
351*4882a593Smuzhiyun 	void *data;
352*4882a593Smuzhiyun };
353*4882a593Smuzhiyun 
354*4882a593Smuzhiyun /**
355*4882a593Smuzhiyun  * struct i3c_ccc_cmd_dest - CCC command destination
356*4882a593Smuzhiyun  *
357*4882a593Smuzhiyun  * @addr: can be an I3C device address or the broadcast address if this is a
358*4882a593Smuzhiyun  *	  broadcast CCC
359*4882a593Smuzhiyun  * @payload: payload to be sent to this device or broadcasted
360*4882a593Smuzhiyun  */
361*4882a593Smuzhiyun struct i3c_ccc_cmd_dest {
362*4882a593Smuzhiyun 	u8 addr;
363*4882a593Smuzhiyun 	struct i3c_ccc_cmd_payload payload;
364*4882a593Smuzhiyun };
365*4882a593Smuzhiyun 
366*4882a593Smuzhiyun /**
367*4882a593Smuzhiyun  * struct i3c_ccc_cmd - CCC command
368*4882a593Smuzhiyun  *
369*4882a593Smuzhiyun  * @rnw: true if the CCC should retrieve data from the device. Only valid for
370*4882a593Smuzhiyun  *	 unicast commands
371*4882a593Smuzhiyun  * @id: CCC command id
372*4882a593Smuzhiyun  * @ndests: number of destinations. Should always be one for broadcast commands
373*4882a593Smuzhiyun  * @dests: array of destinations and associated payload for this CCC. Most of
374*4882a593Smuzhiyun  *	   the time, only one destination is provided
375*4882a593Smuzhiyun  * @err: I3C error code
376*4882a593Smuzhiyun  */
377*4882a593Smuzhiyun struct i3c_ccc_cmd {
378*4882a593Smuzhiyun 	u8 rnw;
379*4882a593Smuzhiyun 	u8 id;
380*4882a593Smuzhiyun 	unsigned int ndests;
381*4882a593Smuzhiyun 	struct i3c_ccc_cmd_dest *dests;
382*4882a593Smuzhiyun 	enum i3c_error_code err;
383*4882a593Smuzhiyun };
384*4882a593Smuzhiyun 
385*4882a593Smuzhiyun #endif /* I3C_CCC_H */
386