forked from mirrors/linux
		
	Documentation: soundwire: Add more documentation
This adds documentation for error handling, locking and streams. Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> Signed-off-by: Sanyog Kale <sanyog.r.kale@intel.com> Signed-off-by: Shreyas NC <shreyas.nc@intel.com> Signed-off-by: Vinod Koul <vkoul@kernel.org>
This commit is contained in:
		
							parent
							
								
									fce45d1142
								
							
						
					
					
						commit
						89634f99a8
					
				
					 4 changed files with 546 additions and 0 deletions
				
			
		
							
								
								
									
										65
									
								
								Documentation/driver-api/soundwire/error_handling.rst
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								Documentation/driver-api/soundwire/error_handling.rst
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,65 @@
 | 
			
		|||
========================
 | 
			
		||||
SoundWire Error Handling
 | 
			
		||||
========================
 | 
			
		||||
 | 
			
		||||
The SoundWire PHY was designed with care and errors on the bus are going to
 | 
			
		||||
be very unlikely, and if they happen it should be limited to single bit
 | 
			
		||||
errors. Examples of this design can be found in the synchronization
 | 
			
		||||
mechanism (sync loss after two errors) and short CRCs used for the Bulk
 | 
			
		||||
Register Access.
 | 
			
		||||
 | 
			
		||||
The errors can be detected with multiple mechanisms:
 | 
			
		||||
 | 
			
		||||
1. Bus clash or parity errors: This mechanism relies on low-level detectors
 | 
			
		||||
   that are independent of the payload and usages, and they cover both control
 | 
			
		||||
   and audio data. The current implementation only logs such errors.
 | 
			
		||||
   Improvements could be invalidating an entire programming sequence and
 | 
			
		||||
   restarting from a known position. In the case of such errors outside of a
 | 
			
		||||
   control/command sequence, there is no concealment or recovery for audio
 | 
			
		||||
   data enabled by the SoundWire protocol, the location of the error will also
 | 
			
		||||
   impact its audibility (most-significant bits will be more impacted in PCM),
 | 
			
		||||
   and after a number of such errors are detected the bus might be reset. Note
 | 
			
		||||
   that bus clashes due to programming errors (two streams using the same bit
 | 
			
		||||
   slots) or electrical issues during the transmit/receive transition cannot
 | 
			
		||||
   be distinguished, although a recurring bus clash when audio is enabled is a
 | 
			
		||||
   indication of a bus allocation issue. The interrupt mechanism can also help
 | 
			
		||||
   identify Slaves which detected a Bus Clash or a Parity Error, but they may
 | 
			
		||||
   not be responsible for the errors so resetting them individually is not a
 | 
			
		||||
   viable recovery strategy.
 | 
			
		||||
 | 
			
		||||
2. Command status: Each command is associated with a status, which only
 | 
			
		||||
   covers transmission of the data between devices. The ACK status indicates
 | 
			
		||||
   that the command was received and will be executed by the end of the
 | 
			
		||||
   current frame. A NAK indicates that the command was in error and will not
 | 
			
		||||
   be applied. In case of a bad programming (command sent to non-existent
 | 
			
		||||
   Slave or to a non-implemented register) or electrical issue, no response
 | 
			
		||||
   signals the command was ignored. Some Master implementations allow for a
 | 
			
		||||
   command to be retransmitted several times.  If the retransmission fails,
 | 
			
		||||
   backtracking and restarting the entire programming sequence might be a
 | 
			
		||||
   solution. Alternatively some implementations might directly issue a bus
 | 
			
		||||
   reset and re-enumerate all devices.
 | 
			
		||||
 | 
			
		||||
3. Timeouts: In a number of cases such as ChannelPrepare or
 | 
			
		||||
   ClockStopPrepare, the bus driver is supposed to poll a register field until
 | 
			
		||||
   it transitions to a NotFinished value of zero. The MIPI SoundWire spec 1.1
 | 
			
		||||
   does not define timeouts but the MIPI SoundWire DisCo document adds
 | 
			
		||||
   recommendation on timeouts. If such configurations do not complete, the
 | 
			
		||||
   driver will return a -ETIMEOUT. Such timeouts are symptoms of a faulty
 | 
			
		||||
   Slave device and are likely impossible to recover from.
 | 
			
		||||
 | 
			
		||||
Errors during global reconfiguration sequences are extremely difficult to
 | 
			
		||||
handle:
 | 
			
		||||
 | 
			
		||||
1. BankSwitch: An error during the last command issuing a BankSwitch is
 | 
			
		||||
   difficult to backtrack from. Retransmitting the Bank Switch command may be
 | 
			
		||||
   possible in a single segment setup, but this can lead to synchronization
 | 
			
		||||
   problems when enabling multiple bus segments (a command with side effects
 | 
			
		||||
   such as frame reconfiguration would be handled at different times). A global
 | 
			
		||||
   hard-reset might be the best solution.
 | 
			
		||||
 | 
			
		||||
Note that SoundWire does not provide a mechanism to detect illegal values
 | 
			
		||||
written in valid registers. In a number of cases the standard even mentions
 | 
			
		||||
that the Slave might behave in implementation-defined ways. The bus
 | 
			
		||||
implementation does not provide a recovery mechanism for such errors, Slave
 | 
			
		||||
or Master driver implementers are responsible for writing valid values in
 | 
			
		||||
valid registers and implement additional range checking if needed.
 | 
			
		||||
| 
						 | 
				
			
			@ -6,6 +6,9 @@ SoundWire Documentation
 | 
			
		|||
   :maxdepth: 1
 | 
			
		||||
 | 
			
		||||
   summary
 | 
			
		||||
   stream
 | 
			
		||||
   error_handling
 | 
			
		||||
   locking
 | 
			
		||||
 | 
			
		||||
.. only::  subproject
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										106
									
								
								Documentation/driver-api/soundwire/locking.rst
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										106
									
								
								Documentation/driver-api/soundwire/locking.rst
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,106 @@
 | 
			
		|||
=================
 | 
			
		||||
SoundWire Locking
 | 
			
		||||
=================
 | 
			
		||||
 | 
			
		||||
This document explains locking mechanism of the SoundWire Bus. Bus uses
 | 
			
		||||
following locks in order to avoid race conditions in Bus operations on
 | 
			
		||||
shared resources.
 | 
			
		||||
 | 
			
		||||
  - Bus lock
 | 
			
		||||
 | 
			
		||||
  - Message lock
 | 
			
		||||
 | 
			
		||||
Bus lock
 | 
			
		||||
========
 | 
			
		||||
 | 
			
		||||
SoundWire Bus lock is a mutex and is part of Bus data structure
 | 
			
		||||
(sdw_bus) which is used for every Bus instance. This lock is used to
 | 
			
		||||
serialize each of the following operations(s) within SoundWire Bus instance.
 | 
			
		||||
 | 
			
		||||
  - Addition and removal of Slave(s), changing Slave status.
 | 
			
		||||
 | 
			
		||||
  - Prepare, Enable, Disable and De-prepare stream operations.
 | 
			
		||||
 | 
			
		||||
  - Access of Stream data structure.
 | 
			
		||||
 | 
			
		||||
Message lock
 | 
			
		||||
============
 | 
			
		||||
 | 
			
		||||
SoundWire message transfer lock. This mutex is part of
 | 
			
		||||
Bus data structure (sdw_bus). This lock is used to serialize the message
 | 
			
		||||
transfers (read/write) within a SoundWire Bus instance.
 | 
			
		||||
 | 
			
		||||
Below examples show how locks are acquired.
 | 
			
		||||
 | 
			
		||||
Example 1
 | 
			
		||||
---------
 | 
			
		||||
 | 
			
		||||
Message transfer.
 | 
			
		||||
 | 
			
		||||
  1. For every message transfer
 | 
			
		||||
 | 
			
		||||
     a. Acquire Message lock.
 | 
			
		||||
 | 
			
		||||
     b. Transfer message (Read/Write) to Slave1 or broadcast message on
 | 
			
		||||
        Bus in case of bank switch.
 | 
			
		||||
 | 
			
		||||
     c. Release Message lock ::
 | 
			
		||||
 | 
			
		||||
	+----------+                    +---------+
 | 
			
		||||
	|          |                    |         |
 | 
			
		||||
	|   Bus    |                    | Master  |
 | 
			
		||||
	|          |                    | Driver  |
 | 
			
		||||
	|          |                    |         |
 | 
			
		||||
	+----+-----+                    +----+----+
 | 
			
		||||
	     |                               |
 | 
			
		||||
	     |     bus->ops->xfer_msg()      |
 | 
			
		||||
	     <-------------------------------+   a. Acquire Message lock
 | 
			
		||||
	     |                               |   b. Transfer message
 | 
			
		||||
	     |                               |
 | 
			
		||||
	     +------------------------------->   c. Release Message lock
 | 
			
		||||
	     |    return success/error       |   d. Return success/error
 | 
			
		||||
	     |                               |
 | 
			
		||||
	     +                               +
 | 
			
		||||
 | 
			
		||||
Example 2
 | 
			
		||||
---------
 | 
			
		||||
 | 
			
		||||
Prepare operation.
 | 
			
		||||
 | 
			
		||||
  1. Acquire lock for Bus instance associated with Master 1.
 | 
			
		||||
 | 
			
		||||
  2. For every message transfer in Prepare operation
 | 
			
		||||
 | 
			
		||||
     a. Acquire Message lock.
 | 
			
		||||
 | 
			
		||||
     b. Transfer message (Read/Write) to Slave1 or broadcast message on
 | 
			
		||||
        Bus in case of bank switch.
 | 
			
		||||
 | 
			
		||||
     c. Release Message lock.
 | 
			
		||||
 | 
			
		||||
  3. Release lock for Bus instance associated with Master 1 ::
 | 
			
		||||
 | 
			
		||||
	+----------+                    +---------+
 | 
			
		||||
	|          |                    |         |
 | 
			
		||||
	|   Bus    |                    | Master  |
 | 
			
		||||
	|          |                    | Driver  |
 | 
			
		||||
	|          |                    |         |
 | 
			
		||||
	+----+-----+                    +----+----+
 | 
			
		||||
	     |                               |
 | 
			
		||||
	     |    sdw_prepare_stream()       |
 | 
			
		||||
	     <-------------------------------+   1. Acquire bus lock
 | 
			
		||||
	     |                               |   2. Perform stream prepare
 | 
			
		||||
	     |                               |
 | 
			
		||||
	     |                               |
 | 
			
		||||
	     |     bus->ops->xfer_msg()      |
 | 
			
		||||
	     <-------------------------------+   a. Acquire Message lock
 | 
			
		||||
	     |                               |   b. Transfer message
 | 
			
		||||
	     |                               |
 | 
			
		||||
	     +------------------------------->   c. Release Message lock
 | 
			
		||||
	     |    return success/error       |   d. Return success/error
 | 
			
		||||
	     |                               |
 | 
			
		||||
	     |                               |
 | 
			
		||||
	     |    return success/error       |   3. Release bus lock
 | 
			
		||||
	     +------------------------------->   4. Return success/error
 | 
			
		||||
	     |                               |
 | 
			
		||||
	     +                               +
 | 
			
		||||
							
								
								
									
										372
									
								
								Documentation/driver-api/soundwire/stream.rst
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										372
									
								
								Documentation/driver-api/soundwire/stream.rst
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,372 @@
 | 
			
		|||
=========================
 | 
			
		||||
Audio Stream in SoundWire
 | 
			
		||||
=========================
 | 
			
		||||
 | 
			
		||||
An audio stream is a logical or virtual connection created between
 | 
			
		||||
 | 
			
		||||
  (1) System memory buffer(s) and Codec(s)
 | 
			
		||||
 | 
			
		||||
  (2) DSP memory buffer(s) and Codec(s)
 | 
			
		||||
 | 
			
		||||
  (3) FIFO(s) and Codec(s)
 | 
			
		||||
 | 
			
		||||
  (4) Codec(s) and Codec(s)
 | 
			
		||||
 | 
			
		||||
which is typically driven by a DMA(s) channel through the data link. An
 | 
			
		||||
audio stream contains one or more channels of data. All channels within
 | 
			
		||||
stream must have same sample rate and same sample size.
 | 
			
		||||
 | 
			
		||||
Assume a stream with two channels (Left & Right) is opened using SoundWire
 | 
			
		||||
interface. Below are some ways a stream can be represented in SoundWire.
 | 
			
		||||
 | 
			
		||||
Stream Sample in memory (System memory, DSP memory or FIFOs) ::
 | 
			
		||||
 | 
			
		||||
	-------------------------
 | 
			
		||||
	| L | R | L | R | L | R |
 | 
			
		||||
	-------------------------
 | 
			
		||||
 | 
			
		||||
Example 1: Stereo Stream with L and R channels is rendered from Master to
 | 
			
		||||
Slave. Both Master and Slave is using single port. ::
 | 
			
		||||
 | 
			
		||||
	+---------------+                    Clock Signal  +---------------+
 | 
			
		||||
	|    Master     +----------------------------------+     Slave     |
 | 
			
		||||
	|   Interface   |                                  |   Interface   |
 | 
			
		||||
	|               |                                  |       1       |
 | 
			
		||||
	|               |                     Data Signal  |               |
 | 
			
		||||
	|    L  +  R    +----------------------------------+    L  +  R    |
 | 
			
		||||
	|     (Data)    |     Data Direction               |     (Data)    |
 | 
			
		||||
	+---------------+  +----------------------->       +---------------+
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Example 2: Stereo Stream with L and R channels is captured from Slave to
 | 
			
		||||
Master. Both Master and Slave is using single port. ::
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	+---------------+                    Clock Signal  +---------------+
 | 
			
		||||
	|    Master     +----------------------------------+     Slave     |
 | 
			
		||||
	|   Interface   |                                  |   Interface   |
 | 
			
		||||
	|               |                                  |       1       |
 | 
			
		||||
	|               |                     Data Signal  |               |
 | 
			
		||||
	|    L  +  R    +----------------------------------+    L  +  R    |
 | 
			
		||||
	|     (Data)    |     Data Direction               |     (Data)    |
 | 
			
		||||
	+---------------+  <-----------------------+       +---------------+
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Example 3: Stereo Stream with L and R channels is rendered by Master. Each
 | 
			
		||||
of the L and R channel is received by two different Slaves. Master and both
 | 
			
		||||
Slaves are using single port. ::
 | 
			
		||||
 | 
			
		||||
	+---------------+                    Clock Signal  +---------------+
 | 
			
		||||
	|    Master     +---------+------------------------+     Slave     |
 | 
			
		||||
	|   Interface   |         |                        |   Interface   |
 | 
			
		||||
	|               |         |                        |       1       |
 | 
			
		||||
	|               |         |           Data Signal  |               |
 | 
			
		||||
	|    L  +  R    +---+------------------------------+       L       |
 | 
			
		||||
	|     (Data)    |   |     |    Data Direction      |     (Data)    |
 | 
			
		||||
	+---------------+   |     |   +------------->      +---------------+
 | 
			
		||||
	                    |     |
 | 
			
		||||
	                    |     |
 | 
			
		||||
	                    |     |                        +---------------+
 | 
			
		||||
	                    |     +----------------------> |     Slave     |
 | 
			
		||||
	                    |                              |   Interface   |
 | 
			
		||||
	                    |                              |       2       |
 | 
			
		||||
	                    |                              |               |
 | 
			
		||||
	                    +----------------------------> |       R       |
 | 
			
		||||
	                                                   |     (Data)    |
 | 
			
		||||
	                                                   +---------------+
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Example 4: Stereo Stream with L and R channel is rendered by two different
 | 
			
		||||
Ports of the Master and is received by only single Port of the Slave
 | 
			
		||||
interface. ::
 | 
			
		||||
 | 
			
		||||
	+--------------------+
 | 
			
		||||
	|                    |
 | 
			
		||||
	|     +--------------+                             +----------------+
 | 
			
		||||
	|     |             ||                             |                |
 | 
			
		||||
	|     |  Data Port  ||  L Channel                  |                |
 | 
			
		||||
	|     |      1      |------------+                 |                |
 | 
			
		||||
	|     |  L Channel  ||           |                 +-----+----+     |
 | 
			
		||||
	|     |   (Data)    ||           |   L + R Channel ||    Data |     |
 | 
			
		||||
	| Master  +----------+           | +---+---------> ||    Port |     |
 | 
			
		||||
	| Interface          |           |                 ||     1   |     |
 | 
			
		||||
	|     +--------------+           |                 ||         |     |
 | 
			
		||||
	|     |             ||           |                 +----------+     |
 | 
			
		||||
	|     |  Data Port  |------------+                 |                |
 | 
			
		||||
	|     |      2      ||  R Channel                  |     Slave      |
 | 
			
		||||
	|     |  R Channel  ||                             |   Interface    |
 | 
			
		||||
	|     |   (Data)    ||                             |       1        |
 | 
			
		||||
	|     +--------------+         Clock Signal        |     L  +  R    |
 | 
			
		||||
	|                    +---------------------------> |      (Data)    |
 | 
			
		||||
	+--------------------+                             |                |
 | 
			
		||||
							   +----------------+
 | 
			
		||||
 | 
			
		||||
SoundWire Stream Management flow
 | 
			
		||||
================================
 | 
			
		||||
 | 
			
		||||
Stream definitions
 | 
			
		||||
------------------
 | 
			
		||||
 | 
			
		||||
  (1) Current stream: This is classified as the stream on which operation has
 | 
			
		||||
      to be performed like prepare, enable, disable, de-prepare etc.
 | 
			
		||||
 | 
			
		||||
  (2) Active stream: This is classified as the stream which is already active
 | 
			
		||||
      on Bus other than current stream. There can be multiple active streams
 | 
			
		||||
      on the Bus.
 | 
			
		||||
 | 
			
		||||
SoundWire Bus manages stream operations for each stream getting
 | 
			
		||||
rendered/captured on the SoundWire Bus. This section explains Bus operations
 | 
			
		||||
done for each of the stream allocated/released on Bus. Following are the
 | 
			
		||||
stream states maintained by the Bus for each of the audio stream.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
SoundWire stream states
 | 
			
		||||
-----------------------
 | 
			
		||||
 | 
			
		||||
Below shows the SoundWire stream states and state transition diagram. ::
 | 
			
		||||
 | 
			
		||||
	+-----------+     +------------+     +----------+     +----------+
 | 
			
		||||
	| ALLOCATED +---->| CONFIGURED +---->| PREPARED +---->| ENABLED  |
 | 
			
		||||
	|   STATE   |     |    STATE   |     |  STATE   |     |  STATE   |
 | 
			
		||||
	+-----------+     +------------+     +----------+     +----+-----+
 | 
			
		||||
	                                                           ^
 | 
			
		||||
	                                                           |
 | 
			
		||||
	                                                           |
 | 
			
		||||
	                                                           v
 | 
			
		||||
	         +----------+           +------------+        +----+-----+
 | 
			
		||||
	         | RELEASED |<----------+ DEPREPARED |<-------+ DISABLED |
 | 
			
		||||
	         |  STATE   |           |   STATE    |        |  STATE   |
 | 
			
		||||
	         +----------+           +------------+        +----------+
 | 
			
		||||
 | 
			
		||||
NOTE: State transition between prepare and deprepare is supported in Spec
 | 
			
		||||
but not in the software (subsystem)
 | 
			
		||||
 | 
			
		||||
NOTE2: Stream state transition checks need to be handled by caller
 | 
			
		||||
framework, for example ALSA/ASoC. No checks for stream transition exist in
 | 
			
		||||
SoundWire subsystem.
 | 
			
		||||
 | 
			
		||||
Stream State Operations
 | 
			
		||||
-----------------------
 | 
			
		||||
 | 
			
		||||
Below section explains the operations done by the Bus on Master(s) and
 | 
			
		||||
Slave(s) as part of stream state transitions.
 | 
			
		||||
 | 
			
		||||
SDW_STREAM_ALLOCATED
 | 
			
		||||
~~~~~~~~~~~~~~~~~~~~
 | 
			
		||||
 | 
			
		||||
Allocation state for stream. This is the entry state
 | 
			
		||||
of the stream. Operations performed before entering in this state:
 | 
			
		||||
 | 
			
		||||
  (1) A stream runtime is allocated for the stream. This stream
 | 
			
		||||
      runtime is used as a reference for all the operations performed
 | 
			
		||||
      on the stream.
 | 
			
		||||
 | 
			
		||||
  (2) The resources required for holding stream runtime information are
 | 
			
		||||
      allocated and initialized. This holds all stream related information
 | 
			
		||||
      such as stream type (PCM/PDM) and parameters, Master and Slave
 | 
			
		||||
      interface associated with the stream, stream state etc.
 | 
			
		||||
 | 
			
		||||
After all above operations are successful, stream state is set to
 | 
			
		||||
``SDW_STREAM_ALLOCATED``.
 | 
			
		||||
 | 
			
		||||
Bus implements below API for allocate a stream which needs to be called once
 | 
			
		||||
per stream. From ASoC DPCM framework, this stream state maybe linked to
 | 
			
		||||
.startup() operation.
 | 
			
		||||
 | 
			
		||||
  .. code-block:: c
 | 
			
		||||
  int sdw_alloc_stream(char * stream_name);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
SDW_STREAM_CONFIGURED
 | 
			
		||||
~~~~~~~~~~~~~~~~~~~~~
 | 
			
		||||
 | 
			
		||||
Configuration state of stream. Operations performed before entering in
 | 
			
		||||
this state:
 | 
			
		||||
 | 
			
		||||
  (1) The resources allocated for stream information in SDW_STREAM_ALLOCATED
 | 
			
		||||
      state are updated here. This includes stream parameters, Master(s)
 | 
			
		||||
      and Slave(s) runtime information associated with current stream.
 | 
			
		||||
 | 
			
		||||
  (2) All the Master(s) and Slave(s) associated with current stream provide
 | 
			
		||||
      the port information to Bus which includes port numbers allocated by
 | 
			
		||||
      Master(s) and Slave(s) for current stream and their channel mask.
 | 
			
		||||
 | 
			
		||||
After all above operations are successful, stream state is set to
 | 
			
		||||
``SDW_STREAM_CONFIGURED``.
 | 
			
		||||
 | 
			
		||||
Bus implements below APIs for CONFIG state which needs to be called by
 | 
			
		||||
the respective Master(s) and Slave(s) associated with stream. These APIs can
 | 
			
		||||
only be invoked once by respective Master(s) and Slave(s). From ASoC DPCM
 | 
			
		||||
framework, this stream state is linked to .hw_params() operation.
 | 
			
		||||
 | 
			
		||||
  .. code-block:: c
 | 
			
		||||
  int sdw_stream_add_master(struct sdw_bus * bus,
 | 
			
		||||
		struct sdw_stream_config * stream_config,
 | 
			
		||||
		struct sdw_ports_config * ports_config,
 | 
			
		||||
		struct sdw_stream_runtime * stream);
 | 
			
		||||
 | 
			
		||||
  int sdw_stream_add_slave(struct sdw_slave * slave,
 | 
			
		||||
		struct sdw_stream_config * stream_config,
 | 
			
		||||
		struct sdw_ports_config * ports_config,
 | 
			
		||||
		struct sdw_stream_runtime * stream);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
SDW_STREAM_PREPARED
 | 
			
		||||
~~~~~~~~~~~~~~~~~~~
 | 
			
		||||
 | 
			
		||||
Prepare state of stream. Operations performed before entering in this state:
 | 
			
		||||
 | 
			
		||||
  (1) Bus parameters such as bandwidth, frame shape, clock frequency,
 | 
			
		||||
      are computed based on current stream as well as already active
 | 
			
		||||
      stream(s) on Bus. Re-computation is required to accommodate current
 | 
			
		||||
      stream on the Bus.
 | 
			
		||||
 | 
			
		||||
  (2) Transport and port parameters of all Master(s) and Slave(s) port(s) are
 | 
			
		||||
      computed for the current as well as already active stream based on frame
 | 
			
		||||
      shape and clock frequency computed in step 1.
 | 
			
		||||
 | 
			
		||||
  (3) Computed Bus and transport parameters are programmed in Master(s) and
 | 
			
		||||
      Slave(s) registers. The banked registers programming is done on the
 | 
			
		||||
      alternate bank (bank currently unused). Port(s) are enabled for the
 | 
			
		||||
      already active stream(s) on the alternate bank (bank currently unused).
 | 
			
		||||
      This is done in order to not disrupt already active stream(s).
 | 
			
		||||
 | 
			
		||||
  (4) Once all the values are programmed, Bus initiates switch to alternate
 | 
			
		||||
      bank where all new values programmed gets into effect.
 | 
			
		||||
 | 
			
		||||
  (5) Ports of Master(s) and Slave(s) for current stream are prepared by
 | 
			
		||||
      programming PrepareCtrl register.
 | 
			
		||||
 | 
			
		||||
After all above operations are successful, stream state is set to
 | 
			
		||||
``SDW_STREAM_PREPARED``.
 | 
			
		||||
 | 
			
		||||
Bus implements below API for PREPARE state which needs to be called once per
 | 
			
		||||
stream. From ASoC DPCM framework, this stream state is linked to
 | 
			
		||||
.prepare() operation.
 | 
			
		||||
 | 
			
		||||
  .. code-block:: c
 | 
			
		||||
  int sdw_prepare_stream(struct sdw_stream_runtime * stream);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
SDW_STREAM_ENABLED
 | 
			
		||||
~~~~~~~~~~~~~~~~~~
 | 
			
		||||
 | 
			
		||||
Enable state of stream. The data port(s) are enabled upon entering this state.
 | 
			
		||||
Operations performed before entering in this state:
 | 
			
		||||
 | 
			
		||||
  (1) All the values computed in SDW_STREAM_PREPARED state are programmed
 | 
			
		||||
      in alternate bank (bank currently unused). It includes programming of
 | 
			
		||||
      already active stream(s) as well.
 | 
			
		||||
 | 
			
		||||
  (2) All the Master(s) and Slave(s) port(s) for the current stream are
 | 
			
		||||
      enabled on alternate bank (bank currently unused) by programming
 | 
			
		||||
      ChannelEn register.
 | 
			
		||||
 | 
			
		||||
  (3) Once all the values are programmed, Bus initiates switch to alternate
 | 
			
		||||
      bank where all new values programmed gets into effect and port(s)
 | 
			
		||||
      associated with current stream are enabled.
 | 
			
		||||
 | 
			
		||||
After all above operations are successful, stream state is set to
 | 
			
		||||
``SDW_STREAM_ENABLED``.
 | 
			
		||||
 | 
			
		||||
Bus implements below API for ENABLE state which needs to be called once per
 | 
			
		||||
stream. From ASoC DPCM framework, this stream state is linked to
 | 
			
		||||
.trigger() start operation.
 | 
			
		||||
 | 
			
		||||
  .. code-block:: c
 | 
			
		||||
  int sdw_enable_stream(struct sdw_stream_runtime * stream);
 | 
			
		||||
 | 
			
		||||
SDW_STREAM_DISABLED
 | 
			
		||||
~~~~~~~~~~~~~~~~~~~
 | 
			
		||||
 | 
			
		||||
Disable state of stream. The data port(s) are disabled upon exiting this state.
 | 
			
		||||
Operations performed before entering in this state:
 | 
			
		||||
 | 
			
		||||
  (1) All the Master(s) and Slave(s) port(s) for the current stream are
 | 
			
		||||
      disabled on alternate bank (bank currently unused) by programming
 | 
			
		||||
      ChannelEn register.
 | 
			
		||||
 | 
			
		||||
  (2) All the current configuration of Bus and active stream(s) are programmed
 | 
			
		||||
      into alternate bank (bank currently unused).
 | 
			
		||||
 | 
			
		||||
  (3) Once all the values are programmed, Bus initiates switch to alternate
 | 
			
		||||
      bank where all new values programmed gets into effect and port(s) associated
 | 
			
		||||
      with current stream are disabled.
 | 
			
		||||
 | 
			
		||||
After all above operations are successful, stream state is set to
 | 
			
		||||
``SDW_STREAM_DISABLED``.
 | 
			
		||||
 | 
			
		||||
Bus implements below API for DISABLED state which needs to be called once
 | 
			
		||||
per stream. From ASoC DPCM framework, this stream state is linked to
 | 
			
		||||
.trigger() stop operation.
 | 
			
		||||
 | 
			
		||||
  .. code-block:: c
 | 
			
		||||
  int sdw_disable_stream(struct sdw_stream_runtime * stream);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
SDW_STREAM_DEPREPARED
 | 
			
		||||
~~~~~~~~~~~~~~~~~~~~~
 | 
			
		||||
 | 
			
		||||
De-prepare state of stream. Operations performed before entering in this
 | 
			
		||||
state:
 | 
			
		||||
 | 
			
		||||
  (1) All the port(s) of Master(s) and Slave(s) for current stream are
 | 
			
		||||
      de-prepared by programming PrepareCtrl register.
 | 
			
		||||
 | 
			
		||||
  (2) The payload bandwidth of current stream is reduced from the total
 | 
			
		||||
      bandwidth requirement of bus and new parameters calculated and
 | 
			
		||||
      applied by performing bank switch etc.
 | 
			
		||||
 | 
			
		||||
After all above operations are successful, stream state is set to
 | 
			
		||||
``SDW_STREAM_DEPREPARED``.
 | 
			
		||||
 | 
			
		||||
Bus implements below API for DEPREPARED state which needs to be called once
 | 
			
		||||
per stream. From ASoC DPCM framework, this stream state is linked to
 | 
			
		||||
.trigger() stop operation.
 | 
			
		||||
 | 
			
		||||
  .. code-block:: c
 | 
			
		||||
  int sdw_deprepare_stream(struct sdw_stream_runtime * stream);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
SDW_STREAM_RELEASED
 | 
			
		||||
~~~~~~~~~~~~~~~~~~~
 | 
			
		||||
 | 
			
		||||
Release state of stream. Operations performed before entering in this state:
 | 
			
		||||
 | 
			
		||||
  (1) Release port resources for all Master(s) and Slave(s) port(s)
 | 
			
		||||
      associated with current stream.
 | 
			
		||||
 | 
			
		||||
  (2) Release Master(s) and Slave(s) runtime resources associated with
 | 
			
		||||
      current stream.
 | 
			
		||||
 | 
			
		||||
  (3) Release stream runtime resources associated with current stream.
 | 
			
		||||
 | 
			
		||||
After all above operations are successful, stream state is set to
 | 
			
		||||
``SDW_STREAM_RELEASED``.
 | 
			
		||||
 | 
			
		||||
Bus implements below APIs for RELEASE state which needs to be called by
 | 
			
		||||
all the Master(s) and Slave(s) associated with stream. From ASoC DPCM
 | 
			
		||||
framework, this stream state is linked to .hw_free() operation.
 | 
			
		||||
 | 
			
		||||
  .. code-block:: c
 | 
			
		||||
  int sdw_stream_remove_master(struct sdw_bus * bus,
 | 
			
		||||
		struct sdw_stream_runtime * stream);
 | 
			
		||||
  int sdw_stream_remove_slave(struct sdw_slave * slave,
 | 
			
		||||
		struct sdw_stream_runtime * stream);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
The .shutdown() ASoC DPCM operation calls below Bus API to release
 | 
			
		||||
stream assigned as part of ALLOCATED state.
 | 
			
		||||
 | 
			
		||||
In .shutdown() the data structure maintaining stream state are freed up.
 | 
			
		||||
 | 
			
		||||
  .. code-block:: c
 | 
			
		||||
  void sdw_release_stream(struct sdw_stream_runtime * stream);
 | 
			
		||||
 | 
			
		||||
Not Supported
 | 
			
		||||
=============
 | 
			
		||||
 | 
			
		||||
1. A single port with multiple channels supported cannot be used between two
 | 
			
		||||
streams or across stream. For example a port with 4 channels cannot be used
 | 
			
		||||
to handle 2 independent stereo streams even though it's possible in theory
 | 
			
		||||
in SoundWire.
 | 
			
		||||
		Loading…
	
		Reference in a new issue