Lines Matching refs:cdns

194 static inline u32 cdns_readl(struct sdw_cdns *cdns, int offset)  in cdns_readl()  argument
196 return readl(cdns->registers + offset); in cdns_readl()
199 static inline void cdns_writel(struct sdw_cdns *cdns, int offset, u32 value) in cdns_writel() argument
201 writel(value, cdns->registers + offset); in cdns_writel()
204 static inline void cdns_updatel(struct sdw_cdns *cdns, in cdns_updatel() argument
209 tmp = cdns_readl(cdns, offset); in cdns_updatel()
211 cdns_writel(cdns, offset, tmp); in cdns_updatel()
214 static int cdns_clear_bit(struct sdw_cdns *cdns, int offset, u32 value) in cdns_clear_bit() argument
219 writel(value, cdns->registers + offset); in cdns_clear_bit()
223 reg_read = readl(cdns->registers + offset); in cdns_clear_bit()
241 static ssize_t cdns_sprintf(struct sdw_cdns *cdns, in cdns_sprintf() argument
245 "%4x\t%8x\n", reg, cdns_readl(cdns, reg)); in cdns_sprintf()
250 struct sdw_cdns *cdns = s->private; in cdns_reg_show() local
264 ret += cdns_sprintf(cdns, buf, ret, i); in cdns_reg_show()
270 ret += cdns_sprintf(cdns, buf, ret, i); in cdns_reg_show()
274 ret += cdns_sprintf(cdns, buf, ret, CDNS_MCP_SSP_CTRL0); in cdns_reg_show()
275 ret += cdns_sprintf(cdns, buf, ret, CDNS_MCP_SSP_CTRL1); in cdns_reg_show()
276 ret += cdns_sprintf(cdns, buf, ret, CDNS_MCP_CLK_CTRL0); in cdns_reg_show()
277 ret += cdns_sprintf(cdns, buf, ret, CDNS_MCP_CLK_CTRL1); in cdns_reg_show()
286 num_ports = cdns->num_ports + CDNS_PCM_PDI_OFFSET; in cdns_reg_show()
293 ret += cdns_sprintf(cdns, buf, ret, j); in cdns_reg_show()
304 ret += cdns_sprintf(cdns, buf, ret, j); in cdns_reg_show()
310 ret += cdns_sprintf(cdns, buf, ret, in cdns_reg_show()
318 ret += cdns_sprintf(cdns, buf, ret, CDNS_PDI_CONFIG(i)); in cdns_reg_show()
332 void sdw_cdns_debugfs_init(struct sdw_cdns *cdns, struct dentry *root) in sdw_cdns_debugfs_init() argument
334 debugfs_create_file("cdns-registers", 0400, root, cdns, &cdns_reg_fops); in sdw_cdns_debugfs_init()
344 cdns_fill_msg_resp(struct sdw_cdns *cdns, in cdns_fill_msg_resp() argument
352 if (!(cdns->response_buf[i] & CDNS_MCP_RESP_ACK)) { in cdns_fill_msg_resp()
354 dev_dbg_ratelimited(cdns->dev, "Msg Ack not received\n"); in cdns_fill_msg_resp()
355 if (cdns->response_buf[i] & CDNS_MCP_RESP_NACK) { in cdns_fill_msg_resp()
357 dev_err_ratelimited(cdns->dev, "Msg NACK received\n"); in cdns_fill_msg_resp()
363 dev_err_ratelimited(cdns->dev, "Msg NACKed for Slave %d\n", msg->dev_num); in cdns_fill_msg_resp()
366 dev_dbg_ratelimited(cdns->dev, "Msg ignored for Slave %d\n", msg->dev_num); in cdns_fill_msg_resp()
372 msg->buf[i + offset] = cdns->response_buf[i] >> in cdns_fill_msg_resp()
379 _cdns_xfer_msg(struct sdw_cdns *cdns, struct sdw_msg *msg, int cmd, in _cdns_xfer_msg() argument
387 if (cdns->msg_count != count) { in _cdns_xfer_msg()
388 cdns_writel(cdns, CDNS_MCP_FIFOLEVEL, count); in _cdns_xfer_msg()
389 cdns->msg_count = count; in _cdns_xfer_msg()
404 cdns_writel(cdns, base, data); in _cdns_xfer_msg()
412 time = wait_for_completion_timeout(&cdns->tx_complete, in _cdns_xfer_msg()
415 dev_err(cdns->dev, "IO transfer timed out\n"); in _cdns_xfer_msg()
420 return cdns_fill_msg_resp(cdns, msg, count, offset); in _cdns_xfer_msg()
424 cdns_program_scp_addr(struct sdw_cdns *cdns, struct sdw_msg *msg) in cdns_program_scp_addr() argument
432 if (cdns->msg_count != CDNS_SCP_RX_FIFOLEVEL) { in cdns_program_scp_addr()
433 cdns_writel(cdns, CDNS_MCP_FIFOLEVEL, CDNS_SCP_RX_FIFOLEVEL); in cdns_program_scp_addr()
434 cdns->msg_count = CDNS_SCP_RX_FIFOLEVEL; in cdns_program_scp_addr()
448 cdns_writel(cdns, base, data[0]); in cdns_program_scp_addr()
450 cdns_writel(cdns, base, data[1]); in cdns_program_scp_addr()
452 time = wait_for_completion_timeout(&cdns->tx_complete, in cdns_program_scp_addr()
455 dev_err(cdns->dev, "SCP Msg trf timed out\n"); in cdns_program_scp_addr()
462 if (!(cdns->response_buf[i] & CDNS_MCP_RESP_ACK)) { in cdns_program_scp_addr()
464 dev_err(cdns->dev, "Program SCP Ack not received\n"); in cdns_program_scp_addr()
465 if (cdns->response_buf[i] & CDNS_MCP_RESP_NACK) { in cdns_program_scp_addr()
467 dev_err(cdns->dev, "Program SCP NACK received\n"); in cdns_program_scp_addr()
474 dev_err_ratelimited(cdns->dev, in cdns_program_scp_addr()
478 dev_dbg_ratelimited(cdns->dev, in cdns_program_scp_addr()
486 static int cdns_prep_msg(struct sdw_cdns *cdns, struct sdw_msg *msg, int *cmd) in cdns_prep_msg() argument
491 ret = cdns_program_scp_addr(cdns, msg); in cdns_prep_msg()
508 dev_err(cdns->dev, "Invalid msg cmd: %d\n", msg->flags); in cdns_prep_msg()
518 struct sdw_cdns *cdns = bus_to_cdns(bus); in cdns_xfer_msg() local
521 ret = cdns_prep_msg(cdns, msg, &cmd); in cdns_xfer_msg()
526 ret = _cdns_xfer_msg(cdns, msg, cmd, i * CDNS_MCP_CMD_LEN, in cdns_xfer_msg()
535 ret = _cdns_xfer_msg(cdns, msg, cmd, i * CDNS_MCP_CMD_LEN, in cdns_xfer_msg()
547 struct sdw_cdns *cdns = bus_to_cdns(bus); in cdns_xfer_msg_defer() local
554 ret = cdns_prep_msg(cdns, msg, &cmd); in cdns_xfer_msg_defer()
558 cdns->defer = defer; in cdns_xfer_msg_defer()
559 cdns->defer->length = msg->len; in cdns_xfer_msg_defer()
561 return _cdns_xfer_msg(cdns, msg, cmd, 0, msg->len, true); in cdns_xfer_msg_defer()
568 struct sdw_cdns *cdns = bus_to_cdns(bus); in cdns_reset_page_addr() local
575 return cdns_program_scp_addr(cdns, &msg); in cdns_reset_page_addr()
583 static void cdns_read_response(struct sdw_cdns *cdns) in cdns_read_response() argument
588 num_resp = cdns_readl(cdns, CDNS_MCP_FIFOSTAT); in cdns_read_response()
594 cdns->response_buf[i] = cdns_readl(cdns, cmd_base); in cdns_read_response()
599 static int cdns_update_slave_status(struct sdw_cdns *cdns, in cdns_update_slave_status() argument
643 dev_warn_ratelimited(cdns->dev, in cdns_update_slave_status()
654 return sdw_handle_slave_status(&cdns->bus, status); in cdns_update_slave_status()
666 struct sdw_cdns *cdns = dev_id; in sdw_cdns_irq() local
671 if (!cdns->link_up) in sdw_cdns_irq()
674 int_status = cdns_readl(cdns, CDNS_MCP_INTSTAT); in sdw_cdns_irq()
680 cdns_read_response(cdns); in sdw_cdns_irq()
682 if (cdns->defer) { in sdw_cdns_irq()
683 cdns_fill_msg_resp(cdns, cdns->defer->msg, in sdw_cdns_irq()
684 cdns->defer->length, 0); in sdw_cdns_irq()
685 complete(&cdns->defer->complete); in sdw_cdns_irq()
686 cdns->defer = NULL; in sdw_cdns_irq()
688 complete(&cdns->tx_complete); in sdw_cdns_irq()
694 dev_err_ratelimited(cdns->dev, "Parity error\n"); in sdw_cdns_irq()
699 dev_err_ratelimited(cdns->dev, "Bus clash for control word\n"); in sdw_cdns_irq()
707 dev_err_ratelimited(cdns->dev, "Bus clash for data word\n"); in sdw_cdns_irq()
712 cdns_updatel(cdns, CDNS_MCP_INTMASK, in sdw_cdns_irq()
719 cdns_writel(cdns, CDNS_MCP_INTSTAT, int_status); in sdw_cdns_irq()
731 struct sdw_cdns *cdns = dev_id; in sdw_cdns_thread() local
734 dev_dbg_ratelimited(cdns->dev, "Slave status change\n"); in sdw_cdns_thread()
736 slave0 = cdns_readl(cdns, CDNS_MCP_SLAVE_INTSTAT0); in sdw_cdns_thread()
737 slave1 = cdns_readl(cdns, CDNS_MCP_SLAVE_INTSTAT1); in sdw_cdns_thread()
739 cdns_update_slave_status(cdns, slave0, slave1); in sdw_cdns_thread()
740 cdns_writel(cdns, CDNS_MCP_SLAVE_INTSTAT0, slave0); in sdw_cdns_thread()
741 cdns_writel(cdns, CDNS_MCP_SLAVE_INTSTAT1, slave1); in sdw_cdns_thread()
744 cdns_writel(cdns, CDNS_MCP_INTSTAT, CDNS_MCP_INT_SLAVE_MASK); in sdw_cdns_thread()
745 cdns_updatel(cdns, CDNS_MCP_INTMASK, in sdw_cdns_thread()
755 static int _cdns_enable_interrupt(struct sdw_cdns *cdns) in _cdns_enable_interrupt() argument
759 cdns_writel(cdns, CDNS_MCP_SLAVE_INTMASK0, in _cdns_enable_interrupt()
761 cdns_writel(cdns, CDNS_MCP_SLAVE_INTMASK1, in _cdns_enable_interrupt()
785 cdns_writel(cdns, CDNS_MCP_INTMASK, mask); in _cdns_enable_interrupt()
794 int sdw_cdns_enable_interrupt(struct sdw_cdns *cdns) in sdw_cdns_enable_interrupt() argument
798 _cdns_enable_interrupt(cdns); in sdw_cdns_enable_interrupt()
799 ret = cdns_clear_bit(cdns, CDNS_MCP_CONFIG_UPDATE, in sdw_cdns_enable_interrupt()
802 dev_err(cdns->dev, "Config update timedout\n"); in sdw_cdns_enable_interrupt()
808 static int cdns_allocate_pdi(struct sdw_cdns *cdns, in cdns_allocate_pdi() argument
818 pdi = devm_kcalloc(cdns->dev, num, sizeof(*pdi), GFP_KERNEL); in cdns_allocate_pdi()
837 int sdw_cdns_pdi_init(struct sdw_cdns *cdns, in sdw_cdns_pdi_init() argument
843 cdns->pcm.num_bd = config.pcm_bd; in sdw_cdns_pdi_init()
844 cdns->pcm.num_in = config.pcm_in; in sdw_cdns_pdi_init()
845 cdns->pcm.num_out = config.pcm_out; in sdw_cdns_pdi_init()
846 cdns->pdm.num_bd = config.pdm_bd; in sdw_cdns_pdi_init()
847 cdns->pdm.num_in = config.pdm_in; in sdw_cdns_pdi_init()
848 cdns->pdm.num_out = config.pdm_out; in sdw_cdns_pdi_init()
851 stream = &cdns->pcm; in sdw_cdns_pdi_init()
859 ret = cdns_allocate_pdi(cdns, &stream->bd, in sdw_cdns_pdi_init()
866 ret = cdns_allocate_pdi(cdns, &stream->in, in sdw_cdns_pdi_init()
873 ret = cdns_allocate_pdi(cdns, &stream->out, in sdw_cdns_pdi_init()
880 cdns->num_ports = stream->num_pdi; in sdw_cdns_pdi_init()
883 stream = &cdns->pdm; in sdw_cdns_pdi_init()
885 ret = cdns_allocate_pdi(cdns, &stream->bd, in sdw_cdns_pdi_init()
892 ret = cdns_allocate_pdi(cdns, &stream->in, in sdw_cdns_pdi_init()
899 ret = cdns_allocate_pdi(cdns, &stream->out, in sdw_cdns_pdi_init()
906 cdns->num_ports += stream->num_pdi; in sdw_cdns_pdi_init()
908 cdns->ports = devm_kcalloc(cdns->dev, cdns->num_ports, in sdw_cdns_pdi_init()
909 sizeof(*cdns->ports), GFP_KERNEL); in sdw_cdns_pdi_init()
910 if (!cdns->ports) { in sdw_cdns_pdi_init()
915 for (i = 0; i < cdns->num_ports; i++) { in sdw_cdns_pdi_init()
916 cdns->ports[i].assigned = false; in sdw_cdns_pdi_init()
917 cdns->ports[i].num = i + 1; /* Port 0 reserved for bulk */ in sdw_cdns_pdi_init()
942 int sdw_cdns_init(struct sdw_cdns *cdns) in sdw_cdns_init() argument
944 struct sdw_bus *bus = &cdns->bus; in sdw_cdns_init()
951 ret = cdns_clear_bit(cdns, CDNS_MCP_CONTROL, in sdw_cdns_init()
954 dev_err(cdns->dev, "Couldn't exit from clock stop\n"); in sdw_cdns_init()
961 cdns_updatel(cdns, CDNS_MCP_CLK_CTRL0, in sdw_cdns_init()
963 cdns_updatel(cdns, CDNS_MCP_CLK_CTRL1, in sdw_cdns_init()
972 cdns_writel(cdns, CDNS_MCP_FRAME_SHAPE_INIT, val); in sdw_cdns_init()
975 cdns_writel(cdns, CDNS_MCP_SSP_CTRL0, CDNS_DEFAULT_SSP_INTERVAL); in sdw_cdns_init()
976 cdns_writel(cdns, CDNS_MCP_SSP_CTRL1, CDNS_DEFAULT_SSP_INTERVAL); in sdw_cdns_init()
979 cdns_updatel(cdns, CDNS_MCP_CONTROL, CDNS_MCP_CONTROL_CMD_ACCEPT, in sdw_cdns_init()
983 val = cdns_readl(cdns, CDNS_MCP_CONFIG); in sdw_cdns_init()
1004 cdns_writel(cdns, CDNS_MCP_CONFIG, val); in sdw_cdns_init()
1013 struct sdw_cdns *cdns = bus_to_cdns(bus); in cdns_bus_conf() local
1018 dev_err(cdns->dev, "NULL curr_dr_freq\n"); in cdns_bus_conf()
1031 cdns_updatel(cdns, mcp_clkctrl_off, CDNS_MCP_CLK_MCLKD_MASK, divider); in cdns_bus_conf()
1040 struct sdw_cdns *cdns = bus_to_cdns(bus); in cdns_port_params() local
1048 dpn_config = cdns_readl(cdns, dpn_config_off); in cdns_port_params()
1057 cdns_writel(cdns, dpn_config_off, dpn_config); in cdns_port_params()
1066 struct sdw_cdns *cdns = bus_to_cdns(bus); in cdns_transport_params() local
1090 dpn_config = cdns_readl(cdns, dpn_config_off); in cdns_transport_params()
1096 cdns_writel(cdns, dpn_config_off, dpn_config); in cdns_transport_params()
1102 cdns_writel(cdns, dpn_offsetctrl_off, dpn_offsetctrl); in cdns_transport_params()
1110 cdns_writel(cdns, dpn_hctrl_off, dpn_hctrl); in cdns_transport_params()
1111 cdns_writel(cdns, dpn_samplectrl_off, (t_params->sample_interval - 1)); in cdns_transport_params()
1119 struct sdw_cdns *cdns = bus_to_cdns(bus); in cdns_port_enable() local
1128 cdns_writel(cdns, dpn_chnen_off, ch_mask); in cdns_port_enable()
1143 int sdw_cdns_probe(struct sdw_cdns *cdns) in sdw_cdns_probe() argument
1145 init_completion(&cdns->tx_complete); in sdw_cdns_probe()
1146 cdns->bus.port_ops = &cdns_port_ops; in sdw_cdns_probe()
1155 struct sdw_cdns *cdns = snd_soc_dai_get_drvdata(dai); in cdns_set_sdw_stream() local
1167 dma->bus = &cdns->bus; in cdns_set_sdw_stream()
1168 dma->link_id = cdns->instance; in cdns_set_sdw_stream()
1190 static struct sdw_cdns_pdi *cdns_find_pdi(struct sdw_cdns *cdns, in cdns_find_pdi() argument
1215 void sdw_cdns_config_stream(struct sdw_cdns *cdns, in sdw_cdns_config_stream() argument
1225 cdns_updatel(cdns, offset, CDNS_PORTCTRL_DIRN, val); in sdw_cdns_config_stream()
1229 cdns_writel(cdns, CDNS_PDI_CONFIG(pdi->num), val); in sdw_cdns_config_stream()
1241 static int cdns_get_num_pdi(struct sdw_cdns *cdns, in cdns_get_num_pdi() argument
1276 int sdw_cdns_get_stream(struct sdw_cdns *cdns, in sdw_cdns_get_stream() argument
1283 pdis = cdns_get_num_pdi(cdns, stream->in, stream->num_in, ch); in sdw_cdns_get_stream()
1285 pdis = cdns_get_num_pdi(cdns, stream->out, stream->num_out, ch); in sdw_cdns_get_stream()
1289 pdis = cdns_get_num_pdi(cdns, stream->bd, stream->num_bd, ch); in sdw_cdns_get_stream()
1304 int sdw_cdns_alloc_stream(struct sdw_cdns *cdns, in sdw_cdns_alloc_stream() argument
1311 pdi = cdns_find_pdi(cdns, stream->num_in, stream->in); in sdw_cdns_alloc_stream()
1313 pdi = cdns_find_pdi(cdns, stream->num_out, stream->out); in sdw_cdns_alloc_stream()
1317 pdi = cdns_find_pdi(cdns, stream->num_bd, stream->bd); in sdw_cdns_alloc_stream()