162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (C) 2018 Cadence Design Systems Inc.
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Author: Boris Brezillon <boris.brezillon@bootlin.com>
662306a36Sopenharmony_ci */
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#ifndef I3C_CCC_H
962306a36Sopenharmony_ci#define I3C_CCC_H
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci#include <linux/bitops.h>
1262306a36Sopenharmony_ci#include <linux/i3c/device.h>
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci/* I3C CCC (Common Command Codes) related definitions */
1562306a36Sopenharmony_ci#define I3C_CCC_DIRECT			BIT(7)
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci#define I3C_CCC_ID(id, broadcast)	\
1862306a36Sopenharmony_ci	((id) | ((broadcast) ? 0 : I3C_CCC_DIRECT))
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci/* Commands valid in both broadcast and unicast modes */
2162306a36Sopenharmony_ci#define I3C_CCC_ENEC(broadcast)		I3C_CCC_ID(0x0, broadcast)
2262306a36Sopenharmony_ci#define I3C_CCC_DISEC(broadcast)	I3C_CCC_ID(0x1, broadcast)
2362306a36Sopenharmony_ci#define I3C_CCC_ENTAS(as, broadcast)	I3C_CCC_ID(0x2 + (as), broadcast)
2462306a36Sopenharmony_ci#define I3C_CCC_RSTDAA(broadcast)	I3C_CCC_ID(0x6, broadcast)
2562306a36Sopenharmony_ci#define I3C_CCC_SETMWL(broadcast)	I3C_CCC_ID(0x9, broadcast)
2662306a36Sopenharmony_ci#define I3C_CCC_SETMRL(broadcast)	I3C_CCC_ID(0xa, broadcast)
2762306a36Sopenharmony_ci#define I3C_CCC_SETXTIME(broadcast)	((broadcast) ? 0x28 : 0x98)
2862306a36Sopenharmony_ci#define I3C_CCC_VENDOR(id, broadcast)	((id) + ((broadcast) ? 0x61 : 0xe0))
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ci/* Broadcast-only commands */
3162306a36Sopenharmony_ci#define I3C_CCC_ENTDAA			I3C_CCC_ID(0x7, true)
3262306a36Sopenharmony_ci#define I3C_CCC_DEFSLVS			I3C_CCC_ID(0x8, true)
3362306a36Sopenharmony_ci#define I3C_CCC_ENTTM			I3C_CCC_ID(0xb, true)
3462306a36Sopenharmony_ci#define I3C_CCC_ENTHDR(x)		I3C_CCC_ID(0x20 + (x), true)
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ci/* Unicast-only commands */
3762306a36Sopenharmony_ci#define I3C_CCC_SETDASA			I3C_CCC_ID(0x7, false)
3862306a36Sopenharmony_ci#define I3C_CCC_SETNEWDA		I3C_CCC_ID(0x8, false)
3962306a36Sopenharmony_ci#define I3C_CCC_GETMWL			I3C_CCC_ID(0xb, false)
4062306a36Sopenharmony_ci#define I3C_CCC_GETMRL			I3C_CCC_ID(0xc, false)
4162306a36Sopenharmony_ci#define I3C_CCC_GETPID			I3C_CCC_ID(0xd, false)
4262306a36Sopenharmony_ci#define I3C_CCC_GETBCR			I3C_CCC_ID(0xe, false)
4362306a36Sopenharmony_ci#define I3C_CCC_GETDCR			I3C_CCC_ID(0xf, false)
4462306a36Sopenharmony_ci#define I3C_CCC_GETSTATUS		I3C_CCC_ID(0x10, false)
4562306a36Sopenharmony_ci#define I3C_CCC_GETACCMST		I3C_CCC_ID(0x11, false)
4662306a36Sopenharmony_ci#define I3C_CCC_SETBRGTGT		I3C_CCC_ID(0x13, false)
4762306a36Sopenharmony_ci#define I3C_CCC_GETMXDS			I3C_CCC_ID(0x14, false)
4862306a36Sopenharmony_ci#define I3C_CCC_GETHDRCAP		I3C_CCC_ID(0x15, false)
4962306a36Sopenharmony_ci#define I3C_CCC_GETXTIME		I3C_CCC_ID(0x19, false)
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_ci#define I3C_CCC_EVENT_SIR		BIT(0)
5262306a36Sopenharmony_ci#define I3C_CCC_EVENT_MR		BIT(1)
5362306a36Sopenharmony_ci#define I3C_CCC_EVENT_HJ		BIT(3)
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_ci/**
5662306a36Sopenharmony_ci * struct i3c_ccc_events - payload passed to ENEC/DISEC CCC
5762306a36Sopenharmony_ci *
5862306a36Sopenharmony_ci * @events: bitmask of I3C_CCC_EVENT_xxx events.
5962306a36Sopenharmony_ci *
6062306a36Sopenharmony_ci * Depending on the CCC command, the specific events coming from all devices
6162306a36Sopenharmony_ci * (broadcast version) or a specific device (unicast version) will be
6262306a36Sopenharmony_ci * enabled (ENEC) or disabled (DISEC).
6362306a36Sopenharmony_ci */
6462306a36Sopenharmony_cistruct i3c_ccc_events {
6562306a36Sopenharmony_ci	u8 events;
6662306a36Sopenharmony_ci};
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_ci/**
6962306a36Sopenharmony_ci * struct i3c_ccc_mwl - payload passed to SETMWL/GETMWL CCC
7062306a36Sopenharmony_ci *
7162306a36Sopenharmony_ci * @len: maximum write length in bytes
7262306a36Sopenharmony_ci *
7362306a36Sopenharmony_ci * The maximum write length is only applicable to SDR private messages or
7462306a36Sopenharmony_ci * extended Write CCCs (like SETXTIME).
7562306a36Sopenharmony_ci */
7662306a36Sopenharmony_cistruct i3c_ccc_mwl {
7762306a36Sopenharmony_ci	__be16 len;
7862306a36Sopenharmony_ci};
7962306a36Sopenharmony_ci
8062306a36Sopenharmony_ci/**
8162306a36Sopenharmony_ci * struct i3c_ccc_mrl - payload passed to SETMRL/GETMRL CCC
8262306a36Sopenharmony_ci *
8362306a36Sopenharmony_ci * @len: maximum read length in bytes
8462306a36Sopenharmony_ci * @ibi_len: maximum IBI payload length
8562306a36Sopenharmony_ci *
8662306a36Sopenharmony_ci * The maximum read length is only applicable to SDR private messages or
8762306a36Sopenharmony_ci * extended Read CCCs (like GETXTIME).
8862306a36Sopenharmony_ci * The IBI length is only valid if the I3C slave is IBI capable
8962306a36Sopenharmony_ci * (%I3C_BCR_IBI_REQ_CAP is set).
9062306a36Sopenharmony_ci */
9162306a36Sopenharmony_cistruct i3c_ccc_mrl {
9262306a36Sopenharmony_ci	__be16 read_len;
9362306a36Sopenharmony_ci	u8 ibi_len;
9462306a36Sopenharmony_ci} __packed;
9562306a36Sopenharmony_ci
9662306a36Sopenharmony_ci/**
9762306a36Sopenharmony_ci * struct i3c_ccc_dev_desc - I3C/I2C device descriptor used for DEFSLVS
9862306a36Sopenharmony_ci *
9962306a36Sopenharmony_ci * @dyn_addr: dynamic address assigned to the I3C slave or 0 if the entry is
10062306a36Sopenharmony_ci *	      describing an I2C slave.
10162306a36Sopenharmony_ci * @dcr: DCR value (not applicable to entries describing I2C devices)
10262306a36Sopenharmony_ci * @lvr: LVR value (not applicable to entries describing I3C devices)
10362306a36Sopenharmony_ci * @bcr: BCR value or 0 if this entry is describing an I2C slave
10462306a36Sopenharmony_ci * @static_addr: static address or 0 if the device does not have a static
10562306a36Sopenharmony_ci *		 address
10662306a36Sopenharmony_ci *
10762306a36Sopenharmony_ci * The DEFSLVS command should be passed an array of i3c_ccc_dev_desc
10862306a36Sopenharmony_ci * descriptors (one entry per I3C/I2C dev controlled by the master).
10962306a36Sopenharmony_ci */
11062306a36Sopenharmony_cistruct i3c_ccc_dev_desc {
11162306a36Sopenharmony_ci	u8 dyn_addr;
11262306a36Sopenharmony_ci	union {
11362306a36Sopenharmony_ci		u8 dcr;
11462306a36Sopenharmony_ci		u8 lvr;
11562306a36Sopenharmony_ci	};
11662306a36Sopenharmony_ci	u8 bcr;
11762306a36Sopenharmony_ci	u8 static_addr;
11862306a36Sopenharmony_ci};
11962306a36Sopenharmony_ci
12062306a36Sopenharmony_ci/**
12162306a36Sopenharmony_ci * struct i3c_ccc_defslvs - payload passed to DEFSLVS CCC
12262306a36Sopenharmony_ci *
12362306a36Sopenharmony_ci * @count: number of dev descriptors
12462306a36Sopenharmony_ci * @master: descriptor describing the current master
12562306a36Sopenharmony_ci * @slaves: array of descriptors describing slaves controlled by the
12662306a36Sopenharmony_ci *	    current master
12762306a36Sopenharmony_ci *
12862306a36Sopenharmony_ci * Information passed to the broadcast DEFSLVS to propagate device
12962306a36Sopenharmony_ci * information to all masters currently acting as slaves on the bus.
13062306a36Sopenharmony_ci * This is only meaningful if you have more than one master.
13162306a36Sopenharmony_ci */
13262306a36Sopenharmony_cistruct i3c_ccc_defslvs {
13362306a36Sopenharmony_ci	u8 count;
13462306a36Sopenharmony_ci	struct i3c_ccc_dev_desc master;
13562306a36Sopenharmony_ci	struct i3c_ccc_dev_desc slaves[];
13662306a36Sopenharmony_ci} __packed;
13762306a36Sopenharmony_ci
13862306a36Sopenharmony_ci/**
13962306a36Sopenharmony_ci * enum i3c_ccc_test_mode - enum listing all available test modes
14062306a36Sopenharmony_ci *
14162306a36Sopenharmony_ci * @I3C_CCC_EXIT_TEST_MODE: exit test mode
14262306a36Sopenharmony_ci * @I3C_CCC_VENDOR_TEST_MODE: enter vendor test mode
14362306a36Sopenharmony_ci */
14462306a36Sopenharmony_cienum i3c_ccc_test_mode {
14562306a36Sopenharmony_ci	I3C_CCC_EXIT_TEST_MODE,
14662306a36Sopenharmony_ci	I3C_CCC_VENDOR_TEST_MODE,
14762306a36Sopenharmony_ci};
14862306a36Sopenharmony_ci
14962306a36Sopenharmony_ci/**
15062306a36Sopenharmony_ci * struct i3c_ccc_enttm - payload passed to ENTTM CCC
15162306a36Sopenharmony_ci *
15262306a36Sopenharmony_ci * @mode: one of the &enum i3c_ccc_test_mode modes
15362306a36Sopenharmony_ci *
15462306a36Sopenharmony_ci * Information passed to the ENTTM CCC to instruct an I3C device to enter a
15562306a36Sopenharmony_ci * specific test mode.
15662306a36Sopenharmony_ci */
15762306a36Sopenharmony_cistruct i3c_ccc_enttm {
15862306a36Sopenharmony_ci	u8 mode;
15962306a36Sopenharmony_ci};
16062306a36Sopenharmony_ci
16162306a36Sopenharmony_ci/**
16262306a36Sopenharmony_ci * struct i3c_ccc_setda - payload passed to SETNEWDA and SETDASA CCCs
16362306a36Sopenharmony_ci *
16462306a36Sopenharmony_ci * @addr: dynamic address to assign to an I3C device
16562306a36Sopenharmony_ci *
16662306a36Sopenharmony_ci * Information passed to the SETNEWDA and SETDASA CCCs to assign/change the
16762306a36Sopenharmony_ci * dynamic address of an I3C device.
16862306a36Sopenharmony_ci */
16962306a36Sopenharmony_cistruct i3c_ccc_setda {
17062306a36Sopenharmony_ci	u8 addr;
17162306a36Sopenharmony_ci};
17262306a36Sopenharmony_ci
17362306a36Sopenharmony_ci/**
17462306a36Sopenharmony_ci * struct i3c_ccc_getpid - payload passed to GETPID CCC
17562306a36Sopenharmony_ci *
17662306a36Sopenharmony_ci * @pid: 48 bits PID in big endian
17762306a36Sopenharmony_ci */
17862306a36Sopenharmony_cistruct i3c_ccc_getpid {
17962306a36Sopenharmony_ci	u8 pid[6];
18062306a36Sopenharmony_ci};
18162306a36Sopenharmony_ci
18262306a36Sopenharmony_ci/**
18362306a36Sopenharmony_ci * struct i3c_ccc_getbcr - payload passed to GETBCR CCC
18462306a36Sopenharmony_ci *
18562306a36Sopenharmony_ci * @bcr: BCR (Bus Characteristic Register) value
18662306a36Sopenharmony_ci */
18762306a36Sopenharmony_cistruct i3c_ccc_getbcr {
18862306a36Sopenharmony_ci	u8 bcr;
18962306a36Sopenharmony_ci};
19062306a36Sopenharmony_ci
19162306a36Sopenharmony_ci/**
19262306a36Sopenharmony_ci * struct i3c_ccc_getdcr - payload passed to GETDCR CCC
19362306a36Sopenharmony_ci *
19462306a36Sopenharmony_ci * @dcr: DCR (Device Characteristic Register) value
19562306a36Sopenharmony_ci */
19662306a36Sopenharmony_cistruct i3c_ccc_getdcr {
19762306a36Sopenharmony_ci	u8 dcr;
19862306a36Sopenharmony_ci};
19962306a36Sopenharmony_ci
20062306a36Sopenharmony_ci#define I3C_CCC_STATUS_PENDING_INT(status)	((status) & GENMASK(3, 0))
20162306a36Sopenharmony_ci#define I3C_CCC_STATUS_PROTOCOL_ERROR		BIT(5)
20262306a36Sopenharmony_ci#define I3C_CCC_STATUS_ACTIVITY_MODE(status)	\
20362306a36Sopenharmony_ci	(((status) & GENMASK(7, 6)) >> 6)
20462306a36Sopenharmony_ci
20562306a36Sopenharmony_ci/**
20662306a36Sopenharmony_ci * struct i3c_ccc_getstatus - payload passed to GETSTATUS CCC
20762306a36Sopenharmony_ci *
20862306a36Sopenharmony_ci * @status: status of the I3C slave (see I3C_CCC_STATUS_xxx macros for more
20962306a36Sopenharmony_ci *	    information).
21062306a36Sopenharmony_ci */
21162306a36Sopenharmony_cistruct i3c_ccc_getstatus {
21262306a36Sopenharmony_ci	__be16 status;
21362306a36Sopenharmony_ci};
21462306a36Sopenharmony_ci
21562306a36Sopenharmony_ci/**
21662306a36Sopenharmony_ci * struct i3c_ccc_getaccmst - payload passed to GETACCMST CCC
21762306a36Sopenharmony_ci *
21862306a36Sopenharmony_ci * @newmaster: address of the master taking bus ownership
21962306a36Sopenharmony_ci */
22062306a36Sopenharmony_cistruct i3c_ccc_getaccmst {
22162306a36Sopenharmony_ci	u8 newmaster;
22262306a36Sopenharmony_ci};
22362306a36Sopenharmony_ci
22462306a36Sopenharmony_ci/**
22562306a36Sopenharmony_ci * struct i3c_ccc_bridged_slave_desc - bridged slave descriptor
22662306a36Sopenharmony_ci *
22762306a36Sopenharmony_ci * @addr: dynamic address of the bridged device
22862306a36Sopenharmony_ci * @id: ID of the slave device behind the bridge
22962306a36Sopenharmony_ci */
23062306a36Sopenharmony_cistruct i3c_ccc_bridged_slave_desc {
23162306a36Sopenharmony_ci	u8 addr;
23262306a36Sopenharmony_ci	__be16 id;
23362306a36Sopenharmony_ci} __packed;
23462306a36Sopenharmony_ci
23562306a36Sopenharmony_ci/**
23662306a36Sopenharmony_ci * struct i3c_ccc_setbrgtgt - payload passed to SETBRGTGT CCC
23762306a36Sopenharmony_ci *
23862306a36Sopenharmony_ci * @count: number of bridged slaves
23962306a36Sopenharmony_ci * @bslaves: bridged slave descriptors
24062306a36Sopenharmony_ci */
24162306a36Sopenharmony_cistruct i3c_ccc_setbrgtgt {
24262306a36Sopenharmony_ci	u8 count;
24362306a36Sopenharmony_ci	struct i3c_ccc_bridged_slave_desc bslaves[];
24462306a36Sopenharmony_ci} __packed;
24562306a36Sopenharmony_ci
24662306a36Sopenharmony_ci/**
24762306a36Sopenharmony_ci * enum i3c_sdr_max_data_rate - max data rate values for private SDR transfers
24862306a36Sopenharmony_ci */
24962306a36Sopenharmony_cienum i3c_sdr_max_data_rate {
25062306a36Sopenharmony_ci	I3C_SDR0_FSCL_MAX,
25162306a36Sopenharmony_ci	I3C_SDR1_FSCL_8MHZ,
25262306a36Sopenharmony_ci	I3C_SDR2_FSCL_6MHZ,
25362306a36Sopenharmony_ci	I3C_SDR3_FSCL_4MHZ,
25462306a36Sopenharmony_ci	I3C_SDR4_FSCL_2MHZ,
25562306a36Sopenharmony_ci};
25662306a36Sopenharmony_ci
25762306a36Sopenharmony_ci/**
25862306a36Sopenharmony_ci * enum i3c_tsco - clock to data turn-around
25962306a36Sopenharmony_ci */
26062306a36Sopenharmony_cienum i3c_tsco {
26162306a36Sopenharmony_ci	I3C_TSCO_8NS,
26262306a36Sopenharmony_ci	I3C_TSCO_9NS,
26362306a36Sopenharmony_ci	I3C_TSCO_10NS,
26462306a36Sopenharmony_ci	I3C_TSCO_11NS,
26562306a36Sopenharmony_ci	I3C_TSCO_12NS,
26662306a36Sopenharmony_ci};
26762306a36Sopenharmony_ci
26862306a36Sopenharmony_ci#define I3C_CCC_MAX_SDR_FSCL_MASK	GENMASK(2, 0)
26962306a36Sopenharmony_ci#define I3C_CCC_MAX_SDR_FSCL(x)		((x) & I3C_CCC_MAX_SDR_FSCL_MASK)
27062306a36Sopenharmony_ci
27162306a36Sopenharmony_ci/**
27262306a36Sopenharmony_ci * struct i3c_ccc_getmxds - payload passed to GETMXDS CCC
27362306a36Sopenharmony_ci *
27462306a36Sopenharmony_ci * @maxwr: write limitations
27562306a36Sopenharmony_ci * @maxrd: read limitations
27662306a36Sopenharmony_ci * @maxrdturn: maximum read turn-around expressed micro-seconds and
27762306a36Sopenharmony_ci *	       little-endian formatted
27862306a36Sopenharmony_ci */
27962306a36Sopenharmony_cistruct i3c_ccc_getmxds {
28062306a36Sopenharmony_ci	u8 maxwr;
28162306a36Sopenharmony_ci	u8 maxrd;
28262306a36Sopenharmony_ci	u8 maxrdturn[3];
28362306a36Sopenharmony_ci} __packed;
28462306a36Sopenharmony_ci
28562306a36Sopenharmony_ci#define I3C_CCC_HDR_MODE(mode)		BIT(mode)
28662306a36Sopenharmony_ci
28762306a36Sopenharmony_ci/**
28862306a36Sopenharmony_ci * struct i3c_ccc_gethdrcap - payload passed to GETHDRCAP CCC
28962306a36Sopenharmony_ci *
29062306a36Sopenharmony_ci * @modes: bitmap of supported HDR modes
29162306a36Sopenharmony_ci */
29262306a36Sopenharmony_cistruct i3c_ccc_gethdrcap {
29362306a36Sopenharmony_ci	u8 modes;
29462306a36Sopenharmony_ci} __packed;
29562306a36Sopenharmony_ci
29662306a36Sopenharmony_ci/**
29762306a36Sopenharmony_ci * enum i3c_ccc_setxtime_subcmd - SETXTIME sub-commands
29862306a36Sopenharmony_ci */
29962306a36Sopenharmony_cienum i3c_ccc_setxtime_subcmd {
30062306a36Sopenharmony_ci	I3C_CCC_SETXTIME_ST = 0x7f,
30162306a36Sopenharmony_ci	I3C_CCC_SETXTIME_DT = 0xbf,
30262306a36Sopenharmony_ci	I3C_CCC_SETXTIME_ENTER_ASYNC_MODE0 = 0xdf,
30362306a36Sopenharmony_ci	I3C_CCC_SETXTIME_ENTER_ASYNC_MODE1 = 0xef,
30462306a36Sopenharmony_ci	I3C_CCC_SETXTIME_ENTER_ASYNC_MODE2 = 0xf7,
30562306a36Sopenharmony_ci	I3C_CCC_SETXTIME_ENTER_ASYNC_MODE3 = 0xfb,
30662306a36Sopenharmony_ci	I3C_CCC_SETXTIME_ASYNC_TRIGGER = 0xfd,
30762306a36Sopenharmony_ci	I3C_CCC_SETXTIME_TPH = 0x3f,
30862306a36Sopenharmony_ci	I3C_CCC_SETXTIME_TU = 0x9f,
30962306a36Sopenharmony_ci	I3C_CCC_SETXTIME_ODR = 0x8f,
31062306a36Sopenharmony_ci};
31162306a36Sopenharmony_ci
31262306a36Sopenharmony_ci/**
31362306a36Sopenharmony_ci * struct i3c_ccc_setxtime - payload passed to SETXTIME CCC
31462306a36Sopenharmony_ci *
31562306a36Sopenharmony_ci * @subcmd: one of the sub-commands ddefined in &enum i3c_ccc_setxtime_subcmd
31662306a36Sopenharmony_ci * @data: sub-command payload. Amount of data is determined by
31762306a36Sopenharmony_ci *	  &i3c_ccc_setxtime->subcmd
31862306a36Sopenharmony_ci */
31962306a36Sopenharmony_cistruct i3c_ccc_setxtime {
32062306a36Sopenharmony_ci	u8 subcmd;
32162306a36Sopenharmony_ci	u8 data[];
32262306a36Sopenharmony_ci} __packed;
32362306a36Sopenharmony_ci
32462306a36Sopenharmony_ci#define I3C_CCC_GETXTIME_SYNC_MODE	BIT(0)
32562306a36Sopenharmony_ci#define I3C_CCC_GETXTIME_ASYNC_MODE(x)	BIT((x) + 1)
32662306a36Sopenharmony_ci#define I3C_CCC_GETXTIME_OVERFLOW	BIT(7)
32762306a36Sopenharmony_ci
32862306a36Sopenharmony_ci/**
32962306a36Sopenharmony_ci * struct i3c_ccc_getxtime - payload retrieved from GETXTIME CCC
33062306a36Sopenharmony_ci *
33162306a36Sopenharmony_ci * @supported_modes: bitmap describing supported XTIME modes
33262306a36Sopenharmony_ci * @state: current status (enabled mode and overflow status)
33362306a36Sopenharmony_ci * @frequency: slave's internal oscillator frequency in 500KHz steps
33462306a36Sopenharmony_ci * @inaccuracy: slave's internal oscillator inaccuracy in 0.1% steps
33562306a36Sopenharmony_ci */
33662306a36Sopenharmony_cistruct i3c_ccc_getxtime {
33762306a36Sopenharmony_ci	u8 supported_modes;
33862306a36Sopenharmony_ci	u8 state;
33962306a36Sopenharmony_ci	u8 frequency;
34062306a36Sopenharmony_ci	u8 inaccuracy;
34162306a36Sopenharmony_ci} __packed;
34262306a36Sopenharmony_ci
34362306a36Sopenharmony_ci/**
34462306a36Sopenharmony_ci * struct i3c_ccc_cmd_payload - CCC payload
34562306a36Sopenharmony_ci *
34662306a36Sopenharmony_ci * @len: payload length
34762306a36Sopenharmony_ci * @data: payload data. This buffer must be DMA-able
34862306a36Sopenharmony_ci */
34962306a36Sopenharmony_cistruct i3c_ccc_cmd_payload {
35062306a36Sopenharmony_ci	u16 len;
35162306a36Sopenharmony_ci	void *data;
35262306a36Sopenharmony_ci};
35362306a36Sopenharmony_ci
35462306a36Sopenharmony_ci/**
35562306a36Sopenharmony_ci * struct i3c_ccc_cmd_dest - CCC command destination
35662306a36Sopenharmony_ci *
35762306a36Sopenharmony_ci * @addr: can be an I3C device address or the broadcast address if this is a
35862306a36Sopenharmony_ci *	  broadcast CCC
35962306a36Sopenharmony_ci * @payload: payload to be sent to this device or broadcasted
36062306a36Sopenharmony_ci */
36162306a36Sopenharmony_cistruct i3c_ccc_cmd_dest {
36262306a36Sopenharmony_ci	u8 addr;
36362306a36Sopenharmony_ci	struct i3c_ccc_cmd_payload payload;
36462306a36Sopenharmony_ci};
36562306a36Sopenharmony_ci
36662306a36Sopenharmony_ci/**
36762306a36Sopenharmony_ci * struct i3c_ccc_cmd - CCC command
36862306a36Sopenharmony_ci *
36962306a36Sopenharmony_ci * @rnw: true if the CCC should retrieve data from the device. Only valid for
37062306a36Sopenharmony_ci *	 unicast commands
37162306a36Sopenharmony_ci * @id: CCC command id
37262306a36Sopenharmony_ci * @ndests: number of destinations. Should always be one for broadcast commands
37362306a36Sopenharmony_ci * @dests: array of destinations and associated payload for this CCC. Most of
37462306a36Sopenharmony_ci *	   the time, only one destination is provided
37562306a36Sopenharmony_ci * @err: I3C error code
37662306a36Sopenharmony_ci */
37762306a36Sopenharmony_cistruct i3c_ccc_cmd {
37862306a36Sopenharmony_ci	u8 rnw;
37962306a36Sopenharmony_ci	u8 id;
38062306a36Sopenharmony_ci	unsigned int ndests;
38162306a36Sopenharmony_ci	struct i3c_ccc_cmd_dest *dests;
38262306a36Sopenharmony_ci	enum i3c_error_code err;
38362306a36Sopenharmony_ci};
38462306a36Sopenharmony_ci
38562306a36Sopenharmony_ci#endif /* I3C_CCC_H */
386