Lines Matching +full:imx7ulp +full:- +full:lpi2c
1 // SPDX-License-Identifier: GPL-2.0+
11 #include <linux/dma-mapping.h>
28 #define DRIVER_NAME "imx-lpi2c"
193 writel(enable, lpi2c_imx->base + LPI2C_MIER); in lpi2c_imx_intctrl()
202 temp = readl(lpi2c_imx->base + LPI2C_MSR); in lpi2c_imx_bus_busy()
206 writel(temp, lpi2c_imx->base + LPI2C_MSR); in lpi2c_imx_bus_busy()
207 return -EAGAIN; in lpi2c_imx_bus_busy()
214 dev_dbg(&lpi2c_imx->adapter.dev, "bus not work\n"); in lpi2c_imx_bus_busy()
215 if (lpi2c_imx->adapter.bus_recovery_info) in lpi2c_imx_bus_busy()
216 i2c_recover_bus(&lpi2c_imx->adapter); in lpi2c_imx_bus_busy()
217 return -ETIMEDOUT; in lpi2c_imx_bus_busy()
227 unsigned int bitrate = lpi2c_imx->bitrate; in lpi2c_imx_set_mode()
241 lpi2c_imx->mode = mode; in lpi2c_imx_set_mode()
249 temp = readl(lpi2c_imx->base + LPI2C_MCR); in lpi2c_imx_start()
251 writel(temp, lpi2c_imx->base + LPI2C_MCR); in lpi2c_imx_start()
252 writel(0x7f00, lpi2c_imx->base + LPI2C_MSR); in lpi2c_imx_start()
255 writel(temp, lpi2c_imx->base + LPI2C_MTDR); in lpi2c_imx_start()
265 writel(GEN_STOP << 8, lpi2c_imx->base + LPI2C_MTDR); in lpi2c_imx_stop()
268 temp = readl(lpi2c_imx->base + LPI2C_MSR); in lpi2c_imx_stop()
273 dev_dbg(&lpi2c_imx->adapter.dev, "stop timeout\n"); in lpi2c_imx_stop()
274 if (lpi2c_imx->adapter.bus_recovery_info) in lpi2c_imx_stop()
275 i2c_recover_bus(&lpi2c_imx->adapter); in lpi2c_imx_stop()
293 clk_rate = lpi2c_imx->rate_per; in lpi2c_imx_config()
295 if (lpi2c_imx->mode == HS || lpi2c_imx->mode == ULTRA_FAST) in lpi2c_imx_config()
301 clk_cycle = clk_rate / ((1 << prescale) * lpi2c_imx->bitrate) in lpi2c_imx_config()
302 - 3 - (filt >> 1); in lpi2c_imx_config()
304 clklo = clk_cycle - clkhi; in lpi2c_imx_config()
310 return -EINVAL; in lpi2c_imx_config()
313 if (lpi2c_imx->mode == ULTRA_FAST) in lpi2c_imx_config()
319 if (lpi2c_imx->mode == ULTRA_FAST) in lpi2c_imx_config()
322 writel(temp, lpi2c_imx->base + LPI2C_MCFGR1); in lpi2c_imx_config()
326 writel(temp, lpi2c_imx->base + LPI2C_MCFGR2); in lpi2c_imx_config()
333 if (lpi2c_imx->mode == HS) in lpi2c_imx_config()
334 writel(temp, lpi2c_imx->base + LPI2C_MCCR1); in lpi2c_imx_config()
336 writel(temp, lpi2c_imx->base + LPI2C_MCCR0); in lpi2c_imx_config()
346 ret = pm_runtime_resume_and_get(lpi2c_imx->adapter.dev.parent); in lpi2c_imx_master_enable()
351 writel(temp, lpi2c_imx->base + LPI2C_MCR); in lpi2c_imx_master_enable()
352 writel(0, lpi2c_imx->base + LPI2C_MCR); in lpi2c_imx_master_enable()
358 temp = readl(lpi2c_imx->base + LPI2C_MCR); in lpi2c_imx_master_enable()
360 writel(temp, lpi2c_imx->base + LPI2C_MCR); in lpi2c_imx_master_enable()
365 pm_runtime_mark_last_busy(lpi2c_imx->adapter.dev.parent); in lpi2c_imx_master_enable()
366 pm_runtime_put_autosuspend(lpi2c_imx->adapter.dev.parent); in lpi2c_imx_master_enable()
375 temp = readl(lpi2c_imx->base + LPI2C_MCR); in lpi2c_imx_master_disable()
377 writel(temp, lpi2c_imx->base + LPI2C_MCR); in lpi2c_imx_master_disable()
379 pm_runtime_mark_last_busy(lpi2c_imx->adapter.dev.parent); in lpi2c_imx_master_disable()
380 pm_runtime_put_autosuspend(lpi2c_imx->adapter.dev.parent); in lpi2c_imx_master_disable()
389 time_left = wait_for_completion_timeout(&lpi2c_imx->complete, HZ); in lpi2c_imx_pio_msg_complete()
391 return time_left ? 0 : -ETIMEDOUT; in lpi2c_imx_pio_msg_complete()
400 txcnt = readl(lpi2c_imx->base + LPI2C_MFSR) & 0xff; in lpi2c_imx_txfifo_empty()
402 if (readl(lpi2c_imx->base + LPI2C_MSR) & MSR_NDF) { in lpi2c_imx_txfifo_empty()
403 dev_dbg(&lpi2c_imx->adapter.dev, "NDF detected\n"); in lpi2c_imx_txfifo_empty()
404 return -EIO; in lpi2c_imx_txfifo_empty()
408 dev_dbg(&lpi2c_imx->adapter.dev, "txfifo empty timeout\n"); in lpi2c_imx_txfifo_empty()
409 if (lpi2c_imx->adapter.bus_recovery_info) in lpi2c_imx_txfifo_empty()
410 i2c_recover_bus(&lpi2c_imx->adapter); in lpi2c_imx_txfifo_empty()
411 return -ETIMEDOUT; in lpi2c_imx_txfifo_empty()
422 writel(lpi2c_imx->txfifosize >> 1, lpi2c_imx->base + LPI2C_MFCR); in lpi2c_imx_set_tx_watermark()
429 remaining = lpi2c_imx->msglen - lpi2c_imx->delivered; in lpi2c_imx_set_rx_watermark()
431 if (remaining > (lpi2c_imx->rxfifosize >> 1)) in lpi2c_imx_set_rx_watermark()
432 temp = lpi2c_imx->rxfifosize >> 1; in lpi2c_imx_set_rx_watermark()
436 writel(temp << 16, lpi2c_imx->base + LPI2C_MFCR); in lpi2c_imx_set_rx_watermark()
443 txcnt = readl(lpi2c_imx->base + LPI2C_MFSR) & 0xff; in lpi2c_imx_write_txfifo()
445 while (txcnt < lpi2c_imx->txfifosize) { in lpi2c_imx_write_txfifo()
446 if (lpi2c_imx->delivered == lpi2c_imx->msglen) in lpi2c_imx_write_txfifo()
449 data = lpi2c_imx->tx_buf[lpi2c_imx->delivered++]; in lpi2c_imx_write_txfifo()
450 writel(data, lpi2c_imx->base + LPI2C_MTDR); in lpi2c_imx_write_txfifo()
454 if (lpi2c_imx->delivered < lpi2c_imx->msglen) in lpi2c_imx_write_txfifo()
457 complete(&lpi2c_imx->complete); in lpi2c_imx_write_txfifo()
466 data = readl(lpi2c_imx->base + LPI2C_MRDR); in lpi2c_imx_read_rxfifo()
470 lpi2c_imx->rx_buf[lpi2c_imx->delivered++] = data & 0xff; in lpi2c_imx_read_rxfifo()
475 * data read. Add it to msgs->len. in lpi2c_imx_read_rxfifo()
477 if (lpi2c_imx->block_data) { in lpi2c_imx_read_rxfifo()
478 blocklen = lpi2c_imx->rx_buf[0]; in lpi2c_imx_read_rxfifo()
479 lpi2c_imx->msglen += blocklen; in lpi2c_imx_read_rxfifo()
482 remaining = lpi2c_imx->msglen - lpi2c_imx->delivered; in lpi2c_imx_read_rxfifo()
485 complete(&lpi2c_imx->complete); in lpi2c_imx_read_rxfifo()
493 if (lpi2c_imx->block_data) { in lpi2c_imx_read_rxfifo()
494 lpi2c_imx->block_data = 0; in lpi2c_imx_read_rxfifo()
497 writel(temp, lpi2c_imx->base + LPI2C_MTDR); in lpi2c_imx_read_rxfifo()
498 } else if (!(lpi2c_imx->delivered & 0xff)) { in lpi2c_imx_read_rxfifo()
499 temp = (remaining > CHUNK_DATA ? CHUNK_DATA : remaining) - 1; in lpi2c_imx_read_rxfifo()
501 writel(temp, lpi2c_imx->base + LPI2C_MTDR); in lpi2c_imx_read_rxfifo()
510 lpi2c_imx->tx_buf = msgs->buf; in lpi2c_imx_write()
520 lpi2c_imx->rx_buf = msgs->buf; in lpi2c_imx_read()
521 lpi2c_imx->block_data = msgs->flags & I2C_M_RECV_LEN; in lpi2c_imx_read()
524 temp = msgs->len > CHUNK_DATA ? CHUNK_DATA - 1 : msgs->len - 1; in lpi2c_imx_read()
526 writel(temp, lpi2c_imx->base + LPI2C_MTDR); in lpi2c_imx_read()
533 if (!lpi2c_imx->can_use_dma) in is_use_dma()
540 return !(msg->len < I2C_DMA_THRESHOLD); in is_use_dma()
546 reinit_completion(&lpi2c_imx->complete); in lpi2c_imx_pio_xfer()
548 if (msg->flags & I2C_M_RD) in lpi2c_imx_pio_xfer()
560 time = 8 * lpi2c_imx->dma->dma_len * 1000 / lpi2c_imx->bitrate; in lpi2c_imx_dma_timeout_calculate()
571 struct lpi2c_imx_dma *dma = lpi2c_imx->dma; in lpi2c_imx_alloc_rx_cmd_buf()
572 u16 rx_remain = dma->dma_len; in lpi2c_imx_alloc_rx_cmd_buf()
582 dma->rx_cmd_buf = kcalloc(cmd_num, sizeof(u16), GFP_KERNEL); in lpi2c_imx_alloc_rx_cmd_buf()
583 dma->rx_cmd_buf_len = cmd_num * sizeof(u16); in lpi2c_imx_alloc_rx_cmd_buf()
585 if (!dma->rx_cmd_buf) { in lpi2c_imx_alloc_rx_cmd_buf()
586 dev_err(&lpi2c_imx->adapter.dev, "Alloc RX cmd buffer failed\n"); in lpi2c_imx_alloc_rx_cmd_buf()
587 return -ENOMEM; in lpi2c_imx_alloc_rx_cmd_buf()
591 temp = rx_remain > CHUNK_DATA ? CHUNK_DATA - 1 : rx_remain - 1; in lpi2c_imx_alloc_rx_cmd_buf()
593 rx_remain -= CHUNK_DATA; in lpi2c_imx_alloc_rx_cmd_buf()
594 dma->rx_cmd_buf[i] = temp; in lpi2c_imx_alloc_rx_cmd_buf()
605 time_left = wait_for_completion_timeout(&lpi2c_imx->complete, time); in lpi2c_imx_dma_msg_complete()
607 dev_err(&lpi2c_imx->adapter.dev, "I/O Error in DMA Data Transfer\n"); in lpi2c_imx_dma_msg_complete()
608 return -ETIMEDOUT; in lpi2c_imx_dma_msg_complete()
616 struct dma_chan *chan = dma->dma_data_dir == DMA_FROM_DEVICE in lpi2c_dma_unmap()
617 ? dma->chan_rx : dma->chan_tx; in lpi2c_dma_unmap()
619 dma_unmap_single(chan->device->dev, dma->dma_addr, in lpi2c_dma_unmap()
620 dma->dma_len, dma->dma_data_dir); in lpi2c_dma_unmap()
622 dma->dma_data_dir = DMA_NONE; in lpi2c_dma_unmap()
627 dmaengine_terminate_sync(dma->chan_tx); in lpi2c_cleanup_rx_cmd_dma()
628 dma_unmap_single(dma->chan_tx->device->dev, dma->dma_tx_addr, in lpi2c_cleanup_rx_cmd_dma()
629 dma->rx_cmd_buf_len, DMA_TO_DEVICE); in lpi2c_cleanup_rx_cmd_dma()
634 if (dma->dma_data_dir == DMA_FROM_DEVICE) in lpi2c_cleanup_dma()
635 dmaengine_terminate_sync(dma->chan_rx); in lpi2c_cleanup_dma()
636 else if (dma->dma_data_dir == DMA_TO_DEVICE) in lpi2c_cleanup_dma()
637 dmaengine_terminate_sync(dma->chan_tx); in lpi2c_cleanup_dma()
646 complete(&lpi2c_imx->complete); in lpi2c_dma_callback()
652 struct lpi2c_imx_dma *dma = lpi2c_imx->dma; in lpi2c_dma_rx_cmd_submit()
653 struct dma_chan *txchan = dma->chan_tx; in lpi2c_dma_rx_cmd_submit()
656 dma->dma_tx_addr = dma_map_single(txchan->device->dev, in lpi2c_dma_rx_cmd_submit()
657 dma->rx_cmd_buf, dma->rx_cmd_buf_len, in lpi2c_dma_rx_cmd_submit()
659 if (dma_mapping_error(txchan->device->dev, dma->dma_tx_addr)) { in lpi2c_dma_rx_cmd_submit()
660 dev_err(&lpi2c_imx->adapter.dev, "DMA map failed, use pio\n"); in lpi2c_dma_rx_cmd_submit()
661 return -EINVAL; in lpi2c_dma_rx_cmd_submit()
664 rx_cmd_desc = dmaengine_prep_slave_single(txchan, dma->dma_tx_addr, in lpi2c_dma_rx_cmd_submit()
665 dma->rx_cmd_buf_len, DMA_MEM_TO_DEV, in lpi2c_dma_rx_cmd_submit()
668 dev_err(&lpi2c_imx->adapter.dev, "DMA prep slave sg failed, use pio\n"); in lpi2c_dma_rx_cmd_submit()
674 dev_err(&lpi2c_imx->adapter.dev, "submitting DMA failed, use pio\n"); in lpi2c_dma_rx_cmd_submit()
683 dma_unmap_single(txchan->device->dev, dma->dma_tx_addr, in lpi2c_dma_rx_cmd_submit()
684 dma->rx_cmd_buf_len, DMA_TO_DEVICE); in lpi2c_dma_rx_cmd_submit()
685 return -EINVAL; in lpi2c_dma_rx_cmd_submit()
688 dma_unmap_single(txchan->device->dev, dma->dma_tx_addr, in lpi2c_dma_rx_cmd_submit()
689 dma->rx_cmd_buf_len, DMA_TO_DEVICE); in lpi2c_dma_rx_cmd_submit()
691 return -EINVAL; in lpi2c_dma_rx_cmd_submit()
696 struct lpi2c_imx_dma *dma = lpi2c_imx->dma; in lpi2c_dma_submit()
701 if (dma->dma_msg_flag & I2C_M_RD) { in lpi2c_dma_submit()
702 chan = dma->chan_rx; in lpi2c_dma_submit()
703 dma->dma_data_dir = DMA_FROM_DEVICE; in lpi2c_dma_submit()
704 dma->dma_transfer_dir = DMA_DEV_TO_MEM; in lpi2c_dma_submit()
706 chan = dma->chan_tx; in lpi2c_dma_submit()
707 dma->dma_data_dir = DMA_TO_DEVICE; in lpi2c_dma_submit()
708 dma->dma_transfer_dir = DMA_MEM_TO_DEV; in lpi2c_dma_submit()
711 dma->dma_addr = dma_map_single(chan->device->dev, in lpi2c_dma_submit()
712 dma->dma_buf, dma->dma_len, dma->dma_data_dir); in lpi2c_dma_submit()
713 if (dma_mapping_error(chan->device->dev, dma->dma_addr)) { in lpi2c_dma_submit()
714 dev_err(&lpi2c_imx->adapter.dev, "DMA map failed, use pio\n"); in lpi2c_dma_submit()
715 return -EINVAL; in lpi2c_dma_submit()
718 desc = dmaengine_prep_slave_single(chan, dma->dma_addr, in lpi2c_dma_submit()
719 dma->dma_len, dma->dma_transfer_dir, in lpi2c_dma_submit()
722 dev_err(&lpi2c_imx->adapter.dev, "DMA prep slave sg failed, use pio\n"); in lpi2c_dma_submit()
726 reinit_completion(&lpi2c_imx->complete); in lpi2c_dma_submit()
727 desc->callback = lpi2c_dma_callback; in lpi2c_dma_submit()
728 desc->callback_param = lpi2c_imx; in lpi2c_dma_submit()
732 dev_err(&lpi2c_imx->adapter.dev, "submitting DMA failed, use pio\n"); in lpi2c_dma_submit()
737 dma->using_pio_mode = false; in lpi2c_dma_submit()
745 return -EINVAL; in lpi2c_dma_submit()
750 return -EINVAL; in lpi2c_dma_submit()
757 for (i = fifosize / 2; i > 0; i--) in lpi2c_imx_find_max_burst_num()
770 struct lpi2c_imx_dma *dma = lpi2c_imx->dma; in lpi2c_imx_dma_burst_num_calculate()
773 if (dma->dma_msg_flag & I2C_M_RD) { in lpi2c_imx_dma_burst_num_calculate()
779 cmd_num = DIV_ROUND_UP(dma->dma_len, CHUNK_DATA); in lpi2c_imx_dma_burst_num_calculate()
780 dma->tx_burst_num = lpi2c_imx_find_max_burst_num(lpi2c_imx->txfifosize, in lpi2c_imx_dma_burst_num_calculate()
782 dma->rx_burst_num = lpi2c_imx_find_max_burst_num(lpi2c_imx->rxfifosize, in lpi2c_imx_dma_burst_num_calculate()
783 dma->dma_len); in lpi2c_imx_dma_burst_num_calculate()
785 dma->tx_burst_num = lpi2c_imx_find_max_burst_num(lpi2c_imx->txfifosize, in lpi2c_imx_dma_burst_num_calculate()
786 dma->dma_len); in lpi2c_imx_dma_burst_num_calculate()
792 struct lpi2c_imx_dma *dma = lpi2c_imx->dma; in lpi2c_dma_config()
798 if (dma->dma_msg_flag & I2C_M_RD) { in lpi2c_dma_config()
799 tx.dst_addr = dma->phy_addr + LPI2C_MTDR; in lpi2c_dma_config()
801 tx.dst_maxburst = dma->tx_burst_num; in lpi2c_dma_config()
803 ret = dmaengine_slave_config(dma->chan_tx, &tx); in lpi2c_dma_config()
807 rx.src_addr = dma->phy_addr + LPI2C_MRDR; in lpi2c_dma_config()
809 rx.src_maxburst = dma->rx_burst_num; in lpi2c_dma_config()
811 ret = dmaengine_slave_config(dma->chan_rx, &rx); in lpi2c_dma_config()
815 tx.dst_addr = dma->phy_addr + LPI2C_MTDR; in lpi2c_dma_config()
817 tx.dst_maxburst = dma->tx_burst_num; in lpi2c_dma_config()
819 ret = dmaengine_slave_config(dma->chan_tx, &tx); in lpi2c_dma_config()
829 struct lpi2c_imx_dma *dma = lpi2c_imx->dma; in lpi2c_dma_enable()
839 if (dma->dma_msg_flag & I2C_M_RD) { in lpi2c_dma_enable()
841 writel(dma->tx_burst_num | (dma->rx_burst_num - 1) << 16, in lpi2c_dma_enable()
842 lpi2c_imx->base + LPI2C_MFCR); in lpi2c_dma_enable()
844 writel(MDER_TDDE | MDER_RDDE, lpi2c_imx->base + LPI2C_MDER); in lpi2c_dma_enable()
847 writel(dma->tx_burst_num, lpi2c_imx->base + LPI2C_MFCR); in lpi2c_dma_enable()
849 writel(MDER_TDDE, lpi2c_imx->base + LPI2C_MDER); in lpi2c_dma_enable()
857 * When lpi2c is in TX DMA mode we can use one DMA TX channel to write
860 * The LPI2C MTDR register is a command data and transmit data register.
861 * Bits 8-10 are the command data field and Bits 0-7 are the transmit
862 * data field. When the LPI2C master needs to read data, the number of
877 struct lpi2c_imx_dma *dma = lpi2c_imx->dma; in lpi2c_imx_dma_xfer()
881 dma->using_pio_mode = true; in lpi2c_imx_dma_xfer()
883 dma->dma_len = msg->len; in lpi2c_imx_dma_xfer()
884 dma->dma_msg_flag = msg->flags; in lpi2c_imx_dma_xfer()
885 dma->dma_buf = i2c_get_dma_safe_msg_buf(msg, I2C_DMA_THRESHOLD); in lpi2c_imx_dma_xfer()
886 if (!dma->dma_buf) in lpi2c_imx_dma_xfer()
887 return -ENOMEM; in lpi2c_imx_dma_xfer()
891 dev_err(&lpi2c_imx->adapter.dev, "Failed to configure DMA (%d)\n", ret); in lpi2c_imx_dma_xfer()
899 dev_err(&lpi2c_imx->adapter.dev, "DMA submission failed (%d)\n", ret); in lpi2c_imx_dma_xfer()
903 if (dma->dma_msg_flag & I2C_M_RD) { in lpi2c_imx_dma_xfer()
918 if ((readl(lpi2c_imx->base + LPI2C_MSR) & MSR_NDF) && !ret) { in lpi2c_imx_dma_xfer()
919 ret = -EIO; in lpi2c_imx_dma_xfer()
923 if (dma->dma_msg_flag & I2C_M_RD) in lpi2c_imx_dma_xfer()
924 dma_unmap_single(dma->chan_tx->device->dev, dma->dma_tx_addr, in lpi2c_imx_dma_xfer()
925 dma->rx_cmd_buf_len, DMA_TO_DEVICE); in lpi2c_imx_dma_xfer()
931 if (dma->dma_msg_flag & I2C_M_RD) in lpi2c_imx_dma_xfer()
937 writel(0, lpi2c_imx->base + LPI2C_MDER); in lpi2c_imx_dma_xfer()
939 if (dma->dma_msg_flag & I2C_M_RD) in lpi2c_imx_dma_xfer()
940 kfree(dma->rx_cmd_buf); in lpi2c_imx_dma_xfer()
943 i2c_put_dma_safe_msg_buf(dma->dma_buf, msg, false); in lpi2c_imx_dma_xfer()
945 i2c_put_dma_safe_msg_buf(dma->dma_buf, msg, true); in lpi2c_imx_dma_xfer()
970 lpi2c_imx->rx_buf = NULL; in lpi2c_imx_xfer()
971 lpi2c_imx->tx_buf = NULL; in lpi2c_imx_xfer()
972 lpi2c_imx->delivered = 0; in lpi2c_imx_xfer()
973 lpi2c_imx->msglen = msgs[i].len; in lpi2c_imx_xfer()
974 init_completion(&lpi2c_imx->complete); in lpi2c_imx_xfer()
978 if (result && lpi2c_imx->dma->using_pio_mode) in lpi2c_imx_xfer()
997 temp = readl(lpi2c_imx->base + LPI2C_MSR); in lpi2c_imx_xfer()
999 result = -EIO; in lpi2c_imx_xfer()
1004 dev_dbg(&lpi2c_imx->adapter.dev, "<%s> exit with: %s: %d\n", __func__, in lpi2c_imx_xfer()
1019 writel(0, lpi2c_imx->base + LPI2C_SIER); in lpi2c_imx_target_isr()
1025 sasr = readl(lpi2c_imx->base + LPI2C_SASR); in lpi2c_imx_target_isr()
1028 i2c_slave_event(lpi2c_imx->target, I2C_SLAVE_READ_REQUESTED, &value); in lpi2c_imx_target_isr()
1029 writel(value, lpi2c_imx->base + LPI2C_STDR); in lpi2c_imx_target_isr()
1033 i2c_slave_event(lpi2c_imx->target, I2C_SLAVE_WRITE_REQUESTED, &value); in lpi2c_imx_target_isr()
1039 i2c_slave_event(lpi2c_imx->target, I2C_SLAVE_STOP, &value); in lpi2c_imx_target_isr()
1043 i2c_slave_event(lpi2c_imx->target, I2C_SLAVE_READ_PROCESSED, &value); in lpi2c_imx_target_isr()
1044 writel(value, lpi2c_imx->base + LPI2C_STDR); in lpi2c_imx_target_isr()
1049 value = readl(lpi2c_imx->base + LPI2C_SRDR); in lpi2c_imx_target_isr()
1050 i2c_slave_event(lpi2c_imx->target, I2C_SLAVE_WRITE_RECEIVED, &value); in lpi2c_imx_target_isr()
1055 writel(ssr & SSR_CLEAR_BITS, lpi2c_imx->base + LPI2C_SSR); in lpi2c_imx_target_isr()
1064 enabled = readl(lpi2c_imx->base + LPI2C_MIER); in lpi2c_imx_master_isr()
1067 temp = readl(lpi2c_imx->base + LPI2C_MSR); in lpi2c_imx_master_isr()
1071 complete(&lpi2c_imx->complete); in lpi2c_imx_master_isr()
1084 if (lpi2c_imx->target) { in lpi2c_imx_isr()
1085 u32 scr = readl(lpi2c_imx->base + LPI2C_SCR); in lpi2c_imx_isr()
1086 u32 ssr = readl(lpi2c_imx->base + LPI2C_SSR); in lpi2c_imx_isr()
1087 u32 sier_filter = ssr & readl(lpi2c_imx->base + LPI2C_SIER); in lpi2c_imx_isr()
1109 writel(SCR_RST, lpi2c_imx->base + LPI2C_SCR); in lpi2c_imx_target_init()
1110 writel(0, lpi2c_imx->base + LPI2C_SCR); in lpi2c_imx_target_init()
1113 writel((lpi2c_imx->target->addr << 1), lpi2c_imx->base + LPI2C_SAMR); in lpi2c_imx_target_init()
1115 writel(SCFGR1_RXSTALL | SCFGR1_TXDSTALL, lpi2c_imx->base + LPI2C_SCFGR1); in lpi2c_imx_target_init()
1127 * CLKHOLD setting is crucial for lpi2c target. When master read data in lpi2c_imx_target_init()
1131 * releasing SCL signal. The lpi2c master will mistakenly think it is a stop in lpi2c_imx_target_init()
1135 * In order to ensure lpi2c function normally when the lpi2c speed is as in lpi2c_imx_target_init()
1140 writel(temp, lpi2c_imx->base + LPI2C_SCFGR2); in lpi2c_imx_target_init()
1144 * SCR_FILTEN can enable digital filter and output delay counter for LPI2C in lpi2c_imx_target_init()
1148 writel(SCR_SEN | SCR_FILTEN, lpi2c_imx->base + LPI2C_SCR); in lpi2c_imx_target_init()
1151 writel(SLAVE_INT_FLAG, lpi2c_imx->base + LPI2C_SIER); in lpi2c_imx_target_init()
1156 struct lpi2c_imx_struct *lpi2c_imx = i2c_get_adapdata(client->adapter); in lpi2c_imx_register_target()
1159 if (lpi2c_imx->target) in lpi2c_imx_register_target()
1160 return -EBUSY; in lpi2c_imx_register_target()
1162 lpi2c_imx->target = client; in lpi2c_imx_register_target()
1164 ret = pm_runtime_resume_and_get(lpi2c_imx->adapter.dev.parent); in lpi2c_imx_register_target()
1166 dev_err(&lpi2c_imx->adapter.dev, "failed to resume i2c controller"); in lpi2c_imx_register_target()
1177 struct lpi2c_imx_struct *lpi2c_imx = i2c_get_adapdata(client->adapter); in lpi2c_imx_unregister_target()
1180 if (!lpi2c_imx->target) in lpi2c_imx_unregister_target()
1181 return -EINVAL; in lpi2c_imx_unregister_target()
1184 writel(0, lpi2c_imx->base + LPI2C_SAMR); in lpi2c_imx_unregister_target()
1186 writel(SCR_RST, lpi2c_imx->base + LPI2C_SCR); in lpi2c_imx_unregister_target()
1187 writel(0, lpi2c_imx->base + LPI2C_SCR); in lpi2c_imx_unregister_target()
1189 lpi2c_imx->target = NULL; in lpi2c_imx_unregister_target()
1191 ret = pm_runtime_put_sync(lpi2c_imx->adapter.dev.parent); in lpi2c_imx_unregister_target()
1193 dev_err(&lpi2c_imx->adapter.dev, "failed to suspend i2c controller"); in lpi2c_imx_unregister_target()
1201 struct i2c_bus_recovery_info *bri = &lpi2c_imx->rinfo; in lpi2c_imx_init_recovery_info()
1203 bri->pinctrl = devm_pinctrl_get(&pdev->dev); in lpi2c_imx_init_recovery_info()
1204 if (IS_ERR(bri->pinctrl)) in lpi2c_imx_init_recovery_info()
1205 return PTR_ERR(bri->pinctrl); in lpi2c_imx_init_recovery_info()
1207 lpi2c_imx->adapter.bus_recovery_info = bri; in lpi2c_imx_init_recovery_info()
1214 if (dma->chan_rx) in dma_exit()
1215 dma_release_channel(dma->chan_rx); in dma_exit()
1217 if (dma->chan_tx) in dma_exit()
1218 dma_release_channel(dma->chan_tx); in dma_exit()
1231 return -ENOMEM; in lpi2c_dma_init()
1233 dma->phy_addr = phy_addr; in lpi2c_dma_init()
1236 dma->chan_tx = dma_request_chan(dev, "tx"); in lpi2c_dma_init()
1237 if (IS_ERR(dma->chan_tx)) { in lpi2c_dma_init()
1238 ret = PTR_ERR(dma->chan_tx); in lpi2c_dma_init()
1239 if (ret != -ENODEV && ret != -EPROBE_DEFER) in lpi2c_dma_init()
1241 dma->chan_tx = NULL; in lpi2c_dma_init()
1246 dma->chan_rx = dma_request_chan(dev, "rx"); in lpi2c_dma_init()
1247 if (IS_ERR(dma->chan_rx)) { in lpi2c_dma_init()
1248 ret = PTR_ERR(dma->chan_rx); in lpi2c_dma_init()
1249 if (ret != -ENODEV && ret != -EPROBE_DEFER) in lpi2c_dma_init()
1251 dma->chan_rx = NULL; in lpi2c_dma_init()
1255 lpi2c_imx->can_use_dma = true; in lpi2c_dma_init()
1256 lpi2c_imx->dma = dma; in lpi2c_dma_init()
1278 { .compatible = "fsl,imx7ulp-lpi2c" },
1291 lpi2c_imx = devm_kzalloc(&pdev->dev, sizeof(*lpi2c_imx), GFP_KERNEL); in lpi2c_imx_probe()
1293 return -ENOMEM; in lpi2c_imx_probe()
1295 lpi2c_imx->base = devm_platform_get_and_ioremap_resource(pdev, 0, &res); in lpi2c_imx_probe()
1296 if (IS_ERR(lpi2c_imx->base)) in lpi2c_imx_probe()
1297 return PTR_ERR(lpi2c_imx->base); in lpi2c_imx_probe()
1303 lpi2c_imx->adapter.owner = THIS_MODULE; in lpi2c_imx_probe()
1304 lpi2c_imx->adapter.algo = &lpi2c_imx_algo; in lpi2c_imx_probe()
1305 lpi2c_imx->adapter.dev.parent = &pdev->dev; in lpi2c_imx_probe()
1306 lpi2c_imx->adapter.dev.of_node = pdev->dev.of_node; in lpi2c_imx_probe()
1307 strscpy(lpi2c_imx->adapter.name, pdev->name, in lpi2c_imx_probe()
1308 sizeof(lpi2c_imx->adapter.name)); in lpi2c_imx_probe()
1309 phy_addr = (dma_addr_t)res->start; in lpi2c_imx_probe()
1311 ret = devm_clk_bulk_get_all(&pdev->dev, &lpi2c_imx->clks); in lpi2c_imx_probe()
1313 return dev_err_probe(&pdev->dev, ret, "can't get I2C peripheral clock\n"); in lpi2c_imx_probe()
1314 lpi2c_imx->num_clks = ret; in lpi2c_imx_probe()
1316 ret = of_property_read_u32(pdev->dev.of_node, in lpi2c_imx_probe()
1317 "clock-frequency", &lpi2c_imx->bitrate); in lpi2c_imx_probe()
1319 lpi2c_imx->bitrate = I2C_MAX_STANDARD_MODE_FREQ; in lpi2c_imx_probe()
1321 ret = devm_request_irq(&pdev->dev, irq, lpi2c_imx_isr, IRQF_NO_SUSPEND, in lpi2c_imx_probe()
1322 pdev->name, lpi2c_imx); in lpi2c_imx_probe()
1324 return dev_err_probe(&pdev->dev, ret, "can't claim irq %d\n", irq); in lpi2c_imx_probe()
1326 i2c_set_adapdata(&lpi2c_imx->adapter, lpi2c_imx); in lpi2c_imx_probe()
1329 ret = clk_bulk_prepare_enable(lpi2c_imx->num_clks, lpi2c_imx->clks); in lpi2c_imx_probe()
1337 ret = devm_clk_rate_exclusive_get(&pdev->dev, lpi2c_imx->clks[0].clk); in lpi2c_imx_probe()
1339 return dev_err_probe(&pdev->dev, ret, in lpi2c_imx_probe()
1342 lpi2c_imx->rate_per = clk_get_rate(lpi2c_imx->clks[0].clk); in lpi2c_imx_probe()
1343 if (!lpi2c_imx->rate_per) in lpi2c_imx_probe()
1344 return dev_err_probe(&pdev->dev, -EINVAL, in lpi2c_imx_probe()
1347 pm_runtime_set_autosuspend_delay(&pdev->dev, I2C_PM_TIMEOUT); in lpi2c_imx_probe()
1348 pm_runtime_use_autosuspend(&pdev->dev); in lpi2c_imx_probe()
1349 pm_runtime_get_noresume(&pdev->dev); in lpi2c_imx_probe()
1350 pm_runtime_set_active(&pdev->dev); in lpi2c_imx_probe()
1351 pm_runtime_enable(&pdev->dev); in lpi2c_imx_probe()
1353 temp = readl(lpi2c_imx->base + LPI2C_PARAM); in lpi2c_imx_probe()
1354 lpi2c_imx->txfifosize = 1 << (temp & 0x0f); in lpi2c_imx_probe()
1355 lpi2c_imx->rxfifosize = 1 << ((temp >> 8) & 0x0f); in lpi2c_imx_probe()
1360 if (ret == -EPROBE_DEFER) in lpi2c_imx_probe()
1364 ret = lpi2c_dma_init(&pdev->dev, phy_addr); in lpi2c_imx_probe()
1366 if (ret == -EPROBE_DEFER) in lpi2c_imx_probe()
1368 dev_info(&pdev->dev, "use pio mode\n"); in lpi2c_imx_probe()
1371 ret = i2c_add_adapter(&lpi2c_imx->adapter); in lpi2c_imx_probe()
1375 pm_runtime_mark_last_busy(&pdev->dev); in lpi2c_imx_probe()
1376 pm_runtime_put_autosuspend(&pdev->dev); in lpi2c_imx_probe()
1378 dev_info(&lpi2c_imx->adapter.dev, "LPI2C adapter registered\n"); in lpi2c_imx_probe()
1383 pm_runtime_put(&pdev->dev); in lpi2c_imx_probe()
1384 pm_runtime_disable(&pdev->dev); in lpi2c_imx_probe()
1385 pm_runtime_dont_use_autosuspend(&pdev->dev); in lpi2c_imx_probe()
1394 i2c_del_adapter(&lpi2c_imx->adapter); in lpi2c_imx_remove()
1396 pm_runtime_disable(&pdev->dev); in lpi2c_imx_remove()
1397 pm_runtime_dont_use_autosuspend(&pdev->dev); in lpi2c_imx_remove()
1404 clk_bulk_disable(lpi2c_imx->num_clks, lpi2c_imx->clks); in lpi2c_runtime_suspend()
1416 ret = clk_bulk_enable(lpi2c_imx->num_clks, lpi2c_imx->clks); in lpi2c_runtime_resume()
1444 if (lpi2c_imx->target) in lpi2c_resume_noirq()
1459 * after runtime PM is re-enabled (in resume_early()). However, this in lpi2c_suspend()
1468 * Finally, the resume() callback re-enables autosuspend, ensuring in lpi2c_suspend()
1504 MODULE_DESCRIPTION("I2C adapter driver for LPI2C bus");