Lines Matching refs:hci

23 #define pio_reg_read(r)		readl(hci->PIO_regs + (PIO_##r))
24 #define pio_reg_write(r, v) writel(v, hci->PIO_regs + (PIO_##r))
139 static int hci_pio_init(struct i3c_hci *hci) in hci_pio_init() argument
148 hci->io_data = pio; in hci_pio_init()
152 dev_info(&hci->master.dev, "CMD/RESP FIFO = %ld entries\n", in hci_pio_init()
154 dev_info(&hci->master.dev, "IBI FIFO = %ld bytes\n", in hci_pio_init()
156 dev_info(&hci->master.dev, "RX data FIFO = %d bytes\n", in hci_pio_init()
158 dev_info(&hci->master.dev, "TX data FIFO = %d bytes\n", in hci_pio_init()
168 if (hci->version_major == 1) { in hci_pio_init()
209 static void hci_pio_cleanup(struct i3c_hci *hci) in hci_pio_cleanup() argument
211 struct hci_pio_data *pio = hci->io_data; in hci_pio_cleanup()
223 hci->io_data = NULL; in hci_pio_cleanup()
227 static void hci_pio_write_cmd(struct i3c_hci *hci, struct hci_xfer *xfer) in hci_pio_write_cmd() argument
233 if (hci->cmd == &mipi_i3c_hci_cmd_v2) { in hci_pio_write_cmd()
241 static bool hci_pio_do_rx(struct i3c_hci *hci, struct hci_pio_data *pio) in hci_pio_do_rx() argument
266 static void hci_pio_do_trailing_rx(struct i3c_hci *hci, in hci_pio_do_trailing_rx() argument
307 static bool hci_pio_do_tx(struct i3c_hci *hci, struct hci_pio_data *pio) in hci_pio_do_tx() argument
347 static bool hci_pio_process_rx(struct i3c_hci *hci, struct hci_pio_data *pio) in hci_pio_process_rx() argument
349 while (pio->curr_rx && hci_pio_do_rx(hci, pio)) in hci_pio_process_rx()
354 static bool hci_pio_process_tx(struct i3c_hci *hci, struct hci_pio_data *pio) in hci_pio_process_tx() argument
356 while (pio->curr_tx && hci_pio_do_tx(hci, pio)) in hci_pio_process_tx()
361 static void hci_pio_queue_data(struct i3c_hci *hci, struct hci_pio_data *pio) in hci_pio_queue_data() argument
378 if (!hci_pio_process_rx(hci, pio)) in hci_pio_queue_data()
388 if (!hci_pio_process_tx(hci, pio)) in hci_pio_queue_data()
394 static void hci_pio_push_to_next_rx(struct i3c_hci *hci, struct hci_xfer *xfer, in hci_pio_push_to_next_rx() argument
417 dev_err(&hci->master.dev, "pushing RX data to unexistent xfer\n"); in hci_pio_push_to_next_rx()
425 hci_pio_push_to_next_rx(hci, xfer, chunk - left); in hci_pio_push_to_next_rx()
473 static void hci_pio_err(struct i3c_hci *hci, struct hci_pio_data *pio,
476 static bool hci_pio_process_resp(struct i3c_hci *hci, struct hci_pio_data *pio) in hci_pio_process_resp() argument
486 dev_err(&hci->master.dev, in hci_pio_process_resp()
490 hci_pio_err(hci, pio, STAT_PROG_ERRORS); in hci_pio_process_resp()
506 hci_pio_do_trailing_rx(hci, pio, in hci_pio_process_resp()
511 hci_pio_push_to_next_rx(hci, xfer, to_keep); in hci_pio_process_resp()
515 if (hci_pio_process_rx(hci, pio)) in hci_pio_process_resp()
542 static void hci_pio_queue_resp(struct i3c_hci *hci, struct hci_pio_data *pio) in hci_pio_queue_resp() argument
556 if (!hci_pio_process_resp(hci, pio)) in hci_pio_queue_resp()
561 static bool hci_pio_process_cmd(struct i3c_hci *hci, struct hci_pio_data *pio) in hci_pio_process_cmd() argument
569 hci_pio_queue_data(hci, pio); in hci_pio_process_cmd()
575 hci_pio_queue_resp(hci, pio); in hci_pio_process_cmd()
579 hci_pio_write_cmd(hci, pio->curr_xfer); in hci_pio_process_cmd()
588 static int hci_pio_queue_xfer(struct i3c_hci *hci, struct hci_xfer *xfer, int n) in hci_pio_queue_xfer() argument
590 struct hci_pio_data *pio = hci->io_data; in hci_pio_queue_xfer()
611 if (!hci_pio_process_cmd(hci, pio)) in hci_pio_queue_xfer()
621 static bool hci_pio_dequeue_xfer_common(struct i3c_hci *hci, in hci_pio_dequeue_xfer_common() argument
683 static bool hci_pio_dequeue_xfer(struct i3c_hci *hci, struct hci_xfer *xfer, int n) in hci_pio_dequeue_xfer() argument
685 struct hci_pio_data *pio = hci->io_data; in hci_pio_dequeue_xfer()
692 readl(hci->base_regs + 0x20), readl(hci->base_regs + 0x28)); in hci_pio_dequeue_xfer()
694 ret = hci_pio_dequeue_xfer_common(hci, pio, xfer, n); in hci_pio_dequeue_xfer()
699 static void hci_pio_err(struct i3c_hci *hci, struct hci_pio_data *pio, in hci_pio_err() argument
708 dev_err(&hci->master.dev, in hci_pio_err()
717 dev_err(&hci->master.dev, in hci_pio_err()
728 hci_pio_dequeue_xfer_common(hci, pio, pio->curr_resp, 1); in hci_pio_err()
731 hci_pio_dequeue_xfer_common(hci, pio, pio->curr_tx, 1); in hci_pio_err()
733 mipi_i3c_hci_pio_reset(hci); in hci_pio_err()
734 mipi_i3c_hci_resume(hci); in hci_pio_err()
740 static void hci_pio_set_ibi_thresh(struct i3c_hci *hci, in hci_pio_set_ibi_thresh() argument
756 static bool hci_pio_get_ibi_segment(struct i3c_hci *hci, in hci_pio_get_ibi_segment() argument
769 hci_pio_set_ibi_thresh(hci, pio, thresh_val); in hci_pio_get_ibi_segment()
791 hci_pio_set_ibi_thresh(hci, pio, 1); in hci_pio_get_ibi_segment()
806 static bool hci_pio_prep_new_ibi(struct i3c_hci *hci, struct hci_pio_data *pio) in hci_pio_prep_new_ibi() argument
826 dev_err(&hci->master.dev, "IBI error from %#x\n", ibi->addr); in hci_pio_prep_new_ibi()
834 dev = i3c_hci_addr_to_dev(hci, ibi->addr); in hci_pio_prep_new_ibi()
836 dev_err(&hci->master.dev, in hci_pio_prep_new_ibi()
846 dev_err(&hci->master.dev, "IBI payload too big (%d > %d)\n", in hci_pio_prep_new_ibi()
853 dev_err(&hci->master.dev, "no free slot for IBI\n"); in hci_pio_prep_new_ibi()
861 static void hci_pio_free_ibi_slot(struct i3c_hci *hci, struct hci_pio_data *pio) in hci_pio_free_ibi_slot() argument
873 static bool hci_pio_process_ibi(struct i3c_hci *hci, struct hci_pio_data *pio) in hci_pio_process_ibi() argument
878 if (!hci_pio_prep_new_ibi(hci, pio)) in hci_pio_process_ibi()
886 if (!hci_pio_get_ibi_segment(hci, pio)) in hci_pio_process_ibi()
894 hci_pio_set_ibi_thresh(hci, pio, 1); in hci_pio_process_ibi()
904 hci_pio_set_ibi_thresh(hci, pio, 1); in hci_pio_process_ibi()
915 hci_pio_set_ibi_thresh(hci, pio, 1); in hci_pio_process_ibi()
922 dev_err(&hci->master.dev, in hci_pio_process_ibi()
925 hci_pio_free_ibi_slot(hci, pio); in hci_pio_process_ibi()
931 dev_err(&hci->master.dev, in hci_pio_process_ibi()
934 hci_pio_free_ibi_slot(hci, pio); in hci_pio_process_ibi()
941 static int hci_pio_request_ibi(struct i3c_hci *hci, struct i3c_dev_desc *dev, in hci_pio_request_ibi() argument
962 static void hci_pio_free_ibi(struct i3c_hci *hci, struct i3c_dev_desc *dev) in hci_pio_free_ibi() argument
972 static void hci_pio_recycle_ibi_slot(struct i3c_hci *hci, in hci_pio_recycle_ibi_slot() argument
982 static bool hci_pio_irq_handler(struct i3c_hci *hci, unsigned int unused) in hci_pio_irq_handler() argument
984 struct hci_pio_data *pio = hci->io_data; in hci_pio_irq_handler()
997 hci_pio_process_ibi(hci, pio); in hci_pio_irq_handler()
1000 if (hci_pio_process_rx(hci, pio)) in hci_pio_irq_handler()
1003 if (hci_pio_process_tx(hci, pio)) in hci_pio_irq_handler()
1006 if (hci_pio_process_resp(hci, pio)) in hci_pio_irq_handler()
1011 dev_warn_ratelimited(&hci->master.dev, in hci_pio_irq_handler()
1018 hci_pio_err(hci, pio, status & STAT_ALL_ERRORS); in hci_pio_irq_handler()
1022 if (hci_pio_process_cmd(hci, pio)) in hci_pio_irq_handler()