1*4882a593Smuzhiyun /* SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause) */ 2*4882a593Smuzhiyun /* Copyright(c) 2015-17 Intel Corporation. */ 3*4882a593Smuzhiyun 4*4882a593Smuzhiyun #ifndef __SOUNDWIRE_H 5*4882a593Smuzhiyun #define __SOUNDWIRE_H 6*4882a593Smuzhiyun 7*4882a593Smuzhiyun #include <linux/mod_devicetable.h> 8*4882a593Smuzhiyun #include <linux/bitfield.h> 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun struct sdw_bus; 11*4882a593Smuzhiyun struct sdw_slave; 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun /* SDW spec defines and enums, as defined by MIPI 1.1. Spec */ 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun /* SDW Broadcast Device Number */ 16*4882a593Smuzhiyun #define SDW_BROADCAST_DEV_NUM 15 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun /* SDW Enumeration Device Number */ 19*4882a593Smuzhiyun #define SDW_ENUM_DEV_NUM 0 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun /* SDW Group Device Numbers */ 22*4882a593Smuzhiyun #define SDW_GROUP12_DEV_NUM 12 23*4882a593Smuzhiyun #define SDW_GROUP13_DEV_NUM 13 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun /* SDW Master Device Number, not supported yet */ 26*4882a593Smuzhiyun #define SDW_MASTER_DEV_NUM 14 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun #define SDW_NUM_DEV_ID_REGISTERS 6 29*4882a593Smuzhiyun /* frame shape defines */ 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun /* 32*4882a593Smuzhiyun * Note: The maximum row define in SoundWire spec 1.1 is 23. In order to 33*4882a593Smuzhiyun * fill hole with 0, one more dummy entry is added 34*4882a593Smuzhiyun */ 35*4882a593Smuzhiyun #define SDW_FRAME_ROWS 24 36*4882a593Smuzhiyun #define SDW_FRAME_COLS 8 37*4882a593Smuzhiyun #define SDW_FRAME_ROW_COLS (SDW_FRAME_ROWS * SDW_FRAME_COLS) 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun #define SDW_FRAME_CTRL_BITS 48 40*4882a593Smuzhiyun #define SDW_MAX_DEVICES 11 41*4882a593Smuzhiyun 42*4882a593Smuzhiyun #define SDW_MAX_PORTS 15 43*4882a593Smuzhiyun #define SDW_VALID_PORT_RANGE(n) ((n) < SDW_MAX_PORTS && (n) >= 1) 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun enum { 46*4882a593Smuzhiyun SDW_PORT_DIRN_SINK = 0, 47*4882a593Smuzhiyun SDW_PORT_DIRN_SOURCE, 48*4882a593Smuzhiyun SDW_PORT_DIRN_MAX, 49*4882a593Smuzhiyun }; 50*4882a593Smuzhiyun 51*4882a593Smuzhiyun /* 52*4882a593Smuzhiyun * constants for flow control, ports and transport 53*4882a593Smuzhiyun * 54*4882a593Smuzhiyun * these are bit masks as devices can have multiple capabilities 55*4882a593Smuzhiyun */ 56*4882a593Smuzhiyun 57*4882a593Smuzhiyun /* 58*4882a593Smuzhiyun * flow modes for SDW port. These can be isochronous, tx controlled, 59*4882a593Smuzhiyun * rx controlled or async 60*4882a593Smuzhiyun */ 61*4882a593Smuzhiyun #define SDW_PORT_FLOW_MODE_ISOCH 0 62*4882a593Smuzhiyun #define SDW_PORT_FLOW_MODE_TX_CNTRL BIT(0) 63*4882a593Smuzhiyun #define SDW_PORT_FLOW_MODE_RX_CNTRL BIT(1) 64*4882a593Smuzhiyun #define SDW_PORT_FLOW_MODE_ASYNC GENMASK(1, 0) 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun /* sample packaging for block. It can be per port or per channel */ 67*4882a593Smuzhiyun #define SDW_BLOCK_PACKG_PER_PORT BIT(0) 68*4882a593Smuzhiyun #define SDW_BLOCK_PACKG_PER_CH BIT(1) 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun /** 71*4882a593Smuzhiyun * enum sdw_slave_status - Slave status 72*4882a593Smuzhiyun * @SDW_SLAVE_UNATTACHED: Slave is not attached with the bus. 73*4882a593Smuzhiyun * @SDW_SLAVE_ATTACHED: Slave is attached with bus. 74*4882a593Smuzhiyun * @SDW_SLAVE_ALERT: Some alert condition on the Slave 75*4882a593Smuzhiyun * @SDW_SLAVE_RESERVED: Reserved for future use 76*4882a593Smuzhiyun */ 77*4882a593Smuzhiyun enum sdw_slave_status { 78*4882a593Smuzhiyun SDW_SLAVE_UNATTACHED = 0, 79*4882a593Smuzhiyun SDW_SLAVE_ATTACHED = 1, 80*4882a593Smuzhiyun SDW_SLAVE_ALERT = 2, 81*4882a593Smuzhiyun SDW_SLAVE_RESERVED = 3, 82*4882a593Smuzhiyun }; 83*4882a593Smuzhiyun 84*4882a593Smuzhiyun /** 85*4882a593Smuzhiyun * enum sdw_clk_stop_type: clock stop operations 86*4882a593Smuzhiyun * 87*4882a593Smuzhiyun * @SDW_CLK_PRE_PREPARE: pre clock stop prepare 88*4882a593Smuzhiyun * @SDW_CLK_POST_PREPARE: post clock stop prepare 89*4882a593Smuzhiyun * @SDW_CLK_PRE_DEPREPARE: pre clock stop de-prepare 90*4882a593Smuzhiyun * @SDW_CLK_POST_DEPREPARE: post clock stop de-prepare 91*4882a593Smuzhiyun */ 92*4882a593Smuzhiyun enum sdw_clk_stop_type { 93*4882a593Smuzhiyun SDW_CLK_PRE_PREPARE = 0, 94*4882a593Smuzhiyun SDW_CLK_POST_PREPARE, 95*4882a593Smuzhiyun SDW_CLK_PRE_DEPREPARE, 96*4882a593Smuzhiyun SDW_CLK_POST_DEPREPARE, 97*4882a593Smuzhiyun }; 98*4882a593Smuzhiyun 99*4882a593Smuzhiyun /** 100*4882a593Smuzhiyun * enum sdw_command_response - Command response as defined by SDW spec 101*4882a593Smuzhiyun * @SDW_CMD_OK: cmd was successful 102*4882a593Smuzhiyun * @SDW_CMD_IGNORED: cmd was ignored 103*4882a593Smuzhiyun * @SDW_CMD_FAIL: cmd was NACKed 104*4882a593Smuzhiyun * @SDW_CMD_TIMEOUT: cmd timedout 105*4882a593Smuzhiyun * @SDW_CMD_FAIL_OTHER: cmd failed due to other reason than above 106*4882a593Smuzhiyun * 107*4882a593Smuzhiyun * NOTE: The enum is different than actual Spec as response in the Spec is 108*4882a593Smuzhiyun * combination of ACK/NAK bits 109*4882a593Smuzhiyun * 110*4882a593Smuzhiyun * SDW_CMD_TIMEOUT/FAIL_OTHER is defined for SW use, not in spec 111*4882a593Smuzhiyun */ 112*4882a593Smuzhiyun enum sdw_command_response { 113*4882a593Smuzhiyun SDW_CMD_OK = 0, 114*4882a593Smuzhiyun SDW_CMD_IGNORED = 1, 115*4882a593Smuzhiyun SDW_CMD_FAIL = 2, 116*4882a593Smuzhiyun SDW_CMD_TIMEOUT = 3, 117*4882a593Smuzhiyun SDW_CMD_FAIL_OTHER = 4, 118*4882a593Smuzhiyun }; 119*4882a593Smuzhiyun 120*4882a593Smuzhiyun /* block group count enum */ 121*4882a593Smuzhiyun enum sdw_dpn_grouping { 122*4882a593Smuzhiyun SDW_BLK_GRP_CNT_1 = 0, 123*4882a593Smuzhiyun SDW_BLK_GRP_CNT_2 = 1, 124*4882a593Smuzhiyun SDW_BLK_GRP_CNT_3 = 2, 125*4882a593Smuzhiyun SDW_BLK_GRP_CNT_4 = 3, 126*4882a593Smuzhiyun }; 127*4882a593Smuzhiyun 128*4882a593Smuzhiyun /** 129*4882a593Smuzhiyun * enum sdw_stream_type: data stream type 130*4882a593Smuzhiyun * 131*4882a593Smuzhiyun * @SDW_STREAM_PCM: PCM data stream 132*4882a593Smuzhiyun * @SDW_STREAM_PDM: PDM data stream 133*4882a593Smuzhiyun * 134*4882a593Smuzhiyun * spec doesn't define this, but is used in implementation 135*4882a593Smuzhiyun */ 136*4882a593Smuzhiyun enum sdw_stream_type { 137*4882a593Smuzhiyun SDW_STREAM_PCM = 0, 138*4882a593Smuzhiyun SDW_STREAM_PDM = 1, 139*4882a593Smuzhiyun }; 140*4882a593Smuzhiyun 141*4882a593Smuzhiyun /** 142*4882a593Smuzhiyun * enum sdw_data_direction: Data direction 143*4882a593Smuzhiyun * 144*4882a593Smuzhiyun * @SDW_DATA_DIR_RX: Data into Port 145*4882a593Smuzhiyun * @SDW_DATA_DIR_TX: Data out of Port 146*4882a593Smuzhiyun */ 147*4882a593Smuzhiyun enum sdw_data_direction { 148*4882a593Smuzhiyun SDW_DATA_DIR_RX = 0, 149*4882a593Smuzhiyun SDW_DATA_DIR_TX = 1, 150*4882a593Smuzhiyun }; 151*4882a593Smuzhiyun 152*4882a593Smuzhiyun /** 153*4882a593Smuzhiyun * enum sdw_port_data_mode: Data Port mode 154*4882a593Smuzhiyun * 155*4882a593Smuzhiyun * @SDW_PORT_DATA_MODE_NORMAL: Normal data mode where audio data is received 156*4882a593Smuzhiyun * and transmitted. 157*4882a593Smuzhiyun * @SDW_PORT_DATA_MODE_PRBS: Test mode which uses a PRBS generator to produce 158*4882a593Smuzhiyun * a pseudo random data pattern that is transferred 159*4882a593Smuzhiyun * @SDW_PORT_DATA_MODE_STATIC_0: Simple test mode which uses static value of 160*4882a593Smuzhiyun * logic 0. The encoding will result in no signal transitions 161*4882a593Smuzhiyun * @SDW_PORT_DATA_MODE_STATIC_1: Simple test mode which uses static value of 162*4882a593Smuzhiyun * logic 1. The encoding will result in signal transitions at every bitslot 163*4882a593Smuzhiyun * owned by this Port 164*4882a593Smuzhiyun */ 165*4882a593Smuzhiyun enum sdw_port_data_mode { 166*4882a593Smuzhiyun SDW_PORT_DATA_MODE_NORMAL = 0, 167*4882a593Smuzhiyun SDW_PORT_DATA_MODE_PRBS = 1, 168*4882a593Smuzhiyun SDW_PORT_DATA_MODE_STATIC_0 = 2, 169*4882a593Smuzhiyun SDW_PORT_DATA_MODE_STATIC_1 = 3, 170*4882a593Smuzhiyun }; 171*4882a593Smuzhiyun 172*4882a593Smuzhiyun /* 173*4882a593Smuzhiyun * SDW properties, defined in MIPI DisCo spec v1.0 174*4882a593Smuzhiyun */ 175*4882a593Smuzhiyun enum sdw_clk_stop_reset_behave { 176*4882a593Smuzhiyun SDW_CLK_STOP_KEEP_STATUS = 1, 177*4882a593Smuzhiyun }; 178*4882a593Smuzhiyun 179*4882a593Smuzhiyun /** 180*4882a593Smuzhiyun * enum sdw_p15_behave - Slave Port 15 behaviour when the Master attempts a 181*4882a593Smuzhiyun * read 182*4882a593Smuzhiyun * @SDW_P15_READ_IGNORED: Read is ignored 183*4882a593Smuzhiyun * @SDW_P15_CMD_OK: Command is ok 184*4882a593Smuzhiyun */ 185*4882a593Smuzhiyun enum sdw_p15_behave { 186*4882a593Smuzhiyun SDW_P15_READ_IGNORED = 0, 187*4882a593Smuzhiyun SDW_P15_CMD_OK = 1, 188*4882a593Smuzhiyun }; 189*4882a593Smuzhiyun 190*4882a593Smuzhiyun /** 191*4882a593Smuzhiyun * enum sdw_dpn_type - Data port types 192*4882a593Smuzhiyun * @SDW_DPN_FULL: Full Data Port is supported 193*4882a593Smuzhiyun * @SDW_DPN_SIMPLE: Simplified Data Port as defined in spec. 194*4882a593Smuzhiyun * DPN_SampleCtrl2, DPN_OffsetCtrl2, DPN_HCtrl and DPN_BlockCtrl3 195*4882a593Smuzhiyun * are not implemented. 196*4882a593Smuzhiyun * @SDW_DPN_REDUCED: Reduced Data Port as defined in spec. 197*4882a593Smuzhiyun * DPN_SampleCtrl2, DPN_HCtrl are not implemented. 198*4882a593Smuzhiyun */ 199*4882a593Smuzhiyun enum sdw_dpn_type { 200*4882a593Smuzhiyun SDW_DPN_FULL = 0, 201*4882a593Smuzhiyun SDW_DPN_SIMPLE = 1, 202*4882a593Smuzhiyun SDW_DPN_REDUCED = 2, 203*4882a593Smuzhiyun }; 204*4882a593Smuzhiyun 205*4882a593Smuzhiyun /** 206*4882a593Smuzhiyun * enum sdw_clk_stop_mode - Clock Stop modes 207*4882a593Smuzhiyun * @SDW_CLK_STOP_MODE0: Slave can continue operation seamlessly on clock 208*4882a593Smuzhiyun * restart 209*4882a593Smuzhiyun * @SDW_CLK_STOP_MODE1: Slave may have entered a deeper power-saving mode, 210*4882a593Smuzhiyun * not capable of continuing operation seamlessly when the clock restarts 211*4882a593Smuzhiyun */ 212*4882a593Smuzhiyun enum sdw_clk_stop_mode { 213*4882a593Smuzhiyun SDW_CLK_STOP_MODE0 = 0, 214*4882a593Smuzhiyun SDW_CLK_STOP_MODE1 = 1, 215*4882a593Smuzhiyun }; 216*4882a593Smuzhiyun 217*4882a593Smuzhiyun /** 218*4882a593Smuzhiyun * struct sdw_dp0_prop - DP0 properties 219*4882a593Smuzhiyun * @max_word: Maximum number of bits in a Payload Channel Sample, 1 to 64 220*4882a593Smuzhiyun * (inclusive) 221*4882a593Smuzhiyun * @min_word: Minimum number of bits in a Payload Channel Sample, 1 to 64 222*4882a593Smuzhiyun * (inclusive) 223*4882a593Smuzhiyun * @num_words: number of wordlengths supported 224*4882a593Smuzhiyun * @words: wordlengths supported 225*4882a593Smuzhiyun * @BRA_flow_controlled: Slave implementation results in an OK_NotReady 226*4882a593Smuzhiyun * response 227*4882a593Smuzhiyun * @simple_ch_prep_sm: If channel prepare sequence is required 228*4882a593Smuzhiyun * @imp_def_interrupts: If set, each bit corresponds to support for 229*4882a593Smuzhiyun * implementation-defined interrupts 230*4882a593Smuzhiyun * 231*4882a593Smuzhiyun * The wordlengths are specified by Spec as max, min AND number of 232*4882a593Smuzhiyun * discrete values, implementation can define based on the wordlengths they 233*4882a593Smuzhiyun * support 234*4882a593Smuzhiyun */ 235*4882a593Smuzhiyun struct sdw_dp0_prop { 236*4882a593Smuzhiyun u32 max_word; 237*4882a593Smuzhiyun u32 min_word; 238*4882a593Smuzhiyun u32 num_words; 239*4882a593Smuzhiyun u32 *words; 240*4882a593Smuzhiyun bool BRA_flow_controlled; 241*4882a593Smuzhiyun bool simple_ch_prep_sm; 242*4882a593Smuzhiyun bool imp_def_interrupts; 243*4882a593Smuzhiyun }; 244*4882a593Smuzhiyun 245*4882a593Smuzhiyun /** 246*4882a593Smuzhiyun * struct sdw_dpn_audio_mode - Audio mode properties for DPn 247*4882a593Smuzhiyun * @bus_min_freq: Minimum bus frequency, in Hz 248*4882a593Smuzhiyun * @bus_max_freq: Maximum bus frequency, in Hz 249*4882a593Smuzhiyun * @bus_num_freq: Number of discrete frequencies supported 250*4882a593Smuzhiyun * @bus_freq: Discrete bus frequencies, in Hz 251*4882a593Smuzhiyun * @min_freq: Minimum sampling frequency, in Hz 252*4882a593Smuzhiyun * @max_freq: Maximum sampling bus frequency, in Hz 253*4882a593Smuzhiyun * @num_freq: Number of discrete sampling frequency supported 254*4882a593Smuzhiyun * @freq: Discrete sampling frequencies, in Hz 255*4882a593Smuzhiyun * @prep_ch_behave: Specifies the dependencies between Channel Prepare 256*4882a593Smuzhiyun * sequence and bus clock configuration 257*4882a593Smuzhiyun * If 0, Channel Prepare can happen at any Bus clock rate 258*4882a593Smuzhiyun * If 1, Channel Prepare sequence shall happen only after Bus clock is 259*4882a593Smuzhiyun * changed to a frequency supported by this mode or compatible modes 260*4882a593Smuzhiyun * described by the next field 261*4882a593Smuzhiyun * @glitchless: Bitmap describing possible glitchless transitions from this 262*4882a593Smuzhiyun * Audio Mode to other Audio Modes 263*4882a593Smuzhiyun */ 264*4882a593Smuzhiyun struct sdw_dpn_audio_mode { 265*4882a593Smuzhiyun u32 bus_min_freq; 266*4882a593Smuzhiyun u32 bus_max_freq; 267*4882a593Smuzhiyun u32 bus_num_freq; 268*4882a593Smuzhiyun u32 *bus_freq; 269*4882a593Smuzhiyun u32 max_freq; 270*4882a593Smuzhiyun u32 min_freq; 271*4882a593Smuzhiyun u32 num_freq; 272*4882a593Smuzhiyun u32 *freq; 273*4882a593Smuzhiyun u32 prep_ch_behave; 274*4882a593Smuzhiyun u32 glitchless; 275*4882a593Smuzhiyun }; 276*4882a593Smuzhiyun 277*4882a593Smuzhiyun /** 278*4882a593Smuzhiyun * struct sdw_dpn_prop - Data Port DPn properties 279*4882a593Smuzhiyun * @num: port number 280*4882a593Smuzhiyun * @max_word: Maximum number of bits in a Payload Channel Sample, 1 to 64 281*4882a593Smuzhiyun * (inclusive) 282*4882a593Smuzhiyun * @min_word: Minimum number of bits in a Payload Channel Sample, 1 to 64 283*4882a593Smuzhiyun * (inclusive) 284*4882a593Smuzhiyun * @num_words: Number of discrete supported wordlengths 285*4882a593Smuzhiyun * @words: Discrete supported wordlength 286*4882a593Smuzhiyun * @type: Data port type. Full, Simplified or Reduced 287*4882a593Smuzhiyun * @max_grouping: Maximum number of samples that can be grouped together for 288*4882a593Smuzhiyun * a full data port 289*4882a593Smuzhiyun * @simple_ch_prep_sm: If the port supports simplified channel prepare state 290*4882a593Smuzhiyun * machine 291*4882a593Smuzhiyun * @ch_prep_timeout: Port-specific timeout value, in milliseconds 292*4882a593Smuzhiyun * @imp_def_interrupts: If set, each bit corresponds to support for 293*4882a593Smuzhiyun * implementation-defined interrupts 294*4882a593Smuzhiyun * @max_ch: Maximum channels supported 295*4882a593Smuzhiyun * @min_ch: Minimum channels supported 296*4882a593Smuzhiyun * @num_channels: Number of discrete channels supported 297*4882a593Smuzhiyun * @channels: Discrete channels supported 298*4882a593Smuzhiyun * @num_ch_combinations: Number of channel combinations supported 299*4882a593Smuzhiyun * @ch_combinations: Channel combinations supported 300*4882a593Smuzhiyun * @modes: SDW mode supported 301*4882a593Smuzhiyun * @max_async_buffer: Number of samples that this port can buffer in 302*4882a593Smuzhiyun * asynchronous modes 303*4882a593Smuzhiyun * @block_pack_mode: Type of block port mode supported 304*4882a593Smuzhiyun * @read_only_wordlength: Read Only wordlength field in DPN_BlockCtrl1 register 305*4882a593Smuzhiyun * @port_encoding: Payload Channel Sample encoding schemes supported 306*4882a593Smuzhiyun * @audio_modes: Audio modes supported 307*4882a593Smuzhiyun */ 308*4882a593Smuzhiyun struct sdw_dpn_prop { 309*4882a593Smuzhiyun u32 num; 310*4882a593Smuzhiyun u32 max_word; 311*4882a593Smuzhiyun u32 min_word; 312*4882a593Smuzhiyun u32 num_words; 313*4882a593Smuzhiyun u32 *words; 314*4882a593Smuzhiyun enum sdw_dpn_type type; 315*4882a593Smuzhiyun u32 max_grouping; 316*4882a593Smuzhiyun bool simple_ch_prep_sm; 317*4882a593Smuzhiyun u32 ch_prep_timeout; 318*4882a593Smuzhiyun u32 imp_def_interrupts; 319*4882a593Smuzhiyun u32 max_ch; 320*4882a593Smuzhiyun u32 min_ch; 321*4882a593Smuzhiyun u32 num_channels; 322*4882a593Smuzhiyun u32 *channels; 323*4882a593Smuzhiyun u32 num_ch_combinations; 324*4882a593Smuzhiyun u32 *ch_combinations; 325*4882a593Smuzhiyun u32 modes; 326*4882a593Smuzhiyun u32 max_async_buffer; 327*4882a593Smuzhiyun bool block_pack_mode; 328*4882a593Smuzhiyun bool read_only_wordlength; 329*4882a593Smuzhiyun u32 port_encoding; 330*4882a593Smuzhiyun struct sdw_dpn_audio_mode *audio_modes; 331*4882a593Smuzhiyun }; 332*4882a593Smuzhiyun 333*4882a593Smuzhiyun /** 334*4882a593Smuzhiyun * struct sdw_slave_prop - SoundWire Slave properties 335*4882a593Smuzhiyun * @mipi_revision: Spec version of the implementation 336*4882a593Smuzhiyun * @wake_capable: Wake-up events are supported 337*4882a593Smuzhiyun * @test_mode_capable: If test mode is supported 338*4882a593Smuzhiyun * @clk_stop_mode1: Clock-Stop Mode 1 is supported 339*4882a593Smuzhiyun * @simple_clk_stop_capable: Simple clock mode is supported 340*4882a593Smuzhiyun * @clk_stop_timeout: Worst-case latency of the Clock Stop Prepare State 341*4882a593Smuzhiyun * Machine transitions, in milliseconds 342*4882a593Smuzhiyun * @ch_prep_timeout: Worst-case latency of the Channel Prepare State Machine 343*4882a593Smuzhiyun * transitions, in milliseconds 344*4882a593Smuzhiyun * @reset_behave: Slave keeps the status of the SlaveStopClockPrepare 345*4882a593Smuzhiyun * state machine (P=1 SCSP_SM) after exit from clock-stop mode1 346*4882a593Smuzhiyun * @high_PHY_capable: Slave is HighPHY capable 347*4882a593Smuzhiyun * @paging_support: Slave implements paging registers SCP_AddrPage1 and 348*4882a593Smuzhiyun * SCP_AddrPage2 349*4882a593Smuzhiyun * @bank_delay_support: Slave implements bank delay/bridge support registers 350*4882a593Smuzhiyun * SCP_BankDelay and SCP_NextFrame 351*4882a593Smuzhiyun * @p15_behave: Slave behavior when the Master attempts a read to the Port15 352*4882a593Smuzhiyun * alias 353*4882a593Smuzhiyun * @lane_control_support: Slave supports lane control 354*4882a593Smuzhiyun * @master_count: Number of Masters present on this Slave 355*4882a593Smuzhiyun * @source_ports: Bitmap identifying source ports 356*4882a593Smuzhiyun * @sink_ports: Bitmap identifying sink ports 357*4882a593Smuzhiyun * @dp0_prop: Data Port 0 properties 358*4882a593Smuzhiyun * @src_dpn_prop: Source Data Port N properties 359*4882a593Smuzhiyun * @sink_dpn_prop: Sink Data Port N properties 360*4882a593Smuzhiyun * @scp_int1_mask: SCP_INT1_MASK desired settings 361*4882a593Smuzhiyun * @quirks: bitmask identifying deltas from the MIPI specification 362*4882a593Smuzhiyun */ 363*4882a593Smuzhiyun struct sdw_slave_prop { 364*4882a593Smuzhiyun u32 mipi_revision; 365*4882a593Smuzhiyun bool wake_capable; 366*4882a593Smuzhiyun bool test_mode_capable; 367*4882a593Smuzhiyun bool clk_stop_mode1; 368*4882a593Smuzhiyun bool simple_clk_stop_capable; 369*4882a593Smuzhiyun u32 clk_stop_timeout; 370*4882a593Smuzhiyun u32 ch_prep_timeout; 371*4882a593Smuzhiyun enum sdw_clk_stop_reset_behave reset_behave; 372*4882a593Smuzhiyun bool high_PHY_capable; 373*4882a593Smuzhiyun bool paging_support; 374*4882a593Smuzhiyun bool bank_delay_support; 375*4882a593Smuzhiyun enum sdw_p15_behave p15_behave; 376*4882a593Smuzhiyun bool lane_control_support; 377*4882a593Smuzhiyun u32 master_count; 378*4882a593Smuzhiyun u32 source_ports; 379*4882a593Smuzhiyun u32 sink_ports; 380*4882a593Smuzhiyun struct sdw_dp0_prop *dp0_prop; 381*4882a593Smuzhiyun struct sdw_dpn_prop *src_dpn_prop; 382*4882a593Smuzhiyun struct sdw_dpn_prop *sink_dpn_prop; 383*4882a593Smuzhiyun u8 scp_int1_mask; 384*4882a593Smuzhiyun u32 quirks; 385*4882a593Smuzhiyun }; 386*4882a593Smuzhiyun 387*4882a593Smuzhiyun #define SDW_SLAVE_QUIRKS_INVALID_INITIAL_PARITY BIT(0) 388*4882a593Smuzhiyun 389*4882a593Smuzhiyun /** 390*4882a593Smuzhiyun * struct sdw_master_prop - Master properties 391*4882a593Smuzhiyun * @revision: MIPI spec version of the implementation 392*4882a593Smuzhiyun * @clk_stop_modes: Bitmap, bit N set when clock-stop-modeN supported 393*4882a593Smuzhiyun * @max_clk_freq: Maximum Bus clock frequency, in Hz 394*4882a593Smuzhiyun * @num_clk_gears: Number of clock gears supported 395*4882a593Smuzhiyun * @clk_gears: Clock gears supported 396*4882a593Smuzhiyun * @num_clk_freq: Number of clock frequencies supported, in Hz 397*4882a593Smuzhiyun * @clk_freq: Clock frequencies supported, in Hz 398*4882a593Smuzhiyun * @default_frame_rate: Controller default Frame rate, in Hz 399*4882a593Smuzhiyun * @default_row: Number of rows 400*4882a593Smuzhiyun * @default_col: Number of columns 401*4882a593Smuzhiyun * @dynamic_frame: Dynamic frame shape supported 402*4882a593Smuzhiyun * @err_threshold: Number of times that software may retry sending a single 403*4882a593Smuzhiyun * command 404*4882a593Smuzhiyun * @mclk_freq: clock reference passed to SoundWire Master, in Hz. 405*4882a593Smuzhiyun * @hw_disabled: if true, the Master is not functional, typically due to pin-mux 406*4882a593Smuzhiyun */ 407*4882a593Smuzhiyun struct sdw_master_prop { 408*4882a593Smuzhiyun u32 revision; 409*4882a593Smuzhiyun u32 clk_stop_modes; 410*4882a593Smuzhiyun u32 max_clk_freq; 411*4882a593Smuzhiyun u32 num_clk_gears; 412*4882a593Smuzhiyun u32 *clk_gears; 413*4882a593Smuzhiyun u32 num_clk_freq; 414*4882a593Smuzhiyun u32 *clk_freq; 415*4882a593Smuzhiyun u32 default_frame_rate; 416*4882a593Smuzhiyun u32 default_row; 417*4882a593Smuzhiyun u32 default_col; 418*4882a593Smuzhiyun bool dynamic_frame; 419*4882a593Smuzhiyun u32 err_threshold; 420*4882a593Smuzhiyun u32 mclk_freq; 421*4882a593Smuzhiyun bool hw_disabled; 422*4882a593Smuzhiyun }; 423*4882a593Smuzhiyun 424*4882a593Smuzhiyun int sdw_master_read_prop(struct sdw_bus *bus); 425*4882a593Smuzhiyun int sdw_slave_read_prop(struct sdw_slave *slave); 426*4882a593Smuzhiyun 427*4882a593Smuzhiyun /* 428*4882a593Smuzhiyun * SDW Slave Structures and APIs 429*4882a593Smuzhiyun */ 430*4882a593Smuzhiyun 431*4882a593Smuzhiyun #define SDW_IGNORED_UNIQUE_ID 0xFF 432*4882a593Smuzhiyun 433*4882a593Smuzhiyun /** 434*4882a593Smuzhiyun * struct sdw_slave_id - Slave ID 435*4882a593Smuzhiyun * @mfg_id: MIPI Manufacturer ID 436*4882a593Smuzhiyun * @part_id: Device Part ID 437*4882a593Smuzhiyun * @class_id: MIPI Class ID (defined starting with SoundWire 1.2 spec) 438*4882a593Smuzhiyun * @unique_id: Device unique ID 439*4882a593Smuzhiyun * @sdw_version: SDW version implemented 440*4882a593Smuzhiyun * 441*4882a593Smuzhiyun * The order of the IDs here does not follow the DisCo spec definitions 442*4882a593Smuzhiyun */ 443*4882a593Smuzhiyun struct sdw_slave_id { 444*4882a593Smuzhiyun __u16 mfg_id; 445*4882a593Smuzhiyun __u16 part_id; 446*4882a593Smuzhiyun __u8 class_id; 447*4882a593Smuzhiyun __u8 unique_id; 448*4882a593Smuzhiyun __u8 sdw_version:4; 449*4882a593Smuzhiyun }; 450*4882a593Smuzhiyun 451*4882a593Smuzhiyun /* 452*4882a593Smuzhiyun * Helper macros to extract the MIPI-defined IDs 453*4882a593Smuzhiyun * 454*4882a593Smuzhiyun * Spec definition 455*4882a593Smuzhiyun * Register Bit Contents 456*4882a593Smuzhiyun * DevId_0 [7:4] 47:44 sdw_version 457*4882a593Smuzhiyun * DevId_0 [3:0] 43:40 unique_id 458*4882a593Smuzhiyun * DevId_1 39:32 mfg_id [15:8] 459*4882a593Smuzhiyun * DevId_2 31:24 mfg_id [7:0] 460*4882a593Smuzhiyun * DevId_3 23:16 part_id [15:8] 461*4882a593Smuzhiyun * DevId_4 15:08 part_id [7:0] 462*4882a593Smuzhiyun * DevId_5 07:00 class_id 463*4882a593Smuzhiyun * 464*4882a593Smuzhiyun * The MIPI DisCo for SoundWire defines in addition the link_id as bits 51:48 465*4882a593Smuzhiyun */ 466*4882a593Smuzhiyun #define SDW_DISCO_LINK_ID_MASK GENMASK_ULL(51, 48) 467*4882a593Smuzhiyun #define SDW_VERSION_MASK GENMASK_ULL(47, 44) 468*4882a593Smuzhiyun #define SDW_UNIQUE_ID_MASK GENMASK_ULL(43, 40) 469*4882a593Smuzhiyun #define SDW_MFG_ID_MASK GENMASK_ULL(39, 24) 470*4882a593Smuzhiyun #define SDW_PART_ID_MASK GENMASK_ULL(23, 8) 471*4882a593Smuzhiyun #define SDW_CLASS_ID_MASK GENMASK_ULL(7, 0) 472*4882a593Smuzhiyun 473*4882a593Smuzhiyun #define SDW_DISCO_LINK_ID(addr) FIELD_GET(SDW_DISCO_LINK_ID_MASK, addr) 474*4882a593Smuzhiyun #define SDW_VERSION(addr) FIELD_GET(SDW_VERSION_MASK, addr) 475*4882a593Smuzhiyun #define SDW_UNIQUE_ID(addr) FIELD_GET(SDW_UNIQUE_ID_MASK, addr) 476*4882a593Smuzhiyun #define SDW_MFG_ID(addr) FIELD_GET(SDW_MFG_ID_MASK, addr) 477*4882a593Smuzhiyun #define SDW_PART_ID(addr) FIELD_GET(SDW_PART_ID_MASK, addr) 478*4882a593Smuzhiyun #define SDW_CLASS_ID(addr) FIELD_GET(SDW_CLASS_ID_MASK, addr) 479*4882a593Smuzhiyun 480*4882a593Smuzhiyun /** 481*4882a593Smuzhiyun * struct sdw_slave_intr_status - Slave interrupt status 482*4882a593Smuzhiyun * @control_port: control port status 483*4882a593Smuzhiyun * @port: data port status 484*4882a593Smuzhiyun */ 485*4882a593Smuzhiyun struct sdw_slave_intr_status { 486*4882a593Smuzhiyun u8 control_port; 487*4882a593Smuzhiyun u8 port[15]; 488*4882a593Smuzhiyun }; 489*4882a593Smuzhiyun 490*4882a593Smuzhiyun /** 491*4882a593Smuzhiyun * sdw_reg_bank - SoundWire register banks 492*4882a593Smuzhiyun * @SDW_BANK0: Soundwire register bank 0 493*4882a593Smuzhiyun * @SDW_BANK1: Soundwire register bank 1 494*4882a593Smuzhiyun */ 495*4882a593Smuzhiyun enum sdw_reg_bank { 496*4882a593Smuzhiyun SDW_BANK0, 497*4882a593Smuzhiyun SDW_BANK1, 498*4882a593Smuzhiyun }; 499*4882a593Smuzhiyun 500*4882a593Smuzhiyun /** 501*4882a593Smuzhiyun * struct sdw_bus_conf: Bus configuration 502*4882a593Smuzhiyun * 503*4882a593Smuzhiyun * @clk_freq: Clock frequency, in Hz 504*4882a593Smuzhiyun * @num_rows: Number of rows in frame 505*4882a593Smuzhiyun * @num_cols: Number of columns in frame 506*4882a593Smuzhiyun * @bank: Next register bank 507*4882a593Smuzhiyun */ 508*4882a593Smuzhiyun struct sdw_bus_conf { 509*4882a593Smuzhiyun unsigned int clk_freq; 510*4882a593Smuzhiyun unsigned int num_rows; 511*4882a593Smuzhiyun unsigned int num_cols; 512*4882a593Smuzhiyun unsigned int bank; 513*4882a593Smuzhiyun }; 514*4882a593Smuzhiyun 515*4882a593Smuzhiyun /** 516*4882a593Smuzhiyun * struct sdw_prepare_ch: Prepare/De-prepare Data Port channel 517*4882a593Smuzhiyun * 518*4882a593Smuzhiyun * @num: Port number 519*4882a593Smuzhiyun * @ch_mask: Active channel mask 520*4882a593Smuzhiyun * @prepare: Prepare (true) /de-prepare (false) channel 521*4882a593Smuzhiyun * @bank: Register bank, which bank Slave/Master driver should program for 522*4882a593Smuzhiyun * implementation defined registers. This is always updated to next_bank 523*4882a593Smuzhiyun * value read from bus params. 524*4882a593Smuzhiyun * 525*4882a593Smuzhiyun */ 526*4882a593Smuzhiyun struct sdw_prepare_ch { 527*4882a593Smuzhiyun unsigned int num; 528*4882a593Smuzhiyun unsigned int ch_mask; 529*4882a593Smuzhiyun bool prepare; 530*4882a593Smuzhiyun unsigned int bank; 531*4882a593Smuzhiyun }; 532*4882a593Smuzhiyun 533*4882a593Smuzhiyun /** 534*4882a593Smuzhiyun * enum sdw_port_prep_ops: Prepare operations for Data Port 535*4882a593Smuzhiyun * 536*4882a593Smuzhiyun * @SDW_OPS_PORT_PRE_PREP: Pre prepare operation for the Port 537*4882a593Smuzhiyun * @SDW_OPS_PORT_PREP: Prepare operation for the Port 538*4882a593Smuzhiyun * @SDW_OPS_PORT_POST_PREP: Post prepare operation for the Port 539*4882a593Smuzhiyun */ 540*4882a593Smuzhiyun enum sdw_port_prep_ops { 541*4882a593Smuzhiyun SDW_OPS_PORT_PRE_PREP = 0, 542*4882a593Smuzhiyun SDW_OPS_PORT_PREP = 1, 543*4882a593Smuzhiyun SDW_OPS_PORT_POST_PREP = 2, 544*4882a593Smuzhiyun }; 545*4882a593Smuzhiyun 546*4882a593Smuzhiyun /** 547*4882a593Smuzhiyun * struct sdw_bus_params: Structure holding bus configuration 548*4882a593Smuzhiyun * 549*4882a593Smuzhiyun * @curr_bank: Current bank in use (BANK0/BANK1) 550*4882a593Smuzhiyun * @next_bank: Next bank to use (BANK0/BANK1). next_bank will always be 551*4882a593Smuzhiyun * set to !curr_bank 552*4882a593Smuzhiyun * @max_dr_freq: Maximum double rate clock frequency supported, in Hz 553*4882a593Smuzhiyun * @curr_dr_freq: Current double rate clock frequency, in Hz 554*4882a593Smuzhiyun * @bandwidth: Current bandwidth 555*4882a593Smuzhiyun * @col: Active columns 556*4882a593Smuzhiyun * @row: Active rows 557*4882a593Smuzhiyun * @s_data_mode: NORMAL, STATIC or PRBS mode for all Slave ports 558*4882a593Smuzhiyun * @m_data_mode: NORMAL, STATIC or PRBS mode for all Master ports. The value 559*4882a593Smuzhiyun * should be the same to detect transmission issues, but can be different to 560*4882a593Smuzhiyun * test the interrupt reports 561*4882a593Smuzhiyun */ 562*4882a593Smuzhiyun struct sdw_bus_params { 563*4882a593Smuzhiyun enum sdw_reg_bank curr_bank; 564*4882a593Smuzhiyun enum sdw_reg_bank next_bank; 565*4882a593Smuzhiyun unsigned int max_dr_freq; 566*4882a593Smuzhiyun unsigned int curr_dr_freq; 567*4882a593Smuzhiyun unsigned int bandwidth; 568*4882a593Smuzhiyun unsigned int col; 569*4882a593Smuzhiyun unsigned int row; 570*4882a593Smuzhiyun int s_data_mode; 571*4882a593Smuzhiyun int m_data_mode; 572*4882a593Smuzhiyun }; 573*4882a593Smuzhiyun 574*4882a593Smuzhiyun /** 575*4882a593Smuzhiyun * struct sdw_slave_ops: Slave driver callback ops 576*4882a593Smuzhiyun * 577*4882a593Smuzhiyun * @read_prop: Read Slave properties 578*4882a593Smuzhiyun * @interrupt_callback: Device interrupt notification (invoked in thread 579*4882a593Smuzhiyun * context) 580*4882a593Smuzhiyun * @update_status: Update Slave status 581*4882a593Smuzhiyun * @bus_config: Update the bus config for Slave 582*4882a593Smuzhiyun * @port_prep: Prepare the port with parameters 583*4882a593Smuzhiyun */ 584*4882a593Smuzhiyun struct sdw_slave_ops { 585*4882a593Smuzhiyun int (*read_prop)(struct sdw_slave *sdw); 586*4882a593Smuzhiyun int (*interrupt_callback)(struct sdw_slave *slave, 587*4882a593Smuzhiyun struct sdw_slave_intr_status *status); 588*4882a593Smuzhiyun int (*update_status)(struct sdw_slave *slave, 589*4882a593Smuzhiyun enum sdw_slave_status status); 590*4882a593Smuzhiyun int (*bus_config)(struct sdw_slave *slave, 591*4882a593Smuzhiyun struct sdw_bus_params *params); 592*4882a593Smuzhiyun int (*port_prep)(struct sdw_slave *slave, 593*4882a593Smuzhiyun struct sdw_prepare_ch *prepare_ch, 594*4882a593Smuzhiyun enum sdw_port_prep_ops pre_ops); 595*4882a593Smuzhiyun int (*get_clk_stop_mode)(struct sdw_slave *slave); 596*4882a593Smuzhiyun int (*clk_stop)(struct sdw_slave *slave, 597*4882a593Smuzhiyun enum sdw_clk_stop_mode mode, 598*4882a593Smuzhiyun enum sdw_clk_stop_type type); 599*4882a593Smuzhiyun 600*4882a593Smuzhiyun }; 601*4882a593Smuzhiyun 602*4882a593Smuzhiyun /** 603*4882a593Smuzhiyun * struct sdw_slave - SoundWire Slave 604*4882a593Smuzhiyun * @id: MIPI device ID 605*4882a593Smuzhiyun * @dev: Linux device 606*4882a593Smuzhiyun * @status: Status reported by the Slave 607*4882a593Smuzhiyun * @bus: Bus handle 608*4882a593Smuzhiyun * @ops: Slave callback ops 609*4882a593Smuzhiyun * @prop: Slave properties 610*4882a593Smuzhiyun * @debugfs: Slave debugfs 611*4882a593Smuzhiyun * @node: node for bus list 612*4882a593Smuzhiyun * @port_ready: Port ready completion flag for each Slave port 613*4882a593Smuzhiyun * @dev_num: Current Device Number, values can be 0 or dev_num_sticky 614*4882a593Smuzhiyun * @dev_num_sticky: one-time static Device Number assigned by Bus 615*4882a593Smuzhiyun * @probed: boolean tracking driver state 616*4882a593Smuzhiyun * @probe_complete: completion utility to control potential races 617*4882a593Smuzhiyun * on startup between driver probe/initialization and SoundWire 618*4882a593Smuzhiyun * Slave state changes/implementation-defined interrupts 619*4882a593Smuzhiyun * @enumeration_complete: completion utility to control potential races 620*4882a593Smuzhiyun * on startup between device enumeration and read/write access to the 621*4882a593Smuzhiyun * Slave device 622*4882a593Smuzhiyun * @initialization_complete: completion utility to control potential races 623*4882a593Smuzhiyun * on startup between device enumeration and settings being restored 624*4882a593Smuzhiyun * @unattach_request: mask field to keep track why the Slave re-attached and 625*4882a593Smuzhiyun * was re-initialized. This is useful to deal with potential race conditions 626*4882a593Smuzhiyun * between the Master suspending and the codec resuming, and make sure that 627*4882a593Smuzhiyun * when the Master triggered a reset the Slave is properly enumerated and 628*4882a593Smuzhiyun * initialized 629*4882a593Smuzhiyun * @first_interrupt_done: status flag tracking if the interrupt handling 630*4882a593Smuzhiyun * for a Slave happens for the first time after enumeration 631*4882a593Smuzhiyun */ 632*4882a593Smuzhiyun struct sdw_slave { 633*4882a593Smuzhiyun struct sdw_slave_id id; 634*4882a593Smuzhiyun struct device dev; 635*4882a593Smuzhiyun enum sdw_slave_status status; 636*4882a593Smuzhiyun struct sdw_bus *bus; 637*4882a593Smuzhiyun const struct sdw_slave_ops *ops; 638*4882a593Smuzhiyun struct sdw_slave_prop prop; 639*4882a593Smuzhiyun #ifdef CONFIG_DEBUG_FS 640*4882a593Smuzhiyun struct dentry *debugfs; 641*4882a593Smuzhiyun #endif 642*4882a593Smuzhiyun struct list_head node; 643*4882a593Smuzhiyun struct completion port_ready[SDW_MAX_PORTS]; 644*4882a593Smuzhiyun enum sdw_clk_stop_mode curr_clk_stop_mode; 645*4882a593Smuzhiyun u16 dev_num; 646*4882a593Smuzhiyun u16 dev_num_sticky; 647*4882a593Smuzhiyun bool probed; 648*4882a593Smuzhiyun struct completion probe_complete; 649*4882a593Smuzhiyun struct completion enumeration_complete; 650*4882a593Smuzhiyun struct completion initialization_complete; 651*4882a593Smuzhiyun u32 unattach_request; 652*4882a593Smuzhiyun bool first_interrupt_done; 653*4882a593Smuzhiyun }; 654*4882a593Smuzhiyun 655*4882a593Smuzhiyun #define dev_to_sdw_dev(_dev) container_of(_dev, struct sdw_slave, dev) 656*4882a593Smuzhiyun 657*4882a593Smuzhiyun /** 658*4882a593Smuzhiyun * struct sdw_master_device - SoundWire 'Master Device' representation 659*4882a593Smuzhiyun * @dev: Linux device for this Master 660*4882a593Smuzhiyun * @bus: Bus handle shortcut 661*4882a593Smuzhiyun */ 662*4882a593Smuzhiyun struct sdw_master_device { 663*4882a593Smuzhiyun struct device dev; 664*4882a593Smuzhiyun struct sdw_bus *bus; 665*4882a593Smuzhiyun }; 666*4882a593Smuzhiyun 667*4882a593Smuzhiyun #define dev_to_sdw_master_device(d) \ 668*4882a593Smuzhiyun container_of(d, struct sdw_master_device, dev) 669*4882a593Smuzhiyun 670*4882a593Smuzhiyun struct sdw_driver { 671*4882a593Smuzhiyun const char *name; 672*4882a593Smuzhiyun 673*4882a593Smuzhiyun int (*probe)(struct sdw_slave *sdw, 674*4882a593Smuzhiyun const struct sdw_device_id *id); 675*4882a593Smuzhiyun int (*remove)(struct sdw_slave *sdw); 676*4882a593Smuzhiyun void (*shutdown)(struct sdw_slave *sdw); 677*4882a593Smuzhiyun 678*4882a593Smuzhiyun const struct sdw_device_id *id_table; 679*4882a593Smuzhiyun const struct sdw_slave_ops *ops; 680*4882a593Smuzhiyun 681*4882a593Smuzhiyun struct device_driver driver; 682*4882a593Smuzhiyun }; 683*4882a593Smuzhiyun 684*4882a593Smuzhiyun #define SDW_SLAVE_ENTRY_EXT(_mfg_id, _part_id, _version, _c_id, _drv_data) \ 685*4882a593Smuzhiyun { .mfg_id = (_mfg_id), .part_id = (_part_id), \ 686*4882a593Smuzhiyun .sdw_version = (_version), .class_id = (_c_id), \ 687*4882a593Smuzhiyun .driver_data = (unsigned long)(_drv_data) } 688*4882a593Smuzhiyun 689*4882a593Smuzhiyun #define SDW_SLAVE_ENTRY(_mfg_id, _part_id, _drv_data) \ 690*4882a593Smuzhiyun SDW_SLAVE_ENTRY_EXT((_mfg_id), (_part_id), 0, 0, (_drv_data)) 691*4882a593Smuzhiyun 692*4882a593Smuzhiyun int sdw_handle_slave_status(struct sdw_bus *bus, 693*4882a593Smuzhiyun enum sdw_slave_status status[]); 694*4882a593Smuzhiyun 695*4882a593Smuzhiyun /* 696*4882a593Smuzhiyun * SDW master structures and APIs 697*4882a593Smuzhiyun */ 698*4882a593Smuzhiyun 699*4882a593Smuzhiyun /** 700*4882a593Smuzhiyun * struct sdw_port_params: Data Port parameters 701*4882a593Smuzhiyun * 702*4882a593Smuzhiyun * @num: Port number 703*4882a593Smuzhiyun * @bps: Word length of the Port 704*4882a593Smuzhiyun * @flow_mode: Port Data flow mode 705*4882a593Smuzhiyun * @data_mode: Test modes or normal mode 706*4882a593Smuzhiyun * 707*4882a593Smuzhiyun * This is used to program the Data Port based on Data Port stream 708*4882a593Smuzhiyun * parameters. 709*4882a593Smuzhiyun */ 710*4882a593Smuzhiyun struct sdw_port_params { 711*4882a593Smuzhiyun unsigned int num; 712*4882a593Smuzhiyun unsigned int bps; 713*4882a593Smuzhiyun unsigned int flow_mode; 714*4882a593Smuzhiyun unsigned int data_mode; 715*4882a593Smuzhiyun }; 716*4882a593Smuzhiyun 717*4882a593Smuzhiyun /** 718*4882a593Smuzhiyun * struct sdw_transport_params: Data Port Transport Parameters 719*4882a593Smuzhiyun * 720*4882a593Smuzhiyun * @blk_grp_ctrl_valid: Port implements block group control 721*4882a593Smuzhiyun * @num: Port number 722*4882a593Smuzhiyun * @blk_grp_ctrl: Block group control value 723*4882a593Smuzhiyun * @sample_interval: Sample interval 724*4882a593Smuzhiyun * @offset1: Blockoffset of the payload data 725*4882a593Smuzhiyun * @offset2: Blockoffset of the payload data 726*4882a593Smuzhiyun * @hstart: Horizontal start of the payload data 727*4882a593Smuzhiyun * @hstop: Horizontal stop of the payload data 728*4882a593Smuzhiyun * @blk_pkg_mode: Block per channel or block per port 729*4882a593Smuzhiyun * @lane_ctrl: Data lane Port uses for Data transfer. Currently only single 730*4882a593Smuzhiyun * data lane is supported in bus 731*4882a593Smuzhiyun * 732*4882a593Smuzhiyun * This is used to program the Data Port based on Data Port transport 733*4882a593Smuzhiyun * parameters. All these parameters are banked and can be modified 734*4882a593Smuzhiyun * during a bank switch without any artifacts in audio stream. 735*4882a593Smuzhiyun */ 736*4882a593Smuzhiyun struct sdw_transport_params { 737*4882a593Smuzhiyun bool blk_grp_ctrl_valid; 738*4882a593Smuzhiyun unsigned int port_num; 739*4882a593Smuzhiyun unsigned int blk_grp_ctrl; 740*4882a593Smuzhiyun unsigned int sample_interval; 741*4882a593Smuzhiyun unsigned int offset1; 742*4882a593Smuzhiyun unsigned int offset2; 743*4882a593Smuzhiyun unsigned int hstart; 744*4882a593Smuzhiyun unsigned int hstop; 745*4882a593Smuzhiyun unsigned int blk_pkg_mode; 746*4882a593Smuzhiyun unsigned int lane_ctrl; 747*4882a593Smuzhiyun }; 748*4882a593Smuzhiyun 749*4882a593Smuzhiyun /** 750*4882a593Smuzhiyun * struct sdw_enable_ch: Enable/disable Data Port channel 751*4882a593Smuzhiyun * 752*4882a593Smuzhiyun * @num: Port number 753*4882a593Smuzhiyun * @ch_mask: Active channel mask 754*4882a593Smuzhiyun * @enable: Enable (true) /disable (false) channel 755*4882a593Smuzhiyun */ 756*4882a593Smuzhiyun struct sdw_enable_ch { 757*4882a593Smuzhiyun unsigned int port_num; 758*4882a593Smuzhiyun unsigned int ch_mask; 759*4882a593Smuzhiyun bool enable; 760*4882a593Smuzhiyun }; 761*4882a593Smuzhiyun 762*4882a593Smuzhiyun /** 763*4882a593Smuzhiyun * struct sdw_master_port_ops: Callback functions from bus to Master 764*4882a593Smuzhiyun * driver to set Master Data ports. 765*4882a593Smuzhiyun * 766*4882a593Smuzhiyun * @dpn_set_port_params: Set the Port parameters for the Master Port. 767*4882a593Smuzhiyun * Mandatory callback 768*4882a593Smuzhiyun * @dpn_set_port_transport_params: Set transport parameters for the Master 769*4882a593Smuzhiyun * Port. Mandatory callback 770*4882a593Smuzhiyun * @dpn_port_prep: Port prepare operations for the Master Data Port. 771*4882a593Smuzhiyun * @dpn_port_enable_ch: Enable the channels of Master Port. 772*4882a593Smuzhiyun */ 773*4882a593Smuzhiyun struct sdw_master_port_ops { 774*4882a593Smuzhiyun int (*dpn_set_port_params)(struct sdw_bus *bus, 775*4882a593Smuzhiyun struct sdw_port_params *port_params, 776*4882a593Smuzhiyun unsigned int bank); 777*4882a593Smuzhiyun int (*dpn_set_port_transport_params)(struct sdw_bus *bus, 778*4882a593Smuzhiyun struct sdw_transport_params *transport_params, 779*4882a593Smuzhiyun enum sdw_reg_bank bank); 780*4882a593Smuzhiyun int (*dpn_port_prep)(struct sdw_bus *bus, 781*4882a593Smuzhiyun struct sdw_prepare_ch *prepare_ch); 782*4882a593Smuzhiyun int (*dpn_port_enable_ch)(struct sdw_bus *bus, 783*4882a593Smuzhiyun struct sdw_enable_ch *enable_ch, unsigned int bank); 784*4882a593Smuzhiyun }; 785*4882a593Smuzhiyun 786*4882a593Smuzhiyun struct sdw_msg; 787*4882a593Smuzhiyun 788*4882a593Smuzhiyun /** 789*4882a593Smuzhiyun * struct sdw_defer - SDW deffered message 790*4882a593Smuzhiyun * @length: message length 791*4882a593Smuzhiyun * @complete: message completion 792*4882a593Smuzhiyun * @msg: SDW message 793*4882a593Smuzhiyun */ 794*4882a593Smuzhiyun struct sdw_defer { 795*4882a593Smuzhiyun int length; 796*4882a593Smuzhiyun struct completion complete; 797*4882a593Smuzhiyun struct sdw_msg *msg; 798*4882a593Smuzhiyun }; 799*4882a593Smuzhiyun 800*4882a593Smuzhiyun /** 801*4882a593Smuzhiyun * struct sdw_master_ops - Master driver ops 802*4882a593Smuzhiyun * @read_prop: Read Master properties 803*4882a593Smuzhiyun * @xfer_msg: Transfer message callback 804*4882a593Smuzhiyun * @xfer_msg_defer: Defer version of transfer message callback 805*4882a593Smuzhiyun * @reset_page_addr: Reset the SCP page address registers 806*4882a593Smuzhiyun * @set_bus_conf: Set the bus configuration 807*4882a593Smuzhiyun * @pre_bank_switch: Callback for pre bank switch 808*4882a593Smuzhiyun * @post_bank_switch: Callback for post bank switch 809*4882a593Smuzhiyun */ 810*4882a593Smuzhiyun struct sdw_master_ops { 811*4882a593Smuzhiyun int (*read_prop)(struct sdw_bus *bus); 812*4882a593Smuzhiyun 813*4882a593Smuzhiyun enum sdw_command_response (*xfer_msg) 814*4882a593Smuzhiyun (struct sdw_bus *bus, struct sdw_msg *msg); 815*4882a593Smuzhiyun enum sdw_command_response (*xfer_msg_defer) 816*4882a593Smuzhiyun (struct sdw_bus *bus, struct sdw_msg *msg, 817*4882a593Smuzhiyun struct sdw_defer *defer); 818*4882a593Smuzhiyun enum sdw_command_response (*reset_page_addr) 819*4882a593Smuzhiyun (struct sdw_bus *bus, unsigned int dev_num); 820*4882a593Smuzhiyun int (*set_bus_conf)(struct sdw_bus *bus, 821*4882a593Smuzhiyun struct sdw_bus_params *params); 822*4882a593Smuzhiyun int (*pre_bank_switch)(struct sdw_bus *bus); 823*4882a593Smuzhiyun int (*post_bank_switch)(struct sdw_bus *bus); 824*4882a593Smuzhiyun 825*4882a593Smuzhiyun }; 826*4882a593Smuzhiyun 827*4882a593Smuzhiyun /** 828*4882a593Smuzhiyun * struct sdw_bus - SoundWire bus 829*4882a593Smuzhiyun * @dev: Shortcut to &bus->md->dev to avoid changing the entire code. 830*4882a593Smuzhiyun * @md: Master device 831*4882a593Smuzhiyun * @link_id: Link id number, can be 0 to N, unique for each Master 832*4882a593Smuzhiyun * @id: bus system-wide unique id 833*4882a593Smuzhiyun * @slaves: list of Slaves on this bus 834*4882a593Smuzhiyun * @assigned: Bitmap for Slave device numbers. 835*4882a593Smuzhiyun * Bit set implies used number, bit clear implies unused number. 836*4882a593Smuzhiyun * @bus_lock: bus lock 837*4882a593Smuzhiyun * @msg_lock: message lock 838*4882a593Smuzhiyun * @compute_params: points to Bus resource management implementation 839*4882a593Smuzhiyun * @ops: Master callback ops 840*4882a593Smuzhiyun * @port_ops: Master port callback ops 841*4882a593Smuzhiyun * @params: Current bus parameters 842*4882a593Smuzhiyun * @prop: Master properties 843*4882a593Smuzhiyun * @m_rt_list: List of Master instance of all stream(s) running on Bus. This 844*4882a593Smuzhiyun * is used to compute and program bus bandwidth, clock, frame shape, 845*4882a593Smuzhiyun * transport and port parameters 846*4882a593Smuzhiyun * @debugfs: Bus debugfs 847*4882a593Smuzhiyun * @defer_msg: Defer message 848*4882a593Smuzhiyun * @clk_stop_timeout: Clock stop timeout computed 849*4882a593Smuzhiyun * @bank_switch_timeout: Bank switch timeout computed 850*4882a593Smuzhiyun * @multi_link: Store bus property that indicates if multi links 851*4882a593Smuzhiyun * are supported. This flag is populated by drivers after reading 852*4882a593Smuzhiyun * appropriate firmware (ACPI/DT). 853*4882a593Smuzhiyun * @hw_sync_min_links: Number of links used by a stream above which 854*4882a593Smuzhiyun * hardware-based synchronization is required. This value is only 855*4882a593Smuzhiyun * meaningful if multi_link is set. If set to 1, hardware-based 856*4882a593Smuzhiyun * synchronization will be used even if a stream only uses a single 857*4882a593Smuzhiyun * SoundWire segment. 858*4882a593Smuzhiyun */ 859*4882a593Smuzhiyun struct sdw_bus { 860*4882a593Smuzhiyun struct device *dev; 861*4882a593Smuzhiyun struct sdw_master_device *md; 862*4882a593Smuzhiyun unsigned int link_id; 863*4882a593Smuzhiyun int id; 864*4882a593Smuzhiyun struct list_head slaves; 865*4882a593Smuzhiyun DECLARE_BITMAP(assigned, SDW_MAX_DEVICES); 866*4882a593Smuzhiyun struct mutex bus_lock; 867*4882a593Smuzhiyun struct mutex msg_lock; 868*4882a593Smuzhiyun int (*compute_params)(struct sdw_bus *bus); 869*4882a593Smuzhiyun const struct sdw_master_ops *ops; 870*4882a593Smuzhiyun const struct sdw_master_port_ops *port_ops; 871*4882a593Smuzhiyun struct sdw_bus_params params; 872*4882a593Smuzhiyun struct sdw_master_prop prop; 873*4882a593Smuzhiyun struct list_head m_rt_list; 874*4882a593Smuzhiyun #ifdef CONFIG_DEBUG_FS 875*4882a593Smuzhiyun struct dentry *debugfs; 876*4882a593Smuzhiyun #endif 877*4882a593Smuzhiyun struct sdw_defer defer_msg; 878*4882a593Smuzhiyun unsigned int clk_stop_timeout; 879*4882a593Smuzhiyun u32 bank_switch_timeout; 880*4882a593Smuzhiyun bool multi_link; 881*4882a593Smuzhiyun int hw_sync_min_links; 882*4882a593Smuzhiyun }; 883*4882a593Smuzhiyun 884*4882a593Smuzhiyun int sdw_bus_master_add(struct sdw_bus *bus, struct device *parent, 885*4882a593Smuzhiyun struct fwnode_handle *fwnode); 886*4882a593Smuzhiyun void sdw_bus_master_delete(struct sdw_bus *bus); 887*4882a593Smuzhiyun 888*4882a593Smuzhiyun /** 889*4882a593Smuzhiyun * sdw_port_config: Master or Slave Port configuration 890*4882a593Smuzhiyun * 891*4882a593Smuzhiyun * @num: Port number 892*4882a593Smuzhiyun * @ch_mask: channels mask for port 893*4882a593Smuzhiyun */ 894*4882a593Smuzhiyun struct sdw_port_config { 895*4882a593Smuzhiyun unsigned int num; 896*4882a593Smuzhiyun unsigned int ch_mask; 897*4882a593Smuzhiyun }; 898*4882a593Smuzhiyun 899*4882a593Smuzhiyun /** 900*4882a593Smuzhiyun * sdw_stream_config: Master or Slave stream configuration 901*4882a593Smuzhiyun * 902*4882a593Smuzhiyun * @frame_rate: Audio frame rate of the stream, in Hz 903*4882a593Smuzhiyun * @ch_count: Channel count of the stream 904*4882a593Smuzhiyun * @bps: Number of bits per audio sample 905*4882a593Smuzhiyun * @direction: Data direction 906*4882a593Smuzhiyun * @type: Stream type PCM or PDM 907*4882a593Smuzhiyun */ 908*4882a593Smuzhiyun struct sdw_stream_config { 909*4882a593Smuzhiyun unsigned int frame_rate; 910*4882a593Smuzhiyun unsigned int ch_count; 911*4882a593Smuzhiyun unsigned int bps; 912*4882a593Smuzhiyun enum sdw_data_direction direction; 913*4882a593Smuzhiyun enum sdw_stream_type type; 914*4882a593Smuzhiyun }; 915*4882a593Smuzhiyun 916*4882a593Smuzhiyun /** 917*4882a593Smuzhiyun * sdw_stream_state: Stream states 918*4882a593Smuzhiyun * 919*4882a593Smuzhiyun * @SDW_STREAM_ALLOCATED: New stream allocated. 920*4882a593Smuzhiyun * @SDW_STREAM_CONFIGURED: Stream configured 921*4882a593Smuzhiyun * @SDW_STREAM_PREPARED: Stream prepared 922*4882a593Smuzhiyun * @SDW_STREAM_ENABLED: Stream enabled 923*4882a593Smuzhiyun * @SDW_STREAM_DISABLED: Stream disabled 924*4882a593Smuzhiyun * @SDW_STREAM_DEPREPARED: Stream de-prepared 925*4882a593Smuzhiyun * @SDW_STREAM_RELEASED: Stream released 926*4882a593Smuzhiyun */ 927*4882a593Smuzhiyun enum sdw_stream_state { 928*4882a593Smuzhiyun SDW_STREAM_ALLOCATED = 0, 929*4882a593Smuzhiyun SDW_STREAM_CONFIGURED = 1, 930*4882a593Smuzhiyun SDW_STREAM_PREPARED = 2, 931*4882a593Smuzhiyun SDW_STREAM_ENABLED = 3, 932*4882a593Smuzhiyun SDW_STREAM_DISABLED = 4, 933*4882a593Smuzhiyun SDW_STREAM_DEPREPARED = 5, 934*4882a593Smuzhiyun SDW_STREAM_RELEASED = 6, 935*4882a593Smuzhiyun }; 936*4882a593Smuzhiyun 937*4882a593Smuzhiyun /** 938*4882a593Smuzhiyun * sdw_stream_params: Stream parameters 939*4882a593Smuzhiyun * 940*4882a593Smuzhiyun * @rate: Sampling frequency, in Hz 941*4882a593Smuzhiyun * @ch_count: Number of channels 942*4882a593Smuzhiyun * @bps: bits per channel sample 943*4882a593Smuzhiyun */ 944*4882a593Smuzhiyun struct sdw_stream_params { 945*4882a593Smuzhiyun unsigned int rate; 946*4882a593Smuzhiyun unsigned int ch_count; 947*4882a593Smuzhiyun unsigned int bps; 948*4882a593Smuzhiyun }; 949*4882a593Smuzhiyun 950*4882a593Smuzhiyun /** 951*4882a593Smuzhiyun * sdw_stream_runtime: Runtime stream parameters 952*4882a593Smuzhiyun * 953*4882a593Smuzhiyun * @name: SoundWire stream name 954*4882a593Smuzhiyun * @params: Stream parameters 955*4882a593Smuzhiyun * @state: Current state of the stream 956*4882a593Smuzhiyun * @type: Stream type PCM or PDM 957*4882a593Smuzhiyun * @master_list: List of Master runtime(s) in this stream. 958*4882a593Smuzhiyun * master_list can contain only one m_rt per Master instance 959*4882a593Smuzhiyun * for a stream 960*4882a593Smuzhiyun * @m_rt_count: Count of Master runtime(s) in this stream 961*4882a593Smuzhiyun */ 962*4882a593Smuzhiyun struct sdw_stream_runtime { 963*4882a593Smuzhiyun const char *name; 964*4882a593Smuzhiyun struct sdw_stream_params params; 965*4882a593Smuzhiyun enum sdw_stream_state state; 966*4882a593Smuzhiyun enum sdw_stream_type type; 967*4882a593Smuzhiyun struct list_head master_list; 968*4882a593Smuzhiyun int m_rt_count; 969*4882a593Smuzhiyun }; 970*4882a593Smuzhiyun 971*4882a593Smuzhiyun struct sdw_stream_runtime *sdw_alloc_stream(const char *stream_name); 972*4882a593Smuzhiyun void sdw_release_stream(struct sdw_stream_runtime *stream); 973*4882a593Smuzhiyun 974*4882a593Smuzhiyun int sdw_compute_params(struct sdw_bus *bus); 975*4882a593Smuzhiyun 976*4882a593Smuzhiyun int sdw_stream_add_master(struct sdw_bus *bus, 977*4882a593Smuzhiyun struct sdw_stream_config *stream_config, 978*4882a593Smuzhiyun struct sdw_port_config *port_config, 979*4882a593Smuzhiyun unsigned int num_ports, 980*4882a593Smuzhiyun struct sdw_stream_runtime *stream); 981*4882a593Smuzhiyun int sdw_stream_add_slave(struct sdw_slave *slave, 982*4882a593Smuzhiyun struct sdw_stream_config *stream_config, 983*4882a593Smuzhiyun struct sdw_port_config *port_config, 984*4882a593Smuzhiyun unsigned int num_ports, 985*4882a593Smuzhiyun struct sdw_stream_runtime *stream); 986*4882a593Smuzhiyun int sdw_stream_remove_master(struct sdw_bus *bus, 987*4882a593Smuzhiyun struct sdw_stream_runtime *stream); 988*4882a593Smuzhiyun int sdw_stream_remove_slave(struct sdw_slave *slave, 989*4882a593Smuzhiyun struct sdw_stream_runtime *stream); 990*4882a593Smuzhiyun int sdw_startup_stream(void *sdw_substream); 991*4882a593Smuzhiyun int sdw_prepare_stream(struct sdw_stream_runtime *stream); 992*4882a593Smuzhiyun int sdw_enable_stream(struct sdw_stream_runtime *stream); 993*4882a593Smuzhiyun int sdw_disable_stream(struct sdw_stream_runtime *stream); 994*4882a593Smuzhiyun int sdw_deprepare_stream(struct sdw_stream_runtime *stream); 995*4882a593Smuzhiyun void sdw_shutdown_stream(void *sdw_substream); 996*4882a593Smuzhiyun int sdw_bus_prep_clk_stop(struct sdw_bus *bus); 997*4882a593Smuzhiyun int sdw_bus_clk_stop(struct sdw_bus *bus); 998*4882a593Smuzhiyun int sdw_bus_exit_clk_stop(struct sdw_bus *bus); 999*4882a593Smuzhiyun 1000*4882a593Smuzhiyun /* messaging and data APIs */ 1001*4882a593Smuzhiyun 1002*4882a593Smuzhiyun int sdw_read(struct sdw_slave *slave, u32 addr); 1003*4882a593Smuzhiyun int sdw_write(struct sdw_slave *slave, u32 addr, u8 value); 1004*4882a593Smuzhiyun int sdw_write_no_pm(struct sdw_slave *slave, u32 addr, u8 value); 1005*4882a593Smuzhiyun int sdw_read_no_pm(struct sdw_slave *slave, u32 addr); 1006*4882a593Smuzhiyun int sdw_nread(struct sdw_slave *slave, u32 addr, size_t count, u8 *val); 1007*4882a593Smuzhiyun int sdw_nwrite(struct sdw_slave *slave, u32 addr, size_t count, u8 *val); 1008*4882a593Smuzhiyun 1009*4882a593Smuzhiyun #endif /* __SOUNDWIRE_H */ 1010