Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit abb9c9b

Browse files
Srinivas-Kandagatlagregkh
authored andcommitted
slimbus: stream: add stream support
This patch adds support to SLIMbus stream apis for slimbus device. SLIMbus streaming involves adding support to Data Channel Management and channel Reconfiguration Messages to slim core plus few stream apis. >From slim device side the apis are very simple mostly inline with other stream apis. Currently it only supports Isochronous and Push/Pull transport protocols, which are sufficient for audio use cases. Signed-off-by: Srinivas Kandagatla <[email protected]> Signed-off-by: Greg Kroah-Hartman <[email protected]>
1 parent 917809e commit abb9c9b

File tree

6 files changed

+720
-1
lines changed

6 files changed

+720
-1
lines changed

Documentation/driver-api/slimbus.rst

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,3 +125,8 @@ Messaging APIs:
125125
~~~~~~~~~~~~~~~
126126
.. kernel-doc:: drivers/slimbus/messaging.c
127127
:export:
128+
129+
Streaming APIs:
130+
~~~~~~~~~~~~~~~
131+
.. kernel-doc:: drivers/slimbus/stream.c
132+
:export:

drivers/slimbus/Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
# Makefile for kernel SLIMbus framework.
44
#
55
obj-$(CONFIG_SLIMBUS) += slimbus.o
6-
slimbus-y := core.o messaging.o sched.o
6+
slimbus-y := core.o messaging.o sched.o stream.o
77

88
#Controllers
99
obj-$(CONFIG_SLIM_QCOM_CTRL) += slim-qcom-ctrl.o

drivers/slimbus/core.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,8 @@ static int slim_add_device(struct slim_controller *ctrl,
114114
sbdev->dev.release = slim_dev_release;
115115
sbdev->dev.driver = NULL;
116116
sbdev->ctrl = ctrl;
117+
INIT_LIST_HEAD(&sbdev->stream_list);
118+
spin_lock_init(&sbdev->stream_list_lock);
117119

118120
if (node)
119121
sbdev->dev.of_node = of_node_get(node);

drivers/slimbus/slimbus.h

Lines changed: 189 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,20 @@
4545
#define SLIM_MSG_MC_ASSIGN_LOGICAL_ADDRESS 0x2
4646
#define SLIM_MSG_MC_REPORT_ABSENT 0xF
4747

48+
/* Data channel management messages */
49+
#define SLIM_MSG_MC_CONNECT_SOURCE 0x10
50+
#define SLIM_MSG_MC_CONNECT_SINK 0x11
51+
#define SLIM_MSG_MC_DISCONNECT_PORT 0x14
52+
#define SLIM_MSG_MC_CHANGE_CONTENT 0x18
53+
4854
/* Clock pause Reconfiguration messages */
4955
#define SLIM_MSG_MC_BEGIN_RECONFIGURATION 0x40
5056
#define SLIM_MSG_MC_NEXT_PAUSE_CLOCK 0x4A
57+
#define SLIM_MSG_MC_NEXT_DEFINE_CHANNEL 0x50
58+
#define SLIM_MSG_MC_NEXT_DEFINE_CONTENT 0x51
59+
#define SLIM_MSG_MC_NEXT_ACTIVATE_CHANNEL 0x54
60+
#define SLIM_MSG_MC_NEXT_DEACTIVATE_CHANNEL 0x55
61+
#define SLIM_MSG_MC_NEXT_REMOVE_CHANNEL 0x58
5162
#define SLIM_MSG_MC_RECONFIGURE_NOW 0x5F
5263

5364
/*
@@ -69,7 +80,15 @@
6980
/* Standard values per SLIMbus spec needed by controllers and devices */
7081
#define SLIM_MAX_CLK_GEAR 10
7182
#define SLIM_MIN_CLK_GEAR 1
83+
#define SLIM_SLOT_LEN_BITS 4
84+
85+
/* Indicate that the frequency of the flow and the bus frequency are locked */
86+
#define SLIM_CHANNEL_CONTENT_FL BIT(7)
7287

88+
/* Standard values per SLIMbus spec needed by controllers and devices */
89+
#define SLIM_CL_PER_SUPERFRAME 6144
90+
#define SLIM_SLOTS_PER_SUPERFRAME (SLIM_CL_PER_SUPERFRAME >> 2)
91+
#define SLIM_SL_PER_SUPERFRAME (SLIM_CL_PER_SUPERFRAME >> 2)
7392
/* Manager's logical address is set to 0xFF per spec */
7493
#define SLIM_LA_MANAGER 0xFF
7594

@@ -167,6 +186,170 @@ struct slim_sched {
167186
struct mutex m_reconf;
168187
};
169188

189+
/**
190+
* enum slim_port_direction: SLIMbus port direction
191+
*
192+
* @SLIM_PORT_SINK: SLIMbus port is a sink
193+
* @SLIM_PORT_SOURCE: SLIMbus port is a source
194+
*/
195+
enum slim_port_direction {
196+
SLIM_PORT_SINK = 0,
197+
SLIM_PORT_SOURCE,
198+
};
199+
/**
200+
* enum slim_port_state: SLIMbus Port/Endpoint state machine
201+
* according to SLIMbus Spec 2.0
202+
* @SLIM_PORT_DISCONNECTED: SLIMbus port is disconnected
203+
* entered from Unconfigure/configured state after
204+
* DISCONNECT_PORT or REMOVE_CHANNEL core command
205+
* @SLIM_PORT_UNCONFIGURED: SLIMbus port is in unconfigured state.
206+
* entered from disconnect state after CONNECT_SOURCE/SINK core command
207+
* @SLIM_PORT_CONFIGURED: SLIMbus port is in configured state.
208+
* entered from unconfigured state after DEFINE_CHANNEL, DEFINE_CONTENT
209+
* and ACTIVATE_CHANNEL core commands. Ready for data transmission.
210+
*/
211+
enum slim_port_state {
212+
SLIM_PORT_DISCONNECTED = 0,
213+
SLIM_PORT_UNCONFIGURED,
214+
SLIM_PORT_CONFIGURED,
215+
};
216+
217+
/**
218+
* enum slim_channel_state: SLIMbus channel state machine used by core.
219+
* @SLIM_CH_STATE_DISCONNECTED: SLIMbus channel is disconnected
220+
* @SLIM_CH_STATE_ALLOCATED: SLIMbus channel is allocated
221+
* @SLIM_CH_STATE_ASSOCIATED: SLIMbus channel is associated with port
222+
* @SLIM_CH_STATE_DEFINED: SLIMbus channel parameters are defined
223+
* @SLIM_CH_STATE_CONTENT_DEFINED: SLIMbus channel content is defined
224+
* @SLIM_CH_STATE_ACTIVE: SLIMbus channel is active and ready for data
225+
* @SLIM_CH_STATE_REMOVED: SLIMbus channel is inactive and removed
226+
*/
227+
enum slim_channel_state {
228+
SLIM_CH_STATE_DISCONNECTED = 0,
229+
SLIM_CH_STATE_ALLOCATED,
230+
SLIM_CH_STATE_ASSOCIATED,
231+
SLIM_CH_STATE_DEFINED,
232+
SLIM_CH_STATE_CONTENT_DEFINED,
233+
SLIM_CH_STATE_ACTIVE,
234+
SLIM_CH_STATE_REMOVED,
235+
};
236+
237+
/**
238+
* enum slim_ch_data_fmt: SLIMbus channel data Type identifiers according to
239+
* Table 60 of SLIMbus Spec 1.01.01
240+
* @SLIM_CH_DATA_FMT_NOT_DEFINED: Undefined
241+
* @SLIM_CH_DATA_FMT_LPCM_AUDIO: LPCM audio
242+
* @SLIM_CH_DATA_FMT_IEC61937_COMP_AUDIO: IEC61937 Compressed audio
243+
* @SLIM_CH_DATA_FMT_PACKED_PDM_AUDIO: Packed PDM audio
244+
*/
245+
enum slim_ch_data_fmt {
246+
SLIM_CH_DATA_FMT_NOT_DEFINED = 0,
247+
SLIM_CH_DATA_FMT_LPCM_AUDIO = 1,
248+
SLIM_CH_DATA_FMT_IEC61937_COMP_AUDIO = 2,
249+
SLIM_CH_DATA_FMT_PACKED_PDM_AUDIO = 3,
250+
};
251+
252+
/**
253+
* enum slim_ch_aux_fmt: SLIMbus channel Aux Field format IDs according to
254+
* Table 63 of SLIMbus Spec 2.0
255+
* @SLIM_CH_AUX_FMT_NOT_APPLICABLE: Undefined
256+
* @SLIM_CH_AUX_FMT_ZCUV_TUNNEL_IEC60958: ZCUV for tunneling IEC60958
257+
* @SLIM_CH_AUX_FMT_USER_DEFINED: User defined
258+
*/
259+
enum slim_ch_aux_bit_fmt {
260+
SLIM_CH_AUX_FMT_NOT_APPLICABLE = 0,
261+
SLIM_CH_AUX_FMT_ZCUV_TUNNEL_IEC60958 = 1,
262+
SLIM_CH_AUX_FMT_USER_DEFINED = 0xF,
263+
};
264+
265+
/**
266+
* struct slim_channel - SLIMbus channel, used for state machine
267+
*
268+
* @id: ID of channel
269+
* @prrate: Presense rate of channel from Table 66 of SLIMbus 2.0 Specs
270+
* @seg_dist: segment distribution code from Table 20 of SLIMbus 2.0 Specs
271+
* @data_fmt: Data format of channel.
272+
* @aux_fmt: Aux format for this channel.
273+
* @state: channel state machine
274+
*/
275+
struct slim_channel {
276+
int id;
277+
int prrate;
278+
int seg_dist;
279+
enum slim_ch_data_fmt data_fmt;
280+
enum slim_ch_aux_bit_fmt aux_fmt;
281+
enum slim_channel_state state;
282+
};
283+
284+
/**
285+
* struct slim_port - SLIMbus port
286+
*
287+
* @id: Port id
288+
* @direction: Port direction, Source or Sink.
289+
* @state: state machine of port.
290+
* @ch: channel associated with this port.
291+
*/
292+
struct slim_port {
293+
int id;
294+
enum slim_port_direction direction;
295+
enum slim_port_state state;
296+
struct slim_channel ch;
297+
};
298+
299+
/**
300+
* enum slim_transport_protocol: SLIMbus Transport protocol list from
301+
* Table 47 of SLIMbus 2.0 specs.
302+
* @SLIM_PROTO_ISO: Isochronous Protocol, no flow control as data rate match
303+
* channel rate flow control embedded in the data.
304+
* @SLIM_PROTO_PUSH: Pushed Protocol, includes flow control, Used to carry
305+
* data whose rate is equal to, or lower than the channel rate.
306+
* @SLIM_PROTO_PULL: Pulled Protocol, similar usage as pushed protocol
307+
* but pull is a unicast.
308+
* @SLIM_PROTO_LOCKED: Locked Protocol
309+
* @SLIM_PROTO_ASYNC_SMPLX: Asynchronous Protocol-Simplex
310+
* @SLIM_PROTO_ASYNC_HALF_DUP: Asynchronous Protocol-Half-duplex
311+
* @SLIM_PROTO_EXT_SMPLX: Extended Asynchronous Protocol-Simplex
312+
* @SLIM_PROTO_EXT_HALF_DUP: Extended Asynchronous Protocol-Half-duplex
313+
*/
314+
enum slim_transport_protocol {
315+
SLIM_PROTO_ISO = 0,
316+
SLIM_PROTO_PUSH,
317+
SLIM_PROTO_PULL,
318+
SLIM_PROTO_LOCKED,
319+
SLIM_PROTO_ASYNC_SMPLX,
320+
SLIM_PROTO_ASYNC_HALF_DUP,
321+
SLIM_PROTO_EXT_SMPLX,
322+
SLIM_PROTO_EXT_HALF_DUP,
323+
};
324+
325+
/**
326+
* struct slim_stream_runtime - SLIMbus stream runtime instance
327+
*
328+
* @dev: Name of the stream
329+
* @dev: SLIM Device instance associated with this stream
330+
* @state: state of stream
331+
* @direction: direction of stream
332+
* @prot: Transport protocol used in this stream
333+
* @rate: Data rate of samples *
334+
* @bps: bits per sample
335+
* @ratem: rate multipler which is super frame rate/data rate
336+
* @num_ports: number of ports
337+
* @ports: pointer to instance of ports
338+
* @node: list head for stream associated with slim device.
339+
*/
340+
struct slim_stream_runtime {
341+
const char *name;
342+
struct slim_device *dev;
343+
int direction;
344+
enum slim_transport_protocol prot;
345+
unsigned int rate;
346+
unsigned int bps;
347+
unsigned int ratem;
348+
int num_ports;
349+
struct slim_port *ports;
350+
struct list_head node;
351+
};
352+
170353
/**
171354
* struct slim_controller - Controls every instance of SLIMbus
172355
* (similar to 'master' on SPI)
@@ -196,6 +379,10 @@ struct slim_sched {
196379
* @wakeup: This function pointer implements controller-specific procedure
197380
* to wake it up from clock-pause. Framework will call this to bring
198381
* the controller out of clock pause.
382+
* @enable_stream: This function pointer implements controller-specific procedure
383+
* to enable a stream.
384+
* @disable_stream: This function pointer implements controller-specific procedure
385+
* to disable stream.
199386
*
200387
* 'Manager device' is responsible for device management, bandwidth
201388
* allocation, channel setup, and port associations per channel.
@@ -237,6 +424,8 @@ struct slim_controller {
237424
struct slim_eaddr *ea, u8 laddr);
238425
int (*get_laddr)(struct slim_controller *ctrl,
239426
struct slim_eaddr *ea, u8 *laddr);
427+
int (*enable_stream)(struct slim_stream_runtime *rt);
428+
int (*disable_stream)(struct slim_stream_runtime *rt);
240429
int (*wakeup)(struct slim_controller *ctrl);
241430
};
242431

0 commit comments

Comments
 (0)