Lines Matching full:stream

5  *  stream.c - SoundWire Bus stream operations.
263 * @m_rt: Master stream runtime
371 * @m_rt: Master stream runtime
622 * explicitly preparing a stream or handling an in sdw_program_params()
623 * already-prepared stream otherwise. in sdw_program_params()
626 m_rt->stream->state == SDW_STREAM_CONFIGURED) in sdw_program_params()
644 if (m_rt->stream->state != SDW_STREAM_ENABLED) in sdw_program_params()
760 static int do_bank_switch(struct sdw_stream_runtime *stream) in do_bank_switch() argument
769 m_rt_count = stream->m_rt_count; in do_bank_switch()
771 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in do_bank_switch()
809 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in do_bank_switch()
847 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in do_bank_switch()
858 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in do_bank_switch()
869 * sdw_release_stream() - Free the assigned stream runtime
871 * @stream: SoundWire stream runtime
873 * sdw_release_stream should be called only once per stream
875 void sdw_release_stream(struct sdw_stream_runtime *stream) in sdw_release_stream() argument
877 kfree(stream); in sdw_release_stream()
882 * sdw_alloc_stream() - Allocate and return stream runtime
884 * @stream_name: SoundWire stream name
886 * Allocates a SoundWire stream runtime instance.
887 * sdw_alloc_stream should be called only once per stream. Typically
892 struct sdw_stream_runtime *stream; in sdw_alloc_stream() local
894 stream = kzalloc(sizeof(*stream), GFP_KERNEL); in sdw_alloc_stream()
895 if (!stream) in sdw_alloc_stream()
898 stream->name = stream_name; in sdw_alloc_stream()
899 INIT_LIST_HEAD(&stream->master_list); in sdw_alloc_stream()
900 stream->state = SDW_STREAM_ALLOCATED; in sdw_alloc_stream()
901 stream->m_rt_count = 0; in sdw_alloc_stream()
903 return stream; in sdw_alloc_stream()
909 struct sdw_stream_runtime *stream) in sdw_find_master_rt() argument
914 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in sdw_find_master_rt()
926 * @stream_config: Stream configuration
927 * @stream: Stream runtime handle.
934 struct sdw_stream_runtime *stream) in sdw_alloc_master_rt() argument
942 m_rt = sdw_find_master_rt(bus, stream); in sdw_alloc_master_rt()
953 list_add_tail(&m_rt->stream_node, &stream->master_list); in sdw_alloc_master_rt()
960 m_rt->stream = stream; in sdw_alloc_master_rt()
970 * @stream_config: Stream configuration
971 * @stream: Stream runtime handle
978 struct sdw_stream_runtime *stream) in sdw_alloc_slave_rt() argument
1007 struct sdw_stream_runtime *stream) in sdw_slave_port_release() argument
1013 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in sdw_slave_port_release()
1031 * @stream: Stream runtime handle.
1036 struct sdw_stream_runtime *stream) in sdw_release_slave_stream() argument
1041 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in sdw_release_slave_stream()
1058 * @stream: Stream runtime handle.
1066 struct sdw_stream_runtime *stream) in sdw_release_master_stream() argument
1071 sdw_slave_port_release(s_rt->slave->bus, s_rt->slave, stream); in sdw_release_master_stream()
1072 sdw_release_slave_stream(s_rt->slave, stream); in sdw_release_master_stream()
1084 * @stream: SoundWire stream
1086 * This removes and frees port_rt and master_rt from a stream
1089 struct sdw_stream_runtime *stream) in sdw_stream_remove_master() argument
1096 &stream->master_list, stream_node) { in sdw_stream_remove_master()
1101 sdw_release_master_stream(m_rt, stream); in sdw_stream_remove_master()
1102 stream->m_rt_count--; in sdw_stream_remove_master()
1105 if (list_empty(&stream->master_list)) in sdw_stream_remove_master()
1106 stream->state = SDW_STREAM_RELEASED; in sdw_stream_remove_master()
1118 * @stream: SoundWire stream
1120 * This removes and frees port_rt and slave_rt from a stream
1123 struct sdw_stream_runtime *stream) in sdw_stream_remove_slave() argument
1127 sdw_slave_port_release(slave->bus, slave, stream); in sdw_stream_remove_slave()
1128 sdw_release_slave_stream(slave, stream); in sdw_stream_remove_slave()
1137 * sdw_config_stream() - Configure the allocated stream
1140 * @stream: SoundWire stream
1141 * @stream_config: Stream configuration for audio stream
1147 struct sdw_stream_runtime *stream, in sdw_config_stream() argument
1152 * Update the stream rate, channel and bps based on data in sdw_config_stream()
1154 * match the rate, bps, stream type and increment number of channels. in sdw_config_stream()
1157 * comparison and allow the value to be set and stored in stream in sdw_config_stream()
1159 if (stream->params.rate && in sdw_config_stream()
1160 stream->params.rate != stream_config->frame_rate) { in sdw_config_stream()
1161 dev_err(dev, "rate not matching, stream:%s\n", stream->name); in sdw_config_stream()
1165 if (stream->params.bps && in sdw_config_stream()
1166 stream->params.bps != stream_config->bps) { in sdw_config_stream()
1167 dev_err(dev, "bps not matching, stream:%s\n", stream->name); in sdw_config_stream()
1171 stream->type = stream_config->type; in sdw_config_stream()
1172 stream->params.rate = stream_config->frame_rate; in sdw_config_stream()
1173 stream->params.bps = stream_config->bps; in sdw_config_stream()
1177 stream->params.ch_count += stream_config->ch_count; in sdw_config_stream()
1272 * sdw_stream_add_master() - Allocate and add master runtime to a stream
1275 * @stream_config: Stream configuration for audio stream
1276 * @port_config: Port configuration for audio stream
1278 * @stream: SoundWire stream
1284 struct sdw_stream_runtime *stream) in sdw_stream_add_master() argument
1296 if (!bus->multi_link && stream->m_rt_count > 0) { in sdw_stream_add_master()
1303 m_rt = sdw_alloc_master_rt(bus, stream_config, stream); in sdw_stream_add_master()
1306 "Master runtime config failed for stream:%s\n", in sdw_stream_add_master()
1307 stream->name); in sdw_stream_add_master()
1312 ret = sdw_config_stream(bus->dev, stream, stream_config, false); in sdw_stream_add_master()
1320 stream->m_rt_count++; in sdw_stream_add_master()
1325 sdw_release_master_stream(m_rt, stream); in sdw_stream_add_master()
1333 * sdw_stream_add_slave() - Allocate and add master/slave runtime to a stream
1336 * @stream_config: Stream configuration for audio stream
1337 * @stream: SoundWire stream
1338 * @port_config: Port configuration for audio stream
1342 * to the Stream.
1349 struct sdw_stream_runtime *stream) in sdw_stream_add_slave() argument
1361 m_rt = sdw_alloc_master_rt(slave->bus, stream_config, stream); in sdw_stream_add_slave()
1364 "alloc master runtime failed for stream:%s\n", in sdw_stream_add_slave()
1365 stream->name); in sdw_stream_add_slave()
1370 s_rt = sdw_alloc_slave_rt(slave, stream_config, stream); in sdw_stream_add_slave()
1373 "Slave runtime config failed for stream:%s\n", in sdw_stream_add_slave()
1374 stream->name); in sdw_stream_add_slave()
1379 ret = sdw_config_stream(&slave->dev, stream, stream_config, true); in sdw_stream_add_slave()
1398 * Change stream state to CONFIGURED on first Slave add. in sdw_stream_add_slave()
1399 * Bus is not aware of number of Slave(s) in a stream at this in sdw_stream_add_slave()
1401 * change stream state to CONFIGURED. in sdw_stream_add_slave()
1403 stream->state = SDW_STREAM_CONFIGURED; in sdw_stream_add_slave()
1408 * we hit error so cleanup the stream, release all Slave(s) and in sdw_stream_add_slave()
1411 sdw_release_master_stream(m_rt, stream); in sdw_stream_add_slave()
1452 * @stream: SoundWire stream
1455 * stream to reconfigure the bus.
1456 * NOTE: This function is called from SoundWire stream ops and is
1459 static void sdw_acquire_bus_lock(struct sdw_stream_runtime *stream) in sdw_acquire_bus_lock() argument
1465 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in sdw_acquire_bus_lock()
1475 * @stream: SoundWire stream
1478 * NOTE: This function is called from SoundWire stream ops and is
1481 static void sdw_release_bus_lock(struct sdw_stream_runtime *stream) in sdw_release_bus_lock() argument
1487 list_for_each_entry_reverse(m_rt, &stream->master_list, stream_node) { in sdw_release_bus_lock()
1493 static int _sdw_prepare_stream(struct sdw_stream_runtime *stream, in _sdw_prepare_stream() argument
1502 /* Prepare Master(s) and Slave(s) port(s) associated with stream */ in _sdw_prepare_stream()
1503 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in _sdw_prepare_stream()
1509 if ((prop->max_clk_freq % stream->params.rate) != 0) { in _sdw_prepare_stream()
1519 bus->params.bandwidth += m_rt->stream->params.rate * in _sdw_prepare_stream()
1520 m_rt->ch_count * m_rt->stream->params.bps; in _sdw_prepare_stream()
1546 ret = do_bank_switch(stream); in _sdw_prepare_stream()
1552 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in _sdw_prepare_stream()
1564 stream->state = SDW_STREAM_PREPARED; in _sdw_prepare_stream()
1574 * sdw_prepare_stream() - Prepare SoundWire stream
1576 * @stream: Soundwire stream
1578 * Documentation/driver-api/soundwire/stream.rst explains this API in detail
1580 int sdw_prepare_stream(struct sdw_stream_runtime *stream) in sdw_prepare_stream() argument
1585 if (!stream) { in sdw_prepare_stream()
1586 pr_err("SoundWire: Handle not found for stream\n"); in sdw_prepare_stream()
1590 sdw_acquire_bus_lock(stream); in sdw_prepare_stream()
1592 if (stream->state == SDW_STREAM_PREPARED) { in sdw_prepare_stream()
1597 if (stream->state != SDW_STREAM_CONFIGURED && in sdw_prepare_stream()
1598 stream->state != SDW_STREAM_DEPREPARED && in sdw_prepare_stream()
1599 stream->state != SDW_STREAM_DISABLED) { in sdw_prepare_stream()
1601 __func__, stream->name, stream->state); in sdw_prepare_stream()
1607 * when the stream is DISABLED, this means sdw_prepare_stream() in sdw_prepare_stream()
1612 if (stream->state == SDW_STREAM_DISABLED) in sdw_prepare_stream()
1615 ret = _sdw_prepare_stream(stream, update_params); in sdw_prepare_stream()
1618 sdw_release_bus_lock(stream); in sdw_prepare_stream()
1623 static int _sdw_enable_stream(struct sdw_stream_runtime *stream) in _sdw_enable_stream() argument
1629 /* Enable Master(s) and Slave(s) port(s) associated with stream */ in _sdw_enable_stream()
1630 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in _sdw_enable_stream()
1654 ret = do_bank_switch(stream); in _sdw_enable_stream()
1660 stream->state = SDW_STREAM_ENABLED; in _sdw_enable_stream()
1665 * sdw_enable_stream() - Enable SoundWire stream
1667 * @stream: Soundwire stream
1669 * Documentation/driver-api/soundwire/stream.rst explains this API in detail
1671 int sdw_enable_stream(struct sdw_stream_runtime *stream) in sdw_enable_stream() argument
1675 if (!stream) { in sdw_enable_stream()
1676 pr_err("SoundWire: Handle not found for stream\n"); in sdw_enable_stream()
1680 sdw_acquire_bus_lock(stream); in sdw_enable_stream()
1682 if (stream->state != SDW_STREAM_PREPARED && in sdw_enable_stream()
1683 stream->state != SDW_STREAM_DISABLED) { in sdw_enable_stream()
1685 __func__, stream->name, stream->state); in sdw_enable_stream()
1690 ret = _sdw_enable_stream(stream); in sdw_enable_stream()
1693 sdw_release_bus_lock(stream); in sdw_enable_stream()
1698 static int _sdw_disable_stream(struct sdw_stream_runtime *stream) in _sdw_disable_stream() argument
1703 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in _sdw_disable_stream()
1713 stream->state = SDW_STREAM_DISABLED; in _sdw_disable_stream()
1715 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in _sdw_disable_stream()
1726 ret = do_bank_switch(stream); in _sdw_disable_stream()
1733 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in _sdw_disable_stream()
1748 * sdw_disable_stream() - Disable SoundWire stream
1750 * @stream: Soundwire stream
1752 * Documentation/driver-api/soundwire/stream.rst explains this API in detail
1754 int sdw_disable_stream(struct sdw_stream_runtime *stream) in sdw_disable_stream() argument
1758 if (!stream) { in sdw_disable_stream()
1759 pr_err("SoundWire: Handle not found for stream\n"); in sdw_disable_stream()
1763 sdw_acquire_bus_lock(stream); in sdw_disable_stream()
1765 if (stream->state != SDW_STREAM_ENABLED) { in sdw_disable_stream()
1767 __func__, stream->name, stream->state); in sdw_disable_stream()
1772 ret = _sdw_disable_stream(stream); in sdw_disable_stream()
1775 sdw_release_bus_lock(stream); in sdw_disable_stream()
1780 static int _sdw_deprepare_stream(struct sdw_stream_runtime *stream) in _sdw_deprepare_stream() argument
1786 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in _sdw_deprepare_stream()
1797 bus->params.bandwidth -= m_rt->stream->params.rate * in _sdw_deprepare_stream()
1798 m_rt->ch_count * m_rt->stream->params.bps; in _sdw_deprepare_stream()
1818 stream->state = SDW_STREAM_DEPREPARED; in _sdw_deprepare_stream()
1819 return do_bank_switch(stream); in _sdw_deprepare_stream()
1823 * sdw_deprepare_stream() - Deprepare SoundWire stream
1825 * @stream: Soundwire stream
1827 * Documentation/driver-api/soundwire/stream.rst explains this API in detail
1829 int sdw_deprepare_stream(struct sdw_stream_runtime *stream) in sdw_deprepare_stream() argument
1833 if (!stream) { in sdw_deprepare_stream()
1834 pr_err("SoundWire: Handle not found for stream\n"); in sdw_deprepare_stream()
1838 sdw_acquire_bus_lock(stream); in sdw_deprepare_stream()
1840 if (stream->state != SDW_STREAM_PREPARED && in sdw_deprepare_stream()
1841 stream->state != SDW_STREAM_DISABLED) { in sdw_deprepare_stream()
1843 __func__, stream->name, stream->state); in sdw_deprepare_stream()
1848 ret = _sdw_deprepare_stream(stream); in sdw_deprepare_stream()
1851 sdw_release_bus_lock(stream); in sdw_deprepare_stream()
1864 /* Set stream pointer on all DAIs */ in set_stream()
1866 ret = snd_soc_dai_set_sdw_stream(dai, sdw_stream, substream->stream); in set_stream()
1868 dev_err(rtd->dev, "failed to set stream pointer on dai %s\n", dai->name); in set_stream()
1877 * sdw_startup_stream() - Startup SoundWire stream
1879 * @sdw_substream: Soundwire stream
1881 * Documentation/driver-api/soundwire/stream.rst explains this API in detail
1891 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) in sdw_startup_stream()
1901 dev_err(rtd->dev, "alloc stream failed for substream DAI %s\n", substream->name); in sdw_startup_stream()
1921 * sdw_shutdown_stream() - Shutdown SoundWire stream
1923 * @sdw_substream: Soundwire stream
1925 * Documentation/driver-api/soundwire/stream.rst explains this API in detail
1934 /* Find stream from first CPU DAI */ in sdw_shutdown_stream()
1937 sdw_stream = snd_soc_dai_get_sdw_stream(dai, substream->stream); in sdw_shutdown_stream()
1940 dev_err(rtd->dev, "no stream found for DAI %s\n", dai->name); in sdw_shutdown_stream()