Lines Matching full:stream

5  *  stream.c - SoundWire Bus stream operations.
264 * @m_rt: Master stream runtime
372 * @m_rt: Master stream runtime
639 * explicitly preparing a stream or handling an in sdw_program_params()
640 * already-prepared stream otherwise. in sdw_program_params()
643 m_rt->stream->state == SDW_STREAM_CONFIGURED) in sdw_program_params()
661 if (m_rt->stream->state != SDW_STREAM_ENABLED) in sdw_program_params()
776 static int do_bank_switch(struct sdw_stream_runtime *stream) in do_bank_switch() argument
785 m_rt_count = stream->m_rt_count; in do_bank_switch()
787 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in do_bank_switch()
825 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in do_bank_switch()
864 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in do_bank_switch()
876 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in do_bank_switch()
925 struct sdw_stream_runtime *stream) in sdw_slave_port_free() argument
931 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in sdw_slave_port_free()
1076 * @stream_config: Stream configuration
1090 struct sdw_stream_runtime *stream) in sdw_slave_rt_find() argument
1095 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in sdw_slave_rt_find()
1110 * @stream: Stream runtime handle.
1115 struct sdw_stream_runtime *stream) in sdw_slave_rt_free() argument
1119 s_rt = sdw_slave_rt_find(slave, stream); in sdw_slave_rt_free()
1128 struct sdw_stream_runtime *stream) in sdw_master_rt_find() argument
1133 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in sdw_master_rt_find()
1145 * @stream: Stream runtime handle.
1151 struct sdw_stream_runtime *stream) in sdw_master_rt_alloc() argument
1169 insert_after = &stream->master_list; in sdw_master_rt_alloc()
1170 list_for_each_entry_reverse(walk_m_rt, &stream->master_list, stream_node) { in sdw_master_rt_alloc()
1181 m_rt->stream = stream; in sdw_master_rt_alloc()
1190 * @stream_config: Stream configuration
1208 * @stream: Stream runtime handle.
1216 struct sdw_stream_runtime *stream) in sdw_master_rt_free() argument
1221 sdw_slave_port_free(s_rt->slave, stream); in sdw_master_rt_free()
1222 sdw_slave_rt_free(s_rt->slave, stream); in sdw_master_rt_free()
1231 * sdw_config_stream() - Configure the allocated stream
1234 * @stream: SoundWire stream
1235 * @stream_config: Stream configuration for audio stream
1241 struct sdw_stream_runtime *stream, in sdw_config_stream() argument
1246 * Update the stream rate, channel and bps based on data in sdw_config_stream()
1248 * match the rate, bps, stream type and increment number of channels. in sdw_config_stream()
1251 * comparison and allow the value to be set and stored in stream in sdw_config_stream()
1253 if (stream->params.rate && in sdw_config_stream()
1254 stream->params.rate != stream_config->frame_rate) { in sdw_config_stream()
1255 dev_err(dev, "rate not matching, stream:%s\n", stream->name); in sdw_config_stream()
1259 if (stream->params.bps && in sdw_config_stream()
1260 stream->params.bps != stream_config->bps) { in sdw_config_stream()
1261 dev_err(dev, "bps not matching, stream:%s\n", stream->name); in sdw_config_stream()
1265 stream->type = stream_config->type; in sdw_config_stream()
1266 stream->params.rate = stream_config->frame_rate; in sdw_config_stream()
1267 stream->params.bps = stream_config->bps; in sdw_config_stream()
1271 stream->params.ch_count += stream_config->ch_count; in sdw_config_stream()
1310 * @stream: SoundWire stream
1313 * stream to reconfigure the bus.
1314 * NOTE: This function is called from SoundWire stream ops and is
1317 static void sdw_acquire_bus_lock(struct sdw_stream_runtime *stream) in sdw_acquire_bus_lock() argument
1323 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in sdw_acquire_bus_lock()
1333 * @stream: SoundWire stream
1336 * NOTE: This function is called from SoundWire stream ops and is
1339 static void sdw_release_bus_lock(struct sdw_stream_runtime *stream) in sdw_release_bus_lock() argument
1345 list_for_each_entry_reverse(m_rt, &stream->master_list, stream_node) { in sdw_release_bus_lock()
1351 static int _sdw_prepare_stream(struct sdw_stream_runtime *stream, in _sdw_prepare_stream() argument
1360 /* Prepare Master(s) and Slave(s) port(s) associated with stream */ in _sdw_prepare_stream()
1361 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in _sdw_prepare_stream()
1367 if ((prop->max_clk_freq % stream->params.rate) != 0) { in _sdw_prepare_stream()
1375 bus->params.bandwidth += m_rt->stream->params.rate * in _sdw_prepare_stream()
1376 m_rt->ch_count * m_rt->stream->params.bps; in _sdw_prepare_stream()
1397 ret = do_bank_switch(stream); in _sdw_prepare_stream()
1403 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in _sdw_prepare_stream()
1415 stream->state = SDW_STREAM_PREPARED; in _sdw_prepare_stream()
1425 * sdw_prepare_stream() - Prepare SoundWire stream
1427 * @stream: Soundwire stream
1429 * Documentation/driver-api/soundwire/stream.rst explains this API in detail
1431 int sdw_prepare_stream(struct sdw_stream_runtime *stream) in sdw_prepare_stream() argument
1436 if (!stream) { in sdw_prepare_stream()
1437 pr_err("SoundWire: Handle not found for stream\n"); in sdw_prepare_stream()
1441 sdw_acquire_bus_lock(stream); in sdw_prepare_stream()
1443 if (stream->state == SDW_STREAM_PREPARED) { in sdw_prepare_stream()
1448 if (stream->state != SDW_STREAM_CONFIGURED && in sdw_prepare_stream()
1449 stream->state != SDW_STREAM_DEPREPARED && in sdw_prepare_stream()
1450 stream->state != SDW_STREAM_DISABLED) { in sdw_prepare_stream()
1452 __func__, stream->name, stream->state); in sdw_prepare_stream()
1458 * when the stream is DISABLED, this means sdw_prepare_stream() in sdw_prepare_stream()
1463 if (stream->state == SDW_STREAM_DISABLED) in sdw_prepare_stream()
1466 ret = _sdw_prepare_stream(stream, update_params); in sdw_prepare_stream()
1469 sdw_release_bus_lock(stream); in sdw_prepare_stream()
1474 static int _sdw_enable_stream(struct sdw_stream_runtime *stream) in _sdw_enable_stream() argument
1480 /* Enable Master(s) and Slave(s) port(s) associated with stream */ in _sdw_enable_stream()
1481 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in _sdw_enable_stream()
1500 ret = do_bank_switch(stream); in _sdw_enable_stream()
1506 stream->state = SDW_STREAM_ENABLED; in _sdw_enable_stream()
1511 * sdw_enable_stream() - Enable SoundWire stream
1513 * @stream: Soundwire stream
1515 * Documentation/driver-api/soundwire/stream.rst explains this API in detail
1517 int sdw_enable_stream(struct sdw_stream_runtime *stream) in sdw_enable_stream() argument
1521 if (!stream) { in sdw_enable_stream()
1522 pr_err("SoundWire: Handle not found for stream\n"); in sdw_enable_stream()
1526 sdw_acquire_bus_lock(stream); in sdw_enable_stream()
1528 if (stream->state == SDW_STREAM_ENABLED) { in sdw_enable_stream()
1533 if (stream->state != SDW_STREAM_PREPARED && in sdw_enable_stream()
1534 stream->state != SDW_STREAM_DISABLED) { in sdw_enable_stream()
1536 __func__, stream->name, stream->state); in sdw_enable_stream()
1541 ret = _sdw_enable_stream(stream); in sdw_enable_stream()
1544 sdw_release_bus_lock(stream); in sdw_enable_stream()
1549 static int _sdw_disable_stream(struct sdw_stream_runtime *stream) in _sdw_disable_stream() argument
1554 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in _sdw_disable_stream()
1564 stream->state = SDW_STREAM_DISABLED; in _sdw_disable_stream()
1566 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in _sdw_disable_stream()
1577 ret = do_bank_switch(stream); in _sdw_disable_stream()
1584 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in _sdw_disable_stream()
1599 * sdw_disable_stream() - Disable SoundWire stream
1601 * @stream: Soundwire stream
1603 * Documentation/driver-api/soundwire/stream.rst explains this API in detail
1605 int sdw_disable_stream(struct sdw_stream_runtime *stream) in sdw_disable_stream() argument
1609 if (!stream) { in sdw_disable_stream()
1610 pr_err("SoundWire: Handle not found for stream\n"); in sdw_disable_stream()
1614 sdw_acquire_bus_lock(stream); in sdw_disable_stream()
1616 if (stream->state == SDW_STREAM_DISABLED) { in sdw_disable_stream()
1621 if (stream->state != SDW_STREAM_ENABLED) { in sdw_disable_stream()
1623 __func__, stream->name, stream->state); in sdw_disable_stream()
1628 ret = _sdw_disable_stream(stream); in sdw_disable_stream()
1631 sdw_release_bus_lock(stream); in sdw_disable_stream()
1636 static int _sdw_deprepare_stream(struct sdw_stream_runtime *stream) in _sdw_deprepare_stream() argument
1642 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in _sdw_deprepare_stream()
1653 bus->params.bandwidth -= m_rt->stream->params.rate * in _sdw_deprepare_stream()
1654 m_rt->ch_count * m_rt->stream->params.bps; in _sdw_deprepare_stream()
1674 stream->state = SDW_STREAM_DEPREPARED; in _sdw_deprepare_stream()
1675 return do_bank_switch(stream); in _sdw_deprepare_stream()
1679 * sdw_deprepare_stream() - Deprepare SoundWire stream
1681 * @stream: Soundwire stream
1683 * Documentation/driver-api/soundwire/stream.rst explains this API in detail
1685 int sdw_deprepare_stream(struct sdw_stream_runtime *stream) in sdw_deprepare_stream() argument
1689 if (!stream) { in sdw_deprepare_stream()
1690 pr_err("SoundWire: Handle not found for stream\n"); in sdw_deprepare_stream()
1694 sdw_acquire_bus_lock(stream); in sdw_deprepare_stream()
1696 if (stream->state == SDW_STREAM_DEPREPARED) { in sdw_deprepare_stream()
1701 if (stream->state != SDW_STREAM_PREPARED && in sdw_deprepare_stream()
1702 stream->state != SDW_STREAM_DISABLED) { in sdw_deprepare_stream()
1704 __func__, stream->name, stream->state); in sdw_deprepare_stream()
1709 ret = _sdw_deprepare_stream(stream); in sdw_deprepare_stream()
1712 sdw_release_bus_lock(stream); in sdw_deprepare_stream()
1725 /* Set stream pointer on all DAIs */ in set_stream()
1727 ret = snd_soc_dai_set_stream(dai, sdw_stream, substream->stream); in set_stream()
1729 dev_err(rtd->dev, "failed to set stream pointer on dai %s\n", dai->name); in set_stream()
1738 * sdw_alloc_stream() - Allocate and return stream runtime
1740 * @stream_name: SoundWire stream name
1742 * Allocates a SoundWire stream runtime instance.
1743 * sdw_alloc_stream should be called only once per stream. Typically
1748 struct sdw_stream_runtime *stream; in sdw_alloc_stream() local
1750 stream = kzalloc(sizeof(*stream), GFP_KERNEL); in sdw_alloc_stream()
1751 if (!stream) in sdw_alloc_stream()
1754 stream->name = stream_name; in sdw_alloc_stream()
1755 INIT_LIST_HEAD(&stream->master_list); in sdw_alloc_stream()
1756 stream->state = SDW_STREAM_ALLOCATED; in sdw_alloc_stream()
1757 stream->m_rt_count = 0; in sdw_alloc_stream()
1759 return stream; in sdw_alloc_stream()
1764 * sdw_startup_stream() - Startup SoundWire stream
1766 * @sdw_substream: Soundwire stream
1768 * Documentation/driver-api/soundwire/stream.rst explains this API in detail
1778 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) in sdw_startup_stream()
1788 dev_err(rtd->dev, "alloc stream failed for substream DAI %s\n", substream->name); in sdw_startup_stream()
1808 * sdw_shutdown_stream() - Shutdown SoundWire stream
1810 * @sdw_substream: Soundwire stream
1812 * Documentation/driver-api/soundwire/stream.rst explains this API in detail
1821 /* Find stream from first CPU DAI */ in sdw_shutdown_stream()
1824 sdw_stream = snd_soc_dai_get_stream(dai, substream->stream); in sdw_shutdown_stream()
1827 dev_err(rtd->dev, "no stream found for DAI %s\n", dai->name); in sdw_shutdown_stream()
1841 * sdw_release_stream() - Free the assigned stream runtime
1843 * @stream: SoundWire stream runtime
1845 * sdw_release_stream should be called only once per stream
1847 void sdw_release_stream(struct sdw_stream_runtime *stream) in sdw_release_stream() argument
1849 kfree(stream); in sdw_release_stream()
1854 * sdw_stream_add_master() - Allocate and add master runtime to a stream
1857 * @stream_config: Stream configuration for audio stream
1858 * @port_config: Port configuration for audio stream
1860 * @stream: SoundWire stream
1866 struct sdw_stream_runtime *stream) in sdw_stream_add_master() argument
1879 if (!bus->multi_link && stream->m_rt_count > 0) { in sdw_stream_add_master()
1890 m_rt = sdw_master_rt_find(bus, stream); in sdw_stream_add_master()
1892 m_rt = sdw_master_rt_alloc(bus, stream); in sdw_stream_add_master()
1894 dev_err(bus->dev, "%s: Master runtime alloc failed for stream:%s\n", in sdw_stream_add_master()
1895 __func__, stream->name); in sdw_stream_add_master()
1908 stream->m_rt_count++; in sdw_stream_add_master()
1915 ret = sdw_config_stream(bus->dev, stream, stream_config, false); in sdw_stream_add_master()
1928 sdw_master_rt_free(m_rt, stream); in sdw_stream_add_master()
1939 * @stream: SoundWire stream
1941 * This removes and frees port_rt and master_rt from a stream
1944 struct sdw_stream_runtime *stream) in sdw_stream_remove_master() argument
1951 &stream->master_list, stream_node) { in sdw_stream_remove_master()
1956 sdw_master_rt_free(m_rt, stream); in sdw_stream_remove_master()
1957 stream->m_rt_count--; in sdw_stream_remove_master()
1960 if (list_empty(&stream->master_list)) in sdw_stream_remove_master()
1961 stream->state = SDW_STREAM_RELEASED; in sdw_stream_remove_master()
1970 * sdw_stream_add_slave() - Allocate and add master/slave runtime to a stream
1973 * @stream_config: Stream configuration for audio stream
1974 * @stream: SoundWire stream
1975 * @port_config: Port configuration for audio stream
1979 * to the Stream.
1986 struct sdw_stream_runtime *stream) in sdw_stream_add_slave() argument
2001 m_rt = sdw_master_rt_find(slave->bus, stream); in sdw_stream_add_slave()
2007 m_rt = sdw_master_rt_alloc(slave->bus, stream); in sdw_stream_add_slave()
2009 dev_err(&slave->dev, "%s: Master runtime alloc failed for stream:%s\n", in sdw_stream_add_slave()
2010 __func__, stream->name); in sdw_stream_add_slave()
2018 s_rt = sdw_slave_rt_find(slave, stream); in sdw_stream_add_slave()
2022 dev_err(&slave->dev, "Slave runtime alloc failed for stream:%s\n", in sdw_stream_add_slave()
2023 stream->name); in sdw_stream_add_slave()
2045 ret = sdw_config_stream(&slave->dev, stream, stream_config, true); in sdw_stream_add_slave()
2054 * Change stream state to CONFIGURED on first Slave add. in sdw_stream_add_slave()
2055 * Bus is not aware of number of Slave(s) in a stream at this in sdw_stream_add_slave()
2057 * change stream state to CONFIGURED. in sdw_stream_add_slave()
2059 stream->state = SDW_STREAM_CONFIGURED; in sdw_stream_add_slave()
2069 sdw_master_rt_free(m_rt, stream); in sdw_stream_add_slave()
2071 sdw_slave_rt_free(slave, stream); in sdw_stream_add_slave()
2082 * @stream: SoundWire stream
2084 * This removes and frees port_rt and slave_rt from a stream
2087 struct sdw_stream_runtime *stream) in sdw_stream_remove_slave() argument
2091 sdw_slave_port_free(slave, stream); in sdw_stream_remove_slave()
2092 sdw_slave_rt_free(slave, stream); in sdw_stream_remove_slave()