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