Lines Matching defs:cdns

203 static inline u32 cdns_readl(struct sdw_cdns *cdns, int offset)
205 return readl(cdns->registers + offset);
208 static inline void cdns_writel(struct sdw_cdns *cdns, int offset, u32 value)
210 writel(value, cdns->registers + offset);
213 static inline u32 cdns_ip_readl(struct sdw_cdns *cdns, int offset)
215 return cdns_readl(cdns, cdns->ip_offset + offset);
218 static inline void cdns_ip_writel(struct sdw_cdns *cdns, int offset, u32 value)
220 return cdns_writel(cdns, cdns->ip_offset + offset, value);
223 static inline void cdns_updatel(struct sdw_cdns *cdns,
228 tmp = cdns_readl(cdns, offset);
230 cdns_writel(cdns, offset, tmp);
233 static inline void cdns_ip_updatel(struct sdw_cdns *cdns,
236 cdns_updatel(cdns, cdns->ip_offset + offset, mask, val);
239 static int cdns_set_wait(struct sdw_cdns *cdns, int offset, u32 mask, u32 value)
246 reg_read = readl(cdns->registers + offset);
257 static int cdns_clear_bit(struct sdw_cdns *cdns, int offset, u32 value)
259 writel(value, cdns->registers + offset);
262 return cdns_set_wait(cdns, offset, value, 0);
269 static int cdns_config_update(struct sdw_cdns *cdns)
273 if (sdw_cdns_is_clock_stop(cdns)) {
274 dev_err(cdns->dev, "Cannot program MCP_CONFIG_UPDATE in ClockStopMode\n");
278 ret = cdns_clear_bit(cdns, CDNS_MCP_CONFIG_UPDATE,
281 dev_err(cdns->dev, "Config update timedout\n");
288 * @cdns: Cadence instance
290 void sdw_cdns_config_update(struct sdw_cdns *cdns)
293 cdns_writel(cdns, CDNS_MCP_CONFIG_UPDATE, CDNS_MCP_CONFIG_UPDATE_BIT);
299 * @cdns: Cadence instance
301 int sdw_cdns_config_update_set_wait(struct sdw_cdns *cdns)
304 return cdns_set_wait(cdns, CDNS_MCP_CONFIG_UPDATE,
316 static ssize_t cdns_sprintf(struct sdw_cdns *cdns,
320 "%4x\t%8x\n", reg, cdns_readl(cdns, reg));
325 struct sdw_cdns *cdns = s->private;
339 ret += cdns_sprintf(cdns, buf, ret, i);
345 ret += cdns_sprintf(cdns, buf, ret, i);
349 ret += cdns_sprintf(cdns, buf, ret, CDNS_MCP_SSP_CTRL0);
350 ret += cdns_sprintf(cdns, buf, ret, CDNS_MCP_SSP_CTRL1);
351 ret += cdns_sprintf(cdns, buf, ret, CDNS_MCP_CLK_CTRL0);
352 ret += cdns_sprintf(cdns, buf, ret, CDNS_MCP_CLK_CTRL1);
357 num_ports = cdns->num_ports;
364 ret += cdns_sprintf(cdns, buf, ret, j);
375 ret += cdns_sprintf(cdns, buf, ret, j);
381 ret += cdns_sprintf(cdns, buf, ret,
389 ret += cdns_sprintf(cdns, buf, ret, CDNS_PDI_CONFIG(i));
400 struct sdw_cdns *cdns = data;
409 ret = sdw_cdns_exit_reset(cdns);
411 dev_dbg(cdns->dev, "link hw_reset done: %d\n", ret);
420 struct sdw_cdns *cdns = data;
427 bus = &cdns->bus;
435 dev_err_ratelimited(cdns->dev,
454 cdns_ip_updatel(cdns, CDNS_IP_MCP_CMDCTRL,
459 ret = cdns_clear_bit(cdns, CDNS_MCP_CONFIG_UPDATE, CDNS_MCP_CONFIG_UPDATE_BIT);
464 ret = sdw_bread_no_pm_unlocked(&cdns->bus, 0xf, SDW_SCP_DEVID_0);
465 dev_info(cdns->dev, "parity error injection, read: %d\n", ret);
468 cdns_ip_updatel(cdns, CDNS_IP_MCP_CMDCTRL,
473 ret = cdns_clear_bit(cdns, CDNS_MCP_CONFIG_UPDATE, CDNS_MCP_CONFIG_UPDATE_BIT);
499 struct sdw_cdns *cdns = data;
500 unsigned int pdi_out_num = cdns->pcm.num_bd + cdns->pcm.num_out;
508 cdns->pdi_loopback_source = value;
516 struct sdw_cdns *cdns = data;
517 unsigned int pdi_in_num = cdns->pcm.num_bd + cdns->pcm.num_in;
525 cdns->pdi_loopback_target = value;
533 * @cdns: Cadence instance
536 void sdw_cdns_debugfs_init(struct sdw_cdns *cdns, struct dentry *root)
538 debugfs_create_file("cdns-registers", 0400, root, cdns, &cdns_reg_fops);
540 debugfs_create_file("cdns-hw-reset", 0200, root, cdns,
543 debugfs_create_file("cdns-parity-error-injection", 0200, root, cdns,
546 cdns->pdi_loopback_source = -1;
547 cdns->pdi_loopback_target = -1;
549 debugfs_create_file("cdns-pdi-loopback-source", 0200, root, cdns,
552 debugfs_create_file("cdns-pdi-loopback-target", 0200, root, cdns,
564 cdns_fill_msg_resp(struct sdw_cdns *cdns,
572 if (!(cdns->response_buf[i] & CDNS_MCP_RESP_ACK)) {
574 dev_vdbg(cdns->dev, "Msg Ack not received, cmd %d\n", i);
576 if (cdns->response_buf[i] & CDNS_MCP_RESP_NACK) {
578 dev_err_ratelimited(cdns->dev, "Msg NACK received, cmd %d\n", i);
583 dev_err_ratelimited(cdns->dev, "Msg NACKed for Slave %d\n", msg->dev_num);
588 dev_dbg_ratelimited(cdns->dev, "Msg ignored for Slave %d\n", msg->dev_num);
596 cdns->response_buf[i]);
602 static void cdns_read_response(struct sdw_cdns *cdns)
608 BUILD_BUG_ON(ARRAY_SIZE(cdns->response_buf) < CDNS_MCP_CMD_LEN + 2);
610 num_resp = cdns_readl(cdns, CDNS_MCP_FIFOSTAT);
612 if (num_resp > ARRAY_SIZE(cdns->response_buf)) {
613 dev_warn(cdns->dev, "RX AVAIL %d too long\n", num_resp);
614 num_resp = ARRAY_SIZE(cdns->response_buf);
620 cdns->response_buf[i] = cdns_ip_readl(cdns, cmd_base);
626 _cdns_xfer_msg(struct sdw_cdns *cdns, struct sdw_msg *msg, int cmd,
634 if (cdns->msg_count != count) {
635 cdns_writel(cdns, CDNS_MCP_FIFOLEVEL, count);
636 cdns->msg_count = count;
652 cdns_ip_writel(cdns, base, data);
660 time = wait_for_completion_timeout(&cdns->tx_complete,
663 dev_err(cdns->dev, "IO transfer timed out, cmd %d device %d addr %x len %d\n",
668 cdns_read_response(cdns);
673 return cdns_fill_msg_resp(cdns, msg, count, offset);
677 cdns_program_scp_addr(struct sdw_cdns *cdns, struct sdw_msg *msg)
685 if (cdns->msg_count != CDNS_SCP_RX_FIFOLEVEL) {
686 cdns_writel(cdns, CDNS_MCP_FIFOLEVEL, CDNS_SCP_RX_FIFOLEVEL);
687 cdns->msg_count = CDNS_SCP_RX_FIFOLEVEL;
701 cdns_ip_writel(cdns, base, data[0]);
703 cdns_ip_writel(cdns, base, data[1]);
705 time = wait_for_completion_timeout(&cdns->tx_complete,
708 dev_err(cdns->dev, "SCP Msg trf timed out\n");
715 if (!(cdns->response_buf[i] & CDNS_MCP_RESP_ACK)) {
717 dev_err(cdns->dev, "Program SCP Ack not received\n");
718 if (cdns->response_buf[i] & CDNS_MCP_RESP_NACK) {
720 dev_err(cdns->dev, "Program SCP NACK received\n");
727 dev_err_ratelimited(cdns->dev,
733 dev_dbg_ratelimited(cdns->dev,
741 static int cdns_prep_msg(struct sdw_cdns *cdns, struct sdw_msg *msg, int *cmd)
746 ret = cdns_program_scp_addr(cdns, msg);
763 dev_err(cdns->dev, "Invalid msg cmd: %d\n", msg->flags);
773 struct sdw_cdns *cdns = bus_to_cdns(bus);
776 ret = cdns_prep_msg(cdns, msg, &cmd);
781 ret = _cdns_xfer_msg(cdns, msg, cmd, i * CDNS_MCP_CMD_LEN,
790 return _cdns_xfer_msg(cdns, msg, cmd, i * CDNS_MCP_CMD_LEN,
798 struct sdw_cdns *cdns = bus_to_cdns(bus);
807 ret = cdns_prep_msg(cdns, msg, &cmd);
811 return _cdns_xfer_msg(cdns, msg, cmd, 0, msg->len, true);
817 struct sdw_cdns *cdns = bus_to_cdns(bus);
819 return cdns_readl(cdns, CDNS_MCP_SLAVE_STAT);
827 static int cdns_update_slave_status(struct sdw_cdns *cdns,
873 val = cdns_readl(cdns, CDNS_MCP_SLAVE_STAT);
895 return sdw_handle_slave_status(&cdns->bus, status);
907 struct sdw_cdns *cdns = dev_id;
911 if (!cdns->link_up)
914 int_status = cdns_readl(cdns, CDNS_MCP_INTSTAT);
924 struct sdw_bus *bus = &cdns->bus;
927 cdns_read_response(cdns);
930 cdns_fill_msg_resp(cdns, defer->msg,
934 complete(&cdns->tx_complete);
940 dev_err_ratelimited(cdns->dev, "Parity error\n");
945 dev_err_ratelimited(cdns->dev, "Bus clash for control word\n");
953 dev_err_ratelimited(cdns->dev, "Bus clash for data word\n");
956 if (cdns->bus.params.m_data_mode != SDW_PORT_DATA_MODE_NORMAL &&
961 port_intstat = cdns_readl(cdns, CDNS_MCP_PORT_INTSTAT);
962 dev_err_ratelimited(cdns->dev, "DP interrupt: PortIntStat %8x\n",
966 cdns_writel(cdns, CDNS_MCP_PORT_INTSTAT, port_intstat);
971 cdns_updatel(cdns, CDNS_MCP_INTMASK,
983 if (cdns->interrupt_enabled)
984 schedule_work(&cdns->work);
987 cdns_writel(cdns, CDNS_MCP_INTSTAT, int_status);
996 * @work: cdns worker thread
1000 struct sdw_cdns *cdns =
1011 cdns_writel(cdns, CDNS_MCP_INTSTAT, CDNS_MCP_INT_SLAVE_MASK);
1013 slave0 = cdns_readl(cdns, CDNS_MCP_SLAVE_INTSTAT0);
1014 slave1 = cdns_readl(cdns, CDNS_MCP_SLAVE_INTSTAT1);
1020 cdns_writel(cdns, CDNS_MCP_SLAVE_INTSTAT0, slave0);
1021 cdns_writel(cdns, CDNS_MCP_SLAVE_INTSTAT1, slave1);
1026 dev_dbg_ratelimited(cdns->dev, "Slave status change: 0x%llx\n", slave_intstat);
1029 cdns_update_slave_status(cdns, slave_intstat);
1053 device0_status = cdns_readl(cdns, CDNS_MCP_SLAVE_STAT);
1058 dev_dbg_ratelimited(cdns->dev,
1064 dev_err_ratelimited(cdns->dev,
1071 cdns_updatel(cdns, CDNS_MCP_INTMASK,
1077 void sdw_cdns_check_self_clearing_bits(struct sdw_cdns *cdns, const char *string,
1088 ip_mcp_control = cdns_ip_readl(cdns, CDNS_IP_MCP_CONTROL);
1092 dev_err(cdns->dev, "%s failed: IP_MCP_CONTROL_SW_RST is not cleared\n", string);
1094 mcp_control = cdns_readl(cdns, CDNS_MCP_CONTROL);
1098 dev_err(cdns->dev, "%s failed: MCP_CONTROL_CMD_RST is not cleared\n", string);
1100 dev_err(cdns->dev, "%s failed: MCP_CONTROL_SOFT_RST is not cleared\n", string);
1102 dev_err(cdns->dev, "%s failed: MCP_CONTROL_CLK_STOP_CLR is not cleared\n", string);
1104 mcp_config_update = cdns_readl(cdns, CDNS_MCP_CONFIG_UPDATE);
1106 dev_err(cdns->dev, "%s failed: MCP_CONFIG_UPDATE_BIT is not cleared\n", string);
1111 dev_err(cdns->dev, "%s failed: MCP_CONTROL_HW_RST is not cleared\n", string);
1115 dev_dbg(cdns->dev, "%s: MCP_CONTROL_HW_RST is not cleared at iteration %d\n", string, i);
1119 mcp_control = cdns_readl(cdns, CDNS_MCP_CONTROL);
1131 * @cdns: Cadence instance
1133 int sdw_cdns_exit_reset(struct sdw_cdns *cdns)
1138 cdns_updatel(cdns, CDNS_MCP_CONTROL,
1143 return cdns_config_update(cdns);
1149 * @cdns: Cadence instance
1152 static void cdns_enable_slave_interrupts(struct sdw_cdns *cdns, bool state)
1156 mask = cdns_readl(cdns, CDNS_MCP_INTMASK);
1162 cdns_writel(cdns, CDNS_MCP_INTMASK, mask);
1167 * @cdns: Cadence instance
1170 int sdw_cdns_enable_interrupt(struct sdw_cdns *cdns, bool state)
1190 if (cdns->bus.params.m_data_mode != SDW_PORT_DATA_MODE_NORMAL)
1210 slave_state = cdns_readl(cdns, CDNS_MCP_SLAVE_INTSTAT0);
1211 cdns_writel(cdns, CDNS_MCP_SLAVE_INTSTAT0, slave_state);
1212 slave_state = cdns_readl(cdns, CDNS_MCP_SLAVE_INTSTAT1);
1213 cdns_writel(cdns, CDNS_MCP_SLAVE_INTSTAT1, slave_state);
1215 cdns->interrupt_enabled = state;
1227 cancel_work_sync(&cdns->work);
1229 cdns_writel(cdns, CDNS_MCP_SLAVE_INTMASK0, slave_intmask0);
1230 cdns_writel(cdns, CDNS_MCP_SLAVE_INTMASK1, slave_intmask1);
1231 cdns_writel(cdns, CDNS_MCP_INTMASK, mask);
1237 static int cdns_allocate_pdi(struct sdw_cdns *cdns,
1247 pdi = devm_kcalloc(cdns->dev, num, sizeof(*pdi), GFP_KERNEL);
1262 * @cdns: Cadence instance
1265 int sdw_cdns_pdi_init(struct sdw_cdns *cdns,
1272 cdns->pcm.num_bd = config.pcm_bd;
1273 cdns->pcm.num_in = config.pcm_in;
1274 cdns->pcm.num_out = config.pcm_out;
1277 stream = &cdns->pcm;
1282 ret = cdns_allocate_pdi(cdns, &stream->bd,
1289 ret = cdns_allocate_pdi(cdns, &stream->in,
1296 ret = cdns_allocate_pdi(cdns, &stream->out,
1303 cdns->num_ports = stream->num_pdi;
1324 static void cdns_init_clock_ctrl(struct sdw_cdns *cdns)
1326 struct sdw_bus *bus = &cdns->bus;
1335 cdns_updatel(cdns, CDNS_MCP_CLK_CTRL0,
1337 cdns_updatel(cdns, CDNS_MCP_CLK_CTRL1,
1346 cdns_writel(cdns, CDNS_MCP_FRAME_SHAPE_INIT, val);
1350 cdns_writel(cdns, CDNS_MCP_SSP_CTRL0, ssp_interval);
1351 cdns_writel(cdns, CDNS_MCP_SSP_CTRL1, ssp_interval);
1356 * @cdns: Cadence instance
1358 int sdw_cdns_init(struct sdw_cdns *cdns)
1362 cdns_init_clock_ctrl(cdns);
1364 sdw_cdns_check_self_clearing_bits(cdns, __func__, false, 0);
1367 cdns->msg_count = cdns_readl(cdns, CDNS_MCP_FIFOLEVEL);
1370 cdns_updatel(cdns, CDNS_MCP_CONTROL, CDNS_MCP_CONTROL_CMD_RST,
1374 cdns_ip_updatel(cdns, CDNS_IP_MCP_CONTROL, CDNS_IP_MCP_CONTROL_CMD_ACCEPT,
1378 val = cdns_readl(cdns, CDNS_MCP_CONFIG);
1383 cdns_writel(cdns, CDNS_MCP_CONFIG, val);
1386 val = cdns_ip_readl(cdns, CDNS_IP_MCP_CONFIG);
1398 if (cdns->bus.multi_link)
1406 cdns_ip_writel(cdns, CDNS_IP_MCP_CONFIG, val);
1416 struct sdw_cdns *cdns = bus_to_cdns(bus);
1421 dev_err(cdns->dev, "NULL curr_dr_freq\n");
1434 cdns_updatel(cdns, mcp_clkctrl_off, CDNS_MCP_CLK_MCLKD_MASK, divider);
1443 struct sdw_cdns *cdns = bus_to_cdns(bus);
1451 if (target_num == cdns->pdi_loopback_target &&
1452 cdns->pdi_loopback_source != -1) {
1453 source_num = cdns->pdi_loopback_source;
1465 dpn_config = cdns_readl(cdns, dpn_config_off_source);
1474 cdns_writel(cdns, dpn_config_off_target, dpn_config);
1483 struct sdw_cdns *cdns = bus_to_cdns(bus);
1500 if (target_num == cdns->pdi_loopback_target &&
1501 cdns->pdi_loopback_source != -1) {
1502 source_num = cdns->pdi_loopback_source;
1534 dpn_config = cdns_readl(cdns, dpn_config_off_source);
1539 cdns_writel(cdns, dpn_config_off_target, dpn_config);
1546 dpn_offsetctrl = cdns_readl(cdns, dpn_offsetctrl_off_source);
1548 cdns_writel(cdns, dpn_offsetctrl_off_target, dpn_offsetctrl);
1556 dpn_hctrl = cdns_readl(cdns, dpn_hctrl_off_source);
1558 cdns_writel(cdns, dpn_hctrl_off_target, dpn_hctrl);
1563 dpn_samplectrl = cdns_readl(cdns, dpn_samplectrl_off_source);
1564 cdns_writel(cdns, dpn_samplectrl_off_target, dpn_samplectrl);
1572 struct sdw_cdns *cdns = bus_to_cdns(bus);
1581 cdns_writel(cdns, dpn_chnen_off, ch_mask);
1595 * @cdns: Cadence instance
1597 bool sdw_cdns_is_clock_stop(struct sdw_cdns *cdns)
1599 return !!(cdns_readl(cdns, CDNS_MCP_STAT) & CDNS_MCP_STAT_CLK_STOP);
1606 * @cdns: Cadence instance
1609 int sdw_cdns_clock_stop(struct sdw_cdns *cdns, bool block_wake)
1615 sdw_cdns_check_self_clearing_bits(cdns, __func__, false, 0);
1618 if (sdw_cdns_is_clock_stop(cdns)) {
1619 dev_dbg(cdns->dev, "Clock is already stopped\n");
1628 cdns_enable_slave_interrupts(cdns, false);
1636 cdns_ip_updatel(cdns, CDNS_IP_MCP_CONTROL,
1640 list_for_each_entry(slave, &cdns->bus.slaves, node) {
1649 ret = cdns_config_update(cdns);
1651 dev_err(cdns->dev, "%s: config_update failed\n", __func__);
1657 ret = sdw_bus_prep_clk_stop(&cdns->bus);
1659 dev_err(cdns->dev, "prepare clock stop failed %d\n", ret);
1668 ret = sdw_bus_clk_stop(&cdns->bus);
1670 dev_err(cdns->dev, "bus clock stop failed %d\n", ret);
1674 ret = cdns_set_wait(cdns, CDNS_MCP_STAT,
1678 dev_err(cdns->dev, "Clock stop failed %d\n", ret);
1687 * @cdns: Cadence instance
1691 int sdw_cdns_clock_restart(struct sdw_cdns *cdns, bool bus_reset)
1696 cdns_enable_slave_interrupts(cdns, true);
1698 ret = cdns_clear_bit(cdns, CDNS_MCP_CONTROL,
1701 dev_err(cdns->dev, "Couldn't exit from clock stop\n");
1705 ret = cdns_set_wait(cdns, CDNS_MCP_STAT, CDNS_MCP_STAT_CLK_STOP, 0);
1707 dev_err(cdns->dev, "clock stop exit failed %d\n", ret);
1711 cdns_ip_updatel(cdns, CDNS_IP_MCP_CONTROL,
1714 cdns_ip_updatel(cdns, CDNS_IP_MCP_CONTROL, CDNS_IP_MCP_CONTROL_CMD_ACCEPT,
1720 cdns_ip_updatel(cdns, CDNS_IP_MCP_CONFIG,
1724 ret = cdns_config_update(cdns);
1726 dev_err(cdns->dev, "%s: config_update failed\n", __func__);
1730 ret = sdw_bus_exit_clk_stop(&cdns->bus);
1732 dev_err(cdns->dev, "bus failed to exit clock stop %d\n", ret);
1741 * @cdns: Cadence instance
1743 int sdw_cdns_probe(struct sdw_cdns *cdns)
1745 init_completion(&cdns->tx_complete);
1746 cdns->bus.port_ops = &cdns_port_ops;
1748 INIT_WORK(&cdns->work, cdns_update_slave_status_work);
1756 struct sdw_cdns *cdns = snd_soc_dai_get_drvdata(dai);
1759 dai_runtime = cdns->dai_runtime_array[dai->id];
1777 dai_runtime->bus = &cdns->bus;
1778 dai_runtime->link_id = cdns->instance;
1783 cdns->dai_runtime_array[dai->id] = dai_runtime;
1795 cdns->dai_runtime_array[dai->id] = NULL;
1804 * @cdns: Cadence instance
1813 static struct sdw_cdns_pdi *cdns_find_pdi(struct sdw_cdns *cdns,
1831 * @cdns: Cadence instance
1836 void sdw_cdns_config_stream(struct sdw_cdns *cdns,
1844 if (cdns->bus.params.m_data_mode != SDW_PORT_DATA_MODE_NORMAL)
1848 cdns_updatel(cdns, offset,
1855 cdns_writel(cdns, CDNS_PDI_CONFIG(pdi->num), val);
1862 * @cdns: Cadence instance
1868 struct sdw_cdns_pdi *sdw_cdns_alloc_pdi(struct sdw_cdns *cdns,
1875 pdi = cdns_find_pdi(cdns, 0, stream->num_in, stream->in,
1878 pdi = cdns_find_pdi(cdns, 0, stream->num_out, stream->out,
1883 pdi = cdns_find_pdi(cdns, 2, stream->num_bd, stream->bd,