Lines Matching defs:stream
5 * stream.c - SoundWire Bus stream operations.
260 * @m_rt: Master stream runtime
368 * @m_rt: Master stream runtime
619 * explicitly preparing a stream or handling an
620 * already-prepared stream otherwise.
623 m_rt->stream->state == SDW_STREAM_CONFIGURED)
641 if (m_rt->stream->state != SDW_STREAM_ENABLED)
727 * @multi_link: whether this is a multi-link stream with hardware-based sync
758 static int do_bank_switch(struct sdw_stream_runtime *stream)
767 m_rt_count = stream->m_rt_count;
769 list_for_each_entry(m_rt, &stream->master_list, stream_node) {
807 list_for_each_entry(m_rt, &stream->master_list, stream_node) {
845 list_for_each_entry(m_rt, &stream->master_list, stream_node) {
856 list_for_each_entry(m_rt, &stream->master_list, stream_node) {
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)
875 kfree(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;
892 stream = kzalloc(sizeof(*stream), GFP_KERNEL);
893 if (!stream)
896 stream->name = stream_name;
897 INIT_LIST_HEAD(&stream->master_list);
898 stream->state = SDW_STREAM_ALLOCATED;
899 stream->m_rt_count = 0;
901 return stream;
907 struct sdw_stream_runtime *stream)
912 list_for_each_entry(m_rt, &stream->master_list, stream_node) {
925 * @stream: Stream runtime handle.
932 struct sdw_stream_runtime *stream)
940 m_rt = sdw_find_master_rt(bus, stream);
951 list_add_tail(&m_rt->stream_node, &stream->master_list);
958 m_rt->stream = stream;
969 * @stream: Stream runtime handle
976 struct sdw_stream_runtime *stream)
1005 struct sdw_stream_runtime *stream)
1011 list_for_each_entry(m_rt, &stream->master_list, stream_node) {
1029 * @stream: Stream runtime handle.
1034 struct sdw_stream_runtime *stream)
1039 list_for_each_entry(m_rt, &stream->master_list, stream_node) {
1056 * @stream: Stream runtime handle.
1064 struct sdw_stream_runtime *stream)
1069 sdw_slave_port_release(s_rt->slave->bus, s_rt->slave, stream);
1070 sdw_release_slave_stream(s_rt->slave, stream);
1082 * @stream: SoundWire stream
1084 * This removes and frees port_rt and master_rt from a stream
1087 struct sdw_stream_runtime *stream)
1094 &stream->master_list, stream_node) {
1099 sdw_release_master_stream(m_rt, stream);
1100 stream->m_rt_count--;
1103 if (list_empty(&stream->master_list))
1104 stream->state = SDW_STREAM_RELEASED;
1116 * @stream: SoundWire stream
1118 * This removes and frees port_rt and slave_rt from a stream
1121 struct sdw_stream_runtime *stream)
1125 sdw_slave_port_release(slave->bus, slave, stream);
1126 sdw_release_slave_stream(slave, stream);
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,
1150 * Update the stream rate, channel and bps based on data
1152 * match the rate, bps, stream type and increment number of channels.
1155 * comparison and allow the value to be set and stored in stream
1157 if (stream->params.rate &&
1158 stream->params.rate != stream_config->frame_rate) {
1159 dev_err(dev, "rate not matching, stream:%s\n", stream->name);
1163 if (stream->params.bps &&
1164 stream->params.bps != stream_config->bps) {
1165 dev_err(dev, "bps not matching, stream:%s\n", stream->name);
1169 stream->type = stream_config->type;
1170 stream->params.rate = stream_config->frame_rate;
1171 stream->params.bps = stream_config->bps;
1175 stream->params.ch_count += stream_config->ch_count;
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)
1294 if (!bus->multi_link && stream->m_rt_count > 0) {
1301 m_rt = sdw_alloc_master_rt(bus, stream_config, stream);
1304 "Master runtime config failed for stream:%s\n",
1305 stream->name);
1310 ret = sdw_config_stream(bus->dev, stream, stream_config, false);
1318 stream->m_rt_count++;
1323 sdw_release_master_stream(m_rt, stream);
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
1347 struct sdw_stream_runtime *stream)
1359 m_rt = sdw_alloc_master_rt(slave->bus, stream_config, stream);
1362 "alloc master runtime failed for stream:%s\n",
1363 stream->name);
1368 s_rt = sdw_alloc_slave_rt(slave, stream_config, stream);
1371 "Slave runtime config failed for stream:%s\n",
1372 stream->name);
1377 ret = sdw_config_stream(&slave->dev, stream, stream_config, true);
1396 * Change stream state to CONFIGURED on first Slave add.
1397 * Bus is not aware of number of Slave(s) in a stream at this
1399 * change stream state to CONFIGURED.
1401 stream->state = SDW_STREAM_CONFIGURED;
1406 * we hit error so cleanup the stream, release all Slave(s) and
1409 sdw_release_master_stream(m_rt, stream);
1450 * @stream: SoundWire stream
1453 * stream to reconfigure the bus.
1454 * NOTE: This function is called from SoundWire stream ops and is
1457 static void sdw_acquire_bus_lock(struct sdw_stream_runtime *stream)
1463 list_for_each_entry(m_rt, &stream->master_list, stream_node) {
1473 * @stream: SoundWire stream
1476 * NOTE: This function is called from SoundWire stream ops and is
1479 static void sdw_release_bus_lock(struct sdw_stream_runtime *stream)
1485 list_for_each_entry_reverse(m_rt, &stream->master_list, stream_node) {
1491 static int _sdw_prepare_stream(struct sdw_stream_runtime *stream,
1500 /* Prepare Master(s) and Slave(s) port(s) associated with stream */
1501 list_for_each_entry(m_rt, &stream->master_list, stream_node) {
1507 if ((prop->max_clk_freq % stream->params.rate) != 0) {
1517 bus->params.bandwidth += m_rt->stream->params.rate *
1518 m_rt->ch_count * m_rt->stream->params.bps;
1544 ret = do_bank_switch(stream);
1550 list_for_each_entry(m_rt, &stream->master_list, stream_node) {
1562 stream->state = SDW_STREAM_PREPARED;
1572 * sdw_prepare_stream() - Prepare SoundWire stream
1574 * @stream: Soundwire stream
1576 * Documentation/driver-api/soundwire/stream.rst explains this API in detail
1578 int sdw_prepare_stream(struct sdw_stream_runtime *stream)
1583 if (!stream) {
1584 pr_err("SoundWire: Handle not found for stream\n");
1588 sdw_acquire_bus_lock(stream);
1590 if (stream->state == SDW_STREAM_PREPARED) {
1595 if (stream->state != SDW_STREAM_CONFIGURED &&
1596 stream->state != SDW_STREAM_DEPREPARED &&
1597 stream->state != SDW_STREAM_DISABLED) {
1599 __func__, stream->name, stream->state);
1605 * when the stream is DISABLED, this means sdw_prepare_stream()
1610 if (stream->state == SDW_STREAM_DISABLED)
1613 ret = _sdw_prepare_stream(stream, update_params);
1616 sdw_release_bus_lock(stream);
1621 static int _sdw_enable_stream(struct sdw_stream_runtime *stream)
1627 /* Enable Master(s) and Slave(s) port(s) associated with stream */
1628 list_for_each_entry(m_rt, &stream->master_list, stream_node) {
1652 ret = do_bank_switch(stream);
1658 stream->state = SDW_STREAM_ENABLED;
1663 * sdw_enable_stream() - Enable SoundWire stream
1665 * @stream: Soundwire stream
1667 * Documentation/driver-api/soundwire/stream.rst explains this API in detail
1669 int sdw_enable_stream(struct sdw_stream_runtime *stream)
1673 if (!stream) {
1674 pr_err("SoundWire: Handle not found for stream\n");
1678 sdw_acquire_bus_lock(stream);
1680 if (stream->state != SDW_STREAM_PREPARED &&
1681 stream->state != SDW_STREAM_DISABLED) {
1683 __func__, stream->name, stream->state);
1688 ret = _sdw_enable_stream(stream);
1691 sdw_release_bus_lock(stream);
1696 static int _sdw_disable_stream(struct sdw_stream_runtime *stream)
1701 list_for_each_entry(m_rt, &stream->master_list, stream_node) {
1711 stream->state = SDW_STREAM_DISABLED;
1713 list_for_each_entry(m_rt, &stream->master_list, stream_node) {
1724 ret = do_bank_switch(stream);
1731 list_for_each_entry(m_rt, &stream->master_list, stream_node) {
1746 * sdw_disable_stream() - Disable SoundWire stream
1748 * @stream: Soundwire stream
1750 * Documentation/driver-api/soundwire/stream.rst explains this API in detail
1752 int sdw_disable_stream(struct sdw_stream_runtime *stream)
1756 if (!stream) {
1757 pr_err("SoundWire: Handle not found for stream\n");
1761 sdw_acquire_bus_lock(stream);
1763 if (stream->state != SDW_STREAM_ENABLED) {
1765 __func__, stream->name, stream->state);
1770 ret = _sdw_disable_stream(stream);
1773 sdw_release_bus_lock(stream);
1778 static int _sdw_deprepare_stream(struct sdw_stream_runtime *stream)
1784 list_for_each_entry(m_rt, &stream->master_list, stream_node) {
1795 bus->params.bandwidth -= m_rt->stream->params.rate *
1796 m_rt->ch_count * m_rt->stream->params.bps;
1816 stream->state = SDW_STREAM_DEPREPARED;
1817 return do_bank_switch(stream);
1821 * sdw_deprepare_stream() - Deprepare SoundWire stream
1823 * @stream: Soundwire stream
1825 * Documentation/driver-api/soundwire/stream.rst explains this API in detail
1827 int sdw_deprepare_stream(struct sdw_stream_runtime *stream)
1831 if (!stream) {
1832 pr_err("SoundWire: Handle not found for stream\n");
1836 sdw_acquire_bus_lock(stream);
1838 if (stream->state != SDW_STREAM_PREPARED &&
1839 stream->state != SDW_STREAM_DISABLED) {
1841 __func__, stream->name, stream->state);
1846 ret = _sdw_deprepare_stream(stream);
1849 sdw_release_bus_lock(stream);
1862 /* Set stream pointer on all DAIs */
1864 ret = snd_soc_dai_set_stream(dai, sdw_stream, substream->stream);
1866 dev_err(rtd->dev, "failed to set stream pointer on dai %s", dai->name);
1875 * sdw_startup_stream() - Startup SoundWire stream
1877 * @sdw_substream: Soundwire stream
1879 * Documentation/driver-api/soundwire/stream.rst explains this API in detail
1889 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
1899 dev_err(rtd->dev, "alloc stream failed for substream DAI %s", substream->name);
1919 * sdw_shutdown_stream() - Shutdown SoundWire stream
1921 * @sdw_substream: Soundwire stream
1923 * Documentation/driver-api/soundwire/stream.rst explains this API in detail
1932 /* Find stream from first CPU DAI */
1935 sdw_stream = snd_soc_dai_get_stream(dai, substream->stream);
1938 dev_err(rtd->dev, "no stream found for DAI %s", dai->name);