xref: /linux-6.15/include/linux/i3c/ccc.h (revision 5224f790)
13a379bbcSBoris Brezillon /* SPDX-License-Identifier: GPL-2.0 */
23a379bbcSBoris Brezillon /*
33a379bbcSBoris Brezillon  * Copyright (C) 2018 Cadence Design Systems Inc.
43a379bbcSBoris Brezillon  *
53a379bbcSBoris Brezillon  * Author: Boris Brezillon <[email protected]>
63a379bbcSBoris Brezillon  */
73a379bbcSBoris Brezillon 
83a379bbcSBoris Brezillon #ifndef I3C_CCC_H
93a379bbcSBoris Brezillon #define I3C_CCC_H
103a379bbcSBoris Brezillon 
113a379bbcSBoris Brezillon #include <linux/bitops.h>
123a379bbcSBoris Brezillon #include <linux/i3c/device.h>
133a379bbcSBoris Brezillon 
143a379bbcSBoris Brezillon /* I3C CCC (Common Command Codes) related definitions */
153a379bbcSBoris Brezillon #define I3C_CCC_DIRECT			BIT(7)
163a379bbcSBoris Brezillon 
173a379bbcSBoris Brezillon #define I3C_CCC_ID(id, broadcast)	\
183a379bbcSBoris Brezillon 	((id) | ((broadcast) ? 0 : I3C_CCC_DIRECT))
193a379bbcSBoris Brezillon 
203a379bbcSBoris Brezillon /* Commands valid in both broadcast and unicast modes */
213a379bbcSBoris Brezillon #define I3C_CCC_ENEC(broadcast)		I3C_CCC_ID(0x0, broadcast)
223a379bbcSBoris Brezillon #define I3C_CCC_DISEC(broadcast)	I3C_CCC_ID(0x1, broadcast)
233a379bbcSBoris Brezillon #define I3C_CCC_ENTAS(as, broadcast)	I3C_CCC_ID(0x2 + (as), broadcast)
243a379bbcSBoris Brezillon #define I3C_CCC_RSTDAA(broadcast)	I3C_CCC_ID(0x6, broadcast)
253a379bbcSBoris Brezillon #define I3C_CCC_SETMWL(broadcast)	I3C_CCC_ID(0x9, broadcast)
263a379bbcSBoris Brezillon #define I3C_CCC_SETMRL(broadcast)	I3C_CCC_ID(0xa, broadcast)
273a379bbcSBoris Brezillon #define I3C_CCC_SETXTIME(broadcast)	((broadcast) ? 0x28 : 0x98)
283a379bbcSBoris Brezillon #define I3C_CCC_VENDOR(id, broadcast)	((id) + ((broadcast) ? 0x61 : 0xe0))
293a379bbcSBoris Brezillon 
303a379bbcSBoris Brezillon /* Broadcast-only commands */
313a379bbcSBoris Brezillon #define I3C_CCC_ENTDAA			I3C_CCC_ID(0x7, true)
323a379bbcSBoris Brezillon #define I3C_CCC_DEFSLVS			I3C_CCC_ID(0x8, true)
333a379bbcSBoris Brezillon #define I3C_CCC_ENTTM			I3C_CCC_ID(0xb, true)
343a379bbcSBoris Brezillon #define I3C_CCC_ENTHDR(x)		I3C_CCC_ID(0x20 + (x), true)
353a379bbcSBoris Brezillon 
363a379bbcSBoris Brezillon /* Unicast-only commands */
373a379bbcSBoris Brezillon #define I3C_CCC_SETDASA			I3C_CCC_ID(0x7, false)
383a379bbcSBoris Brezillon #define I3C_CCC_SETNEWDA		I3C_CCC_ID(0x8, false)
393a379bbcSBoris Brezillon #define I3C_CCC_GETMWL			I3C_CCC_ID(0xb, false)
403a379bbcSBoris Brezillon #define I3C_CCC_GETMRL			I3C_CCC_ID(0xc, false)
413a379bbcSBoris Brezillon #define I3C_CCC_GETPID			I3C_CCC_ID(0xd, false)
423a379bbcSBoris Brezillon #define I3C_CCC_GETBCR			I3C_CCC_ID(0xe, false)
433a379bbcSBoris Brezillon #define I3C_CCC_GETDCR			I3C_CCC_ID(0xf, false)
443a379bbcSBoris Brezillon #define I3C_CCC_GETSTATUS		I3C_CCC_ID(0x10, false)
453a379bbcSBoris Brezillon #define I3C_CCC_GETACCMST		I3C_CCC_ID(0x11, false)
463a379bbcSBoris Brezillon #define I3C_CCC_SETBRGTGT		I3C_CCC_ID(0x13, false)
473a379bbcSBoris Brezillon #define I3C_CCC_GETMXDS			I3C_CCC_ID(0x14, false)
483a379bbcSBoris Brezillon #define I3C_CCC_GETHDRCAP		I3C_CCC_ID(0x15, false)
493a379bbcSBoris Brezillon #define I3C_CCC_GETXTIME		I3C_CCC_ID(0x19, false)
503a379bbcSBoris Brezillon 
513a379bbcSBoris Brezillon #define I3C_CCC_EVENT_SIR		BIT(0)
523a379bbcSBoris Brezillon #define I3C_CCC_EVENT_MR		BIT(1)
533a379bbcSBoris Brezillon #define I3C_CCC_EVENT_HJ		BIT(3)
543a379bbcSBoris Brezillon 
553a379bbcSBoris Brezillon /**
563a379bbcSBoris Brezillon  * struct i3c_ccc_events - payload passed to ENEC/DISEC CCC
573a379bbcSBoris Brezillon  *
583a379bbcSBoris Brezillon  * @events: bitmask of I3C_CCC_EVENT_xxx events.
593a379bbcSBoris Brezillon  *
603a379bbcSBoris Brezillon  * Depending on the CCC command, the specific events coming from all devices
613a379bbcSBoris Brezillon  * (broadcast version) or a specific device (unicast version) will be
623a379bbcSBoris Brezillon  * enabled (ENEC) or disabled (DISEC).
633a379bbcSBoris Brezillon  */
643a379bbcSBoris Brezillon struct i3c_ccc_events {
653a379bbcSBoris Brezillon 	u8 events;
663a379bbcSBoris Brezillon };
673a379bbcSBoris Brezillon 
683a379bbcSBoris Brezillon /**
693a379bbcSBoris Brezillon  * struct i3c_ccc_mwl - payload passed to SETMWL/GETMWL CCC
703a379bbcSBoris Brezillon  *
713a379bbcSBoris Brezillon  * @len: maximum write length in bytes
723a379bbcSBoris Brezillon  *
733a379bbcSBoris Brezillon  * The maximum write length is only applicable to SDR private messages or
743a379bbcSBoris Brezillon  * extended Write CCCs (like SETXTIME).
753a379bbcSBoris Brezillon  */
763a379bbcSBoris Brezillon struct i3c_ccc_mwl {
773a379bbcSBoris Brezillon 	__be16 len;
783a379bbcSBoris Brezillon };
793a379bbcSBoris Brezillon 
803a379bbcSBoris Brezillon /**
813a379bbcSBoris Brezillon  * struct i3c_ccc_mrl - payload passed to SETMRL/GETMRL CCC
823a379bbcSBoris Brezillon  *
833a379bbcSBoris Brezillon  * @len: maximum read length in bytes
843a379bbcSBoris Brezillon  * @ibi_len: maximum IBI payload length
853a379bbcSBoris Brezillon  *
863a379bbcSBoris Brezillon  * The maximum read length is only applicable to SDR private messages or
873a379bbcSBoris Brezillon  * extended Read CCCs (like GETXTIME).
883a379bbcSBoris Brezillon  * The IBI length is only valid if the I3C slave is IBI capable
893a379bbcSBoris Brezillon  * (%I3C_BCR_IBI_REQ_CAP is set).
903a379bbcSBoris Brezillon  */
913a379bbcSBoris Brezillon struct i3c_ccc_mrl {
923a379bbcSBoris Brezillon 	__be16 read_len;
933a379bbcSBoris Brezillon 	u8 ibi_len;
943a379bbcSBoris Brezillon } __packed;
953a379bbcSBoris Brezillon 
963a379bbcSBoris Brezillon /**
973a379bbcSBoris Brezillon  * struct i3c_ccc_dev_desc - I3C/I2C device descriptor used for DEFSLVS
983a379bbcSBoris Brezillon  *
993a379bbcSBoris Brezillon  * @dyn_addr: dynamic address assigned to the I3C slave or 0 if the entry is
1003a379bbcSBoris Brezillon  *	      describing an I2C slave.
1013a379bbcSBoris Brezillon  * @dcr: DCR value (not applicable to entries describing I2C devices)
1023a379bbcSBoris Brezillon  * @lvr: LVR value (not applicable to entries describing I3C devices)
1033a379bbcSBoris Brezillon  * @bcr: BCR value or 0 if this entry is describing an I2C slave
1043a379bbcSBoris Brezillon  * @static_addr: static address or 0 if the device does not have a static
1053a379bbcSBoris Brezillon  *		 address
1063a379bbcSBoris Brezillon  *
1073a379bbcSBoris Brezillon  * The DEFSLVS command should be passed an array of i3c_ccc_dev_desc
1083a379bbcSBoris Brezillon  * descriptors (one entry per I3C/I2C dev controlled by the master).
1093a379bbcSBoris Brezillon  */
1103a379bbcSBoris Brezillon struct i3c_ccc_dev_desc {
1113a379bbcSBoris Brezillon 	u8 dyn_addr;
1123a379bbcSBoris Brezillon 	union {
1133a379bbcSBoris Brezillon 		u8 dcr;
1143a379bbcSBoris Brezillon 		u8 lvr;
1153a379bbcSBoris Brezillon 	};
1163a379bbcSBoris Brezillon 	u8 bcr;
1173a379bbcSBoris Brezillon 	u8 static_addr;
1183a379bbcSBoris Brezillon };
1193a379bbcSBoris Brezillon 
1203a379bbcSBoris Brezillon /**
1213a379bbcSBoris Brezillon  * struct i3c_ccc_defslvs - payload passed to DEFSLVS CCC
1223a379bbcSBoris Brezillon  *
1233a379bbcSBoris Brezillon  * @count: number of dev descriptors
1243a379bbcSBoris Brezillon  * @master: descriptor describing the current master
1253a379bbcSBoris Brezillon  * @slaves: array of descriptors describing slaves controlled by the
1263a379bbcSBoris Brezillon  *	    current master
1273a379bbcSBoris Brezillon  *
1283a379bbcSBoris Brezillon  * Information passed to the broadcast DEFSLVS to propagate device
1293a379bbcSBoris Brezillon  * information to all masters currently acting as slaves on the bus.
1303a379bbcSBoris Brezillon  * This is only meaningful if you have more than one master.
1313a379bbcSBoris Brezillon  */
1323a379bbcSBoris Brezillon struct i3c_ccc_defslvs {
1333a379bbcSBoris Brezillon 	u8 count;
1343a379bbcSBoris Brezillon 	struct i3c_ccc_dev_desc master;
135*5224f790SGustavo A. R. Silva 	struct i3c_ccc_dev_desc slaves[];
1363a379bbcSBoris Brezillon } __packed;
1373a379bbcSBoris Brezillon 
1383a379bbcSBoris Brezillon /**
1393a379bbcSBoris Brezillon  * enum i3c_ccc_test_mode - enum listing all available test modes
1403a379bbcSBoris Brezillon  *
1413a379bbcSBoris Brezillon  * @I3C_CCC_EXIT_TEST_MODE: exit test mode
1423a379bbcSBoris Brezillon  * @I3C_CCC_VENDOR_TEST_MODE: enter vendor test mode
1433a379bbcSBoris Brezillon  */
1443a379bbcSBoris Brezillon enum i3c_ccc_test_mode {
1453a379bbcSBoris Brezillon 	I3C_CCC_EXIT_TEST_MODE,
1463a379bbcSBoris Brezillon 	I3C_CCC_VENDOR_TEST_MODE,
1473a379bbcSBoris Brezillon };
1483a379bbcSBoris Brezillon 
1493a379bbcSBoris Brezillon /**
1503a379bbcSBoris Brezillon  * struct i3c_ccc_enttm - payload passed to ENTTM CCC
1513a379bbcSBoris Brezillon  *
1523a379bbcSBoris Brezillon  * @mode: one of the &enum i3c_ccc_test_mode modes
1533a379bbcSBoris Brezillon  *
1543a379bbcSBoris Brezillon  * Information passed to the ENTTM CCC to instruct an I3C device to enter a
1553a379bbcSBoris Brezillon  * specific test mode.
1563a379bbcSBoris Brezillon  */
1573a379bbcSBoris Brezillon struct i3c_ccc_enttm {
1583a379bbcSBoris Brezillon 	u8 mode;
1593a379bbcSBoris Brezillon };
1603a379bbcSBoris Brezillon 
1613a379bbcSBoris Brezillon /**
1623a379bbcSBoris Brezillon  * struct i3c_ccc_setda - payload passed to SETNEWDA and SETDASA CCCs
1633a379bbcSBoris Brezillon  *
1643a379bbcSBoris Brezillon  * @addr: dynamic address to assign to an I3C device
1653a379bbcSBoris Brezillon  *
1663a379bbcSBoris Brezillon  * Information passed to the SETNEWDA and SETDASA CCCs to assign/change the
1673a379bbcSBoris Brezillon  * dynamic address of an I3C device.
1683a379bbcSBoris Brezillon  */
1693a379bbcSBoris Brezillon struct i3c_ccc_setda {
1703a379bbcSBoris Brezillon 	u8 addr;
1713a379bbcSBoris Brezillon };
1723a379bbcSBoris Brezillon 
1733a379bbcSBoris Brezillon /**
1743a379bbcSBoris Brezillon  * struct i3c_ccc_getpid - payload passed to GETPID CCC
1753a379bbcSBoris Brezillon  *
1763a379bbcSBoris Brezillon  * @pid: 48 bits PID in big endian
1773a379bbcSBoris Brezillon  */
1783a379bbcSBoris Brezillon struct i3c_ccc_getpid {
1793a379bbcSBoris Brezillon 	u8 pid[6];
1803a379bbcSBoris Brezillon };
1813a379bbcSBoris Brezillon 
1823a379bbcSBoris Brezillon /**
1833a379bbcSBoris Brezillon  * struct i3c_ccc_getbcr - payload passed to GETBCR CCC
1843a379bbcSBoris Brezillon  *
1853a379bbcSBoris Brezillon  * @bcr: BCR (Bus Characteristic Register) value
1863a379bbcSBoris Brezillon  */
1873a379bbcSBoris Brezillon struct i3c_ccc_getbcr {
1883a379bbcSBoris Brezillon 	u8 bcr;
1893a379bbcSBoris Brezillon };
1903a379bbcSBoris Brezillon 
1913a379bbcSBoris Brezillon /**
1923a379bbcSBoris Brezillon  * struct i3c_ccc_getdcr - payload passed to GETDCR CCC
1933a379bbcSBoris Brezillon  *
1943a379bbcSBoris Brezillon  * @dcr: DCR (Device Characteristic Register) value
1953a379bbcSBoris Brezillon  */
1963a379bbcSBoris Brezillon struct i3c_ccc_getdcr {
1973a379bbcSBoris Brezillon 	u8 dcr;
1983a379bbcSBoris Brezillon };
1993a379bbcSBoris Brezillon 
2003a379bbcSBoris Brezillon #define I3C_CCC_STATUS_PENDING_INT(status)	((status) & GENMASK(3, 0))
2013a379bbcSBoris Brezillon #define I3C_CCC_STATUS_PROTOCOL_ERROR		BIT(5)
2023a379bbcSBoris Brezillon #define I3C_CCC_STATUS_ACTIVITY_MODE(status)	\
2033a379bbcSBoris Brezillon 	(((status) & GENMASK(7, 6)) >> 6)
2043a379bbcSBoris Brezillon 
2053a379bbcSBoris Brezillon /**
2063a379bbcSBoris Brezillon  * struct i3c_ccc_getstatus - payload passed to GETSTATUS CCC
2073a379bbcSBoris Brezillon  *
2083a379bbcSBoris Brezillon  * @status: status of the I3C slave (see I3C_CCC_STATUS_xxx macros for more
2093a379bbcSBoris Brezillon  *	    information).
2103a379bbcSBoris Brezillon  */
2113a379bbcSBoris Brezillon struct i3c_ccc_getstatus {
2123a379bbcSBoris Brezillon 	__be16 status;
2133a379bbcSBoris Brezillon };
2143a379bbcSBoris Brezillon 
2153a379bbcSBoris Brezillon /**
2163a379bbcSBoris Brezillon  * struct i3c_ccc_getaccmst - payload passed to GETACCMST CCC
2173a379bbcSBoris Brezillon  *
2183a379bbcSBoris Brezillon  * @newmaster: address of the master taking bus ownership
2193a379bbcSBoris Brezillon  */
2203a379bbcSBoris Brezillon struct i3c_ccc_getaccmst {
2213a379bbcSBoris Brezillon 	u8 newmaster;
2223a379bbcSBoris Brezillon };
2233a379bbcSBoris Brezillon 
2243a379bbcSBoris Brezillon /**
2253a379bbcSBoris Brezillon  * struct i3c_ccc_bridged_slave_desc - bridged slave descriptor
2263a379bbcSBoris Brezillon  *
2273a379bbcSBoris Brezillon  * @addr: dynamic address of the bridged device
2283a379bbcSBoris Brezillon  * @id: ID of the slave device behind the bridge
2293a379bbcSBoris Brezillon  */
2303a379bbcSBoris Brezillon struct i3c_ccc_bridged_slave_desc {
2313a379bbcSBoris Brezillon 	u8 addr;
2323a379bbcSBoris Brezillon 	__be16 id;
2333a379bbcSBoris Brezillon } __packed;
2343a379bbcSBoris Brezillon 
2353a379bbcSBoris Brezillon /**
2363a379bbcSBoris Brezillon  * struct i3c_ccc_setbrgtgt - payload passed to SETBRGTGT CCC
2373a379bbcSBoris Brezillon  *
2383a379bbcSBoris Brezillon  * @count: number of bridged slaves
2393a379bbcSBoris Brezillon  * @bslaves: bridged slave descriptors
2403a379bbcSBoris Brezillon  */
2413a379bbcSBoris Brezillon struct i3c_ccc_setbrgtgt {
2423a379bbcSBoris Brezillon 	u8 count;
243*5224f790SGustavo A. R. Silva 	struct i3c_ccc_bridged_slave_desc bslaves[];
2443a379bbcSBoris Brezillon } __packed;
2453a379bbcSBoris Brezillon 
2463a379bbcSBoris Brezillon /**
2473a379bbcSBoris Brezillon  * enum i3c_sdr_max_data_rate - max data rate values for private SDR transfers
2483a379bbcSBoris Brezillon  */
2493a379bbcSBoris Brezillon enum i3c_sdr_max_data_rate {
2503a379bbcSBoris Brezillon 	I3C_SDR0_FSCL_MAX,
2513a379bbcSBoris Brezillon 	I3C_SDR1_FSCL_8MHZ,
2523a379bbcSBoris Brezillon 	I3C_SDR2_FSCL_6MHZ,
2533a379bbcSBoris Brezillon 	I3C_SDR3_FSCL_4MHZ,
2543a379bbcSBoris Brezillon 	I3C_SDR4_FSCL_2MHZ,
2553a379bbcSBoris Brezillon };
2563a379bbcSBoris Brezillon 
2573a379bbcSBoris Brezillon /**
2583a379bbcSBoris Brezillon  * enum i3c_tsco - clock to data turn-around
2593a379bbcSBoris Brezillon  */
2603a379bbcSBoris Brezillon enum i3c_tsco {
2613a379bbcSBoris Brezillon 	I3C_TSCO_8NS,
2623a379bbcSBoris Brezillon 	I3C_TSCO_9NS,
2633a379bbcSBoris Brezillon 	I3C_TSCO_10NS,
2643a379bbcSBoris Brezillon 	I3C_TSCO_11NS,
2653a379bbcSBoris Brezillon 	I3C_TSCO_12NS,
2663a379bbcSBoris Brezillon };
2673a379bbcSBoris Brezillon 
2683a379bbcSBoris Brezillon #define I3C_CCC_MAX_SDR_FSCL_MASK	GENMASK(2, 0)
2693a379bbcSBoris Brezillon #define I3C_CCC_MAX_SDR_FSCL(x)		((x) & I3C_CCC_MAX_SDR_FSCL_MASK)
2703a379bbcSBoris Brezillon 
2713a379bbcSBoris Brezillon /**
2723a379bbcSBoris Brezillon  * struct i3c_ccc_getmxds - payload passed to GETMXDS CCC
2733a379bbcSBoris Brezillon  *
2743a379bbcSBoris Brezillon  * @maxwr: write limitations
2753a379bbcSBoris Brezillon  * @maxrd: read limitations
2763a379bbcSBoris Brezillon  * @maxrdturn: maximum read turn-around expressed micro-seconds and
2773a379bbcSBoris Brezillon  *	       little-endian formatted
2783a379bbcSBoris Brezillon  */
2793a379bbcSBoris Brezillon struct i3c_ccc_getmxds {
2803a379bbcSBoris Brezillon 	u8 maxwr;
2813a379bbcSBoris Brezillon 	u8 maxrd;
2823a379bbcSBoris Brezillon 	u8 maxrdturn[3];
2833a379bbcSBoris Brezillon } __packed;
2843a379bbcSBoris Brezillon 
2853a379bbcSBoris Brezillon #define I3C_CCC_HDR_MODE(mode)		BIT(mode)
2863a379bbcSBoris Brezillon 
2873a379bbcSBoris Brezillon /**
2883a379bbcSBoris Brezillon  * struct i3c_ccc_gethdrcap - payload passed to GETHDRCAP CCC
2893a379bbcSBoris Brezillon  *
2903a379bbcSBoris Brezillon  * @modes: bitmap of supported HDR modes
2913a379bbcSBoris Brezillon  */
2923a379bbcSBoris Brezillon struct i3c_ccc_gethdrcap {
2933a379bbcSBoris Brezillon 	u8 modes;
2943a379bbcSBoris Brezillon } __packed;
2953a379bbcSBoris Brezillon 
2963a379bbcSBoris Brezillon /**
2973a379bbcSBoris Brezillon  * enum i3c_ccc_setxtime_subcmd - SETXTIME sub-commands
2983a379bbcSBoris Brezillon  */
2993a379bbcSBoris Brezillon enum i3c_ccc_setxtime_subcmd {
3003a379bbcSBoris Brezillon 	I3C_CCC_SETXTIME_ST = 0x7f,
3013a379bbcSBoris Brezillon 	I3C_CCC_SETXTIME_DT = 0xbf,
3023a379bbcSBoris Brezillon 	I3C_CCC_SETXTIME_ENTER_ASYNC_MODE0 = 0xdf,
3033a379bbcSBoris Brezillon 	I3C_CCC_SETXTIME_ENTER_ASYNC_MODE1 = 0xef,
3043a379bbcSBoris Brezillon 	I3C_CCC_SETXTIME_ENTER_ASYNC_MODE2 = 0xf7,
3053a379bbcSBoris Brezillon 	I3C_CCC_SETXTIME_ENTER_ASYNC_MODE3 = 0xfb,
3063a379bbcSBoris Brezillon 	I3C_CCC_SETXTIME_ASYNC_TRIGGER = 0xfd,
3073a379bbcSBoris Brezillon 	I3C_CCC_SETXTIME_TPH = 0x3f,
3083a379bbcSBoris Brezillon 	I3C_CCC_SETXTIME_TU = 0x9f,
3093a379bbcSBoris Brezillon 	I3C_CCC_SETXTIME_ODR = 0x8f,
3103a379bbcSBoris Brezillon };
3113a379bbcSBoris Brezillon 
3123a379bbcSBoris Brezillon /**
3133a379bbcSBoris Brezillon  * struct i3c_ccc_setxtime - payload passed to SETXTIME CCC
3143a379bbcSBoris Brezillon  *
3153a379bbcSBoris Brezillon  * @subcmd: one of the sub-commands ddefined in &enum i3c_ccc_setxtime_subcmd
3163a379bbcSBoris Brezillon  * @data: sub-command payload. Amount of data is determined by
3173a379bbcSBoris Brezillon  *	  &i3c_ccc_setxtime->subcmd
3183a379bbcSBoris Brezillon  */
3193a379bbcSBoris Brezillon struct i3c_ccc_setxtime {
3203a379bbcSBoris Brezillon 	u8 subcmd;
321*5224f790SGustavo A. R. Silva 	u8 data[];
3223a379bbcSBoris Brezillon } __packed;
3233a379bbcSBoris Brezillon 
3243a379bbcSBoris Brezillon #define I3C_CCC_GETXTIME_SYNC_MODE	BIT(0)
3253a379bbcSBoris Brezillon #define I3C_CCC_GETXTIME_ASYNC_MODE(x)	BIT((x) + 1)
3263a379bbcSBoris Brezillon #define I3C_CCC_GETXTIME_OVERFLOW	BIT(7)
3273a379bbcSBoris Brezillon 
3283a379bbcSBoris Brezillon /**
3293a379bbcSBoris Brezillon  * struct i3c_ccc_getxtime - payload retrieved from GETXTIME CCC
3303a379bbcSBoris Brezillon  *
3313a379bbcSBoris Brezillon  * @supported_modes: bitmap describing supported XTIME modes
3323a379bbcSBoris Brezillon  * @state: current status (enabled mode and overflow status)
3333a379bbcSBoris Brezillon  * @frequency: slave's internal oscillator frequency in 500KHz steps
3343a379bbcSBoris Brezillon  * @inaccuracy: slave's internal oscillator inaccuracy in 0.1% steps
3353a379bbcSBoris Brezillon  */
3363a379bbcSBoris Brezillon struct i3c_ccc_getxtime {
3373a379bbcSBoris Brezillon 	u8 supported_modes;
3383a379bbcSBoris Brezillon 	u8 state;
3393a379bbcSBoris Brezillon 	u8 frequency;
3403a379bbcSBoris Brezillon 	u8 inaccuracy;
3413a379bbcSBoris Brezillon } __packed;
3423a379bbcSBoris Brezillon 
3433a379bbcSBoris Brezillon /**
3443a379bbcSBoris Brezillon  * struct i3c_ccc_cmd_payload - CCC payload
3453a379bbcSBoris Brezillon  *
3463a379bbcSBoris Brezillon  * @len: payload length
3473a379bbcSBoris Brezillon  * @data: payload data. This buffer must be DMA-able
3483a379bbcSBoris Brezillon  */
3493a379bbcSBoris Brezillon struct i3c_ccc_cmd_payload {
3503a379bbcSBoris Brezillon 	u16 len;
3513a379bbcSBoris Brezillon 	void *data;
3523a379bbcSBoris Brezillon };
3533a379bbcSBoris Brezillon 
3543a379bbcSBoris Brezillon /**
3553a379bbcSBoris Brezillon  * struct i3c_ccc_cmd_dest - CCC command destination
3563a379bbcSBoris Brezillon  *
3573a379bbcSBoris Brezillon  * @addr: can be an I3C device address or the broadcast address if this is a
3583a379bbcSBoris Brezillon  *	  broadcast CCC
3593a379bbcSBoris Brezillon  * @payload: payload to be sent to this device or broadcasted
3603a379bbcSBoris Brezillon  */
3613a379bbcSBoris Brezillon struct i3c_ccc_cmd_dest {
3623a379bbcSBoris Brezillon 	u8 addr;
3633a379bbcSBoris Brezillon 	struct i3c_ccc_cmd_payload payload;
3643a379bbcSBoris Brezillon };
3653a379bbcSBoris Brezillon 
3663a379bbcSBoris Brezillon /**
3673a379bbcSBoris Brezillon  * struct i3c_ccc_cmd - CCC command
3683a379bbcSBoris Brezillon  *
3693a379bbcSBoris Brezillon  * @rnw: true if the CCC should retrieve data from the device. Only valid for
3703a379bbcSBoris Brezillon  *	 unicast commands
3713a379bbcSBoris Brezillon  * @id: CCC command id
3723a379bbcSBoris Brezillon  * @ndests: number of destinations. Should always be one for broadcast commands
3733a379bbcSBoris Brezillon  * @dests: array of destinations and associated payload for this CCC. Most of
3743a379bbcSBoris Brezillon  *	   the time, only one destination is provided
3753a379bbcSBoris Brezillon  * @err: I3C error code
3763a379bbcSBoris Brezillon  */
3773a379bbcSBoris Brezillon struct i3c_ccc_cmd {
3783a379bbcSBoris Brezillon 	u8 rnw;
3793a379bbcSBoris Brezillon 	u8 id;
3803a379bbcSBoris Brezillon 	unsigned int ndests;
3813a379bbcSBoris Brezillon 	struct i3c_ccc_cmd_dest *dests;
3823a379bbcSBoris Brezillon 	enum i3c_error_code err;
3833a379bbcSBoris Brezillon };
3843a379bbcSBoris Brezillon 
3853a379bbcSBoris Brezillon #endif /* I3C_CCC_H */
386