• Home
  • Raw
  • Download

Lines Matching full: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 in sdw_program_params()
620 * already-prepared stream otherwise. in sdw_program_params()
623 m_rt->stream->state == SDW_STREAM_CONFIGURED) in sdw_program_params()
641 if (m_rt->stream->state != SDW_STREAM_ENABLED) in sdw_program_params()
757 static int do_bank_switch(struct sdw_stream_runtime *stream) in do_bank_switch() argument
766 m_rt_count = stream->m_rt_count; in do_bank_switch()
768 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in do_bank_switch()
806 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in do_bank_switch()
844 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in do_bank_switch()
855 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in do_bank_switch()
866 * sdw_release_stream() - Free the assigned stream runtime
868 * @stream: SoundWire stream runtime
870 * sdw_release_stream should be called only once per stream
872 void sdw_release_stream(struct sdw_stream_runtime *stream) in sdw_release_stream() argument
874 kfree(stream); in sdw_release_stream()
879 * sdw_alloc_stream() - Allocate and return stream runtime
881 * @stream_name: SoundWire stream name
883 * Allocates a SoundWire stream runtime instance.
884 * sdw_alloc_stream should be called only once per stream. Typically
889 struct sdw_stream_runtime *stream; in sdw_alloc_stream() local
891 stream = kzalloc(sizeof(*stream), GFP_KERNEL); in sdw_alloc_stream()
892 if (!stream) in sdw_alloc_stream()
895 stream->name = stream_name; in sdw_alloc_stream()
896 INIT_LIST_HEAD(&stream->master_list); in sdw_alloc_stream()
897 stream->state = SDW_STREAM_ALLOCATED; in sdw_alloc_stream()
898 stream->m_rt_count = 0; in sdw_alloc_stream()
900 return stream; in sdw_alloc_stream()
906 struct sdw_stream_runtime *stream) in sdw_find_master_rt() argument
911 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in sdw_find_master_rt()
923 * @stream_config: Stream configuration
924 * @stream: Stream runtime handle.
931 struct sdw_stream_runtime *stream) in sdw_alloc_master_rt() argument
939 m_rt = sdw_find_master_rt(bus, stream); in sdw_alloc_master_rt()
950 list_add_tail(&m_rt->stream_node, &stream->master_list); in sdw_alloc_master_rt()
957 m_rt->stream = stream; in sdw_alloc_master_rt()
967 * @stream_config: Stream configuration
968 * @stream: Stream runtime handle
975 struct sdw_stream_runtime *stream) in sdw_alloc_slave_rt() argument
1004 struct sdw_stream_runtime *stream) in sdw_slave_port_release() argument
1010 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in sdw_slave_port_release()
1028 * @stream: Stream runtime handle.
1033 struct sdw_stream_runtime *stream) in sdw_release_slave_stream() argument
1038 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in sdw_release_slave_stream()
1055 * @stream: Stream runtime handle.
1063 struct sdw_stream_runtime *stream) in sdw_release_master_stream() argument
1068 sdw_slave_port_release(s_rt->slave->bus, s_rt->slave, stream); in sdw_release_master_stream()
1069 sdw_release_slave_stream(s_rt->slave, stream); in sdw_release_master_stream()
1081 * @stream: SoundWire stream
1083 * This removes and frees port_rt and master_rt from a stream
1086 struct sdw_stream_runtime *stream) in sdw_stream_remove_master() argument
1093 &stream->master_list, stream_node) { in sdw_stream_remove_master()
1098 sdw_release_master_stream(m_rt, stream); in sdw_stream_remove_master()
1099 stream->m_rt_count--; in sdw_stream_remove_master()
1102 if (list_empty(&stream->master_list)) in sdw_stream_remove_master()
1103 stream->state = SDW_STREAM_RELEASED; in sdw_stream_remove_master()
1115 * @stream: SoundWire stream
1117 * This removes and frees port_rt and slave_rt from a stream
1120 struct sdw_stream_runtime *stream) in sdw_stream_remove_slave() argument
1124 sdw_slave_port_release(slave->bus, slave, stream); in sdw_stream_remove_slave()
1125 sdw_release_slave_stream(slave, stream); in sdw_stream_remove_slave()
1134 * sdw_config_stream() - Configure the allocated stream
1137 * @stream: SoundWire stream
1138 * @stream_config: Stream configuration for audio stream
1144 struct sdw_stream_runtime *stream, in sdw_config_stream() argument
1149 * Update the stream rate, channel and bps based on data in sdw_config_stream()
1151 * match the rate, bps, stream type and increment number of channels. in sdw_config_stream()
1154 * comparison and allow the value to be set and stored in stream in sdw_config_stream()
1156 if (stream->params.rate && in sdw_config_stream()
1157 stream->params.rate != stream_config->frame_rate) { in sdw_config_stream()
1158 dev_err(dev, "rate not matching, stream:%s\n", stream->name); in sdw_config_stream()
1162 if (stream->params.bps && in sdw_config_stream()
1163 stream->params.bps != stream_config->bps) { in sdw_config_stream()
1164 dev_err(dev, "bps not matching, stream:%s\n", stream->name); in sdw_config_stream()
1168 stream->type = stream_config->type; in sdw_config_stream()
1169 stream->params.rate = stream_config->frame_rate; in sdw_config_stream()
1170 stream->params.bps = stream_config->bps; in sdw_config_stream()
1174 stream->params.ch_count += stream_config->ch_count; in sdw_config_stream()
1269 * sdw_stream_add_master() - Allocate and add master runtime to a stream
1272 * @stream_config: Stream configuration for audio stream
1273 * @port_config: Port configuration for audio stream
1275 * @stream: SoundWire stream
1281 struct sdw_stream_runtime *stream) in sdw_stream_add_master() argument
1293 if (!bus->multi_link && stream->m_rt_count > 0) { in sdw_stream_add_master()
1300 m_rt = sdw_alloc_master_rt(bus, stream_config, stream); in sdw_stream_add_master()
1303 "Master runtime config failed for stream:%s\n", in sdw_stream_add_master()
1304 stream->name); in sdw_stream_add_master()
1309 ret = sdw_config_stream(bus->dev, stream, stream_config, false); in sdw_stream_add_master()
1317 stream->m_rt_count++; in sdw_stream_add_master()
1322 sdw_release_master_stream(m_rt, stream); in sdw_stream_add_master()
1330 * sdw_stream_add_slave() - Allocate and add master/slave runtime to a stream
1333 * @stream_config: Stream configuration for audio stream
1334 * @stream: SoundWire stream
1335 * @port_config: Port configuration for audio stream
1339 * to the Stream.
1346 struct sdw_stream_runtime *stream) in sdw_stream_add_slave() argument
1358 m_rt = sdw_alloc_master_rt(slave->bus, stream_config, stream); in sdw_stream_add_slave()
1361 "alloc master runtime failed for stream:%s\n", in sdw_stream_add_slave()
1362 stream->name); in sdw_stream_add_slave()
1367 s_rt = sdw_alloc_slave_rt(slave, stream_config, stream); in sdw_stream_add_slave()
1370 "Slave runtime config failed for stream:%s\n", in sdw_stream_add_slave()
1371 stream->name); in sdw_stream_add_slave()
1376 ret = sdw_config_stream(&slave->dev, stream, stream_config, true); in sdw_stream_add_slave()
1395 * Change stream state to CONFIGURED on first Slave add. in sdw_stream_add_slave()
1396 * Bus is not aware of number of Slave(s) in a stream at this in sdw_stream_add_slave()
1398 * change stream state to CONFIGURED. in sdw_stream_add_slave()
1400 stream->state = SDW_STREAM_CONFIGURED; in sdw_stream_add_slave()
1405 * we hit error so cleanup the stream, release all Slave(s) and in sdw_stream_add_slave()
1408 sdw_release_master_stream(m_rt, stream); in sdw_stream_add_slave()
1449 * @stream: SoundWire stream
1452 * stream to reconfigure the bus.
1453 * NOTE: This function is called from SoundWire stream ops and is
1456 static void sdw_acquire_bus_lock(struct sdw_stream_runtime *stream) in sdw_acquire_bus_lock() argument
1462 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in sdw_acquire_bus_lock()
1472 * @stream: SoundWire stream
1475 * NOTE: This function is called from SoundWire stream ops and is
1478 static void sdw_release_bus_lock(struct sdw_stream_runtime *stream) in sdw_release_bus_lock() argument
1484 list_for_each_entry_reverse(m_rt, &stream->master_list, stream_node) { in sdw_release_bus_lock()
1490 static int _sdw_prepare_stream(struct sdw_stream_runtime *stream, in _sdw_prepare_stream() argument
1499 /* Prepare Master(s) and Slave(s) port(s) associated with stream */ in _sdw_prepare_stream()
1500 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in _sdw_prepare_stream()
1506 if ((prop->max_clk_freq % stream->params.rate) != 0) { in _sdw_prepare_stream()
1516 bus->params.bandwidth += m_rt->stream->params.rate * in _sdw_prepare_stream()
1517 m_rt->ch_count * m_rt->stream->params.bps; in _sdw_prepare_stream()
1543 ret = do_bank_switch(stream); in _sdw_prepare_stream()
1549 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in _sdw_prepare_stream()
1561 stream->state = SDW_STREAM_PREPARED; in _sdw_prepare_stream()
1571 * sdw_prepare_stream() - Prepare SoundWire stream
1573 * @stream: Soundwire stream
1575 * Documentation/driver-api/soundwire/stream.rst explains this API in detail
1577 int sdw_prepare_stream(struct sdw_stream_runtime *stream) in sdw_prepare_stream() argument
1582 if (!stream) { in sdw_prepare_stream()
1583 pr_err("SoundWire: Handle not found for stream\n"); in sdw_prepare_stream()
1587 sdw_acquire_bus_lock(stream); in sdw_prepare_stream()
1589 if (stream->state == SDW_STREAM_PREPARED) { in sdw_prepare_stream()
1594 if (stream->state != SDW_STREAM_CONFIGURED && in sdw_prepare_stream()
1595 stream->state != SDW_STREAM_DEPREPARED && in sdw_prepare_stream()
1596 stream->state != SDW_STREAM_DISABLED) { in sdw_prepare_stream()
1598 __func__, stream->name, stream->state); in sdw_prepare_stream()
1604 * when the stream is DISABLED, this means sdw_prepare_stream() in sdw_prepare_stream()
1609 if (stream->state == SDW_STREAM_DISABLED) in sdw_prepare_stream()
1612 ret = _sdw_prepare_stream(stream, update_params); in sdw_prepare_stream()
1615 sdw_release_bus_lock(stream); in sdw_prepare_stream()
1620 static int _sdw_enable_stream(struct sdw_stream_runtime *stream) in _sdw_enable_stream() argument
1626 /* Enable Master(s) and Slave(s) port(s) associated with stream */ in _sdw_enable_stream()
1627 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in _sdw_enable_stream()
1651 ret = do_bank_switch(stream); in _sdw_enable_stream()
1657 stream->state = SDW_STREAM_ENABLED; in _sdw_enable_stream()
1662 * sdw_enable_stream() - Enable SoundWire stream
1664 * @stream: Soundwire stream
1666 * Documentation/driver-api/soundwire/stream.rst explains this API in detail
1668 int sdw_enable_stream(struct sdw_stream_runtime *stream) in sdw_enable_stream() argument
1672 if (!stream) { in sdw_enable_stream()
1673 pr_err("SoundWire: Handle not found for stream\n"); in sdw_enable_stream()
1677 sdw_acquire_bus_lock(stream); in sdw_enable_stream()
1679 if (stream->state != SDW_STREAM_PREPARED && in sdw_enable_stream()
1680 stream->state != SDW_STREAM_DISABLED) { in sdw_enable_stream()
1682 __func__, stream->name, stream->state); in sdw_enable_stream()
1687 ret = _sdw_enable_stream(stream); in sdw_enable_stream()
1690 sdw_release_bus_lock(stream); in sdw_enable_stream()
1695 static int _sdw_disable_stream(struct sdw_stream_runtime *stream) in _sdw_disable_stream() argument
1700 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in _sdw_disable_stream()
1710 stream->state = SDW_STREAM_DISABLED; in _sdw_disable_stream()
1712 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in _sdw_disable_stream()
1723 ret = do_bank_switch(stream); in _sdw_disable_stream()
1730 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in _sdw_disable_stream()
1745 * sdw_disable_stream() - Disable SoundWire stream
1747 * @stream: Soundwire stream
1749 * Documentation/driver-api/soundwire/stream.rst explains this API in detail
1751 int sdw_disable_stream(struct sdw_stream_runtime *stream) in sdw_disable_stream() argument
1755 if (!stream) { in sdw_disable_stream()
1756 pr_err("SoundWire: Handle not found for stream\n"); in sdw_disable_stream()
1760 sdw_acquire_bus_lock(stream); in sdw_disable_stream()
1762 if (stream->state != SDW_STREAM_ENABLED) { in sdw_disable_stream()
1764 __func__, stream->name, stream->state); in sdw_disable_stream()
1769 ret = _sdw_disable_stream(stream); in sdw_disable_stream()
1772 sdw_release_bus_lock(stream); in sdw_disable_stream()
1777 static int _sdw_deprepare_stream(struct sdw_stream_runtime *stream) in _sdw_deprepare_stream() argument
1783 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in _sdw_deprepare_stream()
1794 bus->params.bandwidth -= m_rt->stream->params.rate * in _sdw_deprepare_stream()
1795 m_rt->ch_count * m_rt->stream->params.bps; in _sdw_deprepare_stream()
1815 stream->state = SDW_STREAM_DEPREPARED; in _sdw_deprepare_stream()
1816 return do_bank_switch(stream); in _sdw_deprepare_stream()
1820 * sdw_deprepare_stream() - Deprepare SoundWire stream
1822 * @stream: Soundwire stream
1824 * Documentation/driver-api/soundwire/stream.rst explains this API in detail
1826 int sdw_deprepare_stream(struct sdw_stream_runtime *stream) in sdw_deprepare_stream() argument
1830 if (!stream) { in sdw_deprepare_stream()
1831 pr_err("SoundWire: Handle not found for stream\n"); in sdw_deprepare_stream()
1835 sdw_acquire_bus_lock(stream); in sdw_deprepare_stream()
1837 if (stream->state != SDW_STREAM_PREPARED && in sdw_deprepare_stream()
1838 stream->state != SDW_STREAM_DISABLED) { in sdw_deprepare_stream()
1840 __func__, stream->name, stream->state); in sdw_deprepare_stream()
1845 ret = _sdw_deprepare_stream(stream); in sdw_deprepare_stream()
1848 sdw_release_bus_lock(stream); in sdw_deprepare_stream()
1861 /* Set stream pointer on all DAIs */ in set_stream()
1863 ret = snd_soc_dai_set_stream(dai, sdw_stream, substream->stream); in set_stream()
1865 dev_err(rtd->dev, "failed to set stream pointer on dai %s", dai->name); in set_stream()
1874 * sdw_startup_stream() - Startup SoundWire stream
1876 * @sdw_substream: Soundwire stream
1878 * Documentation/driver-api/soundwire/stream.rst explains this API in detail
1888 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) in sdw_startup_stream()
1898 dev_err(rtd->dev, "alloc stream failed for substream DAI %s", substream->name); in sdw_startup_stream()
1918 * sdw_shutdown_stream() - Shutdown SoundWire stream
1920 * @sdw_substream: Soundwire stream
1922 * Documentation/driver-api/soundwire/stream.rst explains this API in detail
1931 /* Find stream from first CPU DAI */ in sdw_shutdown_stream()
1934 sdw_stream = snd_soc_dai_get_stream(dai, substream->stream); in sdw_shutdown_stream()
1937 dev_err(rtd->dev, "no stream found for DAI %s", dai->name); in sdw_shutdown_stream()