Lines Matching +full:reset +full:- +full:bps

1 // SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause)
2 // Copyright(c) 2015-18 Intel Corporation.
5 * stream.c - SoundWire Bus stream operations.
72 if (bus->params.next_bank) { in _sdw_program_slave_port_params()
73 addr1 = SDW_DPN_OFFSETCTRL2_B1(t_params->port_num); in _sdw_program_slave_port_params()
74 addr2 = SDW_DPN_BLOCKCTRL3_B1(t_params->port_num); in _sdw_program_slave_port_params()
75 addr3 = SDW_DPN_SAMPLECTRL2_B1(t_params->port_num); in _sdw_program_slave_port_params()
76 addr4 = SDW_DPN_HCTRL_B1(t_params->port_num); in _sdw_program_slave_port_params()
78 addr1 = SDW_DPN_OFFSETCTRL2_B0(t_params->port_num); in _sdw_program_slave_port_params()
79 addr2 = SDW_DPN_BLOCKCTRL3_B0(t_params->port_num); in _sdw_program_slave_port_params()
80 addr3 = SDW_DPN_SAMPLECTRL2_B0(t_params->port_num); in _sdw_program_slave_port_params()
81 addr4 = SDW_DPN_HCTRL_B0(t_params->port_num); in _sdw_program_slave_port_params()
85 ret = sdw_write_no_pm(slave, addr1, t_params->offset2); in _sdw_program_slave_port_params()
87 dev_err(bus->dev, "DPN_OffsetCtrl2 register write failed\n"); in _sdw_program_slave_port_params()
92 if (t_params->port_num) { in _sdw_program_slave_port_params()
94 ret = sdw_write_no_pm(slave, addr2, t_params->blk_pkg_mode); in _sdw_program_slave_port_params()
96 dev_err(bus->dev, "DPN_BlockCtrl3 register write failed\n"); in _sdw_program_slave_port_params()
110 wbuf = FIELD_GET(SDW_DPN_SAMPLECTRL_HIGH, t_params->sample_interval - 1); in _sdw_program_slave_port_params()
114 dev_err(bus->dev, "DPN_SampleCtrl2 register write failed\n"); in _sdw_program_slave_port_params()
119 wbuf = FIELD_PREP(SDW_DPN_HCTRL_HSTART, t_params->hstart); in _sdw_program_slave_port_params()
120 wbuf |= FIELD_PREP(SDW_DPN_HCTRL_HSTOP, t_params->hstop); in _sdw_program_slave_port_params()
124 dev_err(bus->dev, "DPN_HCtrl register write failed\n"); in _sdw_program_slave_port_params()
133 struct sdw_transport_params *t_params = &p_rt->transport_params; in sdw_program_slave_port_params()
134 struct sdw_port_params *p_params = &p_rt->port_params; in sdw_program_slave_port_params()
135 struct sdw_slave_prop *slave_prop = &s_rt->slave->prop; in sdw_program_slave_port_params()
142 if (s_rt->slave->is_mockup_device) in sdw_program_slave_port_params()
145 if (t_params->port_num) { in sdw_program_slave_port_params()
148 dpn_prop = sdw_get_slave_dpn_prop(s_rt->slave, s_rt->direction, in sdw_program_slave_port_params()
149 t_params->port_num); in sdw_program_slave_port_params()
151 return -EINVAL; in sdw_program_slave_port_params()
153 read_only_wordlength = dpn_prop->read_only_wordlength; in sdw_program_slave_port_params()
154 port_type = dpn_prop->type; in sdw_program_slave_port_params()
160 addr1 = SDW_DPN_PORTCTRL(t_params->port_num); in sdw_program_slave_port_params()
161 addr2 = SDW_DPN_BLOCKCTRL1(t_params->port_num); in sdw_program_slave_port_params()
163 if (bus->params.next_bank) { in sdw_program_slave_port_params()
164 addr3 = SDW_DPN_SAMPLECTRL1_B1(t_params->port_num); in sdw_program_slave_port_params()
165 addr4 = SDW_DPN_OFFSETCTRL1_B1(t_params->port_num); in sdw_program_slave_port_params()
166 addr5 = SDW_DPN_BLOCKCTRL2_B1(t_params->port_num); in sdw_program_slave_port_params()
167 addr6 = SDW_DPN_LANECTRL_B1(t_params->port_num); in sdw_program_slave_port_params()
170 addr3 = SDW_DPN_SAMPLECTRL1_B0(t_params->port_num); in sdw_program_slave_port_params()
171 addr4 = SDW_DPN_OFFSETCTRL1_B0(t_params->port_num); in sdw_program_slave_port_params()
172 addr5 = SDW_DPN_BLOCKCTRL2_B0(t_params->port_num); in sdw_program_slave_port_params()
173 addr6 = SDW_DPN_LANECTRL_B0(t_params->port_num); in sdw_program_slave_port_params()
177 wbuf = FIELD_PREP(SDW_DPN_PORTCTRL_DATAMODE, p_params->data_mode); in sdw_program_slave_port_params()
178 wbuf |= FIELD_PREP(SDW_DPN_PORTCTRL_FLOWMODE, p_params->flow_mode); in sdw_program_slave_port_params()
180 ret = sdw_update_no_pm(s_rt->slave, addr1, 0xF, wbuf); in sdw_program_slave_port_params()
182 dev_err(&s_rt->slave->dev, in sdw_program_slave_port_params()
184 t_params->port_num); in sdw_program_slave_port_params()
190 ret = sdw_write_no_pm(s_rt->slave, addr2, (p_params->bps - 1)); in sdw_program_slave_port_params()
192 dev_err(&s_rt->slave->dev, in sdw_program_slave_port_params()
194 t_params->port_num); in sdw_program_slave_port_params()
200 wbuf = (t_params->sample_interval - 1) & SDW_DPN_SAMPLECTRL_LOW; in sdw_program_slave_port_params()
201 ret = sdw_write_no_pm(s_rt->slave, addr3, wbuf); in sdw_program_slave_port_params()
203 dev_err(&s_rt->slave->dev, in sdw_program_slave_port_params()
205 t_params->port_num); in sdw_program_slave_port_params()
210 ret = sdw_write_no_pm(s_rt->slave, addr4, t_params->offset1); in sdw_program_slave_port_params()
212 dev_err(&s_rt->slave->dev, in sdw_program_slave_port_params()
214 t_params->port_num); in sdw_program_slave_port_params()
219 if (t_params->blk_grp_ctrl_valid) { in sdw_program_slave_port_params()
220 ret = sdw_write_no_pm(s_rt->slave, addr5, t_params->blk_grp_ctrl); in sdw_program_slave_port_params()
222 dev_err(&s_rt->slave->dev, in sdw_program_slave_port_params()
224 t_params->port_num); in sdw_program_slave_port_params()
230 if (slave_prop->lane_control_support) { in sdw_program_slave_port_params()
231 ret = sdw_write_no_pm(s_rt->slave, addr6, t_params->lane_ctrl); in sdw_program_slave_port_params()
233 dev_err(&s_rt->slave->dev, in sdw_program_slave_port_params()
235 t_params->port_num); in sdw_program_slave_port_params()
241 ret = _sdw_program_slave_port_params(bus, s_rt->slave, in sdw_program_slave_port_params()
244 dev_err(&s_rt->slave->dev, in sdw_program_slave_port_params()
246 t_params->port_num); in sdw_program_slave_port_params()
263 ret = bus->port_ops->dpn_set_port_transport_params(bus, in sdw_program_master_port_params()
264 &p_rt->transport_params, in sdw_program_master_port_params()
265 bus->params.next_bank); in sdw_program_master_port_params()
269 return bus->port_ops->dpn_set_port_params(bus, in sdw_program_master_port_params()
270 &p_rt->port_params, in sdw_program_master_port_params()
271 bus->params.next_bank); in sdw_program_master_port_params()
275 * sdw_program_port_params() - Programs transport parameters of Master(s)
283 struct sdw_bus *bus = m_rt->bus; in sdw_program_port_params()
288 list_for_each_entry(s_rt, &m_rt->slave_rt_list, m_rt_node) { in sdw_program_port_params()
289 list_for_each_entry(p_rt, &s_rt->port_list, port_node) { in sdw_program_port_params()
297 list_for_each_entry(p_rt, &m_rt->port_list, port_node) { in sdw_program_port_params()
322 struct sdw_transport_params *t_params = &p_rt->transport_params; in sdw_enable_disable_slave_ports()
326 if (bus->params.next_bank) in sdw_enable_disable_slave_ports()
327 addr = SDW_DPN_CHANNELEN_B1(p_rt->num); in sdw_enable_disable_slave_ports()
329 addr = SDW_DPN_CHANNELEN_B0(p_rt->num); in sdw_enable_disable_slave_ports()
333 * it is safe to reset this register in sdw_enable_disable_slave_ports()
336 ret = sdw_write_no_pm(s_rt->slave, addr, p_rt->ch_mask); in sdw_enable_disable_slave_ports()
338 ret = sdw_write_no_pm(s_rt->slave, addr, 0x0); in sdw_enable_disable_slave_ports()
341 dev_err(&s_rt->slave->dev, in sdw_enable_disable_slave_ports()
343 ret, t_params->port_num); in sdw_enable_disable_slave_ports()
352 struct sdw_transport_params *t_params = &p_rt->transport_params; in sdw_enable_disable_master_ports()
353 struct sdw_bus *bus = m_rt->bus; in sdw_enable_disable_master_ports()
357 enable_ch.port_num = p_rt->num; in sdw_enable_disable_master_ports()
358 enable_ch.ch_mask = p_rt->ch_mask; in sdw_enable_disable_master_ports()
362 if (bus->port_ops->dpn_port_enable_ch) { in sdw_enable_disable_master_ports()
363 ret = bus->port_ops->dpn_port_enable_ch(bus, in sdw_enable_disable_master_ports()
365 bus->params.next_bank); in sdw_enable_disable_master_ports()
367 dev_err(bus->dev, in sdw_enable_disable_master_ports()
369 ret, t_params->port_num); in sdw_enable_disable_master_ports()
373 dev_err(bus->dev, in sdw_enable_disable_master_ports()
376 return -EINVAL; in sdw_enable_disable_master_ports()
383 * sdw_enable_disable_ports() - Enable/disable port(s) for Master and
396 list_for_each_entry(s_rt, &m_rt->slave_rt_list, m_rt_node) { in sdw_enable_disable_ports()
397 list_for_each_entry(s_port, &s_rt->port_list, port_node) { in sdw_enable_disable_ports()
398 ret = sdw_enable_disable_slave_ports(m_rt->bus, s_rt, in sdw_enable_disable_ports()
406 list_for_each_entry(m_port, &m_rt->port_list, port_node) { in sdw_enable_disable_ports()
420 struct sdw_slave *slave = s_rt->slave; in sdw_do_port_prep()
422 mutex_lock(&slave->sdw_dev_lock); in sdw_do_port_prep()
424 if (slave->probed) { in sdw_do_port_prep()
425 struct device *dev = &slave->dev; in sdw_do_port_prep()
426 struct sdw_driver *drv = drv_to_sdw_driver(dev->driver); in sdw_do_port_prep()
428 if (drv->ops && drv->ops->port_prep) { in sdw_do_port_prep()
429 ret = drv->ops->port_prep(slave, &prep_ch, cmd); in sdw_do_port_prep()
436 mutex_unlock(&slave->sdw_dev_lock); in sdw_do_port_prep()
456 prep_ch.num = p_rt->num; in sdw_prep_deprep_slave_ports()
457 prep_ch.ch_mask = p_rt->ch_mask; in sdw_prep_deprep_slave_ports()
459 if (p_rt->num) { in sdw_prep_deprep_slave_ports()
460 dpn_prop = sdw_get_slave_dpn_prop(s_rt->slave, s_rt->direction, prep_ch.num); in sdw_prep_deprep_slave_ports()
462 dev_err(bus->dev, in sdw_prep_deprep_slave_ports()
464 return -EINVAL; in sdw_prep_deprep_slave_ports()
467 imp_def_interrupts = dpn_prop->imp_def_interrupts; in sdw_prep_deprep_slave_ports()
468 simple_ch_prep_sm = dpn_prop->simple_ch_prep_sm; in sdw_prep_deprep_slave_ports()
469 ch_prep_timeout = dpn_prop->ch_prep_timeout; in sdw_prep_deprep_slave_ports()
471 struct sdw_dp0_prop *dp0_prop = s_rt->slave->prop.dp0_prop; in sdw_prep_deprep_slave_ports()
474 dev_err(bus->dev, in sdw_prep_deprep_slave_ports()
476 return -EINVAL; in sdw_prep_deprep_slave_ports()
478 imp_def_interrupts = dp0_prop->imp_def_interrupts; in sdw_prep_deprep_slave_ports()
479 simple_ch_prep_sm = dp0_prop->simple_ch_prep_sm; in sdw_prep_deprep_slave_ports()
480 ch_prep_timeout = dp0_prop->ch_prep_timeout; in sdw_prep_deprep_slave_ports()
485 prep_ch.bank = bus->params.next_bank; in sdw_prep_deprep_slave_ports()
488 bus->params.s_data_mode != SDW_PORT_DATA_MODE_NORMAL) in sdw_prep_deprep_slave_ports()
493 * For Port de-prepare, it is assumed that port in sdw_prep_deprep_slave_ports()
497 ret = sdw_configure_dpn_intr(s_rt->slave, p_rt->num, prep, in sdw_prep_deprep_slave_ports()
508 addr = SDW_DPN_PREPARECTRL(p_rt->num); in sdw_prep_deprep_slave_ports()
511 ret = sdw_write_no_pm(s_rt->slave, addr, p_rt->ch_mask); in sdw_prep_deprep_slave_ports()
513 ret = sdw_write_no_pm(s_rt->slave, addr, 0x0); in sdw_prep_deprep_slave_ports()
516 dev_err(&s_rt->slave->dev, in sdw_prep_deprep_slave_ports()
522 port_ready = &s_rt->slave->port_ready[prep_ch.num]; in sdw_prep_deprep_slave_ports()
526 val = sdw_read_no_pm(s_rt->slave, SDW_DPN_PREPARESTATUS(p_rt->num)); in sdw_prep_deprep_slave_ports()
527 if ((val < 0) || (val & p_rt->ch_mask)) { in sdw_prep_deprep_slave_ports()
528 ret = (val < 0) ? val : -ETIMEDOUT; in sdw_prep_deprep_slave_ports()
529 dev_err(&s_rt->slave->dev, in sdw_prep_deprep_slave_ports()
538 /* Disable interrupt after Port de-prepare */ in sdw_prep_deprep_slave_ports()
540 ret = sdw_configure_dpn_intr(s_rt->slave, p_rt->num, prep, in sdw_prep_deprep_slave_ports()
550 struct sdw_transport_params *t_params = &p_rt->transport_params; in sdw_prep_deprep_master_ports()
551 struct sdw_bus *bus = m_rt->bus; in sdw_prep_deprep_master_ports()
552 const struct sdw_master_port_ops *ops = bus->port_ops; in sdw_prep_deprep_master_ports()
556 prep_ch.num = p_rt->num; in sdw_prep_deprep_master_ports()
557 prep_ch.ch_mask = p_rt->ch_mask; in sdw_prep_deprep_master_ports()
558 prep_ch.prepare = prep; /* Prepare/De-prepare */ in sdw_prep_deprep_master_ports()
559 prep_ch.bank = bus->params.next_bank; in sdw_prep_deprep_master_ports()
561 /* Pre-prepare/Pre-deprepare port(s) */ in sdw_prep_deprep_master_ports()
562 if (ops->dpn_port_prep) { in sdw_prep_deprep_master_ports()
563 ret = ops->dpn_port_prep(bus, &prep_ch); in sdw_prep_deprep_master_ports()
565 dev_err(bus->dev, "Port prepare failed for port:%d\n", in sdw_prep_deprep_master_ports()
566 t_params->port_num); in sdw_prep_deprep_master_ports()
575 * sdw_prep_deprep_ports() - Prepare/De-prepare port(s) for Master(s) and
579 * @prep: Prepare or De-prepare
587 /* Prepare/De-prepare Slave port(s) */ in sdw_prep_deprep_ports()
588 list_for_each_entry(s_rt, &m_rt->slave_rt_list, m_rt_node) { in sdw_prep_deprep_ports()
589 list_for_each_entry(p_rt, &s_rt->port_list, port_node) { in sdw_prep_deprep_ports()
590 ret = sdw_prep_deprep_slave_ports(m_rt->bus, s_rt, in sdw_prep_deprep_ports()
597 /* Prepare/De-prepare Master port(s) */ in sdw_prep_deprep_ports()
598 list_for_each_entry(p_rt, &m_rt->port_list, port_node) { in sdw_prep_deprep_ports()
608 * sdw_notify_config() - Notify bus configuration
618 struct sdw_bus *bus = m_rt->bus; in sdw_notify_config()
622 if (bus->ops->set_bus_conf) { in sdw_notify_config()
623 ret = bus->ops->set_bus_conf(bus, &bus->params); in sdw_notify_config()
628 list_for_each_entry(s_rt, &m_rt->slave_rt_list, m_rt_node) { in sdw_notify_config()
629 slave = s_rt->slave; in sdw_notify_config()
631 mutex_lock(&slave->sdw_dev_lock); in sdw_notify_config()
633 if (slave->probed) { in sdw_notify_config()
634 struct device *dev = &slave->dev; in sdw_notify_config()
635 struct sdw_driver *drv = drv_to_sdw_driver(dev->driver); in sdw_notify_config()
637 if (drv->ops && drv->ops->bus_config) { in sdw_notify_config()
638 ret = drv->ops->bus_config(slave, &bus->params); in sdw_notify_config()
641 slave->dev_num); in sdw_notify_config()
642 mutex_unlock(&slave->sdw_dev_lock); in sdw_notify_config()
648 mutex_unlock(&slave->sdw_dev_lock); in sdw_notify_config()
655 * sdw_program_params() - Program transport and port parameters for Master(s)
669 list_for_each_entry(slave, &bus->slaves, node) { in sdw_program_params()
670 if (!slave->dev_num_sticky) in sdw_program_params()
673 dev_dbg(&slave->dev, "The Peripheral doesn't comply with SDCA\n"); in sdw_program_params()
678 if (bus->params.next_bank) in sdw_program_params()
684 list_for_each_entry(slave, &bus->slaves, node) { in sdw_program_params()
688 if (!slave->dev_num_sticky) in sdw_program_params()
696 dev_err(&slave->dev, "SDW_SCP_BUSCLOCK_SCALE register write failed\n"); in sdw_program_params()
702 list_for_each_entry(m_rt, &bus->m_rt_list, bus_node) { 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()
716 dev_err(bus->dev, in sdw_program_params()
723 dev_err(bus->dev, in sdw_program_params()
729 if (m_rt->stream->state != SDW_STREAM_ENABLED) in sdw_program_params()
734 dev_err(bus->dev, "Enable channel failed: %d\n", ret); in sdw_program_params()
753 return -ENOMEM; in sdw_bank_switch()
757 ret = -ENOMEM; in sdw_bank_switch()
762 col_index = sdw_find_col_index(bus->params.col); in sdw_bank_switch()
763 row_index = sdw_find_row_index(bus->params.row); in sdw_bank_switch()
766 if (bus->params.next_bank) in sdw_bank_switch()
773 wr_msg->ssp_sync = true; in sdw_bank_switch()
777 * and hardware-based sync is required in sdw_bank_switch()
779 multi_link = bus->multi_link && (m_rt_count >= bus->hw_sync_min_links); in sdw_bank_switch()
786 if (ret < 0 && ret != -ENODATA) { in sdw_bank_switch()
787 dev_err(bus->dev, "Slave frame_ctrl reg write failed\n"); in sdw_bank_switch()
794 bus->defer_msg.msg = NULL; in sdw_bank_switch()
795 bus->params.curr_bank = !bus->params.curr_bank; in sdw_bank_switch()
796 bus->params.next_bank = !bus->params.next_bank; in sdw_bank_switch()
805 bus->defer_msg.msg = NULL; in sdw_bank_switch()
813 * @multi_link: whether this is a multi-link stream with hardware-based sync
825 time_left = wait_for_completion_timeout(&bus->defer_msg.complete, in sdw_ml_sync_bank_switch()
826 bus->bank_switch_timeout); in sdw_ml_sync_bank_switch()
829 dev_err(bus->dev, "Controller Timed out on bank switch\n"); in sdw_ml_sync_bank_switch()
830 return -ETIMEDOUT; in sdw_ml_sync_bank_switch()
833 bus->params.curr_bank = !bus->params.curr_bank; in sdw_ml_sync_bank_switch()
834 bus->params.next_bank = !bus->params.next_bank; in sdw_ml_sync_bank_switch()
836 if (bus->defer_msg.msg) { in sdw_ml_sync_bank_switch()
837 kfree(bus->defer_msg.msg->buf); in sdw_ml_sync_bank_switch()
838 kfree(bus->defer_msg.msg); in sdw_ml_sync_bank_switch()
839 bus->defer_msg.msg = NULL; in sdw_ml_sync_bank_switch()
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()
857 bus = m_rt->bus; in do_bank_switch()
858 ops = bus->ops; in do_bank_switch()
860 if (bus->multi_link && m_rt_count >= bus->hw_sync_min_links) { in do_bank_switch()
862 mutex_lock(&bus->msg_lock); in do_bank_switch()
865 /* Pre-bank switch */ in do_bank_switch()
866 if (ops->pre_bank_switch) { in do_bank_switch()
867 ret = ops->pre_bank_switch(bus); in do_bank_switch()
869 dev_err(bus->dev, in do_bank_switch()
883 dev_err(bus->dev, "Bank switch failed: %d\n", ret); in do_bank_switch()
894 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in do_bank_switch()
895 bus = m_rt->bus; in do_bank_switch()
896 ops = bus->ops; in do_bank_switch()
898 /* Post-bank switch */ in do_bank_switch()
899 if (ops->post_bank_switch) { in do_bank_switch()
900 ret = ops->post_bank_switch(bus); in do_bank_switch()
902 dev_err(bus->dev, in do_bank_switch()
908 dev_err(bus->dev, in do_bank_switch()
910 ret = -EINVAL; in do_bank_switch()
915 if (!bus->bank_switch_timeout) in do_bank_switch()
916 bus->bank_switch_timeout = DEFAULT_BANK_SWITCH_TIMEOUT; in do_bank_switch()
921 dev_err(bus->dev, in do_bank_switch()
927 mutex_unlock(&bus->msg_lock); in do_bank_switch()
933 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in do_bank_switch()
934 bus = m_rt->bus; in do_bank_switch()
935 if (bus->defer_msg.msg) { in do_bank_switch()
936 kfree(bus->defer_msg.msg->buf); in do_bank_switch()
937 kfree(bus->defer_msg.msg); in do_bank_switch()
938 bus->defer_msg.msg = NULL; in do_bank_switch()
945 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in do_bank_switch()
946 bus = m_rt->bus; in do_bank_switch()
947 if (mutex_is_locked(&bus->msg_lock)) in do_bank_switch()
948 mutex_unlock(&bus->msg_lock); in do_bank_switch()
963 list_add_tail(&p_rt->port_node, port_list); in sdw_port_alloc()
972 p_rt->ch_mask = port_config[port_index].ch_mask; in sdw_port_config()
973 p_rt->num = port_config[port_index].num; in sdw_port_config()
984 list_del(&p_rt->port_node); in sdw_port_free()
990 return !list_empty(&s_rt->port_list); in sdw_slave_port_allocated()
1000 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in sdw_slave_port_free()
1001 list_for_each_entry(s_rt, &m_rt->slave_rt_list, m_rt_node) { in sdw_slave_port_free()
1002 if (s_rt->slave != slave) in sdw_slave_port_free()
1006 &s_rt->port_list, port_node) { in sdw_slave_port_free()
1022 p_rt = sdw_port_alloc(&s_rt->port_list); in sdw_slave_port_alloc()
1024 return -ENOMEM; in sdw_slave_port_alloc()
1034 return -EINVAL; in sdw_slave_port_is_valid_range()
1050 list_for_each_entry(p_rt, &s_rt->port_list, port_node) { in sdw_slave_port_config()
1056 ret = sdw_slave_port_is_valid_range(&slave->dev, port_config[i].num); in sdw_slave_port_config()
1060 return -EINVAL; in sdw_slave_port_config()
1074 return !list_empty(&m_rt->port_list); in sdw_master_port_allocated()
1081 list_for_each_entry_safe(p_rt, _p_rt, &m_rt->port_list, port_node) { in sdw_master_port_free()
1094 p_rt = sdw_port_alloc(&m_rt->port_list); in sdw_master_port_alloc()
1096 return -ENOMEM; in sdw_master_port_alloc()
1110 list_for_each_entry(p_rt, &m_rt->port_list, port_node) { in sdw_master_port_config()
1121 * sdw_slave_rt_alloc() - Allocate a Slave runtime handle.
1138 INIT_LIST_HEAD(&s_rt->port_list); in sdw_slave_rt_alloc()
1139 s_rt->slave = slave; in sdw_slave_rt_alloc()
1141 list_add_tail(&s_rt->m_rt_node, &m_rt->slave_rt_list); in sdw_slave_rt_alloc()
1147 * sdw_slave_rt_config() - Configure a Slave runtime handle.
1157 s_rt->ch_count = stream_config->ch_count; in sdw_slave_rt_config()
1158 s_rt->direction = stream_config->direction; in sdw_slave_rt_config()
1169 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in sdw_slave_rt_find()
1172 &m_rt->slave_rt_list, m_rt_node) { in sdw_slave_rt_find()
1173 if (s_rt->slave == slave) in sdw_slave_rt_find()
1181 * sdw_slave_rt_free() - Free Slave(s) runtime handle
1195 list_del(&s_rt->m_rt_node); in sdw_slave_rt_free()
1207 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in sdw_master_rt_find()
1208 if (m_rt->bus == bus) in sdw_master_rt_find()
1216 * sdw_master_rt_alloc() - Allocates a Master runtime handle
1230 if (stream->type == SDW_STREAM_BPT) { in sdw_master_rt_alloc()
1231 if (bus->stream_refcount > 0 || bus->bpt_stream_refcount > 0) { in sdw_master_rt_alloc()
1232 dev_err(bus->dev, "%s: %d/%d audio/BPT stream already allocated\n", in sdw_master_rt_alloc()
1233 __func__, bus->stream_refcount, bus->bpt_stream_refcount); in sdw_master_rt_alloc()
1234 return ERR_PTR(-EBUSY); in sdw_master_rt_alloc()
1237 if (bus->bpt_stream_refcount > 0) { in sdw_master_rt_alloc()
1238 dev_err(bus->dev, "%s: BPT stream already allocated\n", in sdw_master_rt_alloc()
1240 return ERR_PTR(-EAGAIN); in sdw_master_rt_alloc()
1249 INIT_LIST_HEAD(&m_rt->port_list); in sdw_master_rt_alloc()
1250 INIT_LIST_HEAD(&m_rt->slave_rt_list); 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()
1259 if (walk_m_rt->bus->id < bus->id) { in sdw_master_rt_alloc()
1260 insert_after = &walk_m_rt->stream_node; in sdw_master_rt_alloc()
1264 list_add(&m_rt->stream_node, insert_after); in sdw_master_rt_alloc()
1266 list_add_tail(&m_rt->bus_node, &bus->m_rt_list); in sdw_master_rt_alloc()
1268 m_rt->bus = bus; in sdw_master_rt_alloc()
1269 m_rt->stream = stream; in sdw_master_rt_alloc()
1271 bus->stream_refcount++; in sdw_master_rt_alloc()
1272 if (stream->type == SDW_STREAM_BPT) in sdw_master_rt_alloc()
1273 bus->bpt_stream_refcount++; in sdw_master_rt_alloc()
1279 * sdw_master_rt_config() - Configure Master runtime handle
1290 m_rt->ch_count = stream_config->ch_count; in sdw_master_rt_config()
1291 m_rt->direction = stream_config->direction; in sdw_master_rt_config()
1297 * sdw_master_rt_free() - Free Master runtime handle
1311 struct sdw_bus *bus = m_rt->bus; in sdw_master_rt_free()
1313 list_for_each_entry_safe(s_rt, _s_rt, &m_rt->slave_rt_list, m_rt_node) { in sdw_master_rt_free()
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()
1318 list_del(&m_rt->stream_node); in sdw_master_rt_free()
1319 list_del(&m_rt->bus_node); in sdw_master_rt_free()
1322 if (stream->type == SDW_STREAM_BPT) in sdw_master_rt_free()
1323 bus->bpt_stream_refcount--; in sdw_master_rt_free()
1324 bus->stream_refcount--; in sdw_master_rt_free()
1328 * sdw_config_stream() - Configure the allocated stream
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()
1347 * If rate/bps is zero, it means the values are not set, so skip 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()
1353 return -EINVAL; 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()
1359 return -EINVAL; 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()
1366 /* TODO: Update this check during Device-device support */ in sdw_config_stream()
1368 stream->params.ch_count += stream_config->ch_count; in sdw_config_stream()
1374 * sdw_get_slave_dpn_prop() - Get Slave port capabilities
1389 dev_err(&slave->dev, "%s: port_num is zero\n", __func__); in sdw_get_slave_dpn_prop()
1394 num_ports = hweight32(slave->prop.source_ports); in sdw_get_slave_dpn_prop()
1395 dpn_prop = slave->prop.src_dpn_prop; in sdw_get_slave_dpn_prop()
1397 num_ports = hweight32(slave->prop.sink_ports); in sdw_get_slave_dpn_prop()
1398 dpn_prop = slave->prop.sink_dpn_prop; in sdw_get_slave_dpn_prop()
1425 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in sdw_acquire_bus_lock()
1426 bus = m_rt->bus; in sdw_acquire_bus_lock()
1428 mutex_lock(&bus->bus_lock); in sdw_acquire_bus_lock()
1447 list_for_each_entry_reverse(m_rt, &stream->master_list, stream_node) { in sdw_release_bus_lock()
1448 bus = m_rt->bus; in sdw_release_bus_lock()
1449 mutex_unlock(&bus->bus_lock); in sdw_release_bus_lock()
1463 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in _sdw_prepare_stream()
1464 bus = m_rt->bus; in _sdw_prepare_stream()
1465 prop = &bus->prop; in _sdw_prepare_stream()
1466 memcpy(&params, &bus->params, sizeof(params)); in _sdw_prepare_stream()
1469 if ((prop->max_clk_freq % stream->params.rate) != 0) { in _sdw_prepare_stream()
1470 dev_err(bus->dev, "Async mode not supported\n"); in _sdw_prepare_stream()
1471 return -EINVAL; in _sdw_prepare_stream()
1476 /* TODO: Update this during Device-Device support */ 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()
1481 if (bus->compute_params) { in _sdw_prepare_stream()
1482 ret = bus->compute_params(bus, stream); in _sdw_prepare_stream()
1484 dev_err(bus->dev, "Compute params failed: %d\n", in _sdw_prepare_stream()
1494 dev_err(bus->dev, "Program params failed: %d\n", ret); in _sdw_prepare_stream()
1505 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in _sdw_prepare_stream()
1506 bus = m_rt->bus; in _sdw_prepare_stream()
1511 dev_err(bus->dev, "Prepare port(s) failed ret = %d\n", in _sdw_prepare_stream()
1517 stream->state = SDW_STREAM_PREPARED; in _sdw_prepare_stream()
1522 memcpy(&bus->params, &params, sizeof(params)); in _sdw_prepare_stream()
1527 * sdw_prepare_stream() - Prepare SoundWire stream
1531 * Documentation/driver-api/soundwire/stream.rst explains this API in detail
1540 return -EINVAL; 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()
1555 ret = -EINVAL; in sdw_prepare_stream()
1563 * still need to be re-applied in sdw_prepare_stream()
1565 if (stream->state == SDW_STREAM_DISABLED) in sdw_prepare_stream()
1583 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in _sdw_enable_stream()
1584 bus = m_rt->bus; in _sdw_enable_stream()
1589 dev_err(bus->dev, "%s: Program params failed: %d\n", __func__, ret); in _sdw_enable_stream()
1596 dev_err(bus->dev, in _sdw_enable_stream()
1608 stream->state = SDW_STREAM_ENABLED; in _sdw_enable_stream()
1613 * sdw_enable_stream() - Enable SoundWire stream
1617 * Documentation/driver-api/soundwire/stream.rst explains this API in detail
1625 return -EINVAL; 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()
1639 ret = -EINVAL; in sdw_enable_stream()
1656 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in _sdw_disable_stream()
1657 struct sdw_bus *bus = m_rt->bus; in _sdw_disable_stream()
1662 dev_err(bus->dev, "Disable port(s) failed: %d\n", ret); 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()
1669 struct sdw_bus *bus = m_rt->bus; in _sdw_disable_stream()
1674 dev_err(bus->dev, "%s: Program params failed: %d\n", __func__, ret); in _sdw_disable_stream()
1686 list_for_each_entry(m_rt, &stream->master_list, stream_node) { in _sdw_disable_stream()
1687 struct sdw_bus *bus = m_rt->bus; in _sdw_disable_stream()
1692 dev_err(bus->dev, "Disable port(s) failed: %d\n", ret); in _sdw_disable_stream()
1701 * sdw_disable_stream() - Disable SoundWire stream
1705 * Documentation/driver-api/soundwire/stream.rst explains this API in detail
1713 return -EINVAL; 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()
1726 ret = -EINVAL; in sdw_disable_stream()
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()
1755 bus = m_rt->bus; in _sdw_deprepare_stream()
1756 /* De-prepare port(s) */ in _sdw_deprepare_stream()
1759 dev_err(bus->dev, in _sdw_deprepare_stream()
1760 "De-prepare port(s) failed: %d\n", ret); in _sdw_deprepare_stream()
1761 stream->state = state; in _sdw_deprepare_stream()
1767 list_for_each_entry(p_rt, &m_rt->port_list, port_node) { in _sdw_deprepare_stream()
1768 if (!p_rt->lane) 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()
1774 bus->lane_used_bandwidth[p_rt->lane] -= bandwidth; in _sdw_deprepare_stream()
1775 if (!bus->lane_used_bandwidth[p_rt->lane]) in _sdw_deprepare_stream()
1776 p_rt->lane = 0; in _sdw_deprepare_stream()
1778 /* TODO: Update this during Device-Device support */ in _sdw_deprepare_stream()
1779 bandwidth = m_rt->stream->params.rate * m_rt->ch_count * m_rt->stream->params.bps; in _sdw_deprepare_stream()
1780 bus->params.bandwidth -= bandwidth - multi_lane_bandwidth; in _sdw_deprepare_stream()
1783 if (bus->compute_params) { in _sdw_deprepare_stream()
1784 ret = bus->compute_params(bus, stream); in _sdw_deprepare_stream()
1786 dev_err(bus->dev, "Compute params failed: %d\n", in _sdw_deprepare_stream()
1788 stream->state = state; in _sdw_deprepare_stream()
1796 dev_err(bus->dev, "%s: Program params failed: %d\n", __func__, ret); in _sdw_deprepare_stream()
1797 stream->state = state; in _sdw_deprepare_stream()
1806 * sdw_deprepare_stream() - Deprepare SoundWire stream
1810 * Documentation/driver-api/soundwire/stream.rst explains this API in detail
1818 return -EINVAL; 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()
1832 ret = -EINVAL; in sdw_deprepare_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
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()
1893 * sdw_startup_stream() - Startup 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()
1908 name = kasprintf(GFP_KERNEL, "%s-Playback", substream->name); in sdw_startup_stream()
1910 name = kasprintf(GFP_KERNEL, "%s-Capture", substream->name); in sdw_startup_stream()
1913 return -ENOMEM; in sdw_startup_stream()
1917 dev_err(rtd->dev, "alloc stream failed for substream DAI %s\n", substream->name); in sdw_startup_stream()
1918 ret = -ENOMEM; in sdw_startup_stream()
1937 * sdw_shutdown_stream() - Shutdown SoundWire stream
1941 * Documentation/driver-api/soundwire/stream.rst explains this API in detail
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()
1961 kfree(sdw_stream->name); in sdw_shutdown_stream()
1970 * sdw_release_stream() - Free the assigned stream runtime
1983 * sdw_stream_add_master() - Allocate and add master runtime to a stream
2001 mutex_lock(&bus->bus_lock); in sdw_stream_add_master()
2006 * Check if bus->multi_link is set in sdw_stream_add_master()
2008 if (!bus->multi_link && stream->m_rt_count > 0) { in sdw_stream_add_master()
2009 dev_err(bus->dev, in sdw_stream_add_master()
2010 "Multilink not supported, link %d\n", bus->link_id); in sdw_stream_add_master()
2011 ret = -EINVAL; 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()
2031 ret = -ENOMEM; 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()
2065 mutex_unlock(&bus->bus_lock); in sdw_stream_add_master()
2071 * sdw_stream_remove_master() - Remove master from sdw_stream
2083 mutex_lock(&bus->bus_lock); in sdw_stream_remove_master()
2086 &stream->master_list, stream_node) { in sdw_stream_remove_master()
2087 if (m_rt->bus != bus) 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()
2098 mutex_unlock(&bus->bus_lock); in sdw_stream_remove_master()
2105 * sdw_stream_add_slave() - Allocate and add master/slave runtime to a stream
2130 mutex_lock(&slave->bus->bus_lock); in sdw_stream_add_slave()
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()
2152 ret = -ENOMEM; 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()
2165 ret = -ENOMEM; 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()
2201 stream->state = SDW_STREAM_CONFIGURED; in sdw_stream_add_slave()
2215 mutex_unlock(&slave->bus->bus_lock); in sdw_stream_add_slave()
2221 * sdw_stream_remove_slave() - Remove slave from sdw_stream
2231 mutex_lock(&slave->bus->bus_lock); in sdw_stream_remove_slave()
2236 mutex_unlock(&slave->bus->bus_lock); in sdw_stream_remove_slave()