Lines Matching defs:stream

5  *  stream.c - SoundWire Bus stream operations.
264 * @m_rt: Master stream runtime
372 * @m_rt: Master stream runtime
639 * explicitly preparing a stream or handling an
640 * already-prepared stream otherwise.
643 m_rt->stream->state == SDW_STREAM_CONFIGURED)
661 if (m_rt->stream->state != SDW_STREAM_ENABLED)
745 * @multi_link: whether this is a multi-link stream with hardware-based sync
777 static int do_bank_switch(struct sdw_stream_runtime *stream)
786 m_rt_count = stream->m_rt_count;
788 list_for_each_entry(m_rt, &stream->master_list, stream_node) {
826 list_for_each_entry(m_rt, &stream->master_list, stream_node) {
865 list_for_each_entry(m_rt, &stream->master_list, stream_node) {
877 list_for_each_entry(m_rt, &stream->master_list, stream_node) {
926 struct sdw_stream_runtime *stream)
932 list_for_each_entry(m_rt, &stream->master_list, stream_node) {
1091 struct sdw_stream_runtime *stream)
1096 list_for_each_entry(m_rt, &stream->master_list, stream_node) {
1111 * @stream: Stream runtime handle.
1116 struct sdw_stream_runtime *stream)
1120 s_rt = sdw_slave_rt_find(slave, stream);
1129 struct sdw_stream_runtime *stream)
1134 list_for_each_entry(m_rt, &stream->master_list, stream_node) {
1146 * @stream: Stream runtime handle.
1152 struct sdw_stream_runtime *stream)
1170 insert_after = &stream->master_list;
1171 list_for_each_entry_reverse(walk_m_rt, &stream->master_list, stream_node) {
1182 m_rt->stream = stream;
1209 * @stream: Stream runtime handle.
1217 struct sdw_stream_runtime *stream)
1222 sdw_slave_port_free(s_rt->slave, stream);
1223 sdw_slave_rt_free(s_rt->slave, stream);
1232 * sdw_config_stream() - Configure the allocated stream
1235 * @stream: SoundWire stream
1236 * @stream_config: Stream configuration for audio stream
1242 struct sdw_stream_runtime *stream,
1247 * Update the stream rate, channel and bps based on data
1249 * match the rate, bps, stream type and increment number of channels.
1252 * comparison and allow the value to be set and stored in stream
1254 if (stream->params.rate &&
1255 stream->params.rate != stream_config->frame_rate) {
1256 dev_err(dev, "rate not matching, stream:%s\n", stream->name);
1260 if (stream->params.bps &&
1261 stream->params.bps != stream_config->bps) {
1262 dev_err(dev, "bps not matching, stream:%s\n", stream->name);
1266 stream->type = stream_config->type;
1267 stream->params.rate = stream_config->frame_rate;
1268 stream->params.bps = stream_config->bps;
1272 stream->params.ch_count += stream_config->ch_count;
1311 * @stream: SoundWire stream
1314 * stream to reconfigure the bus.
1315 * NOTE: This function is called from SoundWire stream ops and is
1318 static void sdw_acquire_bus_lock(struct sdw_stream_runtime *stream)
1324 list_for_each_entry(m_rt, &stream->master_list, stream_node) {
1334 * @stream: SoundWire stream
1337 * NOTE: This function is called from SoundWire stream ops and is
1340 static void sdw_release_bus_lock(struct sdw_stream_runtime *stream)
1346 list_for_each_entry_reverse(m_rt, &stream->master_list, stream_node) {
1352 static int _sdw_prepare_stream(struct sdw_stream_runtime *stream,
1361 /* Prepare Master(s) and Slave(s) port(s) associated with stream */
1362 list_for_each_entry(m_rt, &stream->master_list, stream_node) {
1368 if ((prop->max_clk_freq % stream->params.rate) != 0) {
1376 bus->params.bandwidth += m_rt->stream->params.rate *
1377 m_rt->ch_count * m_rt->stream->params.bps;
1398 ret = do_bank_switch(stream);
1404 list_for_each_entry(m_rt, &stream->master_list, stream_node) {
1416 stream->state = SDW_STREAM_PREPARED;
1426 * sdw_prepare_stream() - Prepare SoundWire stream
1428 * @stream: Soundwire stream
1430 * Documentation/driver-api/soundwire/stream.rst explains this API in detail
1432 int sdw_prepare_stream(struct sdw_stream_runtime *stream)
1437 if (!stream) {
1438 pr_err("SoundWire: Handle not found for stream\n");
1442 sdw_acquire_bus_lock(stream);
1444 if (stream->state == SDW_STREAM_PREPARED) {
1449 if (stream->state != SDW_STREAM_CONFIGURED &&
1450 stream->state != SDW_STREAM_DEPREPARED &&
1451 stream->state != SDW_STREAM_DISABLED) {
1453 __func__, stream->name, stream->state);
1459 * when the stream is DISABLED, this means sdw_prepare_stream()
1464 if (stream->state == SDW_STREAM_DISABLED)
1467 ret = _sdw_prepare_stream(stream, update_params);
1470 sdw_release_bus_lock(stream);
1475 static int _sdw_enable_stream(struct sdw_stream_runtime *stream)
1481 /* Enable Master(s) and Slave(s) port(s) associated with stream */
1482 list_for_each_entry(m_rt, &stream->master_list, stream_node) {
1501 ret = do_bank_switch(stream);
1507 stream->state = SDW_STREAM_ENABLED;
1512 * sdw_enable_stream() - Enable SoundWire stream
1514 * @stream: Soundwire stream
1516 * Documentation/driver-api/soundwire/stream.rst explains this API in detail
1518 int sdw_enable_stream(struct sdw_stream_runtime *stream)
1522 if (!stream) {
1523 pr_err("SoundWire: Handle not found for stream\n");
1527 sdw_acquire_bus_lock(stream);
1529 if (stream->state == SDW_STREAM_ENABLED) {
1534 if (stream->state != SDW_STREAM_PREPARED &&
1535 stream->state != SDW_STREAM_DISABLED) {
1537 __func__, stream->name, stream->state);
1542 ret = _sdw_enable_stream(stream);
1545 sdw_release_bus_lock(stream);
1550 static int _sdw_disable_stream(struct sdw_stream_runtime *stream)
1555 list_for_each_entry(m_rt, &stream->master_list, stream_node) {
1565 stream->state = SDW_STREAM_DISABLED;
1567 list_for_each_entry(m_rt, &stream->master_list, stream_node) {
1578 ret = do_bank_switch(stream);
1585 list_for_each_entry(m_rt, &stream->master_list, stream_node) {
1600 * sdw_disable_stream() - Disable SoundWire stream
1602 * @stream: Soundwire stream
1604 * Documentation/driver-api/soundwire/stream.rst explains this API in detail
1606 int sdw_disable_stream(struct sdw_stream_runtime *stream)
1610 if (!stream) {
1611 pr_err("SoundWire: Handle not found for stream\n");
1615 sdw_acquire_bus_lock(stream);
1617 if (stream->state == SDW_STREAM_DISABLED) {
1622 if (stream->state != SDW_STREAM_ENABLED) {
1624 __func__, stream->name, stream->state);
1629 ret = _sdw_disable_stream(stream);
1632 sdw_release_bus_lock(stream);
1637 static int _sdw_deprepare_stream(struct sdw_stream_runtime *stream)
1643 list_for_each_entry(m_rt, &stream->master_list, stream_node) {
1654 bus->params.bandwidth -= m_rt->stream->params.rate *
1655 m_rt->ch_count * m_rt->stream->params.bps;
1675 stream->state = SDW_STREAM_DEPREPARED;
1676 return do_bank_switch(stream);
1680 * sdw_deprepare_stream() - Deprepare SoundWire stream
1682 * @stream: Soundwire stream
1684 * Documentation/driver-api/soundwire/stream.rst explains this API in detail
1686 int sdw_deprepare_stream(struct sdw_stream_runtime *stream)
1690 if (!stream) {
1691 pr_err("SoundWire: Handle not found for stream\n");
1695 sdw_acquire_bus_lock(stream);
1697 if (stream->state == SDW_STREAM_DEPREPARED) {
1702 if (stream->state != SDW_STREAM_PREPARED &&
1703 stream->state != SDW_STREAM_DISABLED) {
1705 __func__, stream->name, stream->state);
1710 ret = _sdw_deprepare_stream(stream);
1713 sdw_release_bus_lock(stream);
1726 /* Set stream pointer on all DAIs */
1728 ret = snd_soc_dai_set_stream(dai, sdw_stream, substream->stream);
1730 dev_err(rtd->dev, "failed to set stream pointer on dai %s\n", dai->name);
1739 * sdw_alloc_stream() - Allocate and return stream runtime
1741 * @stream_name: SoundWire stream name
1743 * Allocates a SoundWire stream runtime instance.
1744 * sdw_alloc_stream should be called only once per stream. Typically
1749 struct sdw_stream_runtime *stream;
1751 stream = kzalloc(sizeof(*stream), GFP_KERNEL);
1752 if (!stream)
1755 stream->name = stream_name;
1756 INIT_LIST_HEAD(&stream->master_list);
1757 stream->state = SDW_STREAM_ALLOCATED;
1758 stream->m_rt_count = 0;
1760 return stream;
1765 * sdw_startup_stream() - Startup SoundWire stream
1767 * @sdw_substream: Soundwire stream
1769 * Documentation/driver-api/soundwire/stream.rst explains this API in detail
1779 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
1789 dev_err(rtd->dev, "alloc stream failed for substream DAI %s\n", substream->name);
1809 * sdw_shutdown_stream() - Shutdown SoundWire stream
1811 * @sdw_substream: Soundwire stream
1813 * Documentation/driver-api/soundwire/stream.rst explains this API in detail
1822 /* Find stream from first CPU DAI */
1825 sdw_stream = snd_soc_dai_get_stream(dai, substream->stream);
1828 dev_err(rtd->dev, "no stream found for DAI %s\n", dai->name);
1842 * sdw_release_stream() - Free the assigned stream runtime
1844 * @stream: SoundWire stream runtime
1846 * sdw_release_stream should be called only once per stream
1848 void sdw_release_stream(struct sdw_stream_runtime *stream)
1850 kfree(stream);
1855 * sdw_stream_add_master() - Allocate and add master runtime to a stream
1858 * @stream_config: Stream configuration for audio stream
1859 * @port_config: Port configuration for audio stream
1861 * @stream: SoundWire stream
1867 struct sdw_stream_runtime *stream)
1880 if (!bus->multi_link && stream->m_rt_count > 0) {
1891 m_rt = sdw_master_rt_find(bus, stream);
1893 m_rt = sdw_master_rt_alloc(bus, stream);
1895 dev_err(bus->dev, "%s: Master runtime alloc failed for stream:%s\n",
1896 __func__, stream->name);
1909 stream->m_rt_count++;
1916 ret = sdw_config_stream(bus->dev, stream, stream_config, false);
1929 sdw_master_rt_free(m_rt, stream);
1940 * @stream: SoundWire stream
1942 * This removes and frees port_rt and master_rt from a stream
1945 struct sdw_stream_runtime *stream)
1952 &stream->master_list, stream_node) {
1957 sdw_master_rt_free(m_rt, stream);
1958 stream->m_rt_count--;
1961 if (list_empty(&stream->master_list))
1962 stream->state = SDW_STREAM_RELEASED;
1971 * sdw_stream_add_slave() - Allocate and add master/slave runtime to a stream
1974 * @stream_config: Stream configuration for audio stream
1975 * @stream: SoundWire stream
1976 * @port_config: Port configuration for audio stream
1987 struct sdw_stream_runtime *stream)
2002 m_rt = sdw_master_rt_find(slave->bus, stream);
2008 m_rt = sdw_master_rt_alloc(slave->bus, stream);
2010 dev_err(&slave->dev, "%s: Master runtime alloc failed for stream:%s\n",
2011 __func__, stream->name);
2019 s_rt = sdw_slave_rt_find(slave, stream);
2023 dev_err(&slave->dev, "Slave runtime alloc failed for stream:%s\n",
2024 stream->name);
2046 ret = sdw_config_stream(&slave->dev, stream, stream_config, true);
2055 * Change stream state to CONFIGURED on first Slave add.
2056 * Bus is not aware of number of Slave(s) in a stream at this
2058 * change stream state to CONFIGURED.
2060 stream->state = SDW_STREAM_CONFIGURED;
2070 sdw_master_rt_free(m_rt, stream);
2072 sdw_slave_rt_free(slave, stream);
2083 * @stream: SoundWire stream
2085 * This removes and frees port_rt and slave_rt from a stream
2088 struct sdw_stream_runtime *stream)
2092 sdw_slave_port_free(slave, stream);
2093 sdw_slave_rt_free(slave, stream);