On 17-03-20, 05:51, Pierre-Louis Bossart wrote:
In a multi-cpu DAI context, the stream routines may be called from multiple DAI callbacks. Make sure the stream state only changes for the first call, and don't return error messages if the target state is already reached.
For stream-apis we have documented explicitly in Documentation/driver-api/soundwire/stream.rst
"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); "
This is documented for all stream-apis.
This can be resolved by moving the calling of these APIs from master-dais/slave-dais to machine-dais. They are unique in the card.
Signed-off-by: Pierre-Louis Bossart pierre-louis.bossart@linux.intel.com
drivers/soundwire/stream.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+)
diff --git a/drivers/soundwire/stream.c b/drivers/soundwire/stream.c index 1b43d03c79ea..3319121cd706 100644 --- a/drivers/soundwire/stream.c +++ b/drivers/soundwire/stream.c @@ -1572,6 +1572,7 @@ int sdw_prepare_stream(struct sdw_stream_runtime *stream) sdw_acquire_bus_lock(stream);
if (stream->state == SDW_STREAM_PREPARED) {
ret = 0; goto state_err; }/* nothing to do */
@@ -1661,6 +1662,12 @@ int sdw_enable_stream(struct sdw_stream_runtime *stream)
sdw_acquire_bus_lock(stream);
- if (stream->state == SDW_STREAM_ENABLED) {
/* nothing to do */
ret = 0;
goto state_err;
- }
- if (stream->state != SDW_STREAM_PREPARED && stream->state != SDW_STREAM_DISABLED) { pr_err("%s: %s: inconsistent state state %d\n",
@@ -1744,6 +1751,12 @@ int sdw_disable_stream(struct sdw_stream_runtime *stream)
sdw_acquire_bus_lock(stream);
- if (stream->state == SDW_STREAM_DISABLED) {
/* nothing to do */
ret = 0;
goto state_err;
- }
- if (stream->state != SDW_STREAM_ENABLED) { pr_err("%s: %s: inconsistent state state %d\n", __func__, stream->name, stream->state);
@@ -1809,6 +1822,12 @@ int sdw_deprepare_stream(struct sdw_stream_runtime *stream)
sdw_acquire_bus_lock(stream);
- if (stream->state == SDW_STREAM_DEPREPARED) {
/* nothing to do */
ret = 0;
goto state_err;
- }
- if (stream->state != SDW_STREAM_PREPARED && stream->state != SDW_STREAM_DISABLED) { pr_err("%s: %s: inconsistent state state %d\n",
-- 2.20.1