Lines Matching full:stream

5  *  stream.c - SoundWire Bus stream operations.
260 * @m_rt: Master stream runtime
368 * @m_rt: Master stream runtime
620 * explicitly preparing a stream or handling an in sdw_program_params()
621 * already-prepared stream otherwise. in sdw_program_params()
624 m_rt->stream->state == SDW_STREAM_CONFIGURED) in sdw_program_params()
642 if (m_rt->stream->state != SDW_STREAM_ENABLED) in sdw_program_params()
758 static int do_bank_switch(struct sdw_stream_runtime *stream) in do_bank_switch() argument
767 m_rt_count = stream->m_rt_count; in do_bank_switch()
769 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in do_bank_switch()
807 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in do_bank_switch()
845 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in do_bank_switch()
856 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in do_bank_switch()
867 * sdw_release_stream() - Free the assigned stream runtime
869 * @stream: SoundWire stream runtime
871 * sdw_release_stream should be called only once per stream
873 void sdw_release_stream(struct sdw_stream_runtime *stream) in sdw_release_stream() argument
875 kfree(stream); in sdw_release_stream()
880 * sdw_alloc_stream() - Allocate and return stream runtime
882 * @stream_name: SoundWire stream name
884 * Allocates a SoundWire stream runtime instance.
885 * sdw_alloc_stream should be called only once per stream. Typically
890 struct sdw_stream_runtime *stream; in sdw_alloc_stream() local
892 stream = kzalloc(sizeof(*stream), GFP_KERNEL); in sdw_alloc_stream()
893 if (!stream) in sdw_alloc_stream()
896 stream->name = stream_name; in sdw_alloc_stream()
897 INIT_LIST_HEAD(&stream->master_list); in sdw_alloc_stream()
898 stream->state = SDW_STREAM_ALLOCATED; in sdw_alloc_stream()
899 stream->m_rt_count = 0; in sdw_alloc_stream()
901 return stream; in sdw_alloc_stream()
907 struct sdw_stream_runtime *stream) in sdw_find_master_rt() argument
912 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in sdw_find_master_rt()
924 * @stream_config: Stream configuration
925 * @stream: Stream runtime handle.
932 struct sdw_stream_runtime *stream) in sdw_alloc_master_rt() argument
940 m_rt = sdw_find_master_rt(bus, stream); in sdw_alloc_master_rt()
951 list_add_tail(&m_rt->stream_node, &stream->master_list); in sdw_alloc_master_rt()
958 m_rt->stream = stream; in sdw_alloc_master_rt()
968 * @stream_config: Stream configuration
969 * @stream: Stream runtime handle
976 struct sdw_stream_runtime *stream) in sdw_alloc_slave_rt() argument
1005 struct sdw_stream_runtime *stream) in sdw_slave_port_release() argument
1011 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in sdw_slave_port_release()
1029 * @stream: Stream runtime handle.
1034 struct sdw_stream_runtime *stream) in sdw_release_slave_stream() argument
1039 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in sdw_release_slave_stream()
1056 * @stream: Stream runtime handle.
1064 struct sdw_stream_runtime *stream) in sdw_release_master_stream() argument
1069 sdw_slave_port_release(s_rt->slave->bus, s_rt->slave, stream); in sdw_release_master_stream()
1070 sdw_release_slave_stream(s_rt->slave, stream); in sdw_release_master_stream()
1082 * @stream: SoundWire stream
1084 * This removes and frees port_rt and master_rt from a stream
1087 struct sdw_stream_runtime *stream) in sdw_stream_remove_master() argument
1094 &stream->master_list, stream_node) { in sdw_stream_remove_master()
1099 sdw_release_master_stream(m_rt, stream); in sdw_stream_remove_master()
1100 stream->m_rt_count--; in sdw_stream_remove_master()
1103 if (list_empty(&stream->master_list)) in sdw_stream_remove_master()
1104 stream->state = SDW_STREAM_RELEASED; in sdw_stream_remove_master()
1116 * @stream: SoundWire stream
1118 * This removes and frees port_rt and slave_rt from a stream
1121 struct sdw_stream_runtime *stream) in sdw_stream_remove_slave() argument
1125 sdw_slave_port_release(slave->bus, slave, stream); in sdw_stream_remove_slave()
1126 sdw_release_slave_stream(slave, stream); in sdw_stream_remove_slave()
1135 * sdw_config_stream() - Configure the allocated stream
1138 * @stream: SoundWire stream
1139 * @stream_config: Stream configuration for audio stream
1145 struct sdw_stream_runtime *stream, in sdw_config_stream() argument
1150 * Update the stream rate, channel and bps based on data in sdw_config_stream()
1152 * match the rate, bps, stream type and increment number of channels. in sdw_config_stream()
1155 * comparison and allow the value to be set and stored in stream in sdw_config_stream()
1157 if (stream->params.rate && in sdw_config_stream()
1158 stream->params.rate != stream_config->frame_rate) { in sdw_config_stream()
1159 dev_err(dev, "rate not matching, stream:%s\n", stream->name); in sdw_config_stream()
1163 if (stream->params.bps && in sdw_config_stream()
1164 stream->params.bps != stream_config->bps) { in sdw_config_stream()
1165 dev_err(dev, "bps not matching, stream:%s\n", stream->name); in sdw_config_stream()
1169 stream->type = stream_config->type; in sdw_config_stream()
1170 stream->params.rate = stream_config->frame_rate; in sdw_config_stream()
1171 stream->params.bps = stream_config->bps; in sdw_config_stream()
1175 stream->params.ch_count += stream_config->ch_count; in sdw_config_stream()
1270 * sdw_stream_add_master() - Allocate and add master runtime to a stream
1273 * @stream_config: Stream configuration for audio stream
1274 * @port_config: Port configuration for audio stream
1276 * @stream: SoundWire stream
1282 struct sdw_stream_runtime *stream) in sdw_stream_add_master() argument
1294 if (!bus->multi_link && stream->m_rt_count > 0) { in sdw_stream_add_master()
1301 m_rt = sdw_alloc_master_rt(bus, stream_config, stream); in sdw_stream_add_master()
1304 "Master runtime config failed for stream:%s\n", in sdw_stream_add_master()
1305 stream->name); in sdw_stream_add_master()
1310 ret = sdw_config_stream(bus->dev, stream, stream_config, false); in sdw_stream_add_master()
1318 stream->m_rt_count++; in sdw_stream_add_master()
1323 sdw_release_master_stream(m_rt, stream); in sdw_stream_add_master()
1331 * sdw_stream_add_slave() - Allocate and add master/slave runtime to a stream
1334 * @stream_config: Stream configuration for audio stream
1335 * @stream: SoundWire stream
1336 * @port_config: Port configuration for audio stream
1340 * to the Stream.
1347 struct sdw_stream_runtime *stream) in sdw_stream_add_slave() argument
1359 m_rt = sdw_alloc_master_rt(slave->bus, stream_config, stream); in sdw_stream_add_slave()
1362 "alloc master runtime failed for stream:%s\n", in sdw_stream_add_slave()
1363 stream->name); in sdw_stream_add_slave()
1368 s_rt = sdw_alloc_slave_rt(slave, stream_config, stream); in sdw_stream_add_slave()
1371 "Slave runtime config failed for stream:%s\n", in sdw_stream_add_slave()
1372 stream->name); in sdw_stream_add_slave()
1377 ret = sdw_config_stream(&slave->dev, stream, stream_config, true); in sdw_stream_add_slave()
1388 * Change stream state to CONFIGURED on first Slave add. in sdw_stream_add_slave()
1389 * Bus is not aware of number of Slave(s) in a stream at this in sdw_stream_add_slave()
1391 * change stream state to CONFIGURED. in sdw_stream_add_slave()
1393 stream->state = SDW_STREAM_CONFIGURED; in sdw_stream_add_slave()
1398 * we hit error so cleanup the stream, release all Slave(s) and in sdw_stream_add_slave()
1401 sdw_release_master_stream(m_rt, stream); in sdw_stream_add_slave()
1442 * @stream: SoundWire stream
1445 * stream to reconfigure the bus.
1446 * NOTE: This function is called from SoundWire stream ops and is
1449 static void sdw_acquire_bus_lock(struct sdw_stream_runtime *stream) in sdw_acquire_bus_lock() argument
1455 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in sdw_acquire_bus_lock()
1465 * @stream: SoundWire stream
1468 * NOTE: This function is called from SoundWire stream ops and is
1471 static void sdw_release_bus_lock(struct sdw_stream_runtime *stream) in sdw_release_bus_lock() argument
1477 list_for_each_entry_reverse(m_rt, &stream->master_list, stream_node) { in sdw_release_bus_lock()
1483 static int _sdw_prepare_stream(struct sdw_stream_runtime *stream, in _sdw_prepare_stream() argument
1492 /* Prepare Master(s) and Slave(s) port(s) associated with stream */ in _sdw_prepare_stream()
1493 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in _sdw_prepare_stream()
1499 if ((prop->max_clk_freq % stream->params.rate) != 0) { in _sdw_prepare_stream()
1509 bus->params.bandwidth += m_rt->stream->params.rate * in _sdw_prepare_stream()
1510 m_rt->ch_count * m_rt->stream->params.bps; in _sdw_prepare_stream()
1536 ret = do_bank_switch(stream); in _sdw_prepare_stream()
1542 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in _sdw_prepare_stream()
1554 stream->state = SDW_STREAM_PREPARED; in _sdw_prepare_stream()
1564 * sdw_prepare_stream() - Prepare SoundWire stream
1566 * @stream: Soundwire stream
1568 * Documentation/driver-api/soundwire/stream.rst explains this API in detail
1570 int sdw_prepare_stream(struct sdw_stream_runtime *stream) in sdw_prepare_stream() argument
1575 if (!stream) { in sdw_prepare_stream()
1576 pr_err("SoundWire: Handle not found for stream\n"); in sdw_prepare_stream()
1580 sdw_acquire_bus_lock(stream); in sdw_prepare_stream()
1582 if (stream->state == SDW_STREAM_PREPARED) { in sdw_prepare_stream()
1587 if (stream->state != SDW_STREAM_CONFIGURED && in sdw_prepare_stream()
1588 stream->state != SDW_STREAM_DEPREPARED && in sdw_prepare_stream()
1589 stream->state != SDW_STREAM_DISABLED) { in sdw_prepare_stream()
1591 __func__, stream->name, stream->state); in sdw_prepare_stream()
1597 * when the stream is DISABLED, this means sdw_prepare_stream() in sdw_prepare_stream()
1602 if (stream->state == SDW_STREAM_DISABLED) in sdw_prepare_stream()
1605 ret = _sdw_prepare_stream(stream, update_params); in sdw_prepare_stream()
1608 sdw_release_bus_lock(stream); in sdw_prepare_stream()
1613 static int _sdw_enable_stream(struct sdw_stream_runtime *stream) in _sdw_enable_stream() argument
1619 /* Enable Master(s) and Slave(s) port(s) associated with stream */ in _sdw_enable_stream()
1620 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in _sdw_enable_stream()
1644 ret = do_bank_switch(stream); in _sdw_enable_stream()
1650 stream->state = SDW_STREAM_ENABLED; in _sdw_enable_stream()
1655 * sdw_enable_stream() - Enable SoundWire stream
1657 * @stream: Soundwire stream
1659 * Documentation/driver-api/soundwire/stream.rst explains this API in detail
1661 int sdw_enable_stream(struct sdw_stream_runtime *stream) in sdw_enable_stream() argument
1665 if (!stream) { in sdw_enable_stream()
1666 pr_err("SoundWire: Handle not found for stream\n"); in sdw_enable_stream()
1670 sdw_acquire_bus_lock(stream); in sdw_enable_stream()
1672 if (stream->state != SDW_STREAM_PREPARED && in sdw_enable_stream()
1673 stream->state != SDW_STREAM_DISABLED) { in sdw_enable_stream()
1675 __func__, stream->name, stream->state); in sdw_enable_stream()
1680 ret = _sdw_enable_stream(stream); in sdw_enable_stream()
1683 sdw_release_bus_lock(stream); in sdw_enable_stream()
1688 static int _sdw_disable_stream(struct sdw_stream_runtime *stream) in _sdw_disable_stream() argument
1693 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in _sdw_disable_stream()
1703 stream->state = SDW_STREAM_DISABLED; in _sdw_disable_stream()
1705 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in _sdw_disable_stream()
1716 ret = do_bank_switch(stream); in _sdw_disable_stream()
1723 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in _sdw_disable_stream()
1738 * sdw_disable_stream() - Disable SoundWire stream
1740 * @stream: Soundwire stream
1742 * Documentation/driver-api/soundwire/stream.rst explains this API in detail
1744 int sdw_disable_stream(struct sdw_stream_runtime *stream) in sdw_disable_stream() argument
1748 if (!stream) { in sdw_disable_stream()
1749 pr_err("SoundWire: Handle not found for stream\n"); in sdw_disable_stream()
1753 sdw_acquire_bus_lock(stream); in sdw_disable_stream()
1755 if (stream->state != SDW_STREAM_ENABLED) { in sdw_disable_stream()
1757 __func__, stream->name, stream->state); in sdw_disable_stream()
1762 ret = _sdw_disable_stream(stream); in sdw_disable_stream()
1765 sdw_release_bus_lock(stream); in sdw_disable_stream()
1770 static int _sdw_deprepare_stream(struct sdw_stream_runtime *stream) in _sdw_deprepare_stream() argument
1776 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in _sdw_deprepare_stream()
1787 bus->params.bandwidth -= m_rt->stream->params.rate * in _sdw_deprepare_stream()
1788 m_rt->ch_count * m_rt->stream->params.bps; in _sdw_deprepare_stream()
1808 stream->state = SDW_STREAM_DEPREPARED; in _sdw_deprepare_stream()
1809 return do_bank_switch(stream); in _sdw_deprepare_stream()
1813 * sdw_deprepare_stream() - Deprepare SoundWire stream
1815 * @stream: Soundwire stream
1817 * Documentation/driver-api/soundwire/stream.rst explains this API in detail
1819 int sdw_deprepare_stream(struct sdw_stream_runtime *stream) in sdw_deprepare_stream() argument
1823 if (!stream) { in sdw_deprepare_stream()
1824 pr_err("SoundWire: Handle not found for stream\n"); in sdw_deprepare_stream()
1828 sdw_acquire_bus_lock(stream); in sdw_deprepare_stream()
1830 if (stream->state != SDW_STREAM_PREPARED && in sdw_deprepare_stream()
1831 stream->state != SDW_STREAM_DISABLED) { in sdw_deprepare_stream()
1833 __func__, stream->name, stream->state); in sdw_deprepare_stream()
1838 ret = _sdw_deprepare_stream(stream); in sdw_deprepare_stream()
1841 sdw_release_bus_lock(stream); in sdw_deprepare_stream()
1854 /* Set stream pointer on all DAIs */ in set_stream()
1856 ret = snd_soc_dai_set_sdw_stream(dai, sdw_stream, substream->stream); in set_stream()
1858 dev_err(rtd->dev, "failed to set stream pointer on dai %s", dai->name); in set_stream()
1867 * sdw_startup_stream() - Startup SoundWire stream
1869 * @sdw_substream: Soundwire stream
1871 * Documentation/driver-api/soundwire/stream.rst explains this API in detail
1881 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) in sdw_startup_stream()
1891 dev_err(rtd->dev, "alloc stream failed for substream DAI %s", substream->name); in sdw_startup_stream()
1911 * sdw_shutdown_stream() - Shutdown SoundWire stream
1913 * @sdw_substream: Soundwire stream
1915 * Documentation/driver-api/soundwire/stream.rst explains this API in detail
1924 /* Find stream from first CPU DAI */ in sdw_shutdown_stream()
1927 sdw_stream = snd_soc_dai_get_sdw_stream(dai, substream->stream); in sdw_shutdown_stream()
1930 dev_err(rtd->dev, "no stream found for DAI %s", dai->name); in sdw_shutdown_stream()