@@ -1972,6 +1972,22 @@ int sdw_stream_remove_master(struct sdw_bus *bus,
}
EXPORT_SYMBOL(sdw_stream_remove_master);
+int sdw_set_channel_map_stream(struct sdw_stream_runtime *stream,
+ int *ch_mask, unsigned int active_port_num)
+{
+ struct sdw_master_runtime *m_rt;
+ struct sdw_bus *bus;
+
+ list_for_each_entry(m_rt, &stream->master_list, stream_node) {
+ bus = m_rt->bus;
+ if (bus->ops->set_master_channel_map)
+ bus->ops->set_master_channel_map(bus, ch_mask, active_port_num);
+ }
+
+ return 0;
+}
+EXPORT_SYMBOL(sdw_set_channel_map_stream);
+
/**
* sdw_stream_add_slave() - Allocate and add master/slave runtime to a stream
*
@@ -857,6 +857,8 @@ struct sdw_master_ops {
(struct sdw_bus *bus);
int (*set_bus_conf)(struct sdw_bus *bus,
struct sdw_bus_params *params);
+ int (*set_master_channel_map)(struct sdw_bus *bus, int *ch_mask,
+ unsigned int port_num);
int (*pre_bank_switch)(struct sdw_bus *bus);
int (*post_bank_switch)(struct sdw_bus *bus);
u32 (*read_ping_status)(struct sdw_bus *bus);
@@ -1049,6 +1051,9 @@ int sdw_bus_exit_clk_stop(struct sdw_bus *bus);
int sdw_compare_devid(struct sdw_slave *slave, struct sdw_slave_id id);
void sdw_extract_slave_id(struct sdw_bus *bus, u64 addr, struct sdw_slave_id *id);
+int sdw_set_channel_map_stream(struct sdw_stream_runtime *stream,
+ int *ch_mask, unsigned int active_port_num);
+
#if IS_ENABLED(CONFIG_SOUNDWIRE)
int sdw_stream_add_slave(struct sdw_slave *slave,
Add set_master_channel_map() to set the static channel map between master and slave. Patch change will resolve the channel mask mismatch between the master and slave. The sdw_set_channel_map_stream() will triggered by a slave with active port number and channel mask. Signed-off-by: Mohammad Rafi Shaik <quic_mohs@quicinc.com> --- drivers/soundwire/stream.c | 16 ++++++++++++++++ include/linux/soundwire/sdw.h | 5 +++++ 2 files changed, 21 insertions(+)