Lines Matching full:cdns
204 static inline u32 cdns_readl(struct sdw_cdns *cdns, int offset) in cdns_readl() argument
206 return readl(cdns->registers + offset); in cdns_readl()
209 static inline void cdns_writel(struct sdw_cdns *cdns, int offset, u32 value) in cdns_writel() argument
211 writel(value, cdns->registers + offset); in cdns_writel()
214 static inline u32 cdns_ip_readl(struct sdw_cdns *cdns, int offset) in cdns_ip_readl() argument
216 return cdns_readl(cdns, cdns->ip_offset + offset); in cdns_ip_readl()
219 static inline void cdns_ip_writel(struct sdw_cdns *cdns, int offset, u32 value) in cdns_ip_writel() argument
221 return cdns_writel(cdns, cdns->ip_offset + offset, value); in cdns_ip_writel()
224 static inline void cdns_updatel(struct sdw_cdns *cdns, in cdns_updatel() argument
229 tmp = cdns_readl(cdns, offset); in cdns_updatel()
231 cdns_writel(cdns, offset, tmp); in cdns_updatel()
234 static inline void cdns_ip_updatel(struct sdw_cdns *cdns, in cdns_ip_updatel() argument
237 cdns_updatel(cdns, cdns->ip_offset + offset, mask, val); in cdns_ip_updatel()
240 static int cdns_set_wait(struct sdw_cdns *cdns, int offset, u32 mask, u32 value) in cdns_set_wait() argument
247 reg_read = readl(cdns->registers + offset); in cdns_set_wait()
258 static int cdns_clear_bit(struct sdw_cdns *cdns, int offset, u32 value) in cdns_clear_bit() argument
260 writel(value, cdns->registers + offset); in cdns_clear_bit()
263 return cdns_set_wait(cdns, offset, value, 0); in cdns_clear_bit()
270 static int cdns_config_update(struct sdw_cdns *cdns) in cdns_config_update() argument
274 if (sdw_cdns_is_clock_stop(cdns)) { in cdns_config_update()
275 dev_err(cdns->dev, "Cannot program MCP_CONFIG_UPDATE in ClockStopMode\n"); in cdns_config_update()
279 ret = cdns_clear_bit(cdns, CDNS_MCP_CONFIG_UPDATE, in cdns_config_update()
282 dev_err(cdns->dev, "Config update timedout\n"); in cdns_config_update()
289 * @cdns: Cadence instance
291 void sdw_cdns_config_update(struct sdw_cdns *cdns) in sdw_cdns_config_update() argument
294 cdns_writel(cdns, CDNS_MCP_CONFIG_UPDATE, CDNS_MCP_CONFIG_UPDATE_BIT); in sdw_cdns_config_update()
300 * @cdns: Cadence instance
302 int sdw_cdns_config_update_set_wait(struct sdw_cdns *cdns) in sdw_cdns_config_update_set_wait() argument
305 return cdns_set_wait(cdns, CDNS_MCP_CONFIG_UPDATE, in sdw_cdns_config_update_set_wait()
317 static ssize_t cdns_sprintf(struct sdw_cdns *cdns, in cdns_sprintf() argument
321 "%4x\t%8x\n", reg, cdns_readl(cdns, reg)); in cdns_sprintf()
326 struct sdw_cdns *cdns = s->private; in cdns_reg_show() local
339 ret += cdns_sprintf(cdns, buf, ret, i); in cdns_reg_show()
345 ret += cdns_sprintf(cdns, buf, ret, i); in cdns_reg_show()
349 ret += cdns_sprintf(cdns, buf, ret, CDNS_MCP_SSP_CTRL0); in cdns_reg_show()
350 ret += cdns_sprintf(cdns, buf, ret, CDNS_MCP_SSP_CTRL1); in cdns_reg_show()
351 ret += cdns_sprintf(cdns, buf, ret, CDNS_MCP_CLK_CTRL0); in cdns_reg_show()
352 ret += cdns_sprintf(cdns, buf, ret, CDNS_MCP_CLK_CTRL1); in cdns_reg_show()
357 num_ports = cdns->num_ports; in cdns_reg_show()
364 ret += cdns_sprintf(cdns, buf, ret, j); in cdns_reg_show()
375 ret += cdns_sprintf(cdns, buf, ret, j); in cdns_reg_show()
381 ret += cdns_sprintf(cdns, buf, ret, in cdns_reg_show()
389 ret += cdns_sprintf(cdns, buf, ret, CDNS_PDI_CONFIG(i)); in cdns_reg_show()
399 struct sdw_cdns *cdns = data; in cdns_hw_reset() local
408 ret = sdw_cdns_exit_reset(cdns); in cdns_hw_reset()
410 dev_dbg(cdns->dev, "link hw_reset done: %d\n", ret); in cdns_hw_reset()
419 struct sdw_cdns *cdns = data; in cdns_parity_error_injection() local
426 bus = &cdns->bus; in cdns_parity_error_injection()
434 dev_err_ratelimited(cdns->dev, in cdns_parity_error_injection()
453 cdns_ip_updatel(cdns, CDNS_IP_MCP_CMDCTRL, in cdns_parity_error_injection()
458 ret = cdns_clear_bit(cdns, CDNS_MCP_CONFIG_UPDATE, CDNS_MCP_CONFIG_UPDATE_BIT); in cdns_parity_error_injection()
463 ret = sdw_bread_no_pm_unlocked(&cdns->bus, 0xf, SDW_SCP_DEVID_0); in cdns_parity_error_injection()
464 dev_info(cdns->dev, "parity error injection, read: %d\n", ret); in cdns_parity_error_injection()
467 cdns_ip_updatel(cdns, CDNS_IP_MCP_CMDCTRL, in cdns_parity_error_injection()
472 ret = cdns_clear_bit(cdns, CDNS_MCP_CONFIG_UPDATE, CDNS_MCP_CONFIG_UPDATE_BIT); in cdns_parity_error_injection()
498 struct sdw_cdns *cdns = data; in cdns_set_pdi_loopback_source() local
499 unsigned int pdi_out_num = cdns->pcm.num_bd + cdns->pcm.num_out; in cdns_set_pdi_loopback_source()
507 cdns->pdi_loopback_source = value; in cdns_set_pdi_loopback_source()
515 struct sdw_cdns *cdns = data; in cdns_set_pdi_loopback_target() local
516 unsigned int pdi_in_num = cdns->pcm.num_bd + cdns->pcm.num_in; in cdns_set_pdi_loopback_target()
524 cdns->pdi_loopback_target = value; in cdns_set_pdi_loopback_target()
532 * @cdns: Cadence instance
535 void sdw_cdns_debugfs_init(struct sdw_cdns *cdns, struct dentry *root) in sdw_cdns_debugfs_init() argument
537 debugfs_create_file("cdns-registers", 0400, root, cdns, &cdns_reg_fops); in sdw_cdns_debugfs_init()
539 debugfs_create_file("cdns-hw-reset", 0200, root, cdns, in sdw_cdns_debugfs_init()
542 debugfs_create_file("cdns-parity-error-injection", 0200, root, cdns, in sdw_cdns_debugfs_init()
545 cdns->pdi_loopback_source = -1; in sdw_cdns_debugfs_init()
546 cdns->pdi_loopback_target = -1; in sdw_cdns_debugfs_init()
548 debugfs_create_file("cdns-pdi-loopback-source", 0200, root, cdns, in sdw_cdns_debugfs_init()
551 debugfs_create_file("cdns-pdi-loopback-target", 0200, root, cdns, in sdw_cdns_debugfs_init()
563 cdns_fill_msg_resp(struct sdw_cdns *cdns, in cdns_fill_msg_resp() argument
571 if (!(cdns->response_buf[i] & CDNS_MCP_RESP_ACK)) { in cdns_fill_msg_resp()
573 dev_vdbg(cdns->dev, "Msg Ack not received, cmd %d\n", i); in cdns_fill_msg_resp()
575 if (cdns->response_buf[i] & CDNS_MCP_RESP_NACK) { in cdns_fill_msg_resp()
577 dev_err_ratelimited(cdns->dev, "Msg NACK received, cmd %d\n", i); in cdns_fill_msg_resp()
582 dev_err_ratelimited(cdns->dev, "Msg NACKed for Slave %d\n", msg->dev_num); in cdns_fill_msg_resp()
587 dev_dbg_ratelimited(cdns->dev, "Msg ignored for Slave %d\n", msg->dev_num); in cdns_fill_msg_resp()
595 cdns->response_buf[i]); in cdns_fill_msg_resp()
601 static void cdns_read_response(struct sdw_cdns *cdns) in cdns_read_response() argument
607 BUILD_BUG_ON(ARRAY_SIZE(cdns->response_buf) < CDNS_MCP_CMD_LEN + 2); in cdns_read_response()
609 num_resp = cdns_readl(cdns, CDNS_MCP_FIFOSTAT); in cdns_read_response()
611 if (num_resp > ARRAY_SIZE(cdns->response_buf)) { in cdns_read_response()
612 dev_warn(cdns->dev, "RX AVAIL %d too long\n", num_resp); in cdns_read_response()
613 num_resp = ARRAY_SIZE(cdns->response_buf); in cdns_read_response()
619 cdns->response_buf[i] = cdns_ip_readl(cdns, cmd_base); in cdns_read_response()
625 _cdns_xfer_msg(struct sdw_cdns *cdns, struct sdw_msg *msg, int cmd, in _cdns_xfer_msg() argument
633 if (cdns->msg_count != count) { in _cdns_xfer_msg()
634 cdns_writel(cdns, CDNS_MCP_FIFOLEVEL, count); in _cdns_xfer_msg()
635 cdns->msg_count = count; in _cdns_xfer_msg()
651 cdns_ip_writel(cdns, base, data); in _cdns_xfer_msg()
659 time = wait_for_completion_timeout(&cdns->tx_complete, in _cdns_xfer_msg()
662 dev_err(cdns->dev, "IO transfer timed out, cmd %d device %d addr %x len %d\n", in _cdns_xfer_msg()
667 cdns_read_response(cdns); in _cdns_xfer_msg()
672 return cdns_fill_msg_resp(cdns, msg, count, offset); in _cdns_xfer_msg()
676 cdns_program_scp_addr(struct sdw_cdns *cdns, struct sdw_msg *msg) in cdns_program_scp_addr() argument
684 if (cdns->msg_count != CDNS_SCP_RX_FIFOLEVEL) { in cdns_program_scp_addr()
685 cdns_writel(cdns, CDNS_MCP_FIFOLEVEL, CDNS_SCP_RX_FIFOLEVEL); in cdns_program_scp_addr()
686 cdns->msg_count = CDNS_SCP_RX_FIFOLEVEL; in cdns_program_scp_addr()
700 cdns_ip_writel(cdns, base, data[0]); in cdns_program_scp_addr()
702 cdns_ip_writel(cdns, base, data[1]); in cdns_program_scp_addr()
704 time = wait_for_completion_timeout(&cdns->tx_complete, in cdns_program_scp_addr()
707 dev_err(cdns->dev, "SCP Msg trf timed out\n"); in cdns_program_scp_addr()
714 if (!(cdns->response_buf[i] & CDNS_MCP_RESP_ACK)) { in cdns_program_scp_addr()
716 dev_err(cdns->dev, "Program SCP Ack not received\n"); in cdns_program_scp_addr()
717 if (cdns->response_buf[i] & CDNS_MCP_RESP_NACK) { in cdns_program_scp_addr()
719 dev_err(cdns->dev, "Program SCP NACK received\n"); in cdns_program_scp_addr()
726 dev_err_ratelimited(cdns->dev, in cdns_program_scp_addr()
732 dev_dbg_ratelimited(cdns->dev, in cdns_program_scp_addr()
740 static int cdns_prep_msg(struct sdw_cdns *cdns, struct sdw_msg *msg, int *cmd) in cdns_prep_msg() argument
745 ret = cdns_program_scp_addr(cdns, msg); in cdns_prep_msg()
762 dev_err(cdns->dev, "Invalid msg cmd: %d\n", msg->flags); in cdns_prep_msg()
772 struct sdw_cdns *cdns = bus_to_cdns(bus); in cdns_xfer_msg() local
775 ret = cdns_prep_msg(cdns, msg, &cmd); in cdns_xfer_msg()
780 ret = _cdns_xfer_msg(cdns, msg, cmd, i * CDNS_MCP_CMD_LEN, in cdns_xfer_msg()
789 return _cdns_xfer_msg(cdns, msg, cmd, i * CDNS_MCP_CMD_LEN, in cdns_xfer_msg()
797 struct sdw_cdns *cdns = bus_to_cdns(bus); in cdns_xfer_msg_defer() local
806 ret = cdns_prep_msg(cdns, msg, &cmd); in cdns_xfer_msg_defer()
810 return _cdns_xfer_msg(cdns, msg, cmd, 0, msg->len, true); in cdns_xfer_msg_defer()
816 struct sdw_cdns *cdns = bus_to_cdns(bus); in cdns_read_ping_status() local
818 return cdns_readl(cdns, CDNS_MCP_SLAVE_STAT); in cdns_read_ping_status()
826 static int cdns_update_slave_status(struct sdw_cdns *cdns, in cdns_update_slave_status() argument
872 val = cdns_readl(cdns, CDNS_MCP_SLAVE_STAT); in cdns_update_slave_status()
896 mutex_lock(&cdns->status_update_lock); in cdns_update_slave_status()
897 ret = sdw_handle_slave_status(&cdns->bus, status); in cdns_update_slave_status()
898 mutex_unlock(&cdns->status_update_lock); in cdns_update_slave_status()
912 struct sdw_cdns *cdns = dev_id; in sdw_cdns_irq() local
916 if (!cdns->link_up) in sdw_cdns_irq()
919 int_status = cdns_readl(cdns, CDNS_MCP_INTSTAT); in sdw_cdns_irq()
929 struct sdw_bus *bus = &cdns->bus; in sdw_cdns_irq()
932 cdns_read_response(cdns); in sdw_cdns_irq()
935 cdns_fill_msg_resp(cdns, defer->msg, in sdw_cdns_irq()
939 complete(&cdns->tx_complete); in sdw_cdns_irq()
945 dev_err_ratelimited(cdns->dev, "Parity error\n"); in sdw_cdns_irq()
950 dev_err_ratelimited(cdns->dev, "Bus clash for control word\n"); in sdw_cdns_irq()
958 dev_err_ratelimited(cdns->dev, "Bus clash for data word\n"); in sdw_cdns_irq()
961 if (cdns->bus.params.m_data_mode != SDW_PORT_DATA_MODE_NORMAL && in sdw_cdns_irq()
966 port_intstat = cdns_readl(cdns, CDNS_MCP_PORT_INTSTAT); in sdw_cdns_irq()
967 dev_err_ratelimited(cdns->dev, "DP interrupt: PortIntStat %8x\n", in sdw_cdns_irq()
971 cdns_writel(cdns, CDNS_MCP_PORT_INTSTAT, port_intstat); in sdw_cdns_irq()
976 cdns_updatel(cdns, CDNS_MCP_INTMASK, in sdw_cdns_irq()
988 if (cdns->interrupt_enabled) in sdw_cdns_irq()
989 schedule_work(&cdns->work); in sdw_cdns_irq()
992 cdns_writel(cdns, CDNS_MCP_INTSTAT, int_status); in sdw_cdns_irq()
999 struct sdw_cdns *cdns = in cdns_check_attached_status_dwork() local
1006 val = cdns_readl(cdns, CDNS_MCP_SLAVE_STAT); in cdns_check_attached_status_dwork()
1011 dev_dbg(cdns->dev, "Peripheral %d status: %d\n", i, status[i]); in cdns_check_attached_status_dwork()
1015 mutex_lock(&cdns->status_update_lock); in cdns_check_attached_status_dwork()
1016 ret = sdw_handle_slave_status(&cdns->bus, status); in cdns_check_attached_status_dwork()
1017 mutex_unlock(&cdns->status_update_lock); in cdns_check_attached_status_dwork()
1019 dev_err(cdns->dev, "%s: sdw_handle_slave_status failed: %d\n", __func__, ret); in cdns_check_attached_status_dwork()
1026 * @work: cdns worker thread
1030 struct sdw_cdns *cdns = in cdns_update_slave_status_work() local
1041 cdns_writel(cdns, CDNS_MCP_INTSTAT, CDNS_MCP_INT_SLAVE_MASK); in cdns_update_slave_status_work()
1043 slave0 = cdns_readl(cdns, CDNS_MCP_SLAVE_INTSTAT0); in cdns_update_slave_status_work()
1044 slave1 = cdns_readl(cdns, CDNS_MCP_SLAVE_INTSTAT1); in cdns_update_slave_status_work()
1050 cdns_writel(cdns, CDNS_MCP_SLAVE_INTSTAT0, slave0); in cdns_update_slave_status_work()
1051 cdns_writel(cdns, CDNS_MCP_SLAVE_INTSTAT1, slave1); in cdns_update_slave_status_work()
1056 dev_dbg_ratelimited(cdns->dev, "Slave status change: 0x%llx\n", slave_intstat); in cdns_update_slave_status_work()
1059 cdns_update_slave_status(cdns, slave_intstat); in cdns_update_slave_status_work()
1083 device0_status = cdns_readl(cdns, CDNS_MCP_SLAVE_STAT); in cdns_update_slave_status_work()
1088 dev_dbg_ratelimited(cdns->dev, in cdns_update_slave_status_work()
1094 dev_err_ratelimited(cdns->dev, in cdns_update_slave_status_work()
1101 cdns_updatel(cdns, CDNS_MCP_INTMASK, in cdns_update_slave_status_work()
1107 void sdw_cdns_check_self_clearing_bits(struct sdw_cdns *cdns, const char *string, in sdw_cdns_check_self_clearing_bits() argument
1118 ip_mcp_control = cdns_ip_readl(cdns, CDNS_IP_MCP_CONTROL); in sdw_cdns_check_self_clearing_bits()
1122 dev_err(cdns->dev, "%s failed: IP_MCP_CONTROL_SW_RST is not cleared\n", string); in sdw_cdns_check_self_clearing_bits()
1124 mcp_control = cdns_readl(cdns, CDNS_MCP_CONTROL); in sdw_cdns_check_self_clearing_bits()
1128 dev_err(cdns->dev, "%s failed: MCP_CONTROL_CMD_RST is not cleared\n", string); in sdw_cdns_check_self_clearing_bits()
1130 dev_err(cdns->dev, "%s failed: MCP_CONTROL_SOFT_RST is not cleared\n", string); in sdw_cdns_check_self_clearing_bits()
1132 dev_err(cdns->dev, "%s failed: MCP_CONTROL_CLK_STOP_CLR is not cleared\n", string); in sdw_cdns_check_self_clearing_bits()
1134 mcp_config_update = cdns_readl(cdns, CDNS_MCP_CONFIG_UPDATE); in sdw_cdns_check_self_clearing_bits()
1136 dev_err(cdns->dev, "%s failed: MCP_CONFIG_UPDATE_BIT is not cleared\n", string); in sdw_cdns_check_self_clearing_bits()
1141 dev_err(cdns->dev, "%s failed: MCP_CONTROL_HW_RST is not cleared\n", string); in sdw_cdns_check_self_clearing_bits()
1145 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()
1149 mcp_control = cdns_readl(cdns, CDNS_MCP_CONTROL); in sdw_cdns_check_self_clearing_bits()
1161 * @cdns: Cadence instance
1163 int sdw_cdns_exit_reset(struct sdw_cdns *cdns) in sdw_cdns_exit_reset() argument
1168 cdns_updatel(cdns, CDNS_MCP_CONTROL, in sdw_cdns_exit_reset()
1173 return cdns_config_update(cdns); in sdw_cdns_exit_reset()
1179 * @cdns: Cadence instance
1182 static void cdns_enable_slave_interrupts(struct sdw_cdns *cdns, bool state) in cdns_enable_slave_interrupts() argument
1186 mask = cdns_readl(cdns, CDNS_MCP_INTMASK); in cdns_enable_slave_interrupts()
1192 cdns_writel(cdns, CDNS_MCP_INTMASK, mask); in cdns_enable_slave_interrupts()
1197 * @cdns: Cadence instance
1200 int sdw_cdns_enable_interrupt(struct sdw_cdns *cdns, bool state) in sdw_cdns_enable_interrupt() argument
1220 if (cdns->bus.params.m_data_mode != SDW_PORT_DATA_MODE_NORMAL) in sdw_cdns_enable_interrupt()
1240 slave_state = cdns_readl(cdns, CDNS_MCP_SLAVE_INTSTAT0); in sdw_cdns_enable_interrupt()
1241 cdns_writel(cdns, CDNS_MCP_SLAVE_INTSTAT0, slave_state); in sdw_cdns_enable_interrupt()
1242 slave_state = cdns_readl(cdns, CDNS_MCP_SLAVE_INTSTAT1); in sdw_cdns_enable_interrupt()
1243 cdns_writel(cdns, CDNS_MCP_SLAVE_INTSTAT1, slave_state); in sdw_cdns_enable_interrupt()
1245 cdns->interrupt_enabled = state; in sdw_cdns_enable_interrupt()
1257 cancel_work_sync(&cdns->work); in sdw_cdns_enable_interrupt()
1259 cdns_writel(cdns, CDNS_MCP_SLAVE_INTMASK0, slave_intmask0); in sdw_cdns_enable_interrupt()
1260 cdns_writel(cdns, CDNS_MCP_SLAVE_INTMASK1, slave_intmask1); in sdw_cdns_enable_interrupt()
1261 cdns_writel(cdns, CDNS_MCP_INTMASK, mask); in sdw_cdns_enable_interrupt()
1267 static int cdns_allocate_pdi(struct sdw_cdns *cdns, in cdns_allocate_pdi() argument
1277 pdi = devm_kcalloc(cdns->dev, num, sizeof(*pdi), GFP_KERNEL); in cdns_allocate_pdi()
1292 * @cdns: Cadence instance
1295 int sdw_cdns_pdi_init(struct sdw_cdns *cdns, in sdw_cdns_pdi_init() argument
1301 cdns->pcm.num_bd = config.pcm_bd; in sdw_cdns_pdi_init()
1302 cdns->pcm.num_in = config.pcm_in; in sdw_cdns_pdi_init()
1303 cdns->pcm.num_out = config.pcm_out; in sdw_cdns_pdi_init()
1306 stream = &cdns->pcm; in sdw_cdns_pdi_init()
1309 ret = cdns_allocate_pdi(cdns, &stream->bd, stream->num_bd); in sdw_cdns_pdi_init()
1313 ret = cdns_allocate_pdi(cdns, &stream->in, stream->num_in); in sdw_cdns_pdi_init()
1317 ret = cdns_allocate_pdi(cdns, &stream->out, stream->num_out); in sdw_cdns_pdi_init()
1323 cdns->num_ports = stream->num_pdi; in sdw_cdns_pdi_init()
1344 static void cdns_init_clock_ctrl(struct sdw_cdns *cdns) in cdns_init_clock_ctrl() argument
1346 struct sdw_bus *bus = &cdns->bus; in cdns_init_clock_ctrl()
1352 dev_dbg(cdns->dev, "mclk %d max %d row %d col %d\n", in cdns_init_clock_ctrl()
1361 cdns_updatel(cdns, CDNS_MCP_CLK_CTRL0, in cdns_init_clock_ctrl()
1363 cdns_updatel(cdns, CDNS_MCP_CLK_CTRL1, in cdns_init_clock_ctrl()
1372 cdns_writel(cdns, CDNS_MCP_FRAME_SHAPE_INIT, val); in cdns_init_clock_ctrl()
1376 cdns_writel(cdns, CDNS_MCP_SSP_CTRL0, ssp_interval); in cdns_init_clock_ctrl()
1377 cdns_writel(cdns, CDNS_MCP_SSP_CTRL1, ssp_interval); in cdns_init_clock_ctrl()
1382 * @cdns: Cadence instance
1384 int sdw_cdns_soft_reset(struct sdw_cdns *cdns) in sdw_cdns_soft_reset() argument
1388 cdns_updatel(cdns, CDNS_MCP_CONTROL, CDNS_MCP_CONTROL_SOFT_RST, in sdw_cdns_soft_reset()
1391 ret = cdns_config_update(cdns); in sdw_cdns_soft_reset()
1393 dev_err(cdns->dev, "%s: config update failed\n", __func__); in sdw_cdns_soft_reset()
1397 ret = cdns_set_wait(cdns, CDNS_MCP_CONTROL, CDNS_MCP_CONTROL_SOFT_RST, 0); in sdw_cdns_soft_reset()
1399 dev_err(cdns->dev, "%s: Soft Reset timed out\n", __func__); in sdw_cdns_soft_reset()
1407 * @cdns: Cadence instance
1409 int sdw_cdns_init(struct sdw_cdns *cdns) in sdw_cdns_init() argument
1413 cdns_init_clock_ctrl(cdns); in sdw_cdns_init()
1415 sdw_cdns_check_self_clearing_bits(cdns, __func__, false, 0); in sdw_cdns_init()
1418 cdns->msg_count = cdns_readl(cdns, CDNS_MCP_FIFOLEVEL); in sdw_cdns_init()
1421 cdns_updatel(cdns, CDNS_MCP_CONTROL, CDNS_MCP_CONTROL_CMD_RST, in sdw_cdns_init()
1425 cdns_ip_updatel(cdns, CDNS_IP_MCP_CONTROL, CDNS_IP_MCP_CONTROL_CMD_ACCEPT, in sdw_cdns_init()
1429 cdns_ip_updatel(cdns, CDNS_IP_MCP_CONTROL, in sdw_cdns_init()
1434 val = cdns_readl(cdns, CDNS_MCP_CONFIG); in sdw_cdns_init()
1439 cdns_writel(cdns, CDNS_MCP_CONFIG, val); in sdw_cdns_init()
1442 val = cdns_ip_readl(cdns, CDNS_IP_MCP_CONFIG); in sdw_cdns_init()
1454 if (cdns->bus.multi_link) in sdw_cdns_init()
1462 cdns_ip_writel(cdns, CDNS_IP_MCP_CONFIG, val); in sdw_cdns_init()
1472 struct sdw_cdns *cdns = bus_to_cdns(bus); in cdns_bus_conf() local
1477 dev_err(cdns->dev, "NULL curr_dr_freq\n"); in cdns_bus_conf()
1490 cdns_updatel(cdns, mcp_clkctrl_off, CDNS_MCP_CLK_MCLKD_MASK, divider); in cdns_bus_conf()
1499 struct sdw_cdns *cdns = bus_to_cdns(bus); in cdns_port_params() local
1507 if (target_num == cdns->pdi_loopback_target && in cdns_port_params()
1508 cdns->pdi_loopback_source != -1) { in cdns_port_params()
1509 source_num = cdns->pdi_loopback_source; in cdns_port_params()
1521 dpn_config = cdns_readl(cdns, dpn_config_off_source); in cdns_port_params()
1530 cdns_writel(cdns, dpn_config_off_target, dpn_config); in cdns_port_params()
1539 struct sdw_cdns *cdns = bus_to_cdns(bus); in cdns_transport_params() local
1556 if (target_num == cdns->pdi_loopback_target && in cdns_transport_params()
1557 cdns->pdi_loopback_source != -1) { in cdns_transport_params()
1558 source_num = cdns->pdi_loopback_source; in cdns_transport_params()
1590 dpn_config = cdns_readl(cdns, dpn_config_off_source); in cdns_transport_params()
1595 cdns_writel(cdns, dpn_config_off_target, dpn_config); in cdns_transport_params()
1602 dpn_offsetctrl = cdns_readl(cdns, dpn_offsetctrl_off_source); in cdns_transport_params()
1604 cdns_writel(cdns, dpn_offsetctrl_off_target, dpn_offsetctrl); in cdns_transport_params()
1612 dpn_hctrl = cdns_readl(cdns, dpn_hctrl_off_source); in cdns_transport_params()
1614 cdns_writel(cdns, dpn_hctrl_off_target, dpn_hctrl); in cdns_transport_params()
1619 dpn_samplectrl = cdns_readl(cdns, dpn_samplectrl_off_source); in cdns_transport_params()
1620 cdns_writel(cdns, dpn_samplectrl_off_target, dpn_samplectrl); in cdns_transport_params()
1628 struct sdw_cdns *cdns = bus_to_cdns(bus); in cdns_port_enable() local
1637 cdns_writel(cdns, dpn_chnen_off, ch_mask); in cdns_port_enable()
1651 * @cdns: Cadence instance
1653 bool sdw_cdns_is_clock_stop(struct sdw_cdns *cdns) in sdw_cdns_is_clock_stop() argument
1655 return !!(cdns_readl(cdns, CDNS_MCP_STAT) & CDNS_MCP_STAT_CLK_STOP); in sdw_cdns_is_clock_stop()
1662 * @cdns: Cadence instance
1665 int sdw_cdns_clock_stop(struct sdw_cdns *cdns, bool block_wake) in sdw_cdns_clock_stop() argument
1671 sdw_cdns_check_self_clearing_bits(cdns, __func__, false, 0); in sdw_cdns_clock_stop()
1674 if (sdw_cdns_is_clock_stop(cdns)) { in sdw_cdns_clock_stop()
1675 dev_dbg(cdns->dev, "Clock is already stopped\n"); in sdw_cdns_clock_stop()
1684 cdns_enable_slave_interrupts(cdns, false); in sdw_cdns_clock_stop()
1692 cdns_ip_updatel(cdns, CDNS_IP_MCP_CONTROL, in sdw_cdns_clock_stop()
1696 list_for_each_entry(slave, &cdns->bus.slaves, node) { in sdw_cdns_clock_stop()
1705 ret = cdns_config_update(cdns); in sdw_cdns_clock_stop()
1707 dev_err(cdns->dev, "%s: config_update failed\n", __func__); in sdw_cdns_clock_stop()
1713 ret = sdw_bus_prep_clk_stop(&cdns->bus); in sdw_cdns_clock_stop()
1715 dev_err(cdns->dev, "prepare clock stop failed %d\n", ret); in sdw_cdns_clock_stop()
1724 ret = sdw_bus_clk_stop(&cdns->bus); in sdw_cdns_clock_stop()
1726 dev_err(cdns->dev, "bus clock stop failed %d\n", ret); in sdw_cdns_clock_stop()
1730 ret = cdns_set_wait(cdns, CDNS_MCP_STAT, in sdw_cdns_clock_stop()
1734 dev_err(cdns->dev, "Clock stop failed %d\n", ret); in sdw_cdns_clock_stop()
1743 * @cdns: Cadence instance
1747 int sdw_cdns_clock_restart(struct sdw_cdns *cdns, bool bus_reset) in sdw_cdns_clock_restart() argument
1752 cdns_enable_slave_interrupts(cdns, true); in sdw_cdns_clock_restart()
1754 ret = cdns_clear_bit(cdns, CDNS_MCP_CONTROL, in sdw_cdns_clock_restart()
1757 dev_err(cdns->dev, "Couldn't exit from clock stop\n"); in sdw_cdns_clock_restart()
1761 ret = cdns_set_wait(cdns, CDNS_MCP_STAT, CDNS_MCP_STAT_CLK_STOP, 0); in sdw_cdns_clock_restart()
1763 dev_err(cdns->dev, "clock stop exit failed %d\n", ret); in sdw_cdns_clock_restart()
1767 cdns_ip_updatel(cdns, CDNS_IP_MCP_CONTROL, in sdw_cdns_clock_restart()
1770 cdns_ip_updatel(cdns, CDNS_IP_MCP_CONTROL, CDNS_IP_MCP_CONTROL_CMD_ACCEPT, in sdw_cdns_clock_restart()
1776 cdns_ip_updatel(cdns, CDNS_IP_MCP_CONFIG, in sdw_cdns_clock_restart()
1780 ret = cdns_config_update(cdns); in sdw_cdns_clock_restart()
1782 dev_err(cdns->dev, "%s: config_update failed\n", __func__); in sdw_cdns_clock_restart()
1786 ret = sdw_bus_exit_clk_stop(&cdns->bus); in sdw_cdns_clock_restart()
1788 dev_err(cdns->dev, "bus failed to exit clock stop %d\n", ret); in sdw_cdns_clock_restart()
1797 * @cdns: Cadence instance
1799 int sdw_cdns_probe(struct sdw_cdns *cdns) in sdw_cdns_probe() argument
1801 init_completion(&cdns->tx_complete); in sdw_cdns_probe()
1802 cdns->bus.port_ops = &cdns_port_ops; in sdw_cdns_probe()
1804 mutex_init(&cdns->status_update_lock); in sdw_cdns_probe()
1806 INIT_WORK(&cdns->work, cdns_update_slave_status_work); in sdw_cdns_probe()
1807 INIT_DELAYED_WORK(&cdns->attach_dwork, cdns_check_attached_status_dwork); in sdw_cdns_probe()
1816 struct sdw_cdns *cdns = snd_soc_dai_get_drvdata(dai); in cdns_set_sdw_stream() local
1819 dai_runtime = cdns->dai_runtime_array[dai->id]; in cdns_set_sdw_stream()
1837 dai_runtime->bus = &cdns->bus; in cdns_set_sdw_stream()
1838 dai_runtime->link_id = cdns->instance; in cdns_set_sdw_stream()
1843 cdns->dai_runtime_array[dai->id] = dai_runtime; in cdns_set_sdw_stream()
1855 cdns->dai_runtime_array[dai->id] = NULL; in cdns_set_sdw_stream()
1864 * @cdns: Cadence instance
1872 static struct sdw_cdns_pdi *cdns_find_pdi(struct sdw_cdns *cdns, in cdns_find_pdi() argument
1889 * @cdns: Cadence instance
1894 void sdw_cdns_config_stream(struct sdw_cdns *cdns, in sdw_cdns_config_stream() argument
1902 if (cdns->bus.params.m_data_mode != SDW_PORT_DATA_MODE_NORMAL) in sdw_cdns_config_stream()
1906 cdns_updatel(cdns, offset, in sdw_cdns_config_stream()
1913 cdns_writel(cdns, CDNS_PDI_CONFIG(pdi->num), val); in sdw_cdns_config_stream()
1920 * @cdns: Cadence instance
1926 struct sdw_cdns_pdi *sdw_cdns_alloc_pdi(struct sdw_cdns *cdns, in sdw_cdns_alloc_pdi() argument
1933 pdi = cdns_find_pdi(cdns, stream->num_in, stream->in, in sdw_cdns_alloc_pdi()
1936 pdi = cdns_find_pdi(cdns, stream->num_out, stream->out, in sdw_cdns_alloc_pdi()
1941 pdi = cdns_find_pdi(cdns, stream->num_bd, stream->bd, in sdw_cdns_alloc_pdi()