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