xref: /OK3568_Linux_fs/kernel/include/linux/soundwire/sdw.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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