Lines Matching defs:cdns
198 static inline u32 cdns_readl(struct sdw_cdns *cdns, int offset)
200 return readl(cdns->registers + offset);
203 static inline void cdns_writel(struct sdw_cdns *cdns, int offset, u32 value)
205 writel(value, cdns->registers + offset);
208 static inline void cdns_updatel(struct sdw_cdns *cdns,
213 tmp = cdns_readl(cdns, offset);
215 cdns_writel(cdns, offset, tmp);
218 static int cdns_set_wait(struct sdw_cdns *cdns, int offset, u32 mask, u32 value)
225 reg_read = readl(cdns->registers + offset);
236 static int cdns_clear_bit(struct sdw_cdns *cdns, int offset, u32 value)
238 writel(value, cdns->registers + offset);
241 return cdns_set_wait(cdns, offset, value, 0);
248 static int cdns_config_update(struct sdw_cdns *cdns)
252 if (sdw_cdns_is_clock_stop(cdns)) {
253 dev_err(cdns->dev, "Cannot program MCP_CONFIG_UPDATE in ClockStopMode\n");
257 ret = cdns_clear_bit(cdns, CDNS_MCP_CONFIG_UPDATE,
260 dev_err(cdns->dev, "Config update timedout\n");
272 static ssize_t cdns_sprintf(struct sdw_cdns *cdns,
276 "%4x\t%8x\n", reg, cdns_readl(cdns, reg));
281 struct sdw_cdns *cdns = s->private;
295 ret += cdns_sprintf(cdns, buf, ret, i);
301 ret += cdns_sprintf(cdns, buf, ret, i);
305 ret += cdns_sprintf(cdns, buf, ret, CDNS_MCP_SSP_CTRL0);
306 ret += cdns_sprintf(cdns, buf, ret, CDNS_MCP_SSP_CTRL1);
307 ret += cdns_sprintf(cdns, buf, ret, CDNS_MCP_CLK_CTRL0);
308 ret += cdns_sprintf(cdns, buf, ret, CDNS_MCP_CLK_CTRL1);
313 num_ports = cdns->num_ports;
320 ret += cdns_sprintf(cdns, buf, ret, j);
331 ret += cdns_sprintf(cdns, buf, ret, j);
337 ret += cdns_sprintf(cdns, buf, ret,
345 ret += cdns_sprintf(cdns, buf, ret, CDNS_PDI_CONFIG(i));
356 struct sdw_cdns *cdns = data;
365 ret = sdw_cdns_exit_reset(cdns);
367 dev_dbg(cdns->dev, "link hw_reset done: %d\n", ret);
376 struct sdw_cdns *cdns = data;
383 bus = &cdns->bus;
391 dev_err_ratelimited(cdns->dev,
411 cdns_updatel(cdns, CDNS_MCP_CMDCTRL,
416 cdns_updatel(cdns, CDNS_MCP_CONFIG_UPDATE,
421 ret = sdw_bread_no_pm_unlocked(&cdns->bus, 0xf, SDW_SCP_DEVID_0);
422 dev_info(cdns->dev, "parity error injection, read: %d\n", ret);
425 cdns_updatel(cdns, CDNS_MCP_CMDCTRL,
430 cdns_updatel(cdns, CDNS_MCP_CONFIG_UPDATE,
455 * @cdns: Cadence instance
458 void sdw_cdns_debugfs_init(struct sdw_cdns *cdns, struct dentry *root)
460 debugfs_create_file("cdns-registers", 0400, root, cdns, &cdns_reg_fops);
462 debugfs_create_file("cdns-hw-reset", 0200, root, cdns,
465 debugfs_create_file("cdns-parity-error-injection", 0200, root, cdns,
476 cdns_fill_msg_resp(struct sdw_cdns *cdns,
484 if (!(cdns->response_buf[i] & CDNS_MCP_RESP_ACK)) {
486 dev_dbg_ratelimited(cdns->dev, "Msg Ack not received\n");
488 if (cdns->response_buf[i] & CDNS_MCP_RESP_NACK) {
490 dev_err_ratelimited(cdns->dev, "Msg NACK received\n");
495 dev_err_ratelimited(cdns->dev, "Msg NACKed for Slave %d\n", msg->dev_num);
500 dev_dbg_ratelimited(cdns->dev, "Msg ignored for Slave %d\n", msg->dev_num);
508 cdns->response_buf[i]);
514 static void cdns_read_response(struct sdw_cdns *cdns)
520 BUILD_BUG_ON(ARRAY_SIZE(cdns->response_buf) < CDNS_MCP_CMD_LEN + 2);
522 num_resp = cdns_readl(cdns, CDNS_MCP_FIFOSTAT);
524 if (num_resp > ARRAY_SIZE(cdns->response_buf)) {
525 dev_warn(cdns->dev, "RX AVAIL %d too long\n", num_resp);
526 num_resp = ARRAY_SIZE(cdns->response_buf);
532 cdns->response_buf[i] = cdns_readl(cdns, cmd_base);
538 _cdns_xfer_msg(struct sdw_cdns *cdns, struct sdw_msg *msg, int cmd,
546 if (cdns->msg_count != count) {
547 cdns_writel(cdns, CDNS_MCP_FIFOLEVEL, count);
548 cdns->msg_count = count;
564 cdns_writel(cdns, base, data);
572 time = wait_for_completion_timeout(&cdns->tx_complete,
575 dev_err(cdns->dev, "IO transfer timed out, cmd %d device %d addr %x len %d\n",
580 cdns_read_response(cdns);
585 return cdns_fill_msg_resp(cdns, msg, count, offset);
589 cdns_program_scp_addr(struct sdw_cdns *cdns, struct sdw_msg *msg)
597 if (cdns->msg_count != CDNS_SCP_RX_FIFOLEVEL) {
598 cdns_writel(cdns, CDNS_MCP_FIFOLEVEL, CDNS_SCP_RX_FIFOLEVEL);
599 cdns->msg_count = CDNS_SCP_RX_FIFOLEVEL;
613 cdns_writel(cdns, base, data[0]);
615 cdns_writel(cdns, base, data[1]);
617 time = wait_for_completion_timeout(&cdns->tx_complete,
620 dev_err(cdns->dev, "SCP Msg trf timed out\n");
627 if (!(cdns->response_buf[i] & CDNS_MCP_RESP_ACK)) {
629 dev_err(cdns->dev, "Program SCP Ack not received\n");
630 if (cdns->response_buf[i] & CDNS_MCP_RESP_NACK) {
632 dev_err(cdns->dev, "Program SCP NACK received\n");
639 dev_err_ratelimited(cdns->dev,
645 dev_dbg_ratelimited(cdns->dev,
653 static int cdns_prep_msg(struct sdw_cdns *cdns, struct sdw_msg *msg, int *cmd)
658 ret = cdns_program_scp_addr(cdns, msg);
675 dev_err(cdns->dev, "Invalid msg cmd: %d\n", msg->flags);
685 struct sdw_cdns *cdns = bus_to_cdns(bus);
688 ret = cdns_prep_msg(cdns, msg, &cmd);
693 ret = _cdns_xfer_msg(cdns, msg, cmd, i * CDNS_MCP_CMD_LEN,
702 ret = _cdns_xfer_msg(cdns, msg, cmd, i * CDNS_MCP_CMD_LEN,
714 struct sdw_cdns *cdns = bus_to_cdns(bus);
721 ret = cdns_prep_msg(cdns, msg, &cmd);
725 cdns->defer = defer;
726 cdns->defer->length = msg->len;
728 return _cdns_xfer_msg(cdns, msg, cmd, 0, msg->len, true);
735 struct sdw_cdns *cdns = bus_to_cdns(bus);
742 return cdns_program_scp_addr(cdns, &msg);
750 static int cdns_update_slave_status(struct sdw_cdns *cdns,
796 dev_warn_ratelimited(cdns->dev,
801 val = cdns_readl(cdns, CDNS_MCP_SLAVE_STAT);
820 dev_warn_ratelimited(cdns->dev,
828 return sdw_handle_slave_status(&cdns->bus, status);
840 struct sdw_cdns *cdns = dev_id;
845 if (!cdns->link_up)
848 int_status = cdns_readl(cdns, CDNS_MCP_INTSTAT);
858 cdns_read_response(cdns);
860 if (cdns->defer) {
861 cdns_fill_msg_resp(cdns, cdns->defer->msg,
862 cdns->defer->length, 0);
863 complete(&cdns->defer->complete);
864 cdns->defer = NULL;
866 complete(&cdns->tx_complete);
872 dev_err_ratelimited(cdns->dev, "Parity error\n");
877 dev_err_ratelimited(cdns->dev, "Bus clash for control word\n");
885 dev_err_ratelimited(cdns->dev, "Bus clash for data word\n");
888 if (cdns->bus.params.m_data_mode != SDW_PORT_DATA_MODE_NORMAL &&
893 port_intstat = cdns_readl(cdns, CDNS_MCP_PORT_INTSTAT);
894 dev_err_ratelimited(cdns->dev, "DP interrupt: PortIntStat %8x\n",
898 cdns_writel(cdns, CDNS_MCP_PORT_INTSTAT, port_intstat);
903 cdns_updatel(cdns, CDNS_MCP_INTMASK,
915 if (cdns->interrupt_enabled)
916 schedule_work(&cdns->work);
919 cdns_writel(cdns, CDNS_MCP_INTSTAT, int_status);
928 * @work: cdns worker thread
932 struct sdw_cdns *cdns =
936 dev_dbg_ratelimited(cdns->dev, "Slave status change\n");
938 slave0 = cdns_readl(cdns, CDNS_MCP_SLAVE_INTSTAT0);
939 slave1 = cdns_readl(cdns, CDNS_MCP_SLAVE_INTSTAT1);
941 cdns_update_slave_status(cdns, slave0, slave1);
942 cdns_writel(cdns, CDNS_MCP_SLAVE_INTSTAT0, slave0);
943 cdns_writel(cdns, CDNS_MCP_SLAVE_INTSTAT1, slave1);
946 cdns_writel(cdns, CDNS_MCP_INTSTAT, CDNS_MCP_INT_SLAVE_MASK);
947 cdns_updatel(cdns, CDNS_MCP_INTMASK,
958 * @cdns: Cadence instance
960 int sdw_cdns_exit_reset(struct sdw_cdns *cdns)
963 cdns_updatel(cdns, CDNS_MCP_CONTROL,
968 cdns_updatel(cdns, CDNS_MCP_CONTROL,
973 cdns_updatel(cdns, CDNS_MCP_CONFIG_UPDATE,
985 * @cdns: Cadence instance
988 static void cdns_enable_slave_interrupts(struct sdw_cdns *cdns, bool state)
992 mask = cdns_readl(cdns, CDNS_MCP_INTMASK);
998 cdns_writel(cdns, CDNS_MCP_INTMASK, mask);
1003 * @cdns: Cadence instance
1006 int sdw_cdns_enable_interrupt(struct sdw_cdns *cdns, bool state)
1026 if (cdns->bus.params.m_data_mode != SDW_PORT_DATA_MODE_NORMAL)
1046 slave_state = cdns_readl(cdns, CDNS_MCP_SLAVE_INTSTAT0);
1047 cdns_writel(cdns, CDNS_MCP_SLAVE_INTSTAT0, slave_state);
1048 slave_state = cdns_readl(cdns, CDNS_MCP_SLAVE_INTSTAT1);
1049 cdns_writel(cdns, CDNS_MCP_SLAVE_INTSTAT1, slave_state);
1051 cdns->interrupt_enabled = state;
1063 cancel_work_sync(&cdns->work);
1065 cdns_writel(cdns, CDNS_MCP_SLAVE_INTMASK0, slave_intmask0);
1066 cdns_writel(cdns, CDNS_MCP_SLAVE_INTMASK1, slave_intmask1);
1067 cdns_writel(cdns, CDNS_MCP_INTMASK, mask);
1073 static int cdns_allocate_pdi(struct sdw_cdns *cdns,
1083 pdi = devm_kcalloc(cdns->dev, num, sizeof(*pdi), GFP_KERNEL);
1098 * @cdns: Cadence instance
1101 int sdw_cdns_pdi_init(struct sdw_cdns *cdns,
1108 cdns->pcm.num_bd = config.pcm_bd;
1109 cdns->pcm.num_in = config.pcm_in;
1110 cdns->pcm.num_out = config.pcm_out;
1111 cdns->pdm.num_bd = config.pdm_bd;
1112 cdns->pdm.num_in = config.pdm_in;
1113 cdns->pdm.num_out = config.pdm_out;
1116 stream = &cdns->pcm;
1121 ret = cdns_allocate_pdi(cdns, &stream->bd,
1128 ret = cdns_allocate_pdi(cdns, &stream->in,
1135 ret = cdns_allocate_pdi(cdns, &stream->out,
1142 cdns->num_ports = stream->num_pdi;
1145 stream = &cdns->pdm;
1146 ret = cdns_allocate_pdi(cdns, &stream->bd,
1153 ret = cdns_allocate_pdi(cdns, &stream->in,
1160 ret = cdns_allocate_pdi(cdns, &stream->out,
1168 cdns->num_ports += stream->num_pdi;
1189 static void cdns_init_clock_ctrl(struct sdw_cdns *cdns)
1191 struct sdw_bus *bus = &cdns->bus;
1200 cdns_updatel(cdns, CDNS_MCP_CLK_CTRL0,
1202 cdns_updatel(cdns, CDNS_MCP_CLK_CTRL1,
1211 cdns_writel(cdns, CDNS_MCP_FRAME_SHAPE_INIT, val);
1215 cdns_writel(cdns, CDNS_MCP_SSP_CTRL0, ssp_interval);
1216 cdns_writel(cdns, CDNS_MCP_SSP_CTRL1, ssp_interval);
1221 * @cdns: Cadence instance
1223 int sdw_cdns_init(struct sdw_cdns *cdns)
1227 cdns_init_clock_ctrl(cdns);
1230 cdns->msg_count = cdns_readl(cdns, CDNS_MCP_FIFOLEVEL);
1233 cdns_updatel(cdns, CDNS_MCP_CONTROL, CDNS_MCP_CONTROL_CMD_RST,
1237 cdns_updatel(cdns, CDNS_MCP_CONTROL, CDNS_MCP_CONTROL_CMD_ACCEPT,
1241 val = cdns_readl(cdns, CDNS_MCP_CONFIG);
1256 if (cdns->bus.multi_link)
1264 cdns_writel(cdns, CDNS_MCP_CONFIG, val);
1274 struct sdw_cdns *cdns = bus_to_cdns(bus);
1279 dev_err(cdns->dev, "NULL curr_dr_freq\n");
1292 cdns_updatel(cdns, mcp_clkctrl_off, CDNS_MCP_CLK_MCLKD_MASK, divider);
1301 struct sdw_cdns *cdns = bus_to_cdns(bus);
1309 dpn_config = cdns_readl(cdns, dpn_config_off);
1315 cdns_writel(cdns, dpn_config_off, dpn_config);
1324 struct sdw_cdns *cdns = bus_to_cdns(bus);
1348 dpn_config = cdns_readl(cdns, dpn_config_off);
1351 cdns_writel(cdns, dpn_config_off, dpn_config);
1355 cdns_writel(cdns, dpn_offsetctrl_off, dpn_offsetctrl);
1361 cdns_writel(cdns, dpn_hctrl_off, dpn_hctrl);
1362 cdns_writel(cdns, dpn_samplectrl_off, (t_params->sample_interval - 1));
1370 struct sdw_cdns *cdns = bus_to_cdns(bus);
1379 cdns_writel(cdns, dpn_chnen_off, ch_mask);
1393 * @cdns: Cadence instance
1395 bool sdw_cdns_is_clock_stop(struct sdw_cdns *cdns)
1397 return !!(cdns_readl(cdns, CDNS_MCP_STAT) & CDNS_MCP_STAT_CLK_STOP);
1404 * @cdns: Cadence instance
1407 int sdw_cdns_clock_stop(struct sdw_cdns *cdns, bool block_wake)
1414 if (sdw_cdns_is_clock_stop(cdns)) {
1415 dev_dbg(cdns->dev, "Clock is already stopped\n");
1424 cdns_enable_slave_interrupts(cdns, false);
1432 cdns_updatel(cdns, CDNS_MCP_CONTROL,
1436 list_for_each_entry(slave, &cdns->bus.slaves, node) {
1451 cdns_updatel(cdns, CDNS_MCP_CONTROL,
1455 cdns_updatel(cdns, CDNS_MCP_CONTROL,
1459 ret = cdns_config_update(cdns);
1461 dev_err(cdns->dev, "%s: config_update failed\n", __func__);
1467 ret = sdw_bus_prep_clk_stop(&cdns->bus);
1469 dev_err(cdns->dev, "prepare clock stop failed %d\n", ret);
1478 ret = sdw_bus_clk_stop(&cdns->bus);
1480 dev_err(cdns->dev, "bus clock stop failed %d", ret);
1484 ret = cdns_set_wait(cdns, CDNS_MCP_STAT,
1488 dev_err(cdns->dev, "Clock stop failed %d\n", ret);
1497 * @cdns: Cadence instance
1501 int sdw_cdns_clock_restart(struct sdw_cdns *cdns, bool bus_reset)
1506 cdns_enable_slave_interrupts(cdns, true);
1508 ret = cdns_clear_bit(cdns, CDNS_MCP_CONTROL,
1511 dev_err(cdns->dev, "Couldn't exit from clock stop\n");
1515 ret = cdns_set_wait(cdns, CDNS_MCP_STAT, CDNS_MCP_STAT_CLK_STOP, 0);
1517 dev_err(cdns->dev, "clock stop exit failed %d\n", ret);
1521 cdns_updatel(cdns, CDNS_MCP_CONTROL,
1528 cdns_updatel(cdns, CDNS_MCP_CONTROL, CDNS_MCP_CONTROL_CMD_ACCEPT, 0);
1533 cdns_updatel(cdns, CDNS_MCP_CONFIG,
1537 ret = cdns_config_update(cdns);
1539 dev_err(cdns->dev, "%s: config_update failed\n", __func__);
1543 ret = sdw_bus_exit_clk_stop(&cdns->bus);
1545 dev_err(cdns->dev, "bus failed to exit clock stop %d\n", ret);
1554 * @cdns: Cadence instance
1556 int sdw_cdns_probe(struct sdw_cdns *cdns)
1558 init_completion(&cdns->tx_complete);
1559 cdns->bus.port_ops = &cdns_port_ops;
1561 INIT_WORK(&cdns->work, cdns_update_slave_status_work);
1569 struct sdw_cdns *cdns = snd_soc_dai_get_drvdata(dai);
1596 dma->bus = &cdns->bus;
1597 dma->link_id = cdns->instance;
1622 * @cdns: Cadence instance
1631 static struct sdw_cdns_pdi *cdns_find_pdi(struct sdw_cdns *cdns,
1649 * @cdns: Cadence instance
1654 void sdw_cdns_config_stream(struct sdw_cdns *cdns,
1662 if (cdns->bus.params.m_data_mode != SDW_PORT_DATA_MODE_NORMAL)
1666 cdns_updatel(cdns, offset,
1673 cdns_writel(cdns, CDNS_PDI_CONFIG(pdi->num), val);
1680 * @cdns: Cadence instance
1686 struct sdw_cdns_pdi *sdw_cdns_alloc_pdi(struct sdw_cdns *cdns,
1693 pdi = cdns_find_pdi(cdns, 0, stream->num_in, stream->in,
1696 pdi = cdns_find_pdi(cdns, 0, stream->num_out, stream->out,
1701 pdi = cdns_find_pdi(cdns, 2, stream->num_bd, stream->bd,