Lines Matching full:i3c
3 * Renesas I3C Controller driver
16 #include <linux/i3c/master.h>
318 static int renesas_i3c_get_free_pos(struct renesas_i3c *i3c) in renesas_i3c_get_free_pos() argument
320 if (!(i3c->free_pos & GENMASK(i3c->maxdevs - 1, 0))) in renesas_i3c_get_free_pos()
323 return ffs(i3c->free_pos) - 1; in renesas_i3c_get_free_pos()
326 static int renesas_i3c_get_addr_pos(struct renesas_i3c *i3c, u8 addr) in renesas_i3c_get_addr_pos() argument
330 for (pos = 0; pos < i3c->maxdevs; pos++) { in renesas_i3c_get_addr_pos()
331 if (addr == i3c->addrs[pos]) in renesas_i3c_get_addr_pos()
338 static struct renesas_i3c_xfer *renesas_i3c_alloc_xfer(struct renesas_i3c *i3c, in renesas_i3c_alloc_xfer() argument
354 static void renesas_i3c_start_xfer_locked(struct renesas_i3c *i3c) in renesas_i3c_start_xfer_locked() argument
356 struct renesas_i3c_xfer *xfer = i3c->xferqueue.cur; in renesas_i3c_start_xfer_locked()
365 switch (i3c->internal_state) { in renesas_i3c_start_xfer_locked()
368 renesas_set_bit(i3c->regs, NTIE, NTIE_RSPQFIE); in renesas_i3c_start_xfer_locked()
369 renesas_writel(i3c->regs, NCMDQP, cmd->cmd0); in renesas_i3c_start_xfer_locked()
370 renesas_writel(i3c->regs, NCMDQP, 0); in renesas_i3c_start_xfer_locked()
374 renesas_set_bit(i3c->regs, NTIE, NTIE_RSPQFIE); in renesas_i3c_start_xfer_locked()
383 renesas_writel(i3c->regs, NCMDQP, cmd->cmd0); in renesas_i3c_start_xfer_locked()
384 renesas_writel(i3c->regs, NCMDQP, cmd1); in renesas_i3c_start_xfer_locked()
388 renesas_set_bit(i3c->regs, NTIE, NTIE_RDBFIE0); in renesas_i3c_start_xfer_locked()
390 renesas_writel(i3c->regs, NCMDQP, cmd->cmd0); in renesas_i3c_start_xfer_locked()
391 renesas_writel(i3c->regs, NCMDQP, cmd1); in renesas_i3c_start_xfer_locked()
398 renesas_clear_bit(i3c->regs, NTST, NTST_CMDQEF); in renesas_i3c_start_xfer_locked()
401 static void renesas_i3c_dequeue_xfer_locked(struct renesas_i3c *i3c, in renesas_i3c_dequeue_xfer_locked() argument
404 if (i3c->xferqueue.cur == xfer) in renesas_i3c_dequeue_xfer_locked()
405 i3c->xferqueue.cur = NULL; in renesas_i3c_dequeue_xfer_locked()
410 static void renesas_i3c_dequeue_xfer(struct renesas_i3c *i3c, struct renesas_i3c_xfer *xfer) in renesas_i3c_dequeue_xfer() argument
412 scoped_guard(spinlock_irqsave, &i3c->xferqueue.lock) in renesas_i3c_dequeue_xfer()
413 renesas_i3c_dequeue_xfer_locked(i3c, xfer); in renesas_i3c_dequeue_xfer()
416 static void renesas_i3c_enqueue_xfer(struct renesas_i3c *i3c, struct renesas_i3c_xfer *xfer) in renesas_i3c_enqueue_xfer() argument
419 scoped_guard(spinlock_irqsave, &i3c->xferqueue.lock) { in renesas_i3c_enqueue_xfer()
420 if (i3c->xferqueue.cur) { in renesas_i3c_enqueue_xfer()
421 list_add_tail(&xfer->node, &i3c->xferqueue.list); in renesas_i3c_enqueue_xfer()
423 i3c->xferqueue.cur = xfer; in renesas_i3c_enqueue_xfer()
425 renesas_i3c_start_xfer_locked(i3c); in renesas_i3c_enqueue_xfer()
430 static void renesas_i3c_wait_xfer(struct renesas_i3c *i3c, struct renesas_i3c_xfer *xfer) in renesas_i3c_wait_xfer() argument
434 renesas_i3c_enqueue_xfer(i3c, xfer); in renesas_i3c_wait_xfer()
438 renesas_i3c_dequeue_xfer(i3c, xfer); in renesas_i3c_wait_xfer()
441 static void renesas_i3c_set_prts(struct renesas_i3c *i3c, u32 val) in renesas_i3c_set_prts() argument
444 renesas_set_bit(i3c->regs, RSTCTL, RSTCTL_INTLRST); in renesas_i3c_set_prts()
445 renesas_writel(i3c->regs, PRTS, val); in renesas_i3c_set_prts()
446 renesas_clear_bit(i3c->regs, RSTCTL, RSTCTL_INTLRST); in renesas_i3c_set_prts()
451 struct renesas_i3c *i3c = to_renesas_i3c(m); in renesas_i3c_bus_enable() local
453 /* Setup either I3C or I2C protocol */ in renesas_i3c_bus_enable()
455 renesas_i3c_set_prts(i3c, 0); in renesas_i3c_bus_enable()
457 renesas_set_bit(i3c->regs, BCTL, BCTL_HJACKCTL | BCTL_INCBA); in renesas_i3c_bus_enable()
458 renesas_set_bit(i3c->regs, MSDVAD, MSDVAD_MDYADV); in renesas_i3c_bus_enable()
459 renesas_writel(i3c->regs, STDBR, i3c->i3c_STDBR); in renesas_i3c_bus_enable()
461 renesas_i3c_set_prts(i3c, PRTS_PRTMD); in renesas_i3c_bus_enable()
462 renesas_writel(i3c->regs, STDBR, i3c->i2c_STDBR); in renesas_i3c_bus_enable()
465 /* Enable I3C bus */ in renesas_i3c_bus_enable()
466 renesas_set_bit(i3c->regs, BCTL, BCTL_BUSE); in renesas_i3c_bus_enable()
469 static int renesas_i3c_reset(struct renesas_i3c *i3c) in renesas_i3c_reset() argument
473 renesas_writel(i3c->regs, BCTL, 0); in renesas_i3c_reset()
474 renesas_set_bit(i3c->regs, RSTCTL, RSTCTL_RI3CRST); in renesas_i3c_reset()
477 0, 1000, false, i3c->regs, RSTCTL); in renesas_i3c_reset()
482 struct renesas_i3c *i3c = to_renesas_i3c(m); in renesas_i3c_bus_init() local
492 rate = clk_get_rate(i3c->tclk); in renesas_i3c_bus_init()
496 ret = renesas_i3c_reset(i3c); in renesas_i3c_bus_init()
501 i3c_total_ticks = DIV_ROUND_UP(rate, bus->scl_rate.i3c); in renesas_i3c_bus_init()
527 dev_err(&m->dev, "invalid speed (i2c-scl = %lu Hz, i3c-scl = %lu Hz). Too slow.\n", in renesas_i3c_bus_init()
528 (unsigned long)bus->scl_rate.i2c, (unsigned long)bus->scl_rate.i3c); in renesas_i3c_bus_init()
537 i3c->i3c_STDBR = (double_SBR ? STDBR_DSBRPO : 0) | in renesas_i3c_bus_init()
545 i3c->i2c_STDBR = (double_SBR ? STDBR_DSBRPO : 0) | in renesas_i3c_bus_init()
550 renesas_writel(i3c->regs, STDBR, i3c->i3c_STDBR); in renesas_i3c_bus_init()
553 renesas_writel(i3c->regs, EXTBR, EXTBR_EBRLO(od_low_ticks) | in renesas_i3c_bus_init()
558 renesas_writel(i3c->regs, REFCKCTL, REFCKCTL_IREFCKS(cks)); in renesas_i3c_bus_init()
561 renesas_writel(i3c->regs, SVCTL, 0); in renesas_i3c_bus_init()
564 renesas_writel(i3c->regs, NQTHCTL, NQTHCTL_IBIDSSZ(6) | in renesas_i3c_bus_init()
568 renesas_writel(i3c->regs, NTBTHCTL0, 0); in renesas_i3c_bus_init()
570 renesas_writel(i3c->regs, NRQTHCTL, 0); in renesas_i3c_bus_init()
573 renesas_writel(i3c->regs, BSTE, BSTE_ALL_FLAG); in renesas_i3c_bus_init()
574 renesas_writel(i3c->regs, NTSTE, NTSTE_ALL_FLAG); in renesas_i3c_bus_init()
577 renesas_writel(i3c->regs, BIE, BIE_NACKDIE | BIE_TENDIE); in renesas_i3c_bus_init()
578 renesas_writel(i3c->regs, NTIE, 0); in renesas_i3c_bus_init()
581 renesas_writel(i3c->regs, NTST, 0); in renesas_i3c_bus_init()
582 renesas_writel(i3c->regs, INST, 0); in renesas_i3c_bus_init()
583 renesas_writel(i3c->regs, BST, 0); in renesas_i3c_bus_init()
586 renesas_set_bit(i3c->regs, BCTL, BCTL_HJACKCTL); in renesas_i3c_bus_init()
588 renesas_writel(i3c->regs, IBINCTL, IBINCTL_NRHJCTL | IBINCTL_NRMRCTL | in renesas_i3c_bus_init()
591 renesas_writel(i3c->regs, SCSTLCTL, 0); in renesas_i3c_bus_init()
592 renesas_set_bit(i3c->regs, SCSTRCTL, SCSTRCTL_ACKTWE); in renesas_i3c_bus_init()
596 renesas_writel(i3c->regs, BFRECDT, BFRECDT_FRECYC(val)); in renesas_i3c_bus_init()
599 renesas_writel(i3c->regs, BAVLCDT, BAVLCDT_AVLCYC(val)); in renesas_i3c_bus_init()
602 renesas_writel(i3c->regs, BIDLCDT, BIDLCDT_IDLCYC(val)); in renesas_i3c_bus_init()
608 renesas_writel(i3c->regs, MSDVAD, MSDVAD_MDYAD(ret) | MSDVAD_MDYADV); in renesas_i3c_bus_init()
612 return i3c_master_set_info(&i3c->base, &info); in renesas_i3c_bus_init()
617 struct renesas_i3c *i3c = to_renesas_i3c(m); in renesas_i3c_bus_cleanup() local
619 renesas_i3c_reset(i3c); in renesas_i3c_bus_cleanup()
624 struct renesas_i3c *i3c = to_renesas_i3c(m); in renesas_i3c_daa() local
630 struct renesas_i3c_xfer *xfer __free(kfree) = renesas_i3c_alloc_xfer(i3c, 1); in renesas_i3c_daa()
634 /* Enable I3C bus. */ in renesas_i3c_daa()
637 olddevs = ~(i3c->free_pos); in renesas_i3c_daa()
638 i3c->internal_state = I3C_INTERNAL_STATE_CONTROLLER_ENTDAA; in renesas_i3c_daa()
641 for (pos = 0; pos < i3c->maxdevs; pos++) { in renesas_i3c_daa()
649 i3c->addrs[pos] = ret; in renesas_i3c_daa()
652 renesas_writel(i3c->regs, DATBAS(pos), datbas_dvdyad_with_parity(ret)); in renesas_i3c_daa()
659 ret = renesas_i3c_get_free_pos(i3c); in renesas_i3c_daa()
670 NCMDQP_DEV_COUNT(i3c->maxdevs - ret) | NCMDQP_TOC; in renesas_i3c_daa()
672 renesas_i3c_wait_xfer(i3c, xfer); in renesas_i3c_daa()
674 newdevs = GENMASK(i3c->maxdevs - cmd->rx_count - 1, 0); in renesas_i3c_daa()
677 for (pos = 0; pos < i3c->maxdevs; pos++) { in renesas_i3c_daa()
679 i3c_master_add_i3c_dev_locked(m, i3c->addrs[pos]); in renesas_i3c_daa()
732 struct renesas_i3c *i3c = to_renesas_i3c(m); in renesas_i3c_send_ccc_cmd() local
738 pos = renesas_i3c_get_addr_pos(i3c, ccc->dests[0].addr); in renesas_i3c_send_ccc_cmd()
743 xfer = renesas_i3c_alloc_xfer(i3c, 1); in renesas_i3c_send_ccc_cmd()
757 renesas_writel(i3c->regs, DATBAS(pos), in renesas_i3c_send_ccc_cmd()
764 i3c->internal_state = I3C_INTERNAL_STATE_CONTROLLER_SETDASA; in renesas_i3c_send_ccc_cmd()
777 i3c->internal_state = I3C_INTERNAL_STATE_CONTROLLER_COMMAND_READ; in renesas_i3c_send_ccc_cmd()
782 i3c->internal_state = I3C_INTERNAL_STATE_CONTROLLER_COMMAND_WRITE; in renesas_i3c_send_ccc_cmd()
786 renesas_i3c_wait_xfer(i3c, xfer); in renesas_i3c_send_ccc_cmd()
801 struct renesas_i3c *i3c = to_renesas_i3c(m); in renesas_i3c_i3c_xfers() local
806 /* Enable I3C bus. */ in renesas_i3c_i3c_xfers()
809 xfer = renesas_i3c_alloc_xfer(i3c, 1); in renesas_i3c_i3c_xfers()
828 i3c->internal_state = I3C_INTERNAL_STATE_CONTROLLER_READ; in renesas_i3c_i3c_xfers()
834 i3c->internal_state = I3C_INTERNAL_STATE_CONTROLLER_WRITE; in renesas_i3c_i3c_xfers()
838 i3c_writel_fifo(i3c->regs + NTDTBP0, cmd->tx_buf, cmd->len); in renesas_i3c_i3c_xfers()
840 renesas_set_bit(i3c->regs, NTIE, NTIE_TDBEIE0); in renesas_i3c_i3c_xfers()
843 renesas_i3c_wait_xfer(i3c, xfer); in renesas_i3c_i3c_xfers()
852 struct renesas_i3c *i3c = to_renesas_i3c(m); in renesas_i3c_attach_i3c_dev() local
856 pos = renesas_i3c_get_free_pos(i3c); in renesas_i3c_attach_i3c_dev()
865 i3c->addrs[pos] = dev->info.dyn_addr ? : dev->info.static_addr; in renesas_i3c_attach_i3c_dev()
866 i3c->free_pos &= ~BIT(pos); in renesas_i3c_attach_i3c_dev()
868 renesas_writel(i3c->regs, DATBAS(pos), DATBAS_DVSTAD(dev->info.static_addr) | in renesas_i3c_attach_i3c_dev()
869 datbas_dvdyad_with_parity(i3c->addrs[pos])); in renesas_i3c_attach_i3c_dev()
879 struct renesas_i3c *i3c = to_renesas_i3c(m); in renesas_i3c_reattach_i3c_dev() local
882 i3c->addrs[data->index] = dev->info.dyn_addr ? dev->info.dyn_addr : in renesas_i3c_reattach_i3c_dev()
892 struct renesas_i3c *i3c = to_renesas_i3c(m); in renesas_i3c_detach_i3c_dev() local
895 i3c->addrs[data->index] = 0; in renesas_i3c_detach_i3c_dev()
896 i3c->free_pos |= BIT(data->index); in renesas_i3c_detach_i3c_dev()
905 struct renesas_i3c *i3c = to_renesas_i3c(m); in renesas_i3c_i2c_xfers() local
910 struct renesas_i3c_xfer *xfer __free(kfree) = renesas_i3c_alloc_xfer(i3c, 1); in renesas_i3c_i2c_xfers()
923 if (!(renesas_readl(i3c->regs, BCST) & BCST_BFREF)) { in renesas_i3c_i2c_xfers()
928 renesas_writel(i3c->regs, BST, 0); in renesas_i3c_i2c_xfers()
930 renesas_i3c_enqueue_xfer(i3c, xfer); in renesas_i3c_i2c_xfers()
938 renesas_set_bit(i3c->regs, BIE, BIE_NACKDIE); in renesas_i3c_i2c_xfers()
939 renesas_set_bit(i3c->regs, NTIE, NTIE_TDBEIE0); in renesas_i3c_i2c_xfers()
940 renesas_set_bit(i3c->regs, BIE, BIE_STCNDDIE); in renesas_i3c_i2c_xfers()
943 renesas_set_bit(i3c->regs, CNDCTL, start_bit); in renesas_i3c_i2c_xfers()
945 renesas_set_bit(i3c->regs, NTSTE, NTSTE_TDBEE0); in renesas_i3c_i2c_xfers()
955 renesas_i3c_dequeue_xfer(i3c, xfer); in renesas_i3c_i2c_xfers()
962 struct renesas_i3c *i3c = to_renesas_i3c(m); in renesas_i3c_attach_i2c_dev() local
966 pos = renesas_i3c_get_free_pos(i3c); in renesas_i3c_attach_i2c_dev()
975 i3c->addrs[pos] = dev->addr; in renesas_i3c_attach_i2c_dev()
976 i3c->free_pos &= ~BIT(pos); in renesas_i3c_attach_i2c_dev()
986 struct renesas_i3c *i3c = to_renesas_i3c(m); in renesas_i3c_detach_i2c_dev() local
989 i3c->addrs[data->index] = 0; in renesas_i3c_detach_i2c_dev()
990 i3c->free_pos |= BIT(data->index); in renesas_i3c_detach_i2c_dev()
996 struct renesas_i3c *i3c = data; in renesas_i3c_tx_isr() local
1001 scoped_guard(spinlock, &i3c->xferqueue.lock) { in renesas_i3c_tx_isr()
1002 xfer = i3c->xferqueue.cur; in renesas_i3c_tx_isr()
1013 renesas_writel(i3c->regs, NTDTBP0, val); in renesas_i3c_tx_isr()
1017 renesas_clear_bit(i3c->regs, NTIE, NTIE_TDBEIE0); in renesas_i3c_tx_isr()
1018 renesas_set_bit(i3c->regs, BIE, BIE_TENDIE); in renesas_i3c_tx_isr()
1022 renesas_clear_bit(i3c->regs, NTST, NTST_TDBEF0); in renesas_i3c_tx_isr()
1024 i3c_writel_fifo(i3c->regs + NTDTBP0, cmd->tx_buf, cmd->len); in renesas_i3c_tx_isr()
1033 struct renesas_i3c *i3c = data; in renesas_i3c_resp_isr() local
1036 u32 resp_descriptor = renesas_readl(i3c->regs, NRSPQP); in renesas_i3c_resp_isr()
1041 scoped_guard(spinlock, &i3c->xferqueue.lock) { in renesas_i3c_resp_isr()
1042 xfer = i3c->xferqueue.cur; in renesas_i3c_resp_isr()
1046 renesas_clear_bit(i3c->regs, NTST, NTST_RSPQFF); in renesas_i3c_resp_isr()
1050 switch (i3c->internal_state) { in renesas_i3c_resp_isr()
1057 renesas_clear_bit(i3c->regs, NTIE, NTIE_TDBEIE0); in renesas_i3c_resp_isr()
1061 if (NDBSTLV0_RDBLV(renesas_readl(i3c->regs, NDBSTLV0)) && !cmd->err) in renesas_i3c_resp_isr()
1064 i3c_readl_fifo(i3c->regs + NTDTBP0, cmd->rx_buf, bytes_remaining); in renesas_i3c_resp_isr()
1065 renesas_clear_bit(i3c->regs, NTIE, NTIE_RDBFIE0); in renesas_i3c_resp_isr()
1098 ntst = renesas_readl(i3c->regs, NTST); in renesas_i3c_resp_isr()
1100 renesas_clear_bit(i3c->regs, BCTL, BCTL_ABT); in renesas_i3c_resp_isr()
1103 renesas_clear_bit(i3c->regs, NTST, NTST_TEF | NTST_TABTF); in renesas_i3c_resp_isr()
1108 xfer = list_first_entry_or_null(&i3c->xferqueue.list, in renesas_i3c_resp_isr()
1113 i3c->xferqueue.cur = xfer; in renesas_i3c_resp_isr()
1121 struct renesas_i3c *i3c = data; in renesas_i3c_tend_isr() local
1125 scoped_guard(spinlock, &i3c->xferqueue.lock) { in renesas_i3c_tend_isr()
1126 xfer = i3c->xferqueue.cur; in renesas_i3c_tend_isr()
1130 if (renesas_readl(i3c->regs, BST) & BST_NACKDF) { in renesas_i3c_tend_isr()
1132 renesas_readl(i3c->regs, NTDTBP0); /* dummy read */ in renesas_i3c_tend_isr()
1133 renesas_clear_bit(i3c->regs, BST, BST_NACKDF); in renesas_i3c_tend_isr()
1136 renesas_set_bit(i3c->regs, NTIE, NTIE_TDBEIE0); in renesas_i3c_tend_isr()
1141 renesas_clear_bit(i3c->regs, BIE, BIE_TENDIE); in renesas_i3c_tend_isr()
1142 renesas_set_bit(i3c->regs, BIE, BIE_SPCNDDIE); in renesas_i3c_tend_isr()
1143 renesas_set_bit(i3c->regs, CNDCTL, CNDCTL_SPCND); in renesas_i3c_tend_isr()
1146 renesas_clear_bit(i3c->regs, NTSTE, NTSTE_TDBEE0); in renesas_i3c_tend_isr()
1147 renesas_clear_bit(i3c->regs, BIE, BIE_TENDIE); in renesas_i3c_tend_isr()
1154 renesas_clear_bit(i3c->regs, BST, BST_TENDF); in renesas_i3c_tend_isr()
1162 struct renesas_i3c *i3c = data; in renesas_i3c_rx_isr() local
1168 if (!(renesas_readl(i3c->regs, NTIE) & NTIE_RDBFIE0)) in renesas_i3c_rx_isr()
1171 scoped_guard(spinlock, &i3c->xferqueue.lock) { in renesas_i3c_rx_isr()
1172 xfer = i3c->xferqueue.cur; in renesas_i3c_rx_isr()
1181 renesas_set_bit(i3c->regs, SCSTRCTL, SCSTRCTL_RWE); in renesas_i3c_rx_isr()
1182 renesas_readl(i3c->regs, NTDTBP0); /* dummy read */ in renesas_i3c_rx_isr()
1184 renesas_writel(i3c->regs, ACKCTL, ACKCTL_ACKT | ACKCTL_ACKTWP); in renesas_i3c_rx_isr()
1191 renesas_set_bit(i3c->regs, BIE, BIE_SPCNDDIE); in renesas_i3c_rx_isr()
1192 renesas_clear_bit(i3c->regs, BST, BST_SPCNDDF); in renesas_i3c_rx_isr()
1193 renesas_set_bit(i3c->regs, CNDCTL, CNDCTL_SPCND); in renesas_i3c_rx_isr()
1195 renesas_writel(i3c->regs, ACKCTL, ACKCTL_ACKT | ACKCTL_ACKTWP); in renesas_i3c_rx_isr()
1197 renesas_writel(i3c->regs, ACKCTL, ACKCTL_ACKTWP); in renesas_i3c_rx_isr()
1201 *cmd->i2c_buf = renesas_readl(i3c->regs, NTDTBP0); in renesas_i3c_rx_isr()
1205 read_bytes = NDBSTLV0_RDBLV(renesas_readl(i3c->regs, NDBSTLV0)) * sizeof(u32); in renesas_i3c_rx_isr()
1206 i3c_readl_fifo(i3c->regs + NTDTBP0, cmd->rx_buf, read_bytes); in renesas_i3c_rx_isr()
1211 renesas_clear_bit(i3c->regs, NTST, NTST_RDBFF0); in renesas_i3c_rx_isr()
1219 struct renesas_i3c *i3c = data; in renesas_i3c_stop_isr() local
1222 scoped_guard(spinlock, &i3c->xferqueue.lock) { in renesas_i3c_stop_isr()
1223 xfer = i3c->xferqueue.cur; in renesas_i3c_stop_isr()
1226 renesas_writel(i3c->regs, BST, 0); in renesas_i3c_stop_isr()
1227 renesas_readl(i3c->regs, BST); in renesas_i3c_stop_isr()
1228 renesas_writel(i3c->regs, BIE, 0); in renesas_i3c_stop_isr()
1229 renesas_clear_bit(i3c->regs, NTST, NTST_TDBEF0 | NTST_RDBFF0); in renesas_i3c_stop_isr()
1230 renesas_clear_bit(i3c->regs, SCSTRCTL, SCSTRCTL_RWE); in renesas_i3c_stop_isr()
1241 struct renesas_i3c *i3c = data; in renesas_i3c_start_isr() local
1246 scoped_guard(spinlock, &i3c->xferqueue.lock) { in renesas_i3c_start_isr()
1247 xfer = i3c->xferqueue.cur; in renesas_i3c_start_isr()
1257 renesas_clear_bit(i3c->regs, NTIE, NTIE_TDBEIE0); in renesas_i3c_start_isr()
1258 renesas_set_bit(i3c->regs, NTIE, NTIE_RDBFIE0); in renesas_i3c_start_isr()
1265 renesas_writel(i3c->regs, NTDTBP0, val); in renesas_i3c_start_isr()
1269 renesas_clear_bit(i3c->regs, BIE, BIE_STCNDDIE); in renesas_i3c_start_isr()
1270 renesas_clear_bit(i3c->regs, BST, BST_STCNDDF); in renesas_i3c_start_isr()
1292 { .name = "resp", .isr = renesas_i3c_resp_isr, .desc = "i3c-resp" },
1293 { .name = "rx", .isr = renesas_i3c_rx_isr, .desc = "i3c-rx" },
1294 { .name = "tx", .isr = renesas_i3c_tx_isr, .desc = "i3c-tx" },
1295 { .name = "st", .isr = renesas_i3c_start_isr, .desc = "i3c-start" },
1296 { .name = "sp", .isr = renesas_i3c_stop_isr, .desc = "i3c-stop" },
1297 { .name = "tend", .isr = renesas_i3c_tend_isr, .desc = "i3c-tend" },
1298 { .name = "nack", .isr = renesas_i3c_tend_isr, .desc = "i3c-nack" },
1303 struct renesas_i3c *i3c; in renesas_i3c_probe() local
1312 i3c = devm_kzalloc(&pdev->dev, sizeof(*i3c), GFP_KERNEL); in renesas_i3c_probe()
1313 if (!i3c) in renesas_i3c_probe()
1316 i3c->regs = devm_platform_ioremap_resource(pdev, 0); in renesas_i3c_probe()
1317 if (IS_ERR(i3c->regs)) in renesas_i3c_probe()
1318 return PTR_ERR(i3c->regs); in renesas_i3c_probe()
1330 i3c->tclk = devm_clk_get_enabled(&pdev->dev, "tclk"); in renesas_i3c_probe()
1331 if (IS_ERR(i3c->tclk)) in renesas_i3c_probe()
1332 return PTR_ERR(i3c->tclk); in renesas_i3c_probe()
1344 spin_lock_init(&i3c->xferqueue.lock); in renesas_i3c_probe()
1345 INIT_LIST_HEAD(&i3c->xferqueue.list); in renesas_i3c_probe()
1347 ret = renesas_i3c_reset(i3c); in renesas_i3c_probe()
1357 0, renesas_i3c_irqs[i].desc, i3c); in renesas_i3c_probe()
1362 platform_set_drvdata(pdev, i3c); in renesas_i3c_probe()
1364 i3c->maxdevs = RENESAS_I3C_MAX_DEVS; in renesas_i3c_probe()
1365 i3c->free_pos = GENMASK(i3c->maxdevs - 1, 0); in renesas_i3c_probe()
1367 return i3c_master_register(&i3c->base, &pdev->dev, &renesas_i3c_ops, false); in renesas_i3c_probe()
1372 struct renesas_i3c *i3c = platform_get_drvdata(pdev); in renesas_i3c_remove() local
1374 i3c_master_unregister(&i3c->base); in renesas_i3c_remove()
1385 { .compatible = "renesas,r9a08g045-i3c", .data = &empty_i3c_config },
1386 { .compatible = "renesas,r9a09g047-i3c", .data = &r9a09g047_i3c_config },
1395 .name = "renesas-i3c",
1403 MODULE_DESCRIPTION("Renesas I3C controller driver");