Lines Matching full:stream
5 * stream.c - SoundWire Bus stream operations.
264 * @m_rt: Master stream runtime
372 * @m_rt: Master stream runtime
675 * explicitly preparing a stream or handling an in sdw_program_params()
676 * already-prepared stream otherwise. in sdw_program_params()
679 m_rt->stream->state == SDW_STREAM_CONFIGURED) in sdw_program_params()
697 if (m_rt->stream->state != SDW_STREAM_ENABLED) in sdw_program_params()
781 * @multi_link: whether this is a multi-link stream with hardware-based sync
813 static int do_bank_switch(struct sdw_stream_runtime *stream) in do_bank_switch() argument
822 m_rt_count = stream->m_rt_count; in do_bank_switch()
824 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in do_bank_switch()
862 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in do_bank_switch()
901 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in do_bank_switch()
913 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in do_bank_switch()
962 struct sdw_stream_runtime *stream) in sdw_slave_port_free() argument
968 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in sdw_slave_port_free()
1113 * @stream_config: Stream configuration
1127 struct sdw_stream_runtime *stream) in sdw_slave_rt_find() argument
1132 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in sdw_slave_rt_find()
1147 * @stream: Stream runtime handle.
1152 struct sdw_stream_runtime *stream) in sdw_slave_rt_free() argument
1156 s_rt = sdw_slave_rt_find(slave, stream); in sdw_slave_rt_free()
1165 struct sdw_stream_runtime *stream) in sdw_master_rt_find() argument
1170 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in sdw_master_rt_find()
1182 * @stream: Stream runtime handle.
1188 struct sdw_stream_runtime *stream) in sdw_master_rt_alloc() argument
1206 insert_after = &stream->master_list; in sdw_master_rt_alloc()
1207 list_for_each_entry_reverse(walk_m_rt, &stream->master_list, stream_node) { in sdw_master_rt_alloc()
1218 m_rt->stream = stream; in sdw_master_rt_alloc()
1229 * @stream_config: Stream configuration
1247 * @stream: Stream runtime handle.
1255 struct sdw_stream_runtime *stream) in sdw_master_rt_free() argument
1261 sdw_slave_port_free(s_rt->slave, stream); in sdw_master_rt_free()
1262 sdw_slave_rt_free(s_rt->slave, stream); in sdw_master_rt_free()
1273 * sdw_config_stream() - Configure the allocated stream
1276 * @stream: SoundWire stream
1277 * @stream_config: Stream configuration for audio stream
1283 struct sdw_stream_runtime *stream, in sdw_config_stream() argument
1288 * Update the stream rate, channel and bps based on data in sdw_config_stream()
1290 * match the rate, bps, stream type and increment number of channels. in sdw_config_stream()
1293 * comparison and allow the value to be set and stored in stream in sdw_config_stream()
1295 if (stream->params.rate && in sdw_config_stream()
1296 stream->params.rate != stream_config->frame_rate) { in sdw_config_stream()
1297 dev_err(dev, "rate not matching, stream:%s\n", stream->name); in sdw_config_stream()
1301 if (stream->params.bps && in sdw_config_stream()
1302 stream->params.bps != stream_config->bps) { in sdw_config_stream()
1303 dev_err(dev, "bps not matching, stream:%s\n", stream->name); in sdw_config_stream()
1307 stream->type = stream_config->type; in sdw_config_stream()
1308 stream->params.rate = stream_config->frame_rate; in sdw_config_stream()
1309 stream->params.bps = stream_config->bps; in sdw_config_stream()
1313 stream->params.ch_count += stream_config->ch_count; in sdw_config_stream()
1352 * @stream: SoundWire stream
1355 * stream to reconfigure the bus.
1356 * NOTE: This function is called from SoundWire stream ops and is
1359 static void sdw_acquire_bus_lock(struct sdw_stream_runtime *stream) in sdw_acquire_bus_lock() argument
1365 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in sdw_acquire_bus_lock()
1375 * @stream: SoundWire stream
1378 * NOTE: This function is called from SoundWire stream ops and is
1381 static void sdw_release_bus_lock(struct sdw_stream_runtime *stream) in sdw_release_bus_lock() argument
1387 list_for_each_entry_reverse(m_rt, &stream->master_list, stream_node) { in sdw_release_bus_lock()
1393 static int _sdw_prepare_stream(struct sdw_stream_runtime *stream, in _sdw_prepare_stream() argument
1402 /* Prepare Master(s) and Slave(s) port(s) associated with stream */ in _sdw_prepare_stream()
1403 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in _sdw_prepare_stream()
1409 if ((prop->max_clk_freq % stream->params.rate) != 0) { in _sdw_prepare_stream()
1417 bus->params.bandwidth += m_rt->stream->params.rate * in _sdw_prepare_stream()
1418 m_rt->ch_count * m_rt->stream->params.bps; in _sdw_prepare_stream()
1422 ret = bus->compute_params(bus, stream); in _sdw_prepare_stream()
1439 ret = do_bank_switch(stream); in _sdw_prepare_stream()
1445 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in _sdw_prepare_stream()
1457 stream->state = SDW_STREAM_PREPARED; in _sdw_prepare_stream()
1467 * sdw_prepare_stream() - Prepare SoundWire stream
1469 * @stream: Soundwire stream
1471 * Documentation/driver-api/soundwire/stream.rst explains this API in detail
1473 int sdw_prepare_stream(struct sdw_stream_runtime *stream) in sdw_prepare_stream() argument
1478 if (!stream) { in sdw_prepare_stream()
1479 pr_err("SoundWire: Handle not found for stream\n"); in sdw_prepare_stream()
1483 sdw_acquire_bus_lock(stream); in sdw_prepare_stream()
1485 if (stream->state == SDW_STREAM_PREPARED) { in sdw_prepare_stream()
1490 if (stream->state != SDW_STREAM_CONFIGURED && in sdw_prepare_stream()
1491 stream->state != SDW_STREAM_DEPREPARED && in sdw_prepare_stream()
1492 stream->state != SDW_STREAM_DISABLED) { in sdw_prepare_stream()
1494 __func__, stream->name, stream->state); in sdw_prepare_stream()
1500 * when the stream is DISABLED, this means sdw_prepare_stream() in sdw_prepare_stream()
1505 if (stream->state == SDW_STREAM_DISABLED) in sdw_prepare_stream()
1508 ret = _sdw_prepare_stream(stream, update_params); in sdw_prepare_stream()
1511 sdw_release_bus_lock(stream); in sdw_prepare_stream()
1516 static int _sdw_enable_stream(struct sdw_stream_runtime *stream) in _sdw_enable_stream() argument
1522 /* Enable Master(s) and Slave(s) port(s) associated with stream */ in _sdw_enable_stream()
1523 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in _sdw_enable_stream()
1542 ret = do_bank_switch(stream); in _sdw_enable_stream()
1548 stream->state = SDW_STREAM_ENABLED; in _sdw_enable_stream()
1553 * sdw_enable_stream() - Enable SoundWire stream
1555 * @stream: Soundwire stream
1557 * Documentation/driver-api/soundwire/stream.rst explains this API in detail
1559 int sdw_enable_stream(struct sdw_stream_runtime *stream) in sdw_enable_stream() argument
1563 if (!stream) { in sdw_enable_stream()
1564 pr_err("SoundWire: Handle not found for stream\n"); in sdw_enable_stream()
1568 sdw_acquire_bus_lock(stream); in sdw_enable_stream()
1570 if (stream->state == SDW_STREAM_ENABLED) { in sdw_enable_stream()
1575 if (stream->state != SDW_STREAM_PREPARED && in sdw_enable_stream()
1576 stream->state != SDW_STREAM_DISABLED) { in sdw_enable_stream()
1578 __func__, stream->name, stream->state); in sdw_enable_stream()
1583 ret = _sdw_enable_stream(stream); in sdw_enable_stream()
1586 sdw_release_bus_lock(stream); in sdw_enable_stream()
1591 static int _sdw_disable_stream(struct sdw_stream_runtime *stream) in _sdw_disable_stream() argument
1596 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in _sdw_disable_stream()
1606 stream->state = SDW_STREAM_DISABLED; in _sdw_disable_stream()
1608 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in _sdw_disable_stream()
1619 ret = do_bank_switch(stream); in _sdw_disable_stream()
1626 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in _sdw_disable_stream()
1641 * sdw_disable_stream() - Disable SoundWire stream
1643 * @stream: Soundwire stream
1645 * Documentation/driver-api/soundwire/stream.rst explains this API in detail
1647 int sdw_disable_stream(struct sdw_stream_runtime *stream) in sdw_disable_stream() argument
1651 if (!stream) { in sdw_disable_stream()
1652 pr_err("SoundWire: Handle not found for stream\n"); in sdw_disable_stream()
1656 sdw_acquire_bus_lock(stream); in sdw_disable_stream()
1658 if (stream->state == SDW_STREAM_DISABLED) { in sdw_disable_stream()
1663 if (stream->state != SDW_STREAM_ENABLED) { in sdw_disable_stream()
1665 __func__, stream->name, stream->state); in sdw_disable_stream()
1670 ret = _sdw_disable_stream(stream); in sdw_disable_stream()
1673 sdw_release_bus_lock(stream); in sdw_disable_stream()
1678 static int _sdw_deprepare_stream(struct sdw_stream_runtime *stream) in _sdw_deprepare_stream() argument
1685 int state = stream->state; in _sdw_deprepare_stream()
1692 stream->state = SDW_STREAM_DEPREPARED; in _sdw_deprepare_stream()
1694 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in _sdw_deprepare_stream()
1701 stream->state = state; in _sdw_deprepare_stream()
1711 bandwidth = m_rt->stream->params.rate * hweight32(p_rt->ch_mask) * in _sdw_deprepare_stream()
1712 m_rt->stream->params.bps; in _sdw_deprepare_stream()
1719 bandwidth = m_rt->stream->params.rate * m_rt->ch_count * m_rt->stream->params.bps; in _sdw_deprepare_stream()
1724 ret = bus->compute_params(bus, stream); in _sdw_deprepare_stream()
1728 stream->state = state; in _sdw_deprepare_stream()
1737 stream->state = state; in _sdw_deprepare_stream()
1742 return do_bank_switch(stream); in _sdw_deprepare_stream()
1746 * sdw_deprepare_stream() - Deprepare SoundWire stream
1748 * @stream: Soundwire stream
1750 * Documentation/driver-api/soundwire/stream.rst explains this API in detail
1752 int sdw_deprepare_stream(struct sdw_stream_runtime *stream) in sdw_deprepare_stream() argument
1756 if (!stream) { in sdw_deprepare_stream()
1757 pr_err("SoundWire: Handle not found for stream\n"); in sdw_deprepare_stream()
1761 sdw_acquire_bus_lock(stream); in sdw_deprepare_stream()
1763 if (stream->state == SDW_STREAM_DEPREPARED) { in sdw_deprepare_stream()
1768 if (stream->state != SDW_STREAM_PREPARED && in sdw_deprepare_stream()
1769 stream->state != SDW_STREAM_DISABLED) { in sdw_deprepare_stream()
1771 __func__, stream->name, stream->state); in sdw_deprepare_stream()
1776 ret = _sdw_deprepare_stream(stream); in sdw_deprepare_stream()
1779 sdw_release_bus_lock(stream); in sdw_deprepare_stream()
1792 /* Set stream pointer on all DAIs */ in set_stream()
1794 ret = snd_soc_dai_set_stream(dai, sdw_stream, substream->stream); in set_stream()
1796 dev_err(rtd->dev, "failed to set stream pointer on dai %s\n", dai->name); in set_stream()
1805 * sdw_alloc_stream() - Allocate and return stream runtime
1807 * @stream_name: SoundWire stream name
1809 * Allocates a SoundWire stream runtime instance.
1810 * sdw_alloc_stream should be called only once per stream. Typically
1815 struct sdw_stream_runtime *stream; in sdw_alloc_stream() local
1817 stream = kzalloc(sizeof(*stream), GFP_KERNEL); in sdw_alloc_stream()
1818 if (!stream) in sdw_alloc_stream()
1821 stream->name = stream_name; in sdw_alloc_stream()
1822 INIT_LIST_HEAD(&stream->master_list); in sdw_alloc_stream()
1823 stream->state = SDW_STREAM_ALLOCATED; in sdw_alloc_stream()
1824 stream->m_rt_count = 0; in sdw_alloc_stream()
1826 return stream; in sdw_alloc_stream()
1831 * sdw_startup_stream() - Startup SoundWire stream
1833 * @sdw_substream: Soundwire stream
1835 * Documentation/driver-api/soundwire/stream.rst explains this API in detail
1845 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) in sdw_startup_stream()
1855 dev_err(rtd->dev, "alloc stream failed for substream DAI %s\n", substream->name); in sdw_startup_stream()
1875 * sdw_shutdown_stream() - Shutdown SoundWire stream
1877 * @sdw_substream: Soundwire stream
1879 * Documentation/driver-api/soundwire/stream.rst explains this API in detail
1888 /* Find stream from first CPU DAI */ in sdw_shutdown_stream()
1891 sdw_stream = snd_soc_dai_get_stream(dai, substream->stream); in sdw_shutdown_stream()
1894 dev_err(rtd->dev, "no stream found for DAI %s\n", dai->name); in sdw_shutdown_stream()
1908 * sdw_release_stream() - Free the assigned stream runtime
1910 * @stream: SoundWire stream runtime
1912 * sdw_release_stream should be called only once per stream
1914 void sdw_release_stream(struct sdw_stream_runtime *stream) in sdw_release_stream() argument
1916 kfree(stream); in sdw_release_stream()
1921 * sdw_stream_add_master() - Allocate and add master runtime to a stream
1924 * @stream_config: Stream configuration for audio stream
1925 * @port_config: Port configuration for audio stream
1927 * @stream: SoundWire stream
1933 struct sdw_stream_runtime *stream) in sdw_stream_add_master() argument
1946 if (!bus->multi_link && stream->m_rt_count > 0) { in sdw_stream_add_master()
1957 m_rt = sdw_master_rt_find(bus, stream); in sdw_stream_add_master()
1959 m_rt = sdw_master_rt_alloc(bus, stream); in sdw_stream_add_master()
1961 dev_err(bus->dev, "%s: Master runtime alloc failed for stream:%s\n", in sdw_stream_add_master()
1962 __func__, stream->name); in sdw_stream_add_master()
1975 stream->m_rt_count++; in sdw_stream_add_master()
1982 ret = sdw_config_stream(bus->dev, stream, stream_config, false); in sdw_stream_add_master()
1995 sdw_master_rt_free(m_rt, stream); in sdw_stream_add_master()
2006 * @stream: SoundWire stream
2008 * This removes and frees port_rt and master_rt from a stream
2011 struct sdw_stream_runtime *stream) in sdw_stream_remove_master() argument
2018 &stream->master_list, stream_node) { in sdw_stream_remove_master()
2023 sdw_master_rt_free(m_rt, stream); in sdw_stream_remove_master()
2024 stream->m_rt_count--; in sdw_stream_remove_master()
2027 if (list_empty(&stream->master_list)) in sdw_stream_remove_master()
2028 stream->state = SDW_STREAM_RELEASED; in sdw_stream_remove_master()
2037 * sdw_stream_add_slave() - Allocate and add master/slave runtime to a stream
2040 * @stream_config: Stream configuration for audio stream
2041 * @stream: SoundWire stream
2042 * @port_config: Port configuration for audio stream
2046 * to the Stream.
2053 struct sdw_stream_runtime *stream) in sdw_stream_add_slave() argument
2068 m_rt = sdw_master_rt_find(slave->bus, stream); in sdw_stream_add_slave()
2074 m_rt = sdw_master_rt_alloc(slave->bus, stream); in sdw_stream_add_slave()
2076 dev_err(&slave->dev, "%s: Master runtime alloc failed for stream:%s\n", in sdw_stream_add_slave()
2077 __func__, stream->name); in sdw_stream_add_slave()
2085 s_rt = sdw_slave_rt_find(slave, stream); in sdw_stream_add_slave()
2089 dev_err(&slave->dev, "Slave runtime alloc failed for stream:%s\n", in sdw_stream_add_slave()
2090 stream->name); in sdw_stream_add_slave()
2112 ret = sdw_config_stream(&slave->dev, stream, stream_config, true); in sdw_stream_add_slave()
2121 * Change stream state to CONFIGURED on first Slave add. in sdw_stream_add_slave()
2122 * Bus is not aware of number of Slave(s) in a stream at this in sdw_stream_add_slave()
2124 * change stream state to CONFIGURED. in sdw_stream_add_slave()
2126 stream->state = SDW_STREAM_CONFIGURED; in sdw_stream_add_slave()
2136 sdw_master_rt_free(m_rt, stream); in sdw_stream_add_slave()
2138 sdw_slave_rt_free(slave, stream); in sdw_stream_add_slave()
2149 * @stream: SoundWire stream
2151 * This removes and frees port_rt and slave_rt from a stream
2154 struct sdw_stream_runtime *stream) in sdw_stream_remove_slave() argument
2158 sdw_slave_port_free(slave, stream); in sdw_stream_remove_slave()
2159 sdw_slave_rt_free(slave, stream); in sdw_stream_remove_slave()