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