Lines Matching +full:stream +full:- +full:match +full:- +full:mask

1 // SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause)
2 // Copyright(c) 2015-17 Intel Corporation.
34 #define CDNS_IP_MCP_CONFIG 0x0 /* IP offset added at run-time */
51 #define CDNS_IP_MCP_CONTROL 0x4 /* IP offset added at run-time */
59 #define CDNS_IP_MCP_CMDCTRL 0x8 /* IP offset added at run-time */
134 #define CDNS_IP_MCP_CMD_BASE 0x80 /* IP offset added at run-time */
135 #define CDNS_IP_MCP_RESP_BASE 0x80 /* IP offset added at run-time */
208 return readl(cdns->registers + offset); in cdns_readl()
213 writel(value, cdns->registers + offset); in cdns_writel()
218 return cdns_readl(cdns, cdns->ip_offset + offset); in cdns_ip_readl()
223 return cdns_writel(cdns, cdns->ip_offset + offset, value); in cdns_ip_writel()
227 int offset, u32 mask, u32 val) in cdns_updatel() argument
232 tmp = (tmp & ~mask) | val; in cdns_updatel()
237 int offset, u32 mask, u32 val) in cdns_ip_updatel() argument
239 cdns_updatel(cdns, cdns->ip_offset + offset, mask, val); in cdns_ip_updatel()
242 static int cdns_set_wait(struct sdw_cdns *cdns, int offset, u32 mask, u32 value) in cdns_set_wait() argument
249 reg_read = readl(cdns->registers + offset); in cdns_set_wait()
250 if ((reg_read & mask) == value) in cdns_set_wait()
253 timeout--; in cdns_set_wait()
257 return -ETIMEDOUT; in cdns_set_wait()
262 writel(value, cdns->registers + offset); in cdns_clear_bit()
277 dev_err(cdns->dev, "Cannot program MCP_CONFIG_UPDATE in ClockStopMode\n"); in cdns_config_update()
278 return -EINVAL; in cdns_config_update()
284 dev_err(cdns->dev, "Config update timedout\n"); in cdns_config_update()
290 * sdw_cdns_config_update() - Update configurations
301 * sdw_cdns_config_update_set_wait() - wait until configuration update bit is self-cleared
322 return scnprintf(buf + pos, RD_BUF - pos, in cdns_sprintf()
328 struct sdw_cdns *cdns = s->private; in cdns_reg_show()
335 return -ENOMEM; in cdns_reg_show()
338 ret += scnprintf(buf + ret, RD_BUF - ret, "\nMCP Registers\n"); in cdns_reg_show()
343 ret += scnprintf(buf + ret, RD_BUF - ret, in cdns_reg_show()
349 ret += scnprintf(buf + ret, RD_BUF - ret, in cdns_reg_show()
356 ret += scnprintf(buf + ret, RD_BUF - ret, in cdns_reg_show()
359 num_ports = cdns->num_ports; in cdns_reg_show()
362 ret += scnprintf(buf + ret, RD_BUF - ret, in cdns_reg_show()
363 "\nDP-%d\n", i); in cdns_reg_show()
369 ret += scnprintf(buf + ret, RD_BUF - ret, in cdns_reg_show()
372 ret += scnprintf(buf + ret, RD_BUF - ret, in cdns_reg_show()
373 "\nDP-%d\n", i); in cdns_reg_show()
380 ret += scnprintf(buf + ret, RD_BUF - ret, in cdns_reg_show()
386 ret += scnprintf(buf + ret, RD_BUF - ret, in cdns_reg_show()
405 return -EINVAL; in cdns_hw_reset()
412 dev_dbg(cdns->dev, "link hw_reset done: %d\n", ret); in cdns_hw_reset()
426 return -EINVAL; in cdns_parity_error_injection()
428 bus = &cdns->bus; in cdns_parity_error_injection()
432 * Slave devices will re-attach and be re-enumerated. in cdns_parity_error_injection()
434 ret = pm_runtime_resume_and_get(bus->dev); in cdns_parity_error_injection()
435 if (ret < 0 && ret != -EACCES) { in cdns_parity_error_injection()
436 dev_err_ratelimited(cdns->dev, in cdns_parity_error_injection()
452 mutex_lock(&bus->bus_lock); in cdns_parity_error_injection()
465 ret = sdw_bread_no_pm_unlocked(&cdns->bus, 0xf, SDW_SCP_DEVID_0); in cdns_parity_error_injection()
466 dev_info(cdns->dev, "parity error injection, read: %d\n", ret); in cdns_parity_error_injection()
483 mutex_unlock(&bus->bus_lock); in cdns_parity_error_injection()
489 pm_runtime_mark_last_busy(bus->dev); in cdns_parity_error_injection()
490 pm_runtime_put_autosuspend(bus->dev); in cdns_parity_error_injection()
501 unsigned int pdi_out_num = cdns->pcm.num_bd + cdns->pcm.num_out; in cdns_set_pdi_loopback_source()
504 return -EINVAL; in cdns_set_pdi_loopback_source()
509 cdns->pdi_loopback_source = value; in cdns_set_pdi_loopback_source()
518 unsigned int pdi_in_num = cdns->pcm.num_bd + cdns->pcm.num_in; in cdns_set_pdi_loopback_target()
521 return -EINVAL; in cdns_set_pdi_loopback_target()
526 cdns->pdi_loopback_target = value; in cdns_set_pdi_loopback_target()
533 * sdw_cdns_debugfs_init() - Cadence debugfs init
539 debugfs_create_file("cdns-registers", 0400, root, cdns, &cdns_reg_fops); in sdw_cdns_debugfs_init()
541 debugfs_create_file("cdns-hw-reset", 0200, root, cdns, in sdw_cdns_debugfs_init()
544 debugfs_create_file("cdns-parity-error-injection", 0200, root, cdns, in sdw_cdns_debugfs_init()
547 cdns->pdi_loopback_source = -1; in sdw_cdns_debugfs_init()
548 cdns->pdi_loopback_target = -1; in sdw_cdns_debugfs_init()
550 debugfs_create_file("cdns-pdi-loopback-source", 0200, root, cdns, in sdw_cdns_debugfs_init()
553 debugfs_create_file("cdns-pdi-loopback-target", 0200, root, cdns, in sdw_cdns_debugfs_init()
573 if (!(cdns->response_buf[i] & CDNS_MCP_RESP_ACK)) { in cdns_fill_msg_resp()
575 dev_vdbg(cdns->dev, "Msg Ack not received, cmd %d\n", i); in cdns_fill_msg_resp()
577 if (cdns->response_buf[i] & CDNS_MCP_RESP_NACK) { in cdns_fill_msg_resp()
579 dev_err_ratelimited(cdns->dev, "Msg NACK received, cmd %d\n", i); in cdns_fill_msg_resp()
584 dev_err_ratelimited(cdns->dev, "Msg NACKed for Slave %d\n", msg->dev_num); in cdns_fill_msg_resp()
589 dev_dbg_ratelimited(cdns->dev, "Msg ignored for Slave %d\n", msg->dev_num); in cdns_fill_msg_resp()
593 if (msg->flags == SDW_MSG_FLAG_READ) { in cdns_fill_msg_resp()
596 msg->buf[i + offset] = FIELD_GET(CDNS_MCP_RESP_RDATA, in cdns_fill_msg_resp()
597 cdns->response_buf[i]); in cdns_fill_msg_resp()
609 BUILD_BUG_ON(ARRAY_SIZE(cdns->response_buf) < CDNS_MCP_CMD_LEN + 2); in cdns_read_response()
613 if (num_resp > ARRAY_SIZE(cdns->response_buf)) { in cdns_read_response()
614 dev_warn(cdns->dev, "RX AVAIL %d too long\n", num_resp); in cdns_read_response()
615 num_resp = ARRAY_SIZE(cdns->response_buf); in cdns_read_response()
621 cdns->response_buf[i] = cdns_ip_readl(cdns, cmd_base); in cdns_read_response()
635 if (cdns->msg_count != count) { in _cdns_xfer_msg()
637 cdns->msg_count = count; in _cdns_xfer_msg()
641 addr = msg->addr + offset; in _cdns_xfer_msg()
644 data = FIELD_PREP(CDNS_MCP_CMD_DEV_ADDR, msg->dev_num); in _cdns_xfer_msg()
649 if (msg->flags == SDW_MSG_FLAG_WRITE) in _cdns_xfer_msg()
650 data |= msg->buf[i + offset]; in _cdns_xfer_msg()
652 data |= FIELD_PREP(CDNS_MCP_CMD_SSP_TAG, msg->ssp_sync); in _cdns_xfer_msg()
661 time = wait_for_completion_timeout(&cdns->tx_complete, in _cdns_xfer_msg()
664 dev_err(cdns->dev, "IO transfer timed out, cmd %d device %d addr %x len %d\n", in _cdns_xfer_msg()
665 cmd, msg->dev_num, msg->addr, msg->len); in _cdns_xfer_msg()
666 msg->len = 0; in _cdns_xfer_msg()
686 if (cdns->msg_count != CDNS_SCP_RX_FIFOLEVEL) { in cdns_program_scp_addr()
688 cdns->msg_count = CDNS_SCP_RX_FIFOLEVEL; in cdns_program_scp_addr()
691 data[0] = FIELD_PREP(CDNS_MCP_CMD_DEV_ADDR, msg->dev_num); in cdns_program_scp_addr()
698 data[0] |= msg->addr_page1; in cdns_program_scp_addr()
699 data[1] |= msg->addr_page2; in cdns_program_scp_addr()
706 time = wait_for_completion_timeout(&cdns->tx_complete, in cdns_program_scp_addr()
709 dev_err(cdns->dev, "SCP Msg trf timed out\n"); in cdns_program_scp_addr()
710 msg->len = 0; in cdns_program_scp_addr()
716 if (!(cdns->response_buf[i] & CDNS_MCP_RESP_ACK)) { in cdns_program_scp_addr()
718 dev_err(cdns->dev, "Program SCP Ack not received\n"); in cdns_program_scp_addr()
719 if (cdns->response_buf[i] & CDNS_MCP_RESP_NACK) { in cdns_program_scp_addr()
721 dev_err(cdns->dev, "Program SCP NACK received\n"); in cdns_program_scp_addr()
728 dev_err_ratelimited(cdns->dev, in cdns_program_scp_addr()
729 "SCP_addrpage NACKed for Slave %d\n", msg->dev_num); in cdns_program_scp_addr()
734 dev_dbg_ratelimited(cdns->dev, in cdns_program_scp_addr()
735 "SCP_addrpage ignored for Slave %d\n", msg->dev_num); in cdns_program_scp_addr()
746 if (msg->page) { in cdns_prep_msg()
749 msg->len = 0; in cdns_prep_msg()
754 switch (msg->flags) { in cdns_prep_msg()
764 dev_err(cdns->dev, "Invalid msg cmd: %d\n", msg->flags); in cdns_prep_msg()
765 return -EINVAL; in cdns_prep_msg()
781 for (i = 0; i < msg->len / CDNS_MCP_CMD_LEN; i++) { in cdns_xfer_msg()
788 if (!(msg->len % CDNS_MCP_CMD_LEN)) in cdns_xfer_msg()
792 msg->len % CDNS_MCP_CMD_LEN, false); in cdns_xfer_msg()
800 struct sdw_defer *defer = &bus->defer_msg; in cdns_xfer_msg_defer()
801 struct sdw_msg *msg = defer->msg; in cdns_xfer_msg_defer()
805 if (msg->len > 1) in cdns_xfer_msg_defer()
806 return -ENOTSUPP; in cdns_xfer_msg_defer()
812 return _cdns_xfer_msg(cdns, msg, cmd, 0, msg->len, true); in cdns_xfer_msg_defer()
833 u32 mask; in cdns_update_slave_status() local
840 mask = (slave_intstat >> (i * CDNS_MCP_SLAVE_STATUS_NUM)) & in cdns_update_slave_status()
845 if (mask) { in cdns_update_slave_status()
848 if (mask & CDNS_MCP_SLAVE_INTSTAT_RESERVED) { in cdns_update_slave_status()
853 if (mask & CDNS_MCP_SLAVE_INTSTAT_ATTACHED) { in cdns_update_slave_status()
858 if (mask & CDNS_MCP_SLAVE_INTSTAT_ALERT) { in cdns_update_slave_status()
863 if (mask & CDNS_MCP_SLAVE_INTSTAT_NPRESENT) { in cdns_update_slave_status()
898 mutex_lock(&cdns->status_update_lock); in cdns_update_slave_status()
899 ret = sdw_handle_slave_status(&cdns->bus, status); in cdns_update_slave_status()
900 mutex_unlock(&cdns->status_update_lock); in cdns_update_slave_status()
908 * sdw_cdns_irq() - Cadence interrupt handler
918 if (!cdns->link_up) in sdw_cdns_irq()
931 struct sdw_bus *bus = &cdns->bus; in sdw_cdns_irq()
932 struct sdw_defer *defer = &bus->defer_msg; in sdw_cdns_irq()
936 if (defer && defer->msg) { in sdw_cdns_irq()
937 cdns_fill_msg_resp(cdns, defer->msg, in sdw_cdns_irq()
938 defer->length, 0); in sdw_cdns_irq()
939 complete(&defer->complete); in sdw_cdns_irq()
941 complete(&cdns->tx_complete); in sdw_cdns_irq()
947 dev_err_ratelimited(cdns->dev, "Parity error\n"); in sdw_cdns_irq()
952 dev_err_ratelimited(cdns->dev, "Bus clash for control word\n"); in sdw_cdns_irq()
960 dev_err_ratelimited(cdns->dev, "Bus clash for data word\n"); in sdw_cdns_irq()
963 if (cdns->bus.params.m_data_mode != SDW_PORT_DATA_MODE_NORMAL && in sdw_cdns_irq()
969 dev_err_ratelimited(cdns->dev, "DP interrupt: PortIntStat %8x\n", in sdw_cdns_irq()
977 /* Mask the Slave interrupt and wake thread */ in sdw_cdns_irq()
990 if (cdns->interrupt_enabled) in sdw_cdns_irq()
991 schedule_work(&cdns->work); in sdw_cdns_irq()
1013 dev_dbg(cdns->dev, "Peripheral %d status: %d\n", i, status[i]); in cdns_check_attached_status_dwork()
1017 mutex_lock(&cdns->status_update_lock); in cdns_check_attached_status_dwork()
1018 ret = sdw_handle_slave_status(&cdns->bus, status); in cdns_check_attached_status_dwork()
1019 mutex_unlock(&cdns->status_update_lock); in cdns_check_attached_status_dwork()
1021 dev_err(cdns->dev, "%s: sdw_handle_slave_status failed: %d\n", __func__, ret); in cdns_check_attached_status_dwork()
1025 * cdns_update_slave_status_work - update slave status in a work since we will need to handle
1050 * bits that re-assert. in cdns_update_slave_status_work()
1058 dev_dbg_ratelimited(cdns->dev, "Slave status change: 0x%llx\n", slave_intstat); in cdns_update_slave_status_work()
1071 * the deviceB never being detected - until a change of status in cdns_update_slave_status_work()
1074 * To avoid this race condition, re-check if any device0 needs in cdns_update_slave_status_work()
1076 * ALERTS since they are not allowed until a non-zero in cdns_update_slave_status_work()
1080 * #0 there could be status changes on other devices - these must in cdns_update_slave_status_work()
1090 dev_dbg_ratelimited(cdns->dev, in cdns_update_slave_status_work()
1096 dev_err_ratelimited(cdns->dev, in cdns_update_slave_status_work()
1108 /* paranoia check to make sure self-cleared bits are indeed cleared */
1124 dev_err(cdns->dev, "%s failed: IP_MCP_CONTROL_SW_RST is not cleared\n", string); in sdw_cdns_check_self_clearing_bits()
1130 dev_err(cdns->dev, "%s failed: MCP_CONTROL_CMD_RST is not cleared\n", string); in sdw_cdns_check_self_clearing_bits()
1132 dev_err(cdns->dev, "%s failed: MCP_CONTROL_SOFT_RST is not cleared\n", string); in sdw_cdns_check_self_clearing_bits()
1134 dev_err(cdns->dev, "%s failed: MCP_CONTROL_CLK_STOP_CLR is not cleared\n", string); in sdw_cdns_check_self_clearing_bits()
1138 dev_err(cdns->dev, "%s failed: MCP_CONFIG_UPDATE_BIT is not cleared\n", string); in sdw_cdns_check_self_clearing_bits()
1143 dev_err(cdns->dev, "%s failed: MCP_CONTROL_HW_RST is not cleared\n", string); in sdw_cdns_check_self_clearing_bits()
1147 dev_dbg(cdns->dev, "%s: MCP_CONTROL_HW_RST is not cleared at iteration %d\n", string, i); in sdw_cdns_check_self_clearing_bits()
1162 * sdw_cdns_exit_reset() - Program reset parameters and start bus operations
1180 * cdns_enable_slave_interrupts() - Enable SDW slave interrupts
1186 u32 mask; in cdns_enable_slave_interrupts() local
1188 mask = cdns_readl(cdns, CDNS_MCP_INTMASK); in cdns_enable_slave_interrupts()
1190 mask |= CDNS_MCP_INT_SLAVE_MASK; in cdns_enable_slave_interrupts()
1192 mask &= ~CDNS_MCP_INT_SLAVE_MASK; in cdns_enable_slave_interrupts()
1194 cdns_writel(cdns, CDNS_MCP_INTMASK, mask); in cdns_enable_slave_interrupts()
1198 * sdw_cdns_enable_interrupt() - Enable SDW interrupts
1206 u32 mask = 0; in sdw_cdns_enable_interrupt() local
1215 mask = CDNS_MCP_INT_SLAVE_MASK; in sdw_cdns_enable_interrupt()
1218 mask |= CDNS_MCP_INT_CTRL_CLASH | CDNS_MCP_INT_DATA_CLASH | in sdw_cdns_enable_interrupt()
1222 if (cdns->bus.params.m_data_mode != SDW_PORT_DATA_MODE_NORMAL) in sdw_cdns_enable_interrupt()
1223 mask |= CDNS_MCP_INT_DPINT; in sdw_cdns_enable_interrupt()
1226 mask |= CDNS_MCP_INT_RX_WL; in sdw_cdns_enable_interrupt()
1232 mask |= CDNS_MCP_INT_IRQ; in sdw_cdns_enable_interrupt()
1235 mask = interrupt_mask; in sdw_cdns_enable_interrupt()
1247 cdns->interrupt_enabled = state; in sdw_cdns_enable_interrupt()
1250 * Complete any on-going status updates before updating masks, in sdw_cdns_enable_interrupt()
1254 * the 3 mask updates below are complete, so in the interrupt in sdw_cdns_enable_interrupt()
1259 cancel_work_sync(&cdns->work); in sdw_cdns_enable_interrupt()
1263 cdns_writel(cdns, CDNS_MCP_INTMASK, mask); in sdw_cdns_enable_interrupt()
1270 struct sdw_cdns_pdi **stream, in cdns_allocate_pdi() argument
1279 pdi = devm_kcalloc(cdns->dev, num, sizeof(*pdi), GFP_KERNEL); in cdns_allocate_pdi()
1281 return -ENOMEM; in cdns_allocate_pdi()
1287 *stream = pdi; in cdns_allocate_pdi()
1292 * sdw_cdns_pdi_init() - PDI initialization routine
1295 * @config: Stream configurations
1300 struct sdw_cdns_streams *stream; in sdw_cdns_pdi_init() local
1303 cdns->pcm.num_bd = config.pcm_bd; in sdw_cdns_pdi_init()
1304 cdns->pcm.num_in = config.pcm_in; in sdw_cdns_pdi_init()
1305 cdns->pcm.num_out = config.pcm_out; in sdw_cdns_pdi_init()
1308 stream = &cdns->pcm; in sdw_cdns_pdi_init()
1311 ret = cdns_allocate_pdi(cdns, &stream->bd, stream->num_bd); in sdw_cdns_pdi_init()
1315 ret = cdns_allocate_pdi(cdns, &stream->in, stream->num_in); in sdw_cdns_pdi_init()
1319 ret = cdns_allocate_pdi(cdns, &stream->out, stream->num_out); in sdw_cdns_pdi_init()
1324 stream->num_pdi = stream->num_bd + stream->num_in + stream->num_out; in sdw_cdns_pdi_init()
1325 cdns->num_ports = stream->num_pdi; in sdw_cdns_pdi_init()
1348 struct sdw_bus *bus = &cdns->bus; in cdns_init_clock_ctrl()
1349 struct sdw_master_prop *prop = &bus->prop; in cdns_init_clock_ctrl()
1354 dev_dbg(cdns->dev, "mclk %d max %d row %d col %d\n", in cdns_init_clock_ctrl()
1355 prop->mclk_freq, in cdns_init_clock_ctrl()
1356 prop->max_clk_freq, in cdns_init_clock_ctrl()
1357 prop->default_row, in cdns_init_clock_ctrl()
1358 prop->default_col); in cdns_init_clock_ctrl()
1360 if (!prop->default_frame_rate || !prop->default_row) { in cdns_init_clock_ctrl()
1361 dev_err(cdns->dev, "Default frame_rate %d or row %d is invalid\n", in cdns_init_clock_ctrl()
1362 prop->default_frame_rate, prop->default_row); in cdns_init_clock_ctrl()
1363 return -EINVAL; in cdns_init_clock_ctrl()
1367 divider = (prop->mclk_freq * SDW_DOUBLE_RATE_FACTOR / in cdns_init_clock_ctrl()
1368 bus->params.curr_dr_freq) - 1; in cdns_init_clock_ctrl()
1376 prop->default_col = bus->params.curr_dr_freq / in cdns_init_clock_ctrl()
1377 prop->default_frame_rate / prop->default_row; in cdns_init_clock_ctrl()
1383 val = cdns_set_initial_frame_shape(prop->default_row, in cdns_init_clock_ctrl()
1384 prop->default_col); in cdns_init_clock_ctrl()
1388 ssp_interval = prop->default_frame_rate / SDW_CADENCE_GSYNC_HZ; in cdns_init_clock_ctrl()
1396 * sdw_cdns_soft_reset() - Cadence soft-reset
1408 dev_err(cdns->dev, "%s: config update failed\n", __func__); in sdw_cdns_soft_reset()
1414 dev_err(cdns->dev, "%s: Soft Reset timed out\n", __func__); in sdw_cdns_soft_reset()
1421 * sdw_cdns_init() - Cadence initialization
1436 cdns->msg_count = cdns_readl(cdns, CDNS_MCP_FIFOLEVEL); in sdw_cdns_init()
1472 if (cdns->bus.multi_link) in sdw_cdns_init()
1473 /* Set Multi-master mode to take gsync into account */ in sdw_cdns_init()
1489 struct sdw_master_prop *prop = &bus->prop; in cdns_bus_conf()
1494 if (!params->curr_dr_freq) { in cdns_bus_conf()
1495 dev_err(cdns->dev, "NULL curr_dr_freq\n"); in cdns_bus_conf()
1496 return -EINVAL; in cdns_bus_conf()
1499 divider = prop->mclk_freq * SDW_DOUBLE_RATE_FACTOR / in cdns_bus_conf()
1500 params->curr_dr_freq; in cdns_bus_conf()
1501 divider--; /* divider is 1/(N+1) */ in cdns_bus_conf()
1503 if (params->next_bank) in cdns_bus_conf()
1520 int target_num = p_params->num; in cdns_port_params()
1521 int source_num = p_params->num; in cdns_port_params()
1525 if (target_num == cdns->pdi_loopback_target && in cdns_port_params()
1526 cdns->pdi_loopback_source != -1) { in cdns_port_params()
1527 source_num = cdns->pdi_loopback_source; in cdns_port_params()
1543 u32p_replace_bits(&dpn_config, p_params->bps - 1, CDNS_DPN_CONFIG_WL); in cdns_port_params()
1544 u32p_replace_bits(&dpn_config, p_params->flow_mode, CDNS_DPN_CONFIG_PORT_FLOW); in cdns_port_params()
1545 u32p_replace_bits(&dpn_config, p_params->data_mode, CDNS_DPN_CONFIG_PORT_DAT); in cdns_port_params()
1570 int source_num = t_params->port_num; in cdns_transport_params()
1571 int target_num = t_params->port_num; in cdns_transport_params()
1574 if (target_num == cdns->pdi_loopback_target && in cdns_transport_params()
1575 cdns->pdi_loopback_source != -1) { in cdns_transport_params()
1576 source_num = cdns->pdi_loopback_source; in cdns_transport_params()
1610 u32p_replace_bits(&dpn_config, t_params->blk_grp_ctrl, CDNS_DPN_CONFIG_BGC); in cdns_transport_params()
1611 u32p_replace_bits(&dpn_config, t_params->blk_pkg_mode, CDNS_DPN_CONFIG_BPM); in cdns_transport_params()
1617 u32p_replace_bits(&dpn_offsetctrl, t_params->offset1, CDNS_DPN_OFFSET_CTRL_1); in cdns_transport_params()
1618 u32p_replace_bits(&dpn_offsetctrl, t_params->offset2, CDNS_DPN_OFFSET_CTRL_2); in cdns_transport_params()
1626 u32p_replace_bits(&dpn_hctrl, t_params->hstart, CDNS_DPN_HCTRL_HSTART); in cdns_transport_params()
1627 u32p_replace_bits(&dpn_hctrl, t_params->hstop, CDNS_DPN_HCTRL_HSTOP); in cdns_transport_params()
1628 u32p_replace_bits(&dpn_hctrl, t_params->lane_ctrl, CDNS_DPN_HCTRL_LCTRL); in cdns_transport_params()
1635 dpn_samplectrl = t_params->sample_interval - 1; in cdns_transport_params()
1650 dpn_chnen_off = CDNS_DPN_B1_CH_EN(enable_ch->port_num); in cdns_port_enable()
1652 dpn_chnen_off = CDNS_DPN_B0_CH_EN(enable_ch->port_num); in cdns_port_enable()
1654 ch_mask = enable_ch->ch_mask * enable_ch->enable; in cdns_port_enable()
1693 dev_dbg(cdns->dev, "Clock is already stopped\n"); in sdw_cdns_clock_stop()
1698 * Before entering clock stop we mask the Slave in sdw_cdns_clock_stop()
1706 * master into a state in which it ignores wake-up trials in sdw_cdns_clock_stop()
1714 list_for_each_entry(slave, &cdns->bus.slaves, node) { in sdw_cdns_clock_stop()
1715 if (slave->status == SDW_SLAVE_ATTACHED || in sdw_cdns_clock_stop()
1716 slave->status == SDW_SLAVE_ALERT) { in sdw_cdns_clock_stop()
1725 dev_err(cdns->dev, "%s: config_update failed\n", __func__); in sdw_cdns_clock_stop()
1731 ret = sdw_bus_prep_clk_stop(&cdns->bus); in sdw_cdns_clock_stop()
1732 if (ret < 0 && ret != -ENODATA) { in sdw_cdns_clock_stop()
1733 dev_err(cdns->dev, "prepare clock stop failed %d\n", ret); in sdw_cdns_clock_stop()
1742 ret = sdw_bus_clk_stop(&cdns->bus); in sdw_cdns_clock_stop()
1743 if (ret < 0 && slave_present && ret != -ENODATA) { in sdw_cdns_clock_stop()
1744 dev_err(cdns->dev, "bus clock stop failed %d\n", ret); in sdw_cdns_clock_stop()
1752 dev_err(cdns->dev, "Clock stop failed %d\n", ret); in sdw_cdns_clock_stop()
1763 * may require a Severe Reset and re-enumeration after a wake.
1775 dev_err(cdns->dev, "Couldn't exit from clock stop\n"); in sdw_cdns_clock_restart()
1781 dev_err(cdns->dev, "clock stop exit failed %d\n", ret); in sdw_cdns_clock_restart()
1800 dev_err(cdns->dev, "%s: config_update failed\n", __func__); in sdw_cdns_clock_restart()
1804 ret = sdw_bus_exit_clk_stop(&cdns->bus); in sdw_cdns_clock_restart()
1806 dev_err(cdns->dev, "bus failed to exit clock stop %d\n", ret); in sdw_cdns_clock_restart()
1814 * sdw_cdns_probe() - Cadence probe routine
1819 init_completion(&cdns->tx_complete); in sdw_cdns_probe()
1820 cdns->bus.port_ops = &cdns_port_ops; in sdw_cdns_probe()
1822 mutex_init(&cdns->status_update_lock); in sdw_cdns_probe()
1824 INIT_WORK(&cdns->work, cdns_update_slave_status_work); in sdw_cdns_probe()
1825 INIT_DELAYED_WORK(&cdns->attach_dwork, cdns_check_attached_status_dwork); in sdw_cdns_probe()
1832 void *stream, int direction) in cdns_set_sdw_stream() argument
1837 dai_runtime = cdns->dai_runtime_array[dai->id]; in cdns_set_sdw_stream()
1839 if (stream) { in cdns_set_sdw_stream()
1842 dev_err(dai->dev, in cdns_set_sdw_stream()
1844 dai->name); in cdns_set_sdw_stream()
1845 return -EINVAL; in cdns_set_sdw_stream()
1851 return -ENOMEM; in cdns_set_sdw_stream()
1853 dai_runtime->stream_type = SDW_STREAM_PCM; in cdns_set_sdw_stream()
1855 dai_runtime->bus = &cdns->bus; in cdns_set_sdw_stream()
1856 dai_runtime->link_id = cdns->instance; in cdns_set_sdw_stream()
1858 dai_runtime->stream = stream; in cdns_set_sdw_stream()
1859 dai_runtime->direction = direction; in cdns_set_sdw_stream()
1861 cdns->dai_runtime_array[dai->id] = dai_runtime; in cdns_set_sdw_stream()
1865 dev_err(dai->dev, in cdns_set_sdw_stream()
1867 dai->name); in cdns_set_sdw_stream()
1868 return -EINVAL; in cdns_set_sdw_stream()
1871 /* for NULL stream we release allocated dai_runtime */ in cdns_set_sdw_stream()
1873 cdns->dai_runtime_array[dai->id] = NULL; in cdns_set_sdw_stream()
1880 * cdns_find_pdi() - Find a free PDI
1888 * expected to match, return NULL otherwise.
1905 * sdw_cdns_config_stream: Configure a stream
1920 if (cdns->bus.params.m_data_mode != SDW_PORT_DATA_MODE_NORMAL) in sdw_cdns_config_stream()
1922 } else if (pdi->num == 0 || pdi->num == 1) { in sdw_cdns_config_stream()
1925 offset = CDNS_PORTCTRL + pdi->num * CDNS_PORT_OFFSET; in sdw_cdns_config_stream()
1932 if (pdi->num == 1) in sdw_cdns_config_stream()
1935 val = pdi->num; in sdw_cdns_config_stream()
1937 val |= FIELD_PREP(CDNS_PDI_CONFIG_CHANNEL, (1 << ch) - 1); in sdw_cdns_config_stream()
1938 cdns_writel(cdns, CDNS_PDI_CONFIG(pdi->num), val); in sdw_cdns_config_stream()
1943 * sdw_cdns_alloc_pdi() - Allocate a PDI
1946 * @stream: Stream to be allocated
1952 struct sdw_cdns_streams *stream, in sdw_cdns_alloc_pdi() argument
1958 pdi = cdns_find_pdi(cdns, stream->num_in, stream->in, in sdw_cdns_alloc_pdi()
1961 pdi = cdns_find_pdi(cdns, stream->num_out, stream->out, in sdw_cdns_alloc_pdi()
1964 /* check if we found a PDI, else find in bi-directional */ in sdw_cdns_alloc_pdi()
1966 pdi = cdns_find_pdi(cdns, stream->num_bd, stream->bd, in sdw_cdns_alloc_pdi()
1970 pdi->l_ch_num = 0; in sdw_cdns_alloc_pdi()
1971 pdi->h_ch_num = ch - 1; in sdw_cdns_alloc_pdi()
1972 pdi->dir = dir; in sdw_cdns_alloc_pdi()
1973 pdi->ch_count = ch; in sdw_cdns_alloc_pdi()
1994 0x00, 0x4d, 0x9a, 0xd7, 0x79, 0x34, 0xe3, 0xae, /* 0 - 7 */
1995 0xf2, 0xbf, 0x68, 0x25, 0x8b, 0xc6, 0x11, 0x5c, /* 8 -15 */
1996 0xa9, 0xe4, 0x33, 0x7e, 0xd0, 0x9d, 0x4a, 0x07, /* 16 - 23 */
1997 0x5b, 0x16, 0xc1, 0x8c, 0x22, 0x6f, 0xb8, 0xf5, /* 24 - 31 */
1998 0x1f, 0x52, 0x85, 0xc8, 0x66, 0x2b, 0xfc, 0xb1, /* 32 - 39 */
1999 0xed, 0xa0, 0x77, 0x3a, 0x94, 0xd9, 0x0e, 0x43, /* 40 - 47 */
2000 0xb6, 0xfb, 0x2c, 0x61, 0xcf, 0x82, 0x55, 0x18, /* 48 - 55 */
2001 0x44, 0x09, 0xde, 0x93, 0x3d, 0x70, 0xa7, 0xea, /* 56 - 63 */
2002 0x3e, 0x73, 0xa4, 0xe9, 0x47, 0x0a, 0xdd, 0x90, /* 64 - 71 */
2003 0xcc, 0x81, 0x56, 0x1b, 0xb5, 0xf8, 0x2f, 0x62, /* 72 - 79 */
2004 0x97, 0xda, 0x0d, 0x40, 0xee, 0xa3, 0x74, 0x39, /* 80 - 87 */
2005 0x65, 0x28, 0xff, 0xb2, 0x1c, 0x51, 0x86, 0xcb, /* 88 - 95 */
2006 0x21, 0x6c, 0xbb, 0xf6, 0x58, 0x15, 0xc2, 0x8f, /* 96 - 103 */
2007 0xd3, 0x9e, 0x49, 0x04, 0xaa, 0xe7, 0x30, 0x7d, /* 104 - 111 */
2008 0x88, 0xc5, 0x12, 0x5f, 0xf1, 0xbc, 0x6b, 0x26, /* 112 - 119 */
2009 0x7a, 0x37, 0xe0, 0xad, 0x03, 0x4e, 0x99, 0xd4, /* 120 - 127 */
2010 0x7c, 0x31, 0xe6, 0xab, 0x05, 0x48, 0x9f, 0xd2, /* 128 - 135 */
2011 0x8e, 0xc3, 0x14, 0x59, 0xf7, 0xba, 0x6d, 0x20, /* 136 - 143 */
2012 0xd5, 0x98, 0x4f, 0x02, 0xac, 0xe1, 0x36, 0x7b, /* 144 - 151 */
2013 0x27, 0x6a, 0xbd, 0xf0, 0x5e, 0x13, 0xc4, 0x89, /* 152 - 159 */
2014 0x63, 0x2e, 0xf9, 0xb4, 0x1a, 0x57, 0x80, 0xcd, /* 160 - 167 */
2015 0x91, 0xdc, 0x0b, 0x46, 0xe8, 0xa5, 0x72, 0x3f, /* 168 - 175 */
2016 0xca, 0x87, 0x50, 0x1d, 0xb3, 0xfe, 0x29, 0x64, /* 176 - 183 */
2017 0x38, 0x75, 0xa2, 0xef, 0x41, 0x0c, 0xdb, 0x96, /* 184 - 191 */
2018 0x42, 0x0f, 0xd8, 0x95, 0x3b, 0x76, 0xa1, 0xec, /* 192 - 199 */
2019 0xb0, 0xfd, 0x2a, 0x67, 0xc9, 0x84, 0x53, 0x1e, /* 200 - 207 */
2020 0xeb, 0xa6, 0x71, 0x3c, 0x92, 0xdf, 0x08, 0x45, /* 208 - 215 */
2021 0x19, 0x54, 0x83, 0xce, 0x60, 0x2d, 0xfa, 0xb7, /* 216 - 223 */
2022 0x5d, 0x10, 0xc7, 0x8a, 0x24, 0x69, 0xbe, 0xf3, /* 224 - 231 */
2023 0xaf, 0xe2, 0x35, 0x78, 0xd6, 0x9b, 0x4c, 0x01, /* 232 - 239 */
2024 0xf4, 0xb9, 0x6e, 0x23, 0x8d, 0xc0, 0x17, 0x5a, /* 240 - 247 */
2025 0x06, 0x4b, 0x9c, 0xd1, 0x7f, 0x32, 0xe5, 0xa8 /* 248 - 255 */
2059 total = allocated_bytes_per_frame - SDW_CDNS_BRA_HDR - SDW_CDNS_BRA_HDR_CRC - in sdw_cdns_bra_actual_data_size()
2060 SDW_CDNS_BRA_HDR_RESP - SDW_CDNS_BRA_DATA_CRC - SDW_CDNS_BRA_FOOTER_RESP; in sdw_cdns_bra_actual_data_size()
2102 unsigned int bpt_bits = row * (col - 1); in sdw_cdns_bpt_find_bandwidth()
2110 return -EINVAL; in sdw_cdns_bpt_find_bandwidth()
2133 unsigned int bpt_bits = row * (col - 1); in sdw_cdns_bpt_find_buffer_sizes()
2141 return -EINVAL; in sdw_cdns_bpt_find_buffer_sizes()
2145 return -EINVAL; in sdw_cdns_bpt_find_buffer_sizes()
2175 * header, so the last frame needs to be special-cased in sdw_cdns_bpt_find_buffer_sizes()
2209 i = data_size - 1; in sdw_cdns_copy_write_data()
2210 j = (2 * i) - (i & 1); in sdw_cdns_copy_write_data()
2215 return -EINVAL; in sdw_cdns_copy_write_data()
2219 j = (2 * i) - (i & 1); in sdw_cdns_copy_write_data()
2228 /* offset and data are off-by-one */ in sdw_cdns_copy_write_data()
2251 dma_buffer_size -= data_written; in sdw_cdns_prepare_write_pd0_buffer()
2261 dma_buffer_size -= data_written; in sdw_cdns_prepare_write_pd0_buffer()
2268 dma_buffer_size -= data_written; in sdw_cdns_prepare_write_pd0_buffer()
2277 dma_buffer_size -= data_written; in sdw_cdns_prepare_write_pd0_buffer()
2281 last_byte = dma_buffer - 1; in sdw_cdns_prepare_write_pd0_buffer()
2305 dma_buffer_size -= data_written; in sdw_cdns_prepare_read_pd0_buffer()
2315 dma_buffer_size -= data_written; in sdw_cdns_prepare_read_pd0_buffer()
2319 last_byte = dma_buffer - 1; in sdw_cdns_prepare_read_pd0_buffer()
2370 section_size -= data_per_frame; in sdw_cdns_prepare_write_dma_buffer()
2373 dma_buffer_size -= dma_data_written; in sdw_cdns_prepare_write_dma_buffer()
2396 dma_buffer_size -= dma_data_written; in sdw_cdns_prepare_write_dma_buffer()
2445 data_size -= data_per_frame; in sdw_cdns_prepare_read_dma_buffer()
2448 dma_buffer_size -= dma_data_written; in sdw_cdns_prepare_read_dma_buffer()
2470 dma_buffer_size -= dma_data_written; in sdw_cdns_prepare_read_dma_buffer()
2487 fake_size -= data_per_frame; in sdw_cdns_prepare_read_dma_buffer()
2489 dma_buffer_size -= dma_data_written; in sdw_cdns_prepare_read_dma_buffer()
2504 dma_buffer_size -= dma_data_written; in sdw_cdns_prepare_read_dma_buffer()
2520 return -EIO; in check_counter()
2530 return -ENODATA; in check_response()
2532 return -EIO; in check_response()
2543 return -EIO; in check_frame_start()
2556 return -EIO; in check_frame_end()
2573 return -EINVAL; in sdw_cdns_check_write_response()
2675 len = buffer_size - total_num_bytes; in sdw_cdns_check_read_response()
2685 return -EIO; in sdw_cdns_check_read_response()
2707 return -EINVAL; in sdw_cdns_check_read_response()