Lines Matching full:stream
5 * stream.c - SoundWire Bus stream operations.
278 * @m_rt: Master stream runtime
386 * @m_rt: Master stream runtime
707 * explicitly preparing a stream or handling an in sdw_program_params()
708 * already-prepared stream otherwise. in sdw_program_params()
711 m_rt->stream->state == SDW_STREAM_CONFIGURED) in sdw_program_params()
729 if (m_rt->stream->state != SDW_STREAM_ENABLED) in sdw_program_params()
813 * @multi_link: whether this is a multi-link stream with hardware-based sync
845 static int do_bank_switch(struct sdw_stream_runtime *stream) in do_bank_switch() argument
854 m_rt_count = stream->m_rt_count; in do_bank_switch()
856 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in do_bank_switch()
894 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in do_bank_switch()
933 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in do_bank_switch()
945 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in do_bank_switch()
994 struct sdw_stream_runtime *stream) in sdw_slave_port_free() argument
1000 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in sdw_slave_port_free()
1150 * @stream_config: Stream configuration
1164 struct sdw_stream_runtime *stream) in sdw_slave_rt_find() argument
1169 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in sdw_slave_rt_find()
1184 * @stream: Stream runtime handle.
1189 struct sdw_stream_runtime *stream) in sdw_slave_rt_free() argument
1193 s_rt = sdw_slave_rt_find(slave, stream); in sdw_slave_rt_free()
1202 struct sdw_stream_runtime *stream) in sdw_master_rt_find() argument
1207 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in sdw_master_rt_find()
1219 * @stream: Stream runtime handle.
1225 struct sdw_stream_runtime *stream) in sdw_master_rt_alloc() argument
1230 if (stream->type == SDW_STREAM_BPT) { in sdw_master_rt_alloc()
1232 dev_err(bus->dev, "%s: %d/%d audio/BPT stream already allocated\n", in sdw_master_rt_alloc()
1238 dev_err(bus->dev, "%s: BPT stream already allocated\n", in sdw_master_rt_alloc()
1257 insert_after = &stream->master_list; in sdw_master_rt_alloc()
1258 list_for_each_entry_reverse(walk_m_rt, &stream->master_list, stream_node) { in sdw_master_rt_alloc()
1269 m_rt->stream = stream; in sdw_master_rt_alloc()
1272 if (stream->type == SDW_STREAM_BPT) in sdw_master_rt_alloc()
1282 * @stream_config: Stream configuration
1300 * @stream: Stream runtime handle.
1308 struct sdw_stream_runtime *stream) in sdw_master_rt_free() argument
1314 sdw_slave_port_free(s_rt->slave, stream); in sdw_master_rt_free()
1315 sdw_slave_rt_free(s_rt->slave, stream); in sdw_master_rt_free()
1322 if (stream->type == SDW_STREAM_BPT) in sdw_master_rt_free()
1328 * sdw_config_stream() - Configure the allocated stream
1331 * @stream: SoundWire stream
1332 * @stream_config: Stream configuration for audio stream
1338 struct sdw_stream_runtime *stream, in sdw_config_stream() argument
1343 * Update the stream rate, channel and bps based on data in sdw_config_stream()
1345 * match the rate, bps, stream type and increment number of channels. in sdw_config_stream()
1348 * comparison and allow the value to be set and stored in stream in sdw_config_stream()
1350 if (stream->params.rate && in sdw_config_stream()
1351 stream->params.rate != stream_config->frame_rate) { in sdw_config_stream()
1352 dev_err(dev, "rate not matching, stream:%s\n", stream->name); in sdw_config_stream()
1356 if (stream->params.bps && in sdw_config_stream()
1357 stream->params.bps != stream_config->bps) { in sdw_config_stream()
1358 dev_err(dev, "bps not matching, stream:%s\n", stream->name); in sdw_config_stream()
1362 stream->type = stream_config->type; in sdw_config_stream()
1363 stream->params.rate = stream_config->frame_rate; in sdw_config_stream()
1364 stream->params.bps = stream_config->bps; in sdw_config_stream()
1368 stream->params.ch_count += stream_config->ch_count; in sdw_config_stream()
1412 * @stream: SoundWire stream
1415 * stream to reconfigure the bus.
1416 * NOTE: This function is called from SoundWire stream ops and is
1419 static void sdw_acquire_bus_lock(struct sdw_stream_runtime *stream) in sdw_acquire_bus_lock() argument
1425 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in sdw_acquire_bus_lock()
1435 * @stream: SoundWire stream
1438 * NOTE: This function is called from SoundWire stream ops and is
1441 static void sdw_release_bus_lock(struct sdw_stream_runtime *stream) in sdw_release_bus_lock() argument
1447 list_for_each_entry_reverse(m_rt, &stream->master_list, stream_node) { in sdw_release_bus_lock()
1453 static int _sdw_prepare_stream(struct sdw_stream_runtime *stream, in _sdw_prepare_stream() argument
1462 /* Prepare Master(s) and Slave(s) port(s) associated with stream */ in _sdw_prepare_stream()
1463 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in _sdw_prepare_stream()
1469 if ((prop->max_clk_freq % stream->params.rate) != 0) { in _sdw_prepare_stream()
1477 bus->params.bandwidth += m_rt->stream->params.rate * in _sdw_prepare_stream()
1478 m_rt->ch_count * m_rt->stream->params.bps; in _sdw_prepare_stream()
1482 ret = bus->compute_params(bus, stream); in _sdw_prepare_stream()
1499 ret = do_bank_switch(stream); in _sdw_prepare_stream()
1505 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in _sdw_prepare_stream()
1517 stream->state = SDW_STREAM_PREPARED; in _sdw_prepare_stream()
1527 * sdw_prepare_stream() - Prepare SoundWire stream
1529 * @stream: Soundwire stream
1531 * Documentation/driver-api/soundwire/stream.rst explains this API in detail
1533 int sdw_prepare_stream(struct sdw_stream_runtime *stream) in sdw_prepare_stream() argument
1538 if (!stream) { in sdw_prepare_stream()
1539 pr_err("SoundWire: Handle not found for stream\n"); in sdw_prepare_stream()
1543 sdw_acquire_bus_lock(stream); in sdw_prepare_stream()
1545 if (stream->state == SDW_STREAM_PREPARED) { in sdw_prepare_stream()
1550 if (stream->state != SDW_STREAM_CONFIGURED && in sdw_prepare_stream()
1551 stream->state != SDW_STREAM_DEPREPARED && in sdw_prepare_stream()
1552 stream->state != SDW_STREAM_DISABLED) { in sdw_prepare_stream()
1554 __func__, stream->name, stream->state); in sdw_prepare_stream()
1560 * when the stream is DISABLED, this means sdw_prepare_stream() in sdw_prepare_stream()
1565 if (stream->state == SDW_STREAM_DISABLED) in sdw_prepare_stream()
1568 ret = _sdw_prepare_stream(stream, update_params); in sdw_prepare_stream()
1571 sdw_release_bus_lock(stream); in sdw_prepare_stream()
1576 static int _sdw_enable_stream(struct sdw_stream_runtime *stream) in _sdw_enable_stream() argument
1582 /* Enable Master(s) and Slave(s) port(s) associated with stream */ in _sdw_enable_stream()
1583 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in _sdw_enable_stream()
1602 ret = do_bank_switch(stream); in _sdw_enable_stream()
1608 stream->state = SDW_STREAM_ENABLED; in _sdw_enable_stream()
1613 * sdw_enable_stream() - Enable SoundWire stream
1615 * @stream: Soundwire stream
1617 * Documentation/driver-api/soundwire/stream.rst explains this API in detail
1619 int sdw_enable_stream(struct sdw_stream_runtime *stream) in sdw_enable_stream() argument
1623 if (!stream) { in sdw_enable_stream()
1624 pr_err("SoundWire: Handle not found for stream\n"); in sdw_enable_stream()
1628 sdw_acquire_bus_lock(stream); in sdw_enable_stream()
1630 if (stream->state == SDW_STREAM_ENABLED) { in sdw_enable_stream()
1635 if (stream->state != SDW_STREAM_PREPARED && in sdw_enable_stream()
1636 stream->state != SDW_STREAM_DISABLED) { in sdw_enable_stream()
1638 __func__, stream->name, stream->state); in sdw_enable_stream()
1643 ret = _sdw_enable_stream(stream); in sdw_enable_stream()
1646 sdw_release_bus_lock(stream); in sdw_enable_stream()
1651 static int _sdw_disable_stream(struct sdw_stream_runtime *stream) in _sdw_disable_stream() argument
1656 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in _sdw_disable_stream()
1666 stream->state = SDW_STREAM_DISABLED; in _sdw_disable_stream()
1668 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in _sdw_disable_stream()
1679 ret = do_bank_switch(stream); in _sdw_disable_stream()
1686 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in _sdw_disable_stream()
1701 * sdw_disable_stream() - Disable SoundWire stream
1703 * @stream: Soundwire stream
1705 * Documentation/driver-api/soundwire/stream.rst explains this API in detail
1707 int sdw_disable_stream(struct sdw_stream_runtime *stream) in sdw_disable_stream() argument
1711 if (!stream) { in sdw_disable_stream()
1712 pr_err("SoundWire: Handle not found for stream\n"); in sdw_disable_stream()
1716 sdw_acquire_bus_lock(stream); in sdw_disable_stream()
1718 if (stream->state == SDW_STREAM_DISABLED) { in sdw_disable_stream()
1723 if (stream->state != SDW_STREAM_ENABLED) { in sdw_disable_stream()
1725 __func__, stream->name, stream->state); in sdw_disable_stream()
1730 ret = _sdw_disable_stream(stream); in sdw_disable_stream()
1733 sdw_release_bus_lock(stream); in sdw_disable_stream()
1738 static int _sdw_deprepare_stream(struct sdw_stream_runtime *stream) in _sdw_deprepare_stream() argument
1745 int state = stream->state; in _sdw_deprepare_stream()
1752 stream->state = SDW_STREAM_DEPREPARED; in _sdw_deprepare_stream()
1754 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in _sdw_deprepare_stream()
1761 stream->state = state; in _sdw_deprepare_stream()
1771 bandwidth = m_rt->stream->params.rate * hweight32(p_rt->ch_mask) * in _sdw_deprepare_stream()
1772 m_rt->stream->params.bps; in _sdw_deprepare_stream()
1779 bandwidth = m_rt->stream->params.rate * m_rt->ch_count * m_rt->stream->params.bps; in _sdw_deprepare_stream()
1784 ret = bus->compute_params(bus, stream); in _sdw_deprepare_stream()
1788 stream->state = state; in _sdw_deprepare_stream()
1797 stream->state = state; in _sdw_deprepare_stream()
1802 return do_bank_switch(stream); in _sdw_deprepare_stream()
1806 * sdw_deprepare_stream() - Deprepare SoundWire stream
1808 * @stream: Soundwire stream
1810 * Documentation/driver-api/soundwire/stream.rst explains this API in detail
1812 int sdw_deprepare_stream(struct sdw_stream_runtime *stream) in sdw_deprepare_stream() argument
1816 if (!stream) { in sdw_deprepare_stream()
1817 pr_err("SoundWire: Handle not found for stream\n"); in sdw_deprepare_stream()
1821 sdw_acquire_bus_lock(stream); in sdw_deprepare_stream()
1823 if (stream->state == SDW_STREAM_DEPREPARED) { in sdw_deprepare_stream()
1828 if (stream->state != SDW_STREAM_PREPARED && in sdw_deprepare_stream()
1829 stream->state != SDW_STREAM_DISABLED) { in sdw_deprepare_stream()
1831 __func__, stream->name, stream->state); in sdw_deprepare_stream()
1836 ret = _sdw_deprepare_stream(stream); in sdw_deprepare_stream()
1839 sdw_release_bus_lock(stream); in sdw_deprepare_stream()
1852 /* Set stream pointer on all DAIs */ in set_stream()
1854 ret = snd_soc_dai_set_stream(dai, sdw_stream, substream->stream); in set_stream()
1856 dev_err(rtd->dev, "failed to set stream pointer on dai %s\n", dai->name); in set_stream()
1865 * sdw_alloc_stream() - Allocate and return stream runtime
1867 * @stream_name: SoundWire stream name
1868 * @type: stream type (could be PCM ,PDM or BPT)
1870 * Allocates a SoundWire stream runtime instance.
1871 * sdw_alloc_stream should be called only once per stream. Typically
1876 struct sdw_stream_runtime *stream; in sdw_alloc_stream() local
1878 stream = kzalloc(sizeof(*stream), GFP_KERNEL); in sdw_alloc_stream()
1879 if (!stream) in sdw_alloc_stream()
1882 stream->name = stream_name; in sdw_alloc_stream()
1883 INIT_LIST_HEAD(&stream->master_list); in sdw_alloc_stream()
1884 stream->state = SDW_STREAM_ALLOCATED; in sdw_alloc_stream()
1885 stream->m_rt_count = 0; in sdw_alloc_stream()
1886 stream->type = type; in sdw_alloc_stream()
1888 return stream; in sdw_alloc_stream()
1893 * sdw_startup_stream() - Startup SoundWire stream
1895 * @sdw_substream: Soundwire stream
1897 * Documentation/driver-api/soundwire/stream.rst explains this API in detail
1907 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) in sdw_startup_stream()
1917 dev_err(rtd->dev, "alloc stream failed for substream DAI %s\n", substream->name); in sdw_startup_stream()
1937 * sdw_shutdown_stream() - Shutdown SoundWire stream
1939 * @sdw_substream: Soundwire stream
1941 * Documentation/driver-api/soundwire/stream.rst explains this API in detail
1950 /* Find stream from first CPU DAI */ in sdw_shutdown_stream()
1953 sdw_stream = snd_soc_dai_get_stream(dai, substream->stream); in sdw_shutdown_stream()
1956 dev_err(rtd->dev, "no stream found for DAI %s\n", dai->name); in sdw_shutdown_stream()
1970 * sdw_release_stream() - Free the assigned stream runtime
1972 * @stream: SoundWire stream runtime
1974 * sdw_release_stream should be called only once per stream
1976 void sdw_release_stream(struct sdw_stream_runtime *stream) in sdw_release_stream() argument
1978 kfree(stream); in sdw_release_stream()
1983 * sdw_stream_add_master() - Allocate and add master runtime to a stream
1986 * @stream_config: Stream configuration for audio stream
1987 * @port_config: Port configuration for audio stream
1989 * @stream: SoundWire stream
1995 struct sdw_stream_runtime *stream) in sdw_stream_add_master() argument
2008 if (!bus->multi_link && stream->m_rt_count > 0) { in sdw_stream_add_master()
2019 m_rt = sdw_master_rt_find(bus, stream); in sdw_stream_add_master()
2021 m_rt = sdw_master_rt_alloc(bus, stream); in sdw_stream_add_master()
2024 dev_err(bus->dev, "%s: Master runtime alloc failed for stream:%s: %d\n", in sdw_stream_add_master()
2025 __func__, stream->name, ret); in sdw_stream_add_master()
2029 dev_err(bus->dev, "%s: Master runtime alloc failed for stream:%s\n", in sdw_stream_add_master()
2030 __func__, stream->name); in sdw_stream_add_master()
2043 stream->m_rt_count++; in sdw_stream_add_master()
2050 ret = sdw_config_stream(bus->dev, stream, stream_config, false); in sdw_stream_add_master()
2063 sdw_master_rt_free(m_rt, stream); in sdw_stream_add_master()
2074 * @stream: SoundWire stream
2076 * This removes and frees port_rt and master_rt from a stream
2079 struct sdw_stream_runtime *stream) in sdw_stream_remove_master() argument
2086 &stream->master_list, stream_node) { in sdw_stream_remove_master()
2091 sdw_master_rt_free(m_rt, stream); in sdw_stream_remove_master()
2092 stream->m_rt_count--; in sdw_stream_remove_master()
2095 if (list_empty(&stream->master_list)) in sdw_stream_remove_master()
2096 stream->state = SDW_STREAM_RELEASED; in sdw_stream_remove_master()
2105 * sdw_stream_add_slave() - Allocate and add master/slave runtime to a stream
2108 * @stream_config: Stream configuration for audio stream
2109 * @stream: SoundWire stream
2110 * @port_config: Port configuration for audio stream
2114 * to the Stream.
2121 struct sdw_stream_runtime *stream) in sdw_stream_add_slave() argument
2136 m_rt = sdw_master_rt_find(slave->bus, stream); in sdw_stream_add_slave()
2142 m_rt = sdw_master_rt_alloc(slave->bus, stream); in sdw_stream_add_slave()
2145 dev_err(&slave->dev, "%s: Master runtime alloc failed for stream:%s: %d\n", in sdw_stream_add_slave()
2146 __func__, stream->name, ret); in sdw_stream_add_slave()
2150 dev_err(&slave->dev, "%s: Master runtime alloc failed for stream:%s\n", in sdw_stream_add_slave()
2151 __func__, stream->name); in sdw_stream_add_slave()
2159 s_rt = sdw_slave_rt_find(slave, stream); in sdw_stream_add_slave()
2163 dev_err(&slave->dev, "Slave runtime alloc failed for stream:%s\n", in sdw_stream_add_slave()
2164 stream->name); in sdw_stream_add_slave()
2186 ret = sdw_config_stream(&slave->dev, stream, stream_config, true); in sdw_stream_add_slave()
2191 stream->type == SDW_STREAM_BPT); in sdw_stream_add_slave()
2196 * Change stream state to CONFIGURED on first Slave add. in sdw_stream_add_slave()
2197 * Bus is not aware of number of Slave(s) in a stream at this in sdw_stream_add_slave()
2199 * change stream state to CONFIGURED. in sdw_stream_add_slave()
2201 stream->state = SDW_STREAM_CONFIGURED; in sdw_stream_add_slave()
2211 sdw_master_rt_free(m_rt, stream); in sdw_stream_add_slave()
2213 sdw_slave_rt_free(slave, stream); in sdw_stream_add_slave()
2224 * @stream: SoundWire stream
2226 * This removes and frees port_rt and slave_rt from a stream
2229 struct sdw_stream_runtime *stream) in sdw_stream_remove_slave() argument
2233 sdw_slave_port_free(slave, stream); in sdw_stream_remove_slave()
2234 sdw_slave_rt_free(slave, stream); in sdw_stream_remove_slave()